diff --git a/bin/main.c b/bin/main.c index 759961e..cc07e0e 100644 --- a/bin/main.c +++ b/bin/main.c @@ -102,7 +102,6 @@ struct xtn_t const char* udo_path; int vm_running; - int lang_flags; /*hcl_oop_t sym_errstr;*/ }; @@ -388,6 +387,12 @@ static void print_synerr (hcl_t* hcl) hcl_logbfmt (hcl, HCL_LOG_STDERR, "\n"); } +static void show_prompt (hcl_t* hcl, int level) +{ +/* TODO: different prompt per level */ + hcl_logbfmt (hcl, HCL_LOG_STDOUT, "HCL> "); + hcl_logbfmt (hcl, HCL_LOG_STDOUT, HCL_NULL); /* flushing */ +} static hcl_oop_t execute_in_interactive_mode (hcl_t* hcl) { @@ -481,6 +486,8 @@ 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); + + show_prompt (hcl, 0); return 0; } @@ -526,7 +533,8 @@ static int feed_loop (hcl_t* hcl, xtn_t* xtn, int verbose) goto oops; } - /* [NOTE] it isn't a very nice idea to get this internal data and use it with read_input() */ + if (is_tty) show_prompt (hcl, 0); + while (1) { if (is_tty) @@ -582,7 +590,7 @@ oops: return -1; } -//#define DEFAULT_HEAPSIZE (512000ul) +/* #define DEFAULT_HEAPSIZE (512000ul) */ #define DEFAULT_HEAPSIZE (0ul) /* don't use the pre-allocated heap */ int main (int argc, char* argv[]) @@ -599,7 +607,7 @@ int main (int argc, char* argv[]) #endif { ":heapsize", '\0' }, { ":log", 'l' }, - { ":info", '\0' }, + { "info", '\0' }, { ":modlibdirs", '\0' }, { HCL_NULL, '\0' } @@ -691,7 +699,7 @@ int main (int argc, char* argv[]) } } - if ((opt.ind + 1) != argc) goto print_usage; + if ((opt.ind + 1) != argc && !show_info) goto print_usage; #endif hcl = hcl_openstd(HCL_SIZEOF(xtn_t), HCL_NULL); @@ -716,17 +724,11 @@ int main (int argc, char* argv[]) { hcl_bitmask_t trait = 0; - if (enable_block) xtn->lang_flags |= HCL_TRAIT_LANG_ENABLE_BLOCK; - if (nl_terminator) xtn->lang_flags |= HCL_TRAIT_LANG_ENABLE_EOL;; - /*trait |= HCL_TRAIT_NOGC;*/ trait |= HCL_TRAIT_AWAIT_PROCS; - trait |= xtn->lang_flags; + if (enable_block) trait |= HCL_TRAIT_LANG_ENABLE_BLOCK; + if (nl_terminator) trait |= HCL_TRAIT_LANG_ENABLE_EOL;; hcl_setoption (hcl, HCL_TRAIT, &trait); - - /* disable GC logs */ - /*trait = ~HCL_LOG_GC; - hcl_setoption (hcl, HCL_LOG_MASK, &trait);*/ } if (modlibdirs) @@ -756,7 +758,6 @@ int main (int argc, char* argv[]) #endif } - memset (&hclcb, 0, HCL_SIZEOF(hclcb)); hclcb.gc = gc_hcl; hclcb.vm_startup = vm_startup; @@ -809,19 +810,6 @@ int main (int argc, char* argv[]) goto oops; } - /* - { - hcl_ooch_t errstr[] = { 'E', 'R', 'R', 'S', 'T', 'R' }; - xtn->sym_errstr = hcl_makesymbol(hcl, errstr, 6); - if (!xtn->sym_errstr) - { - hcl_logbfmt (hcl, HCL_LOG_STDERR, "ERROR: cannot create the ERRSTR symbol - [%d] %js\n", hcl_geterrnum(hcl), hcl_geterrmsg(hcl)); - goto oops; - } - HCL_OBJ_SET_FLAGS_KERNEL (xtn->sym_errstr, 1); - } - */ - /* -- from this point onward, any failure leads to jumping to the oops label * -- instead of returning -1 immediately. --*/ set_signal (SIGINT, handle_sigint); diff --git a/lib/fmt.c b/lib/fmt.c index 676974f..a2dd704 100644 --- a/lib/fmt.c +++ b/lib/fmt.c @@ -1696,6 +1696,18 @@ hcl_ooi_t hcl_logbfmtv (hcl_t* hcl, hcl_bitmask_t mask, const hcl_bch_t* fmt, va mask |= HCL_LOG_UNTYPED; } + if (!fmt) + { + /* perform flushing only if fmt is NULL */ + if (hcl->log.len > 0) + { + HCL_VMPRIM_LOG_WRITE (hcl, hcl->log.last_mask, hcl->log.ptr, hcl->log.len); + hcl->log.len = 0; + } + HCL_VMPRIM_LOG_WRITE (hcl, hcl->log.last_mask, HCL_NULL, 0); /* forced flushing */ + return 0; + } + HCL_MEMSET (&fo, 0, HCL_SIZEOF(fo)); fo.fmt_type = HCL_FMTOUT_FMT_TYPE_BCH; fo.fmt_str = fmt; @@ -1751,6 +1763,19 @@ hcl_ooi_t hcl_logufmtv (hcl_t* hcl, hcl_bitmask_t mask, const hcl_uch_t* fmt, va mask |= HCL_LOG_UNTYPED; } + + if (!fmt) + { + /* perform flushing only if fmt is NULL */ + if (hcl->log.len > 0) + { + HCL_VMPRIM_LOG_WRITE (hcl, hcl->log.last_mask, hcl->log.ptr, hcl->log.len); + hcl->log.len = 0; + } + HCL_VMPRIM_LOG_WRITE (hcl, hcl->log.last_mask, HCL_NULL, 0); /* forced flushing */ + return 0; + } + HCL_MEMSET (&fo, 0, HCL_SIZEOF(fo)); fo.fmt_type = HCL_FMTOUT_FMT_TYPE_UCH; fo.fmt_str = fmt; @@ -1768,6 +1793,7 @@ hcl_ooi_t hcl_logufmtv (hcl_t* hcl, hcl_bitmask_t mask, const hcl_uch_t* fmt, va HCL_VMPRIM_LOG_WRITE (hcl, hcl->log.last_mask, hcl->log.ptr, hcl->log.len); hcl->log.len = 0; } + return (x <= -1)? -1: fo.count; } diff --git a/lib/std.c b/lib/std.c index 558e6e8..08aa720 100644 --- a/lib/std.c +++ b/lib/std.c @@ -534,10 +534,10 @@ static int write_log (hcl_t* hcl, int fd, const hcl_bch_t* ptr, hcl_oow_t len) return 0; } -static void flush_log (hcl_t* hcl, int fd) +static void flush_log (hcl_t* hcl, int fd, int force) { xtn_t* xtn = GET_XTN(hcl); - if (xtn->log.out.len > 0) + if (xtn->log.out.len > 0 || force) { write_all (fd, xtn->log.out.buf, xtn->log.out.len); xtn->log.out.len = 0; @@ -551,6 +551,7 @@ static void log_write (hcl_t* hcl, hcl_bitmask_t mask, const hcl_ooch_t* msg, hc xtn_t* xtn = GET_XTN(hcl); int logfd; + int force_flush = 0; if (mask & HCL_LOG_STDERR) logfd = 2; else if (mask & HCL_LOG_STDOUT) logfd = 1; @@ -627,6 +628,12 @@ static void log_write (hcl_t* hcl, hcl_bitmask_t mask, const hcl_ooch_t* msg, hc else if (mask & HCL_LOG_WARN) write_log (hcl, logfd, "\x1B[1;33m", 7); } + if (!msg) + { + force_flush = 1; + goto flush_log_msg; + } + #if defined(HCL_OOCH_IS_UCH) msgidx = 0; while (len > 0) @@ -673,7 +680,8 @@ static void log_write (hcl_t* hcl, hcl_bitmask_t mask, const hcl_ooch_t* msg, hc if (mask & (HCL_LOG_FATAL | HCL_LOG_ERROR | HCL_LOG_WARN)) write_log (hcl, logfd, "\x1B[0m", 4); } - flush_log (hcl, logfd); +flush_log_msg: + flush_log (hcl, logfd, force_flush); } /* -----------------------------------------------------------------