summaryrefslogtreecommitdiffstats
path: root/parser.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2017-07-30 18:02:07 -0700
committerKaz Kylheku <kaz@kylheku.com>2017-07-30 18:02:07 -0700
commitf82ac2b966bdcaa983e0016190623742c38e39f1 (patch)
tree23058ad6699a8f5fd2e7448a3a84040f20badc53 /parser.c
parentfa1d48fc20a20034cc593c0f9e4544814cf9a81d (diff)
downloadtxr-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.
Diffstat (limited to 'parser.c')
-rw-r--r--parser.c24
1 files changed, 23 insertions, 1 deletions
diff --git a/parser.c b/parser.c
index 3597c0e9..d09e4dea 100644
--- a/parser.c
+++ b/parser.c
@@ -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;
}
}