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