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 | |
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.
-rw-r--r-- | ChangeLog | 16 | ||||
-rw-r--r-- | lib.c | 6 | ||||
-rw-r--r-- | lib.h | 1 | ||||
-rw-r--r-- | txr.c | 16 |
4 files changed, 31 insertions, 8 deletions
@@ -1,5 +1,21 @@ 2014-03-06 Kaz Kylheku <kaz@kylheku.com> + * 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. + +2014-03-06 Kaz Kylheku <kaz@kylheku.com> + * lib.c (assert_s): New global variable. (obj_init): Intern assert symbol, store in assert_s. @@ -426,6 +426,12 @@ val pop(val *plist) return ret; } +val upop(val *plist, val *pundo) +{ + *pundo = *plist; + return pop(plist); +} + val push(val value, val *plist) { /* Unsafe for mutating object fields: use mpush macro. */ @@ -385,6 +385,7 @@ val *tail(val cons); val *lastcons(val list); val *ltail(val *cons); val pop(val *plist); +val upop(val *plist, val *pundo); val push(val v, val *plist); val copy_list(val list); val make_like(val list, val thatobj); @@ -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) |