summaryrefslogtreecommitdiffstats
path: root/parser.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2018-05-27 08:18:46 -0700
committerKaz Kylheku <kaz@kylheku.com>2018-05-27 08:18:46 -0700
commitd021ddb220345dd93b251dc6ba50caf116c590c5 (patch)
tree8748e724b902cab23a2fc74aebb168e84ad74c52 /parser.c
parent6ad1aa9978b219f34799ae9db41e20452d06145f (diff)
downloadtxr-d021ddb220345dd93b251dc6ba50caf116c590c5.tar.gz
txr-d021ddb220345dd93b251dc6ba50caf116c590c5.tar.bz2
txr-d021ddb220345dd93b251dc6ba50caf116c590c5.zip
bugfix: fatal exception on missing .txr_history.
The new abstraction layer used by linenoise throws exceptions, but linenoise excpects a null pointer when a file open fails. * parser.c (lino_open, lino_open8): Catch error exceptions and convert to null return, using new macros to reduce repetitive coding. * unwind.h (ignerr_begin, ignerr_end): New macros.
Diffstat (limited to 'parser.c')
-rw-r--r--parser.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/parser.c b/parser.c
index ddd72fd1..ca9fd3bc 100644
--- a/parser.c
+++ b/parser.c
@@ -1497,14 +1497,22 @@ static mem_t *lino_open(const wchar_t *name_in, lino_file_mode_t mode_in)
{
val name = string(name_in);
val mode = static_str(lino_mode_str[mode_in]);
- return coerce(mem_t *, open_file(name, mode));
+ mem_t *ret = 0;
+ ignerr_begin;
+ ret = coerce(mem_t *, open_file(name, mode));
+ ignerr_end;
+ return ret;
}
static mem_t *lino_open8(const char *name_in, lino_file_mode_t mode_in)
{
val name = string_utf8(name_in);
val mode = static_str(lino_mode_str[mode_in]);
- return coerce(mem_t *, open_file(name, mode));
+ mem_t *ret = 0;
+ ignerr_begin;
+ ret = coerce(mem_t *, open_file(name, mode));
+ ignerr_end;
+ return ret;
}
static mem_t *lino_fdopen(int fd, lino_file_mode_t mode_in)