Permalink
Browse files

mirb: Don't exit on Ctrl-C

  • Loading branch information...
kyab authored and mattn committed Oct 6, 2014
1 parent 76d44b1 commit 1e34b12a02c0959a38defe6e2d4cf41aa841fef9
Showing with 53 additions and 0 deletions.
  1. +53 −0 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;

0 comments on commit 1e34b12

Please sign in to comment.