summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjohannes <johannes.herman@gmail.com>2024-02-07 15:43:27 +0100
committerjohannes <johannes.herman@gmail.com>2024-02-07 15:43:27 +0100
commitab6cb49b0b875b5c27510dc57fe3767bfd074dae (patch)
tree716accb128e75c11da1e110421dcfcfec44adace
parent116de038d3d024232d3640f499a8fb21f1c557fd (diff)
added packed int writer
-rw-r--r--inc/pack.h4
-rw-r--r--src/demo.c4
-rw-r--r--src/main.c29
-rw-r--r--src/pack.c33
4 files changed, 68 insertions, 2 deletions
diff --git a/inc/pack.h b/inc/pack.h
index 55ebf4e..49e581c 100644
--- a/inc/pack.h
+++ b/inc/pack.h
@@ -13,4 +13,8 @@ void tobigendian(const int in, unsigned char out[4]);
/* the given pointer is incremented */
int readint(unsigned char **cp);
+/* writes given int to teeworlds packed */
+/* the given pointer is incremented */
+void writeint(int in, char **cp);
+
#endif // PACK_H
diff --git a/src/demo.c b/src/demo.c
index bfb233e..8452b06 100644
--- a/src/demo.c
+++ b/src/demo.c
@@ -380,7 +380,7 @@ int writedemotick(FILE *fp, demotick *tick, unsigned char ver)
header |= tick->keyframe << 6;
if (ver >= 5)
header |= tick->innline << 5;
-
+
if (tick->innline)
{
header |= tick->delta;
@@ -400,6 +400,6 @@ int writedemotick(FILE *fp, demotick *tick, unsigned char ver)
int writedemosnap(FILE *fp, demosnap *snap, unsigned char ver)
{
-
+
return 1;
}
diff --git a/src/main.c b/src/main.c
index e33594a..a21c4cf 100644
--- a/src/main.c
+++ b/src/main.c
@@ -1,5 +1,6 @@
#include "../inc/demo.h"
#include "../inc/huffman.h"
+#include "../inc/pack.h"
#include <stdio.h>
#include <stdlib.h>
@@ -109,6 +110,34 @@ int testdecompress(char *line)
return 1;
}
+void dumbtestpacker()
+{
+ char buf[16] = {0};
+ int in = 550;
+ int in2 = 8763289;
+
+ printf("input: %d\n", in);
+
+ for (int i = 0; i < 16; i++)
+ printf("%2X ", buf[i]);
+ printf("\n");
+ char *cp = buf;
+
+ writeint(in, &cp);
+ writeint(in2, &cp);
+
+ for (int i = 0; i < 16; i++)
+ printf("%2X ", buf[i]);
+ printf("\n");
+
+ cp = buf;
+ int res = readint((unsigned char **)&cp);
+ int res2 = readint((unsigned char **)&cp);
+
+ printf("res: %d\n", res);
+ printf("res2: %d\n", res2);
+}
+
int main()
{
inithuff(NULL);
diff --git a/src/pack.c b/src/pack.c
index b9a23be..918bda9 100644
--- a/src/pack.c
+++ b/src/pack.c
@@ -46,3 +46,36 @@ int readint(unsigned char **cp)
return result;
}
+
+void writeint(int in, char **cp)
+{
+ int sign = in < 0;
+ in = (in ^ -sign);
+ char next = (in & 0b00111111);
+ in >>= 6;
+
+ char head = 0;
+ if (in != 0)
+ head |= 0b10000000;
+ if (sign != 0)
+ head |= 0b01000000;
+
+ printf("writing: %2X\n", head | next);
+ **cp = head | next;
+ (*cp)++;
+
+ while (in != 0)
+ {
+ next = (in & 0b01111111);
+ in >>= 7;
+
+ if (in != 0)
+ head = 0b10000000;
+ else
+ head = 0;
+
+ printf("writing: %2X\n", head | next);
+ **cp = head | next;
+ (*cp)++;
+ }
+}