#include #include #include #include #include #include #include #include "typedefs.h" #include "getopt.h" #include "misc.h" struct FNODE { FNODE *next; char name[1]; }; FNODE head = { &head, "" }; FNODE *tail = &head; ulong gMapCRC; void ShowUsage(void) { printf("Usage:\n"); printf(" FIXCRC map1 map2 (wild cards ok)\n"); exit(0); } void QuitMessage(char * fmt, ...) { char msg[80]; va_list argptr; va_start( argptr, fmt ); vsprintf( msg, fmt, argptr ); va_end(argptr); printf(msg); exit(1); } void ProcessFile(char *filename) { int hFile; int length; char *buffer; printf("%s: ", filename); hFile = open(filename, O_RDONLY | O_BINARY); length = filelength(hFile); buffer = (char *)malloc(length); read(hFile, buffer, length); close(hFile); gMapCRC = CRC32(buffer, length - sizeof(gMapCRC)); hFile = open(filename, O_CREAT | O_TRUNC | O_WRONLY | O_BINARY, S_IWUSR); write(hFile, buffer, length - sizeof(gMapCRC)); write(hFile, &gMapCRC, sizeof(gMapCRC)); close(hFile); free(buffer); printf("CRC fixed.\n"); } void InsertFilename( char *fname ) { FNODE *n = (FNODE *)malloc(sizeof(FNODE) + strlen(fname)); strcpy(n->name, fname); // insert the node at the tail, so it stays in order n->next = tail->next; tail->next = n; tail = n; } void ProcessArgument(char *s) { char filespec[_MAX_PATH]; char buffer[_MAX_PATH2]; char path[_MAX_PATH]; strcpy(filespec, s); ChangeExtension(filespec, ".MAP"); char *drive, *dir; // separate the path from the filespec _splitpath2(s, buffer, &drive, &dir, NULL, NULL); _makepath(path, drive, dir, NULL, NULL); struct find_t fileinfo; unsigned r = _dos_findfirst(s, _A_NORMAL, &fileinfo); if (r != 0) printf("%s not found\n", s); while ( r == 0 ) { strcpy(filespec, path); strcat(filespec, fileinfo.name); InsertFilename(filespec); r = _dos_findnext( &fileinfo ); } _dos_findclose(&fileinfo); } /*********************************************************************** * Process command line arguments **********************************************************************/ void ParseOptions( int argc, char *argv[]) { int c; while ( (c = GetOptions(argc, argv, "")) != GO_EOF ) { switch (c) { case GO_INVALID: QuitMessage("Invalid argument: %s", OptArgument); case GO_FULL: ProcessArgument(OptArgument); break; } } } void main(int argc, char *argv[]) { printf("Map CRC Correction Tool Copyright (c) 1995 Q Studios Corporation\n"); if (argc < 2) ShowUsage(); ParseOptions(argc, argv); // process the file list for (FNODE *n = head.next; n != &head; n = n->next) ProcessFile(n->name); }