From c39ca31ffb42414b26ded21aa5b904253c7c7edc Mon Sep 17 00:00:00 2001 From: johannes Date: Fri, 9 Feb 2024 16:01:33 +0100 Subject: added read demo and write demo functions --- src/demo.c | 121 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++----- src/main.c | 52 +++----------------------- 2 files changed, 117 insertions(+), 56 deletions(-) (limited to 'src') 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); -- cgit v1.2.3