diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2014-03-07 00:03:48 -0800 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2014-03-07 00:03:48 -0800 |
commit | 82a698d3339cfd92912d02484e1d67e792212ecf (patch) | |
tree | 785e85c5e71536ab19929f4043205c593857db66 /txr.c | |
parent | e729bd054e479bae074ed46df06f0c169db2fcc7 (diff) | |
download | txr-82a698d3339cfd92912d02484e1d67e792212ecf.tar.gz txr-82a698d3339cfd92912d02484e1d67e792212ecf.tar.bz2 txr-82a698d3339cfd92912d02484e1d67e792212ecf.zip |
* lib.c (upop): New function.
* lib.h (upop): Declared.
* txr.c (txr_main): Two bugfixes. One is that the argument -
was being pushed back twice resulting in *args* being ("-" "-").
This is because the option processing loop checked for "-" and pushed
it back into args, and then some logic after the loop pushed arg back
into args again. But, these pushes were wrong because they push
back a different cons cell; we would like to be able to
do (ldiff *full-args* *args*). This is solved by upop, which provides
one element of undo. After upop, we can restore the prior list
from the undo save location.
Diffstat (limited to 'txr.c')
-rw-r--r-- | txr.c | 16 |
1 files changed, 8 insertions, 8 deletions
@@ -178,7 +178,7 @@ int txr_main(int argc, char **argv) val bindings = nil; val evaled = nil; int match_loglevel = opt_loglevel; - val arg; + val arg_undo = nil, arg; list_collect_decl(arg_list, arg_tail); prot1(&spec_file_str); @@ -199,15 +199,15 @@ int txr_main(int argc, char **argv) arg_list = cdr(arg_list); - for (arg = pop(&arg_list); arg && car(arg) == chr('-'); arg = pop(&arg_list)) + for (arg = upop(&arg_list, &arg_undo); + arg && car(arg) == chr('-'); + arg = upop(&arg_list, &arg_undo)) { if (equal(arg, lit("--"))) break; - if (equal(arg, lit("-"))) { - push(arg, &arg_list); + if (equal(arg, lit("-"))) break; - } if (equal(sub(arg, zero, two), lit("-D"))) { val dopt_arg = sub(arg, two, t); @@ -247,7 +247,7 @@ int txr_main(int argc, char **argv) return EXIT_FAILURE; } - arg = pop(&arg_list); + arg = upop(&arg_list, &arg_undo); switch (c_chr(opt)) { case 'a': @@ -383,7 +383,7 @@ int txr_main(int argc, char **argv) specstring = cat_str(list(specstring, string(L"\n"), nao), nil); yyin_stream = make_string_byte_input_stream(specstring); if (arg) - push(arg, &arg_list); + arg_list = arg_undo; } else if (spec_file) { if (wcscmp(c_str(spec_file), L"-") != 0) { FILE *in = w_fopen(c_str(spec_file), L"r"); @@ -395,7 +395,7 @@ int txr_main(int argc, char **argv) spec_file_str = lit("stdin"); } if (arg) - push(arg, &arg_list); + arg_list = arg_undo; } else { if (!arg) { if (evaled) |