Octane v1.01.20 - The Open Compression Toolkit for C++ http://octane.sourceforge.net/
Homepage | Main | Modules | Class Hierarchy | Compound List | File List | Compound Members | Related Pages

OctaneTester Class Reference

#include <octanetester.hpp>

Inheritance diagram for OctaneTester:

OctaneClass List of all members.

Detailed Description

The OctaneTester class contains functions for testing compressors and providing a commandline and interactive interface to octane functions.

Definition at line 32 of file octanetester.hpp.

Public Member Functions

 OctaneTester ()
 Constructor.

 ~OctaneTester ()
 Destructor.

void ShowHelp ()
 Show user help about how to use interactive commands within testloop; this is not to be customized for derived classes.

void TestLoop ()
 Built in test loop that just asks user for input and compresses and decompresses in debug mode and lets user load and save files.

bool ParseCommand (const std::string &inputstr)
 Parse an interactive command or a commandline statement.

bool ExecuteCommandsFromStream (std::ifstream &from, bool quiet)
 Run a stream (input file) full of commands.

bool ExecuteCommandsFromFile (const std::string &filename, bool quiet)
 Run a file full of commands.


Protected Member Functions

bool GrabLineFromConsole (std::string &line)
 Grab a line from cin and return true on success.

void ListCompressors (bool briefmode)
 List all registered compressors.

OctaneCompressorSelectInstantiatedCompressor (const std::string &compressorname)
 Select a compressor for subsequent operations; sets current compressorp in the process.

bool CheckCompressorSelected (OctaneCompressor *compressorp)
 Helper function during parsing, to verify that the current compressor is ready to compress and decompress show warning and return false if not.

bool CheckCompressorReady (OctaneCompressor *compressorp)
 Helper function during parsing, to verify that the current compressor is ready to compress and decompress show warning and return false if not.

std::string MakeAssumedOutputFilename (const std::string &origname, const std::string &origext, const std::string &newext)
 helper function to smartly add an extension to a file name, based on current compressor

bool RunCommand_TestString (std::string inputstring)
 Run the TestString command, to compress and then decompress a string and check for errors.

bool RunCommand_TestFile (std::string filename)
 Run the TestFile command, to compress and then decompress a file and check for errors.

bool RunCommand_CreateCompressor (std::string compressorclassname, std::string compressorname, unsigned short guidnum)
 Run the CreateCompressor command, to create a new instantiated compressor.

bool RunCommand_LoadCompressor (std::string filename)
 Run the LoadCompressor command, to recall saved state space.

bool RunCommand_SaveCompressor (std::string filename)
 Run the SaveCompressor command, to recall saved state space.

bool RunCommand_DeleteCompressor (std::string compressoridstring)
 Run the DeleteCompressor command, to delete an instantiated compressor.

bool RunCommand_MakeState (std::string infilename)
 Run the MakeState command, to create state info (i.e.

bool RunCommand_Compress (std::string infilename, std::string outfilename, bool savedecompressstateinfo)
 Run the Compress command, to compress a file and write result to another file.

bool RunCommand_Decompress (std::string infilename, std::string outfilename, bool savedecompressstateinfo)
 Run the Decompress command, to decompress a file and write result to another file.

bool DeleteAFile (std::string filename)
 Helper function, delete a file if it exists, or do nothing if not.

bool CheckFilesAreIdentical (std::string filename1, std::string filename2)
 Check two files and see if they are identical.


Protected Attributes

OctaneCompressorcurrentcompressorp
 Currently selected Compressor class for interactive testing.


Member Function Documentation

bool OctaneTester::ParseCommand const std::string &  inputstr  ) 
 

Parse an interactive command or a commandline statement.

Returns:
true on successful parse of command

Definition at line 117 of file octanetester.cpp.

References CheckCompressorReady(), CheckCompressorSelected(), currentcompressorp, ExecuteCommandsFromFile(), stringparser::get_token(), OctaneCompressor::GetInstantiatedName(), OctaneClass::GetParametersInformation(), OctaneCompressor::GetStatistics_LastOperation_State_ExecutionTime(), ListCompressors(), MakeAssumedOutputFilename(), RunCommand_Compress(), RunCommand_CreateCompressor(), RunCommand_Decompress(), RunCommand_DeleteCompressor(), RunCommand_LoadCompressor(), RunCommand_MakeState(), RunCommand_SaveCompressor(), RunCommand_TestFile(), RunCommand_TestString(), SelectInstantiatedCompressor(), OctaneCompressor::SetInfo(), OctaneClass::SetParameter(), OctaneClass::ShowDebuggingInfo(), and ShowHelp().

Referenced by ExecuteCommandsFromStream(), and TestLoop().

00118 {
00119         // process a single command, called from commandline or TestLoop above
00120         bool bretv=false;
00121         
00122         // return if no command provided
00123         if (inputstr.empty())
00124                 return false;
00125 
00126         // create parser for string
00127         stringparser parser(inputstr);
00128         // grab main command keyword
00129         string command(parser.get_token());
00130 
00131         // NOW PARSE COMMAND
00132 
00133         if (command == "version")
00134                 {
00135                 // version info
00136                 cout << OCTANE_VERSIONSTRING << endl;
00137                 return true;
00138                 }
00139         else if (command == "help")
00140                 {
00141                 // show help information
00142                 ShowHelp();
00143                 return true;
00144                 }
00145         else if (command == "debug")
00146                 {
00147                 // tell compressor to display any debug info it can
00148                 if (!CheckCompressorSelected(currentcompressorp))
00149                         return false;
00150                 currentcompressorp->ShowDebuggingInfo();
00151                 return true;
00152                 }
00153         else if (command == "compressors")
00154                 {
00155                 // list registered compressors
00156                 ListCompressors(false);
00157                 return true;
00158                 }
00159         else if (command == "parameters")
00160                 {
00161                 // list available parameters
00162                 if (!CheckCompressorSelected(currentcompressorp))
00163                         return false;
00164                 cout << currentcompressorp->GetParametersInformation();
00165                 return true;
00166                 }
00167         else if (command == "select")
00168                 {
00169                 // select a registered compressor
00170                 string param(parser.get_token());
00171                 if (param == "")
00172                         {
00173                         cout << "you must specify the instantiated compressor to select."<<endl;
00174                         return false;
00175                         }
00176                 if (SelectInstantiatedCompressor(param)==NULL)
00177                         {
00178                         cout << "error: compressor not found; type 'compressors' for a list of registered compressors."<<endl;
00179                         return false;
00180                         }
00181                 cout << "compressor "<< currentcompressorp->GetInstantiatedName() << " selected."<<endl;
00182                 return true;
00183                 }
00184         else if (command == "run")
00185                 {
00186                 // run octane commands from a file
00187                 string param(parser.get_token());
00188                 if (param == "")
00189                         {
00190                         cout << "you must specify the filename to run."<<endl;
00191                         return false;
00192                         }
00193                 return ExecuteCommandsFromFile(param,false);
00194                 }
00195         else if (command == "set")
00196                 {
00197                 // set a parameter
00198                 if (!CheckCompressorSelected(currentcompressorp))
00199                         return false;
00200                 string param1(parser.get_token());
00201                 if (param1 == "")
00202                         {
00203                         cout << "you must specify the parameter to set."<<endl;
00204                         return false;
00205                         }
00206                 string param2(parser.get_token());
00207                 if (param2 == "")
00208                         {
00209                         cout << "you must specify a value for the parameter."<<endl;
00210                         return false;
00211                         }
00212                 bretv = currentcompressorp->SetParameter(param1, param2);
00213                 if (bretv)
00214                         cout << "ok."<<endl;
00215                 else
00216                         cout << "error setting parameter or parameter not known."<<endl;
00217                 return bretv;
00218                 }
00219 
00220         else if (command == "load")
00221                 {
00222                 // load previously saved compressor
00223                 // note that this operation creates a new compressor, so we don't need to insist that an instantiated compressor
00224                 string param(parser.get_token());
00225                 if (param == "")
00226                         {
00227                         cout << "you must specify the filename to load the compressor from."<<endl;
00228                         return false;
00229                         }
00230                 // run the command
00231                 return RunCommand_LoadCompressor(param);
00232                 }
00233         else if (command == "save")
00234                 {
00235                 // load previously saved state
00236                 if (!CheckCompressorSelected(currentcompressorp))
00237                         return false;
00238                 string param(parser.get_token());
00239                 if (param == "")
00240                         {
00241                         cout << "you must specify the filename to save the compressor to."<<endl;
00242                         return false;
00243                         }
00244                 // run the command
00245                 return RunCommand_SaveCompressor(param);
00246                 }
00247         else if (command == "create")
00248                 {
00249                 // create a new compressor based on a compressor class
00250                 string param(parser.get_token());
00251                 if (param == "")
00252                         {
00253                         cout << "you must specify the base class of the compressor to build."<<endl;
00254                         return false;
00255                         }
00256                         
00257                 // optional name
00258                 string param2(parser.get_token());
00259 
00260                 // optional guid
00261                 string param3(parser.get_token());
00262                 short int guid=0;
00263                 if (param3!="")
00264                         guid=atoi(param3.c_str());
00265 
00266                 // run the command
00267                 bretv=RunCommand_CreateCompressor(param,param2,guid);
00268                 if (bretv)
00269                                 cout << "compressor "<< currentcompressorp->GetInstantiatedName() << " created and selected."<<endl;
00270                 return bretv;
00271                 }
00272 
00273         else if (command == "delete")
00274                 {
00275                 // load previously saved state
00276                 string param(parser.get_token());
00277                 if (param == "")
00278                         {
00279                         cout << "you must specify the instantiated compressor to delete."<<endl;
00280                         return false;
00281                         }
00282                 // run the command
00283                 bool bretv=RunCommand_DeleteCompressor(param);
00284                 if (bretv)
00285                         {
00286                         cout << "compressor deleted."<<endl;
00287                         return true;
00288                         }
00289                 }
00290 
00291         else if (command == "setinfo")
00292                 {
00293                 // set name and guid for a compressor
00294                 if (!CheckCompressorSelected(currentcompressorp))
00295                         return false;
00296                 string param(parser.get_token());
00297                 if (param == "")
00298                         {
00299                         cout << "you must specify a name for the compressor."<<endl;
00300                         return false;
00301                         }
00302                 string param2(parser.get_token());
00303                 // set the values
00304                 unsigned short int guidnum=0;
00305                 if (param2!="")
00306                         guidnum=atoi(param2.c_str());
00307                 currentcompressorp->SetInfo(param,guidnum);
00308                 cout << "compresser info changed."<<endl;
00309                 return true;
00310                 }
00311 
00312         else if (command == "makestate")
00313                 {
00314                 // make state information (i.e. build dictionary etc) using a file as training input
00315                 if (!CheckCompressorSelected(currentcompressorp))
00316                         return false;
00317                 string param1(parser.get_token());
00318                 if (param1 == "")
00319                         {
00320                         cout << "you must specify the filename to use for input."<<endl;
00321                         return false;
00322                         }
00323                 // run command
00324                 bool bretv=RunCommand_MakeState(param1);
00325                 cout << "  execution time:  "<< currentcompressorp->GetStatistics_LastOperation_State_ExecutionTime()<<" seconds."<<endl;
00326                 return bretv;
00327                 }
00328 
00329         else if (command == "compress")
00330                 {
00331                 // compress a file and write compressor info to front
00332                 if (!CheckCompressorReady(currentcompressorp))
00333                         return false;
00334                 string param1(parser.get_token());
00335                 if (param1 == "")
00336                         {
00337                         cout << "you must specify the filename to use."<<endl;
00338                         return false;
00339                         }
00340                 string param2(parser.get_token());
00341                 if (param2 == "")
00342                         {
00343                         // assume an output filename
00344                         param2 = MakeAssumedOutputFilename(param1, "decompressed", "compressed");
00345                         }
00346                 // run command (when savedecompresstateinfo==true it means write compressor state before raw data)
00347                 bool savedecompressstateinfo=true;
00348                 return RunCommand_Compress(param1,param2, savedecompressstateinfo);
00349                 }
00350         else if (command == "decompress")
00351                 {
00352                 // decompress a file and expect compressor state info at front
00353                 // we don't need an existing compressor for this decompress, since we expect full compressor state at head
00354                 //              if (!CheckCompressorReady(currentcompressorp))
00355                 //                      return false;
00356                 string param1(parser.get_token());
00357                 if (param1 == "")
00358                         {
00359                         cout << "you must specify the filename to use."<<endl;
00360                         return false;
00361                         }
00362                 string param2(parser.get_token());
00363                 if (param2 == "")
00364                         {
00365                         // assume an output filename
00366                         param2 = MakeAssumedOutputFilename(param1, "compressed", "decompressed");
00367                         }
00368                 // run command (when savedecompresstateinfo==false it means only write compressed data)
00369                 bool savedecompressstateinfo=true;
00370                 return RunCommand_Decompress(param1,param2,savedecompressstateinfo);
00371                 }
00372         else if (command == "compressr")
00373                 {
00374                 // compress a raw file without state info
00375                 if (!CheckCompressorReady(currentcompressorp))
00376                         return false;
00377                 string param1(parser.get_token());
00378                 if (param1 == "")
00379                         {
00380                         cout << "you must specify the filename to use."<<endl;
00381                         return false;
00382                         }
00383                 string param2(parser.get_token());
00384                 if (param2 == "")
00385                         {
00386                         // assume an output filename
00387                         param2 = MakeAssumedOutputFilename(param1, "decompressed", "compressed");
00388                         }
00389                 // run command (when savedecompresstateinfo==false it means only write compressed data)
00390                 bool savedecompressstateinfo=false;
00391                 return RunCommand_Compress(param1,param2, savedecompressstateinfo);
00392                 }
00393         else if (command == "decompressr")
00394                 {
00395                 // decompress a raw file, without compressor info
00396                 if (!CheckCompressorReady(currentcompressorp))
00397                         return false;
00398                 string param1(parser.get_token());
00399                 if (param1 == "")
00400                         {
00401                         cout << "you must specify the filename to use."<<endl;
00402                         return false;
00403                         }
00404                 string param2(parser.get_token());
00405                 if (param2 == "")
00406                         {
00407                         // assume an output filename
00408                         param2 = MakeAssumedOutputFilename(param1, "compressed", "decompressed");
00409                         }
00410                 // run command (when savedecompresstateinfo==false it means only write compressed data)
00411                 bool savedecompressstateinfo=false;
00412                 return RunCommand_Decompress(param1,param2,savedecompressstateinfo);
00413                 }
00414 
00415         else if (command == "testfile")
00416                 {
00417                 // compress and decompress a text string as a test
00418                 if (!CheckCompressorReady(currentcompressorp))
00419                         return false;
00420                 string param1(parser.get_token());
00421                 if (param1 == "")
00422                         {
00423                         cout << "you must specify the file to test compress."<<endl;
00424                         return false;
00425                         }
00426 
00427                 // run command
00428                 return RunCommand_TestFile(param1);
00429                 }
00430         else if (command == "test")
00431                 {
00432                 // compress and decompress a text string as a test
00433                 if (!CheckCompressorReady(currentcompressorp))
00434                         return false;
00435                 if (inputstr.length() <= 5)
00436                         {
00437                         cout << "error: you need to specify text to compress."<<endl;
00438                         return false;
00439                         }
00440                 // get text to compress
00441                 string inputstring(inputstr.substr(5));
00442                 // run command
00443                 return RunCommand_TestString(inputstring);
00444                 }
00445 
00446         // if we get here it means the command was not understood
00447         cout << "command not understood(" << inputstr << "); type 'help' for a list of known commands."<<endl;
00448         return false;
00449 }

bool OctaneTester::ExecuteCommandsFromStream std::ifstream &  from,
bool  quiet
 

Run a stream (input file) full of commands.

Returns:
true on no errors encountered during processing.

Definition at line 451 of file octanetester.cpp.

References ParseCommand(), and OctaneTimer::stop().

Referenced by ExecuteCommandsFromFile().

00452         {
00453         // run a stream full of commands and time them
00454         // return true on success
00455         bool bretv=true;
00456 
00457         // record start time
00458         OctaneTimer octanetimer;
00459 
00460         // parse stream
00461         string line;
00462         int linenum=1;
00463         while (getline(from, line))
00464                 {
00465                 // skip comments and blank lines
00466                 string::size_type i = line.find_first_of("\015\012");
00467                 if (i != string::npos)
00468                         line.erase(i);
00469                 if (line.length() < 3)
00470                         continue;
00471                 if (line[0] == '/' && line[1] == '/')
00472                         continue;
00473                 // show debugging info
00474                 if (!quiet)
00475                         cout << "]" << line << ""<<endl;
00476                 // run it and stop on exit
00477                 if (!(bretv=ParseCommand(line)))
00478                         break;
00479                 ++linenum;
00480                 }
00481 
00482         if (!quiet)
00483                 {
00484                 if (bretv)
00485                         cout << "Script finished successfully after "<<octanetimer.stop()<<" seconds."<<endl;
00486                 else
00487                         cout << "Script aborted with error on line "<<linenum<< " after "<<octanetimer.stop()<<" seconds."<<endl;
00488                 }
00489 
00490         // return success
00491         return bretv;
00492         }

bool OctaneTester::ExecuteCommandsFromFile const std::string &  filename,
bool  quiet
 

Run a file full of commands.

Returns:
true on no errors encountered during processing.

Definition at line 495 of file octanetester.cpp.

References ExecuteCommandsFromStream().

Referenced by ParseCommand().

00496         {
00497         // open a file input stream and run it
00498         // return true on success
00499         ifstream from(filename.c_str());
00500         if (!from)
00501                 {
00502                 cout << "error: unable to open file '" << filename << "'."<<endl;
00503                 return false;
00504                 }
00505         return ExecuteCommandsFromStream(from,quiet);
00506         }

bool OctaneTester::GrabLineFromConsole std::string &  line  )  [protected]
 

Grab a line from cin and return true on success.

Note:
this is necessary because of bugs in vc 6

Definition at line 512 of file octanetester.cpp.

Referenced by TestLoop().

00513 {
00514         // read a line of input from console and return true if a line was read or false if error ctrl-break type abort
00515         // we had to write this because of a known bug in vc6 getline() which requires double CRs on getline input.  good work bill gates.
00516         // return true on successful read of a line (can be blank)
00517 
00518         // clear line
00519         line="";
00520 
00521         // loop reading characters until CR
00522         unsigned char c;
00523         for (;;)
00524                 {
00525                 c = cin.get();
00526                 if (c=='\n')
00527                         break;
00528                 line+=c;
00529                 }
00530         return true;
00531 }

OctaneCompressor * OctaneTester::SelectInstantiatedCompressor const std::string &  compressorname  )  [protected]
 

Select a compressor for subsequent operations; sets current compressorp in the process.

Returns:
true on success.

Definition at line 599 of file octanetester.cpp.

References currentcompressorp, CompressorManager::FindInstantiatedCompressorpFromStringId(), and global_compressormanagerp.

Referenced by ParseCommand().

00600 {
00601         // lookup compressor
00602         OctaneCompressor* compressorp=global_compressormanagerp->FindInstantiatedCompressorpFromStringId(compressorname);
00603         // set current compressor
00604         if (compressorp!=NULL)
00605                 currentcompressorp=compressorp;
00606         return compressorp;
00607 }

bool OctaneTester::CheckCompressorSelected OctaneCompressor compressorp  )  [protected]
 

Helper function during parsing, to verify that the current compressor is ready to compress and decompress show warning and return false if not.

Returns:
true if compressor is valid and ready

Definition at line 609 of file octanetester.cpp.

Referenced by CheckCompressorReady(), and ParseCommand().

00610 {
00611         // check if the compressor is nonnull and is ready
00612         // show warning and return false if not.
00613         if (compressorp==NULL)
00614                 {
00615                 cout << "No instantiated compressor currently selected (run 'create' or 'load')."<<endl;
00616                 return false;
00617                 }
00618         // one is selected
00619         return true;
00620 }

bool OctaneTester::CheckCompressorReady OctaneCompressor compressorp  )  [protected]
 

Helper function during parsing, to verify that the current compressor is ready to compress and decompress show warning and return false if not.

Returns:
true if compressor is valid and ready

Definition at line 622 of file octanetester.cpp.

References CheckCompressorSelected(), currentcompressorp, OctaneCompressor::GetInstantiatedName(), and OctaneCompressor::IsReadyToCompress().

Referenced by ParseCommand().

00623         {
00624         // check if the compressor is nonnull and is ready
00625         // show warning and return false if not.
00626         if (!CheckCompressorSelected(compressorp))
00627                 return false;
00628         if (!compressorp->IsReadyToCompress())
00629                 {
00630                 cout << "compressor "<< currentcompressorp->GetInstantiatedName() << " is not ready for compression; do you need to make or load state data first?"<<endl;
00631                 return false;
00632                 }
00633         // it is ready
00634         return true;
00635         }

string OctaneTester::MakeAssumedOutputFilename const std::string &  origname,
const std::string &  origext,
const std::string &  newext
[protected]
 

helper function to smartly add an extension to a file name, based on current compressor

Returns:
a new filename with extensions added to it if appropriate

Definition at line 637 of file octanetester.cpp.

References currentcompressorp, and OctaneCompressor::GetInstantiatedName().

Referenced by ParseCommand().

00638 {
00639         // helper function to smartly add an extension to a file name, based on current compressor
00640         //  and removing old extension if appropriate.
00641 
00642         if (currentcompressorp==NULL)
00643                 {
00644                 string origfullext(string(".") + origext);
00645                 string::size_type pos = origname.rfind(origfullext);
00646                 if (pos == string::npos)
00647                         return origname + "." + newext;
00648                 return string(origname, 0, pos) + newext;
00649                 }
00650 
00651         string newfullext(string(".") + currentcompressorp->GetInstantiatedName() + "." + newext);
00652 
00653         if (origext == "")
00654                 return origname + newfullext;
00655 
00656         string origfullext(string(".") + currentcompressorp->GetInstantiatedName() + "." + origext);
00657 
00658         string::size_type pos = origname.rfind(origfullext);
00659 
00660         if (pos == string::npos)
00661                 return origname + "." + newext;
00662 
00663         return string(origname, 0, pos) + newext;
00664 }

bool OctaneTester::RunCommand_TestString std::string  inputstring  )  [protected]
 

Run the TestString command, to compress and then decompress a string and check for errors.

Returns:
true on success.

Definition at line 670 of file octanetester.cpp.

References bitwriter::align_byte(), OctaneCompressor::Compress(), currentcompressorp, OctaneCompressor::Decompress(), OctaneCompressor::GetInstantiatedName(), and OctaneClass::NiceifyHighAsciiString().

Referenced by ParseCommand().

00671         {
00672         bool bretv;
00673         // create bitreader and bitwriter, they will be deleted on exit
00674         string compressedstring;
00675         string_bitreader from(inputstring);
00676         string_bitwriter to(compressedstring);
00677 
00678         // do compression of text (third argument==false means don't write header info)
00679         bretv = currentcompressorp->Compress(from, to, false, false);
00680         if (!bretv)
00681                 {
00682                 cout << "Error compressing."<<endl;
00683                 return false;
00684                 }
00685 
00686         // align output bitwriter (this must be performed when we finish)
00687         to.align_byte();
00688 
00689         // show some info about compression
00690         cout << "Testing " << currentcompressorp->GetInstantiatedName() << ".."<<endl;
00691         cout << "  input length: " << setw(3)<< (int)(inputstring.length()) << "\n";
00692         cout << " output length: " << setw(3)<< (int)(compressedstring.length()) << endl;
00693 
00694         // show result in nice format
00695         string nicestring(compressedstring);
00696         NiceifyHighAsciiString(nicestring);
00697         cout << "    compressed: " << nicestring << endl;
00698 
00699         // decompress it back to original to check it
00700         // create bitreader and bitwriter, they will be deleted on exit
00701         string resultstring;
00702         string_bitreader from2(compressedstring);
00703         string_bitwriter to2(resultstring);
00704         // do decompression (third argument==false means don't expect header info)
00705         bretv = currentcompressorp->Decompress(from2, to2, false);
00706         if (!bretv)
00707                 {
00708                 cout << "Error decompressing."<<endl;
00709                 return false;
00710                 }
00711 
00712         // show result
00713         cout << "      original: "<< inputstring << "\n";
00714         cout << "  decompressed: "<< resultstring << endl;
00715         if (inputstring != resultstring)
00716                 {
00717                 cout << "ERROR: decompression does not match original text."<<endl;
00718                 return false;
00719                 }
00720 
00721         // we are done with success
00722         return true;
00723         }

bool OctaneTester::RunCommand_TestFile std::string  filename  )  [protected]
 

Run the TestFile command, to compress and then decompress a file and check for errors.

Returns:
true on success.

Definition at line 726 of file octanetester.cpp.

References CheckFilesAreIdentical(), DeleteAFile(), RunCommand_Compress(), and RunCommand_Decompress().

Referenced by ParseCommand().

00727         {
00728         bool bretv,bretv2;
00729         std::string tempoutfilename_compressed="testfiletemp_compressed.out";
00730         std::string tempoutfilename_decompressed="testfiletemp_decompressed.out";
00731         
00732         // compress file with no state info
00733         cout << "Compressing file without state: ";
00734         bretv=RunCommand_Compress(filename,tempoutfilename_compressed,false);
00735         if (bretv)
00736                 {
00737                 cout << "Decompressing compressed file: ";
00738                 bretv=RunCommand_Decompress(tempoutfilename_compressed,tempoutfilename_decompressed,false);
00739                 if (bretv)
00740                         {
00741                         // now see if they are identical
00742                         cout << "--> Comparing decompressed file with original: ";
00743                         if (CheckFilesAreIdentical(tempoutfilename_decompressed,filename))
00744                                 cout << "FILES MATCH."<<endl;
00745                         else
00746                                 cout << "FILES DO *NOT* MATCH."<<endl;
00747                         }
00748                 }
00749         cout << endl;
00750                 
00751         // again with state
00752         cout << "Compressing file with state: ";
00753         bretv2=RunCommand_Compress(filename,tempoutfilename_compressed,true);
00754         if (bretv2)
00755                 {
00756                 cout << "Decompressing compressed file: ";
00757                 bretv2=RunCommand_Decompress(tempoutfilename_compressed,tempoutfilename_decompressed,true);
00758                 if (bretv2)
00759                         {
00760                         // now see if they are identical
00761                         cout << "--> Comparing decompressed file with original: ";
00762                         if (CheckFilesAreIdentical(tempoutfilename_decompressed,filename))
00763                                 cout << "FILES MATCH."<<endl;
00764                         else
00765                                 cout << "FILES DO *NOT* MATCH."<<endl;
00766                         }
00767                 }
00768         cout << endl;
00769 
00770         // now delete temporary files
00771         DeleteAFile(tempoutfilename_compressed);
00772         DeleteAFile(tempoutfilename_decompressed);
00773         
00774         // return success
00775         return (bretv&&bretv2);
00776         }

bool OctaneTester::RunCommand_CreateCompressor std::string  compressorclassname,
std::string  compressorname,
unsigned short  guidnum
[protected]
 

Run the CreateCompressor command, to create a new instantiated compressor.

Returns:
true on success.

Definition at line 782 of file octanetester.cpp.

References CompressorManager::AddCompressor(), currentcompressorp, CompressorManager::FindBaseCompressorClass(), global_compressormanagerp, OctaneCompressor::MakeCompressorInstantiation(), and OctaneCompressor::SetInfo().

Referenced by ParseCommand().

00783 {
00784         // create a new compressor based on a base class
00785 
00786         // select base compressor class type
00787         OctaneCompressor *compressorp = global_compressormanagerp->FindBaseCompressorClass(compressorclassname);
00788         if (compressorp==NULL)
00789                 {
00790                 // couldn't find base class
00791                 cout << "ERROR: could not find compressor base class '"<<compressorclassname<<"'."<<endl;
00792                 return false;
00793                 }
00794 
00795         // ask base class to make us a derived class
00796         compressorp=compressorp->MakeCompressorInstantiation();
00797         if (compressorp==NULL)
00798                 {
00799                 // couldn't find base class
00800                 cout << "ERROR: failed to instantiate a derived compressor from base class '"<<compressorclassname<<"'."<<endl;
00801                 return false;
00802                 }
00803 
00804         // set details for it
00805         compressorp->SetInfo(compressorname,guidnum);
00806         
00807         // now add it
00808         bool bretv=global_compressormanagerp->AddCompressor(compressorp);
00809         if (!bretv)
00810                 {
00811                 // failed to add it
00812                 delete compressorp;
00813                 return false;
00814                 }
00815         else
00816                 {
00817                 // set this new compressor to be our current compressor?
00818                 if (currentcompressorp==NULL || true)
00819                         currentcompressorp=compressorp;
00820                 }
00821         
00822         return true;
00823 }

bool OctaneTester::RunCommand_LoadCompressor std::string  filename  )  [protected]
 

Run the LoadCompressor command, to recall saved state space.

Returns:
true on success.

Definition at line 826 of file octanetester.cpp.

References CompressorManager::AddCompressor(), CompressorManager::CreateCompressorFromSavedStream(), currentcompressorp, file_bitreader::error(), OctaneCompressor::GetStatistics_LastOperation_State_BytesRead(), OctaneCompressor::GetStatistics_LastOperation_State_ExecutionTime(), and global_compressormanagerp.

Referenced by ParseCommand().

00827         {
00828         // create bitreader, they will be deleted on exit
00829         file_bitreader from(filename.c_str());
00830         if (from.error())
00831                 {
00832                 cout << "Error opening file " << filename << " for input.  Loadstate failed."<<endl;
00833                 return false;
00834                 }
00835         // load the state
00836         OctaneCompressor * compressorp= global_compressormanagerp->CreateCompressorFromSavedStream(from);
00837         if (compressorp==NULL)
00838                 {
00839                 cout <<"Failed to load compressor."<<endl;
00840                 return false;
00841                 }
00842                 
00843         // add compressor
00844         bool bretv=global_compressormanagerp->AddCompressor(compressorp);
00845         if (bretv==false)
00846                 {
00847                 cout <<"Failed to add compressor to compressor manager."<<endl;
00848                 delete compressorp;
00849                 return false;
00850                 }
00851         else
00852                 {
00853                 // set this new compressor to be our current compressor?
00854                 if (currentcompressorp==NULL || true)
00855                         currentcompressorp=compressorp;
00856                 }
00857 
00858         // show results
00859         cout << "Loaded compressor from file '" << filename << "'.\n";
00860         cout << "  state file size: "<< currentcompressorp->GetStatistics_LastOperation_State_BytesRead()<<" bytes.\n";
00861         cout << "  execution time:  "<< currentcompressorp->GetStatistics_LastOperation_State_ExecutionTime()<<" seconds."<<endl;
00862         // show new compressor info
00864 
00865         // return success
00866         return true;
00867         }

bool OctaneTester::RunCommand_SaveCompressor std::string  filename  )  [protected]
 

Run the SaveCompressor command, to recall saved state space.

Returns:
true on success.

Definition at line 870 of file octanetester.cpp.

References currentcompressorp, file_bitwriter::error(), OctaneCompressor::GetStatistics_LastOperation_State_BytesWritten(), and OctaneCompressor::Save().

Referenced by ParseCommand().

00871         {
00872         // create bitreader, they will be deleted on exit
00873         file_bitwriter to(filename.c_str());
00874         if (to.error())
00875                 {
00876                 cout << "Error opening file " << filename << " for input.  SaveCompressor failed."<<endl;
00877                 return false;
00878                 }
00879         // save the state (second parameter==false means save complete state, not just state required for decompression)
00880         bool bretv = currentcompressorp->Save(to,false);
00881         if (!bretv)
00882                 {
00883                 cout <<"Failed to save state data."<<endl;
00884                 return false;
00885                 }
00886         // show result
00887         cout << "Saved compressor file '" << filename << "'.\n";
00888         cout << "  state file size: "<< currentcompressorp->GetStatistics_LastOperation_State_BytesWritten()<<" bytes.\n";
00889 
00890         // return success
00891         return true;
00892         }

bool OctaneTester::RunCommand_DeleteCompressor std::string  compressoridstring  )  [protected]
 

Run the DeleteCompressor command, to delete an instantiated compressor.

Returns:
true on success.

Definition at line 895 of file octanetester.cpp.

References currentcompressorp, CompressorManager::DeleteCompressor(), CompressorManager::FindInstantiatedCompressorpFromStringId(), CompressorManager::GetInstantiatedCompressorCount(), CompressorManager::GetInstantiatedCompressorp(), and global_compressormanagerp.

Referenced by ParseCommand().

00896         {
00897         // delete a compressor
00898         
00899         // look up the compressor
00900         OctaneCompressor *compressorp = global_compressormanagerp->FindInstantiatedCompressorpFromStringId(compressoridstring);
00901         if (compressorp==NULL)
00902                 {
00903                 cout <<"Couldn't locate compressor '"<<compressoridstring<<"'."<<endl;
00904                 return false;
00905                 }
00906 
00907         // delete it
00908         global_compressormanagerp->DeleteCompressor(compressorp);
00909 
00910         // if this was our current one, then we need to change it
00911         if (currentcompressorp==compressorp)
00912                 {
00913                 if (global_compressormanagerp->GetInstantiatedCompressorCount()>0)
00914                         currentcompressorp=global_compressormanagerp->GetInstantiatedCompressorp(0);
00915                 else
00916                         currentcompressorp=NULL;
00917                 }
00918 
00919         // return success
00920         return true;
00921         }

bool OctaneTester::RunCommand_MakeState std::string  infilename  )  [protected]
 

Run the MakeState command, to create state info (i.e.

train on file).

Returns:
true on success.

Definition at line 924 of file octanetester.cpp.

References OctaneCompressor::CreateSymbolsAndModelsUsingStream(), currentcompressorp, file_bitreader::error(), and OctaneCompressor::GetInstantiatedName().

Referenced by ParseCommand().

00925         {
00926         // create bitreader and bitwriter, they will be deleted on exit
00927         file_bitreader from(infilename.c_str());
00928         if (from.error())
00929                 {
00930                 cout << "Error opening file "<<infilename<< " for input.  Makestate failed."<<endl;
00931                 return false;
00932                 }
00933 
00934         // make state data
00935         cout << "Computing state data using "<<currentcompressorp->GetInstantiatedName() << ":"<<endl;
00936         bool bretv = currentcompressorp->CreateSymbolsAndModelsUsingStream(from);
00937         if (!bretv)
00938                 {
00939                 cout << "Failed to generate state data."<<endl;
00940                 return false;
00941                 }
00942         return true;
00943         }

bool OctaneTester::RunCommand_Compress std::string  infilename,
std::string  outfilename,
bool  savedecompressstateinfo
[protected]
 

Run the Compress command, to compress a file and write result to another file.

Returns:
true on success.

Definition at line 946 of file octanetester.cpp.

References OctaneCompressor::Compress(), currentcompressorp, file_bitwriter::error(), file_bitreader::error(), OctaneClass::GetDiskspaceUsed(), OctaneCompressor::GetInstantiatedName(), OctaneCompressor::GetStatistics_LastOperation_Compression_Bitrate(), OctaneCompressor::GetStatistics_LastOperation_Compression_BytesRead(), OctaneCompressor::GetStatistics_LastOperation_Compression_BytesWritten(), OctaneCompressor::GetStatistics_LastOperation_Compression_ExecutionTime(), and OctaneCompressor::GetStatistics_LastOperation_Compression_Ratio().

Referenced by ParseCommand(), and RunCommand_TestFile().

00947         {
00948         // create bitreader and bitwriter, they will be deleted on exit
00949         file_bitreader from(infilename.c_str());
00950         if (from.error())
00951                 {
00952                 cout << "Error opening file " << infilename << " for input.  Compression failed."<<endl;
00953                 return false;
00954                 }
00955         file_bitwriter to(outfilename.c_str());
00956         if (to.error())
00957                 {
00958                 cout << "Error opening file " << outfilename << " for output.  Compression failed."<<endl;
00959                 return false;
00960                 }
00961 
00962         // do the compression
00963         cout << "Compressing with " << currentcompressorp->GetInstantiatedName() << ":"<<endl;
00964         bool bretv = currentcompressorp->Compress(from, to, savedecompressstateinfo, savedecompressstateinfo);
00965         if (!bretv)
00966                 {
00967                 cout << "Compression failed."<<endl;
00968                 return false;
00969                 }
00970 
00971         // show output
00972         cout << "       original size: " << currentcompressorp->GetStatistics_LastOperation_Compression_BytesRead() << " bytes (" << infilename << ")\n";
00973         cout << "     compressed size: " << currentcompressorp->GetStatistics_LastOperation_Compression_BytesWritten() << " bytes (" << outfilename << ")\n";
00974         if (savedecompressstateinfo)
00975                 cout << " est. cost of header: " << currentcompressorp->GetDiskspaceUsed(true)<< " bytes.\n";
00976         float executiontime=currentcompressorp->GetStatistics_LastOperation_Compression_ExecutionTime();
00977         float bytespersec=(currentcompressorp->GetStatistics_LastOperation_Compression_BytesRead()/executiontime)/1024.0;
00978         cout << "      execution time: " <<  executiontime << " seconds ("<<bytespersec<<" kb/s).\n";
00979         cout << "   compression ratio: " << currentcompressorp->GetStatistics_LastOperation_Compression_Ratio()*100.0 << "% (" << currentcompressorp->GetStatistics_LastOperation_Compression_Bitrate() << " bits per byte)."<<endl;
00980 
00981         // return success
00982         return true;
00983         }

bool OctaneTester::RunCommand_Decompress std::string  infilename,
std::string  outfilename,
bool  savedecompressstateinfo
[protected]
 

Run the Decompress command, to decompress a file and write result to another file.

Returns:
true on success.

Definition at line 986 of file octanetester.cpp.

References OctaneCompressor::Add_LastOperation_Decompression_BytesRead(), CompressorManager::CreateCompressorFromSavedStream(), currentcompressorp, OctaneCompressor::Decompress(), file_bitwriter::error(), file_bitreader::error(), CompressorManager::FindInstantiatedCompressorpFromGuid(), OctaneCompressor::GetInstantiatedName(), OctaneCompressor::GetStatistics_LastOperation_Decompression_Bitrate(), OctaneCompressor::GetStatistics_LastOperation_Decompression_BytesRead(), OctaneCompressor::GetStatistics_LastOperation_Decompression_BytesWritten(), OctaneCompressor::GetStatistics_LastOperation_Decompression_ExecutionTime(), OctaneCompressor::GetStatistics_LastOperation_Decompression_Ratio(), global_compressormanagerp, OctaneCompressor::LoadGUID(), and bitreader::tell_byte().

Referenced by ParseCommand(), and RunCommand_TestFile().

00987         {
00988         // create bitreader and bitwriter, they will be deleted on exit
00989         OctaneCompressor *compressorp;
00990         int headersize=0;
00991 
00992         file_bitreader from(infilename.c_str());
00993         if (from.error())
00994                 {
00995                 cout << "Error opening file " << infilename << " for input.  Decompression failed."<<endl;
00996                 return false;
00997                 }
00998         file_bitwriter to(outfilename.c_str());
00999         if (to.error())
01000                 {
01001                 cout << "Error opening file " << outfilename << " for output.  Decompression failed."<<endl;
01002                 return false;
01003                 }
01004 
01005         if (savedecompressstateinfo)
01006                 {
01007                 // first read guid info - and if found try to create a compressor from known compressors
01008                 int retvguid=OctaneCompressor::LoadGUID(from);
01009                 if (retvguid==-1)
01010                         {
01011                         // compressor details are in from stream
01012                         compressorp=global_compressormanagerp->CreateCompressorFromSavedStream(from);
01013                         if (compressorp==NULL)
01014                                 {
01015                                 cout << "Error creating compressor from the input stream."<<endl;
01016                                 return false;
01017                                 }
01018                         headersize=from.tell_byte();
01019                         // cout << "Recreated temporary compressor from input stream."<<endl;
01020                         }
01021                 else
01022                         {
01023                         // only the guid is in the from stream, now we have to look it up
01024                         compressorp=global_compressormanagerp->FindInstantiatedCompressorpFromGuid(retvguid);
01025                         if (compressorp==NULL)
01026                                 {
01027                                 cout << "Error, could not find an instantiated compressor which matches input stream expectation(GUID="<<retvguid<<")."<<endl;
01028                                 return false;
01029                                 }
01030                         cout << "Using instantiated compressor with guid "<<retvguid<<"."<<endl;
01031                         }
01032                 }
01033         else
01034                 {
01035                 // use current compressor
01036                 compressorp=currentcompressorp;
01037                 }
01038 
01039         // do the decompression
01040         cout << "Decompressing with " << compressorp->GetInstantiatedName() << ":"<<endl;
01041         // we pass the last argument false because we have already loaded any compressor state data
01042         bool bretv = compressorp->Decompress(from, to, false);
01043         if (!bretv)
01044                 cout << "Decompression failed."<<endl;
01045         else
01046                 {
01047                 // kludge to fixup lastoperation size to account for header size
01048                 compressorp->Add_LastOperation_Decompression_BytesRead(headersize);
01049                 // show result
01050                 cout <<"      original size: "  << compressorp->GetStatistics_LastOperation_Decompression_BytesRead() << " (" << infilename << ")\n";
01051                 cout << "  decompressed size: " << compressorp->GetStatistics_LastOperation_Decompression_BytesWritten() << " (" << outfilename << ")\n";
01053                 float executiontime=compressorp->GetStatistics_LastOperation_Decompression_ExecutionTime();
01054                 float bytespersec=(currentcompressorp->GetStatistics_LastOperation_Decompression_BytesWritten()/executiontime)/1024.0;
01055                 cout << "     execution time: " << executiontime << " seconds ("<<bytespersec<<" kb/s).\n";
01056                 cout << "  compression ratio: " << compressorp->GetStatistics_LastOperation_Decompression_Ratio()*100.0 << "% (" << compressorp->GetStatistics_LastOperation_Decompression_Bitrate() << " bits per byte)."<<endl;
01057                 }
01058 
01059         if (savedecompressstateinfo)
01060                 {
01061                 // kill the temporary compressor
01062                 delete compressorp;
01063                 }
01064 
01065         // return success
01066         return bretv;
01067         }

bool OctaneTester::DeleteAFile std::string  filename  )  [protected]
 

Helper function, delete a file if it exists, or do nothing if not.

Returns:
true on deletion of file or no file
Todo:
this is not implemented yet

Definition at line 1073 of file octanetester.cpp.

Referenced by RunCommand_TestFile().

01074 {
01075         // helper function, delete a file if it exists, or do nothing if not
01076 
01077         remove(filename.c_str());
01078 
01079         // return true on deletion of file or no file
01080         return true;
01081 }

bool OctaneTester::CheckFilesAreIdentical std::string  filename1,
std::string  filename2
[protected]
 

Check two files and see if they are identical.

Returns:
true if identical
Todo:
do we need to do this more efficiently

Definition at line 1083 of file octanetester.cpp.

References bitreader::bytes_left(), file_bitreader::error(), and bitreader::get_byte().

Referenced by RunCommand_TestFile().

01084 {
01085         // test files for equality
01086 
01087         // inefficient way but works
01088 
01089         file_bitreader from1(filename1.c_str());
01090         file_bitreader from2(filename2.c_str());
01091         if (from1.error() || from2.error())
01092                 {
01093                 // error
01094                 return false;
01095                 }
01096         
01097         if (from1.bytes_left()!=from2.bytes_left())
01098                 {
01099                 // dont match
01100                 return false;
01101                 }
01102 
01103         int len=from1.bytes_left();
01104         unsigned char c1,c2;
01105         while (len>0)
01106                 {
01107                 c1=from1.get_byte();
01108                 c2=from2.get_byte();
01109                 if (c1!=c2)
01110                         return false;
01111                 --len;
01112                 }
01113 
01114         // return true on success
01115         return true;
01116 }


The documentation for this class was generated from the following files:  
Generated on 20 May 2004 by doxygen 1.3.3