void pack_directory( char * filespec) { int find_handle; _finddata_t find; char tmp[512]; char tmp1[512]; /* char dir_name[512]; char *last_slash; last_slash = strrchr(filespec, '\\'); if ( last_slash ) { strcpy(dir_name, last_slash+1); } else { strcpy(dir_name, filespec); } if ( !stricmp(dir_name, "voice") ) { return; } */ strcpy( tmp1, filespec ); add_directory(filespec); strcat( tmp1, "\\*.*" ); printf( "In dir '%s'\n", tmp1 ); find_handle = _findfirst( tmp1, &find ); if( find_handle != -1 ) { if ( find.attrib & _A_SUBDIR ) { if (strcmp( "..", find.name) && strcmp( ".", find.name)) { strcpy( tmp, filespec ); strcat( tmp, "\\" ); strcat( tmp, find.name ); pack_directory(tmp); } } else { pack_file( filespec, find.name, find.size, find.time_write ); } while( !_findnext( find_handle, &find ) ) { if ( find.attrib & _A_SUBDIR ) { if (strcmp( "..", find.name) && strcmp( ".", find.name)) { strcpy( tmp, filespec ); strcat( tmp, "\\" ); strcat( tmp, find.name ); pack_directory(tmp); } } else { pack_file( filespec, find.name, find.size, find.time_write ); } } } add_directory(".."); }
int main(int argc, char *argv[] ) { char archive[1024]; char *p; if ( argc < 3 ) { printf( "Usage: %s archive_name src_dir\n", argv[0] ); printf( "Example: %s imperialalliance c:\\imperialalliance\\data\n", argv[0] ); printf( "Creates an archive named imperialalliance out of the\nimperialalliance data tree\n" ); printf( "Press any key to exit...\n" ); getch(); return 1; } strcpy( archive, argv[1] ); p = strchr( archive, '.' ); if (p) *p = 0; // remove extension strcpy( archive_dat, archive ); strcat( archive_dat, ".eh" ); strcpy( archive_hdr, archive ); strcat( archive_hdr, ".hdr" ); fp_out = fopen( archive_dat, "wb" ); if ( !fp_out ) { printf( "out1: Couldn't open '%s'!\n", archive_dat ); printf( "Press any key to exit...\n" ); getch(); return 1; } fp_out_hdr = fopen( archive_hdr, "wb" ); if ( !fp_out_hdr ) { printf( "out2: Couldn't open '%s'!\n", archive_hdr ); printf( "Press any key to exit...\n" ); getch(); return 1; } write_header(); pack_directory( argv[2] ); write_header(); fclose(fp_out); fclose(fp_out_hdr); printf( "Data files written, appending index...\n" ); if (!write_index(archive_hdr, archive_dat)) { printf("Error appending index!\n"); printf("Press any key to exit...\n"); getch(); return 1; } printf( "%d total KB.\n", Total_size/1024 ); return 0; }
int main(int argc, char *argv[] ) { char archive[1024]; char *p; if ( argc < 3 ) { #ifndef PLAT_UNIX printf( "Usage: %s archive_name src_dir\n", argv[0] ); printf( "Example: %s freespace c:\\freespace\\data\n", argv[0] ); printf( "Creates an archive named freespace out of the\nfreespace data tree\n" ); printf( "Press any key to exit...\n" ); getch(); return 1; #else print_instructions(); #endif } strcpy( archive, argv[1] ); p = strchr( archive, '.' ); if (p) *p = 0; // remove extension strcpy( archive_dat, archive ); strcat( archive_dat, ".vp" ); strcpy( archive_hdr, archive ); strcat( archive_hdr, ".hdr" ); fp_out = fopen( archive_dat, "wb" ); if ( !fp_out ) { printf( "Couldn't open '%s'!\n", archive_dat ); #ifndef PLAT_UNIX printf( "Press any key to exit...\n" ); getch(); return 1; #else exit(1); #endif } fp_out_hdr = fopen( archive_hdr, "wb" ); if ( !fp_out_hdr ) { printf( "Couldn't open '%s'!\n", archive_hdr ); #ifndef PLAT_UNIX printf( "Press any key to exit...\n" ); getch(); return 1; #else exit(2); #endif } if ( verify_directory( argv[2] ) != 0 ) { printf("Warning! Last directory must be named \"data\" (not case sensitive)\n"); exit(3); } write_header(); pack_directory( argv[2] ); // in case the directory doesn't exist if ( no_dir ) exit(4); write_header(); fclose(fp_out); fclose(fp_out_hdr); printf( "Data files written, appending index...\n" ); if (!write_index(archive_hdr, archive_dat)) { printf("Error appending index!\n"); #ifndef PLAT_UNIX printf("Press any key to exit...\n"); getch(); #endif return 1; } printf( "%d total KB.\n", Total_size/1024 ); return 0; }
// This function adds a directory marker to the header file void add_directory( char * dirname) { char path[256]; char *pathptr = path; char *tmpptr; strcpy(path, dirname); fwrite(&Total_size, 1, 4, fp_out_hdr); int i = 0; fwrite(&i, 1, 4, fp_out_hdr); // strip out any directories that this dir is a subdir of #ifndef PLAT_UNIX while ((tmpptr = strchr(pathptr, '\\')) != NULL) { #else while ((tmpptr = strchr(pathptr, '/')) != NULL) { #endif pathptr = tmpptr+1; } fwrite(pathptr, 1, 32, fp_out_hdr); fwrite(&i, 1, 4, fp_out_hdr); // timestamp = 0 Num_files++; } void pack_directory( char * filespec) { #ifndef PLAT_UNIX int find_handle; _finddata_t find; #endif char tmp[512]; char tmp1[512]; /* char dir_name[512]; char *last_slash; last_slash = strrchr(filespec, '\\'); if ( last_slash ) { strcpy(dir_name, last_slash+1); } else { strcpy(dir_name, filespec); } if ( !stricmp(dir_name, "voice") ) { return; } */ #ifdef PLAT_UNIX char *ts; // strip trailing '/' ts = filespec+(strlen(filespec)-1); while(*ts == '/' && ts > filespec) *ts = '\0'; strcpy( tmp1, filespec ); add_directory(filespec); strcat( tmp1, "/*.*" ); #else strcpy( tmp1, filespec ); add_directory(filespec); strcat( tmp1, "\\*.*" ); #endif printf( "In dir '%s'\n", tmp1 ); #ifndef PLAT_UNIX find_handle = _findfirst( tmp1, &find ); if( find_handle != -1 ) { if ( find.attrib & _A_SUBDIR ) { if (strcmp( "..", find.name) && strcmp( ".", find.name)) { strcpy( tmp, filespec ); strcat( tmp, "\\" ); strcat( tmp, find.name ); pack_directory(tmp); } } else { pack_file( filespec, find.name, find.size, (fs_time_t)find.time_write ); } while( !_findnext( find_handle, &find ) ) { if ( find.attrib & _A_SUBDIR ) { if (strcmp( "..", find.name) && strcmp( ".", find.name)) { strcpy( tmp, filespec ); strcat( tmp, "\\" ); strcat( tmp, find.name ); pack_directory(tmp); } } else { pack_file( filespec, find.name, find.size, find.time_write ); } } } #else DIR *dirp; struct dirent *dir; dirp = opendir (filespec); if ( dirp ) { while ((dir = readdir(dirp)) != NULL) { char fn[MAX_PATH]; snprintf(fn, MAX_PATH-1, "%s/%s", filespec, dir->d_name); fn[MAX_PATH-1] = 0; struct stat buf; if (stat(fn, &buf) == -1) { continue; } if ( (strcmp(dir->d_name, ".") == 0) || (strcmp(dir->d_name, "..") == 0) ) { continue; } if (S_ISDIR(buf.st_mode)) { strcpy( tmp, filespec ); strcat( tmp, "/" ); strcat( tmp, dir->d_name ); pack_directory(tmp); } else { pack_file( filespec, dir->d_name, buf.st_size, buf.st_mtime ); } } closedir(dirp); } else { printf("Error: Source directory does not exist!\n"); no_dir = 1; } #endif add_directory(".."); }