diff options
| -rw-r--r-- | mrbgems/mruby-bin-mirb/tools/mirb/mirb.c | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c b/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c index e73a1c14d..b802321c3 100644 --- a/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c +++ b/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c @@ -11,6 +11,9 @@ #include <stdio.h> #include <ctype.h> +#include <signal.h> +#include <setjmp.h> + #ifdef ENABLE_READLINE #include <readline/readline.h> #include <readline/history.h> @@ -29,6 +32,16 @@ #define MIRB_USING_HISTORY() #endif +#ifndef _WIN32 +#define MIRB_SIGSETJMP(env) sigsetjmp(env, 1) +#define MIRB_SIGLONGJMP(env, val) siglongjmp(env, val) +#define SIGJMP_BUF sigjmp_buf +#else +#define MIRB_SIGSETJMP(env) setjmp(env) +#define MIRB_SIGLONGJMP(env, val) longjmp(env, val) +#define SIGJMP_BUF jmp_buf +#endif + #include <mruby.h> #include <mruby/array.h> #include <mruby/proc.h> @@ -326,6 +339,23 @@ check_keyword(const char *buf, const char *word) return 1; } + +#ifndef ENABLE_READLINE +volatile sig_atomic_t input_canceled = 0; +void +ctrl_c_handler(int signo) +{ + input_canceled = 1; +} +#else +SIGJMP_BUF ctrl_c_buf; +void +ctrl_c_handler(int signo) +{ + MIRB_SIGLONGJMP(ctrl_c_buf, 1); +} +#endif + int main(int argc, char **argv) { @@ -336,6 +366,7 @@ main(int argc, char **argv) size_t char_index; #else char *history_path; + char* line; #endif mrbc_context *cxt; struct mrb_parser_state *parser; @@ -410,6 +441,7 @@ main(int argc, char **argv) #ifndef ENABLE_READLINE print_cmdline(code_block_open); + signal(SIGINT, ctrl_c_handler); char_index = 0; while ((last_char = getchar()) != '\n') { if (last_char == EOF) break; @@ -419,6 +451,15 @@ main(int argc, char **argv) } last_code_line[char_index++] = last_char; } + signal(SIGINT, SIG_DFL); + if (input_canceled) { + ruby_code[0] = '\0'; + last_code_line[0] = '\0'; + code_block_open = FALSE; + puts("^C"); + input_canceled = 0; + continue; + } if (last_char == EOF) { fputs("\n", stdout); break; @@ -427,7 +468,19 @@ main(int argc, char **argv) last_code_line[char_index++] = '\n'; last_code_line[char_index] = '\0'; #else + if (MIRB_SIGSETJMP(ctrl_c_buf) == 0) { + ; + } + else { + ruby_code[0] = '\0'; + last_code_line[0] = '\0'; + code_block_open = FALSE; + puts("^C"); + } + signal(SIGINT, ctrl_c_handler); line = MIRB_READLINE(code_block_open ? "* " : "> "); + signal(SIGINT, SIG_DFL); + if (line == NULL) { printf("\n"); break; |
