123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152 |
- #include <stdlib.h>
- #include <string.h>
- #include <stdio.h>
- #include <stdarg.h>
- #include <dos.h>
- #include <io.h>
- #include <fcntl.h>
- #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);
- }
|