diff options
| -rw-r--r-- | .gitignore | 1 | ||||
| -rw-r--r-- | data/out.demo | 0 | ||||
| -rw-r--r-- | inc/demo.h | 6 | ||||
| -rw-r--r-- | inc/pack.h | 7 | ||||
| -rw-r--r-- | src/demo.c | 66 | ||||
| -rw-r--r-- | src/main.c | 18 | ||||
| -rw-r--r-- | src/pack.c | 10 |
7 files changed, 98 insertions, 10 deletions
@@ -1 +1,2 @@ build/ +data/out.demo diff --git a/data/out.demo b/data/out.demo deleted file mode 100644 index e69de29..0000000 --- a/data/out.demo +++ /dev/null @@ -34,7 +34,7 @@ typedef struct typedef struct { unsigned char sha256[32]; - unsigned char *data; + char *data; } demomap; typedef struct @@ -110,4 +110,8 @@ 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 writedemoheader(FILE *outfile, demoheader *header); +int writedemotimeline(FILE *outfile, demotimeline *timeline); +int writedemomap(FILE *outfile, demomap *map, int mapsize, unsigned char version); + #endif // DEMO_H @@ -3,8 +3,11 @@ #include <stdio.h> -/* reads a big endian int into an int */ -int reverseint(const unsigned char in[4]); +/* turns a big endian int into an int */ +int frombigendian(const unsigned char in[4]); + +/* writes an int into a big endian int in given buffer */ +void tobigendian(const int in, unsigned char out[4]); /* reads a teeworlds packed int from given buffer */ /* the given pointer is incremented */ @@ -38,18 +38,18 @@ int readdemoheader(FILE *fp, demoheader *dh) if (fread(intbuff, 1, 4, fp) != 4) return -5; - dh->mapsize = reverseint(intbuff); + dh->mapsize = frombigendian(intbuff); if (fread(intbuff, 1, 4, fp) != 4) return -6; - dh->mapcrc = reverseint(intbuff); + dh->mapcrc = frombigendian(intbuff); if (fread(dh->type, 1, 8, fp) != 8) return -7; if (fread(intbuff, 1, 4, fp) != 4) return -8; - dh->length = reverseint(intbuff); + dh->length = frombigendian(intbuff); if (fread(dh->timestamp, 1, 20, fp) != 20) return -9; @@ -84,6 +84,7 @@ int readdemomap(FILE *fp, demomap *dm, int mapsize, unsigned char ver) if (fread(dm->sha256, 1, 32, fp) != 32) return -2; + dm->data = (char *)malloc(mapsize); if (fread(dm->data, 1, mapsize, fp) != mapsize) return -3; @@ -106,7 +107,7 @@ int readdemotick(FILE *fp, char chunkhead, demotick *tick, unsigned char ver) tick->innline = 0; unsigned char tickdelta[4]; fread(tickdelta, 1, 4, fp); - tick->delta = reverseint(tickdelta); + tick->delta = frombigendian(tickdelta); } } else @@ -117,7 +118,7 @@ int readdemotick(FILE *fp, char chunkhead, demotick *tick, unsigned char ver) { unsigned char tickdelta[4]; fread(tickdelta, 1, 4, fp); - tick->delta = reverseint(tickdelta); + tick->delta = frombigendian(tickdelta); } } return 1; @@ -248,3 +249,58 @@ int readdemochunk(FILE *fp, demochunk *chunk, unsigned char ver) } return 1; } + +int writedemoheader(FILE *fp, demoheader *dh) +{ + unsigned char intbuff[4]; + if (fwrite(headermagic, 1, sizeof(headermagic), fp) != sizeof(headermagic)) + return -1; + + if (fwrite(&dh->version, 1, 1, fp) != 1) + return -2; + + if (fwrite(dh->netversion, 1, 64, fp) != 64) + return -3; + + if (fwrite(dh->mapname, 1, 64, fp) != 64) + return -4; + + tobigendian(dh->mapsize, intbuff); + if (fwrite(intbuff, 1, 4, fp) != 4) + return -5; + + tobigendian(dh->mapcrc, intbuff); + if (fwrite(intbuff, 1, 4, fp) != 4) + return -5; + + if (fwrite(dh->type, 1, 8, fp) != 8) + return -6; + + tobigendian(dh->length, intbuff); + if (fwrite(intbuff, 1, 4, fp) != 4) + return -7; + + if (fwrite(dh->timestamp, 1, 20, fp) != 20) + return -8; + + return 1; +} + +int writedemotimeline(FILE *fp, demotimeline *dt) +{ + if (fwrite(dt->data, 1, 260, fp) != 260) + return -1; + return 1; +} + +int writedemomap(FILE *fp, demomap *dm, int mapsize, unsigned char ver) +{ + if (ver >= 6) + if (fwrite(dm->sha256, 1, 32, fp) != 32) + return -1; + + if (fwrite(dm->data, 1, mapsize, fp) != mapsize) + return -2; + + return 1; +} @@ -121,6 +121,22 @@ int main() demotimeline dt; demomap dm; + 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); + + fclose(fp); + fclose(op); + + /* + demoheader dh; + demotimeline dt; + demomap dm; + int ret = readdemoheader(fp, &dh); dm.data = (unsigned char *)malloc(dh.mapsize); @@ -152,7 +168,7 @@ int main() putc(c, op); } } while (c != EOF); - + */ return EXIT_SUCCESS; /* @@ -1,10 +1,18 @@ #include <stdio.h> -int reverseint(const unsigned char in[4]) +int frombigendian(const unsigned char in[4]) { return (in[0] << 24) | (in[1] << 16) | (in[2] << 8) | in[3]; } +void tobigendian(const int in, unsigned char out[4]) +{ + out[0] = (in >> 24) & 0xff; + out[1] = (in >> 16) & 0xff; + out[2] = (in >> 8) & 0xff; + out[3] = in & 0xff; +} + int readint(unsigned char **cp) { int result = 0; |
