]> git.draconx.ca Git - cdecl99.git/blobdiff - src/scan.l
libcdecl: Fix scanning of hexadecimal constants.
[cdecl99.git] / src / scan.l
index 29dd33da4374060ea6a9428e7e297a34e0ee6190..fbe80b2fddae12cc5076a9a0e108497d0b28d7ff 100644 (file)
 #define STRTOUMAX strtoul
 #endif
 
-#define dup_token() do { \
-       yylval->strval = malloc(yyleng+1); \
-       if (!yylval->strval) { \
-               cdecl__errmsg(CDECL__ENOMEM); \
-               return T_LEX_ERROR; \
-       } \
-       memcpy(yylval->strval, yytext, yyleng); \
-       yylval->strval[yyleng] = 0; \
-} while(0)
-
 static char *to_octal(char *dst, unsigned val)
 {
        unsigned i;
@@ -121,7 +111,7 @@ static void to_readable_ch(char *dst, char c)
 %}
 
 IDENT [_[:alpha:]][-_[:alnum:]]*
-INTEGER 0x[[:xdigit:]]+|0[0-7]+|[[:digit:]]+
+INTEGER 0[Xx][[:xdigit:]]*|[[:digit:]]+
 
 %%
 
@@ -167,9 +157,10 @@ INTEGER 0x[[:xdigit:]]+|0[0-7]+|[[:digit:]]+
 }
 
 {IDENT} {
-       unsigned x = cdecl__to_keyword(yytext, yyleng, yyextra);
-       int tok;
+       int len = yyleng, tok;
+       unsigned x;
 
+       x = cdecl__to_keyword(yytext, len, yyextra);
        yylval->spectype = UNPACK_SPEC(x & 0xff);
        if ((tok = (x >> 8)) == PACK_TOKEN(T_IDENT)) {
                /*
@@ -183,12 +174,14 @@ INTEGER 0x[[:xdigit:]]+|0[0-7]+|[[:digit:]]+
                 * downsides.
                 */
 #if 1
-               if ((c = strchr(yytext, '-')))
+               if ((c = memchr(yytext, '-', len)))
                        goto invalid_char;
 #else
                yyless(strcspn(yytext, "-"));
 #endif
-               dup_token();
+               if (!(yylval->item = cdecl__alloc_item(len+1)))
+                       return T_LEX_ERROR; \
+               memcpy(yylval->item->s, yytext, len+1);
        }
        return UNPACK_TOKEN(tok);
 }