fix command-line parsingand support '-f -' as eval from stdin

This commit is contained in:
Matthew Flatt 2010-04-21 18:50:50 -06:00
parent 7503f8c6e9
commit fec6528c70
10 changed files with 44 additions and 15 deletions

View File

@ -256,12 +256,14 @@ static int finish_cmd_line_run(FinishArgs *fa, Repl_Proc repl)
mz_jmp_buf * volatile save, newbuf;
for (i = 0; i < fa->a->num_enl; i++) {
if (fa->eval_kind[i] == mzcmd_LOAD) {
if (!scheme_load(fa->evals_and_loads[i])) {
if ((fa->eval_kind[i] == mzcmd_LOAD)
&& strcmp(fa->evals_and_loads[i], "-")) {
if (!scheme_load(fa->evals_and_loads[i])) {
exit_val = 1;
break;
}
} else if ((fa->eval_kind[i] == mzcmd_EVAL)
|| (fa->eval_kind[i] == mzcmd_LOAD) /* stdin */
|| (fa->eval_kind[i] == mzcmd_REQUIRE_FILE)
|| (fa->eval_kind[i] == mzcmd_REQUIRE_LIB)
|| (fa->eval_kind[i] == mzcmd_REQUIRE_PLANET)
@ -274,6 +276,9 @@ static int finish_cmd_line_run(FinishArgs *fa, Repl_Proc repl)
if (!scheme_setjmp(newbuf)) {
if (fa->eval_kind[i] == mzcmd_EVAL) {
scheme_eval_string_all_with_prompt(fa->evals_and_loads[i], fa->global_env, 2);
} else if (fa->eval_kind[i] == mzcmd_LOAD) {
/* eval from stdin */
scheme_eval_all_with_prompt(NULL, fa->global_env, 2);
} else if (fa->eval_kind[i] == mzcmd_EMBEDDED) {
Scheme_Object *s, *e, *a[3], *eload;
eload = scheme_builtin_value("embedded-load");
@ -712,7 +717,11 @@ static int run_from_cmd_line(int argc, char *_argv[],
eval_kind = (int *)malloc(sizeof(int) * argc);
num_enl = 0;
while (!no_more_switches && argc && argv[0][0] == '-' && !is_number_arg(argv[0] + 1)) {
while (!no_more_switches
&& argc
&& argv[0][0] == '-'
&& argv[0][1]
&& !is_number_arg(argv[0] + 1)) {
real_switch = argv[0];
if (!strcmp("--help", argv[0]))
@ -1029,7 +1038,7 @@ static int run_from_cmd_line(int argc, char *_argv[],
/* No args => repl */
use_repl = 1;
init_ns = 1;
} else if (argv[0][0] != '-') {
} else {
/* No switches => -u mode */
script_mode = 1;
no_more_switches = 1;

View File

@ -144,6 +144,7 @@ EXPORTS
scheme_eval_string_with_prompt
scheme_eval_string_multi_with_prompt
scheme_eval_string_all_with_prompt
scheme_eval_all_with_prompt
scheme_eval_module_string
scheme_current_argument_stack
scheme_call_with_prompt

View File

@ -144,6 +144,7 @@ EXPORTS
scheme_eval_string_with_prompt
scheme_eval_string_multi_with_prompt
scheme_eval_string_all_with_prompt
scheme_eval_all_with_prompt
scheme_eval_module_string
scheme_current_argument_stack
scheme_call_with_prompt

View File

@ -146,6 +146,7 @@ scheme_eval_string_all
scheme_eval_string_with_prompt
scheme_eval_string_multi_with_prompt
scheme_eval_string_all_with_prompt
scheme_eval_all_with_prompt
scheme_eval_module_string
_scheme_apply_known_prim_closure
_scheme_apply_known_prim_closure_multi

View File

@ -146,6 +146,7 @@ scheme_eval_string_all
scheme_eval_string_with_prompt
scheme_eval_string_multi_with_prompt
scheme_eval_string_all_with_prompt
scheme_eval_all_with_prompt
scheme_eval_module_string
_scheme_apply_known_prim_closure
_scheme_apply_known_prim_closure_multi

View File

@ -11020,15 +11020,18 @@ expand_stx_to_top_form(int argc, Scheme_Object **argv)
1, -1, 1, scheme_false, 0, NULL, 0);
}
static Scheme_Object *do_eval_string_all(const char *str, Scheme_Env *env, int cont, int w_prompt)
static Scheme_Object *do_eval_string_all(Scheme_Object *port, const char *str, Scheme_Env *env,
int cont, int w_prompt)
/* cont == -2 => module (no result)
cont == -1 => single result
cont == 1 -> multiple result ok
cont == 2 -> multiple result ok, use current_print to show results */
cont == 2 -> #%top-interaction, multiple result ok, use current_print to show results */
{
Scheme_Object *port, *expr, *result = scheme_void;
Scheme_Object *expr, *result = scheme_void;
if (!port)
port = scheme_make_byte_string_input_port(str);
port = scheme_make_byte_string_input_port(str);
do {
expr = scheme_read_syntax(port, scheme_false);
@ -11055,6 +11058,9 @@ static Scheme_Object *do_eval_string_all(const char *str, Scheme_Env *env, int c
else
result = scheme_eval(expr, env);
} else {
if (cont == 2)
expr = scheme_make_pair(scheme_intern_symbol("#%top-interaction"), expr);
if (w_prompt)
result = scheme_eval_multi_with_prompt(expr, env);
else
@ -11090,37 +11096,43 @@ static Scheme_Object *do_eval_string_all(const char *str, Scheme_Env *env, int c
Scheme_Object *scheme_eval_string_all(const char *str, Scheme_Env *env, int cont)
{
return do_eval_string_all(str, env, cont, 0);
return do_eval_string_all(NULL, str, env, cont, 0);
}
Scheme_Object *scheme_eval_string(const char *str, Scheme_Env *env)
{
return do_eval_string_all(str, env, -1, 0);
return do_eval_string_all(NULL, str, env, -1, 0);
}
Scheme_Object *scheme_eval_module_string(const char *str, Scheme_Env *env)
{
return do_eval_string_all(str, env, -2, 0);
return do_eval_string_all(NULL, str, env, -2, 0);
}
Scheme_Object *scheme_eval_string_multi(const char *str, Scheme_Env *env)
{
return do_eval_string_all(str, env, 0, 0);
return do_eval_string_all(NULL, str, env, 0, 0);
}
Scheme_Object *scheme_eval_string_all_with_prompt(const char *str, Scheme_Env *env, int cont)
{
return do_eval_string_all(str, env, cont, 1);
return do_eval_string_all(NULL, str, env, cont, 1);
}
Scheme_Object *scheme_eval_all_with_prompt(Scheme_Object *port, Scheme_Env *env, int cont)
{
if (!port) port = scheme_orig_stdin_port;
return do_eval_string_all(port, NULL, env, cont, 1);
}
Scheme_Object *scheme_eval_string_with_prompt(const char *str, Scheme_Env *env)
{
return do_eval_string_all(str, env, -1, 1);
return do_eval_string_all(NULL, str, env, -1, 1);
}
Scheme_Object *scheme_eval_string_multi_with_prompt(const char *str, Scheme_Env *env)
{
return do_eval_string_all(str, env, 0, 1);
return do_eval_string_all(NULL, str, env, 0, 1);
}
void scheme_init_collection_paths_post(Scheme_Env *global_env, Scheme_Object *extra_dirs, Scheme_Object *post_dirs)

View File

@ -287,6 +287,7 @@ MZ_EXTERN Scheme_Object *scheme_eval_string_all(const char *str, Scheme_Env *env
MZ_EXTERN Scheme_Object *scheme_eval_string_with_prompt(const char *str, Scheme_Env *env);
MZ_EXTERN Scheme_Object *scheme_eval_string_multi_with_prompt(const char *str, Scheme_Env *env);
MZ_EXTERN Scheme_Object *scheme_eval_string_all_with_prompt(const char *str, Scheme_Env *env, int all);
MZ_EXTERN Scheme_Object *scheme_eval_all_with_prompt(Scheme_Object *port, Scheme_Env *env, int all);
MZ_EXTERN Scheme_Object *scheme_eval_module_string(const char *str, Scheme_Env *env);
MZ_EXTERN Scheme_Object *_scheme_apply_known_prim_closure(Scheme_Object *rator, int argc,

View File

@ -234,6 +234,7 @@ Scheme_Object *(*scheme_eval_string_all)(const char *str, Scheme_Env *env, int a
Scheme_Object *(*scheme_eval_string_with_prompt)(const char *str, Scheme_Env *env);
Scheme_Object *(*scheme_eval_string_multi_with_prompt)(const char *str, Scheme_Env *env);
Scheme_Object *(*scheme_eval_string_all_with_prompt)(const char *str, Scheme_Env *env, int all);
Scheme_Object *(*scheme_eval_all_with_prompt)(Scheme_Object *port, Scheme_Env *env, int all);
Scheme_Object *(*scheme_eval_module_string)(const char *str, Scheme_Env *env);
Scheme_Object *(*_scheme_apply_known_prim_closure)(Scheme_Object *rator, int argc,
Scheme_Object **argv);

View File

@ -154,6 +154,7 @@
scheme_extension_table->scheme_eval_string_with_prompt = scheme_eval_string_with_prompt;
scheme_extension_table->scheme_eval_string_multi_with_prompt = scheme_eval_string_multi_with_prompt;
scheme_extension_table->scheme_eval_string_all_with_prompt = scheme_eval_string_all_with_prompt;
scheme_extension_table->scheme_eval_all_with_prompt = scheme_eval_all_with_prompt;
scheme_extension_table->scheme_eval_module_string = scheme_eval_module_string;
scheme_extension_table->_scheme_apply_known_prim_closure = _scheme_apply_known_prim_closure;
scheme_extension_table->_scheme_apply_known_prim_closure_multi = _scheme_apply_known_prim_closure_multi;

View File

@ -154,6 +154,7 @@
#define scheme_eval_string_with_prompt (scheme_extension_table->scheme_eval_string_with_prompt)
#define scheme_eval_string_multi_with_prompt (scheme_extension_table->scheme_eval_string_multi_with_prompt)
#define scheme_eval_string_all_with_prompt (scheme_extension_table->scheme_eval_string_all_with_prompt)
#define scheme_eval_all_with_prompt (scheme_extension_table->scheme_eval_all_with_prompt)
#define scheme_eval_module_string (scheme_extension_table->scheme_eval_module_string)
#define _scheme_apply_known_prim_closure (scheme_extension_table->_scheme_apply_known_prim_closure)
#define _scheme_apply_known_prim_closure_multi (scheme_extension_table->_scheme_apply_known_prim_closure_multi)