From b85db01e9b6b7ccfbca350fd9da6c48f02d725ab Mon Sep 17 00:00:00 2001 From: Jan Nieuwenhuizen Date: Sun, 11 Nov 2018 10:17:50 +0100 Subject: [PATCH] core: read_string: Allow for gc. * src/posix.c (read_char): Add optional port parameter. (read_string): Allow for gc. --- src/posix.c | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/src/posix.c b/src/posix.c index 6d9a40c0..407d20c6 100644 --- a/src/posix.c +++ b/src/posix.c @@ -93,9 +93,14 @@ peek_char () } SCM -read_char () +read_char (SCM port) ///((arity . n)) { - return MAKE_CHAR (readchar ()); + int fd = g_stdin; + if (TYPE (port) == TPAIR && TYPE (car (port)) == TNUMBER) + g_stdin = VALUE (CAR (port)); + SCM c = MAKE_CHAR (readchar ()); + g_stdin = fd; + return c; } SCM @@ -118,15 +123,19 @@ read_string (SCM port) ///((arity . n)) int fd = g_stdin; if (TYPE (port) == TPAIR && TYPE (car (port)) == TNUMBER) g_stdin = VALUE (CAR (port)); - SCM lst = cell_nil; - SCM c = read_char (); - while (VALUE (c) != -1) + gc_push_frame (); + r0 = cell_nil; + r1 = read_char (cell_nil); + while (VALUE (r1) != -1) { - lst = append2 (lst, cons (c, cell_nil)); - c = read_char (); + r0 = cons (r1, r0); + r1 = read_char (cell_nil); + gc_check (); } g_stdin = fd; - return MAKE_STRING (lst); + SCM lst = MAKE_STRING (reverse_x_ (r0, cell_nil)); + gc_pop_frame (); + return lst; } SCM