summaryrefslogtreecommitdiffstats
path: root/txr.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2014-03-07 00:03:48 -0800
committerKaz Kylheku <kaz@kylheku.com>2014-03-07 00:03:48 -0800
commit82a698d3339cfd92912d02484e1d67e792212ecf (patch)
tree785e85c5e71536ab19929f4043205c593857db66 /txr.c
parente729bd054e479bae074ed46df06f0c169db2fcc7 (diff)
downloadtxr-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.c16
1 files changed, 8 insertions, 8 deletions
diff --git a/txr.c b/txr.c
index 2e3b6ac5..9dbb0ebd 100644
--- a/txr.c
+++ b/txr.c
@@ -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)