summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--inc/demo.h32
-rw-r--r--src/demo.c121
-rw-r--r--src/main.c52
3 files changed, 134 insertions, 71 deletions
diff --git a/inc/demo.h b/inc/demo.h
index 82c6461..d06cf1d 100644
--- a/inc/demo.h
+++ b/inc/demo.h
@@ -97,10 +97,10 @@ typedef struct
typedef struct
{
- demoheader *header;
- demotimeline *timeline;
- demomap *map;
- demodata *data;
+ demoheader header;
+ demotimeline timeline;
+ demomap map;
+ demodata data;
} demo;
/* Read demo header from demofile into given demoheader */
@@ -122,19 +122,21 @@ int readdemomap(FILE *demofile, demomap *map, int mapsize, unsigned char version
/* Will allocate memory if chunk is snap, delta or message */
int readdemochunk(FILE *demofile, demochunk *chunk, unsigned char version);
-int readdemochunks(FILE *fp, demodata *dd, unsigned char ver);
+/* Reads all chunks from demofile */
+/* Returns a positive number on success, negative on error */
+/* Will allocate the needed memory for data */
+int readdemochunks(FILE *demofile, demodata *data, unsigned char version);
-int writedemoheader(FILE *outfile, demoheader *header);
-int writedemotimeline(FILE *outfile, demotimeline *timeline);
-int writedemomap(FILE *outfile, demomap *map, int mapsize, unsigned char version);
+/* Reads a demo file from demofile */
+/* Returns a positive number on success, negative on error */
+/* Allocates memory needed in demo map and data */
+int readdemo(FILE *demofile, demo *demo);
-int writedemotick(FILE *outfile, demotick *tick, unsigned char version);
-int writedemosnap(FILE *outfile, demosnap *snap, unsigned char version);
-int writedemomessage(FILE *outfile, demomessage *message, unsigned char ver);
-int writedemodelta(FILE *outfile, demodelta *delta, unsigned char ver);
+/* Writes given demo file to outfile */
+/* Returns a positive number on success, negative on error */
+int writedemo(FILE *outfile, demo *demo);
-void printdemoheader(demoheader *header);
-void printdemotick(demotick *tick);
-void printdemosnap(demosnap *snap);
+/* Prints given demo file */
+void printdemo(demo *demo);
#endif // DEMO_H
diff --git a/src/demo.c b/src/demo.c
index 914674b..fdf9e6e 100644
--- a/src/demo.c
+++ b/src/demo.c
@@ -243,7 +243,6 @@ int readdemochunk(FILE *fp, demochunk *chunk, unsigned char ver)
}
else if (type == DEMOMESSAGE)
{
- printf("MESSAGE={");
demomessage *message = (demomessage *)malloc(sizeof(demomessage));
readdemomessage(fp, message, size);
chunk->type = DEMOMESSAGE;
@@ -251,7 +250,6 @@ int readdemochunk(FILE *fp, demochunk *chunk, unsigned char ver)
}
else if (type == DEMODELTA)
{
- printf("SNAPSHOT_DELTA={");
demodelta *delta = (demodelta *)malloc(sizeof(demodelta));
readdemodelta(fp, delta, size);
chunk->type = DEMODELTA;
@@ -261,8 +259,6 @@ int readdemochunk(FILE *fp, demochunk *chunk, unsigned char ver)
{
printf("[ ERROR ] unknown chunk type!\n");
}
-
- printf("size: %d}\n", size);
}
return 1;
}
@@ -283,12 +279,27 @@ int readdemochunks(FILE *fp, demodata *dd, unsigned char ver)
}
}
- printf("numchunks: %d\n", dd->numchunks);
dd->chunks = (demochunk *)realloc(dd->chunks, dd->numchunks * sizeof(demochunk));
return 1;
}
+int readdemo(FILE *fp, demo *demo)
+{
+ if (readdemoheader(fp, &demo->header) <= 0)
+ return -1;
+
+ if (readdemotimeline(fp, &demo->timeline) <= 0)
+ return -2;
+
+ if (readdemomap(fp, &demo->map, demo->header.mapsize, demo->header.version) <= 0)
+ return -3;
+
+ readdemochunks(fp, &demo->data, demo->header.version);
+
+ return 1;
+}
+
int writedemoheader(FILE *fp, demoheader *dh)
{
unsigned char intbuff[4];
@@ -403,7 +414,7 @@ int writedemotick(FILE *fp, demotick *tick, unsigned char ver)
return 1;
}
-int writedemosnap(FILE *fp, demosnap *snap, unsigned char ver)
+int writedemosnap(FILE *fp, demosnap *snap)
{
char compressed[64 * 1024];
char decompressed[64 * 1024];
@@ -427,7 +438,6 @@ int writedemosnap(FILE *fp, demosnap *snap, unsigned char ver)
int size = cp - decompressed;
int datasize = compresshuff(decompressed, size, compressed, 64 * 1024);
- // datasize = ((datasize + 3) / 4) * 4;
writedemochunkheader(fp, DEMOSNAP, datasize);
fwrite(compressed, 1, datasize, fp);
@@ -435,7 +445,7 @@ int writedemosnap(FILE *fp, demosnap *snap, unsigned char ver)
return 1;
}
-int writedemomessage(FILE *fp, demomessage *message, unsigned char ver)
+int writedemomessage(FILE *fp, demomessage *message)
{
writedemochunkheader(fp, DEMOMESSAGE, message->datasize);
fwrite(message->data, 1, message->datasize, fp);
@@ -443,7 +453,7 @@ int writedemomessage(FILE *fp, demomessage *message, unsigned char ver)
return 1;
}
-int writedemodelta(FILE *fp, demodelta *delta, unsigned char ver)
+int writedemodelta(FILE *fp, demodelta *delta)
{
writedemochunkheader(fp, DEMODELTA, delta->datasize);
fwrite(delta->data, 1, delta->datasize, fp);
@@ -451,6 +461,45 @@ int writedemodelta(FILE *fp, demodelta *delta, unsigned char ver)
return 1;
}
+int writedemo(FILE *fp, demo *demo)
+{
+ if (writedemoheader(fp, &demo->header) <= 0)
+ return -1;
+
+ if (writedemotimeline(fp, &demo->timeline) <= 0)
+ return -2;
+
+ if (writedemomap(fp, &demo->map, demo->header.mapsize, demo->header.version) <= 0)
+ return -3;
+
+ for (int i = 0; i < demo->data.numchunks; i++)
+ {
+ demochunk *chunk = &demo->data.chunks[i];
+ switch (chunk->type)
+ {
+ case DEMOTICK:
+ writedemotick(fp, chunk->data.tick, demo->header.version);
+ break;
+ case DEMOSNAP:
+ writedemosnap(fp, chunk->data.snap);
+ break;
+ case DEMOMESSAGE:
+ writedemomessage(fp, chunk->data.message);
+ break;
+ case DEMODELTA:
+ writedemodelta(fp, chunk->data.delta);
+ break;
+ default:
+ printf("UNKNOWN CHUNK\n");
+ break;
+ }
+ }
+
+ return 1;
+}
+
+/* printers */
+
void printdemoheader(demoheader *header)
{
if (header->version == 6)
@@ -477,7 +526,7 @@ void printdemosnap(demosnap *snap)
{
printf("SNAPSHOT={datasize: %d, numitems: %d,\n offsets: [ ", snap->datasize, snap->numitems);
for (int i = 0; i < snap->numitems; i++)
- printf("%d, ", snap->offsets[i]);
+ printf("%d%s ", snap->offsets[i], (i != snap->numitems - 1) ? "," : "");
printf("],\n items: [\n");
for (int i = 0; i < snap->numitems; i++)
@@ -489,3 +538,55 @@ void printdemosnap(demosnap *snap)
}
printf("]}\n");
}
+
+void printdemomessage(demomessage *message)
+{
+ printf("MESSAGE={datasize: %d}\n", message->datasize);
+}
+
+void printdemodelta(demodelta *delta)
+{
+ printf("DELTA={datasize: %d}\n", delta->datasize);
+}
+
+void printdemo(demo *demo)
+{
+ printdemoheader(&demo->header);
+ printf("numchunks: %d\n\n", demo->data.numchunks);
+
+ int typecount[4] = {0, 0, 0, 0};
+ for (int i = 0; i < demo->data.numchunks; i++)
+ {
+ demochunk *chunk = &demo->data.chunks[i];
+ switch (chunk->type)
+ {
+ case DEMOTICK:
+ printdemotick(chunk->data.tick);
+ typecount[(int)DEMOTICK]++;
+ break;
+ case DEMOSNAP:
+ printdemosnap(chunk->data.snap);
+ typecount[(int)DEMOSNAP]++;
+ break;
+ case DEMOMESSAGE:
+ printdemomessage(chunk->data.message);
+ typecount[(int)DEMOMESSAGE]++;
+ break;
+ case DEMODELTA:
+ printdemodelta(chunk->data.delta);
+ typecount[(int)DEMODELTA]++;
+ break;
+ default:
+ printf("UNKNOWN CHUNK\n");
+ break;
+ }
+ }
+
+ printf("\nchunks: %d\n", demo->data.numchunks);
+ printf("chunk counts: [\n");
+ printf(" ticks: %d\n", typecount[0]);
+ printf(" snaps: %d\n", typecount[1]);
+ printf(" messages: %d\n", typecount[2]);
+ printf(" deltas: %d\n", typecount[3]);
+ printf("]\n");
+}
diff --git a/src/main.c b/src/main.c
index d419575..8c74b73 100644
--- a/src/main.c
+++ b/src/main.c
@@ -117,57 +117,17 @@ int main()
FILE *fp = fopen("data/test.demo", "r");
FILE *op = fopen("data/out.demo", "w");
- demoheader dh;
- demotimeline dt;
- demomap dm;
- demodata dd;
+ demo d;
- readdemoheader(fp, &dh);
- readdemotimeline(fp, &dt);
- readdemomap(fp, &dm, dh.mapsize, dh.version);
-
- writedemoheader(op, &dh);
- writedemotimeline(op, &dt);
- writedemomap(op, &dm, dh.mapsize, dh.version);
-
- readdemochunks(fp, &dd, dh.version);
-
- for (int i = 0; i < dd.numchunks; i++)
- {
- if (dd.chunks[i].type == DEMOTICK)
- {
- printdemotick(dd.chunks[i].data.tick);
- writedemotick(op, dd.chunks[i].data.tick, dh.version);
- }
- else if (dd.chunks[i].type == DEMOSNAP)
- {
- printdemosnap(dd.chunks[i].data.snap);
- demosnap *snap = dd.chunks[i].data.snap;
- for (int y = 0; y < snap->numitems; y++)
- {
- demosnapitem *item = &snap->items[y];
- if (item->type == 11 && item->id == 9)
- {
- char newname[16] = ">>Hextcjd!\0";
-
- strtoint(newname, 16, item->data);
- }
- }
- writedemosnap(op, dd.chunks[i].data.snap, dh.version);
- }
- else if (dd.chunks[i].type == DEMOMESSAGE)
- {
- writedemomessage(op, dd.chunks[i].data.message, dh.version);
- }
- else if (dd.chunks[i].type == DEMODELTA)
- {
- writedemodelta(op, dd.chunks[i].data.delta, dh.version);
- }
- }
+ readdemo(fp, &d);
+ printdemo(&d);
+ writedemo(op, &d);
fclose(fp);
fclose(op);
+ exit(EXIT_SUCCESS);
+
// Testing
/*
inithuff(NULL);