/* THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX SOFTWARE CORPORATION ("PARALLAX"). PARALLAX, IN DISTRIBUTING THE CODE TO END-USERS, AND SUBJECT TO ALL OF THE TERMS AND CONDITIONS HEREIN, GRANTS A ROYALTY-FREE, PERPETUAL LICENSE TO SUCH END-USERS FOR USE BY SUCH END-USERS IN USING, DISPLAYING, AND CREATING DERIVATIVE WORKS THEREOF, SO LONG AS SUCH USE, DISPLAY OR CREATION IS FOR NON-COMMERCIAL, ROYALTY OR REVENUE FREE PURPOSES. IN NO EVENT SHALL THE END-USER USE THE COMPUTER CODE CONTAINED HEREIN FOR REVENUE-BEARING PURPOSES. THE END-USER UNDERSTANDS AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE. COPYRIGHT 1993-1998 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED. */ /* * $Source: f:/miner/source/pslib/rcs/pslib.c $ * $Revision: 1.18 $ * $Author: john $ * $Date: 1994/02/15 12:53:20 $ * * Main program for pslib.exe * * $Log: pslib.c $ * Revision 1.18 1994/02/15 12:53:20 john * Made numfiles stored in library be a short instead of char. * * Revision 1.17 1994/02/14 20:11:27 john * First version working with new cfile stuff. * * Revision 1.16 1993/12/17 16:17:49 yuan * Fixed file not found message if library file doesn't exist. * * Revision 1.15 1993/12/08 16:08:17 yuan * Fixed MAX_FILES bug. * * Revision 1.14 1993/10/28 14:39:54 yuan * old cfread changed to cfreadfile * * * Revision 1.13 1993/10/27 18:30:27 yuan * Added free for lib_name when error occurs. * Added file sizes and overall compression ratios * during listing. * * Revision 1.12 1993/10/22 18:00:25 yuan * fixed 0 file size problem * * Revision 1.11 1993/10/22 17:51:29 yuan * Fixed some network generated flaky problems * * Revision 1.10 1993/10/19 14:10:53 yuan * Fixed a minor free(lib_name) problem. * * Revision 1.9 1993/10/18 17:59:36 yuan * Fixed memory alloc errors * * Revision 1.8 1993/09/29 17:50:06 yuan * No major changes were made to pslib.c * However, all printf error messages and exits * were removed from the library. Now error * codes are returned back to the caller. If * a buffer has an error, NULL is returned. * * revision 1.7 1993/09/27 17:13:58 yuan * lib_read_test function added. All test functions moved * from library.c over to pslib.c * * Revision 1.6 1993/09/21 17:31:51 yuan * Minor formatting in listing function fixed. * * Revision 1.5 1993/09/21 17:22:31 yuan * *** empty log message *** * * Revision 1.4 1993/09/21 17:16:04 yua * clganing up * * Revision 1.3 1993/09/14 13:13:30 yuan * additional test functions -cfr & -cfw added to test cfread and cfwrite. * * Revision 1.2 1993/09/09 17:46:08 yuan * malloc problem with long paths removed. * make sure that 'libname' is not a flag. * * Revision 1.1 1993/09/08 16:15:42 yuan * Initial revision * * */ #pragma off (unreferenced) static char rcsid[] = "$Id: pslib.c 1.18 1994/02/15 12:53:20 john Exp $"; #pragma on (unreferenced) #include #include #include #include #include #include #include #include #include #include "library.h" #include "parsarg.h" #include "mem.h" void print_usage ( void ) { printf(" Usage: PSLIB [] \n"); printf(" options :\n"); printf(" -a : add to \n"); printf(" -c : turn compression flag on\n"); printf(" -l : list all files in \n"); printf(" -x : test extraction function\n"); printf(" -lr : test library read function\n"); printf(" -cfr : test cfreadfile function\n"); printf(" -cfw : test cfwrite function\n"); printf("\n (for -cfr & -cfw, no should be specified)\n"); exit(0); } void datetime( char *filename, ushort *date_ptr, ushort *time_ptr ) { int handle; ushort date, time; if( _dos_open( filename, O_RDONLY, &handle ) != 0 ) printf( " Unable to`open '%s' for date & time check\n", filename ); else { _dos_getftime( handle, &date, &time ); _dos_close( handle ); *date_ptr = date; *time_ptr = time; } } void list_files( void ) { char header_buf[5]; short numfiles; static char *methods[] = { "Stored", " LZW " }; int i; int total_length, total_size, total_ratio; printf(" Listing files in %s.\n\n", lib_name); InputLibFile = fopen( lib_name, "rb" ); if (InputLibFile == NULL) { fprintf( stderr, " PSLIB : %s file not found\n", lib_name ); return; } for (i=0;i<5;i++) header_buf[i]=0; for (i=0;i<4;i++) header_buf[i] = (char) getc( InputLibFile ); if (strcmp(header_buf, "PSLB")) { fprintf( stderr, " PSLIB : %s is not a PSLB file.\n", lib_name ); fclose( InputLibFile ); } else { //numfiles = (short) getc( InputLibFile ); fread( &numfiles, sizeof(short),1, InputLibFile ); total_length = total_size = 0; printf( " Original\n"); printf( "Filename Length Size Ratio Method Date & Time\n"); printf( "---------------------------------------------------------------------------\n"); for (i=0;i '%s' successful!\n", input, output); } void extract_test( char *extractname, char *extractout ) { ubyte *buffer; printf("Extracting %s from %s\n", extractname, lib_name); buffer = extract ( lib_name, extractname ); if (buffer != NULL) { if (WriteFile( extractout, buffer, Header.original_size )) printf("WriteFile Error\n"); free ( buffer ); } else printf(" %s not found in library or local directory\n", extractname ); return; } void lib_read_test( char *extractname, char *extractout ) { ubyte *buffer; int length; lib_init( lib_name); buffer = ReadFile ( extractname, &length ); if (buffer == NULL) printf(" %s not found in library or local directory\n", extractname ); else { printf(" %s found! and extracted.\n", extractname); if (WriteFile(extractout, buffer, length )) printf("WriteFile Error\n"); free ( buffer ); } lib_close(); return; } void process_arg( char *argv ) { char filename[13], ext[_MAX_EXT]; unsigned char *input; unsigned char *output; file_header Header; int length, i; _splitpath ( argv, NULL, NULL, &filename, &ext ); strcat( filename, ext ); if ( strcmp( argv, lib_name ) ) // Don't want to write library twice. { if (!strcmp( argv, "-c")) { printf("*** Compression Flag enabled.\n"); c_flag = LF_LZW; return; } if (!strcmp( argv, "-a")) { printf("*** Building Library.\n"); init_library ( lib_name, headers ); b_flag = BUILDING; return; } else if ( *argv == '-' ) { fprintf(stderr, " PSLIB : Invalid Flag %s\n", argv ); return; } for (i=0;i0) { strcpy ( Header.name, filename ); MALLOC(FileList[file_count], char, 13); strcpy ( FileList[file_count++], filename ); if (file_count >= MAX_FILES-1) { printf("\n ERROR: MAX_FILES exceeded by file_count\n", file_count); for (i=0;i= 0) { printf( "%d%%\n", Header.ratio ); if (AppendFile( lib_name, output, Header.length)) printf("AppendFile Error\n"); } else { Header.length = length; Header.ratio = 0; printf("\n Compression ratio sucked! Storing uncompressed...\n"); Header.compression = 0; if (AppendFile( lib_name, input, length )) printf("AppendFile Error\n"); } write_file_header( lib_name, Header ); if ( input != NULL ) free( input ); if ( output != NULL ) free( output ); } else { printf("*** Storing %s (uncompressed) in Library %s\n", filename, lib_name ); Header.offset = file_size ( lib_name ); Header.length = length; Header.original_size = length; Header.ratio = 0; write_file_header( lib_name, Header ); if (AppendFile( lib_name, input, length )) printf("AppendFile Error\n"); if ( input != NULL ) free( input ); //if ( output != NULL ) free( output ); } } } } } void main( int argc, char *argv[] ) { int i; printf( "\nPSLIB 1.0 - " ); printf( "Parallax Software Library Generation Tool.\n\n"); if ( !strcmp( argv[1], "-cfr" ) ) { if (argc < 4) { printf(" Usage: PSLIB -cfr \n"); exit(1); } else cfr_test( argv[2], argv[3] ); exit(0); } if ( !strcmp( argv[1], "-cfw" ) ) { if (argc < 4) { printf(" Usage: PSLIB -cfw `\n"); exit(1); } else cfw_test( argv[2], argv[3] ); exit(0); } if ( argc < 3 ) { print_usage(); } file_count = 0; i=1; MALLOC(lib_name, char, 128); while (*argv[i] == '-') i++; strcpy( lib_name, argv[i] ); strupr ( lib_name ); if ( !strcmp( argv[2], "-lr" ) ) { if (argc < 5) { printf(" Usage: PSLIB -lr \n"); free(lib_name); exit(1); } else lib_read_test( argv[3], argv[4] ); } else if ( !strcmp( argv[2], "-x" ) ) { if (argc < 5) { printf(" Usage: PSLIB -x \n"); free(lib_name); exit(1); } else extract_test( argv[3], argv[4] ); } else { headers = 0; parse_args( argc-1, argv+1, check_list, 0 ); if (l_flag == LISTING) list_files(); else { parse_args( argc-1, argv+1, header_count, PA_EXPAND ); if (headers<2) { free(lib_name); print_usage(); } parse_args( argc-1, argv+1, process_arg, PA_EXPAND ); } if (b_flag == BUILDING) { OutputLibFile = fopen( lib_name, "r+b" ); if (!fseek( OutputLibFile, 4L, SEEK_SET ) ) { short temp; temp = file_count; //fputc( file_count, OutputLibFile ); fwrite( &temp, sizeof(short), 1, OutputLibFile ); printf( "\nFile Count : %d\n", file_count); for (i=0;i