core: read_string: Allow for gc.

* src/posix.c (read_char): Add optional port parameter.
(read_string): Allow for gc.
This commit is contained in:
Jan Nieuwenhuizen 2018-11-11 10:17:50 +01:00
parent 280b763ae8
commit b85db01e9b
No known key found for this signature in database
GPG Key ID: F3C1A0D9C1D65273
1 changed files with 17 additions and 8 deletions

View File

@ -93,9 +93,14 @@ peek_char ()
} }
SCM 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 SCM
@ -118,15 +123,19 @@ read_string (SCM port) ///((arity . n))
int fd = g_stdin; int fd = g_stdin;
if (TYPE (port) == TPAIR && TYPE (car (port)) == TNUMBER) if (TYPE (port) == TPAIR && TYPE (car (port)) == TNUMBER)
g_stdin = VALUE (CAR (port)); g_stdin = VALUE (CAR (port));
SCM lst = cell_nil; gc_push_frame ();
SCM c = read_char (); r0 = cell_nil;
while (VALUE (c) != -1) r1 = read_char (cell_nil);
while (VALUE (r1) != -1)
{ {
lst = append2 (lst, cons (c, cell_nil)); r0 = cons (r1, r0);
c = read_char (); r1 = read_char (cell_nil);
gc_check ();
} }
g_stdin = fd; g_stdin = fd;
return MAKE_STRING (lst); SCM lst = MAKE_STRING (reverse_x_ (r0, cell_nil));
gc_pop_frame ();
return lst;
} }
SCM SCM