report exit status via a global variable

This commit is contained in:
Yuichi Nishiwaki 2013-12-06 21:15:21 -08:00
parent 1f54f5d0fb
commit 15ded87897
1 changed files with 30 additions and 19 deletions

View File

@ -29,7 +29,9 @@ print_help(void)
puts(help); puts(help);
} }
int int exit_status;
void
repl(pic_state *pic) repl(pic_state *pic)
{ {
char code[CODE_MAX_LENGTH] = "", line[LINE_MAX_LENGTH]; char code[CODE_MAX_LENGTH] = "", line[LINE_MAX_LENGTH];
@ -123,14 +125,16 @@ repl(pic_state *pic)
eof: eof:
puts(""); puts("");
return 0; exit_status = 0;
return;
overflow: overflow:
puts("** [fatal] line input overflow"); puts("** [fatal] line input overflow");
return 1; exit_status = 1;
return;
} }
int void
exec_file(pic_state *pic, const char *fname) exec_file(pic_state *pic, const char *fname)
{ {
FILE *file; FILE *file;
@ -141,13 +145,13 @@ exec_file(pic_state *pic, const char *fname)
file = fopen(fname, "r"); file = fopen(fname, "r");
if (file == NULL) { if (file == NULL) {
fprintf(stderr, "fatal error: could not read %s\n", fname); fprintf(stderr, "fatal error: could not read %s\n", fname);
return 1; goto abort;
} }
n = pic_parse_file(pic, file, &vs); n = pic_parse_file(pic, file, &vs);
if (n <= 0) { if (n <= 0) {
fprintf(stderr, "fatal error: %s broken\n", fname); fprintf(stderr, "fatal error: %s broken\n", fname);
return 1; goto abort;
} }
for (i = 0; i < n; ++i) { for (i = 0; i < n; ++i) {
@ -159,23 +163,27 @@ exec_file(pic_state *pic, const char *fname)
if (proc == NULL) { if (proc == NULL) {
fputs(pic->errmsg, stderr); fputs(pic->errmsg, stderr);
fprintf(stderr, "fatal error: %s compilation failure\n", fname); fprintf(stderr, "fatal error: %s compilation failure\n", fname);
return 1; goto abort;
} }
v = pic_apply(pic, proc, pic_nil_value()); v = pic_apply(pic, proc, pic_nil_value());
if (pic_undef_p(v)) { if (pic_undef_p(v)) {
fputs(pic->errmsg, stderr); fputs(pic->errmsg, stderr);
fprintf(stderr, "fatal error: %s evaluation failure\n", fname); fprintf(stderr, "fatal error: %s evaluation failure\n", fname);
return 1; goto abort;
} }
vs = pic_cdr(pic, vs); vs = pic_cdr(pic, vs);
} }
return 0; return;
abort:
exit_status = 1;
return;
} }
static int void
exec_string(pic_state *pic, const char *str) exec_string(pic_state *pic, const char *str)
{ {
int n, i; int n, i;
@ -185,7 +193,7 @@ exec_string(pic_state *pic, const char *str)
n = pic_parse_cstr(pic, str, &vs); n = pic_parse_cstr(pic, str, &vs);
if (n < 0) { if (n < 0) {
return 1; goto abort;
} }
for (i = 0; i < n; ++i) { for (i = 0; i < n; ++i) {
@ -193,11 +201,11 @@ exec_string(pic_state *pic, const char *str)
proc = pic_codegen(pic, v); proc = pic_codegen(pic, v);
if (proc == NULL) { if (proc == NULL) {
return 1; goto abort;
} }
v = pic_apply(pic, proc, pic_nil_value()); v = pic_apply(pic, proc, pic_nil_value());
if (pic_undef_p(v)) { if (pic_undef_p(v)) {
return 1; goto abort;
} }
vs = pic_cdr(pic, vs); vs = pic_cdr(pic, vs);
@ -205,7 +213,11 @@ exec_string(pic_state *pic, const char *str)
pic_gc_arena_restore(pic, ai); pic_gc_arena_restore(pic, ai);
} }
return 0; return;
abort:
exit_status = 1;
return;
} }
static char *fname; static char *fname;
@ -250,7 +262,6 @@ int
main(int argc, char *argv[], char **envp) main(int argc, char *argv[], char **envp)
{ {
pic_state *pic; pic_state *pic;
int res = -1;
pic = pic_open(argc, argv, envp); pic = pic_open(argc, argv, envp);
@ -261,17 +272,17 @@ main(int argc, char *argv[], char **envp)
puts("logic flaw"); puts("logic flaw");
abort(); abort();
case INTERACTIVE_MODE: case INTERACTIVE_MODE:
res = repl(pic); repl(pic);
break; break;
case FILE_EXEC_MODE: case FILE_EXEC_MODE:
res = exec_file(pic, fname); exec_file(pic, fname);
break; break;
case ONE_LINER_MODE: case ONE_LINER_MODE:
res = exec_string(pic, script); exec_string(pic, script);
break; break;
} }
pic_close(pic); pic_close(pic);
return res; return exit_status;
} }