diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2017-07-30 18:02:07 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2017-07-30 18:02:07 -0700 |
commit | 2a34151bbebd256a7c3a84c663a39142299461f2 (patch) | |
tree | 23058ad6699a8f5fd2e7448a3a84040f20badc53 | |
parent | 884d2f5cd3b0afa0a9119ce3dd5e6b1d533f1836 (diff) | |
download | txr-2a34151bbebd256a7c3a84c663a39142299461f2.tar.gz txr-2a34151bbebd256a7c3a84c663a39142299461f2.tar.bz2 txr-2a34151bbebd256a7c3a84c663a39142299461f2.zip |
listener: handle incomplete buf literals.
* parser.c (is_balanced_line): Handle #b'...' syntax with some
new states and transitions.
-rw-r--r-- | parser.c | 24 |
1 files changed, 23 insertions, 1 deletions
@@ -933,7 +933,8 @@ static int is_balanced_line(const char *line, void *ctx) { enum state { ST_START, ST_CMNT, ST_PAR, ST_BKT, ST_BRC, ST_HASH, - ST_LIT, ST_QLIT, ST_RGX, ST_CHR, ST_ESC, ST_AT + ST_LIT, ST_QLIT, ST_RGX, ST_CHR, ST_ESC, ST_AT, + ST_HASH_B, ST_BUF }; int count[32], sp = 0; enum state state[32]; @@ -1007,6 +1008,9 @@ static int is_balanced_line(const char *line, void *ctx) case '/': state[sp] = ST_RGX; break; + case 'b': + state[sp] = ST_HASH_B; + break; case ';': --sp; break; @@ -1069,6 +1073,24 @@ static int is_balanced_line(const char *line, void *ctx) sp--; break; } + break; + case ST_HASH_B: + switch (ch) { + case '\'': + state[sp] = ST_BUF; + break; + default: + sp--; + break; + } + break; + case ST_BUF: + switch (ch) { + case '\'': + sp--; + break; + } + break; } } |