diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2015-12-26 10:28:50 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2015-12-26 10:28:50 +0900 |
| commit | 6218b2e098adc4bdfa69ee00f0b1aebad18846d3 (patch) | |
| tree | de286347ae9775819e9fafb38ef3b8e870fb579c | |
| parent | 76d44b1b4806a0f88bbf4bc68a1a5b049b88fe2a (diff) | |
| parent | 1e34b12a02c0959a38defe6e2d4cf41aa841fef9 (diff) | |
| download | mruby-6218b2e098adc4bdfa69ee00f0b1aebad18846d3.tar.gz mruby-6218b2e098adc4bdfa69ee00f0b1aebad18846d3.zip | |
Merge pull request #3061 from mattn/fix-ctrl-c
mirb: Don't exit on Ctrl-C
| -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; |
