From ea0e6fa7aec9b338922bbc4a8a4d5fd76e08d0d2 Mon Sep 17 00:00:00 2001 From: Justin Ethier Date: Wed, 29 Jul 2015 22:28:24 -0400 Subject: [PATCH] Added read-line --- include/cyclone/runtime.h | 2 ++ runtime.c | 25 +++++++++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/include/cyclone/runtime.h b/include/cyclone/runtime.h index 658e4221..14116caf 100644 --- a/include/cyclone/runtime.h +++ b/include/cyclone/runtime.h @@ -153,6 +153,7 @@ object Cyc_io_delete_file(object filename); object Cyc_io_file_exists(object filename); object Cyc_io_read_char(object port); object Cyc_io_peek_char(object port); +object Cyc_io_read_line(object cont, object port); object Cyc_is_boolean(object o); object Cyc_is_cons(object o); @@ -363,6 +364,7 @@ extern const object primitive_file_91exists_127; extern const object primitive_delete_91file; extern const object primitive_read_91char; extern const object primitive_peek_91char; +extern const object primtitive_Cyc_91read_91line; extern const object primitive_Cyc_91write_91char; extern const object primitive_Cyc_91write; extern const object primitive_Cyc_91display; diff --git a/runtime.c b/runtime.c index 8669620b..b996d3b3 100644 --- a/runtime.c +++ b/runtime.c @@ -1348,6 +1348,26 @@ object Cyc_io_read_char(object port) { return Cyc_EOF; } +/* TODO: this function needs some work, but approximates what is needed */ +object Cyc_io_read_line(object cont, object port) { + FILE *stream = ((port_type *)port)->fp; + char buf[1024]; + int i = 0, c; + + while (1) { + c = fgetc(stream); + if (c == EOF && i == 0) { + return_funcall1(cont, Cyc_EOF); + } else if (c == EOF || i == 1023 || c == '\n') { + make_string(s, buf); + return_funcall1(cont, &s); + } + + buf[i++] = c; + } + return nil; +} + object Cyc_io_peek_char(object port) { FILE *stream; int c; @@ -1765,6 +1785,9 @@ void _read_91char(object cont, object args) { void _peek_91char(object cont, object args) { Cyc_check_num_args("peek-char", 1, args); return_funcall1(cont, Cyc_io_peek_char(car(args)));} +void _Cyc_91read_91line(object cont, object args) { + Cyc_check_num_args("Cyc-read-line", 1, args); + Cyc_io_read_line(cont, car(args));} void _Cyc_91write_91char(object cont, object args) { Cyc_check_num_args("write-char", 2, args); return_funcall1(cont, Cyc_write_char(car(args), cadr(args)));} @@ -2405,6 +2428,7 @@ static primitive_type file_91exists_127_primitive = {primitive_tag, "file-exists static primitive_type delete_91file_primitive = {primitive_tag, "delete-file", &_delete_91file}; static primitive_type read_91char_primitive = {primitive_tag, "read-char", &_read_91char}; static primitive_type peek_91char_primitive = {primitive_tag, "peek-char", &_peek_91char}; +static primitive_type Cyc_91read_91line_primitive = {primitive_tag, "Cyc-read-line", &_Cyc_91read_91line}; static primitive_type Cyc_91write_primitive = {primitive_tag, "Cyc-write", &_Cyc_91write}; static primitive_type Cyc_91write_91char_primitive = {primitive_tag, "Cyc-write-char", &_Cyc_91write_91char}; static primitive_type Cyc_91display_primitive = {primitive_tag, "Cyc-display", &_display}; @@ -2520,6 +2544,7 @@ const object primitive_file_91exists_127 = &file_91exists_127_primitive; const object primitive_delete_91file = &delete_91file_primitive; const object primitive_read_91char = &read_91char_primitive; const object primitive_peek_91char = &peek_91char_primitive; +const object primitive_Cyc_91read_91line = &Cyc_91read_91line_primitive; const object primitive_Cyc_91write_91char = &Cyc_91write_91char_primitive; const object primitive_Cyc_91write = &Cyc_91write_primitive; const object primitive_Cyc_91display = &Cyc_91display_primitive;