diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2019-11-24 11:47:31 -0800 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2019-11-24 11:47:31 -0800 |
commit | 8f9ab607b397678ffbffc4e3a5f063f439312e25 (patch) | |
tree | dbce24615f7892232d18a243f4caef37358a0a3e | |
parent | b769f987e089c4b5312b607f973bfe20e3c14ade (diff) | |
download | txr-8f9ab607b397678ffbffc4e3a5f063f439312e25.tar.gz txr-8f9ab607b397678ffbffc4e3a5f063f439312e25.tar.bz2 txr-8f9ab607b397678ffbffc4e3a5f063f439312e25.zip |
listener: fix buggy balanced line check.
* parser.c (is_balanced_line): When handling the closing
characters, we must look for the state type which matches the
character type, not state[sp]. Of course state[sp] == match,
since we initialized it that way, and so state[sp] != match
is always false. We want match to be derived from the
character ch, not from state[sp]. Also, the polarity in the
match-not-found return case is wrong; we must return 0.
-rw-r--r-- | parser.c | 9 |
1 files changed, 7 insertions, 2 deletions
@@ -1155,12 +1155,17 @@ static int is_balanced_line(const wchar_t *line, void *ctx) break; case ')': case ']': case '}': { - enum state match = state[sp]; + enum state match = 0; + switch (ch) { + case ')': match = ST_PAR; break; + case ']': match = ST_BKT; break; + case '}': match = ST_BRC; break; + } while (sp > 0 && state[sp] != match) sp--; if (state[sp] != match) - return 1; + return 0; if (count[sp] == 0) sp--; else |