improvements to number lexing
authorMatthias Braun <matze@braunis.de>
Wed, 21 Nov 2007 00:13:26 +0000 (00:13 +0000)
committerMatthias Braun <matze@braunis.de>
Wed, 21 Nov 2007 00:13:26 +0000 (00:13 +0000)
[r18502]

lexer.c
token.c
token_t.h

diff --git a/lexer.c b/lexer.c
index 02149fd..de2cac8 100644 (file)
--- a/lexer.c
+++ b/lexer.c
@@ -321,15 +321,12 @@ static void parse_number_hex(void)
        }
 
        char *endptr;
-       int value = strtol(string, &endptr, 16);
+       lexer_token.type       = T_INTEGER;
+       lexer_token.v.intvalue = strtoll(string, &endptr, 16);
        if(*endptr != '\0') {
                parse_error("hex number literal too long");
        }
 
-       lexer_token.type       = T_INTEGER;
-       lexer_token.v.intvalue = value;
-
-       parse_integer_suffix();
        obstack_free(&symbol_obstack, string);
 }
 
@@ -348,16 +345,14 @@ static void parse_number_oct(void)
        char *string = obstack_finish(&symbol_obstack);
 
        char *endptr;
-       int value = strtol(string, &endptr, 8);
+       lexer_token.type       = T_INTEGER;
+       lexer_token.v.intvalue = strtoll(string, &endptr, 8);
        if(*endptr != '\0') {
                parse_error("octal number literal too long");
        }
 
-       lexer_token.type       = T_INTEGER;
-       lexer_token.v.intvalue = value;
-
-       parse_integer_suffix();
        obstack_free(&symbol_obstack, string);
+       parse_integer_suffix();
 }
 
 static void parse_number_dec(void)
@@ -400,7 +395,7 @@ static void parse_number_dec(void)
        char *endptr;
        if(is_float) {
                lexer_token.type         = T_FLOATINGPOINT;
-               lexer_token.v.floatvalue = strtod(string, &endptr);
+               lexer_token.v.floatvalue = strtold(string, &endptr);
 
                if(*endptr != '\0') {
                        parse_error("invalid number literal");
@@ -409,7 +404,7 @@ static void parse_number_dec(void)
                parse_floating_suffix();
        } else {
                lexer_token.type       = T_INTEGER;
-               lexer_token.v.intvalue = strtol(string, &endptr, 10);
+               lexer_token.v.intvalue = strtoll(string, &endptr, 10);
 
                if(*endptr != '\0') {
                        parse_error("invalid number literal");
diff --git a/token.c b/token.c
index 15cc4bb..99c871c 100644 (file)
--- a/token.c
+++ b/token.c
@@ -82,10 +82,10 @@ void print_token(FILE *f, const token_t *token)
                fprintf(f, "symbol '%s'", token->v.symbol->string);
                break;
        case T_INTEGER:
-               fprintf(f, "integer number %d", token->v.intvalue);
+               fprintf(f, "integer number %lld", token->v.intvalue);
                break;
        case T_FLOATINGPOINT:
-               fprintf(f, "floatingpointer number %f", token->v.floatvalue);
+               fprintf(f, "floatingpointer number %LF", token->v.floatvalue);
                break;
        case T_STRING_LITERAL:
                fprintf(f, "string '%s'", token->v.string);
index 27832f8..0cc82d3 100644 (file)
--- a/token_t.h
+++ b/token_t.h
@@ -34,8 +34,8 @@ typedef struct {
        int type;
        union {
                symbol_t   *symbol;
-               int         intvalue;
-               double      floatvalue;
+               long long   intvalue;
+               long double floatvalue;
                const char *string;
        } v;
        source_position_t  source_position;