--- /dev/null
+/* $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;
+}