summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2014-12-25 11:43:16 -0800
committerKaz Kylheku <kaz@kylheku.com>2014-12-25 11:43:16 -0800
commitfd4bdd5889162d26bf2f195224e6a3c675696f8e (patch)
treeabf3605e7eab57f9b0c059515cf4a57622c2a33a
parent1f9ca760323c55d500876ec765001b43bbef8a53 (diff)
downloadtxr-fd4bdd5889162d26bf2f195224e6a3c675696f8e.tar.gz
txr-fd4bdd5889162d26bf2f195224e6a3c675696f8e.tar.bz2
txr-fd4bdd5889162d26bf2f195224e6a3c675696f8e.zip
* lib.c (simple_lazy_stream_func): Bugfix: close the stream
if get_line returns nil. * stream.c (cat_get_line, cat_get_char, cat_get_byte): The catenated stream read operations close an exhausted stream before popping to the next one. * txr.1: Document closing behavior of catenated streams.
-rw-r--r--ChangeLog11
-rw-r--r--lib.c6
-rw-r--r--stream.c12
-rw-r--r--txr.19
4 files changed, 28 insertions, 10 deletions
diff --git a/ChangeLog b/ChangeLog
index 85b17c1f..4728310a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -7,6 +7,17 @@
* tl.vim, txr.vim: Regenerated.
+2014-12-25 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (simple_lazy_stream_func): Bugfix: close the stream
+ if get_line returns nil.
+
+ * stream.c (cat_get_line, cat_get_char, cat_get_byte): The catenated
+ stream read operations close an exhausted stream before popping
+ to the next one.
+
+ * txr.1: Document closing behavior of catenated streams.
+
2014-12-23 Kaz Kylheku <kaz@kylheku.com>
* eval.c (ap_s, ret_s, aret_s): New symbol variables.
diff --git a/lib.c b/lib.c
index 11cf2f83..dd038866 100644
--- a/lib.c
+++ b/lib.c
@@ -5083,10 +5083,12 @@ toobig:
static val simple_lazy_stream_func(val stream, val lcons)
{
- if (set(mkloc(lcons->lc.car, lcons), get_line(stream)) != nil)
+ if (set(mkloc(lcons->lc.car, lcons), get_line(stream)) != nil) {
set(mkloc(lcons->lc.cdr, lcons), make_lazy_cons(lcons->lc.func));
- else
+ } else {
+ close_stream(stream, t);
lcons->lc.cdr = nil;
+ }
return nil;
}
diff --git a/stream.c b/stream.c
index c4632344..7945e43c 100644
--- a/stream.c
+++ b/stream.c
@@ -2386,9 +2386,11 @@ static val cat_get_line(val stream)
val streams = coerce(val, stream->co.handle);
while (streams) {
- val line = get_line(first(streams));
+ val fs = first(streams);
+ val line = get_line(fs);
if (line)
return line;
+ close_stream(fs, t);
if ((streams = rest(streams)) != nil)
stream->co.handle = coerce(mem_t *, streams);
}
@@ -2401,9 +2403,11 @@ static val cat_get_char(val stream)
val streams = coerce(val, stream->co.handle);
while (streams) {
- val ch = get_char(first(streams));
+ val fs = first(streams);
+ val ch = get_char(fs);
if (ch)
return ch;
+ close_stream(fs, t);
if ((streams = rest(streams)) != nil)
stream->co.handle = coerce(mem_t *, streams);
}
@@ -2416,9 +2420,11 @@ static val cat_get_byte(val stream)
val streams = coerce(val, stream->co.handle);
while (streams) {
- val byte = get_byte(first(streams));
+ val fs = first(streams);
+ val byte = get_byte(fs);
if (byte)
return byte;
+ close_stream(fs, t);
if ((streams = rest(streams)) != nil)
stream->co.handle = coerce(mem_t *, streams);
}
diff --git a/txr.1 b/txr.1
index 318dc5ae..af4e55fe 100644
--- a/txr.1
+++ b/txr.1
@@ -22342,11 +22342,10 @@ or
.code get-line
operation on the head stream yields
.codn nil ,
-and there are more lists in the stream, then the stream is removed from the
-list, and the next stream, if any, becomes the head list. The operation is then
-tried again. If any of these operations fail on the last list, it is not
-removed from the list, so that a stream remains in place which can take
-the
+and there are more lists in the stream, then the stream is closed, removed from
+the list, and the next stream, if any, becomes the head list. The operation is
+then tried again. If any of these operations fail on the last list, it is not
+removed from the list, so that a stream remains in place which can take the
.code unget-char
or
.code unget-byte