summaryrefslogtreecommitdiffstats
path: root/regex.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2016-04-20 06:30:36 -0700
committerKaz Kylheku <kaz@kylheku.com>2016-04-20 06:30:36 -0700
commit814b1a284fc22feb9444f2195a36c57cbacd84aa (patch)
tree2d452a5528667d95f7bb71a99d4b84a490f0836e /regex.c
parentc636a168cd57ca5db253db7a0907f06621a6991e (diff)
downloadtxr-814b1a284fc22feb9444f2195a36c57cbacd84aa.tar.gz
txr-814b1a284fc22feb9444f2195a36c57cbacd84aa.tar.bz2
txr-814b1a284fc22feb9444f2195a36c57cbacd84aa.zip
Recycle conses in unget-char and read-until-match.
* regex.c (ead_until_match): Use rcyc_pop instead of pop to move the conses to the recycle list. We know these are not shared with anything. Adding additional logic to completely recycle the stack. * socket.c (dgram_get_char): Use rcyc_pop to get the character from the push-back list. * stream.c (stdio_get_char): Likewise.
Diffstat (limited to 'regex.c')
-rw-r--r--regex.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/regex.c b/regex.c
index e8de118c..faf38965 100644
--- a/regex.c
+++ b/regex.c
@@ -2554,7 +2554,7 @@ val read_until_match(val regex, val stream_in, val include_match_in)
goto out_match;
while (stack)
- unget_char(pop(&stack), stream);
+ unget_char(rcyc_pop(&stack), stream);
ch = get_char(stream);
@@ -2580,14 +2580,18 @@ val read_until_match(val regex, val stream_in, val include_match_in)
if (nil) {
out_match:
while (stack != match)
- unget_char(pop(&stack), stream);
+ unget_char(rcyc_pop(&stack), stream);
if (!out)
out = null_string;
if (include_match)
- out = cat_str(cons(out, nreverse(stack)), nil);
+ out = cat_str(cons(out, stack = nreverse(stack)), nil);
}
regex_machine_cleanup(&regm);
+
+ while (stack)
+ rcyc_pop(&stack);
+
return out;
}