static int lFloatConst(int ch, int len, yystypepp * yylvalpp) { int alreadyComplained = 0; assert((ch == '.') || (ch == 'e') || (ch == 'E')); if (ch == '.') { do { APPEND_CHAR_S(ch, yylvalpp->symbol_name, len, MAX_SYMBOL_NAME_LEN); ch = cpp->currentInput->getch(cpp->currentInput, yylvalpp); } while (ch >= '0' && ch <= '9'); } // Exponent: if (ch == 'e' || ch == 'E') { APPEND_CHAR_S(ch, yylvalpp->symbol_name, len, MAX_SYMBOL_NAME_LEN); ch = cpp->currentInput->getch(cpp->currentInput, yylvalpp); if (ch == '+') { APPEND_CHAR_S(ch, yylvalpp->symbol_name, len, MAX_SYMBOL_NAME_LEN); ch = cpp->currentInput->getch(cpp->currentInput, yylvalpp); } else if (ch == '-') { APPEND_CHAR_S(ch, yylvalpp->symbol_name, len, MAX_SYMBOL_NAME_LEN); ch = cpp->currentInput->getch(cpp->currentInput, yylvalpp); } if (ch >= '0' && ch <= '9') { while (ch >= '0' && ch <= '9') { APPEND_CHAR_S(ch, yylvalpp->symbol_name, len, MAX_SYMBOL_NAME_LEN); ch = cpp->currentInput->getch(cpp->currentInput, yylvalpp); } } else { CPPErrorToInfoLog("EXPONENT INVALID"); } } cpp->currentInput->ungetch(cpp->currentInput, ch, yylvalpp); assert(len <= MAX_SYMBOL_NAME_LEN); yylvalpp->symbol_name[len] = '\0'; yylvalpp->sc_fval = (float) atof_dot(yylvalpp->symbol_name); if (isinff(yylvalpp->sc_fval)) { CPPErrorToInfoLog("FLOAT CONSTANT OVERFLOW"); } return CPP_FLOATCONSTANT; } // lFloatConst
int ReadToken(TokenStream *pTok, yystypepp * yylvalpp) { char symbol_name[MAX_SYMBOL_NAME_LEN + 1]; char string_val[MAX_STRING_LEN + 1]; int ltoken, len; char ch; ltoken = lReadByte(pTok); if (ltoken >= 0) { if (ltoken > 127) ltoken += 128; switch (ltoken) { case CPP_IDENTIFIER: case CPP_TYPEIDENTIFIER: len = 0; ch = lReadByte(pTok); while ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || (ch >= '0' && ch <= '9') || ch == '_') { if (len < MAX_SYMBOL_NAME_LEN) { symbol_name[len++] = ch; ch = lReadByte(pTok); } } symbol_name[len] = '\0'; assert(ch == '\0'); yylvalpp->sc_ident = LookUpAddString(atable, symbol_name); return CPP_IDENTIFIER; break; case CPP_STRCONSTANT: len = 0; while ((ch = lReadByte(pTok)) != 0) if (len < MAX_STRING_LEN) string_val[len++] = ch; string_val[len] = '\0'; yylvalpp->sc_ident = LookUpAddString(atable, string_val); break; case CPP_FLOATCONSTANT: len = 0; ch = lReadByte(pTok); while ((ch >= '0' && ch <= '9')||(ch=='e'||ch=='E'||ch=='.')||(ch=='+'||ch=='-')) { if (len < MAX_SYMBOL_NAME_LEN) { symbol_name[len++] = ch; ch = lReadByte(pTok); } } symbol_name[len] = '\0'; assert(ch == '\0'); strcpy(yylvalpp->symbol_name,symbol_name); yylvalpp->sc_fval=(float)atof_dot(yylvalpp->symbol_name); break; case CPP_INTCONSTANT: len = 0; ch = lReadByte(pTok); while ((ch >= '0' && ch <= '9')) { if (len < MAX_SYMBOL_NAME_LEN) { symbol_name[len++] = ch; ch = lReadByte(pTok); } } symbol_name[len] = '\0'; assert(ch == '\0'); strcpy(yylvalpp->symbol_name,symbol_name); yylvalpp->sc_int=atoi(yylvalpp->symbol_name); break; case '(': yylvalpp->sc_int = lReadByte(pTok); break; } return ltoken; } return EOF_SY; } // ReadToken
int ReadToken(TokenStream *pTok, yystypepp * yylvalpp) { char symbol_name[MAX_SYMBOL_NAME_LEN + 1]; char string_val[MAX_STRING_LEN + 1]; int ltoken, len; char ch; int base, accum; char ch_val; ltoken = lReadByte(pTok); if (ltoken >= 0) { if (ltoken > 127) ltoken += 128; switch (ltoken) { case CPP_IDENTIFIER: case CPP_TYPEIDENTIFIER: len = 0; ch = lReadByte(pTok); while ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || (ch >= '0' && ch <= '9') || ch == '_') { if (len < MAX_SYMBOL_NAME_LEN) { symbol_name[len++] = ch; ch = lReadByte(pTok); } } symbol_name[len] = '\0'; assert(ch == '\0'); yylvalpp->sc_ident = LookUpAddString(atable, symbol_name); return CPP_IDENTIFIER; break; case CPP_STRCONSTANT: len = 0; while ((ch = lReadByte(pTok)) != 0) if (len < MAX_STRING_LEN) string_val[len++] = ch; string_val[len] = '\0'; yylvalpp->sc_ident = LookUpAddString(atable, string_val); break; case CPP_FLOATCONSTANT: len = 0; ch = lReadByte(pTok); while ((ch >= '0' && ch <= '9')||(ch=='e'||ch=='E'||ch=='.')||(ch=='+'||ch=='-')) { if (len < MAX_SYMBOL_NAME_LEN) { symbol_name[len++] = ch; ch = lReadByte(pTok); } } symbol_name[len] = '\0'; assert(ch == '\0'); strcpy(yylvalpp->symbol_name,symbol_name); yylvalpp->sc_fval=(float)atof_dot(yylvalpp->symbol_name); break; case CPP_INTCONSTANT: len = 0; accum = 0; ch = lReadByte(pTok); if (ch == '0') { symbol_name[len++] = ch; ch = lReadByte(pTok); if (ch == 'x' || ch == 'X') { symbol_name[len++] = ch; base = 16; ch = lReadByte(pTok); } else { base = 8; } } else { base = 10; } while (len < MAX_SYMBOL_NAME_LEN) { ch_val = -1; if (isdigit(ch)) ch_val = ch - '0'; else if (isxdigit(ch)) ch_val = tolower(ch) - 'a' + 10; if (ch_val < 0 || ch_val >= base) break; symbol_name[len++] = ch; accum = accum * base + ch_val; ch = lReadByte(pTok); } symbol_name[len] = '\0'; assert(ch == '\0'); strcpy(yylvalpp->symbol_name, symbol_name); yylvalpp->sc_int = accum; break; case '(': yylvalpp->sc_int = lReadByte(pTok); break; } return ltoken; } return EOF_SY; } // ReadToken