report exit status via a global variable
This commit is contained in:
parent
1f54f5d0fb
commit
15ded87897
49
tools/main.c
49
tools/main.c
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue