]> git.tdb.fi Git - gldbg.git/blob - source/gldecoder.c
Replace per-file license notices with License.txt
[gldbg.git] / source / gldecoder.c
1 #include <stdlib.h>
2 #include <string.h>
3 #include "functions.h"
4 #include "gldecoder.h"
5 #include "packet.h"
6
7 static int decode_func(GlDecoder *, unsigned short, GlPacket *);
8 static int decode_gldfunc(GlDecoder *, unsigned short, GlPacket *);
9
10 GlDecoder *gldecoder_new(void *user_data, void (*destroy)(void *))
11 {
12         GlDecoder *dec;
13
14         dec = (GlDecoder *)malloc(sizeof(GlDecoder));
15         memset(dec, 0, sizeof(GlDecoder));
16         dec->user_data = user_data;
17         dec->destroy = destroy;
18
19         return dec;
20 }
21
22 void gldecoder_delete(GlDecoder *dec)
23 {
24         if(dec->destroy)
25                 dec->destroy(dec->user_data);
26         free(dec);
27 }
28
29 int gldecoder_decode(GlDecoder *dec, const char *data, unsigned len)
30 {
31         GlPacket *pkt;
32         unsigned short func;
33
34         pkt = packet_receive_str(data, &len);
35         if(!pkt)
36                 return -1;
37
38         packet_read_short(pkt, (short *)&func);
39
40         int ret = 0;
41
42         if(func&0x8000)
43                 ret = decode_gldfunc(dec, func, pkt);
44         else
45                 ret = decode_func(dec, func, pkt);
46         if(ret<0)
47                 return -1;
48
49         return len;
50 }
51
52 typedef const void *pointer;
53 typedef const char *string;
54
55 #include "gensrc/gldecoder.funcs"
56
57 static void decode_gldError(GlDecoder *dec, GlPacket *pkt)
58 {
59         GLenum code;
60         packet_read_int(pkt, (int *)&code);
61         if(dec->gldError)
62                 dec->gldError(dec->user_data, code);
63         else if(dec->unhandled)
64                 dec->unhandled(dec->user_data, FUNC_GLDERROR);
65 }
66
67 static void decode_gldBreak(GlDecoder *dec, GlPacket *pkt)
68 {
69         unsigned short func;
70         unsigned char flag;
71         packet_read_short(pkt, (short *)&func);
72         packet_read_char(pkt, (char *)&flag);
73         if(dec->gldBreak)
74                 dec->gldBreak(dec->user_data, func, flag);
75         else if(dec->unhandled)
76                 dec->unhandled(dec->user_data, FUNC_GLDBREAK);
77 }
78
79 static int decode_gldfunc(GlDecoder *dec, unsigned short func, GlPacket *pkt)
80 {
81         switch(func)
82         {
83         case FUNC_GLDERROR: decode_gldError(dec, pkt); break;
84         case FUNC_GLDBREAK: decode_gldBreak(dec, pkt); break;
85         default: return -1;
86         }
87         return 0;
88 }