]> git.tdb.fi Git - gldbg.git/blobdiff - source/gldecoder.c
Packetize the command stream for more robustness
[gldbg.git] / source / gldecoder.c
index 93a525876c64c4b033bb92cd6f770239fcbc2dd9..85d089d2034af846d3d7c990db52db680d40ea66 100644 (file)
@@ -10,6 +10,10 @@ Distributed under the GPL
 #include "functions.h"
 #include "gldecoder.h"
 
+static unsigned read_short(short *, const char *);
+static unsigned read_int(int *, const char *);
+static int decode_func(GlDecoder *, short, const char *);
+
 GlDecoder *gldecoder_new(void *user_data, void (*destroy)(void *))
 {
        GlDecoder *dec;
@@ -29,72 +33,94 @@ void gldecoder_delete(GlDecoder *dec)
        free(dec);
 }
 
-unsigned read_char(char *v, const char *data, unsigned len)
+int gldecoder_decode(GlDecoder *dec, const char *data, unsigned len)
+{
+       unsigned pos = 0;
+       int pktlen;
+       short func;
+       int ret;
+
+       if(len<sizeof(int)+sizeof(short))
+               return -1;
+       pos += read_int(&pktlen, data);
+       if(len<pktlen)
+               return -1;
+       pos += read_short(&func, data+pos);
+       ret = decode_func(dec, func, data+pos);
+       if(ret<0)
+               return -1;
+       return pos+ret;
+}
+
+static unsigned read_char(char *v, const char *data)
 {
        *v = *data;
        return 1;
 }
 
-unsigned read_short(short *v, const char *data, unsigned len)
+static unsigned read_short(short *v, const char *data)
 {
        *v = *(short *)data;
        return sizeof(short);
 }
 
-unsigned read_int(int *v, const char *data, unsigned len)
+static unsigned read_int(int *v, const char *data)
 {
        *v = *(int *)data;
        return sizeof(int);
 }
 
-unsigned read_long(long *v, const char *data, unsigned len)
+static unsigned read_long(long *v, const char *data)
 {
        *v = *(long *)data;
        return sizeof(long);
 }
 
-unsigned read_ulong(unsigned long *v, const char *data, unsigned len)
+static unsigned read_ulong(unsigned long *v, const char *data)
 {
        *v = *(unsigned long *)data;
        return sizeof(unsigned long);
 }
 
-unsigned read_longlong(long long *v, const char *data, unsigned len)
+static unsigned read_longlong(long long *v, const char *data)
 {
        *v = *(long long *)data;
        return sizeof(long long);
 }
 
-unsigned read_float(float *v, const char *data, unsigned len)
+static unsigned read_float(float *v, const char *data)
 {
        *v = *(float *)data;
        return sizeof(float);
 }
 
-unsigned read_double(double *v, const char *data, unsigned len)
+static unsigned read_double(double *v, const char *data)
 {
        *v = *(double *)data;
        return sizeof(double);
 }
 
-unsigned read_pointer(void **v, const char *data, unsigned len)
+static unsigned read_pointer(void **v, const char *data)
 {
        *v = *(void **)data;
        return sizeof(void *);
 }
 
-unsigned read_data(const void **v, const char *data, unsigned len)
+static unsigned read_data(const void **v, const char *data)
 {
        int vlen;
        unsigned pos = 0;
-       pos += read_int(&vlen, data, len);
-       *v = data+pos;
+       pos += read_int(&vlen, data);
+       if(vlen)
+               *v = data+pos;
+       else
+               *v = NULL;
        return pos+vlen;
 }
 
-unsigned read_string(const unsigned char **v, const char *data, unsigned len)
+static unsigned read_string(const unsigned char **v, const char *data)
 {
-       return read_data((const void **)v, data, len);
+       return read_data((const void **)v, data);
 }
 
 #include "gldecoder.funcs"