From c260301db1bdceed6990a633cdd028cde4893644 Mon Sep 17 00:00:00 2001 From: hyung-hwan Date: Tue, 20 Feb 2024 22:57:30 +0900 Subject: [PATCH] some improvement to the hcl command in the interactive mode --- bin/main.c | 27 ++++++++++++++++++++++----- lib/read.c | 3 ++- 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/bin/main.c b/bin/main.c index 6dd1c1a..83665ca 100644 --- a/bin/main.c +++ b/bin/main.c @@ -388,6 +388,13 @@ static void print_synerr (hcl_t* hcl) hcl_logbfmt (hcl, HCL_LOG_STDERR, "\n"); } + +static void print_error (hcl_t* hcl, const hcl_bch_t* msghdr) +{ + if (HCL_ERRNUM(hcl) == HCL_ESYNERR) print_synerr (hcl); + else hcl_logbfmt (hcl, HCL_LOG_STDERR, "ERROR: %hs - [%d] %js\n", msghdr, hcl_geterrnum(hcl), hcl_geterrmsg(hcl)); +} + static void show_prompt (hcl_t* hcl, int level) { /* TODO: different prompt per level */ @@ -485,8 +492,15 @@ static hcl_oop_t execute_in_batch_mode(hcl_t* hcl, int verbose) static int on_fed_cnode_in_interactive_mode (hcl_t* hcl, hcl_cnode_t* obj) { xtn_t* xtn = (xtn_t*)hcl_getxtn(hcl); - if (hcl_compile(hcl, obj, HCL_COMPILE_CLEAR_CODE | HCL_COMPILE_CLEAR_FNBLK) <= -1) return -1; - execute_in_interactive_mode (hcl); + int flags = HCL_COMPILE_CLEAR_CODE | HCL_COMPILE_CLEAR_FNBLK; + + /* in the interactive, the compile error must not break the input loop. + * this function returns 0 to go on despite a compile-time error */ + + if (hcl_compile(hcl, obj, flags) <= -1) + print_error(hcl, "failed to compile"); + else + execute_in_interactive_mode (hcl); show_prompt (hcl, 0); return 0; @@ -553,7 +567,11 @@ static int feed_loop (hcl_t* hcl, xtn_t* xtn, int verbose) } bch = ch; - if (hcl_feedbchars(hcl, &bch, 1) <= -1) goto feed_error; + if (hcl_feedbchars(hcl, &bch, 1) <= -1) + { + print_error (hcl, "failed to feed"); + show_prompt (hcl, 0); + } } else { @@ -577,8 +595,7 @@ static int feed_loop (hcl_t* hcl, xtn_t* xtn, int verbose) if (hcl_endfeed(hcl) <= -1) { feed_error: - if (hcl->errnum == HCL_ESYNERR) print_synerr (hcl); - else hcl_logbfmt (hcl, HCL_LOG_STDERR, "ERROR: cannot feed - [%d] %js\n", hcl_geterrnum(hcl), hcl_geterrmsg(hcl)); + print_error (hcl, "failed to feed"); goto oops; /* TODO: proceed or just exit? */ } fclose (fp); diff --git a/lib/read.c b/lib/read.c index 6c395c1..dfe73b0 100644 --- a/lib/read.c +++ b/lib/read.c @@ -2054,6 +2054,7 @@ static int flx_start (hcl_t* hcl, hcl_ooci_t c) } else { + /* TODO: limit identifier character - is_identchar(), is_identleadchar() */ init_flx_pi (FLX_PI(hcl)); FEED_CONTINUE (hcl, HCL_FLX_PLAIN_IDENT); } @@ -2506,7 +2507,7 @@ static int flx_plain_ident (hcl_t* hcl, hcl_ooci_t c) /* identifier */ /* if single-segmented, perform classification(call classify_ident_token()) again * bcause self and super as the first segment have not been marked as a non-identifier above */ tok_type = (pi->seg_count == 1? classify_ident_token(hcl, TOKEN_NAME(hcl)): - (pi->is_cla? HCL_TOK_IDENT_DOTTED_CLA: HCL_TOK_IDENT_DOTTED)); + (pi->is_cla? HCL_TOK_IDENT_DOTTED_CLA: HCL_TOK_IDENT_DOTTED)); FEED_WRAP_UP (hcl, tok_type); goto not_consumed; }