From c1ac1323bf9e08d2912196920ddca7ec42f1c24b Mon Sep 17 00:00:00 2001 From: Jesse McDonald Date: Sat, 14 Nov 2009 18:50:35 -0600 Subject: [PATCH] Check for errors when opening program file. Add a debug assertion in the reader to catch bugs like the last one. --- reader.c | 1 + rosella.c | 36 ++++++++++++++++++++++-------------- 2 files changed, 23 insertions(+), 14 deletions(-) diff --git a/reader.c b/reader.c index 0884a02..e3a49be 100644 --- a/reader.c +++ b/reader.c @@ -621,6 +621,7 @@ static value_t patch_placeholders(reader_state_t *state, value_t v) for (value_t item = state->ref_alist.value; !is_nil(item); item = _CDDR(item)) { + assert(!is_placeholder(state, _CADR(item))); tree_replace(&v, item, _CADR(item)); } diff --git a/rosella.c b/rosella.c index 86d69b7..68783fb 100644 --- a/rosella.c +++ b/rosella.c @@ -45,24 +45,32 @@ int main(int argc, char **argv) } else { - gc_root_t argv_root; FILE *f = fopen(argv[1], "r"); - value_t program; - register_gc_root(&argv_root, NIL); - - /* Construct list backward, so that we don't have to reverse it. */ - for (int i = argc - 1; i >= 2; --i) + if (f) { - value_t temp = string_to_value(argv[i]); - argv_root.value = cons(temp, argv_root.value); + gc_root_t argv_root; + value_t program; + + register_gc_root(&argv_root, NIL); + + /* Construct list backward, so that we don't have to reverse it. */ + for (int i = argc - 1; i >= 2; --i) + { + value_t temp = string_to_value(argv[i]); + argv_root.value = cons(temp, argv_root.value); + } + + program = read_value(f); + print_value(run_interpreter(program, argv_root.value)); + nl(); + fclose(f); + unregister_gc_root(&argv_root); + } + else + { + perror(argv[1]); } - - program = read_value(f); - print_value(run_interpreter(program, argv_root.value)); - nl(); - fclose(f); - unregister_gc_root(&argv_root); } return 0;