ref: c6e3c000059d37084d67ec3bde819cbe82299920
parent: b043794874408ea4331d53ba978ad8cb5c0efe4e
author: Roberto E. Vargas Caballero <[email protected]>
date: Sat Oct 5 18:35:59 EDT 2013
Add octal and hexadecimal numbers C support numbers in decimal, octal and hexadecimal. Octal numbers begin with 0, and hexadecimal numbers begin with 0x. This patch adds support for octal and hexadecimal, although it doesn't check the base of the number when insert in the symbol table, so maybe two numbers with different bases are allocated to the same symbol.
--- a/lex.c
+++ b/lex.c
@@ -21,19 +21,49 @@
static char
number(void)
{
- register char *bp;
- register char ch;
+ register char *bp, ch;
+ static char base;
+ if ((ch = getc(yyin)) == '0') {
+ if (toupper(ch = getc(yyin)) == 'X') {
+ base = 16;
+ } else {
+ base = 8;
+ ungetc(ch, yyin);
+ }
+ } else {
+ base = 10;
+ ungetc(ch, yyin);
+ }
+
for (bp = yytext; bp < yytext + IDENTSIZ; *bp++ = ch) {
- if (!isdigit(ch = getc(yyin)))
+ ch = getc(yyin);
+ switch (base) {
+ case 8:
+ if (ch >= '7')
+ goto end;
+ /* passthru */
+ case 10:
+ if (!isdigit(ch))
+ goto end;
break;
+ case 16:
+ if (!isxdigit(ch))
+ goto end;
+ break;
+ }
}
- if (bp == yytext + IDENTSIZ)
+
+end: if (bp == yytext + IDENTSIZ)
error("identifier too long %s", yytext);
*bp = '\0';
ungetc(ch, yyin);
+
+ /*
+ * TODO: insert always. don't depend of the base and check size
+ */
yyval.sym = lookup(yytext, NS_ANY);
- yyval.sym->val = atoi(yytext);
+ yyval.sym->val = strtol(yytext, NULL, base);
return CONSTANT;
}