summaryrefslogtreecommitdiffstats
path: root/share
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2016-12-26 12:38:01 -0800
committerKaz Kylheku <kaz@kylheku.com>2016-12-26 12:38:01 -0800
commit5c051fc12abc1d2a7d5207656b26af371a2916e9 (patch)
tree9a32ae14d560e8c69c3922732a644b6c448532b3 /share
parent8ffd07054df02af3fff3eedd64144e148b015f57 (diff)
downloadtxr-5c051fc12abc1d2a7d5207656b26af371a2916e9.tar.gz
txr-5c051fc12abc1d2a7d5207656b26af371a2916e9.tar.bz2
txr-5c051fc12abc1d2a7d5207656b26af371a2916e9.zip
New awk variable fw for fixed-width delimiting.
* share/txr/stdlib/awk.tl (sys:awk-state): New slots fw, fw-prev and fw-ranges. (sys:awk-state rec-to-f): New logic to handle self.fw. (sys:awk-let): New local fw symacro. * txr.1: Documented fw.
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)))