Browse Source

Remove asserts, replace fixed size lexer_buf.

pre-master-46
Brian Taylor 3 years ago
committed by Holger Vogt
parent
commit
aff20b9db1
  1. 31
      src/frontend/logicexp.c

31
src/frontend/logicexp.c

@ -138,18 +138,19 @@ static void print_sym_tab(SYM_TAB t, BOOL with_addr)
/* End of btree symbol table */ /* End of btree symbol table */
/* Start of lexical scanner */ /* Start of lexical scanner */
#include <assert.h>
#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; typedef struct lexer *LEXER;
struct lexer { struct lexer {
char lexer_buf[LEX_BUF_SZ];
char *lexer_buf;
char *lexer_line; char *lexer_line;
int lexer_pos; int lexer_pos;
int lexer_back; int lexer_back;
SYM_TAB lexer_sym_tab; SYM_TAB lexer_sym_tab;
size_t lexer_blen;
}; };
static LEXER parse_lexer = NULL; static LEXER parse_lexer = NULL;
@ -161,7 +162,9 @@ static LEXER new_lexer(char *line)
lx->lexer_line = TMALLOC(char, (strlen(line) + 1)); lx->lexer_line = TMALLOC(char, (strlen(line) + 1));
strcpy(lx->lexer_line, line); strcpy(lx->lexer_line, line);
lx->lexer_pos = lx->lexer_back = 0; 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; lx->lexer_sym_tab = NULL;
return lx; return lx;
} }
@ -170,6 +173,8 @@ static void delete_lexer(LEXER lx)
{ {
if (!lx) if (!lx)
return; return;
if (lx->lexer_buf)
tfree(lx->lexer_buf);
if (lx->lexer_line) if (lx->lexer_line)
tfree(lx->lexer_line); tfree(lx->lexer_line);
if (lx->lexer_sym_tab) if (lx->lexer_sym_tab)
@ -321,14 +326,22 @@ static int lexer_scan(LEXER lx)
else if (lex_oper(c)) else if (lex_oper(c))
return c; return c;
else if (lex_ident(c)) { else if (lex_ident(c)) {
int i = 0;
size_t i = 0;
while (lex_ident(c)) { 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; lx->lexer_buf[i] = (char) c;
assert(i < LEX_BUF_SZ);
i++; i++;
c = lexer_getchar(lx); 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'; lx->lexer_buf[i] = '\0';
if (c != '\0') if (c != '\0')
lexer_putback(lx); lexer_putback(lx);

Loading…
Cancel
Save