diff options
Diffstat (limited to 'unix')
-rw-r--r-- | unix/main.c | 61 |
1 files changed, 44 insertions, 17 deletions
diff --git a/unix/main.c b/unix/main.c index 7a2f7e4ff1..a3f4cfe6cf 100644 --- a/unix/main.c +++ b/unix/main.c @@ -162,10 +162,12 @@ STATIC int do_repl(void) { vstr_t line; vstr_init(&line, 16); for (;;) { + mp_hal_stdio_mode_raw(); + input_restart: vstr_reset(&line); - mp_hal_stdio_mode_raw(); int ret = readline(&line, ">>> "); + mp_parse_input_kind_t parse_input_kind = MP_PARSE_SINGLE_INPUT; if (ret == CHAR_CTRL_D) { // EOF @@ -173,31 +175,56 @@ STATIC int do_repl(void) { mp_hal_stdio_mode_orig(); vstr_clear(&line); return 0; + } else if (ret == CHAR_CTRL_E) { + // paste mode + mp_hal_stdout_tx_str("\npaste mode; CTRL-C to cancel, CTRL-D to finish\n=== "); + vstr_reset(&line); + for (;;) { + char c = mp_hal_stdin_rx_chr(); + if (c == CHAR_CTRL_C) { + // cancel everything + mp_hal_stdout_tx_str("\n"); + goto input_restart; + } else if (c == CHAR_CTRL_D) { + // end of input + mp_hal_stdout_tx_str("\n"); + break; + } else { + // add char to buffer and echo + vstr_add_byte(&line, c); + if (c == '\r') { + mp_hal_stdout_tx_str("\n=== "); + } else { + mp_hal_stdout_tx_strn(&c, 1); + } + } + } + parse_input_kind = MP_PARSE_FILE_INPUT; } else if (line.len == 0) { if (ret != 0) { printf("\n"); } - mp_hal_stdio_mode_orig(); - continue; - } - - while (mp_repl_continue_with_input(vstr_null_terminated_str(&line))) { - vstr_add_byte(&line, '\n'); - ret = readline(&line, "... "); - if (ret == CHAR_CTRL_C) { - // cancel everything - printf("\n"); - mp_hal_stdio_mode_orig(); - goto input_restart; - } else if (ret == CHAR_CTRL_D) { - // stop entering compound statement - break; + goto input_restart; + } else { + // got a line with non-zero length, see if it needs continuing + while (mp_repl_continue_with_input(vstr_null_terminated_str(&line))) { + vstr_add_byte(&line, '\n'); + ret = readline(&line, "... "); + if (ret == CHAR_CTRL_C) { + // cancel everything + printf("\n"); + goto input_restart; + } else if (ret == CHAR_CTRL_D) { + // stop entering compound statement + break; + } } } + mp_hal_stdio_mode_orig(); mp_lexer_t *lex = mp_lexer_new_from_str_len(MP_QSTR__lt_stdin_gt_, line.buf, line.len, false); - ret = execute_from_lexer(lex, MP_PARSE_SINGLE_INPUT, true); + ret = execute_from_lexer(lex, parse_input_kind, true); if (ret & FORCED_EXIT) { return ret; } |