diff options
| author | johannes <johannes.herman@gmail.com> | 2024-02-07 15:43:27 +0100 |
|---|---|---|
| committer | johannes <johannes.herman@gmail.com> | 2024-02-07 15:43:27 +0100 |
| commit | ab6cb49b0b875b5c27510dc57fe3767bfd074dae (patch) | |
| tree | 716accb128e75c11da1e110421dcfcfec44adace | |
| parent | 116de038d3d024232d3640f499a8fb21f1c557fd (diff) | |
added packed int writer
| -rw-r--r-- | inc/pack.h | 4 | ||||
| -rw-r--r-- | src/demo.c | 4 | ||||
| -rw-r--r-- | src/main.c | 29 | ||||
| -rw-r--r-- | src/pack.c | 33 |
4 files changed, 68 insertions, 2 deletions
@@ -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 @@ -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; } @@ -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); @@ -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)++; + } +} |
