#include <config.h>
#include "parse.h"
+
+#define YY_NO_INPUT 1
+#define YY_NO_UNPUT 1
}
%option nodefault noyywrap bison-locations reentrant never-interactive
#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;
%{
char *c;
-
- if (yyextra > 0) {
- yyextra = -yyextra;
- return T_ENGLISH;
- }
%}
"..."|[][;*(),] {
}
{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)) == T_IDENT) {
+ if ((tok = (x >> 8)) == PACK_TOKEN(T_IDENT)) {
/*
* Our IDENT pattern includes hyphens so we can match
* "variable-length" as a keyword. In all other cases a
* 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);
}