X-Git-Url: http://git.tdb.fi/?p=gldbg.git;a=blobdiff_plain;f=source%2Fgldecoder.c;h=cd290aa513b3f1e69ea21009b95513bdff46a5ac;hp=f61e327aa92a9217a589ebb8f7174680f8125a7c;hb=4aba13fc7690cf79e949d9765b371e85e7530207;hpb=03c86c2f632b642aa94f721e326787e91aa69c25 diff --git a/source/gldecoder.c b/source/gldecoder.c index f61e327..cd290aa 100644 --- a/source/gldecoder.c +++ b/source/gldecoder.c @@ -11,10 +11,17 @@ Distributed under the GPL #include "gldecoder.h" #include "tmpalloc.h" -static unsigned read_short(short *, const char *); -static unsigned read_int(int *, const char *); -static int decode_func(GlDecoder *, unsigned short, const char *); -static int decode_gldfunc(GlDecoder *, unsigned short, const char *); +typedef struct sGlPacket +{ + const char *ptr; + unsigned chunk; + unsigned total; +} GlPacket; + +static void read_short(short *, GlPacket *); +static void read_int(int *, GlPacket *); +static int decode_func(GlDecoder *, unsigned short, GlPacket *); +static int decode_gldfunc(GlDecoder *, unsigned short, GlPacket *); GlDecoder *gldecoder_new(void *user_data, void (*destroy)(void *)) { @@ -37,127 +44,173 @@ void gldecoder_delete(GlDecoder *dec) int gldecoder_decode(GlDecoder *dec, const char *data, unsigned len) { - unsigned pos = 0; - unsigned pktlen; unsigned short func; - int ret; + GlPacket packet; if(lentotal==0) + return; + pkt->chunk = pkt->total; + read_int((int *)&pkt->chunk, pkt); + pkt->chunk &= 0x7FFFFFFF; +} + +static void read_generic(void *v, unsigned size, int byteswap, GlPacket *pkt) +{ + if(pkt->chunk==0) + next_chunk(pkt); + + if(pkt->chunk>=size) + { + // TODO: Actually implement byteswap if needed + (void)byteswap; + memcpy(v, pkt->ptr, size); + pkt->ptr += size; + pkt->chunk -= size; + pkt->total -= size; + } + else + { + memset(v, 0, size); + pkt->total -= pkt->chunk; + pkt->chunk = 0; + } } -static unsigned read_char(char *v, const char *data) +static void read_char(char *v, GlPacket *pkt) { - *v = *data; - return 1; + read_generic(v, 1, 0, pkt); } -static unsigned read_short(short *v, const char *data) +static void read_short(short *v, GlPacket *pkt) { - *v = *(short *)data; - return sizeof(short); + read_generic(v, sizeof(short), 1, pkt); } -static unsigned read_int(int *v, const char *data) +static void read_int(int *v, GlPacket *pkt) { - *v = *(int *)data; - return sizeof(int); + read_generic(v, sizeof(int), 1, pkt); } -static unsigned read_long(long *v, const char *data) +static void read_long(long *v, GlPacket *pkt) { - *v = *(long *)data; - return sizeof(long); + read_generic(v, sizeof(long), 1, pkt); } -static unsigned read_long_long(long long *v, const char *data) +static void read_long_long(long long *v, GlPacket *pkt) { - *v = *(long long *)data; - return sizeof(long long); + read_generic(v, sizeof(long long), 1, pkt); } -static unsigned read_float(float *v, const char *data) +static void read_float(float *v, GlPacket *pkt) { - *v = *(float *)data; - return sizeof(float); + read_generic(v, sizeof(float), 1, pkt); } -static unsigned read_double(double *v, const char *data) +static void read_double(double *v, GlPacket *pkt) { - *v = *(double *)data; - return sizeof(double); + read_generic(v, sizeof(double), 1, pkt); } -typedef void *pointer; +typedef const void *pointer; -static unsigned read_pointer(pointer *v, const char *data) +static void read_pointer(pointer *v, GlPacket *pkt) { - *v = *(void **)data; - return sizeof(void *); + read_generic(v, sizeof(pointer), 1, pkt); } -static unsigned read_data(const void **v, const char *data) +static void read_data(pointer *v, GlPacket *pkt) { int vlen; - unsigned pos = 0; - pos += read_int(&vlen, data); + read_int(&vlen, pkt); if(vlen) - *v = data+pos; + *v = pkt->ptr; else *v = NULL; - return pos+vlen; } typedef const char *string; -static unsigned read_string(string *v, const char *data) +static void read_string(string *v, GlPacket *pkt) { - return read_data((const void **)v, data); + read_data((pointer *)v, pkt); } -static unsigned read_string_array(string **v, const char *data) +static void read_string_array(string **v, GlPacket *pkt) { int count; - unsigned pos = 0; int i; - pos += read_int(&count, data); + read_int(&count, pkt); *v = (string *)tmpalloc(count*sizeof(string)); for(i=0; igldError) dec->gldError(dec->user_data, code); - return pos; } -static int decode_gldfunc(GlDecoder *dec, unsigned short func, const char *data) +static int decode_gldfunc(GlDecoder *dec, unsigned short func, GlPacket *pkt) { switch(func) { - case FUNC_GLDERROR: return decode_gldError(dec, data); + case FUNC_GLDERROR: decode_gldError(dec, pkt); break; default: return -1; } + return 0; }