/* $Id$
This file is part of gldbg
-Copyright © 2009 Mikko Rasa, Mikkosoft Productions
+Copyright © 2009-2010 Mikko Rasa, Mikkosoft Productions
Distributed under the GPL
*/
#include <string.h>
#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 *, unsigned short, const char *);
-static int decode_gldfunc(GlDecoder *, unsigned 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 *))
{
int gldecoder_decode(GlDecoder *dec, const char *data, unsigned len)
{
- unsigned pos = 0;
- int pktlen;
+ GlPacket *pkt;
unsigned short func;
- int ret;
- if(len<sizeof(int)+sizeof(short))
+ pkt = packet_receive_str(data, &len);
+ if(!pkt)
return -1;
- pos += read_int(&pktlen, data);
- if(len<pktlen)
- return -1;
- pos += read_short(&func, data+pos);
- if(dec)
- {
- if(func&0x8000)
- ret = decode_gldfunc(dec, func, data+pos);
- else
- ret = decode_func(dec, func, data+pos);
- if(ret<0)
- return -1;
- }
- return pktlen;
-}
-
-static unsigned read_char(char *v, const char *data)
-{
- *v = *data;
- return 1;
-}
-
-static unsigned read_short(short *v, const char *data)
-{
- *v = *(short *)data;
- return sizeof(short);
-}
-
-static unsigned read_int(int *v, const char *data)
-{
- *v = *(int *)data;
- return sizeof(int);
-}
-
-static unsigned read_long(long *v, const char *data)
-{
- *v = *(long *)data;
- return sizeof(long);
-}
-
-static unsigned read_ulong(unsigned long *v, const char *data)
-{
- *v = *(unsigned long *)data;
- return sizeof(unsigned long);
-}
-static unsigned read_longlong(long long *v, const char *data)
-{
- *v = *(long long *)data;
- return sizeof(long long);
-}
-
-static unsigned read_float(float *v, const char *data)
-{
- *v = *(float *)data;
- return sizeof(float);
-}
+ packet_read_short(pkt, (short *)&func);
-static unsigned read_double(double *v, const char *data)
-{
- *v = *(double *)data;
- return sizeof(double);
-}
-
-static unsigned read_pointer(void **v, const char *data)
-{
- *v = *(void **)data;
- return sizeof(void *);
-}
+ int ret = 0;
-static unsigned read_data(const void **v, const char *data)
-{
- int vlen;
- unsigned pos = 0;
- pos += read_int(&vlen, data);
- if(vlen)
- *v = data+pos;
+ if(func&0x8000)
+ ret = decode_gldfunc(dec, func, pkt);
else
- *v = NULL;
- return pos+vlen;
-}
+ ret = decode_func(dec, func, pkt);
+ if(ret<0)
+ return -1;
-static unsigned read_string(const unsigned char **v, const char *data)
-{
- return read_data((const void **)v, data);
+ return len;
}
-#include "gldecoder.funcs"
+typedef const void *pointer;
+typedef const char *string;
+
+#include "gensrc/gldecoder.funcs"
-static int decode_gldError(GlDecoder *dec, const char *data)
+static void decode_gldError(GlDecoder *dec, GlPacket *pkt)
{
- unsigned pos = 0;
GLenum code;
- pos += read_int(&code, data);
+ packet_read_int(pkt, (int *)&code);
if(dec->gldError)
dec->gldError(dec->user_data, code);
- return pos;
+ else if(dec->unhandled)
+ dec->unhandled(dec->user_data, FUNC_GLDERROR);
+}
+
+static void decode_gldBreak(GlDecoder *dec, GlPacket *pkt)
+{
+ 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 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;
+ case FUNC_GLDBREAK: decode_gldBreak(dec, pkt); break;
default: return -1;
}
+ return 0;
}