lua: pattern character sets [...] and [^...] +3 tests; tests reach deeper code
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Has been cancelled
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Has been cancelled
This commit is contained in:
@@ -730,14 +730,76 @@
|
||||
|
||||
;; Match a single "pattern atom" (char or class) at src position — returns true or false.
|
||||
;; pat-pos is position of the atom start. Returns the atom's length in pat (1 or 2).
|
||||
(define
|
||||
lua-pat-set-end
|
||||
(fn (pat pat-pos)
|
||||
(let ((i (+ pat-pos 1)))
|
||||
(begin
|
||||
(when (and (< i (len pat)) (= (char-at pat i) "^"))
|
||||
(set! i (+ i 1)))
|
||||
(when (and (< i (len pat)) (= (char-at pat i) "]"))
|
||||
(set! i (+ i 1)))
|
||||
(define
|
||||
se-loop
|
||||
(fn ()
|
||||
(when (< i (len pat))
|
||||
(let ((c (char-at pat i)))
|
||||
(cond
|
||||
((= c "]") nil)
|
||||
((= c "%")
|
||||
(begin (set! i (+ i 2)) (se-loop)))
|
||||
(else
|
||||
(begin (set! i (+ i 1)) (se-loop))))))))
|
||||
(se-loop)
|
||||
i))))
|
||||
|
||||
(define
|
||||
lua-pat-atom-len
|
||||
(fn (pat pat-pos)
|
||||
(cond
|
||||
((>= pat-pos (len pat)) 0)
|
||||
((= (char-at pat pat-pos) "%") 2)
|
||||
((= (char-at pat pat-pos) "[")
|
||||
(let ((end (lua-pat-set-end pat pat-pos)))
|
||||
(- (+ end 1) pat-pos)))
|
||||
(else 1))))
|
||||
|
||||
(define
|
||||
lua-pat-set-match
|
||||
(fn (pat set-start sc)
|
||||
(let ((i (+ set-start 1)) (negated false) (matched false))
|
||||
(begin
|
||||
(when (and (< i (len pat)) (= (char-at pat i) "^"))
|
||||
(begin (set! negated true) (set! i (+ i 1))))
|
||||
(define
|
||||
sm-loop
|
||||
(fn ()
|
||||
(when (and (< i (len pat)) (not (= (char-at pat i) "]")))
|
||||
(let ((c (char-at pat i)))
|
||||
(cond
|
||||
((= c "%")
|
||||
(cond
|
||||
((< (+ i 1) (len pat))
|
||||
(begin
|
||||
(when (lua-pat-class-match (char-at pat (+ i 1)) sc)
|
||||
(set! matched true))
|
||||
(set! i (+ i 2))
|
||||
(sm-loop)))
|
||||
(else (set! i (+ i 1)))))
|
||||
((and (< (+ i 2) (len pat)) (= (char-at pat (+ i 1)) "-") (not (= (char-at pat (+ i 2)) "]")))
|
||||
(begin
|
||||
(when (and (>= sc c) (<= sc (char-at pat (+ i 2))))
|
||||
(set! matched true))
|
||||
(set! i (+ i 3))
|
||||
(sm-loop)))
|
||||
(else
|
||||
(begin
|
||||
(when (= sc c) (set! matched true))
|
||||
(set! i (+ i 1))
|
||||
(sm-loop))))))))
|
||||
(sm-loop)
|
||||
(if negated (not matched) matched)))))
|
||||
|
||||
(define
|
||||
lua-pat-atom-match
|
||||
(fn (pat pat-pos s s-pos)
|
||||
@@ -752,6 +814,7 @@
|
||||
(cond
|
||||
((>= (+ pat-pos 1) (len pat)) false)
|
||||
(else (lua-pat-class-match (char-at pat (+ pat-pos 1)) sc))))
|
||||
((= pc "[") (lua-pat-set-match pat pat-pos sc))
|
||||
(else (= pc sc))))))))
|
||||
|
||||
;; Match pattern against string starting at s-pos and pat-pos. Returns end-pos (inclusive+1) or -1 on no-match.
|
||||
|
||||
Reference in New Issue
Block a user