/* unescape a character from an octal character constant */ unsigned char LexUnEscapeCharacterConstant(const char **From, const char *End, unsigned char FirstChar, int Base) { unsigned char Total = GET_BASE_DIGIT(FirstChar); int CCount; for (CCount = 0; IS_BASE_DIGIT(**From, Base) && CCount < 2; CCount++, (*From)++) Total = Total * Base + GET_BASE_DIGIT(**From); return Total; }
/* get a numeric literal - used while scanning */ enum LexToken LexGetNumber(struct LexState *Lexer, struct Value *Value) { int Result = 0; int Base = 10; enum LexToken ResultToken; #ifndef NO_FP double FPResult; double FPDiv; #endif if (*Lexer->Pos == '0') { /* a binary, octal or hex literal */ LEXER_INC(Lexer); if (Lexer->Pos != Lexer->End) { if (*Lexer->Pos == 'x' || *Lexer->Pos == 'X') { Base = 16; LEXER_INC(Lexer); } else if (*Lexer->Pos == 'b' || *Lexer->Pos == 'B') { Base = 2; LEXER_INC(Lexer); } else if (*Lexer->Pos != '.') Base = 8; } } /* get the value */ for (; Lexer->Pos != Lexer->End && IS_BASE_DIGIT(*Lexer->Pos, Base); LEXER_INC(Lexer)) Result = Result * Base + GET_BASE_DIGIT(*Lexer->Pos); if (Result >= 0 && Result <= MAX_CHAR_VALUE) { Value->Typ = &CharType; Value->Val->Character = Result; ResultToken = TokenCharacterConstant; } else { Value->Typ = &IntType; Value->Val->Integer = Result; ResultToken = TokenIntegerConstant; } if (Lexer->Pos == Lexer->End) return ResultToken; if (*Lexer->Pos == 'l' || *Lexer->Pos == 'L') { LEXER_INC(Lexer); return ResultToken; } #ifndef NO_FP if (Lexer->Pos == Lexer->End || *Lexer->Pos != '.') return ResultToken; Value->Typ = &FPType; LEXER_INC(Lexer); for (FPDiv = 1.0/Base, FPResult = (double)Result; Lexer->Pos != Lexer->End && IS_BASE_DIGIT(*Lexer->Pos, Base); LEXER_INC(Lexer), FPDiv /= (double)Base) FPResult += GET_BASE_DIGIT(*Lexer->Pos) * FPDiv; if (Lexer->Pos != Lexer->End && (*Lexer->Pos == 'e' || *Lexer->Pos == 'E')) { double ExponentMultiplier = 1.0; LEXER_INC(Lexer); if (Lexer->Pos != Lexer->End && *Lexer->Pos == '-') { ExponentMultiplier = -1.0; LEXER_INC(Lexer); } for (Result = 0; Lexer->Pos != Lexer->End && IS_BASE_DIGIT(*Lexer->Pos, Base); LEXER_INC(Lexer)) Result = Result * (double)Base + GET_BASE_DIGIT(*Lexer->Pos); FPResult *= pow((double)Base, (double)Result * ExponentMultiplier); } Value->Val->FP = FPResult; return TokenFPConstant; #else return ResultToken; #endif }
/* get a numeric literal - used while scanning */ enum LexToken LexGetNumber(Picoc *pc, struct LexState *Lexer, struct Value *Value) { long Result = 0; long Base = 10; enum LexToken ResultToken; #ifndef NO_FP double FPResult; double FPDiv; #endif /* long/unsigned flags */ #if 0 /* unused for now */ char IsLong = 0; char IsUnsigned = 0; #endif if (*Lexer->Pos == '0') { /* a binary, octal or hex literal */ LEXER_INC(Lexer); if (Lexer->Pos != Lexer->End) { if (*Lexer->Pos == 'x' || *Lexer->Pos == 'X') { Base = 16; LEXER_INC(Lexer); } else if (*Lexer->Pos == 'b' || *Lexer->Pos == 'B') { Base = 2; LEXER_INC(Lexer); } else if (*Lexer->Pos != '.') Base = 8; } } /* get the value */ for (; Lexer->Pos != Lexer->End && IS_BASE_DIGIT(*Lexer->Pos, Base); LEXER_INC(Lexer)) Result = Result * Base + GET_BASE_DIGIT(*Lexer->Pos); if (*Lexer->Pos == 'u' || *Lexer->Pos == 'U') { LEXER_INC(Lexer); /* IsUnsigned = 1; */ } if (*Lexer->Pos == 'l' || *Lexer->Pos == 'L') { LEXER_INC(Lexer); /* IsLong = 1; */ } Value->Typ = &pc->LongType; /* ignored? */ Value->Val->LongInteger = Result; ResultToken = TokenIntegerConstant; if (Lexer->Pos == Lexer->End) return ResultToken; #ifndef NO_FP if (Lexer->Pos == Lexer->End) { return ResultToken; } if (*Lexer->Pos != '.' && *Lexer->Pos != 'e' && *Lexer->Pos != 'E') { return ResultToken; } Value->Typ = &pc->FPType; FPResult = (double)Result; if (*Lexer->Pos == '.') { LEXER_INC(Lexer); for (FPDiv = 1.0/Base; Lexer->Pos != Lexer->End && IS_BASE_DIGIT(*Lexer->Pos, Base); LEXER_INC(Lexer), FPDiv /= (double)Base) { FPResult += GET_BASE_DIGIT(*Lexer->Pos) * FPDiv; } } if (Lexer->Pos != Lexer->End && (*Lexer->Pos == 'e' || *Lexer->Pos == 'E')) { int ExponentSign = 1; LEXER_INC(Lexer); if (Lexer->Pos != Lexer->End && *Lexer->Pos == '-') { ExponentSign = -1; LEXER_INC(Lexer); } Result = 0; while (Lexer->Pos != Lexer->End && IS_BASE_DIGIT(*Lexer->Pos, Base)) { Result = Result * Base + GET_BASE_DIGIT(*Lexer->Pos); LEXER_INC(Lexer); } FPResult *= pow((double)Base, (double)Result * ExponentSign); } Value->Val->FP = FPResult; if (*Lexer->Pos == 'f' || *Lexer->Pos == 'F') LEXER_INC(Lexer); return TokenFPConstant; #else return ResultToken; #endif }