1%option stack
2
3%x comment
4%x api_entry
5%x api_entry2
6%x api_entry_param
7%x var_type
8
9DIGIT    [0-9]
10ID       [a-zA-Z_][a-zA-Z0-9_]*
11
12    #include "spec.h"
13
14   int num_lines = 0;
15
16   VarType *currType = 0;
17
18   ApiEntry apis[128];
19   int apiCount = 0;
20
21   int typeNextState;
22
23   void checkPointerType() {
24       VarType *baseType = currType;
25       int curPtrLevel = 0;
26       while (curPtrLevel < baseType->ptrLevel) {
27           currType = &apis[apiCount].params[apis[apiCount].paramCount];
28           currType->type = 4;
29           currType->ptrLevel = curPtrLevel;
30           if (currType->ptrLevel > 0) {
31              currType->isConst = 1;
32           }
33           sprintf(currType->typeName, "%s", "size_t");
34           switch(baseType->ptrLevel - curPtrLevel) {
35           case 1:
36              sprintf(currType->name, "%s_length", baseType->name);
37              break;
38           case 2:
39              sprintf(currType->name, "%s_length_length", baseType->name);
40              break;
41           }
42           apis[apiCount].paramCount++;
43           curPtrLevel ++;
44       }
45   }
46
47   extern "C" int yylex();
48
49%%
50
51"/*"         BEGIN(comment);
52<comment>[^*\n]*        /* eat anything that's not a '*' */
53<comment>"*"+[^*/\n]*   /* eat up '*'s not followed by '/'s */
54<comment>\n             ++num_lines;
55<comment>"*"+"/"        BEGIN(INITIAL);
56
57<*>" "   //printf("found ' '\n");
58<*>"\t"   //printf("found ' '\n");
59<*>"\n"  ++num_lines; //printf("found lf \n");
60
61{ID} {
62    memset(&apis[apiCount], 0, sizeof(ApiEntry));
63    memcpy(apis[apiCount].name, yytext, yyleng);
64    BEGIN(api_entry);
65    }
66
67<api_entry>"{" {
68    BEGIN(api_entry2);
69    }
70
71<api_entry2>"sync" {
72    apis[apiCount].sync = 1;
73    }
74
75<api_entry2>"handcodeApi" {
76    apis[apiCount].handcodeApi = 1;
77    }
78
79<api_entry2>"direct" {
80    apis[apiCount].direct = 1;
81    }
82
83<api_entry2>"nocontext" {
84    apis[apiCount].nocontext = 1;
85    }
86
87<api_entry2>"ret" {
88    currType = &apis[apiCount].ret;
89    typeNextState = api_entry2;
90    BEGIN(var_type);
91    }
92
93<api_entry2>"param" {
94    currType = &apis[apiCount].params[apis[apiCount].paramCount];
95    apis[apiCount].paramCount++;
96    typeNextState = api_entry_param;
97    BEGIN(var_type);
98    }
99
100<var_type>"const" {
101    currType->isConst = 1;
102    }
103
104<var_type>"i8" {
105    currType->type = 1;
106    currType->bits = 8;
107    BEGIN(typeNextState);
108    }
109
110<var_type>"i16" {
111    currType->type = 1;
112    currType->bits = 16;
113    BEGIN(typeNextState);
114    }
115
116<var_type>"i32" {
117    currType->type = 1;
118    currType->bits = 32;
119    BEGIN(typeNextState);
120    }
121
122<var_type>"i64" {
123    currType->type = 1;
124    currType->bits = 64;
125    BEGIN(typeNextState);
126    }
127
128<var_type>"u8" {
129    currType->type = 2;
130    currType->bits = 8;
131    BEGIN(typeNextState);
132    }
133
134<var_type>"u16" {
135    currType->type = 2;
136    currType->bits = 16;
137    BEGIN(typeNextState);
138    }
139
140<var_type>"u32" {
141    currType->type = 2;
142    currType->bits = 32;
143    BEGIN(typeNextState);
144    }
145
146<var_type>"u64" {
147    currType->type = 2;
148    currType->bits = 64;
149    BEGIN(typeNextState);
150    }
151
152<var_type>"f" {
153    currType->type = 3;
154    currType->bits = 32;
155    BEGIN(typeNextState);
156    }
157
158<var_type>"d" {
159    currType->type = 3;
160    currType->bits = 64;
161    BEGIN(typeNextState);
162    }
163
164<var_type>{ID} {
165    currType->type = 4;
166    currType->bits = 32;
167    memcpy(currType->typeName, yytext, yyleng);
168    BEGIN(typeNextState);
169    }
170
171<api_entry_param>"*" {
172    currType->ptrLevel ++;
173    }
174
175<api_entry_param>{ID} {
176    memcpy(currType->name, yytext, yyleng);
177    checkPointerType();
178    BEGIN(api_entry2);
179    }
180
181<api_entry2>"*" {
182    currType->ptrLevel ++;
183    }
184
185<api_entry2>"}" {
186    apiCount++;
187    BEGIN(INITIAL);
188    }
189
190
191%%
192
193
194int yywrap()
195{
196    return 1;
197}
198
199