summaryrefslogtreecommitdiffstats
path: root/share
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2017-06-07 23:51:10 -0700
committerKaz Kylheku <kaz@kylheku.com>2017-06-07 23:51:10 -0700
commit3420284a02f816d3e5208ea1489c7b6afed6539a (patch)
tree8d73fdc393f8a3b6737863745d2899665c1c228c /share
parentde885069bebb4e674b7579b22dbecab0742ba02b (diff)
downloadtxr-3420284a02f816d3e5208ea1489c7b6afed6539a.tar.gz
txr-3420284a02f816d3e5208ea1489c7b6afed6539a.tar.bz2
txr-3420284a02f816d3e5208ea1489c7b6afed6539a.zip
awk macro: fix broken rng.
Bug: rng fails to activate when the to and from condition are true for the same record. * share/txr/stdlib/awk.tl (sys:awk-mac-let): Rename the flag-new gensym holder to flag-act, since it indicates whether the range is active, either from before or due to being activated by the current record. A new gensym is added to indicate whether the range is being deactivated in this record. The inclusive rng range refers to this variable rather than flag-old. But a bug emulation is provided to refer to the wrong variable. * txr.1: Added compatibility note.
Diffstat (limited to 'share')
-rw-r--r--share/txr/stdlib/awk.tl24
1 files changed, 15 insertions, 9 deletions
diff --git a/share/txr/stdlib/awk.tl b/share/txr/stdlib/awk.tl
index b0f54aaf..7c4033e6 100644
--- a/share/txr/stdlib/awk.tl
+++ b/share/txr/stdlib/awk.tl
@@ -302,7 +302,8 @@
(from-expr-ex (sys:expand from-expr e))
(to-expr-ex (sys:expand to-expr e))
(flag-old (gensym))
- (flag-new (gensym)))
+ (flag-act (gensym))
+ (flag-deact (gensym)))
(tree-bind ((from-expr-ex fe-fv fe-ff fe-ev fe-ef)
(to-expr-ex te-fv te-ff te-ev te-ef)
(from-expr-orig to-expr-orig))
@@ -330,16 +331,21 @@
'functions)
(push rng-temp (qref ,awc rng-expr-temps))
(push ^(placelet ((flag (vecref (qref ,',aws-sym rng-vec) ,ix)))
- (let* ((,flag-old flag) ,flag-new)
+ (let ((,flag-old flag) ,flag-act ,flag-deact)
(when (or ,flag-old ,from-expr-ex)
- (set ,flag-new t))
- (when (and ,flag-new ,to-expr-ex)
- (set ,flag-new nil))
+ (set ,flag-act t))
+ (when (and ,flag-act ,to-expr-ex)
+ (set ,flag-act nil)
+ (set ,flag-deact t))
,*(caseq style
- (rng ^((or (set flag ,flag-new) ,flag-old)))
- (-rng- ^((and (set flag ,flag-new) ,flag-old)))
- (rng- ^((set flag ,flag-new)))
- (-rng ^((set flag ,flag-new) ,flag-old)))))
+ (rng ^((or (set flag ,flag-act)
+ ,(if (and (plusp sys:compat)
+ (<= sys:compat 177))
+ flag-old
+ flag-deact))))
+ (-rng- ^((and (set flag ,flag-act) ,flag-old)))
+ (rng- ^((set flag ,flag-act)))
+ (-rng ^((set flag ,flag-act) ,flag-old)))))
(qref ,awc rng-exprs))
rng-temp)))
(rng (:form form from-expr to-expr)