#include <stdio.h> #include <unistd.h> #define BLOCK_SIZE 1024 #define DBREF_TOKEN '#' #define BEGIN_MOVE "***Property list start ***" #define END_MOVE "***Property list end ***\n" void main(int argc, char **argv) { FILE *map, *data, *in, *out; long tmp[2]; long newdbref; int state = 0; int linecount; long backtrack = 0; long backtmp; char buf[16384]; if (argc != 3) { fprintf(stderr, "Usage: convert <infile> <outfile>\n"); exit(1); } #define CHECKFILE(x) if ((x) == NULL) \ { fprintf(stderr, "Trouble opening %s\n", buf); \ exit(1);} sprintf(buf, "%s", argv[2]); out = fopen(buf, "w+"); CHECKFILE(out); sprintf(buf, "%s.map", argv[2]); map = fopen(buf, "w+"); CHECKFILE(map); sprintf(buf, "%s.dat", argv[2]); data = fopen(buf, "w+"); CHECKFILE(data); sprintf(buf, "%s", argv[1]); in = fopen(buf, "r"); CHECKFILE(in); tmp[0] = -1; tmp[1] = -1; fwrite((void *) tmp, sizeof(long), 2, map); fprintf(data, "--- Doran dbp file ---\n"); while (fgets(buf, sizeof(buf), in) != NULL) switch(state) { case 0: fprintf(out, "%s", buf); if(strncmp(buf, BEGIN_MOVE, strlen(BEGIN_MOVE)) == 0) { tmp[1] = ftell(data); fprintf(data, "%s - %ld\n", BEGIN_MOVE, tmp[0]); backtrack = ftell(map); fwrite((void *) tmp, sizeof(long), 2, map); state = 1; linecount = 0; } if(buf[0] == DBREF_TOKEN) { newdbref = atol(&(buf[1])); if ((tmp[0] + 1) == newdbref) tmp[0] = newdbref; } break; case 1: if (strcmp(buf, END_MOVE) == 0) { state = 0; fprintf(out, "%s", buf); fprintf(data, "%s", END_MOVE); if (linecount == 0) { fseek(data, tmp[1], SEEK_SET); backtmp = tmp[0]; tmp[0] = -1L; tmp[1] = 0L; fseek(map, backtrack, SEEK_SET); fwrite((void *) tmp, sizeof(long), 2, map); tmp[0] = backtmp; } } else { fprintf(data, "%s", buf); linecount++; } break; default: fprintf(stderr, "Bleugh!\n"); exit(1); } fclose(map); fclose(data); fclose(out); fclose(in); }