#include 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(char **cp) { int result = 0; int len = 1; unsigned char src = **cp; (*cp)++; int sign = ((src >> 6) & 1); result |= (src & 0b00111111); for (int i = 0; i < 4; i++) { // printf("(%d, ", src); if ((src & 0b10000000) == 0) break; src = **cp; (*cp)++; len++; if (i == 3 && (src & 0b11110000) != 0) printf("[ WARNING ] Non zero int padding!\n"); result |= (src & 0b01111111) << (6 + 7 * i); } if (len > 1 && src == 0b00000000) printf("[ WARNING ] Overlong int encoding!\n"); result ^= -sign; return result; } /* int readint(char **src) { printf("starting read: %x, ", **src & 0xff); const int sign = (**src >> 6) & 1; int out = **src & 0x3f; const static int masks[] = {0x7F, 0x7F, 0x7F, 0x0F}; const static int shifts[] = {6, 6 + 7, 6 + 7 + 7, 6 + 7 + 7 + 7}; for (unsigned int i = 0; i < sizeof(masks); i++) { if (!(**src & 0x80)) break; (*src)++; printf("%x, ", **src & 0xff); out |= (**src & masks[i]) << shifts[i]; } (*src)++; out ^= -sign; printf(" result: %d\n", out); return out; } */ void writeint(int i, char **cp) { // printf("printing int: %d\n", i); int sign = i < 0; unsigned int in = i; in = (in ^ -sign); char next = (in & 0b00111111); in >>= 6; char head = 0; if (in != 0) head |= 0b10000000; if (sign != 0) head |= 0b01000000; // printf("printing: %x\n", (head | next) & 0xff); **cp = head | next; (*cp)++; while (in != 0) { next = (in & 0b01111111); in >>= 7; if (in != 0) head = 0b10000000; else head = 0; // printf("printing: %x\n", (head | next) & 0xff); **cp = head | next; (*cp)++; } }