From 8fa6ecf7bf72afbe439e34df1fc129319bb71844 Mon Sep 17 00:00:00 2001 From: Justin Ethier Date: Mon, 22 Jun 2015 22:02:45 -0400 Subject: [PATCH] Added close-port and close-output-port --- cgen.scm | 2 ++ eval.scm | 2 ++ runtime.c | 17 ++++++++++++++--- runtime.h | 4 ++++ transforms.scm | 4 ++++ 5 files changed, 26 insertions(+), 3 deletions(-) diff --git a/cgen.scm b/cgen.scm index aa125cfa..3c9074d3 100644 --- a/cgen.scm +++ b/cgen.scm @@ -441,7 +441,9 @@ ((eq? p 'Cyc-default-exception-handler) "Cyc_default_exception_handler") ((eq? p 'Cyc-current-exception-handler) "Cyc_current_exception_handler") ((eq? p 'open-input-file) "Cyc_io_open_input_file") + ((eq? p 'close-port) "Cyc_io_close_port") ((eq? p 'close-input-port) "Cyc_io_close_input_port") + ((eq? p 'close-output-port) "Cyc_io_close_output_port") ((eq? p 'read-char) "Cyc_io_read_char") ((eq? p 'peek-char) "Cyc_io_peek_char") ((eq? p 'Cyc-display) "Cyc_display_va") diff --git a/eval.scm b/eval.scm index 2ac7fc9c..5656eecf 100644 --- a/eval.scm +++ b/eval.scm @@ -286,7 +286,9 @@ (list 'string? string?) (list 'symbol? symbol?) (list 'open-input-file open-input-file) + (list 'close-port close-port) (list 'close-input-port close-input-port) + (list 'close-output-port close-output-port) (list 'read-char read-char) (list 'peek-char peek-char) (list 'Cyc-write-char Cyc-write-char) diff --git a/runtime.c b/runtime.c index c82f96d2..865f0e87 100644 --- a/runtime.c +++ b/runtime.c @@ -1002,10 +1002,13 @@ port_type Cyc_io_open_input_file(object str) { return p; } -TODO: Cyc_io_close_port -TODO: close-input-port can be written in scheme code, I think, using input-port? and close-port - object Cyc_io_close_input_port(object port) { + return Cyc_io_close_port(port); } + +object Cyc_io_close_output_port(object port) { + return Cyc_io_close_port(port); } + +object Cyc_io_close_port(object port) { if (port && type_of(port) == port_tag) { FILE *stream = ((port_type *)port)->fp; if (stream) fclose(stream); @@ -1283,8 +1286,12 @@ void _number_91_125string(object cont, object args) { void _open_91input_91file(object cont, object args) { port_type p = Cyc_io_open_input_file(car(args)); return_funcall1(cont, &p);} +void _close_91port(object cont, object args) { + return_funcall1(cont, Cyc_io_close_port(car(args)));} void _close_91input_91port(object cont, object args) { return_funcall1(cont, Cyc_io_close_input_port(car(args)));} +void _close_91output_91port(object cont, object args) { + return_funcall1(cont, Cyc_io_close_output_port(car(args)));} void _read_91char(object cont, object args) { return_funcall1(cont, Cyc_io_read_char(car(args)));} void _peek_91char(object cont, object args) { @@ -1977,7 +1984,9 @@ static primitive_type vector_127_primitive = {primitive_tag, "vector?", &_vector static primitive_type string_127_primitive = {primitive_tag, "string?", &_string_127}; static primitive_type symbol_127_primitive = {primitive_tag, "symbol?", &_symbol_127}; static primitive_type open_91input_91file_primitive = {primitive_tag, "open-input-file", &_open_91input_91file}; +static primitive_type close_91port_primitive = {primitive_tag, "close-port", &_close_91port}; static primitive_type close_91input_91port_primitive = {primitive_tag, "close-input-port", &_close_91input_91port}; +static primitive_type close_91output_91port_primitive = {primitive_tag, "close-output-port", &_close_91output_91port}; 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_91write_primitive = {primitive_tag, "Cyc-write", &_Cyc_91write}; @@ -2081,7 +2090,9 @@ const object primitive_port_127 = &port_127_primitive; const object primitive_vector_127 = &vector_127_primitive; const object primitive_symbol_127 = &symbol_127_primitive; const object primitive_open_91input_91file = &open_91input_91file_primitive; +const object primitive_close_91port = &close_91port_primitive; const object primitive_close_91input_91port = &close_91input_91port_primitive; +const object primitive_close_91output_91port = &close_91output_91port_primitive; const object primitive_read_91char = &read_91char_primitive; const object primitive_peek_91char = &peek_91char_primitive; const object primitive_Cyc_91write_91char = &Cyc_91write_91char_primitive; diff --git a/runtime.h b/runtime.h index daf08bb4..e8831e61 100644 --- a/runtime.h +++ b/runtime.h @@ -109,7 +109,9 @@ port_type Cyc_stdout(void); port_type Cyc_stdin(void); port_type Cyc_stderr(void); port_type Cyc_io_open_input_file(object str); +object Cyc_io_close_port(object port); object Cyc_io_close_input_port(object port); +object Cyc_io_close_output_port(object port); object Cyc_io_read_char(object port); object Cyc_io_peek_char(object port); @@ -324,7 +326,9 @@ extern const object primitive_vector_127; extern const object primitive_string_127; extern const object primitive_symbol_127; extern const object primitive_open_91input_91file; +extern const object primitive_close_91port; extern const object primitive_close_91input_91port; +extern const object primitive_close_91output_91port; extern const object primitive_read_91char; extern const object primitive_peek_91char; extern const object primitive_Cyc_91write_91char; diff --git a/transforms.scm b/transforms.scm index 2dff8800..d0fdfc73 100644 --- a/transforms.scm +++ b/transforms.scm @@ -554,7 +554,9 @@ string? symbol? open-input-file + close-port close-input-port + close-output-port read-char peek-char Cyc-write-char @@ -594,7 +596,9 @@ Cyc-stdin Cyc-stderr open-input-file + close-port close-input-port + close-output-port read-char peek-char Cyc-write-char