]> git.tdb.fi Git - gldbg.git/blob - source/enums.c
Enhance the object-orientedness of genwrap.py
[gldbg.git] / source / enums.c
1 /* $Id$
2
3 This file is part of gldbg
4 Copyright © 2009  Mikko Rasa, Mikkosoft Productions
5 Distributed under the GPL
6 */
7
8 #include <stdio.h>
9 #include <stdlib.h>
10 #include "enums.h"
11
12 typedef struct sEnumInfo
13 {
14         GLenum value;
15         const char *category;
16         const char *name;
17 } EnumInfo;
18
19 #include "enums.table"
20
21 char *buffer = 0;
22 unsigned buf_pos = 0;
23
24 static char *buf_reserve(unsigned size)
25 {
26         char *ptr;
27         if(!buffer)
28                 buffer = (char *)malloc(2048);
29         if(buf_pos+size>2048)
30                 buf_pos = 0;
31         ptr = buffer+buf_pos;
32         buf_pos += size;
33         return ptr;
34 }
35
36 const char *describe_enum(GLenum value, const char *categ)
37 {
38         unsigned low = 0;
39         unsigned high = enum_count;
40         char *ptr;
41
42         while(high>low+1)
43         {
44                 unsigned mid = (low+high)/2;
45                 int cmp;
46
47                 if(enums[mid].value<value)
48                         cmp = -1;
49                 else if(enums[mid].value>value)
50                         cmp = 1;
51                 else
52                         cmp = strcmp(enums[mid].category, categ);
53
54                 if(cmp<0)
55                         low = mid;
56                 else if(cmp>0)
57                         high = mid;
58                 else
59                         return enums[mid].name;
60         }
61
62         if(enums[low].value==value)
63                 return enums[low].name;
64         if(enums[high].value==value)
65                 return enums[high].name;
66
67         ptr = buf_reserve(20);
68         snprintf(ptr, 20, "GLenum(0x%X)", value);
69         return ptr;
70 }
71
72 const char *describe_bitfield(int mask, const char *categ)
73 {
74         int bit;
75         char *buf = buf_reserve(200);
76         char *ptr = buf;
77
78         for(bit=1; bit; bit<<=1)
79                 if(mask&bit)
80                 {
81                         const char *bdesc = describe_enum(bit, categ);
82                         if(ptr!=buf)
83                                 *ptr++ = '|';
84                         while(*bdesc)
85                                 *ptr++ = *bdesc++;
86                 }
87         *ptr = 0;
88         return buf;
89 }