#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); }