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 | f82ac2b966bdcaa983e0016190623742c38e39f1 (patch) | |
tree | 23058ad6699a8f5fd2e7448a3a84040f20badc53 | |
parent | fa1d48fc20a20034cc593c0f9e4544814cf9a81d (diff) | |
download | txr-f82ac2b966bdcaa983e0016190623742c38e39f1.tar.gz txr-f82ac2b966bdcaa983e0016190623742c38e39f1.tar.bz2 txr-f82ac2b966bdcaa983e0016190623742c38e39f1.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; } } |