X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fgldecoder.c;h=35a365a76fff1735a19069cb76a0c0078fea7f2f;hb=efd709c6cdac15b7823e80ed64e448003aea835d;hp=85d089d2034af846d3d7c990db52db680d40ea66;hpb=0cdc7b50b0e7758a1660c94be664a810504a88f4;p=gldbg.git diff --git a/source/gldecoder.c b/source/gldecoder.c index 85d089d..35a365a 100644 --- a/source/gldecoder.c +++ b/source/gldecoder.c @@ -1,18 +1,11 @@ -/* $Id$ - -This file is part of gldbg -Copyright © 2009 Mikko Rasa, Mikkosoft Productions -Distributed under the GPL -*/ - #include #include #include "functions.h" #include "gldecoder.h" +#include "packet.h" -static unsigned read_short(short *, const char *); -static unsigned read_int(int *, const char *); -static int decode_func(GlDecoder *, short, const char *); +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 *)) { @@ -35,92 +28,61 @@ void gldecoder_delete(GlDecoder *dec) int gldecoder_decode(GlDecoder *dec, const char *data, unsigned len) { - unsigned pos = 0; - int pktlen; - short func; - int ret; + GlPacket *pkt; + unsigned short func; - if(lengldError) + dec->gldError(dec->user_data, code); + else if(dec->unhandled) + dec->unhandled(dec->user_data, FUNC_GLDERROR); } -static unsigned read_data(const void **v, const char *data) +static void decode_gldBreak(GlDecoder *dec, GlPacket *pkt) { - int vlen; - unsigned pos = 0; - pos += read_int(&vlen, data); - if(vlen) - *v = data+pos; - else - *v = NULL; - return pos+vlen; + unsigned short func; + unsigned char flag; + packet_read_short(pkt, (short *)&func); + packet_read_char(pkt, (char *)&flag); + if(dec->gldBreak) + dec->gldBreak(dec->user_data, func, flag); + else if(dec->unhandled) + dec->unhandled(dec->user_data, FUNC_GLDBREAK); } -static unsigned read_string(const unsigned char **v, const char *data) +static int decode_gldfunc(GlDecoder *dec, unsigned short func, GlPacket *pkt) { - return read_data((const void **)v, data); + switch(func) + { + case FUNC_GLDERROR: decode_gldError(dec, pkt); break; + case FUNC_GLDBREAK: decode_gldBreak(dec, pkt); break; + default: return -1; + } + return 0; } - -#include "gldecoder.funcs"