/**************************************************************************
*  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 <stdio.h>
#include <string.h>
#include <ctype.h>
#include <time.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();
	}
}

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], "r")))
	{
		printf("Could not open the builders file.\n\r");
		exit();
	}

	if (!(fl_m2 = fopen(argv[2], "r")))
	{
		printf("Could not open 'old' file.\n\r");
		exit();
	}

	merge(fl_m1, fl_m2);

	fclose(fl_m1);
	fclose(fl_m2);
}