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