diff --git a/examples/cat.scm b/examples/cat.scm new file mode 100644 index 00000000..9a75c6d0 --- /dev/null +++ b/examples/cat.scm @@ -0,0 +1,21 @@ +(import (scheme base) + (scheme file) + (scheme write)) + +(define (cat fname) + (call-with-input-file + fname + (lambda (fp) + (define (loop) + (let ((s (read-line fp))) + (cond + ((not (eof-object? s)) + (display s) + ;(newline) + (loop))))) + (loop)))) + +(cat + "cyclone.scm" + ;"scheme/base.sld" +) diff --git a/runtime.c b/runtime.c index bf5a9735..9e080dec 100644 --- a/runtime.c +++ b/runtime.c @@ -2415,22 +2415,21 @@ object Cyc_io_read_line(void *data, object cont, object port) { FILE *stream = ((port_type *) port)->fp; char buf[1024]; - int i = 0, c; + //int i = 0, c; set_thread_blocked(data, cont); - while (1) { - c = fgetc(stream); - if (c == EOF && i == 0) { + errno = 0; + if (fgets(buf, 1023, stream) != NULL) { + make_string(s, buf); + return_thread_runnable(data, &s); + } else { + if (feof(stream)) { + return_thread_runnable(data, Cyc_EOF); + } else { + // TODO: can't do this because we said thread could be blocked + //Cyc_rt_raise2(data, "Error reading from file: ", obj_int2obj(errno)); return_thread_runnable(data, Cyc_EOF); - } else if (c == EOF || i == 1023 || c == '\n') { - buf[i] = '\0'; - { - make_string(s, buf); - return_thread_runnable(data, &s); - } } - - buf[i++] = c; } return NULL; }