summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore1
-rw-r--r--data/out.demo0
-rw-r--r--inc/demo.h6
-rw-r--r--inc/pack.h7
-rw-r--r--src/demo.c66
-rw-r--r--src/main.c18
-rw-r--r--src/pack.c10
7 files changed, 98 insertions, 10 deletions
diff --git a/.gitignore b/.gitignore
index 567609b..c908381 100644
--- a/.gitignore
+++ b/.gitignore
@@ -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
diff --git a/inc/demo.h b/inc/demo.h
index 6a8a04a..379c3e8 100644
--- a/inc/demo.h
+++ b/inc/demo.h
@@ -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
diff --git a/inc/pack.h b/inc/pack.h
index 581bcf9..55ebf4e 100644
--- a/inc/pack.h
+++ b/inc/pack.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 */
diff --git a/src/demo.c b/src/demo.c
index 23995ff..c7fe6fe 100644
--- a/src/demo.c
+++ b/src/demo.c
@@ -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;
+}
diff --git a/src/main.c b/src/main.c
index a3ea478..48bf263 100644
--- a/src/main.c
+++ b/src/main.c
@@ -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;
/*
diff --git a/src/pack.c b/src/pack.c
index 0fa3274..b9a23be 100644
--- a/src/pack.c
+++ b/src/pack.c
@@ -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;