verifying command-line option arguments are given when needed (issue #43)

This commit is contained in:
Alex Shinn 2010-03-12 14:26:03 +09:00
parent e15c49389c
commit 4b2ed4cf48

13
main.c
View file

@ -56,6 +56,13 @@ static void repl (sexp ctx) {
sexp_gc_release4(ctx); sexp_gc_release4(ctx);
} }
static void check_nonull_arg (int c, char *arg) {
if (! arg) {
fprintf(stderr, "chibi-scheme: option '%c' requires an argument\n", c);
exit_failure();
}
}
static sexp check_exception (sexp ctx, sexp res) { static sexp check_exception (sexp ctx, sexp res) {
sexp err; sexp err;
if (res && sexp_exceptionp(res)) { if (res && sexp_exceptionp(res)) {
@ -95,6 +102,7 @@ void run_main (int argc, char **argv) {
load_init(); load_init();
print = (argv[i][1] == 'p'); print = (argv[i][1] == 'p');
arg = ((argv[i][2] == '\0') ? argv[++i] : argv[i]+2); arg = ((argv[i][2] == '\0') ? argv[++i] : argv[i]+2);
check_nonull_arg('e', arg);
res = check_exception(ctx, sexp_read_from_string(ctx, arg)); res = check_exception(ctx, sexp_read_from_string(ctx, arg));
res = check_exception(ctx, sexp_eval(ctx, res, env)); res = check_exception(ctx, sexp_eval(ctx, res, env));
if (print) { if (print) {
@ -108,11 +116,13 @@ void run_main (int argc, char **argv) {
case 'l': case 'l':
load_init(); load_init();
arg = ((argv[i][2] == '\0') ? argv[++i] : argv[i]+2); arg = ((argv[i][2] == '\0') ? argv[++i] : argv[i]+2);
check_nonull_arg('l', arg);
check_exception(ctx, sexp_load_module_file(ctx, arg, env)); check_exception(ctx, sexp_load_module_file(ctx, arg, env));
break; break;
case 'm': case 'm':
load_init(); load_init();
arg = ((argv[i][2] == '\0') ? argv[++i] : argv[i]+2); arg = ((argv[i][2] == '\0') ? argv[++i] : argv[i]+2);
check_nonull_arg('m', arg);
len = strlen(arg)+strlen(sexp_import_prefix)+strlen(sexp_import_suffix); len = strlen(arg)+strlen(sexp_import_prefix)+strlen(sexp_import_suffix);
impmod = (char*) malloc(len+1); impmod = (char*) malloc(len+1);
strcpy(impmod, sexp_import_prefix); strcpy(impmod, sexp_import_prefix);
@ -131,11 +141,13 @@ void run_main (int argc, char **argv) {
case 'A': case 'A':
init_context(); init_context();
arg = ((argv[i][2] == '\0') ? argv[++i] : argv[i]+2); arg = ((argv[i][2] == '\0') ? argv[++i] : argv[i]+2);
check_nonull_arg('A', arg);
sexp_add_module_directory(ctx, tmp=sexp_c_string(ctx,arg,-1), SEXP_TRUE); sexp_add_module_directory(ctx, tmp=sexp_c_string(ctx,arg,-1), SEXP_TRUE);
break; break;
case 'I': case 'I':
init_context(); init_context();
arg = ((argv[i][2] == '\0') ? argv[++i] : argv[i]+2); arg = ((argv[i][2] == '\0') ? argv[++i] : argv[i]+2);
check_nonull_arg('I', arg);
sexp_add_module_directory(ctx, tmp=sexp_c_string(ctx,arg,-1), SEXP_FALSE); sexp_add_module_directory(ctx, tmp=sexp_c_string(ctx,arg,-1), SEXP_FALSE);
break; break;
case '-': case '-':
@ -143,6 +155,7 @@ void run_main (int argc, char **argv) {
goto done_options; goto done_options;
case 'h': case 'h':
arg = ((argv[i][2] == '\0') ? argv[++i] : argv[i]+2); arg = ((argv[i][2] == '\0') ? argv[++i] : argv[i]+2);
check_nonull_arg('h', arg);
heap_size = atol(arg); heap_size = atol(arg);
len = strlen(arg); len = strlen(arg);
if (heap_size && isalpha(arg[len-1])) { if (heap_size && isalpha(arg[len-1])) {