]> git.tdb.fi Git - gldbg.git/blobdiff - source/enums.c
Enhance the object-orientedness of genwrap.py
[gldbg.git] / source / enums.c
diff --git a/source/enums.c b/source/enums.c
new file mode 100644 (file)
index 0000000..4875aa3
--- /dev/null
@@ -0,0 +1,89 @@
+/* $Id$
+
+This file is part of gldbg
+Copyright © 2009  Mikko Rasa, Mikkosoft Productions
+Distributed under the GPL
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include "enums.h"
+
+typedef struct sEnumInfo
+{
+       GLenum value;
+       const char *category;
+       const char *name;
+} EnumInfo;
+
+#include "enums.table"
+
+char *buffer = 0;
+unsigned buf_pos = 0;
+
+static char *buf_reserve(unsigned size)
+{
+       char *ptr;
+       if(!buffer)
+               buffer = (char *)malloc(2048);
+       if(buf_pos+size>2048)
+               buf_pos = 0;
+       ptr = buffer+buf_pos;
+       buf_pos += size;
+       return ptr;
+}
+
+const char *describe_enum(GLenum value, const char *categ)
+{
+       unsigned low = 0;
+       unsigned high = enum_count;
+       char *ptr;
+
+       while(high>low+1)
+       {
+               unsigned mid = (low+high)/2;
+               int cmp;
+
+               if(enums[mid].value<value)
+                       cmp = -1;
+               else if(enums[mid].value>value)
+                       cmp = 1;
+               else
+                       cmp = strcmp(enums[mid].category, categ);
+
+               if(cmp<0)
+                       low = mid;
+               else if(cmp>0)
+                       high = mid;
+               else
+                       return enums[mid].name;
+       }
+
+       if(enums[low].value==value)
+               return enums[low].name;
+       if(enums[high].value==value)
+               return enums[high].name;
+
+       ptr = buf_reserve(20);
+       snprintf(ptr, 20, "GLenum(0x%X)", value);
+       return ptr;
+}
+
+const char *describe_bitfield(int mask, const char *categ)
+{
+       int bit;
+       char *buf = buf_reserve(200);
+       char *ptr = buf;
+
+       for(bit=1; bit; bit<<=1)
+               if(mask&bit)
+               {
+                       const char *bdesc = describe_enum(bit, categ);
+                       if(ptr!=buf)
+                               *ptr++ = '|';
+                       while(*bdesc)
+                               *ptr++ = *bdesc++;
+               }
+       *ptr = 0;
+       return buf;
+}