From be10dca2ccb239fbdad6fa117be1b56be996a824 Mon Sep 17 00:00:00 2001 From: Alex Shinn Date: Tue, 6 Dec 2011 22:30:42 +0900 Subject: [PATCH] Adding a brief option summary when usage is wrong (including just -h, or --anything). --- include/chibi/features.h | 4 ++++ main.c | 45 ++++++++++++++++++++++++++++++++++------ 2 files changed, 43 insertions(+), 6 deletions(-) diff --git a/include/chibi/features.h b/include/chibi/features.h index 174f0b98..a07630ce 100644 --- a/include/chibi/features.h +++ b/include/chibi/features.h @@ -542,6 +542,10 @@ #define SEXP_USE_IMAGE_LOADING SEXP_USE_DL && !SEXP_USE_GLOBAL_HEAP && !SEXP_USE_BOEHM && !SEXP_USE_NO_FEATURES #endif +#ifndef SEXP_USE_MAIN_HELP +#define SEXP_USE_MAIN_HELP ! SEXP_USE_NO_FEATURES +#endif + #if SEXP_USE_NATIVE_X86 #undef SEXP_USE_BOEHM #define SEXP_USE_BOEHM 1 diff --git a/main.c b/main.c index 4bb850c8..929b4ebe 100644 --- a/main.c +++ b/main.c @@ -15,10 +15,40 @@ #ifdef PLAN9 #define exit_failure() exits("ERROR") -#define exit exits +#define exit exits #else #define exit_failure() exit(70) #endif +#define exit_success() exit(0) + +#if SEXP_USE_MAIN_HELP +void sexp_usage(int err) { + printf("usage: chibi-scheme [ ...] [ ...]\n" +#if SEXP_USE_FOLD_CASE_SYMS + " -f - case-fold symbols\n" +#endif + " -q - don't load the initialization file\n" + " -V - print version information\n" + " -h - specify the initial heap size\n" +#if SEXP_USE_IMAGE_LOADING + " -A - append a module search directory\n" + " -I - prepend a module search directory\n" + " -m - import a module\n" + " -x - import only a module\n" +#endif + " -e - evaluate an expression\n" + " -p - evaluate and print an expression\n" +#if SEXP_USE_IMAGE_LOADING + " -d - dump an image file and exit\n" + " -i - load an image file\n" +#endif + ); + if (err == 0) exit_success(); + else exit_failure(); +} +#else +#define sexp_usage(err) (err ? exit_failure() : exit_success()) +#endif #if SEXP_USE_IMAGE_LOADING @@ -195,7 +225,7 @@ static sexp_uint_t multiplier (char c) { static void check_nonull_arg (int c, char *arg) { if (! arg) { fprintf(stderr, "chibi-scheme: option '%c' requires an argument\n", c); - exit_failure(); + sexp_usage(1); } } @@ -340,8 +370,11 @@ void run_main (int argc, char **argv) { sexp_add_module_directory(ctx, tmp=sexp_c_string(ctx,arg,-1), SEXP_FALSE); break; case '-': - i++; - goto done_options; + if (argv[i][2] == '\0') { + i++; + goto done_options; + } + sexp_usage(1); case 'h': arg = ((argv[i][2] == '\0') ? argv[++i] : argv[i]+2); check_nonull_arg('h', arg); @@ -395,7 +428,7 @@ void run_main (int argc, char **argv) { #endif default: fprintf(stderr, "unknown option: %s\n", argv[i]); - exit_failure(); + sexp_usage(1); } } @@ -448,5 +481,5 @@ void run_main (int argc, char **argv) { int main (int argc, char **argv) { sexp_scheme_init(); run_main(argc, argv); - exit(0); + exit_success(); }