Initial commit
[profile/ivi/simulator-opengl.git] / libGL / parse_mesa_get_c.c
1 /*
2  *  Parse the "get.c" from mesa source tree to generate "glgetv_cst.h"
3  *
4  *  Copyright (c) 2007 Even Rouault
5  *
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:
12  *
13  * The above copyright notice and this permission notice shall be included in
14  * all copies or substantial portions of the Software.
15  *
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
22  * THE SOFTWARE.
23  */
24
25 // gcc -Wall parse_mesa_get_c.c -o parse_mesa_get_c -I. && ./parse_mesa_get_c
26
27 #include <stdlib.h>
28 #include <stdio.h>
29 #include <string.h>
30 #include <assert.h>
31
32 #include "mesa_gl.h"
33 #include "mesa_glext.h"
34
35 /* #include "mesa_enums.c" */
36
37 int gl_lookup_enum_by_name(const char* name)
38 {
39   FILE* f;
40   char buffer[256];
41   char template1[256];
42   char template2[256];
43   int i;
44   sprintf(template1, "#define %s\t", name);
45   sprintf(template2, "#define %s ", name);
46   for(i=0;i<2;i++)
47   {
48     if (i == 0)
49       f = fopen("mesa_gl.h", "r");
50     else
51       f = fopen("mesa_glext.h", "r");
52     while(fgets(buffer, 256, f))
53     {
54       if (strstr(buffer, template1) || strstr(buffer, template2))
55       {
56         char* c = strstr(buffer, "0x");
57         assert(c);
58         int ret;
59         ret = strtol(c, NULL, 16);
60         return ret;
61       }
62     }
63     fclose(f);
64   }
65
66   return -1;
67 }
68
69 typedef struct
70 {
71   int value;
72   char* name;
73   int nb_elts;
74 } Token;
75
76 int compare_func(const void* a, const void* b)
77 {
78   return ((Token *)a)->value - ((Token *)b)->value;
79 }
80
81 typedef struct
82 {
83   int i;
84   char* str;
85 } Cpl;
86 #define CPL(x) {x, #x}
87
88 Cpl constantsOneVal[] =
89 {
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),
101 };
102 #define NB_CONSTANTS_ONE_VAL  11
103
104 int main(int argc, char* argv[])
105 {
106   FILE* f = fopen("mesa_get.c", "r");
107   char buffer[256];
108   int state = 0;
109   char name[256];
110   int count = 0;
111   char template[256];
112   Token tokens[1000];
113   int ntoken = 0;
114   int i;
115   FILE* outf = fopen("glgetv_cst.h", "w");
116
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");
124
125   while(fgets(buffer, 256, f))
126   {
127     if (strstr(buffer, "_mesa_GetBooleanv"))
128     {
129       state = 1;
130     }
131     else if (state == 1)
132     {
133       if (strstr(buffer, "_mesa_GetFloatv"))
134       {
135         break;
136       }
137       else if (strstr(buffer, "case GL_"))
138       {
139         strcpy(name, strstr(buffer, "case GL_") + 5);
140         *strstr(name, ":") = 0;
141         count = 0;
142         strcpy(template, "params[0]");
143       }
144       else if (strstr(buffer, template))
145       {
146         count ++;
147         sprintf(template, "params[%d]", count);
148       }
149       else if (strstr(buffer, "break"))
150       {
151         if (count > 0)
152         {
153           int gl_lookup = gl_lookup_enum_by_name(name);
154           /*
155           int mesa_lookup = _mesa_lookup_enum_by_name(name);
156           if (mesa_lookup != -1)
157           {
158             if(mesa_lookup != gl_lookup)
159             {
160               fprintf(stderr, "wrong : %s %d %d !\n", name, mesa_lookup, gl_lookup);
161               exit(-1);
162             }
163           }*/
164           if (gl_lookup == -1)
165           {
166             fprintf(stderr, "not found in includes : %s\n", name);
167             //fprintf(outf, "/*  { %d, unknown value, \"%s\" },*/\n", count, name);
168           }
169           else
170           {
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);
175             ntoken++;
176           }
177           /*fprintf(outf, "#ifdef %s\n", name);
178           fprintf(outf, "  { %d, MAKE_TOKEN_NAME(%s) },\n", count, name);
179           fprintf(outf, "#endif\n");*/
180         }
181         else
182           fprintf(stderr, "not recognized : %s\n", name);
183       }
184     }
185   }
186
187   for(i=0;i<NB_CONSTANTS_ONE_VAL;i++)
188   {
189     tokens[ntoken].value = constantsOneVal[i].i;
190     tokens[ntoken].nb_elts = 1;
191     tokens[ntoken].name = strdup(constantsOneVal[i].str);
192     ntoken++;
193   }
194
195   tokens[ntoken].value = GL_SPRITE_MODE_SGIX;
196   tokens[ntoken].nb_elts = 1;
197   tokens[ntoken].name = strdup("GL_SPRITE_MODE_SGIX");
198   ntoken++;
199
200   tokens[ntoken].value = GL_SPRITE_AXIS_SGIX ;
201   tokens[ntoken].nb_elts = 3;
202   tokens[ntoken].name = strdup("GL_SPRITE_AXIS_SGIX ");
203   ntoken++;
204
205   tokens[ntoken].value = GL_SPRITE_TRANSLATION_SGIX;
206   tokens[ntoken].nb_elts = 3;
207   tokens[ntoken].name = strdup("GL_SPRITE_TRANSLATION_SGIX");
208   ntoken++;
209
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");
213   ntoken++;
214
215   tokens[ntoken].value = GL_CURRENT_PROGRAM;
216   tokens[ntoken].nb_elts = 1;
217   tokens[ntoken].name = strdup("GL_CURRENT_PROGRAM");
218   ntoken++;
219   
220   qsort(tokens, ntoken, sizeof(Token), compare_func);
221   for(i=0;i<ntoken;i++)
222   {
223     fprintf(outf, "  { %d, 0x%04X, \"%s\" },\n", tokens[i].nb_elts, tokens[i].value, tokens[i].name);
224   }
225   fprintf(outf, "};\n");
226   fclose(f);
227   fclose(outf);
228   return 0;
229 }