dmuck0.15-beta/docs/muf/
dmuck0.15-beta/game/
dmuck0.15-beta/game/logs/
dmuck0.15-beta/game/muf/
dmuck0.15-beta/game/muf/text/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#define BEGIN_MOVE  "***Property list start *** - "
#define END_MOVE  "***Property list end ***"

#define SIZE 16384

typedef struct zone_S
{
	long id, start, end;
	struct zone_S *next;
} zone_T;

zone_T *head = NULL;

void add_zone(long id, long start, long end)
{
   zone_T *tmp;

	for (tmp = head; tmp; tmp = tmp->next)
	{
		if (!((tmp->start > end) || (tmp->end < start)))
		{
			fprintf(stderr, "Overlap error:\n");
         fprintf(stderr, " %6ld -> %6ld - %6ld\n", id, start,end);
         fprintf(stderr, " %6ld -> %6ld - %6ld\n", 
					  tmp->id, tmp->start, tmp->end);
		}
	}

	tmp = (zone_T *) malloc (sizeof(zone_T));
	tmp->id = id;
	tmp->start = start;
	tmp->end = end;
	tmp->next = head;
	head = tmp;
}

void add_zone2(long id, long start, long end)
{
   zone_T *tmp;

	for (tmp = head; tmp; tmp = tmp->next)
	{
		if (tmp->id == id)
		{
			tmp->start = start;
			tmp->end = end;
		   return;
		}
	}

	tmp = (zone_T *) malloc (sizeof(zone_T));
	tmp->id = id;
	tmp->start = start;
	tmp->end = end;
	tmp->next = head;
	head = tmp;
}

void check_zone2(void)
{
   zone_T *tmp, *ntmp;

	for (tmp = head; tmp; tmp = ntmp)
	{
		ntmp = tmp->next;

		if (tmp->end != -1L && tmp->start != tmp->end)
		{
			fprintf(stderr, "Map error:\n");
			fprintf(stderr, " %6ld -> %6ld : %6ld\n",
					  tmp->id, tmp->start, tmp->end);
		}
		free(tmp);
	}

   head = NULL;
}

void main(int argc, char **argv)
{
   FILE *imap, *omap, *idat, *odat;
   char buffer[SIZE];
   long tmp[2];
	long zid, zstart, zend;
	char *p;

#define CHECKFILE(x) if ((x) == NULL) \
                     { fprintf(stderr, "Trouble opening %s\n", buffer); \
                       exit(1); }

   sprintf(buffer, "%s.map", argv[1]);
   imap = fopen(buffer, "r+");
   CHECKFILE(imap);
   
   sprintf(buffer, "%s.map", argv[2]);
   omap = fopen(buffer, "w+");
   CHECKFILE(omap);
   
   sprintf(buffer, "%s.dat", argv[1]);
   idat = fopen(buffer, "r+");
   CHECKFILE(idat);
   
   sprintf(buffer, "%s.dat", argv[2]);
   odat = fopen(buffer, "w+");
   CHECKFILE(odat);
   fprintf(odat, "--- Doran dbp file ---\n");
   
	p = buffer;
	p += strlen(BEGIN_MOVE);

   /* map sanity checker */
	zid = -1L;

   while (fread(tmp, sizeof(long), 2, imap))
	{
		if (tmp[0] >= 0 && tmp[0] != zid)
		{
			fprintf(stderr, "Map index error:\n");
			fprintf(stderr, " %6ld -> %6ld\n", zid, tmp[0]);
		}
		zid ++;
	}

   /* first line sanity checker */
   fseek(idat, 0L, SEEK_SET);

	zstart = 0;

	while (fgets(buffer, SIZE, idat))
	{
		if (!strncmp(buffer, BEGIN_MOVE, strlen(BEGIN_MOVE)))
		{
			zid = atol (p);
			fseek(imap, (zid + 1) * sizeof(long) * 2, SEEK_SET);
         fread(tmp, sizeof(long), 2, imap);

			add_zone2(zid, zstart, tmp[1]);
		}
		zstart = ftell(idat);
	}

	check_zone2();

	fseek(imap, 0L, SEEK_SET);
	fseek(idat, 0L, SEEK_SET);

   while (fread(tmp, sizeof(long), 2, imap) == 2)
   {
      if (tmp[0] != -1L)
      {
         fseek(idat, tmp[1], SEEK_SET);

			zid = tmp[0];
			zstart = tmp[1];

         tmp[1] = ftell(odat);

         fwrite(tmp, sizeof(long), 2, omap);
			fflush(omap);

         /* if (tmp[0] == (ftell(imap) / sizeof(long) / 2 - 2)) */

         fgets(buffer, SIZE, idat);
         fprintf(odat, "%s", buffer);

			if (strncmp(buffer, BEGIN_MOVE, strlen(BEGIN_MOVE)) ||
			    (zid != atol(p)))
			{
				fprintf(stderr, "First line error:\n");
				fprintf(stderr, " %6ld -> %s", zid, buffer);
			}

         do
         {
            fgets(buffer, SIZE, idat);
            fprintf(odat, "%s", buffer);
         } while (strncmp(buffer, END_MOVE, strlen(END_MOVE)));   

			zend = ftell(idat) - 1;

			add_zone(zid, zstart, zend);
      }
      else
      {
			tmp[1] = -1L;
         fwrite(tmp, sizeof(long), 2, omap);
			fflush(omap);
      }
   }

   fclose(imap);
   fclose(omap);
   fclose(idat);
   fclose(odat);
}