]> git.tdb.fi Git - gldbg.git/blob - source/gldecoder.c
Enable bidirectional communication between gldbg and glwrap.so
[gldbg.git] / source / gldecoder.c
1 /* $Id$
2
3 This file is part of gldbg
4 Copyright © 2009-2010  Mikko Rasa, Mikkosoft Productions
5 Distributed under the GPL
6 */
7
8 #include <stdlib.h>
9 #include <string.h>
10 #include "functions.h"
11 #include "gldecoder.h"
12 #include "packet.h"
13
14 static int decode_func(GlDecoder *, unsigned short, GlPacket *);
15 static int decode_gldfunc(GlDecoder *, unsigned short, GlPacket *);
16
17 GlDecoder *gldecoder_new(void *user_data, void (*destroy)(void *))
18 {
19         GlDecoder *dec;
20
21         dec = (GlDecoder *)malloc(sizeof(GlDecoder));
22         memset(dec, 0, sizeof(GlDecoder));
23         dec->user_data = user_data;
24         dec->destroy = destroy;
25
26         return dec;
27 }
28
29 void gldecoder_delete(GlDecoder *dec)
30 {
31         if(dec->destroy)
32                 dec->destroy(dec->user_data);
33         free(dec);
34 }
35
36 int gldecoder_decode(GlDecoder *dec, const char *data, unsigned len)
37 {
38         GlPacket *pkt;
39         unsigned short func;
40
41         pkt = packet_receive_str(data, &len);
42         if(!pkt)
43                 return -1;
44
45         packet_read_short(pkt, (short *)&func);
46
47         if(dec)
48         {
49                 int ret = 0;
50
51                 if(func&0x8000)
52                         ret = decode_gldfunc(dec, func, pkt);
53                 else
54                         ret = decode_func(dec, func, pkt);
55                 if(ret<0)
56                         return -1;
57         }
58
59         return len;
60 }
61
62 typedef const void *pointer;
63 typedef const char *string;
64
65 #include "gensrc/gldecoder.funcs"
66
67 static void decode_gldError(GlDecoder *dec, GlPacket *pkt)
68 {
69         GLenum code;
70         packet_read_int(pkt, (int *)&code);
71         if(dec->gldError)
72                 dec->gldError(dec->user_data, code);
73 }
74
75 static int decode_gldfunc(GlDecoder *dec, unsigned short func, GlPacket *pkt)
76 {
77         switch(func)
78         {
79         case FUNC_GLDERROR: decode_gldError(dec, pkt); break;
80         default: return -1;
81         }
82         return 0;
83 }