the executable binary takes a scheme file to execute in cmd arg line

This commit is contained in:
Yuichi Nishiwaki 2013-10-28 22:08:03 +09:00
parent 9a20b50fc5
commit 98e5288b04
1 changed files with 70 additions and 12 deletions

View File

@ -13,13 +13,15 @@
#define CODE_MAX_LENGTH 1024 #define CODE_MAX_LENGTH 1024
#define LINE_MAX_LENGTH 256 #define LINE_MAX_LENGTH 256
static char *fname;
void void
print_help(void) print_help(void)
{ {
const char *help = const char *help =
"picrin scheme\n" "picrin scheme\n"
"\n" "\n"
"Usage: picrin [options]\n" "Usage: picrin [options] [file]\n"
"\n" "\n"
"Options:\n" "Options:\n"
" -h show this help"; " -h show this help";
@ -27,7 +29,7 @@ print_help(void)
puts(help); puts(help);
} }
void bool
parse_opt(int argc, char *argv[]) parse_opt(int argc, char *argv[])
{ {
int r; int r;
@ -39,12 +41,21 @@ parse_opt(int argc, char *argv[])
exit(0); exit(0);
} }
} }
argc -= optind;
argv += optind;
if (argc == 0) {
return 1;
}
else {
fname = argv[0];
return 0;
}
} }
int int
main(int argc, char *argv[], char **envp) repl(pic_state *pic)
{ {
pic_state *pic;
char code[CODE_MAX_LENGTH] = "", line[LINE_MAX_LENGTH]; char code[CODE_MAX_LENGTH] = "", line[LINE_MAX_LENGTH];
char *read_line, *prompt; char *read_line, *prompt;
pic_value v; pic_value v;
@ -57,10 +68,6 @@ main(int argc, char *argv[], char **envp)
int char_index; int char_index;
#endif #endif
parse_opt(argc, argv);
pic = pic_open(argc, argv, envp);
ai = pic_gc_arena_preserve(pic); ai = pic_gc_arena_preserve(pic);
while (1) { while (1) {
@ -135,14 +142,65 @@ main(int argc, char *argv[], char **envp)
eof: eof:
puts(""); puts("");
goto exit; return 0;
overflow: overflow:
puts("** [fatal] line input overflow"); puts("** [fatal] line input overflow");
goto exit; return 1;
}
exit: int
pic_close(pic); exec_file(pic_state *pic, const char *fname)
{
FILE *file;
bool r;
pic_value v;
struct pic_proc *proc;
file = fopen(fname, "r");
if (file == NULL) {
fprintf(stderr, "fatal error: could not read %s\n", fname);
return 1;
}
r = pic_parse_file(pic, file, &v);
if (! r) {
fprintf(stderr, "fatal error: %s broken\n", fname);
return 1;
}
proc = pic_codegen(pic, v);
if (proc == NULL) {
fprintf(stderr, "fatal error: %s compilation failure\n", fname);
return 1;
}
v = pic_apply(pic, proc, pic_nil_value());
if (pic_undef_p(v)) {
fputs(pic->errmsg, stderr);
fprintf(stderr, "fatal error: %s evaluation failure\n", fname);
return 1;
}
return 0; return 0;
} }
int
main(int argc, char *argv[], char **envp)
{
pic_state *pic;
int res;
pic = pic_open(argc, argv, envp);
if (parse_opt(argc, argv)) {
res = repl(pic);
}
else {
res = exec_file(pic, fname);
}
pic_close(pic);
return res;
}