Handle interactivity and errors properly
Before this bug fix, it was exiting early, even when in interactive
mode.
diff --git a/src/bc/vm.c b/src/bc/vm.c
index 614998f..12e7ae0 100644
--- a/src/bc/vm.c
+++ b/src/bc/vm.c
@@ -149,12 +149,12 @@
status = vm->exec(&vm->program);
- if (status) goto read_err;
-
if (bcg.bc_interactive) {
fflush(stdout);
+ if (status) bc_error(status);
+
if (bcg.bc_signal) {
status = bc_vm_signal(vm);
@@ -163,9 +163,14 @@
fflush(stderr);
}
}
- else if (bcg.bc_signal) {
- status = bc_vm_signal(vm);
- goto read_err;
+ else {
+
+ if (status) goto read_err;
+
+ if (bcg.bc_signal) {
+ status = bc_vm_signal(vm);
+ goto read_err;
+ }
}
}
else status = BC_STATUS_EXEC_FILE_NOT_EXECUTABLE;
@@ -304,10 +309,7 @@
bc_program_limits(&vm->program);
status = BC_STATUS_SUCCESS;
}
- else {
- bc_error(status);
- goto exit_err;
- }
+ else goto exit_err;
}
}
else if (status == BC_STATUS_PARSE_QUIT) {
@@ -364,23 +366,25 @@
status = vm->exec(&vm->program);
- if (status) {
- bc_error(status);
- goto exit_err;
- }
-
if (bcg.bc_interactive) {
fflush(stdout);
+ if (status) bc_error(status);
+
if (bcg.bc_signal) {
- status = bc_vm_signal(vm);
+ if ((status = bc_vm_signal(vm))) bc_error(status);
fprintf(stderr, "%s", bc_program_ready_prompt);
}
}
- else if (bcg.bc_signal) {
- status = bc_vm_signal(vm);
- goto exit_err;
+ else {
+
+ if (status) goto exit_err;
+
+ if (bcg.bc_signal) {
+ status = bc_vm_signal(vm);
+ goto exit_err;
+ }
}
}
@@ -394,6 +398,8 @@
exit_err:
+ bc_error(status);
+
free(buf);
buf_err: