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