201 lines
		
	
	
		
			7.0 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			201 lines
		
	
	
		
			7.0 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
| //
 | |
| // EX24CON.CPP
 | |
| //
 | |
| //  C++/DOS Example program for ArchiveLib 2.0
 | |
| //
 | |
| //  Copyright (c) Greenleaf Software, Inc. 1994 - 1996
 | |
| //  All Rights Reserved
 | |
| //
 | |
| // MEMBERS/FUNCTIONS DEMONSTRATED
 | |
| //
 | |
| //   ALCompressedObject::Extract()
 | |
| //   ALCompressedOjbect::Insert()
 | |
| //
 | |
| // DESCRIPTION
 | |
| //
 | |
| //  This example gives a quick demo on how to insert and extract
 | |
| //  files from an ALCompressedObject.  It provides a command line interfac
 | |
| //  that makes it easy to test the functions to insert and extract files
 | |
| //  from an ALCompressedObject.  Remember that if you create a compressed
 | |
| //  object of your own, and you want to test it with this program,
 | |
| //  you will have to make sure your compression engine has the same
 | |
| //  parameters as the one used here.  Modify this program to match whatever
 | |
| //  you have used to create the objects.
 | |
| //
 | |
| // REVISION HISTORY
 | |
| //
 | |
| //  February 1, 1996  2.0A  : Second release
 | |
| //
 | |
| 
 | |
| #include <stdio.h>
 | |
| #include <conio.h>
 | |
| #include <iostream.h>
 | |
| 
 | |
| #include "al.h"
 | |
| 
 | |
| //
 | |
| // Global guys, easier to create them here just one time than have to
 | |
| // create them in each of the three subroutines.
 | |
| //
 | |
| 
 | |
| #if defined( ZIP )
 | |
| ALPkCompressor Compressor;
 | |
| ALPkDecompressor Decompressor;
 | |
| #else
 | |
| ALGlCompressor Compressor( AL_GREENLEAF_LEVEL_4 );
 | |
| ALGlDecompressor Decompressor( AL_GREENLEAF_LEVEL_4 );
 | |
| #endif
 | |
| ALSpinner monitor( AL_MONITOR_OBJECTS );
 | |
| 
 | |
| //
 | |
| // Prototypes for the three command handlers.
 | |
| //
 | |
| int test( char *object_name );
 | |
| int insert( char *object_name, char *file_name );
 | |
| int extract( char *object_name, char *file_name );
 | |
| 
 | |
| //
 | |
| // main() just has to parse the command line and then pick the appropriate
 | |
| // routine to call.  If the command line looks bogus we print out the
 | |
| // usage information and exit.
 | |
| //
 | |
| int main( int argc, char *argv[] )
 | |
| {
 | |
|     cout << "Archive Library 2.0\nEX24CON.CPP\n\n";
 | |
|     cout << "This example gives a quick demo on how to insert and extract\n";
 | |
|     cout << "files from an ALCompressedObject.  It provides a command line interface\n";
 | |
|     cout << "that makes it easy to test the functions to insert and extract files\n";
 | |
|     cout << "from an ALCompressedObject.  Remember that if you create a compressed\n";
 | |
|     cout << "object of your own, and you want to test it with this program,\n";
 | |
|     cout << "you will have to make sure your compression engine has the same\n";
 | |
|     cout << "parameters as the one used here.  Modify this program to match whatever\n";
 | |
|     cout << "you have used to create the objects.\n";
 | |
|     getch();
 | |
| 
 | |
|     if ( argc == 3 && strcmp( argv[ 1 ], "-t" ) == 0 )
 | |
|         return test( argv[ 2 ] );
 | |
|     else if ( argc == 4 && strcmp( argv[ 1 ], "-i" ) == 0 )
 | |
|         return insert( argv[ 2 ], argv[ 3 ] );
 | |
|     else if ( argc == 4 && strcmp( argv[ 1 ], "-x" ) == 0 )
 | |
|         return extract( argv[ 2 ], argv[ 3 ] );
 | |
|     cout << "\n"
 | |
|          << "Usage: EX24CON -t | -i | -x compressed_file [plain_file]\n"
 | |
|          << "\n"
 | |
|          << "Options:  -t : Test the object\n"
 | |
|          << "          -i : Insert a file into the object\n"
 | |
|          << "          -x : Extract a file from the object\n"
 | |
|          << "\n"
 | |
|          << "This example program can be used to insert or extract\n"
 | |
|          << "files from a compressed object.  It will always use the\n"
 | |
|          << "Greenleaf compression engine at level 4.\n"
 | |
|          << "\n";
 | |
|     return 1;
 | |
| }
 | |
| 
 | |
| //
 | |
| // This subroutine is called when the program is executed with the -t
 | |
| // option.  It extracts the compressed file out of the compressed object,
 | |
| // then prints out the CRC and length so you can compare them to the
 | |
| // CRC and length in the compressed object.  It then deletes the
 | |
| // temporary file and exits.
 | |
| //
 | |
| // Note that getting the information out of the compressed object is
 | |
| // done using hardcoded reads from specific locations.
 | |
| //
 | |
| 
 | |
| int test( char *object_name )
 | |
| {
 | |
|     int status;
 | |
|     ALFile object_file( object_name );
 | |
|     ALCompressedObject object( object_file, &Compressor, &Decompressor );
 | |
|     ALFile file( "" );
 | |
|     file.mpMonitor = &monitor;
 | |
|     monitor.mlObjectStart = 0;
 | |
|     status = object.Extract( file );
 | |
|     file.Delete();
 | |
|     cout << "Status: " << object.mStatus.GetStatusDetail() << "\n";
 | |
|     cout << "Extracted file has length: " << file.GetSize() << "\n";
 | |
|     cout << "Extracted file has CRC: " << hex << file.GetCrc32() << "\n";
 | |
|     object_file.Open();
 | |
|     long uncompressed_size;
 | |
|     long compressed_size;
 | |
|     long crc_32;
 | |
|     object_file.ReadGlLong( uncompressed_size );
 | |
|     cout << dec
 | |
|          << "Compressed object indicates an uncompressed size of "
 | |
|          << uncompressed_size
 | |
|          << "\n";
 | |
|     object_file.ReadGlLong( compressed_size );
 | |
|     cout << "Compressed object indicates a compressed size of "
 | |
|          << compressed_size
 | |
|          << "\n";
 | |
|     object_file.ReadGlLong( crc_32 );
 | |
|     cout << hex
 | |
|          << "Compressed object indicates an CRC of "
 | |
|          << ~crc_32
 | |
|          << "\n";
 | |
|     return status;
 | |
| }
 | |
| 
 | |
| //
 | |
| // This routine is used to insert a file into a compressed object.  Because
 | |
| // of the way compressed objects work, this is a destructive operation, so
 | |
| // I ask for permission if the compressed file already exists.  After that
 | |
| // it is a simple matter to call the Insert() function and then exit.
 | |
| //
 | |
| 
 | |
| int insert( char *object_name, char *file_name )
 | |
| {
 | |
|     int status;
 | |
|     FILE *p = fopen( object_name, "r" );
 | |
|     if ( p ) {
 | |
|         char answer;
 | |
|         cout << "I don't reall want to clobber file " << object_name << "\n";
 | |
|         cout << "Should I (Y/N) ? " << flush;
 | |
|         cin >> answer;
 | |
|         if ( answer != 'Y' && answer != 'y' )
 | |
|             return 1;
 | |
|         fclose( p );
 | |
|         cout << "It will be clobbered.\n";
 | |
|     }
 | |
|     ALFile object_file( object_name );
 | |
|     ALCompressedObject object( object_file, &Compressor, &Decompressor );
 | |
|     ALFile file( file_name );
 | |
|     file.mpMonitor = &monitor;
 | |
|     monitor.mlObjectStart = 0;
 | |
|     status = object.Insert( file );
 | |
|     cout << "Status: " << object.mStatus.GetStatusDetail() << "\n";
 | |
|     return status;
 | |
| }
 | |
| 
 | |
| //
 | |
| // This routine is used to extract a file from a compressed object.  Because
 | |
| // of the way compressed objects work, this is a destructive operation, so
 | |
| // I ask for permission if the output file already exists.  After that
 | |
| // it is a simple matter to call the Extract() function and then exit.
 | |
| //
 | |
| 
 | |
| int extract( char *object_name, char *file_name )
 | |
| {
 | |
|     int status;
 | |
|     FILE *p = fopen( file_name, "r" );
 | |
|     if ( p ) {
 | |
|         char answer;
 | |
|         cout << "I don't reall want to clobber file " << file_name << "\n";
 | |
|         cout << "Should I (Y/N) ? " << flush;
 | |
|         cin >> answer;
 | |
|         if ( answer != 'Y' && answer != 'y' )
 | |
|             return 1;
 | |
|         fclose( p );
 | |
|         cout << "It will be clobbered.\n";
 | |
|     }
 | |
|     ALFile object_file( object_name );
 | |
|     ALCompressedObject object( object_file, &Compressor, &Decompressor );
 | |
|     ALFile file( file_name );
 | |
|     file.mpMonitor = &monitor;
 | |
|     monitor.mlObjectStart = 0;
 | |
|     status = object.Extract( file );
 | |
|     cout << "Status: " << object.mStatus.GetStatusDetail() << "\n";
 | |
|     return status;
 | |
| }
 |