]> git.tdb.fi Git - gldbg.git/blob - source/enums.c
Print the contents of arrays and references
[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 #include "tmpalloc.h"
12
13 typedef struct sEnumInfo
14 {
15         GLenum value;
16         const char *category;
17         const char *name;
18 } EnumInfo;
19
20 #include "enums.table"
21
22 const char *describe_enum(GLenum value, const char *categ)
23 {
24         unsigned low = 0;
25         unsigned high = enum_count;
26         char *ptr;
27
28         while(high>low+1)
29         {
30                 unsigned mid = (low+high)/2;
31                 int cmp;
32
33                 if(enums[mid].value<value)
34                         cmp = -1;
35                 else if(enums[mid].value>value)
36                         cmp = 1;
37                 else
38                         cmp = strcmp(enums[mid].category, categ);
39
40                 if(cmp<0)
41                         low = mid;
42                 else if(cmp>0)
43                         high = mid;
44                 else
45                         return enums[mid].name;
46         }
47
48         if(enums[low].value==value)
49                 return enums[low].name;
50         if(enums[high].value==value)
51                 return enums[high].name;
52
53         ptr = (char *)tmpalloc(20);
54         snprintf(ptr, 20, "GLenum(0x%X)", value);
55         return ptr;
56 }
57
58 const char *describe_bitfield(int mask, const char *categ)
59 {
60         int bit;
61         char *buf = (char *)tmpalloc(200);
62         char *ptr = buf;
63
64         for(bit=1; bit; bit<<=1)
65                 if(mask&bit)
66                 {
67                         const char *bdesc = describe_enum(bit, categ);
68                         if(ptr!=buf)
69                                 *ptr++ = '|';
70                         while(*bdesc)
71                                 *ptr++ = *bdesc++;
72                 }
73         *ptr = 0;
74         return buf;
75 }