/************************************************************************** * File: insert_any.c Part of DikuMud * * Usage: Merges DikuMud wld/obj/mob/zon files * * Copyright (C) 1990, 1991 - see 'license.doc' for complete information. * ***************************************************************************/ #include "os.h" #define MAX_LINE 256 /************************************************************************* * Merge routines * *********************************************************************** */ void assume (int faktisk, int antal, int place, char *errmsg) { if (antal != faktisk) { printf ("Error has occured at #%d.\n\r", place); printf ("Message is : %s\n\r", errmsg); printf ("Actual number read is %d\n\r", faktisk); exit (1); } } void merge (FILE * fl1, FILE * fl2) { int antal; int eof1, eof2; int num1, num2; char buf1[MAX_LINE], buf2[MAX_LINE]; char tbuf1[MAX_LINE], tbuf2[MAX_LINE]; eof1 = 0; eof2 = 0; FGETS (buf1, MAX_LINE, fl1); antal = sscanf (buf1, " #%d ", &num1); assume (antal, 1, 0, "No #xxxx found next (old)"); FGETS (buf2, MAX_LINE, fl2); antal = sscanf (buf2, " #%d ", &num2); assume (antal, 1, 0, "No #xxxx found next (new)"); FGETS (buf1, MAX_LINE, fl1); eof1 = (buf1[0] == '$'); FGETS (buf2, MAX_LINE, fl2); eof2 = (buf2[0] == '$'); for (;;) { if (eof1) { /* Purge file 2 */ printf ("#%d\n", num2); printf ("%s", buf2); while (FGETS (buf2, MAX_LINE, fl2)) printf ("%s", buf2); return; } if (eof2) { /* Purge file 1 */ printf ("#%d\n", num1); printf ("%s", buf1); while (FGETS (buf1, MAX_LINE, fl1)) printf ("%s", buf1); return; } /* Merge the rooms */ if (num1 < num2) { printf ("#%d\n", num1); printf ("%s", buf1); do { FGETS (buf1, MAX_LINE, fl1); antal = sscanf (buf1, " #%d ", &num1); if (antal != 1) printf ("%s", buf1); } while (antal != 1); FGETS (buf1, MAX_LINE, fl1); eof1 = (buf1[0] == '$'); } else if (num1 == num2) { /* Replace the room */ printf ("#%d\n", num1); printf ("%s", buf1); do { /* Print from "new" file */ FGETS (buf1, MAX_LINE, fl1); antal = sscanf (buf1, " #%d ", &num1); if (antal != 1) printf ("%s", buf1); } while (antal != 1); do { /* Skip the "old" file */ FGETS (buf2, MAX_LINE, fl2); antal = sscanf (buf2, " #%d ", &num2); } while (antal != 1); FGETS (buf1, MAX_LINE, fl1); eof1 = (buf1[0] == '$'); FGETS (buf2, MAX_LINE, fl2); eof2 = (buf2[0] == '$'); } else { /* Print a room from "old" file */ printf ("#%d\n", num2); printf ("%s", buf2); do { FGETS (buf2, MAX_LINE, fl2); antal = sscanf (buf2, " #%d ", &num2); if (antal != 1) printf ("%s", buf2); } while (antal != 1); FGETS (buf2, MAX_LINE, fl2); eof2 = (buf2[0] == '$'); } } } int main (int argc, char *argv[]) { FILE *fl_m1, *fl_m2; if (argc != 3) { printf ("Usage : insert_any <New Merge File> <Old Merge File>\n\r"); printf ("Both files must use # numbering system, and terminate with $~\n\r"); exit (0); } if (!(fl_m1 = fopen (argv[1], "rb"))) { printf ("Could not open the builders file.\n\r"); exit (1); } if (!(fl_m2 = fopen (argv[2], "rb"))) { printf ("Could not open 'old' file.\n\r"); exit (1); } merge (fl_m1, fl_m2); fclose (fl_m1); fclose (fl_m2); return 0; }