core: read_string: Allow for gc.
authorJan Nieuwenhuizen <janneke@gnu.org>
Sun, 11 Nov 2018 09:17:50 +0000 (10:17 +0100)
committerJan Nieuwenhuizen <janneke@gnu.org>
Sun, 11 Nov 2018 09:17:50 +0000 (10:17 +0100)
* src/posix.c (read_char): Add optional port parameter.
(read_string): Allow for gc.

src/posix.c

index 6d9a40c036f8fcd5cfb174e01382d7432b95a23b..407d20c631d67de1a239b25d5820e305d9e3c797 100644 (file)
@@ -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