summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--mrbgems/mruby-bin-mirb/tools/mirb/mirb.c53
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;