From a5acb43cf15dae170c8573ab78e8154d6cba715a Mon Sep 17 00:00:00 2001 From: Justin Ethier Date: Wed, 24 Jun 2015 21:42:14 -0400 Subject: [PATCH] Added (file-exists?) and (delete-file) --- cgen.scm | 2 ++ eval.scm | 2 ++ runtime.c | 26 ++++++++++++++++++++++++++ runtime.h | 4 ++++ transforms.scm | 4 ++++ 5 files changed, 38 insertions(+) diff --git a/cgen.scm b/cgen.scm index 5e790824..58dcfce7 100644 --- a/cgen.scm +++ b/cgen.scm @@ -445,6 +445,8 @@ ((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 'file-exists?) "Cyc_io_file_exists") + ((eq? p 'delete-file) "Cyc_io_delete_file") ((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 3e1aca2e..bb5540fe 100644 --- a/eval.scm +++ b/eval.scm @@ -291,6 +291,8 @@ (list 'close-port close-port) (list 'close-input-port close-input-port) (list 'close-output-port close-output-port) + (list 'file-exists? file-exists?) + (list 'delete-file delete-file) (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 7df97af3..4fc41859 100644 --- a/runtime.c +++ b/runtime.c @@ -1024,6 +1024,24 @@ object Cyc_io_close_port(object port) { return port; } +object Cyc_io_delete_file(object filename) { + const char *fname = ((string_type *)filename)->str; + if (remove(fname) == 0) + return boolean_t; // Success + return boolean_f; +} + +object Cyc_io_file_exists(object filename) { + const char *fname = ((string_type *)filename)->str; + FILE *file; + // Possibly overkill, but portable + if (file = fopen(fname, "r")) { + fclose(file); + return boolean_t; + } + return boolean_f; +} + // TODO: port arg is optional! (maybe handle that in expansion section??) object Cyc_io_read_char(object port) { if (type_of(port) == port_tag) { @@ -1302,6 +1320,10 @@ 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 _file_91exists_127(object cont, object args) { + return_funcall1(cont, Cyc_io_file_exists(car(args)));} +void _delete_91file(object cont, object args) { + return_funcall1(cont, Cyc_io_delete_file(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) { @@ -2001,6 +2023,8 @@ static primitive_type open_91output_91file_primitive = {primitive_tag, "open-out 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 file_91exists_127_primitive = {primitive_tag, "file-exists?", &_file_91exists_127}; +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_91write_primitive = {primitive_tag, "Cyc-write", &_Cyc_91write}; @@ -2108,6 +2132,8 @@ const object primitive_open_91output_91file = &open_91output_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_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_91write_91char = &Cyc_91write_91char_primitive; diff --git a/runtime.h b/runtime.h index 5373dea6..9f583254 100644 --- a/runtime.h +++ b/runtime.h @@ -113,6 +113,8 @@ port_type Cyc_io_open_output_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_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); @@ -331,6 +333,8 @@ extern const object primitive_open_91output_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_file_91exists_127; +extern const object primitive_delete_91file; 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 3751e002..8e754609 100644 --- a/transforms.scm +++ b/transforms.scm @@ -558,6 +558,8 @@ close-port close-input-port close-output-port + file-exists? + delete-file read-char peek-char Cyc-write-char @@ -601,6 +603,8 @@ close-port close-input-port close-output-port + file-exists? + delete-file read-char peek-char Cyc-write-char