~ chicken-core (chicken-5) 0f5e52f897ab6b034eb3afadaf041fd899c2bf0f
commit 0f5e52f897ab6b034eb3afadaf041fd899c2bf0f
Author: felix <felix@call-with-current-continuation.org>
AuthorDate: Sat Jul 17 15:41:32 2010 +0200
Commit: felix <felix@call-with-current-continuation.org>
CommitDate: Tue Jul 27 13:09:33 2010 +0200
changed internal representation of irregex objects; added cache for irregex; no wrapper object in regex.scm
diff --git a/irregex-core.scm b/irregex-core.scm
index ed3be22d..a235243e 100644
--- a/irregex-core.scm
+++ b/irregex-core.scm
@@ -56,69 +56,144 @@
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;; Data Structures
-(define irregex-tag '*irregex-tag*)
-
-(define (make-irregex dfa dfa/search dfa/extract nfa flags
- submatches lengths names)
- (vector irregex-tag dfa dfa/search dfa/extract nfa flags
- submatches lengths names))
-
-(define (irregex? obj)
- (and (vector? obj)
- (= 9 (vector-length obj))
- (eq? irregex-tag (vector-ref obj 0))))
-
-(define (irregex-dfa x) (vector-ref x 1))
-(define (irregex-dfa/search x) (vector-ref x 2))
-(define (irregex-dfa/extract x) (vector-ref x 3))
-(define (irregex-nfa x) (vector-ref x 4))
-(define (irregex-flags x) (vector-ref x 5))
-(define (irregex-num-submatches x) (vector-ref x 6))
-(define (irregex-lengths x) (vector-ref x 7))
-(define (irregex-names x) (vector-ref x 8))
-
-(define (irregex-new-matches irx)
- (make-irregex-match (irregex-num-submatches irx) (irregex-names irx)))
-
-(define (irregex-reset-matches! m)
- (do ((i (- (vector-length m) 1) (- i 1)))
- ((<= i 3) m)
- (vector-set! m i #f)))
-
-(define (irregex-copy-matches m)
- (and (vector? m)
- (let ((r (make-vector (vector-length m))))
- (do ((i (- (vector-length m) 1) (- i 1)))
- ((< i 0) r)
- (vector-set! r i (vector-ref m i))))))
-
-(define irregex-match-tag '*irregex-match-tag*)
-
-(define (irregex-match-data? obj)
- (and (vector? obj)
- (>= (vector-length obj) 11)
- (eq? irregex-match-tag (vector-ref obj 0))))
-
-(define (make-irregex-match count names)
- (let ((res (make-vector (+ (* 4 (+ 2 count)) 3) #f)))
- (vector-set! res 0 irregex-match-tag)
- (vector-set! res 2 names)
- res))
-
-(define (irregex-match-num-submatches m)
- (- (quotient (- (vector-length m) 3) 4) 2))
-
-(define (irregex-match-chunker m)
- (vector-ref m 1))
-(define (irregex-match-names m)
- (vector-ref m 2))
-(define (irregex-match-chunker-set! m str)
- (vector-set! m 1 str))
-
-(define (%irregex-match-start-chunk m n) (vector-ref m (+ 3 (* n 4))))
-(define (%irregex-match-start-index m n) (vector-ref m (+ 4 (* n 4))))
-(define (%irregex-match-end-chunk m n) (vector-ref m (+ 5 (* n 4))))
-(define (%irregex-match-end-index m n) (vector-ref m (+ 6 (* n 4))))
+(cond-expand
+ (chicken
+ (begin
+ (define-syntax (internal x r c)
+ `(,(with-input-from-string (cadr x) read) ,@(cddr x)))
+ (define-inline (make-irregex dfa dfa/search dfa/extract nfa flags
+ submatches lengths names)
+ (internal "##sys#make-structure" 'regexp dfa dfa/search dfa/extract nfa flags
+ submatches lengths names))
+ (define (irregex? x)
+ (internal "##sys#structure?" x 'regexp))
+ (define (irregex-dfa x)
+ (internal "##sys#check-structure" x 'regexp 'irregex-dfa)
+ (internal "##sys#slot" x 1))
+ (define (irregex-dfa/search x)
+ (internal "##sys#check-structure" x 'regexp 'irregex-dfa/search)
+ (internal "##sys#slot" x 2))
+ (define (irregex-dfa/extract x)
+ (internal "##sys#check-structure" x 'regexp 'irregex-dfa/extract)
+ (internal "##sys#slot" x 3))
+ (define (irregex-nfa x)
+ (internal "##sys#check-structure" x 'regexp 'irregex-nfa)
+ (internal "##sys#slot" x 4))
+ (define (irregex-flags x)
+ (internal "##sys#check-structure" x 'regexp 'irregex-flags)
+ (internal "##sys#slot" x 5))
+ (define (irregex-num-submatches x)
+ (internal "##sys#check-structure" x 'regexp 'irregex-num-submatches)
+ (internal "##sys#slot" x 6))
+ (define (irregex-lengths x)
+ (internal "##sys#check-structure" x 'regexp 'irregex-lengths)
+ (internal "##sys#slot" x 7))
+ (define (irregex-names x)
+ (internal "##sys#check-structure" x 'regexp 'irregex-names)
+ (internal "##sys#slot" x 8))))
+ (else
+ (begin
+ (define irregex-tag '*irregex-tag*)
+ (define (make-irregex dfa dfa/search dfa/extract nfa flags
+ submatches lengths names)
+ (vector irregex-tag dfa dfa/search dfa/extract nfa flags
+ submatches lengths names))
+ (define (irregex? obj)
+ (and (vector? obj)
+ (= 9 (vector-length obj))
+ (eq? irregex-tag (vector-ref obj 0))))
+ (define (irregex-dfa x) (vector-ref x 1))
+ (define (irregex-dfa/search x) (vector-ref x 2))
+ (define (irregex-dfa/extract x) (vector-ref x 3))
+ (define (irregex-nfa x) (vector-ref x 4))
+ (define (irregex-flags x) (vector-ref x 5))
+ (define (irregex-num-submatches x) (vector-ref x 6))
+ (define (irregex-lengths x) (vector-ref x 7))
+ (define (irregex-names x) (vector-ref x 8)))))
+
+(cond-expand
+ (chicken
+ (begin
+ (define (make-irregex-match count names)
+ (internal
+ "##sys#make-structure"
+ 'regexp-match
+ (make-vector (+ (* 4 (+ 2 count)) 3) #f)
+ names
+ #f))
+ (define (irregex-new-matches irx)
+ (make-irregex-match (irregex-num-submatches irx) (irregex-names irx)))
+ (define (irregex-reset-matches! m)
+ (let ((v (internal "##sys#slot" m 1)))
+ (vector-fill! v #f)
+ m))
+ (define (irregex-copy-matches m)
+ (and (internal "##sys#structure?" m 'regexp-match)
+ (internal
+ "##sys#make-structure"
+ 'regexp-match
+ (let* ((v (internal "##sys#slot" m 1))
+ (v2 (make-vector (internal "##sys#size" v))))
+ (vector-copy! v v2)
+ v2)
+ (internal "##sys#slot" m 2)
+ (internal "##sys#slot" m 3))))
+ (define (irregex-match-data? obj)
+ (internal "##sys#structure?" obj 'regexp-match))
+ (define (irregex-match-num-submatches m)
+ (internal "##sys#check-structure" m 'regexp-match 'irregex-match-num-submatches)
+ (- (quotient (vector-length (internal "##sys#slot" m 1)) 4) 2))
+ (define (irregex-match-chunker m)
+ (internal "##sys#slot" m 3))
+ (define (irregex-match-names m)
+ (internal "##sys#check-structure" m 'regexp-match 'irregex-match-names)
+ (internal "##sys#slot" m 2))
+ (define (irregex-match-chunker-set! m str)
+ (internal "##sys#setslot" m 3 str))
+ (define-inline (%irregex-match-start-chunk m n)
+ (internal "##sys#slot" (internal "##sys#slot" m 1) (* n 4)))
+ (define-inline (%irregex-match-start-index m n)
+ (internal "##sys#slot" (internal "##sys#slot" m 1) (+ 1 (* n 4))))
+ (define-inline (%irregex-match-end-chunk m n)
+ (internal "##sys#slot" (internal "##sys#slot" m 1) (+ 2 (* n 4))))
+ (define (%irregex-match-end-index m n)
+ (internal "##sys#slot" (internal "##sys#slot" m 1) (+ 3 (* n 4))))))
+ (else
+ (begin
+ (define (irregex-new-matches irx)
+ (make-irregex-match (irregex-num-submatches irx) (irregex-names irx)))
+ (define (irregex-reset-matches! m)
+ (do ((i (- (vector-length m) 1) (- i 1)))
+ ((<= i 3) m)
+ (vector-set! m i #f)))
+ (define (irregex-copy-matches m)
+ (and (vector? m)
+ (let ((r (make-vector (vector-length m))))
+ (do ((i (- (vector-length m) 1) (- i 1)))
+ ((< i 0) r)
+ (vector-set! r i (vector-ref m i))))))
+ (define irregex-match-tag '*irregex-match-tag*)
+ (define (irregex-match-data? obj)
+ (and (vector? obj)
+ (>= (vector-length obj) 11)
+ (eq? irregex-match-tag (vector-ref obj 0))))
+ (define (make-irregex-match count names)
+ (let ((res (make-vector (+ (* 4 (+ 2 count)) 3) #f)))
+ (vector-set! res 0 irregex-match-tag)
+ (vector-set! res 2 names)
+ res))
+ (define (irregex-match-num-submatches m)
+ (- (quotient (- (vector-length m) 3) 4) 2))
+ (define (irregex-match-chunker m)
+ (vector-ref m 1))
+ (define (irregex-match-names m)
+ (vector-ref m 2))
+ (define (irregex-match-chunker-set! m str)
+ (vector-set! m 1 str))
+ (define (%irregex-match-start-chunk m n) (vector-ref m (+ 3 (* n 4))))
+ (define (%irregex-match-start-index m n) (vector-ref m (+ 4 (* n 4))))
+ (define (%irregex-match-end-chunk m n) (vector-ref m (+ 5 (* n 4))))
+ (define (%irregex-match-end-index m n) (vector-ref m (+ 6 (* n 4)))))))
;; public interface with error checking
(define (irregex-match-start-chunk m n)
@@ -138,14 +213,26 @@
(error "irregex-match-end-index: not a valid index" m n))
(%irregex-match-end-index m n))
-(define (irregex-match-start-chunk-set! m n start)
- (vector-set! m (+ 3 (* n 4)) start))
-(define (irregex-match-start-index-set! m n start)
- (vector-set! m (+ 4 (* n 4)) start))
-(define (irregex-match-end-chunk-set! m n end)
- (vector-set! m (+ 5 (* n 4)) end))
-(define (irregex-match-end-index-set! m n end)
- (vector-set! m (+ 6 (* n 4)) end))
+(cond-expand
+ (chicken
+ (define-inline (irregex-match-start-chunk-set! m n start)
+ (vector-set! (internal "##sys#slot" m 1) (* n 4) start))
+ (define-inline (irregex-match-start-index-set! m n start)
+ (vector-set! (internal "##sys#slot" m 1) (+ 1 (* n 4)) start))
+ (define-inline (irregex-match-end-chunk-set! m n end)
+ (vector-set! (internal "##sys#slot" m 1) (+ 2 (* n 4)) end))
+ (define-inline (irregex-match-end-index-set! m n end)
+ (vector-set! (internal "##sys#slot" m 1) (+ 3 (* n 4)) end)))
+ (else
+ (begin
+ (define (irregex-match-start-chunk-set! m n start)
+ (vector-set! m (+ 3 (* n 4)) start))
+ (define (irregex-match-start-index-set! m n start)
+ (vector-set! m (+ 4 (* n 4)) start))
+ (define (irregex-match-end-chunk-set! m n end)
+ (vector-set! m (+ 5 (* n 4)) end))
+ (define (irregex-match-end-index-set! m n end)
+ (vector-set! m (+ 6 (* n 4)) end)))))
(define (irregex-match-index m opt)
(if (pair? opt)
@@ -154,15 +241,22 @@
(else (error "unknown match name" (car opt))))
0))
-(define (%irregex-match-valid-index? m n)
- (and (< (+ 3 (* n 4)) (vector-length m))
- (vector-ref m (+ 4 (* n 4)))))
+(cond-expand
+ (chicken
+ (define-inline (%irregex-match-valid-index? m n)
+ (let ((v (internal "##sys#slot" m 1)))
+ (and (< (* n 4) (vector-length v))
+ (vector-ref v (+ 1 (* n 4)))))))
+ (else
+ (define (%irregex-match-valid-index? m n)
+ (and (< (+ 3 (* n 4)) (vector-length m))
+ (vector-ref m (+ 4 (* n 4)))))))
(define (irregex-match-valid-index? m n)
(if (not (irregex-match-data? m))
(error "irregex-match-valid-index?: not match data" m))
(if (not (integer? n))
- (error "irregex-match-valid-index?: not match data" n))
+ (error "irregex-match-valid-index?: not a valid index" n))
(%irregex-match-valid-index? m n))
(define (irregex-match-substring m . opt)
@@ -419,29 +513,35 @@
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;; Flags
-(define (bit-shr n i)
- (quotient n (expt 2 i)))
-
-(define (bit-shl n i)
- (* n (expt 2 i)))
-
-(define (bit-not n) (- #xFFFF n))
-
-(define (bit-ior a b)
- (cond
- ((zero? a) b)
- ((zero? b) a)
- (else
- (+ (if (or (odd? a) (odd? b)) 1 0)
- (* 2 (bit-ior (quotient a 2) (quotient b 2)))))))
-
-(define (bit-and a b)
- (cond
- ((zero? a) 0)
- ((zero? b) 0)
- (else
- (+ (if (and (odd? a) (odd? b)) 1 0)
- (* 2 (bit-and (quotient a 2) (quotient b 2)))))))
+(cond-expand
+ (chicken
+ (begin
+ (define-inline (bit-shl n i) (arithmetic-shift n i))
+ (define-inline (bit-shr n i) (arithmetic-shift n (fxneg i)))
+ (define-inline (bit-not n) (bitwise-not n))
+ (define-inline (bit-ior a b) (bitwise-ior a b))
+ (define-inline (bit-and a b) (bitwise-and a b))))
+ (else
+ (begin
+ (define (bit-shr n i)
+ (quotient n (expt 2 i)))
+ (define (bit-shl n i)
+ (* n (expt 2 i)))
+ (define (bit-not n) (- #xFFFF n))
+ (define (bit-ior a b)
+ (cond
+ ((zero? a) b)
+ ((zero? b) a)
+ (else
+ (+ (if (or (odd? a) (odd? b)) 1 0)
+ (* 2 (bit-ior (quotient a 2) (quotient b 2)))))))
+ (define (bit-and a b)
+ (cond
+ ((zero? a) 0)
+ ((zero? b) 0)
+ (else
+ (+ (if (and (odd? a) (odd? b)) 1 0)
+ (* 2 (bit-and (quotient a 2) (quotient b 2))))))))))
(define (integer-log n)
(define (b8 n r)
@@ -1473,11 +1573,28 @@
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;; Compilation
+(cond-expand
+ (chicken
+ (define-syntax cached
+ (syntax-rules ()
+ ((_ arg fail) (build-cache 5 arg fail)))))
+ (else
+ (define-syntax cached
+ (syntax-rules ()
+ ((_ arg fail) fail)))))
+
(define (irregex x . o)
- (cond
- ((irregex? x) x)
- ((string? x) (apply string->irregex x o))
- (else (apply sre->irregex x o))))
+ (cond ((irregex? x) x)
+ ((null? o)
+ (cached
+ x
+ (if (string? x)
+ (string->irregex x)
+ (sre->irregex x))))
+ (else
+ (if (string? x)
+ (apply string->irregex x o)
+ (apply sre->irregex x o)))))
(define (string->irregex str . o)
(apply sre->irregex (apply string->sre str o) o))
@@ -2792,10 +2909,21 @@
;;
;; See http://compilers.iecc.com/comparch/article/07-10-026
+(cond-expand
+ (chicken
+ (begin
+ (define-inline (match-vector-ref m i)
+ (vector-ref (internal "##sys#slot" m 1) i))
+ (define-inline (match-vector-set! m i x)
+ (vector-set! (internal "##sys#slot" m 1) i x))))
+ (else
+ (define match-vector-ref vector-ref)
+ (define match-vector-set! vector-set!)))
+
(define (sre-match-extractor sre num-submatches)
(let* ((tmp (+ num-submatches 1))
- (tmp-end-src-offset (+ 5 (* tmp 4)))
- (tmp-end-index-offset (+ 6 (* tmp 4))))
+ (tmp-end-src-offset (+ 2 (* tmp 4)))
+ (tmp-end-index-offset (+ 3 (* tmp 4))))
(let lp ((sre sre) (n 1) (submatch-deps? #f))
(cond
((not (sre-has-submatches? sre))
@@ -2826,25 +2954,25 @@
best-src
best-index)))
(best-src
- (vector-set! matches tmp-end-src-offset best-src)
- (vector-set! matches tmp-end-index-offset best-index)
+ (match-vector-set! matches tmp-end-src-offset best-src)
+ (match-vector-set! matches tmp-end-index-offset best-index)
#t)
(else
#f))
(if (and (match-left cnk start i end2 k matches)
- (eq? end2 (vector-ref matches
+ (eq? end2 (match-vector-ref matches
tmp-end-src-offset))
- (eqv? k (vector-ref matches
+ (eqv? k (match-vector-ref matches
tmp-end-index-offset))
(match-right cnk end2 k end j matches))
(let ((right-src
- (vector-ref matches tmp-end-src-offset))
+ (match-vector-ref matches tmp-end-src-offset))
(right
- (vector-ref matches tmp-end-index-offset)))
+ (match-vector-ref matches tmp-end-index-offset)))
(cond
((and (eq? end right-src) (eqv? j right))
- (vector-set! matches tmp-end-src-offset end)
- (vector-set! matches tmp-end-index-offset j)
+ (match-vector-set! matches tmp-end-src-offset end)
+ (match-vector-set! matches tmp-end-index-offset j)
#t)
((or (not best-src)
(if (eq? best-src right-src)
@@ -2868,8 +2996,8 @@
submatch-deps?)))
(lambda (cnk start i end j matches)
(or (and (match-first cnk start i end j matches)
- (eq? end (vector-ref matches tmp-end-src-offset))
- (eqv? j (vector-ref matches tmp-end-index-offset)))
+ (eq? end (match-vector-ref matches tmp-end-src-offset))
+ (eqv? j (match-vector-ref matches tmp-end-index-offset)))
(match-rest cnk start i end j matches))))))
((* +)
(letrec ((match-once
@@ -2877,21 +3005,21 @@
(match-all
(lambda (cnk start i end j matches)
(if (match-once cnk start i end j matches)
- (let ((src (vector-ref matches tmp-end-src-offset))
- (k (vector-ref matches tmp-end-index-offset)))
+ (let ((src (match-vector-ref matches tmp-end-src-offset))
+ (k (match-vector-ref matches tmp-end-index-offset)))
(if (and src (or (not (eq? start src)) (< i k)))
(match-all cnk src k end j matches)
#t))
(begin
- (vector-set! matches tmp-end-src-offset start)
- (vector-set! matches tmp-end-index-offset i)
+ (match-vector-set! matches tmp-end-src-offset start)
+ (match-vector-set! matches tmp-end-index-offset i)
#t)))))
(if (eq? '* (car sre))
match-all
(lambda (cnk start i end j matches)
(and (match-once cnk start i end j matches)
- (let ((src (vector-ref matches tmp-end-src-offset))
- (k (vector-ref matches tmp-end-index-offset)))
+ (let ((src (match-vector-ref matches tmp-end-src-offset))
+ (k (match-vector-ref matches tmp-end-index-offset)))
(match-all cnk src k end j matches)))))))
((?)
(let ((match-once (lp (sre-sequence (cdr sre)) n #t)))
@@ -2901,19 +3029,19 @@
(($ submatch)
(let ((match-one
(lp (sre-sequence (cdr sre)) (+ n 1) #t))
- (start-src-offset (+ 3 (* n 4)))
- (start-index-offset (+ 4 (* n 4)))
- (end-src-offset (+ 5 (* n 4)))
- (end-index-offset (+ 6 (* n 4))))
+ (start-src-offset (* n 4))
+ (start-index-offset (+ 1 (* n 4)))
+ (end-src-offset (+ 2 (* n 4)))
+ (end-index-offset (+ 3 (* n 4))))
(lambda (cnk start i end j matches)
(cond
((match-one cnk start i end j matches)
- (vector-set! matches start-src-offset start)
- (vector-set! matches start-index-offset i)
- (vector-set! matches end-src-offset
- (vector-ref matches tmp-end-src-offset))
- (vector-set! matches end-index-offset
- (vector-ref matches tmp-end-index-offset))
+ (match-vector-set! matches start-src-offset start)
+ (match-vector-set! matches start-index-offset i)
+ (match-vector-set! matches end-src-offset
+ (match-vector-ref matches tmp-end-src-offset))
+ (match-vector-set! matches end-index-offset
+ (match-vector-ref matches tmp-end-index-offset))
#t)
(else
#f)))))
diff --git a/irregex.scm b/irregex.scm
index bd37aba9..875826dc 100644
--- a/irregex.scm
+++ b/irregex.scm
@@ -84,4 +84,42 @@
(register-feature! 'irregex)
+(define-syntax (build-cache x r c)
+ ;; (build-cache N ARG FAIL)
+ (let* ((n (cadr x))
+ (n2 (* n 2))
+ (arg (caddr x))
+ (fail (cadddr x))
+ (%cache (r 'cache))
+ (%index (r 'index))
+ (%arg (r 'arg))
+ (%let (r 'let))
+ (%let* (r 'let*))
+ (%if (r 'if))
+ (%fx+ (r 'fx+))
+ (%fxmod (r 'fxmod))
+ (%equal? (r 'equal?))
+ (%quote (r 'quote))
+ (%tmp (r 'tmp))
+ (%begin (r 'begin))
+ (cache (make-vector (add1 n2) #f)))
+ (##sys#setslot cache n2 0) ; last slot: current index
+ `(,%let* ((,%cache (,%quote ,cache)) ; we mutate a literal vector
+ (,%arg ,arg))
+ ,(let fold ((i 0))
+ (if (fx>= i n)
+ ;; this should be thread-safe: a context-switch can only
+ ;; happen before this code and in the call to FAIL.
+ `(,%let ((,%tmp ,fail)
+ (,%index (##sys#slot ,%cache ,n2)))
+ (##sys#setslot ,%cache ,%index ,%arg)
+ (##sys#setslot ,%cache (,%fx+ ,%index 1) ,%tmp)
+ (##sys#setislot
+ ,%cache ,n2
+ (##core#inline "C_u_fixnum_modulo" (,%fx+ ,%index 2) ,n2))
+ ,%tmp)
+ `(,%if (,%equal? (##sys#slot ,%cache ,(* i 2)) ,%arg)
+ (##sys#slot ,%cache ,(add1 (* i 2)))
+ ,(fold (add1 i))))))))
+
(include "irregex-core.scm")
diff --git a/regex.scm b/regex.scm
index 2ae4e34b..8d0df304 100644
--- a/regex.scm
+++ b/regex.scm
@@ -40,118 +40,65 @@
regexp-escape
))
-;(include "common-declarations.scm")
+(include "common-declarations.scm")
(register-feature! 'regex)
;;; Record `regexp'
-(define-record regexp x)
-
-(define-syntax (build-cache x r c)
- ;; (build-cache N ARG FAIL)
- (let* ((n (cadr x))
- (n2 (* n 2))
- (arg (caddr x))
- (fail (cadddr x))
- (%cache (r 'cache))
- (%index (r 'index))
- (%arg (r 'arg))
- (%let (r 'let))
- (%let* (r 'let*))
- (%if (r 'if))
- (%fx+ (r 'fx+))
- (%fxmod (r 'fxmod))
- (%equal? (r 'equal?))
- (%quote (r 'quote))
- (%tmp (r 'tmp))
- (%begin (r 'begin))
- (cache (make-vector (add1 n2) #f)))
- (vector-set! cache n2 0) ; last slot: current index
- `(,%let* ((,%cache (,%quote ,cache))
- (,%arg ,arg))
- ,(let fold ((i 0))
- (if (>= i n)
- ;; this should be thread-safe: a context-switch can only
- ;; happen before this code and in the call to FAIL.
- `(,%let ((,%tmp ,fail)
- (,%index (##sys#slot ,%cache ,n2)))
- (##sys#setslot ,%cache ,%index ,%arg)
- (##sys#setslot ,%cache (,%fx+ ,%index 1) ,%tmp)
- (##sys#setislot
- ,%cache ,n2
- (##core#inline "C_u_fixnum_modulo" (,%fx+ ,%index 2) ,n2))
- ,%tmp)
- `(,%if (,%equal? (##sys#slot ,%cache ,(* i 2)) ,%arg)
- (##sys#slot ,%cache ,(add1 (* i 2)))
- ,(fold (add1 i))))))))
-
(define (regexp pat #!optional caseless extended utf8)
- (if (regexp? pat)
- pat
- (make-regexp
- (apply
- irregex
- pat
- (let ((opts '()))
- (when caseless (set! opts (cons 'i opts)))
- (when extended (set! opts (cons 'x opts)))
- (when utf8 (set! opts (cons 'utf8 opts)))
- opts))) ) )
+ (apply
+ irregex
+ pat
+ (let ((opts '()))
+ (when caseless (set! opts (cons 'i opts)))
+ (when extended (set! opts (cons 'x opts)))
+ (when utf8 (set! opts (cons 'utf8 opts)))
+ opts)))
-(define (unregexp x)
- (cond ((regexp? x) (regexp-x x))
- ((irregex? x) x)
- (else
- (build-cache
- 5 x
- (irregex x)))))
+(define regexp? irregex?)
;;; Basic `regexp' operations
(define (string-match rx str)
- (let ((rx (unregexp rx)))
- (and-let* ((m (irregex-match rx str)))
- (let loop ((i (irregex-match-num-submatches m))
- (res '()))
- (if (fx<= i 0)
- (cons str res)
- (loop (fx- i 1) (cons (irregex-match-substring m i) res)))))))
+ (and-let* ((m (irregex-match rx str)))
+ (let loop ((i (irregex-match-num-submatches m))
+ (res '()))
+ (if (fx<= i 0)
+ (cons str res)
+ (loop (fx- i 1) (cons (irregex-match-substring m i) res))))))
(define (string-match-positions rx str)
- (let ((rx (unregexp rx)))
- (and-let* ((m (irregex-match rx str)))
- (let loop ((i (irregex-match-num-submatches m))
- (res '()))
- (if (fx<= i 0)
- (cons (list 0 (string-length str)) res)
- (loop (fx- i 1) (cons (list (irregex-match-start-index m i)
- (irregex-match-end-index m i))
- res)))))))
+ (and-let* ((m (irregex-match rx str)))
+ (let loop ((i (irregex-match-num-submatches m))
+ (res '()))
+ (if (fx<= i 0)
+ (cons (list 0 (string-length str)) res)
+ (loop (fx- i 1) (cons (list (irregex-match-start-index m i)
+ (irregex-match-end-index m i))
+ res))))))
(define (string-search rx str #!optional (start 0) (range (string-length str)))
- (let ((rx (unregexp rx)))
- (let ((n (string-length str)))
- (and-let* ((m (irregex-search rx str start (min n (fx+ start range)))))
- (let loop ((i (irregex-match-num-submatches m))
- (res '()))
- (if (fx< i 0)
- res
- (loop (fx- i 1) (cons (irregex-match-substring m i) res))))))))
+ (let ((n (string-length str)))
+ (and-let* ((m (irregex-search rx str start (min n (fx+ start range)))))
+ (let loop ((i (irregex-match-num-submatches m))
+ (res '()))
+ (if (fx< i 0)
+ res
+ (loop (fx- i 1) (cons (irregex-match-substring m i) res)))))))
(define (string-search-positions rx str #!optional (start 0) (range (string-length str)))
- (let ((rx (unregexp rx)))
- (let ((n (string-length str)))
- (and-let* ((m (irregex-search rx str start (min n (fx+ start range)))))
- (let loop ((i (irregex-match-num-submatches m))
- (res '()))
- (if (fx< i 0)
- res
- (loop (fx- i 1) (cons (list (irregex-match-start-index m i)
- (irregex-match-end-index m i))
- res))))))))
+ (let ((n (string-length str)))
+ (and-let* ((m (irregex-search rx str start (min n (fx+ start range)))))
+ (let loop ((i (irregex-match-num-submatches m))
+ (res '()))
+ (if (fx< i 0)
+ res
+ (loop (fx- i 1) (cons (list (irregex-match-start-index m i)
+ (irregex-match-end-index m i))
+ res)))))))
;;; Split string into fields:
diff --git a/tests/test-irregex.scm b/tests/test-irregex.scm
index 8118ad5f..55e39c68 100644
--- a/tests/test-irregex.scm
+++ b/tests/test-irregex.scm
@@ -9,7 +9,7 @@
(define (subst-matches matches subst)
(define (submatch n)
- (if (vector? matches)
+ (if (irregex-match-data? matches)
(irregex-match-substring matches n)
(list-ref matches n)))
(and
Trap