2 * Parse the "get.c" from mesa source tree to generate "glgetv_cst.h"
4 * Copyright (c) 2007 Even Rouault
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to deal
8 * in the Software without restriction, including without limitation the rights
9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 * copies of the Software, and to permit persons to whom the Software is
11 * furnished to do so, subject to the following conditions:
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
25 // gcc -Wall parse_mesa_get_c.c -o parse_mesa_get_c -I. && ./parse_mesa_get_c
33 #include "mesa_glext.h"
35 /* #include "mesa_enums.c" */
37 int gl_lookup_enum_by_name(const char* name)
44 sprintf(template1, "#define %s\t", name);
45 sprintf(template2, "#define %s ", name);
49 f = fopen("mesa_gl.h", "r");
51 f = fopen("mesa_glext.h", "r");
52 while(fgets(buffer, 256, f))
54 if (strstr(buffer, template1) || strstr(buffer, template2))
56 char* c = strstr(buffer, "0x");
59 ret = strtol(c, NULL, 16);
76 int compare_func(const void* a, const void* b)
78 return ((Token *)a)->value - ((Token *)b)->value;
86 #define CPL(x) {x, #x}
88 Cpl constantsOneVal[] =
90 CPL(GL_MAX_GENERAL_COMBINERS_NV),
91 CPL(GL_MAX_VERTEX_SHADER_INSTRUCTIONS_EXT),
92 CPL(GL_MAX_VERTEX_SHADER_VARIANTS_EXT),
93 CPL(GL_MAX_VERTEX_SHADER_INVARIANTS_EXT),
94 CPL(GL_MAX_VERTEX_SHADER_LOCAL_CONSTANTS_EXT),
95 CPL(GL_MAX_VERTEX_SHADER_LOCALS_EXT),
96 CPL(GL_MAX_OPTIMIZED_VERTEX_SHADER_INSTRUCTIONS_EXT),
97 CPL(GL_MAX_OPTIMIZED_VERTEX_SHADER_VARIANTS_EXT),
98 CPL(GL_MAX_OPTIMIZED_VERTEX_SHADER_INVARIANTS_EXT),
99 CPL(GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCAL_CONSTANTS_EXT),
100 CPL(GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCAL_CONSTANTS_EXT),
102 #define NB_CONSTANTS_ONE_VAL 11
104 int main(int argc, char* argv[])
106 FILE* f = fopen("mesa_get.c", "r");
115 FILE* outf = fopen("glgetv_cst.h", "w");
117 fprintf(outf, "/* This is a generated file. Do not edit !*/\n");
118 fprintf(outf, "typedef struct {\n");
119 fprintf(outf, " GLuint count;\n");
120 fprintf(outf, " GLenum token;\n");
121 fprintf(outf, " const char *name;\n");
122 fprintf(outf, "} GlGetConstant ;\n");
123 fprintf(outf, "static const GlGetConstant gl_get_constants[] = {\n");
125 while(fgets(buffer, 256, f))
127 if (strstr(buffer, "_mesa_GetBooleanv"))
133 if (strstr(buffer, "_mesa_GetFloatv"))
137 else if (strstr(buffer, "case GL_"))
139 strcpy(name, strstr(buffer, "case GL_") + 5);
140 *strstr(name, ":") = 0;
142 strcpy(template, "params[0]");
144 else if (strstr(buffer, template))
147 sprintf(template, "params[%d]", count);
149 else if (strstr(buffer, "break"))
153 int gl_lookup = gl_lookup_enum_by_name(name);
155 int mesa_lookup = _mesa_lookup_enum_by_name(name);
156 if (mesa_lookup != -1)
158 if(mesa_lookup != gl_lookup)
160 fprintf(stderr, "wrong : %s %d %d !\n", name, mesa_lookup, gl_lookup);
166 fprintf(stderr, "not found in includes : %s\n", name);
167 //fprintf(outf, "/* { %d, unknown value, \"%s\" },*/\n", count, name);
171 //fprintf(outf, " { %d, 0x%04X, \"%s\" },\n", count, gl_lookup, name);
172 tokens[ntoken].value = gl_lookup;
173 tokens[ntoken].nb_elts = count;
174 tokens[ntoken].name = strdup(name);
177 /*fprintf(outf, "#ifdef %s\n", name);
178 fprintf(outf, " { %d, MAKE_TOKEN_NAME(%s) },\n", count, name);
179 fprintf(outf, "#endif\n");*/
182 fprintf(stderr, "not recognized : %s\n", name);
187 for(i=0;i<NB_CONSTANTS_ONE_VAL;i++)
189 tokens[ntoken].value = constantsOneVal[i].i;
190 tokens[ntoken].nb_elts = 1;
191 tokens[ntoken].name = strdup(constantsOneVal[i].str);
195 tokens[ntoken].value = GL_SPRITE_MODE_SGIX;
196 tokens[ntoken].nb_elts = 1;
197 tokens[ntoken].name = strdup("GL_SPRITE_MODE_SGIX");
200 tokens[ntoken].value = GL_SPRITE_AXIS_SGIX ;
201 tokens[ntoken].nb_elts = 3;
202 tokens[ntoken].name = strdup("GL_SPRITE_AXIS_SGIX ");
205 tokens[ntoken].value = GL_SPRITE_TRANSLATION_SGIX;
206 tokens[ntoken].nb_elts = 3;
207 tokens[ntoken].name = strdup("GL_SPRITE_TRANSLATION_SGIX");
210 tokens[ntoken].value = GL_REFERENCE_PLANE_EQUATION_SGIX;
211 tokens[ntoken].nb_elts = 4;
212 tokens[ntoken].name = strdup("GL_REFERENCE_PLANE_EQUATION_SGIX");
215 tokens[ntoken].value = GL_CURRENT_PROGRAM;
216 tokens[ntoken].nb_elts = 1;
217 tokens[ntoken].name = strdup("GL_CURRENT_PROGRAM");
220 qsort(tokens, ntoken, sizeof(Token), compare_func);
221 for(i=0;i<ntoken;i++)
223 fprintf(outf, " { %d, 0x%04X, \"%s\" },\n", tokens[i].nb_elts, tokens[i].value, tokens[i].name);
225 fprintf(outf, "};\n");