summaryrefslogtreecommitdiffstats
path: root/share
diff options
context:
space:
mode:
Diffstat (limited to 'share')
-rw-r--r--share/txr/stdlib/awk.tl23
1 files changed, 23 insertions, 0 deletions
diff --git a/share/txr/stdlib/awk.tl b/share/txr/stdlib/awk.tl
index 1e53d37f..0c2e1ee5 100644
--- a/share/txr/stdlib/awk.tl
+++ b/share/txr/stdlib/awk.tl
@@ -29,6 +29,7 @@
(defstruct sys:awk-state ()
(rs "\n") krs
fs ft kfs
+ fw fw-prev fw-ranges
(ofs " ")
(ors "\n")
(inputs)
@@ -62,6 +63,27 @@
(defmeth sys:awk-state rec-to-f (self)
(cond
+ (self.fw
+ (unless (eq self.fw-prev self.fw)
+ (let ((ranges (reduce-left
+ (tb ((list . sum) item)
+ (let ((ns (+ sum item)))
+ ^((,*list #R(,sum ,ns)) . ,ns)))
+ self.fw '(nil . 0))))
+ (set self.fw-prev self.fw
+ self.fw-ranges (car ranges))))
+ (let ((i 0) end
+ (l (length self.rec)))
+ (set self.fields
+ (build (each ((r self.fw-ranges))
+ (set end (to r))
+ (if (>= (from r) l)
+ (return nil))
+ (add [self.rec r])
+ (inc i))
+ (if (< end l)
+ (add [self.rec end..:])))
+ self.nf i)))
(self.fs
(when self.ft
(throwf 'eval-error "awk: both fs and ft set"))
@@ -250,6 +272,7 @@
(krs (qref ,aws-sym krs))
(fs (qref ,aws-sym fs))
(ft (qref ,aws-sym ft))
+ (fw (qref ,aws-sym fw))
(kfs (qref ,aws-sym kfs))
(ofs (qref ,aws-sym ofs))
(ors (qref ,aws-sym ors)))