X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fenums.c;fp=source%2Fenums.c;h=4875aa366aec8e5dbd6ab7997e1b04f117f6f4b5;hb=49f8063ce156a50d4b3b8c77a1508a21ea2bfe90;hp=0000000000000000000000000000000000000000;hpb=2e4973ec66cd8ae12d4253e3c3ad9e36a8a4bca6;p=gldbg.git diff --git a/source/enums.c b/source/enums.c new file mode 100644 index 0000000..4875aa3 --- /dev/null +++ b/source/enums.c @@ -0,0 +1,89 @@ +/* $Id$ + +This file is part of gldbg +Copyright © 2009 Mikko Rasa, Mikkosoft Productions +Distributed under the GPL +*/ + +#include +#include +#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].valuevalue) + 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; +}