diff --git a/src/frontend/logicexp.c b/src/frontend/logicexp.c index f7fae0842..4b4522b17 100644 --- a/src/frontend/logicexp.c +++ b/src/frontend/logicexp.c @@ -138,18 +138,19 @@ static void print_sym_tab(SYM_TAB t, BOOL with_addr) /* End of btree symbol table */ /* Start of lexical scanner */ -#include -#define LEX_ID 256 -#define LEX_OTHER 257 -#define LEX_BUF_SZ 512 +#define LEX_ID 256 +#define LEX_OTHER 257 +#define LEX_BUF_SZ 512 +#define LEX_INIT_SZ 128 typedef struct lexer *LEXER; struct lexer { - char lexer_buf[LEX_BUF_SZ]; + char *lexer_buf; char *lexer_line; int lexer_pos; int lexer_back; SYM_TAB lexer_sym_tab; + size_t lexer_blen; }; static LEXER parse_lexer = NULL; @@ -161,7 +162,9 @@ static LEXER new_lexer(char *line) lx->lexer_line = TMALLOC(char, (strlen(line) + 1)); strcpy(lx->lexer_line, line); lx->lexer_pos = lx->lexer_back = 0; - lx->lexer_buf[0] = '\0'; + lx->lexer_blen = LEX_INIT_SZ; + lx->lexer_buf = TMALLOC(char, lx->lexer_blen); + (void) memset(lx->lexer_buf, 0, lx->lexer_blen); lx->lexer_sym_tab = NULL; return lx; } @@ -170,6 +173,8 @@ static void delete_lexer(LEXER lx) { if (!lx) return; + if (lx->lexer_buf) + tfree(lx->lexer_buf); if (lx->lexer_line) tfree(lx->lexer_line); if (lx->lexer_sym_tab) @@ -321,14 +326,22 @@ static int lexer_scan(LEXER lx) else if (lex_oper(c)) return c; else if (lex_ident(c)) { - int i = 0; + size_t i = 0; while (lex_ident(c)) { + if (i >= lx->lexer_blen) { + lx->lexer_blen *= 2; + lx->lexer_buf = + TREALLOC(char, lx->lexer_buf, lx->lexer_blen); + } lx->lexer_buf[i] = (char) c; - assert(i < LEX_BUF_SZ); i++; c = lexer_getchar(lx); } - assert(i < LEX_BUF_SZ); + if (i >= lx->lexer_blen) { + lx->lexer_blen *= 2; + lx->lexer_buf = + TREALLOC(char, lx->lexer_buf, lx->lexer_blen); + } lx->lexer_buf[i] = '\0'; if (c != '\0') lexer_putback(lx);