summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--inc/demo.h6
-rw-r--r--src/demo.c63
-rw-r--r--src/main.c4
3 files changed, 70 insertions, 3 deletions
diff --git a/inc/demo.h b/inc/demo.h
index 379c3e8..645e2a2 100644
--- a/inc/demo.h
+++ b/inc/demo.h
@@ -63,10 +63,14 @@ typedef struct
typedef struct
{
+ int datasize;
+ char *data;
} demodelta;
typedef struct
{
+ int datasize;
+ char *data;
} demomessage;
/* union for different chunks */
@@ -110,6 +114,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 readdemochunks(FILE *fp, demodata *dd, unsigned char ver);
+
int writedemoheader(FILE *outfile, demoheader *header);
int writedemotimeline(FILE *outfile, demotimeline *timeline);
int writedemomap(FILE *outfile, demomap *map, int mapsize, unsigned char version);
diff --git a/src/demo.c b/src/demo.c
index c7fe6fe..491350f 100644
--- a/src/demo.c
+++ b/src/demo.c
@@ -169,6 +169,32 @@ int readdemosnap(FILE *fp, demosnap *snap, int size)
return 1;
}
+int readdemomessage(FILE *fp, demomessage *message, int size)
+{
+ unsigned char data[size];
+ if (fread(data, 1, size, fp) != size)
+ return -1;
+
+ message->data = (char *)malloc(size);
+ memcpy(message->data, data, size);
+ message->datasize = size;
+
+ return 1;
+}
+
+int readdemodelta(FILE *fp, demodelta *delta, int size)
+{
+ unsigned char data[size];
+ if (fread(data, 1, size, fp) != size)
+ return -1;
+
+ delta->data = (char *)malloc(size);
+ memcpy(delta->data, data, size);
+ delta->datasize = size;
+
+ return 1;
+}
+
int readdemochunk(FILE *fp, demochunk *chunk, unsigned char ver)
{
char chunkhead;
@@ -233,12 +259,18 @@ int readdemochunk(FILE *fp, demochunk *chunk, unsigned char ver)
else if (type == 2)
{
printf("MESSAGE={");
- fseek(fp, size, SEEK_CUR);
+ demomessage *message = (demomessage *)malloc(sizeof(demomessage));
+ readdemomessage(fp, message, size);
+ chunk->type = DEMOMESSAGE;
+ chunk->data.message = message;
}
else if (type == 3)
{
printf("SNAPSHOT_DELTA={");
- fseek(fp, size, SEEK_CUR);
+ demodelta *delta = (demodelta *)malloc(sizeof(demodelta));
+ readdemodelta(fp, delta, size);
+ chunk->type = DEMODELTA;
+ chunk->data.delta = delta;
}
else
{
@@ -250,6 +282,28 @@ int readdemochunk(FILE *fp, demochunk *chunk, unsigned char ver)
return 1;
}
+int readdemochunks(FILE *fp, demodata *dd, unsigned char ver)
+{
+ int chunkcap = 1024;
+ dd->numchunks = 0;
+ dd->chunks = (demochunk *)malloc(chunkcap * sizeof(demochunk));
+
+ while (readdemochunk(fp, &dd->chunks[dd->numchunks], ver))
+ {
+ dd->numchunks++;
+ if (dd->numchunks >= chunkcap)
+ {
+ chunkcap *= 2;
+ dd->chunks = (demochunk *)realloc(dd->chunks, chunkcap * sizeof(demochunk));
+ }
+ }
+
+ printf("numchunks: %d\n", dd->numchunks);
+ dd->chunks = (demochunk *)realloc(dd->chunks, dd->numchunks * sizeof(demochunk));
+
+ return 1;
+}
+
int writedemoheader(FILE *fp, demoheader *dh)
{
unsigned char intbuff[4];
@@ -304,3 +358,8 @@ int writedemomap(FILE *fp, demomap *dm, int mapsize, unsigned char ver)
return 1;
}
+
+int writedemotick(FILE *fp, demosnap *snap)
+{
+ return 1;
+}
diff --git a/src/main.c b/src/main.c
index 48bf263..8a14140 100644
--- a/src/main.c
+++ b/src/main.c
@@ -1,6 +1,5 @@
#include "../inc/demo.h"
#include "../inc/huffman.h"
-#include "../inc/pack.h"
#include <stdio.h>
#include <stdlib.h>
@@ -120,6 +119,7 @@ int main()
demoheader dh;
demotimeline dt;
demomap dm;
+ demodata dd;
readdemoheader(fp, &dh);
readdemotimeline(fp, &dt);
@@ -129,6 +129,8 @@ int main()
writedemotimeline(op, &dt);
writedemomap(op, &dm, dh.mapsize, dh.version);
+ readdemochunks(fp, &dd, dh.version);
+
fclose(fp);
fclose(op);