From 26a7b9bbf466dd01b5449ed5819c3e90ac398a1d Mon Sep 17 00:00:00 2001 From: johannes Date: Tue, 6 Feb 2024 14:06:01 +0100 Subject: refactor readdemoheader --- inc/demo.h | 10 +++++----- src/demo.c | 44 +++++++++++++++++++++++++++++++------------- src/main.c | 6 +++--- 3 files changed, 39 insertions(+), 21 deletions(-) diff --git a/inc/demo.h b/inc/demo.h index 25c0070..efb3a23 100644 --- a/inc/demo.h +++ b/inc/demo.h @@ -9,7 +9,7 @@ typedef enum DEMOSNAP = 1, DEMOMESSAGE = 2, DEMODELTA = 3 -} demotype; +} demochunktype; /* demoheader struct */ typedef struct @@ -17,10 +17,10 @@ typedef struct unsigned char version; char netversion[64]; char mapname[64]; - unsigned char mapsize[4]; // Big endian int - unsigned char mapcrc[4]; // Big endian int + int mapsize; + int mapcrc; char type[8]; - unsigned char length[4]; // Big endian int + int length; char timestamp[20]; } demoheader; @@ -80,7 +80,7 @@ typedef union { /* demochunk struct */ typedef struct { - demotype type; + demochunktype type; chunkdata data; } demochunk; diff --git a/src/demo.c b/src/demo.c index a1343ed..155d67c 100644 --- a/src/demo.c +++ b/src/demo.c @@ -14,35 +14,53 @@ #define CHUNK_NORMAL_TYPE_MASK 0b01100000 #define CHUNK_NORMAL_SIZE_MASK 0b00011111 +const char headermagic[7] = "TWDEMO\0"; const unsigned char mapmagic[] = {0x6b, 0xe6, 0xda, 0x4a, 0xce, 0xbd, 0x38, 0x0c, 0x9b, 0x5b, 0x12, 0x89, 0xc8, 0x42, 0xd7, 0x80}; -// TODO make version sensitive int readdemoheader(FILE *fp, demoheader *dh) { - if (fscanf(fp, "TWDEMO%*c%c", &dh->version) != 1) + char magicbuff[sizeof(headermagic)]; + unsigned char intbuff[4]; + + fread(magicbuff, 1, sizeof(headermagic), fp); + if (strcmp(magicbuff, headermagic) != 0) return -1; - if (fscanf(fp, "%64c", dh->netversion) != 1) + + if (fread(&dh->version, 1, 1, fp) != 1) return -2; - if (fscanf(fp, "%64c", dh->mapname) != 1) + + if (fread(&dh->netversion, 1, 64, fp) != 64) return -3; - if (fread(dh->mapsize, 1, 4, fp) != 4) + + if (fread(&dh->mapname, 1, 64, fp) != 64) return -4; - if (fread(dh->mapcrc, 1, 4, fp) != 4) + + if (fread(intbuff, 1, 4, fp) != 4) return -5; - if (fscanf(fp, "%8c", dh->type) != 1) + dh->mapsize = reverseint(intbuff); + + if (fread(intbuff, 1, 4, fp) != 4) return -6; - if (fread(dh->length, 1, 4, fp) != 4) + dh->mapcrc = reverseint(intbuff); + + if (fread(dh->type, 1, 8, fp) != 8) return -7; - if (fscanf(fp, "%20c", dh->timestamp) != 1) + + if (fread(intbuff, 1, 4, fp) != 4) return -8; + dh->length = reverseint(intbuff); + + if (fread(dh->timestamp, 1, 20, fp) != 20) + return -9; + printf("version: %hhu\n", dh->version); printf("net_version: %s\n", dh->netversion); printf("mapname: %s\n", dh->mapname); - printf("mapsize: %i\n", reverseint(dh->mapsize)); - printf("mapcrc: %i\n", reverseint(dh->mapcrc)); + printf("mapsize: %d\n", dh->mapsize); + printf("mapcrc: %d\n", dh->mapcrc); printf("type: %s\n", dh->type); - printf("length: %i\n", reverseint(dh->length)); + printf("length: %d\n", dh->length); printf("timestamp: %s\n", dh->timestamp); return 1; } @@ -203,7 +221,7 @@ int readdemochunk(FILE *fp, demochunk *chunk, unsigned char ver) printf("%d, ", snap->items[i].data[y]); printf("} "); } - printf("]\n"); + printf("], "); } else { diff --git a/src/main.c b/src/main.c index e9b5d6c..758504b 100644 --- a/src/main.c +++ b/src/main.c @@ -123,18 +123,18 @@ int main() int ret = readdemoheader(fp, &dh); - dm.data = (unsigned char *)malloc(reverseint(dh.mapsize)); + dm.data = (unsigned char *)malloc(dh.mapsize); printf("\nheader: %i\n", ret); if (dh.version >= 4) ret = readdemotimeline(fp, &dt); - printf("\ntimeline: %i\n", ret); + printf("timeline: %i\n", ret); // TODO should be able to read 5 aswell, change readdemomap to fit if (dh.version >= 6) - ret = readdemomap(fp, &dm, reverseint(dh.mapsize)); + ret = readdemomap(fp, &dm, dh.mapsize); printf("readdemomap ret: %d\n\n", ret); demochunk dc; -- cgit v1.2.3