clucumber 0.1.1 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/LICENSE +1 -1
- data/README.md +4 -9
- data/lib/clucumber/clucumber-bootstrap.lisp +32 -0
- data/lib/clucumber/vendor/cl-interpol/alias.lisp +55 -0
- data/lib/clucumber/vendor/cl-interpol/cl-interpol.asd +56 -0
- data/lib/clucumber/vendor/cl-interpol/load.lisp +53 -0
- data/lib/clucumber/vendor/cl-interpol/packages.lisp +40 -0
- data/lib/clucumber/vendor/cl-interpol/read.lisp +716 -0
- data/lib/clucumber/vendor/cl-interpol/specials.lisp +113 -0
- data/lib/clucumber/vendor/cl-interpol/test/packages.lisp +34 -0
- data/lib/clucumber/vendor/cl-interpol/test/tests.lisp +128 -0
- data/lib/clucumber/vendor/cl-interpol/test.lisp +177 -0
- data/lib/clucumber/vendor/cl-interpol/test2.lisp +6254 -0
- data/lib/clucumber/vendor/cl-interpol/unicode.lisp +13912 -0
- data/lib/clucumber/vendor/cl-interpol/util.lisp +122 -0
- data/lib/clucumber/vendor/cl-ppcre/api.lisp +1262 -0
- data/lib/clucumber/vendor/cl-ppcre/charmap.lisp +152 -0
- data/lib/clucumber/vendor/cl-ppcre/charset.lisp +242 -0
- data/lib/clucumber/vendor/cl-ppcre/chartest.lisp +98 -0
- data/lib/clucumber/vendor/cl-ppcre/cl-ppcre-test.asd +34 -0
- data/lib/clucumber/vendor/cl-ppcre/cl-ppcre-unicode/packages.lisp +38 -0
- data/lib/clucumber/vendor/cl-ppcre/cl-ppcre-unicode/resolver.lisp +61 -0
- data/lib/clucumber/vendor/cl-ppcre/cl-ppcre-unicode.asd +58 -0
- data/lib/clucumber/vendor/cl-ppcre/cl-ppcre.asd +79 -0
- data/lib/clucumber/vendor/cl-ppcre/closures.lisp +471 -0
- data/lib/clucumber/vendor/cl-ppcre/convert.lisp +875 -0
- data/lib/clucumber/vendor/cl-ppcre/errors.lisp +84 -0
- data/lib/clucumber/vendor/cl-ppcre/lexer.lisp +737 -0
- data/lib/clucumber/vendor/cl-ppcre/lispworks-defsystem.lisp +57 -0
- data/lib/clucumber/vendor/cl-ppcre/load.lisp +67 -0
- data/lib/clucumber/vendor/cl-ppcre/optimize.lisp +578 -0
- data/lib/clucumber/vendor/cl-ppcre/packages.lisp +68 -0
- data/lib/clucumber/vendor/cl-ppcre/parser.lisp +319 -0
- data/lib/clucumber/vendor/cl-ppcre/ppcre-tests.lisp +269 -0
- data/lib/clucumber/vendor/cl-ppcre/regex-class-util.lisp +555 -0
- data/lib/clucumber/vendor/cl-ppcre/regex-class.lisp +259 -0
- data/lib/clucumber/vendor/cl-ppcre/repetition-closures.lisp +833 -0
- data/lib/clucumber/vendor/cl-ppcre/scanner.lisp +506 -0
- data/lib/clucumber/vendor/cl-ppcre/specials.lisp +172 -0
- data/lib/clucumber/vendor/cl-ppcre/test/packages.lisp +37 -0
- data/lib/clucumber/vendor/cl-ppcre/test/perl-tests.lisp +150 -0
- data/lib/clucumber/vendor/cl-ppcre/test/tests.lisp +159 -0
- data/lib/clucumber/vendor/cl-ppcre/test/unicode-tests.lisp +80 -0
- data/lib/clucumber/vendor/cl-ppcre/util.lisp +201 -0
- data/lib/clucumber/vendor/cl-unicode/alias.lisp +135 -0
- data/lib/clucumber/vendor/cl-unicode/api.lisp +412 -0
- data/lib/clucumber/vendor/cl-unicode/build/char-info.lisp +133 -0
- data/lib/clucumber/vendor/cl-unicode/build/dump.lisp +239 -0
- data/lib/clucumber/vendor/cl-unicode/build/read.lisp +280 -0
- data/lib/clucumber/vendor/cl-unicode/build/util.lisp +182 -0
- data/lib/clucumber/vendor/cl-unicode/cl-unicode.asd +90 -0
- data/lib/clucumber/vendor/cl-unicode/conditions.lisp +54 -0
- data/lib/clucumber/vendor/cl-unicode/derived.lisp +120 -0
- data/lib/clucumber/vendor/cl-unicode/hash-tables.lisp +20 -0
- data/lib/clucumber/vendor/cl-unicode/lists.lisp +10 -0
- data/lib/clucumber/vendor/cl-unicode/methods.lisp +15 -0
- data/lib/clucumber/vendor/cl-unicode/packages.lisp +76 -0
- data/lib/clucumber/vendor/cl-unicode/specials.lisp +135 -0
- data/lib/clucumber/vendor/cl-unicode/test/packages.lisp +34 -0
- data/lib/clucumber/vendor/cl-unicode/test/tests.lisp +150 -0
- data/lib/clucumber/vendor/cl-unicode/test-functions.lisp +94 -0
- data/lib/clucumber/vendor/cl-unicode/util.lisp +274 -0
- data/lib/clucumber/vendor/lift/compare/fiveam-tests.lisp +14 -0
- data/lib/clucumber/vendor/lift/compare/lift-tests.lisp +13 -0
- data/lib/clucumber/vendor/lift/compare/rt-tests.lisp +16 -0
- data/lib/clucumber/vendor/lift/compare/xlunit-tests.lisp +15 -0
- data/lib/clucumber/vendor/lift/dev/changes.lisp +61 -0
- data/lib/clucumber/vendor/lift/dev/config.lisp +354 -0
- data/lib/clucumber/vendor/lift/dev/copy-file.lisp +117 -0
- data/lib/clucumber/vendor/lift/dev/introspection.lisp +232 -0
- data/lib/clucumber/vendor/lift/dev/lift-interface.lisp +56 -0
- data/lib/clucumber/vendor/lift/dev/lift-notes.lisp +202 -0
- data/lib/clucumber/vendor/lift/dev/lift-randomized.lisp +45 -0
- data/lib/clucumber/vendor/lift/dev/lift.lisp +2383 -0
- data/lib/clucumber/vendor/lift/dev/macros.lisp +229 -0
- data/lib/clucumber/vendor/lift/dev/measuring.lisp +156 -0
- data/lib/clucumber/vendor/lift/dev/packages.lisp +161 -0
- data/lib/clucumber/vendor/lift/dev/port.lisp +151 -0
- data/lib/clucumber/vendor/lift/dev/prototypes.lisp +282 -0
- data/lib/clucumber/vendor/lift/dev/random-testing.lisp +124 -0
- data/lib/clucumber/vendor/lift/dev/report-locations.lisp +13 -0
- data/lib/clucumber/vendor/lift/dev/reports.lisp +916 -0
- data/lib/clucumber/vendor/lift/dev/utilities.lisp +242 -0
- data/lib/clucumber/vendor/lift/docs/package.lisp +6 -0
- data/lib/clucumber/vendor/lift/docs/setup.lisp +17 -0
- data/lib/clucumber/vendor/lift/examples/basic-examples.lisp +289 -0
- data/lib/clucumber/vendor/lift/examples/random-testing.lisp +32 -0
- data/lib/clucumber/vendor/lift/lift-documentation.asd +28 -0
- data/lib/clucumber/vendor/lift/lift-test.asd +35 -0
- data/lib/clucumber/vendor/lift/lift.asd +77 -0
- data/lib/clucumber/vendor/lift/test/equality-tests.lisp +40 -0
- data/lib/clucumber/vendor/lift/test/finding-tests.lisp +32 -0
- data/lib/clucumber/vendor/lift/test/lift-test.lisp +783 -0
- data/lib/clucumber/vendor/lift/test/order-of-operations.lisp +54 -0
- data/lib/clucumber/vendor/lift/test/packages.lisp +17 -0
- data/lib/clucumber/vendor/lift/test/test-config-files.lisp +20 -0
- data/lib/clucumber/vendor/lift/test/test-dynamic-variables.lisp +57 -0
- data/lib/clucumber/vendor/lift/test/test-maximum-problems.lisp +74 -0
- data/lib/clucumber/vendor/lift/test/test-prototypes.lisp +278 -0
- data/lib/clucumber/vendor/lift/test/test-timeout.lisp +37 -0
- data/lib/clucumber/vendor/lift/test/tests-in-progress.lisp +62 -0
- data/lib/clucumber/vendor/lift/test/testsuite-expects.lisp +60 -0
- data/lib/clucumber/vendor/lift/timeout/package.lisp +13 -0
- data/lib/clucumber/vendor/lift/timeout/with-timeout.lisp +123 -0
- data/lib/clucumber/vendor/lift/website/stuff/Temp.lisp +34 -0
- data/lib/clucumber/vendor/st-json/st-json.asd +3 -0
- data/lib/clucumber/vendor/st-json/st-json.lisp +310 -0
- data/lib/clucumber/vendor/trivial-backtrace/dev/backtrace.lisp +127 -0
- data/lib/clucumber/vendor/trivial-backtrace/dev/fallback.lisp +10 -0
- data/lib/clucumber/vendor/trivial-backtrace/dev/map-backtrace.lisp +103 -0
- data/lib/clucumber/vendor/trivial-backtrace/dev/mucking.lisp +75 -0
- data/lib/clucumber/vendor/trivial-backtrace/dev/packages.lisp +13 -0
- data/lib/clucumber/vendor/trivial-backtrace/dev/utilities.lisp +104 -0
- data/lib/clucumber/vendor/trivial-backtrace/test/packages.lisp +5 -0
- data/lib/clucumber/vendor/trivial-backtrace/test/test-setup.lisp +4 -0
- data/lib/clucumber/vendor/trivial-backtrace/test/tests.lisp +16 -0
- data/lib/clucumber/vendor/trivial-backtrace/trivial-backtrace-test.asd +22 -0
- data/lib/clucumber/vendor/trivial-backtrace/trivial-backtrace.asd +35 -0
- data/lib/clucumber/vendor/usocket/backend/allegro.lisp +199 -0
- data/lib/clucumber/vendor/usocket/backend/armedbear.lisp +491 -0
- data/lib/clucumber/vendor/usocket/backend/clisp.lisp +260 -0
- data/lib/clucumber/vendor/usocket/backend/cmucl.lisp +266 -0
- data/lib/clucumber/vendor/usocket/backend/lispworks.lisp +741 -0
- data/lib/clucumber/vendor/usocket/backend/mcl.lisp +369 -0
- data/lib/clucumber/vendor/usocket/backend/openmcl.lisp +206 -0
- data/lib/clucumber/vendor/usocket/backend/sbcl.lisp +424 -0
- data/lib/clucumber/vendor/usocket/backend/scl.lisp +261 -0
- data/lib/clucumber/vendor/usocket/condition.lisp +227 -0
- data/lib/clucumber/vendor/usocket/package.lisp +82 -0
- data/lib/clucumber/vendor/usocket/server.lisp +45 -0
- data/lib/clucumber/vendor/usocket/test/package.lisp +13 -0
- data/lib/clucumber/vendor/usocket/test/test-usocket.lisp +166 -0
- data/lib/clucumber/vendor/usocket/usocket-test.asd +26 -0
- data/lib/clucumber/vendor/usocket/usocket.asd +37 -0
- data/lib/clucumber/vendor/usocket/usocket.lisp +542 -0
- data/lib/clucumber/vendor/usocket/vendor/kqueue.lisp +1 -0
- data/lib/clucumber/vendor/usocket/vendor/split-sequence.lisp +245 -0
- data/lib/clucumber.rb +29 -7
- metadata +151 -5
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-USER; Base: 10 -*-
|
|
2
|
+
;;; $Header: /usr/local/cvsrep/cl-ppcre/cl-ppcre-unicode.asd,v 1.15 2009/09/17 19:17:30 edi Exp $
|
|
3
|
+
|
|
4
|
+
;;; This ASDF system definition was kindly provided by Marco Baringer.
|
|
5
|
+
|
|
6
|
+
;;; Copyright (c) 2002-2009, Dr. Edmund Weitz. All rights reserved.
|
|
7
|
+
|
|
8
|
+
;;; Redistribution and use in source and binary forms, with or without
|
|
9
|
+
;;; modification, are permitted provided that the following conditions
|
|
10
|
+
;;; are met:
|
|
11
|
+
|
|
12
|
+
;;; * Redistributions of source code must retain the above copyright
|
|
13
|
+
;;; notice, this list of conditions and the following disclaimer.
|
|
14
|
+
|
|
15
|
+
;;; * Redistributions in binary form must reproduce the above
|
|
16
|
+
;;; copyright notice, this list of conditions and the following
|
|
17
|
+
;;; disclaimer in the documentation and/or other materials
|
|
18
|
+
;;; provided with the distribution.
|
|
19
|
+
|
|
20
|
+
;;; THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESSED
|
|
21
|
+
;;; OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
22
|
+
;;; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
23
|
+
;;; ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
|
|
24
|
+
;;; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
25
|
+
;;; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
|
26
|
+
;;; GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
27
|
+
;;; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
|
28
|
+
;;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
29
|
+
;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
30
|
+
;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
31
|
+
|
|
32
|
+
(in-package :cl-user)
|
|
33
|
+
|
|
34
|
+
(defpackage :cl-ppcre-unicode-asd
|
|
35
|
+
(:use :cl :asdf))
|
|
36
|
+
|
|
37
|
+
(in-package :cl-ppcre-unicode-asd)
|
|
38
|
+
|
|
39
|
+
(defsystem :cl-ppcre-unicode
|
|
40
|
+
:components ((:module "cl-ppcre-unicode"
|
|
41
|
+
:serial t
|
|
42
|
+
:components ((:file "packages")
|
|
43
|
+
(:file "resolver"))))
|
|
44
|
+
:depends-on (:cl-ppcre :cl-unicode))
|
|
45
|
+
|
|
46
|
+
(defsystem :cl-ppcre-unicode-test
|
|
47
|
+
:depends-on (:cl-ppcre-unicode :cl-ppcre-test)
|
|
48
|
+
:components ((:module "test"
|
|
49
|
+
:serial t
|
|
50
|
+
:components ((:file "unicode-tests")))))
|
|
51
|
+
|
|
52
|
+
(defmethod perform ((o test-op) (c (eql (find-system :cl-ppcre-unicode))))
|
|
53
|
+
;; we must load CL-PPCRE explicitly so that the CL-PPCRE-TEST system
|
|
54
|
+
;; will be found
|
|
55
|
+
(operate 'load-op :cl-ppcre)
|
|
56
|
+
(operate 'load-op :cl-ppcre-unicode-test)
|
|
57
|
+
(funcall (intern (symbol-name :run-all-tests) (find-package :cl-ppcre-test))
|
|
58
|
+
:more-tests (intern (symbol-name :unicode-test) (find-package :cl-ppcre-test))))
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-USER; Base: 10 -*-
|
|
2
|
+
;;; $Header: /usr/local/cvsrep/cl-ppcre/cl-ppcre.asd,v 1.49 2009/10/28 07:36:15 edi Exp $
|
|
3
|
+
|
|
4
|
+
;;; This ASDF system definition was kindly provided by Marco Baringer.
|
|
5
|
+
|
|
6
|
+
;;; Copyright (c) 2002-2009, Dr. Edmund Weitz. All rights reserved.
|
|
7
|
+
|
|
8
|
+
;;; Redistribution and use in source and binary forms, with or without
|
|
9
|
+
;;; modification, are permitted provided that the following conditions
|
|
10
|
+
;;; are met:
|
|
11
|
+
|
|
12
|
+
;;; * Redistributions of source code must retain the above copyright
|
|
13
|
+
;;; notice, this list of conditions and the following disclaimer.
|
|
14
|
+
|
|
15
|
+
;;; * Redistributions in binary form must reproduce the above
|
|
16
|
+
;;; copyright notice, this list of conditions and the following
|
|
17
|
+
;;; disclaimer in the documentation and/or other materials
|
|
18
|
+
;;; provided with the distribution.
|
|
19
|
+
|
|
20
|
+
;;; THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESSED
|
|
21
|
+
;;; OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
22
|
+
;;; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
23
|
+
;;; ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
|
|
24
|
+
;;; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
25
|
+
;;; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
|
26
|
+
;;; GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
27
|
+
;;; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
|
28
|
+
;;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
29
|
+
;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
30
|
+
;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
31
|
+
|
|
32
|
+
(in-package :cl-user)
|
|
33
|
+
|
|
34
|
+
(defpackage :cl-ppcre-asd
|
|
35
|
+
(:use :cl :asdf))
|
|
36
|
+
|
|
37
|
+
(in-package :cl-ppcre-asd)
|
|
38
|
+
|
|
39
|
+
(defsystem :cl-ppcre
|
|
40
|
+
:version "2.0.3"
|
|
41
|
+
:serial t
|
|
42
|
+
:components ((:file "packages")
|
|
43
|
+
(:file "specials")
|
|
44
|
+
(:file "util")
|
|
45
|
+
(:file "errors")
|
|
46
|
+
(:file "charset")
|
|
47
|
+
(:file "charmap")
|
|
48
|
+
(:file "chartest")
|
|
49
|
+
#-:use-acl-regexp2-engine
|
|
50
|
+
(:file "lexer")
|
|
51
|
+
#-:use-acl-regexp2-engine
|
|
52
|
+
(:file "parser")
|
|
53
|
+
#-:use-acl-regexp2-engine
|
|
54
|
+
(:file "regex-class")
|
|
55
|
+
#-:use-acl-regexp2-engine
|
|
56
|
+
(:file "regex-class-util")
|
|
57
|
+
#-:use-acl-regexp2-engine
|
|
58
|
+
(:file "convert")
|
|
59
|
+
#-:use-acl-regexp2-engine
|
|
60
|
+
(:file "optimize")
|
|
61
|
+
#-:use-acl-regexp2-engine
|
|
62
|
+
(:file "closures")
|
|
63
|
+
#-:use-acl-regexp2-engine
|
|
64
|
+
(:file "repetition-closures")
|
|
65
|
+
#-:use-acl-regexp2-engine
|
|
66
|
+
(:file "scanner")
|
|
67
|
+
(:file "api")))
|
|
68
|
+
|
|
69
|
+
(defsystem :cl-ppcre-test
|
|
70
|
+
:depends-on (:cl-ppcre :flexi-streams)
|
|
71
|
+
:components ((:module "test"
|
|
72
|
+
:serial t
|
|
73
|
+
:components ((:file "packages")
|
|
74
|
+
(:file "tests")
|
|
75
|
+
(:file "perl-tests")))))
|
|
76
|
+
|
|
77
|
+
(defmethod perform ((o test-op) (c (eql (find-system :cl-ppcre))))
|
|
78
|
+
(operate 'load-op :cl-ppcre-test)
|
|
79
|
+
(funcall (intern (symbol-name :run-all-tests) (find-package :cl-ppcre-test))))
|
|
@@ -0,0 +1,471 @@
|
|
|
1
|
+
;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-PPCRE; Base: 10 -*-
|
|
2
|
+
;;; $Header: /usr/local/cvsrep/cl-ppcre/closures.lisp,v 1.45 2009/09/17 19:17:30 edi Exp $
|
|
3
|
+
|
|
4
|
+
;;; Here we create the closures which together build the final
|
|
5
|
+
;;; scanner.
|
|
6
|
+
|
|
7
|
+
;;; Copyright (c) 2002-2009, Dr. Edmund Weitz. All rights reserved.
|
|
8
|
+
|
|
9
|
+
;;; Redistribution and use in source and binary forms, with or without
|
|
10
|
+
;;; modification, are permitted provided that the following conditions
|
|
11
|
+
;;; are met:
|
|
12
|
+
|
|
13
|
+
;;; * Redistributions of source code must retain the above copyright
|
|
14
|
+
;;; notice, this list of conditions and the following disclaimer.
|
|
15
|
+
|
|
16
|
+
;;; * Redistributions in binary form must reproduce the above
|
|
17
|
+
;;; copyright notice, this list of conditions and the following
|
|
18
|
+
;;; disclaimer in the documentation and/or other materials
|
|
19
|
+
;;; provided with the distribution.
|
|
20
|
+
|
|
21
|
+
;;; THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESSED
|
|
22
|
+
;;; OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
23
|
+
;;; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
24
|
+
;;; ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
|
|
25
|
+
;;; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
26
|
+
;;; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
|
27
|
+
;;; GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
28
|
+
;;; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
|
29
|
+
;;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
30
|
+
;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
31
|
+
;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
32
|
+
|
|
33
|
+
(in-package :cl-ppcre)
|
|
34
|
+
|
|
35
|
+
(declaim (inline *string*= *string*-equal))
|
|
36
|
+
(defun *string*= (string2 start1 end1 start2 end2)
|
|
37
|
+
"Like STRING=, i.e. compares the special string *STRING* from START1
|
|
38
|
+
to END1 with STRING2 from START2 to END2. Note that there's no
|
|
39
|
+
boundary check - this has to be implemented by the caller."
|
|
40
|
+
(declare #.*standard-optimize-settings*)
|
|
41
|
+
(declare (fixnum start1 end1 start2 end2))
|
|
42
|
+
(loop for string1-idx of-type fixnum from start1 below end1
|
|
43
|
+
for string2-idx of-type fixnum from start2 below end2
|
|
44
|
+
always (char= (schar *string* string1-idx)
|
|
45
|
+
(schar string2 string2-idx))))
|
|
46
|
+
|
|
47
|
+
(defun *string*-equal (string2 start1 end1 start2 end2)
|
|
48
|
+
"Like STRING-EQUAL, i.e. compares the special string *STRING* from
|
|
49
|
+
START1 to END1 with STRING2 from START2 to END2. Note that there's no
|
|
50
|
+
boundary check - this has to be implemented by the caller."
|
|
51
|
+
(declare #.*standard-optimize-settings*)
|
|
52
|
+
(declare (fixnum start1 end1 start2 end2))
|
|
53
|
+
(loop for string1-idx of-type fixnum from start1 below end1
|
|
54
|
+
for string2-idx of-type fixnum from start2 below end2
|
|
55
|
+
always (char-equal (schar *string* string1-idx)
|
|
56
|
+
(schar string2 string2-idx))))
|
|
57
|
+
|
|
58
|
+
(defgeneric create-matcher-aux (regex next-fn)
|
|
59
|
+
(declare #.*standard-optimize-settings*)
|
|
60
|
+
(:documentation "Creates a closure which takes one parameter,
|
|
61
|
+
START-POS, and tests whether REGEX can match *STRING* at START-POS
|
|
62
|
+
such that the call to NEXT-FN after the match would succeed."))
|
|
63
|
+
|
|
64
|
+
(defmethod create-matcher-aux ((seq seq) next-fn)
|
|
65
|
+
(declare #.*standard-optimize-settings*)
|
|
66
|
+
;; the closure for a SEQ is a chain of closures for the elements of
|
|
67
|
+
;; this sequence which call each other in turn; the last closure
|
|
68
|
+
;; calls NEXT-FN
|
|
69
|
+
(loop for element in (reverse (elements seq))
|
|
70
|
+
for curr-matcher = next-fn then next-matcher
|
|
71
|
+
for next-matcher = (create-matcher-aux element curr-matcher)
|
|
72
|
+
finally (return next-matcher)))
|
|
73
|
+
|
|
74
|
+
(defmethod create-matcher-aux ((alternation alternation) next-fn)
|
|
75
|
+
(declare #.*standard-optimize-settings*)
|
|
76
|
+
;; first create closures for all alternations of ALTERNATION
|
|
77
|
+
(let ((all-matchers (mapcar #'(lambda (choice)
|
|
78
|
+
(create-matcher-aux choice next-fn))
|
|
79
|
+
(choices alternation))))
|
|
80
|
+
;; now create a closure which checks if one of the closures
|
|
81
|
+
;; created above can succeed
|
|
82
|
+
(lambda (start-pos)
|
|
83
|
+
(declare (fixnum start-pos))
|
|
84
|
+
(loop for matcher in all-matchers
|
|
85
|
+
thereis (funcall (the function matcher) start-pos)))))
|
|
86
|
+
|
|
87
|
+
(defmethod create-matcher-aux ((register register) next-fn)
|
|
88
|
+
(declare #.*standard-optimize-settings*)
|
|
89
|
+
;; the position of this REGISTER within the whole regex; we start to
|
|
90
|
+
;; count at 0
|
|
91
|
+
(let ((num (num register)))
|
|
92
|
+
(declare (fixnum num))
|
|
93
|
+
;; STORE-END-OF-REG is a thin wrapper around NEXT-FN which will
|
|
94
|
+
;; update the corresponding values of *REGS-START* and *REGS-END*
|
|
95
|
+
;; after the inner matcher has succeeded
|
|
96
|
+
(flet ((store-end-of-reg (start-pos)
|
|
97
|
+
(declare (fixnum start-pos)
|
|
98
|
+
(function next-fn))
|
|
99
|
+
(setf (svref *reg-starts* num) (svref *regs-maybe-start* num)
|
|
100
|
+
(svref *reg-ends* num) start-pos)
|
|
101
|
+
(funcall next-fn start-pos)))
|
|
102
|
+
;; the inner matcher is a closure corresponding to the regex
|
|
103
|
+
;; wrapped by this REGISTER
|
|
104
|
+
(let ((inner-matcher (create-matcher-aux (regex register)
|
|
105
|
+
#'store-end-of-reg)))
|
|
106
|
+
(declare (function inner-matcher))
|
|
107
|
+
;; here comes the actual closure for REGISTER
|
|
108
|
+
(lambda (start-pos)
|
|
109
|
+
(declare (fixnum start-pos))
|
|
110
|
+
;; remember the old values of *REGS-START* and friends in
|
|
111
|
+
;; case we cannot match
|
|
112
|
+
(let ((old-*reg-starts* (svref *reg-starts* num))
|
|
113
|
+
(old-*regs-maybe-start* (svref *regs-maybe-start* num))
|
|
114
|
+
(old-*reg-ends* (svref *reg-ends* num)))
|
|
115
|
+
;; we cannot use *REGS-START* here because Perl allows
|
|
116
|
+
;; regular expressions like /(a|\1x)*/
|
|
117
|
+
(setf (svref *regs-maybe-start* num) start-pos)
|
|
118
|
+
(let ((next-pos (funcall inner-matcher start-pos)))
|
|
119
|
+
(unless next-pos
|
|
120
|
+
;; restore old values on failure
|
|
121
|
+
(setf (svref *reg-starts* num) old-*reg-starts*
|
|
122
|
+
(svref *regs-maybe-start* num) old-*regs-maybe-start*
|
|
123
|
+
(svref *reg-ends* num) old-*reg-ends*))
|
|
124
|
+
next-pos)))))))
|
|
125
|
+
|
|
126
|
+
(defmethod create-matcher-aux ((lookahead lookahead) next-fn)
|
|
127
|
+
(declare #.*standard-optimize-settings*)
|
|
128
|
+
;; create a closure which just checks for the inner regex and
|
|
129
|
+
;; doesn't care about NEXT-FN
|
|
130
|
+
(let ((test-matcher (create-matcher-aux (regex lookahead) #'identity)))
|
|
131
|
+
(declare (function next-fn test-matcher))
|
|
132
|
+
(if (positivep lookahead)
|
|
133
|
+
;; positive look-ahead: check success of inner regex, then call
|
|
134
|
+
;; NEXT-FN
|
|
135
|
+
(lambda (start-pos)
|
|
136
|
+
(and (funcall test-matcher start-pos)
|
|
137
|
+
(funcall next-fn start-pos)))
|
|
138
|
+
;; negative look-ahead: check failure of inner regex, then call
|
|
139
|
+
;; NEXT-FN
|
|
140
|
+
(lambda (start-pos)
|
|
141
|
+
(and (not (funcall test-matcher start-pos))
|
|
142
|
+
(funcall next-fn start-pos))))))
|
|
143
|
+
|
|
144
|
+
(defmethod create-matcher-aux ((lookbehind lookbehind) next-fn)
|
|
145
|
+
(declare #.*standard-optimize-settings*)
|
|
146
|
+
(let ((len (len lookbehind))
|
|
147
|
+
;; create a closure which just checks for the inner regex and
|
|
148
|
+
;; doesn't care about NEXT-FN
|
|
149
|
+
(test-matcher (create-matcher-aux (regex lookbehind) #'identity)))
|
|
150
|
+
(declare (function next-fn test-matcher)
|
|
151
|
+
(fixnum len))
|
|
152
|
+
(if (positivep lookbehind)
|
|
153
|
+
;; positive look-behind: check success of inner regex (if we're
|
|
154
|
+
;; far enough from the start of *STRING*), then call NEXT-FN
|
|
155
|
+
(lambda (start-pos)
|
|
156
|
+
(declare (fixnum start-pos))
|
|
157
|
+
(and (>= (- start-pos (or *real-start-pos* *start-pos*)) len)
|
|
158
|
+
(funcall test-matcher (- start-pos len))
|
|
159
|
+
(funcall next-fn start-pos)))
|
|
160
|
+
;; negative look-behind: check failure of inner regex (if we're
|
|
161
|
+
;; far enough from the start of *STRING*), then call NEXT-FN
|
|
162
|
+
(lambda (start-pos)
|
|
163
|
+
(declare (fixnum start-pos))
|
|
164
|
+
(and (or (< (- start-pos (or *real-start-pos* *start-pos*)) len)
|
|
165
|
+
(not (funcall test-matcher (- start-pos len))))
|
|
166
|
+
(funcall next-fn start-pos))))))
|
|
167
|
+
|
|
168
|
+
(defmacro insert-char-class-tester ((char-class chr-expr) &body body)
|
|
169
|
+
"Utility macro to replace each occurence of '\(CHAR-CLASS-TEST)
|
|
170
|
+
within BODY with the correct test (corresponding to CHAR-CLASS)
|
|
171
|
+
against CHR-EXPR."
|
|
172
|
+
(with-rebinding (char-class)
|
|
173
|
+
(with-unique-names (test-function)
|
|
174
|
+
(flet ((substitute-char-class-tester (new)
|
|
175
|
+
(subst new '(char-class-test) body
|
|
176
|
+
:test #'equalp)))
|
|
177
|
+
`(let ((,test-function (test-function ,char-class)))
|
|
178
|
+
,@(substitute-char-class-tester
|
|
179
|
+
`(funcall ,test-function ,chr-expr)))))))
|
|
180
|
+
|
|
181
|
+
(defmethod create-matcher-aux ((char-class char-class) next-fn)
|
|
182
|
+
(declare #.*standard-optimize-settings*)
|
|
183
|
+
(declare (function next-fn))
|
|
184
|
+
;; insert a test against the current character within *STRING*
|
|
185
|
+
(insert-char-class-tester (char-class (schar *string* start-pos))
|
|
186
|
+
(lambda (start-pos)
|
|
187
|
+
(declare (fixnum start-pos))
|
|
188
|
+
(and (< start-pos *end-pos*)
|
|
189
|
+
(char-class-test)
|
|
190
|
+
(funcall next-fn (1+ start-pos))))))
|
|
191
|
+
|
|
192
|
+
(defmethod create-matcher-aux ((str str) next-fn)
|
|
193
|
+
(declare #.*standard-optimize-settings*)
|
|
194
|
+
(declare (fixnum *end-string-pos*)
|
|
195
|
+
(function next-fn)
|
|
196
|
+
;; this special value is set by CREATE-SCANNER when the
|
|
197
|
+
;; closures are built
|
|
198
|
+
(special end-string))
|
|
199
|
+
(let* ((len (len str))
|
|
200
|
+
(case-insensitive-p (case-insensitive-p str))
|
|
201
|
+
(start-of-end-string-p (start-of-end-string-p str))
|
|
202
|
+
(skip (skip str))
|
|
203
|
+
(str (str str))
|
|
204
|
+
(chr (schar str 0))
|
|
205
|
+
(end-string (and end-string (str end-string)))
|
|
206
|
+
(end-string-len (if end-string
|
|
207
|
+
(length end-string)
|
|
208
|
+
nil)))
|
|
209
|
+
(declare (fixnum len))
|
|
210
|
+
(cond ((and start-of-end-string-p case-insensitive-p)
|
|
211
|
+
;; closure for the first STR which belongs to the constant
|
|
212
|
+
;; string at the end of the regular expression;
|
|
213
|
+
;; case-insensitive version
|
|
214
|
+
(lambda (start-pos)
|
|
215
|
+
(declare (fixnum start-pos end-string-len))
|
|
216
|
+
(let ((test-end-pos (+ start-pos end-string-len)))
|
|
217
|
+
(declare (fixnum test-end-pos))
|
|
218
|
+
;; either we're at *END-STRING-POS* (which means that
|
|
219
|
+
;; it has already been confirmed that end-string
|
|
220
|
+
;; starts here) or we really have to test
|
|
221
|
+
(and (or (= start-pos *end-string-pos*)
|
|
222
|
+
(and (<= test-end-pos *end-pos*)
|
|
223
|
+
(*string*-equal end-string start-pos test-end-pos
|
|
224
|
+
0 end-string-len)))
|
|
225
|
+
(funcall next-fn (+ start-pos len))))))
|
|
226
|
+
(start-of-end-string-p
|
|
227
|
+
;; closure for the first STR which belongs to the constant
|
|
228
|
+
;; string at the end of the regular expression;
|
|
229
|
+
;; case-sensitive version
|
|
230
|
+
(lambda (start-pos)
|
|
231
|
+
(declare (fixnum start-pos end-string-len))
|
|
232
|
+
(let ((test-end-pos (+ start-pos end-string-len)))
|
|
233
|
+
(declare (fixnum test-end-pos))
|
|
234
|
+
;; either we're at *END-STRING-POS* (which means that
|
|
235
|
+
;; it has already been confirmed that end-string
|
|
236
|
+
;; starts here) or we really have to test
|
|
237
|
+
(and (or (= start-pos *end-string-pos*)
|
|
238
|
+
(and (<= test-end-pos *end-pos*)
|
|
239
|
+
(*string*= end-string start-pos test-end-pos
|
|
240
|
+
0 end-string-len)))
|
|
241
|
+
(funcall next-fn (+ start-pos len))))))
|
|
242
|
+
(skip
|
|
243
|
+
;; a STR which can be skipped because some other function
|
|
244
|
+
;; has already confirmed that it matches
|
|
245
|
+
(lambda (start-pos)
|
|
246
|
+
(declare (fixnum start-pos))
|
|
247
|
+
(funcall next-fn (+ start-pos len))))
|
|
248
|
+
((and (= len 1) case-insensitive-p)
|
|
249
|
+
;; STR represent exactly one character; case-insensitive
|
|
250
|
+
;; version
|
|
251
|
+
(lambda (start-pos)
|
|
252
|
+
(declare (fixnum start-pos))
|
|
253
|
+
(and (< start-pos *end-pos*)
|
|
254
|
+
(char-equal (schar *string* start-pos) chr)
|
|
255
|
+
(funcall next-fn (1+ start-pos)))))
|
|
256
|
+
((= len 1)
|
|
257
|
+
;; STR represent exactly one character; case-sensitive
|
|
258
|
+
;; version
|
|
259
|
+
(lambda (start-pos)
|
|
260
|
+
(declare (fixnum start-pos))
|
|
261
|
+
(and (< start-pos *end-pos*)
|
|
262
|
+
(char= (schar *string* start-pos) chr)
|
|
263
|
+
(funcall next-fn (1+ start-pos)))))
|
|
264
|
+
(case-insensitive-p
|
|
265
|
+
;; general case, case-insensitive version
|
|
266
|
+
(lambda (start-pos)
|
|
267
|
+
(declare (fixnum start-pos))
|
|
268
|
+
(let ((next-pos (+ start-pos len)))
|
|
269
|
+
(declare (fixnum next-pos))
|
|
270
|
+
(and (<= next-pos *end-pos*)
|
|
271
|
+
(*string*-equal str start-pos next-pos 0 len)
|
|
272
|
+
(funcall next-fn next-pos)))))
|
|
273
|
+
(t
|
|
274
|
+
;; general case, case-sensitive version
|
|
275
|
+
(lambda (start-pos)
|
|
276
|
+
(declare (fixnum start-pos))
|
|
277
|
+
(let ((next-pos (+ start-pos len)))
|
|
278
|
+
(declare (fixnum next-pos))
|
|
279
|
+
(and (<= next-pos *end-pos*)
|
|
280
|
+
(*string*= str start-pos next-pos 0 len)
|
|
281
|
+
(funcall next-fn next-pos))))))))
|
|
282
|
+
|
|
283
|
+
(declaim (inline word-boundary-p))
|
|
284
|
+
(defun word-boundary-p (start-pos)
|
|
285
|
+
"Check whether START-POS is a word-boundary within *STRING*."
|
|
286
|
+
(declare #.*standard-optimize-settings*)
|
|
287
|
+
(declare (fixnum start-pos))
|
|
288
|
+
(let ((1-start-pos (1- start-pos))
|
|
289
|
+
(*start-pos* (or *real-start-pos* *start-pos*)))
|
|
290
|
+
;; either the character before START-POS is a word-constituent and
|
|
291
|
+
;; the character at START-POS isn't...
|
|
292
|
+
(or (and (or (= start-pos *end-pos*)
|
|
293
|
+
(and (< start-pos *end-pos*)
|
|
294
|
+
(not (word-char-p (schar *string* start-pos)))))
|
|
295
|
+
(and (< 1-start-pos *end-pos*)
|
|
296
|
+
(<= *start-pos* 1-start-pos)
|
|
297
|
+
(word-char-p (schar *string* 1-start-pos))))
|
|
298
|
+
;; ...or vice versa
|
|
299
|
+
(and (or (= start-pos *start-pos*)
|
|
300
|
+
(and (< 1-start-pos *end-pos*)
|
|
301
|
+
(<= *start-pos* 1-start-pos)
|
|
302
|
+
(not (word-char-p (schar *string* 1-start-pos)))))
|
|
303
|
+
(and (< start-pos *end-pos*)
|
|
304
|
+
(word-char-p (schar *string* start-pos)))))))
|
|
305
|
+
|
|
306
|
+
(defmethod create-matcher-aux ((word-boundary word-boundary) next-fn)
|
|
307
|
+
(declare #.*standard-optimize-settings*)
|
|
308
|
+
(declare (function next-fn))
|
|
309
|
+
(if (negatedp word-boundary)
|
|
310
|
+
(lambda (start-pos)
|
|
311
|
+
(and (not (word-boundary-p start-pos))
|
|
312
|
+
(funcall next-fn start-pos)))
|
|
313
|
+
(lambda (start-pos)
|
|
314
|
+
(and (word-boundary-p start-pos)
|
|
315
|
+
(funcall next-fn start-pos)))))
|
|
316
|
+
|
|
317
|
+
(defmethod create-matcher-aux ((everything everything) next-fn)
|
|
318
|
+
(declare #.*standard-optimize-settings*)
|
|
319
|
+
(declare (function next-fn))
|
|
320
|
+
(if (single-line-p everything)
|
|
321
|
+
;; closure for single-line-mode: we really match everything, so we
|
|
322
|
+
;; just advance the index into *STRING* by one and carry on
|
|
323
|
+
(lambda (start-pos)
|
|
324
|
+
(declare (fixnum start-pos))
|
|
325
|
+
(and (< start-pos *end-pos*)
|
|
326
|
+
(funcall next-fn (1+ start-pos))))
|
|
327
|
+
;; not single-line-mode, so we have to make sure we don't match
|
|
328
|
+
;; #\Newline
|
|
329
|
+
(lambda (start-pos)
|
|
330
|
+
(declare (fixnum start-pos))
|
|
331
|
+
(and (< start-pos *end-pos*)
|
|
332
|
+
(char/= (schar *string* start-pos) #\Newline)
|
|
333
|
+
(funcall next-fn (1+ start-pos))))))
|
|
334
|
+
|
|
335
|
+
(defmethod create-matcher-aux ((anchor anchor) next-fn)
|
|
336
|
+
(declare #.*standard-optimize-settings*)
|
|
337
|
+
(declare (function next-fn))
|
|
338
|
+
(let ((startp (startp anchor))
|
|
339
|
+
(multi-line-p (multi-line-p anchor)))
|
|
340
|
+
(cond ((no-newline-p anchor)
|
|
341
|
+
;; this must be an end-anchor and it must be modeless, so
|
|
342
|
+
;; we just have to check whether START-POS equals
|
|
343
|
+
;; *END-POS*
|
|
344
|
+
(lambda (start-pos)
|
|
345
|
+
(declare (fixnum start-pos))
|
|
346
|
+
(and (= start-pos *end-pos*)
|
|
347
|
+
(funcall next-fn start-pos))))
|
|
348
|
+
((and startp multi-line-p)
|
|
349
|
+
;; a start-anchor in multi-line-mode: check if we're at
|
|
350
|
+
;; *START-POS* or if the last character was #\Newline
|
|
351
|
+
(lambda (start-pos)
|
|
352
|
+
(declare (fixnum start-pos))
|
|
353
|
+
(let ((*start-pos* (or *real-start-pos* *start-pos*)))
|
|
354
|
+
(and (or (= start-pos *start-pos*)
|
|
355
|
+
(and (<= start-pos *end-pos*)
|
|
356
|
+
(> start-pos *start-pos*)
|
|
357
|
+
(char= #\Newline
|
|
358
|
+
(schar *string* (1- start-pos)))))
|
|
359
|
+
(funcall next-fn start-pos)))))
|
|
360
|
+
(startp
|
|
361
|
+
;; a start-anchor which is not in multi-line-mode, so just
|
|
362
|
+
;; check whether we're at *START-POS*
|
|
363
|
+
(lambda (start-pos)
|
|
364
|
+
(declare (fixnum start-pos))
|
|
365
|
+
(and (= start-pos (or *real-start-pos* *start-pos*))
|
|
366
|
+
(funcall next-fn start-pos))))
|
|
367
|
+
(multi-line-p
|
|
368
|
+
;; an end-anchor in multi-line-mode: check if we're at
|
|
369
|
+
;; *END-POS* or if the character we're looking at is
|
|
370
|
+
;; #\Newline
|
|
371
|
+
(lambda (start-pos)
|
|
372
|
+
(declare (fixnum start-pos))
|
|
373
|
+
(and (or (= start-pos *end-pos*)
|
|
374
|
+
(and (< start-pos *end-pos*)
|
|
375
|
+
(char= #\Newline
|
|
376
|
+
(schar *string* start-pos))))
|
|
377
|
+
(funcall next-fn start-pos))))
|
|
378
|
+
(t
|
|
379
|
+
;; an end-anchor which is not in multi-line-mode, so just
|
|
380
|
+
;; check if we're at *END-POS* or if we're looking at
|
|
381
|
+
;; #\Newline and there's nothing behind it
|
|
382
|
+
(lambda (start-pos)
|
|
383
|
+
(declare (fixnum start-pos))
|
|
384
|
+
(and (or (= start-pos *end-pos*)
|
|
385
|
+
(and (= start-pos (1- *end-pos*))
|
|
386
|
+
(char= #\Newline
|
|
387
|
+
(schar *string* start-pos))))
|
|
388
|
+
(funcall next-fn start-pos)))))))
|
|
389
|
+
|
|
390
|
+
(defmethod create-matcher-aux ((back-reference back-reference) next-fn)
|
|
391
|
+
(declare #.*standard-optimize-settings*)
|
|
392
|
+
(declare (function next-fn))
|
|
393
|
+
;; the position of the corresponding REGISTER within the whole
|
|
394
|
+
;; regex; we start to count at 0
|
|
395
|
+
(let ((num (num back-reference)))
|
|
396
|
+
(if (case-insensitive-p back-reference)
|
|
397
|
+
;; the case-insensitive version
|
|
398
|
+
(lambda (start-pos)
|
|
399
|
+
(declare (fixnum start-pos))
|
|
400
|
+
(let ((reg-start (svref *reg-starts* num))
|
|
401
|
+
(reg-end (svref *reg-ends* num)))
|
|
402
|
+
;; only bother to check if the corresponding REGISTER as
|
|
403
|
+
;; matched successfully already
|
|
404
|
+
(and reg-start
|
|
405
|
+
(let ((next-pos (+ start-pos (- (the fixnum reg-end)
|
|
406
|
+
(the fixnum reg-start)))))
|
|
407
|
+
(declare (fixnum next-pos))
|
|
408
|
+
(and
|
|
409
|
+
(<= next-pos *end-pos*)
|
|
410
|
+
(*string*-equal *string* start-pos next-pos
|
|
411
|
+
reg-start reg-end)
|
|
412
|
+
(funcall next-fn next-pos))))))
|
|
413
|
+
;; the case-sensitive version
|
|
414
|
+
(lambda (start-pos)
|
|
415
|
+
(declare (fixnum start-pos))
|
|
416
|
+
(let ((reg-start (svref *reg-starts* num))
|
|
417
|
+
(reg-end (svref *reg-ends* num)))
|
|
418
|
+
;; only bother to check if the corresponding REGISTER as
|
|
419
|
+
;; matched successfully already
|
|
420
|
+
(and reg-start
|
|
421
|
+
(let ((next-pos (+ start-pos (- (the fixnum reg-end)
|
|
422
|
+
(the fixnum reg-start)))))
|
|
423
|
+
(declare (fixnum next-pos))
|
|
424
|
+
(and
|
|
425
|
+
(<= next-pos *end-pos*)
|
|
426
|
+
(*string*= *string* start-pos next-pos
|
|
427
|
+
reg-start reg-end)
|
|
428
|
+
(funcall next-fn next-pos)))))))))
|
|
429
|
+
|
|
430
|
+
(defmethod create-matcher-aux ((branch branch) next-fn)
|
|
431
|
+
(declare #.*standard-optimize-settings*)
|
|
432
|
+
(let* ((test (test branch))
|
|
433
|
+
(then-matcher (create-matcher-aux (then-regex branch) next-fn))
|
|
434
|
+
(else-matcher (create-matcher-aux (else-regex branch) next-fn)))
|
|
435
|
+
(declare (function then-matcher else-matcher))
|
|
436
|
+
(cond ((numberp test)
|
|
437
|
+
(lambda (start-pos)
|
|
438
|
+
(declare (fixnum test))
|
|
439
|
+
(if (and (< test (length *reg-starts*))
|
|
440
|
+
(svref *reg-starts* test))
|
|
441
|
+
(funcall then-matcher start-pos)
|
|
442
|
+
(funcall else-matcher start-pos))))
|
|
443
|
+
(t
|
|
444
|
+
(let ((test-matcher (create-matcher-aux test #'identity)))
|
|
445
|
+
(declare (function test-matcher))
|
|
446
|
+
(lambda (start-pos)
|
|
447
|
+
(if (funcall test-matcher start-pos)
|
|
448
|
+
(funcall then-matcher start-pos)
|
|
449
|
+
(funcall else-matcher start-pos))))))))
|
|
450
|
+
|
|
451
|
+
(defmethod create-matcher-aux ((standalone standalone) next-fn)
|
|
452
|
+
(declare #.*standard-optimize-settings*)
|
|
453
|
+
(let ((inner-matcher (create-matcher-aux (regex standalone) #'identity)))
|
|
454
|
+
(declare (function next-fn inner-matcher))
|
|
455
|
+
(lambda (start-pos)
|
|
456
|
+
(let ((next-pos (funcall inner-matcher start-pos)))
|
|
457
|
+
(and next-pos
|
|
458
|
+
(funcall next-fn next-pos))))))
|
|
459
|
+
|
|
460
|
+
(defmethod create-matcher-aux ((filter filter) next-fn)
|
|
461
|
+
(declare #.*standard-optimize-settings*)
|
|
462
|
+
(let ((fn (fn filter)))
|
|
463
|
+
(lambda (start-pos)
|
|
464
|
+
(let ((next-pos (funcall fn start-pos)))
|
|
465
|
+
(and next-pos
|
|
466
|
+
(funcall next-fn next-pos))))))
|
|
467
|
+
|
|
468
|
+
(defmethod create-matcher-aux ((void void) next-fn)
|
|
469
|
+
(declare #.*standard-optimize-settings*)
|
|
470
|
+
;; optimize away VOIDs: don't create a closure, just return NEXT-FN
|
|
471
|
+
next-fn)
|