10f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines%option stack
20f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
30f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines%x comment
40f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines%x api_entry
50f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines%x api_entry2
60f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines%x api_entry_param
70f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines%x var_type
80f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
90f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen HinesDIGIT    [0-9]
100f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen HinesID       [a-zA-Z_][a-zA-Z0-9_]*
110f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
120f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    #include "spec.h"
130f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
140f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines   int num_lines = 0;
150f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
160f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines   VarType *currType = 0;
170f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
180f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines   ApiEntry apis[128];
190f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines   int apiCount = 0;
200f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
210f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines   int typeNextState;
220f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
230f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines   void checkPointerType() {
240f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines       VarType *baseType = currType;
250f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines       int curPtrLevel = 0;
260f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines       while (curPtrLevel < baseType->ptrLevel) {
270f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines           currType = &apis[apiCount].params[apis[apiCount].paramCount];
280f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines           currType->type = 4;
290f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines           currType->ptrLevel = curPtrLevel;
300f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines           if (currType->ptrLevel > 0) {
310f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines              currType->isConst = 1;
320f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines           }
330f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines           sprintf(currType->typeName, "%s", "size_t");
340f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines           switch(baseType->ptrLevel - curPtrLevel) {
350f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines           case 1:
360f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines              sprintf(currType->name, "%s_length", baseType->name);
370f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines              break;
380f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines           case 2:
390f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines              sprintf(currType->name, "%s_length_length", baseType->name);
400f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines              break;
410f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines           }
420f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines           apis[apiCount].paramCount++;
430f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines           curPtrLevel ++;
440f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines       }
450f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines   }
460f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
470f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines   extern "C" int yylex();
480f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
490f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines%%
500f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
510f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines"/*"         BEGIN(comment);
520f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines<comment>[^*\n]*        /* eat anything that's not a '*' */
530f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines<comment>"*"+[^*/\n]*   /* eat up '*'s not followed by '/'s */
540f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines<comment>\n             ++num_lines;
550f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines<comment>"*"+"/"        BEGIN(INITIAL);
560f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
570f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines<*>" "   //printf("found ' '\n");
580f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines<*>"\t"   //printf("found ' '\n");
590f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines<*>"\n"  ++num_lines; //printf("found lf \n");
600f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
610f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines{ID} {
620f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    memset(&apis[apiCount], 0, sizeof(ApiEntry));
630f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    memcpy(apis[apiCount].name, yytext, yyleng);
640f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    BEGIN(api_entry);
650f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
660f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
670f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines<api_entry>"{" {
680f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    BEGIN(api_entry2);
690f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
700f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
710f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines<api_entry2>"sync" {
720f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    apis[apiCount].sync = 1;
730f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
740f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
750f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines<api_entry2>"handcodeApi" {
760f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    apis[apiCount].handcodeApi = 1;
770f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
780f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
790f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines<api_entry2>"direct" {
800f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    apis[apiCount].direct = 1;
810f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
820f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
830f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines<api_entry2>"nocontext" {
840f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    apis[apiCount].nocontext = 1;
850f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
860f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
870f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines<api_entry2>"ret" {
880f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    currType = &apis[apiCount].ret;
890f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    typeNextState = api_entry2;
900f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    BEGIN(var_type);
910f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
920f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
930f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines<api_entry2>"param" {
940f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    currType = &apis[apiCount].params[apis[apiCount].paramCount];
950f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    apis[apiCount].paramCount++;
960f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    typeNextState = api_entry_param;
970f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    BEGIN(var_type);
980f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
990f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1000f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines<var_type>"const" {
1010f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    currType->isConst = 1;
1020f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
1030f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1040f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines<var_type>"i8" {
1050f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    currType->type = 1;
1060f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    currType->bits = 8;
1070f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    BEGIN(typeNextState);
1080f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
1090f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1100f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines<var_type>"i16" {
1110f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    currType->type = 1;
1120f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    currType->bits = 16;
1130f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    BEGIN(typeNextState);
1140f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
1150f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1160f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines<var_type>"i32" {
1170f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    currType->type = 1;
1180f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    currType->bits = 32;
1190f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    BEGIN(typeNextState);
1200f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
1210f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1220f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines<var_type>"i64" {
1230f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    currType->type = 1;
1240f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    currType->bits = 64;
1250f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    BEGIN(typeNextState);
1260f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
1270f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1280f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines<var_type>"u8" {
1290f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    currType->type = 2;
1300f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    currType->bits = 8;
1310f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    BEGIN(typeNextState);
1320f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
1330f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1340f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines<var_type>"u16" {
1350f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    currType->type = 2;
1360f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    currType->bits = 16;
1370f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    BEGIN(typeNextState);
1380f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
1390f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1400f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines<var_type>"u32" {
1410f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    currType->type = 2;
1420f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    currType->bits = 32;
1430f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    BEGIN(typeNextState);
1440f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
1450f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1460f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines<var_type>"u64" {
1470f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    currType->type = 2;
1480f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    currType->bits = 64;
1490f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    BEGIN(typeNextState);
1500f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
1510f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1520f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines<var_type>"f" {
1530f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    currType->type = 3;
1540f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    currType->bits = 32;
1550f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    BEGIN(typeNextState);
1560f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
1570f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1580f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines<var_type>"d" {
1590f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    currType->type = 3;
1600f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    currType->bits = 64;
1610f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    BEGIN(typeNextState);
1620f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
1630f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1640f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines<var_type>{ID} {
1650f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    currType->type = 4;
1660f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    currType->bits = 32;
1670f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    memcpy(currType->typeName, yytext, yyleng);
1680f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    BEGIN(typeNextState);
1690f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
1700f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1710f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines<api_entry_param>"*" {
1720f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    currType->ptrLevel ++;
1730f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
1740f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1750f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines<api_entry_param>{ID} {
1760f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    memcpy(currType->name, yytext, yyleng);
1770f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    checkPointerType();
1780f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    BEGIN(api_entry2);
1790f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
1800f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1810f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines<api_entry2>"*" {
1820f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    currType->ptrLevel ++;
1830f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
1840f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1850f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines<api_entry2>"}" {
1860f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    apiCount++;
1870f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    BEGIN(INITIAL);
1880f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
1890f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1900f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1910f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines%%
1920f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1930f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1940f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesint yywrap()
1950f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines{
1960f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    return 1;
1970f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
1980f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
199