Handle signals better
This resets the execution context to start in a semi-good state.
diff --git a/include/bc/bc.h b/include/bc/bc.h
index e9e2044..428f7c5 100644
--- a/include/bc/bc.h
+++ b/include/bc/bc.h
@@ -104,7 +104,7 @@
extern long bc_std;
extern long bc_warn;
-extern long bc_had_sigint;
+extern long bc_signal;
extern const char* const bc_mathlib;
extern const char* const bc_version;
diff --git a/src/bc/vm.c b/src/bc/vm.c
index a7ae0ca..9158215 100644
--- a/src/bc/vm.c
+++ b/src/bc/vm.c
@@ -13,12 +13,14 @@
static BcStatus bc_vm_execFile(BcVm* vm, int idx);
static BcStatus bc_vm_execStdin(BcVm* vm);
+static BcStatus bc_vm_handleSignal(BcVm* vm);
+
static const char* const bc_stdin_filename = "<stdin>";
static const char* const bc_ready_prompt = "ready for more input\n\n";
static const char* const bc_sigint_msg =
- "\n\nSIGINT detected (type \"quit\" to exit)\n\n";
+ "\n\interrupt (type \"quit\" to exit)\n\n";
static void bc_vm_sigint(int sig) {
@@ -31,7 +33,7 @@
if (sig == SIGINT) {
write(STDERR_FILENO, bc_sigint_msg, strlen(bc_sigint_msg));
- bc_had_sigint = 1;
+ bc_signal = 1;
}
}
@@ -157,11 +159,14 @@
status = bc_parse_parse(&vm->parse);
- if (bc_had_sigint && !bc_interactive) {
+ if (bc_signal && !bc_interactive) {
goto read_err;
}
else {
- bc_had_sigint = 0;
+
+ status = bc_vm_handleSignal(vm);
+
+ if (status) return status;
}
if (status) {
@@ -218,14 +223,16 @@
fflush(stdout);
- if (bc_had_sigint) {
+ if (bc_signal) {
+
+ status = bc_vm_handleSignal(vm);
+
fprintf(stderr, bc_ready_prompt);
fflush(stderr);
- bc_had_sigint = 0;
}
}
- else if (bc_had_sigint) {
- bc_had_sigint = 0;
+ else if (bc_signal) {
+ status = bc_vm_handleSignal(vm);
goto read_err;
}
}
@@ -247,14 +254,16 @@
fflush(stdout);
- if (bc_had_sigint) {
+ if (bc_signal) {
+
+ status = bc_vm_handleSignal(vm);
+
fprintf(stderr, bc_ready_prompt);
fflush(stderr);
- bc_had_sigint = 0;
}
}
- else if (bc_had_sigint) {
- bc_had_sigint = 0;
+ else if (bc_signal) {
+ status = bc_vm_handleSignal(vm);
goto read_err;
}
}
@@ -399,7 +408,7 @@
status = bc_parse_text(&vm->parse, buffer);
- if (!bc_had_sigint) {
+ if (!bc_signal) {
if (status) {
@@ -473,13 +482,13 @@
fflush(stdout);
- if (bc_had_sigint) {
+ if (bc_signal) {
+ status = bc_vm_handleSignal(vm);
fprintf(stderr, bc_ready_prompt);
- bc_had_sigint = 0;
}
}
- else if (bc_had_sigint) {
- bc_had_sigint = 0;
+ else if (bc_signal) {
+ status = bc_vm_handleSignal(vm);
goto exit_err;
}
}
@@ -491,13 +500,13 @@
fflush(stdout);
- if (bc_had_sigint) {
+ if (bc_signal) {
+ status = bc_vm_handleSignal(vm);
fprintf(stderr, bc_ready_prompt);
- bc_had_sigint = 0;
}
}
- else if (bc_had_sigint) {
- bc_had_sigint = 0;
+ else if (bc_signal) {
+ status = bc_vm_handleSignal(vm);
goto exit_err;
}
}
@@ -522,3 +531,20 @@
return status;
}
+
+static BcStatus bc_vm_handleSignal(BcVm* vm) {
+
+ BcFunc* func;
+
+ bc_signal = 0;
+
+ func = bc_vec_item(&vm->program.funcs, 0);
+
+ if (!func) {
+ return BC_STATUS_VM_UNDEFINED_FUNC;
+ }
+
+ vm->program.idx = func->code.len;
+
+ return BC_STATUS_SUCCESS;
+}
diff --git a/src/main.c b/src/main.c
index 4f106c0..c81d668 100644
--- a/src/main.c
+++ b/src/main.c
@@ -49,7 +49,7 @@
long bc_std = 0;
long bc_warn = 0;
-long bc_had_sigint = 0;
+long bc_signal = 0;
const char* const bc_mathlib = BC_MATHLIB_PATH "mathlib.bc";