Implement pattern-based variable operators.

This commit adds an implementation for the '#', '##', '%', and '%%'
variable operators.

* gash/word.scm (word->qword): Add an implementation for the
'<sh-ref-except-min>', '<sh-ref-except-max>', '<sh-ref-skip-min>',
and '<sh-ref-skip-max>' cases.
This commit is contained in:
Timothy Sample 2019-08-20 12:45:59 -04:00
parent 5c1602d5f2
commit 5a27fd59cc
2 changed files with 13 additions and 12 deletions

View File

@ -152,9 +152,6 @@ FULL_TESTS = \
TESTS = $(UNIT_TESTS) $(FULL_TESTS)
XFAIL_TESTS = \
tests/variable-patterns.org
TEST_DATA_FILES = \
tests/data/star/2 \
tests/data/star/3 \

View File

@ -1,5 +1,5 @@
;;; Gash -- Guile As SHell
;;; Copyright © 2018 Timothy Sample <samplet@ngyro.com>
;;; Copyright © 2018, 2019 Timothy Sample <samplet@ngyro.com>
;;;
;;; This file is part of Gash.
;;;
@ -285,14 +285,18 @@ and arithmetic substitions."
(or (and (parameter-ref name)
(word->qword (or value "")))
""))
(('<sh-ref-except-min> name pattern)
(error (format #f "Not implemented: ~s" word)))
(('<sh-ref-except-max> name pattern)
(error (format #f "Not implemented: ~s" word)))
(('<sh-ref-skip-min> name pattern)
(error (format #f "Not implemented: ~s" word)))
(('<sh-ref-skip-max> name pattern)
(error (format #f "Not implemented: ~s" word)))
(('<sh-ref-except-min> name pattern-word)
(let ((pattern (expand-word pattern-word #:output 'pattern)))
(pattern-drop-right pattern (parameter-ref name ""))))
(('<sh-ref-except-max> name pattern-word)
(let ((pattern (expand-word pattern-word #:output 'pattern)))
(pattern-drop-right pattern (parameter-ref name "") #:greedy? #t)))
(('<sh-ref-skip-min> name pattern-word)
(let ((pattern (expand-word pattern-word #:output 'pattern)))
(pattern-drop pattern (parameter-ref name ""))))
(('<sh-ref-skip-max> name pattern-word)
(let ((pattern (expand-word pattern-word #:output 'pattern)))
(pattern-drop pattern (parameter-ref name "") #:greedy? #t)))
(('<sh-ref-length> name)
(number->string (string-length (parameter-ref name ""))))
(_ (map word->qword word))))