diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2016-12-26 12:38:01 -0800 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2016-12-26 12:38:01 -0800 |
commit | 5c051fc12abc1d2a7d5207656b26af371a2916e9 (patch) | |
tree | 9a32ae14d560e8c69c3922732a644b6c448532b3 /share | |
parent | 8ffd07054df02af3fff3eedd64144e148b015f57 (diff) | |
download | txr-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.tl | 23 |
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))) |