clucumber 0.1.1 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- 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,182 @@
|
|
1
|
+
;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-UNICODE; Base: 10 -*-
|
2
|
+
;;; $Header: /usr/local/cvsrep/cl-unicode/build/util.lisp,v 1.12 2008/07/21 14:23:09 edi Exp $
|
3
|
+
|
4
|
+
;;; Copyright (c) 2008, Dr. Edmund Weitz. All rights reserved.
|
5
|
+
|
6
|
+
;;; Redistribution and use in source and binary forms, with or without
|
7
|
+
;;; modification, are permitted provided that the following conditions
|
8
|
+
;;; are met:
|
9
|
+
|
10
|
+
;;; * Redistributions of source code must retain the above copyright
|
11
|
+
;;; notice, this list of conditions and the following disclaimer.
|
12
|
+
|
13
|
+
;;; * Redistributions in binary form must reproduce the above
|
14
|
+
;;; copyright notice, this list of conditions and the following
|
15
|
+
;;; disclaimer in the documentation and/or other materials
|
16
|
+
;;; provided with the distribution.
|
17
|
+
|
18
|
+
;;; THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESSED
|
19
|
+
;;; OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
20
|
+
;;; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
21
|
+
;;; ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
|
22
|
+
;;; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
23
|
+
;;; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
24
|
+
;;; GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
25
|
+
;;; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
26
|
+
;;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
27
|
+
;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
28
|
+
;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
29
|
+
|
30
|
+
(in-package :cl-unicode)
|
31
|
+
|
32
|
+
(defvar *this-file* (load-time-value
|
33
|
+
(or #.*compile-file-pathname* *load-pathname*))
|
34
|
+
"The location of this source file. Needed to find the data files.")
|
35
|
+
|
36
|
+
(defvar *char-database* nil
|
37
|
+
"This will be a vector of CHAR-INFO objects which keeps track of the
|
38
|
+
information parsed from the Unicode files while the build process
|
39
|
+
runs. This \"database\" is not used by CL-UNICODE itself. It only
|
40
|
+
serves as a temporary storage during the build process.")
|
41
|
+
|
42
|
+
(defun make-empty-char-database ()
|
43
|
+
"Creates and returns an array of length +CODE-POINT-LIMIT+
|
44
|
+
initialized with NILs."
|
45
|
+
(make-array +code-point-limit+ :initial-element nil))
|
46
|
+
|
47
|
+
(defun initialize-property-symbols ()
|
48
|
+
"Clears the hash table *CANONICAL-NAMES* and initializes it with
|
49
|
+
certain values which might otherwise not be seen when the Unicode
|
50
|
+
files are parsed."
|
51
|
+
(clrhash *canonical-names*)
|
52
|
+
(dolist (name '("Cn" "AL" "R" "L" "Decimal" "Digit" "Numeric" "BidiMirrored" "NoncharacterCodePoint"))
|
53
|
+
(register-property-symbol name)))
|
54
|
+
|
55
|
+
(defun extract-variables (bindings)
|
56
|
+
"Helper function for the WITH-UNICODE-FILE macro. Collects the
|
57
|
+
variables from the list BINDINGS where atoms as well as the first
|
58
|
+
element of BINDINGS are left as is and lists are replaced with their
|
59
|
+
first elements. The symbol _ \(underline) is skipped, i.e. not
|
60
|
+
returned."
|
61
|
+
(cons (first bindings)
|
62
|
+
(loop for binding in (rest bindings)
|
63
|
+
unless (eq binding '_)
|
64
|
+
when (listp binding)
|
65
|
+
collect (first binding)
|
66
|
+
else collect binding)))
|
67
|
+
|
68
|
+
(defun extract-types (bindings)
|
69
|
+
"Helper function for the WITH-UNICODE-FILE macro. Collects the type
|
70
|
+
spec from the list BINDINGS where it is assumed the for lists the type
|
71
|
+
spec is the second element and for atoms the type spec is defaulted to
|
72
|
+
STRING. The first argument of BINDINGS is skipped, and the type spec
|
73
|
+
NIL is included whenever the symbol _ \(underline) is seen."
|
74
|
+
(loop for binding in (rest bindings)
|
75
|
+
when (eq binding '_)
|
76
|
+
collect nil
|
77
|
+
else when (listp binding)
|
78
|
+
collect (second binding)
|
79
|
+
else collect 'string))
|
80
|
+
|
81
|
+
(defun extract-defaults (bindings)
|
82
|
+
"Helper function for the WITH-UNICODE-FILE macro. Collects the
|
83
|
+
default values from the list BINDINGS where it is assumed the for
|
84
|
+
lists the default value is the third element and for atoms the default
|
85
|
+
value is :ERROR \(meaning to signal an error). The first argument of
|
86
|
+
BINDINGS is skipped, and the default value NIL is included whenever
|
87
|
+
the symbol _ \(underline) is seen."
|
88
|
+
(loop for binding in (rest bindings)
|
89
|
+
when (eq binding '_)
|
90
|
+
collect nil
|
91
|
+
else when (and (listp binding) (cddr binding))
|
92
|
+
collect (third binding)
|
93
|
+
else collect :error))
|
94
|
+
|
95
|
+
(defun code-point-range-start (range)
|
96
|
+
"Returns the first code point of the code point \"range\" RANGE
|
97
|
+
where RANGE is either an integer denoting one code point or a cons of
|
98
|
+
the form (A . B) denoting the code points from A to B \(inclusive)."
|
99
|
+
(cond ((atom range) range)
|
100
|
+
(t (car range))))
|
101
|
+
|
102
|
+
(defun parse-code-point (string)
|
103
|
+
"Parses a string which is supposed to be the hexadecimal
|
104
|
+
representation of one code point or a range of code points \(written
|
105
|
+
with two dots between them like \"0AE0..0AF3\"). Returns a single
|
106
|
+
integer \(for one code point) or a cons of two integers \(for a
|
107
|
+
range)."
|
108
|
+
(destructuring-bind (first &optional second)
|
109
|
+
(mapcar 'parse-hex (ppcre:split "\\.\\." string))
|
110
|
+
(if second (cons first second) first)))
|
111
|
+
|
112
|
+
(defgeneric parse-value (value type default)
|
113
|
+
(:documentation "Parses the string VALUE coming from a Unicode data
|
114
|
+
file and converts it according to the type spec TYPE \(a symbol
|
115
|
+
denoting a type which is not necessarily a Lisp type). If VALUE is
|
116
|
+
the empty string, DEFAULT is returned instead unless DEFAULT is :ERROR
|
117
|
+
in which case an error is signalled.")
|
118
|
+
(:method (value type default)
|
119
|
+
"The default method for unrecognized type specs."
|
120
|
+
(error "Don't know how to parse type ~S." type))
|
121
|
+
(:method :around (value type default)
|
122
|
+
"The method to take care of default values."
|
123
|
+
(cond ((and (string= value "") (eq default :error))
|
124
|
+
(error "No value and no default provided"))
|
125
|
+
((string= value "") default)
|
126
|
+
(t (call-next-method)))))
|
127
|
+
|
128
|
+
(defmethod parse-value (value (type (eql 'string)) default)
|
129
|
+
"The method for strings simply returns VALUE."
|
130
|
+
value)
|
131
|
+
|
132
|
+
(defmethod parse-value (value (type (eql 'boolean)) default)
|
133
|
+
"The method for BOOLEAN only accepts the strings \"Y\" and \"N\"."
|
134
|
+
(cond ((string= value "Y") t)
|
135
|
+
((string= value "N") nil)
|
136
|
+
(t (error "Expected boolean, but got ~S." value))))
|
137
|
+
|
138
|
+
(defmethod parse-value (value (type (eql 'symbol)) default)
|
139
|
+
"The method for symbol which converts the string to a \"property
|
140
|
+
symbol\" \(see PROPERTY-SYMBOL) and registers it \(see
|
141
|
+
REGISTER-PROPERTY-SYMBOL)."
|
142
|
+
(register-property-symbol value))
|
143
|
+
|
144
|
+
(defmethod parse-value (value (type (eql 'integer)) default)
|
145
|
+
"The method for \(decimal) integers."
|
146
|
+
(parse-integer value))
|
147
|
+
|
148
|
+
(defmethod parse-value (value (type (eql 'hex)) default)
|
149
|
+
"The method for hexadecimal integers."
|
150
|
+
(parse-hex value))
|
151
|
+
|
152
|
+
(defmethod parse-value (value (type (eql 'rational)) default)
|
153
|
+
"The method for rationals which are written like Lisp rationals."
|
154
|
+
(destructuring-bind (numerator &optional (denominator 1))
|
155
|
+
(mapcar 'parse-integer (ppcre:split "/" value))
|
156
|
+
(/ numerator denominator)))
|
157
|
+
|
158
|
+
(defmethod parse-value (value (type (eql 'age)) default)
|
159
|
+
"The method for Unicode \"age\" values which are converted to a
|
160
|
+
list of two integers, the major and minor version."
|
161
|
+
(destructuring-bind (major minor)
|
162
|
+
(mapcar 'parse-integer (ppcre:split "\\." value))
|
163
|
+
(list major minor)))
|
164
|
+
|
165
|
+
(defun parse-one-line (parts &optional types defaults)
|
166
|
+
"Parses one line of a Unicode data file and returns a list of Lisp
|
167
|
+
objects as determined by TYPES and DEFAULTS. It is assumed that the
|
168
|
+
line was already split into a list PARTS of individual strings, one
|
169
|
+
for each value/object. The elements of TYPES and DEFAULTS are
|
170
|
+
interpreted as by PARSE-VALUE except that we skip one element of PARTS
|
171
|
+
for each NIL in TYPES. The first element of PARTS is always
|
172
|
+
interpreted as a code point \(range), i.e. TYPES and DEFAULTS only
|
173
|
+
apply to the rest of PARTS.
|
174
|
+
|
175
|
+
Note that a call like \(PARSE-ONE-LINE PARTS) means that just the code
|
176
|
+
point part is parsed and returned."
|
177
|
+
(cons (parse-code-point (first parts))
|
178
|
+
(loop for part in (rest parts)
|
179
|
+
for type in types
|
180
|
+
for default in defaults
|
181
|
+
when type
|
182
|
+
collect (parse-value part type default))))
|
@@ -0,0 +1,90 @@
|
|
1
|
+
;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-USER; Base: 10 -*-
|
2
|
+
;;; $Header: /usr/local/cvsrep/cl-unicode/cl-unicode.asd,v 1.22 2008/07/24 14:56:31 edi Exp $
|
3
|
+
|
4
|
+
;;; Copyright (c) 2008, Dr. Edmund Weitz. All rights reserved.
|
5
|
+
|
6
|
+
;;; Redistribution and use in source and binary forms, with or without
|
7
|
+
;;; modification, are permitted provided that the following conditions
|
8
|
+
;;; are met:
|
9
|
+
|
10
|
+
;;; * Redistributions of source code must retain the above copyright
|
11
|
+
;;; notice, this list of conditions and the following disclaimer.
|
12
|
+
|
13
|
+
;;; * Redistributions in binary form must reproduce the above
|
14
|
+
;;; copyright notice, this list of conditions and the following
|
15
|
+
;;; disclaimer in the documentation and/or other materials
|
16
|
+
;;; provided with the distribution.
|
17
|
+
|
18
|
+
;;; THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESSED
|
19
|
+
;;; OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
20
|
+
;;; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
21
|
+
;;; ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
|
22
|
+
;;; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
23
|
+
;;; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
24
|
+
;;; GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
25
|
+
;;; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
26
|
+
;;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
27
|
+
;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
28
|
+
;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
29
|
+
|
30
|
+
(in-package :cl-user)
|
31
|
+
|
32
|
+
(defpackage :cl-unicode-asd
|
33
|
+
(:use :cl :asdf))
|
34
|
+
|
35
|
+
(in-package :cl-unicode-asd)
|
36
|
+
|
37
|
+
(defsystem :build-cl-unicode
|
38
|
+
:serial t
|
39
|
+
;; FLEXI-STREAMS is only needed to /build/ CL-UNICODE
|
40
|
+
:depends-on (:flexi-streams)
|
41
|
+
:components ((:file "packages")
|
42
|
+
(:file "specials")
|
43
|
+
(:file "util")
|
44
|
+
(:module "build"
|
45
|
+
:serial t
|
46
|
+
:components ((:file "util")
|
47
|
+
(:file "char-info")
|
48
|
+
(:file "read")
|
49
|
+
(:file "dump")))))
|
50
|
+
|
51
|
+
(defclass generated-cl-source-file (cl-source-file)
|
52
|
+
()
|
53
|
+
(:documentation "A subclass of CL-SOURCE-FILE for source files which
|
54
|
+
might have to be generated by loading the BUILD-CL-UNICODE system
|
55
|
+
first."))
|
56
|
+
|
57
|
+
(defmethod perform ((operation compile-op) (component generated-cl-source-file))
|
58
|
+
"A method which makes sure that the files of type
|
59
|
+
GENERATED-CL-SOURCE-FILE actually exist before we try to compile
|
60
|
+
them."
|
61
|
+
(unless (every 'probe-file (input-files operation component))
|
62
|
+
(operate 'load-op :build-cl-unicode))
|
63
|
+
(call-next-method))
|
64
|
+
|
65
|
+
(defsystem :cl-unicode
|
66
|
+
:version "0.1.1"
|
67
|
+
:serial t
|
68
|
+
:depends-on (:cl-ppcre)
|
69
|
+
:components ((:file "packages")
|
70
|
+
(:file "specials")
|
71
|
+
(:file "util")
|
72
|
+
(:file "conditions")
|
73
|
+
(:generated-cl-source-file "lists")
|
74
|
+
(:generated-cl-source-file "hash-tables")
|
75
|
+
(:file "api")
|
76
|
+
(:generated-cl-source-file "methods")
|
77
|
+
(:file "test-functions")
|
78
|
+
(:file "derived")
|
79
|
+
(:file "alias")))
|
80
|
+
|
81
|
+
(defsystem :cl-unicode-test
|
82
|
+
:depends-on (:cl-unicode)
|
83
|
+
:components ((:module "test"
|
84
|
+
:serial t
|
85
|
+
:components ((:file "packages")
|
86
|
+
(:file "tests")))))
|
87
|
+
|
88
|
+
(defmethod perform ((o test-op) (c (eql (find-system :cl-unicode))))
|
89
|
+
(operate 'load-op :cl-unicode-test)
|
90
|
+
(funcall (intern (symbol-name :run-all-tests) (find-package :cl-unicode-test))))
|
@@ -0,0 +1,54 @@
|
|
1
|
+
;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-UNICODE; Base: 10 -*-
|
2
|
+
;;; $Header: /usr/local/cvsrep/cl-unicode/conditions.lisp,v 1.3 2008/07/22 02:42:13 edi Exp $
|
3
|
+
|
4
|
+
;;; Copyright (c) 2008, Dr. Edmund Weitz. All rights reserved.
|
5
|
+
|
6
|
+
;;; Redistribution and use in source and binary forms, with or without
|
7
|
+
;;; modification, are permitted provided that the following conditions
|
8
|
+
;;; are met:
|
9
|
+
|
10
|
+
;;; * Redistributions of source code must retain the above copyright
|
11
|
+
;;; notice, this list of conditions and the following disclaimer.
|
12
|
+
|
13
|
+
;;; * Redistributions in binary form must reproduce the above
|
14
|
+
;;; copyright notice, this list of conditions and the following
|
15
|
+
;;; disclaimer in the documentation and/or other materials
|
16
|
+
;;; provided with the distribution.
|
17
|
+
|
18
|
+
;;; THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESSED
|
19
|
+
;;; OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
20
|
+
;;; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
21
|
+
;;; ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
|
22
|
+
;;; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
23
|
+
;;; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
24
|
+
;;; GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
25
|
+
;;; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
26
|
+
;;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
27
|
+
;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
28
|
+
;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
29
|
+
|
30
|
+
(in-package :cl-unicode)
|
31
|
+
|
32
|
+
(define-condition unicode-error (error)
|
33
|
+
()
|
34
|
+
(:documentation "All errors signalled by CL-UNICODE are of this type."))
|
35
|
+
|
36
|
+
(define-condition simple-unicode-error (unicode-error simple-condition)
|
37
|
+
()
|
38
|
+
(:documentation "A subclass of UNICODE-ERROR where the caller can
|
39
|
+
supply a format control and format arguments."))
|
40
|
+
|
41
|
+
(defun signal-unicode-error (format-control &rest format-arguments)
|
42
|
+
"Utility function to signal conditions of type SIMPLE-UNICODE-ERROR."
|
43
|
+
(error 'simple-unicode-error
|
44
|
+
:format-control format-control
|
45
|
+
:format-arguments format-arguments))
|
46
|
+
|
47
|
+
(define-condition character-not-found (unicode-error reader-error)
|
48
|
+
((name :initarg :name))
|
49
|
+
(:report (lambda (condition stream)
|
50
|
+
(with-slots (name)
|
51
|
+
condition
|
52
|
+
(format stream "There is no character named ~S." name))))
|
53
|
+
(:documentation "Error signalled by UNICODE-NAME-READER if a
|
54
|
+
character wasn't found."))
|
@@ -0,0 +1,120 @@
|
|
1
|
+
;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-UNICODE; Base: 10 -*-
|
2
|
+
;;; $Header: /usr/local/cvsrep/cl-unicode/derived.lisp,v 1.14 2008/07/20 21:01:08 edi Exp $
|
3
|
+
|
4
|
+
;;; Copyright (c) 2008, Dr. Edmund Weitz. All rights reserved.
|
5
|
+
|
6
|
+
;;; Redistribution and use in source and binary forms, with or without
|
7
|
+
;;; modification, are permitted provided that the following conditions
|
8
|
+
;;; are met:
|
9
|
+
|
10
|
+
;;; * Redistributions of source code must retain the above copyright
|
11
|
+
;;; notice, this list of conditions and the following disclaimer.
|
12
|
+
|
13
|
+
;;; * Redistributions in binary form must reproduce the above
|
14
|
+
;;; copyright notice, this list of conditions and the following
|
15
|
+
;;; disclaimer in the documentation and/or other materials
|
16
|
+
;;; provided with the distribution.
|
17
|
+
|
18
|
+
;;; THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESSED
|
19
|
+
;;; OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
20
|
+
;;; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
21
|
+
;;; ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
|
22
|
+
;;; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
23
|
+
;;; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
24
|
+
;;; GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
25
|
+
;;; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
26
|
+
;;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
27
|
+
;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
28
|
+
;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
29
|
+
|
30
|
+
(in-package :cl-unicode)
|
31
|
+
|
32
|
+
(defconstant +xid-difference+
|
33
|
+
;; the usual mumbo jumbo for SBCL...
|
34
|
+
(if (boundp '+xid-difference+)
|
35
|
+
(symbol-value '+xid-difference+)
|
36
|
+
'(#x37a
|
37
|
+
(#x309b . #x309c)
|
38
|
+
(#xfc5e . #xfc63)
|
39
|
+
(#xfdfa . #xfdfb)
|
40
|
+
#xfe70
|
41
|
+
#xfe72
|
42
|
+
#xfe74
|
43
|
+
#xfe76
|
44
|
+
#xfe78
|
45
|
+
#xfe7a
|
46
|
+
#xfe7c
|
47
|
+
#xfe7e)))
|
48
|
+
|
49
|
+
(defvar *derived-map*
|
50
|
+
`(("Any")
|
51
|
+
("LC" "Lu" "Ll" "Lt")
|
52
|
+
("L" "LC" "Lm" "Lo")
|
53
|
+
("M" "Mn" "Mc" "Me")
|
54
|
+
("N" "Nd" "Nl" "No")
|
55
|
+
("P" "Pc" "Pd" "Ps" "Pe" "Pi" "Pf" "Po")
|
56
|
+
("S" "Sm" "Sc" "Sk" "So")
|
57
|
+
("Z" "Zs" "Zl" "Zp")
|
58
|
+
("C" "Cc" "Cf" "Cs" "Co" "Cn")
|
59
|
+
("Math" "Sm" "OtherMath")
|
60
|
+
("Alphabetic" "L" "Nl" "OtherAlphabetic")
|
61
|
+
("Lowercase" "Ll" "OtherLowercase")
|
62
|
+
("Uppercase" "Lu" "OtherUppercase")
|
63
|
+
("GraphemeExtend" "Me" "Mn" "OtherGraphemeExtend")
|
64
|
+
("GraphemeBase" ("C" "Zl" "Zp" "GraphemeExtend"))
|
65
|
+
("IDStart" "L" "Nl" "OtherIDStart" ("PatternSyntax" "PatternWhiteSpace"))
|
66
|
+
("IDContinue" "IDStart" "Mn" "Mc" "Nd" "Pc" "OtherIDContinue" ("PatternSyntax" "PatternWhiteSpace"))
|
67
|
+
("XIDStart" "IDStart" (,@+xid-difference+ #xe33 #xeb3 (#xff9e . #xff9f)))
|
68
|
+
("XIDContinue" "IDContinue" ,+xid-difference+)
|
69
|
+
("DefaultIgnorableCodePoint" "OtherDefaultIgnorableCodePoint" "Cf" "VariationSelector"
|
70
|
+
("WhiteSpace" (#xfff9 . #xfffb) (#x600 . #x603) #x6dd #x70f))))
|
71
|
+
|
72
|
+
;; todo: xid_start, xid_continue,
|
73
|
+
|
74
|
+
(defun build-derived-test-function (property-designators)
|
75
|
+
(labels ((build-test-function (designator)
|
76
|
+
(etypecase designator
|
77
|
+
(string
|
78
|
+
(let ((test-function (gethash (gethash designator *property-map*) *property-tests*)))
|
79
|
+
(assert test-function (designator)
|
80
|
+
"Unknown property name ~S." designator)
|
81
|
+
test-function))
|
82
|
+
(integer
|
83
|
+
(lambda (c)
|
84
|
+
(= (ensure-code-point c) designator)))
|
85
|
+
(cons
|
86
|
+
(let ((from (car designator))
|
87
|
+
(to (car designator)))
|
88
|
+
(assert (and (typep from 'integer) (typep to 'integer)) (designator)
|
89
|
+
"Car and cdr of ~S must both be integers." designator)
|
90
|
+
(lambda (c)
|
91
|
+
(<= from (ensure-code-point c) to))))))
|
92
|
+
(collect-test-functions (designators)
|
93
|
+
(loop for designator in designators
|
94
|
+
collect (build-test-function designator))))
|
95
|
+
(let ((positive-test-functions
|
96
|
+
(collect-test-functions (remove-if-not 'atom property-designators)))
|
97
|
+
(negative-test-functions
|
98
|
+
(collect-test-functions (find-if-not 'atom property-designators))))
|
99
|
+
(cond (negative-test-functions
|
100
|
+
(lambda (c)
|
101
|
+
(and (or (null positive-test-functions)
|
102
|
+
(loop for test-function in positive-test-functions
|
103
|
+
thereis (funcall (the function test-function) c)))
|
104
|
+
(not (loop for test-function in negative-test-functions
|
105
|
+
thereis (funcall (the function test-function) c))))))
|
106
|
+
(t
|
107
|
+
(lambda (c)
|
108
|
+
(or (null positive-test-functions)
|
109
|
+
(loop for test-function in positive-test-functions
|
110
|
+
thereis (funcall (the function test-function) c)))))))))
|
111
|
+
|
112
|
+
(defun build-derived-test-functions ()
|
113
|
+
(loop for (name . property-names) in *derived-map*
|
114
|
+
for symbol = (register-property-symbol name) do
|
115
|
+
(assert (null (gethash symbol *property-tests*)) (name)
|
116
|
+
"There is already a property named ~S." name)
|
117
|
+
(setf (gethash symbol *property-tests*)
|
118
|
+
(build-derived-test-function property-names)
|
119
|
+
(gethash name *property-map*)
|
120
|
+
symbol)))
|