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 @@
|
|
1
|
+
;;;-*-Mode: LISP; Package: CCL -*-
|
2
|
combining hw.cpu64bit_capable, hw.optional.x86_64 and hw.optional.64bitops
|
1
3
|
;; FRAMWORK CALL FUNCTIONALITY FROM BSD.LISP
|
2
4
|
;; (C) 2003 Brendan Burns <bburns@cs.umass.edu>
|
3
5
|
;; Released under LGPL.
|
4
6
|
(with-cfstrs ((framework framework-name))
|
5
7
|
(let ((err 0)
|
6
8
|
(baseURL nil)
|
7
9
|
(bundleURL nil)
|
8
10
|
(result nil))
|
9
11
|
(rlet ((folder :fsref))
|
10
12
|
;; Find the folder holding the bundle
|
11
13
|
(setf err (#_FSFindFolder #$kOnAppropriateDisk #$kFrameworksFolderType
|
12
14
|
t folder))
|
13
15
|
|
14
16
|
;; if everything's cool, make a URL for it
|
15
17
|
(when (zerop err)
|
16
18
|
(setf baseURL (#_CFURLCreateFromFSRef (%null-ptr) folder))
|
17
19
|
(if (%null-ptr-p baseURL)
|
18
20
|
(setf err #$coreFoundationUnknownErr)))
|
19
21
|
|
20
22
|
;; if everything's cool, make a URL for the bundle
|
21
23
|
(when (zerop err)
|
22
24
|
(setf bundleURL (#_CFURLCreateCopyAppendingPathComponent (%null-ptr)
|
23
25
|
baseURL framework nil))
|
24
26
|
(if (%null-ptr-p bundleURL)
|
25
27
|
(setf err #$coreFoundationUnknownErr)))
|
26
28
|
|
27
29
|
;; if everything's cool, load it
|
28
30
|
(when (zerop err)
|
29
31
|
(setf result (#_CFBundleCreate (%null-ptr) bundleURL))
|
30
32
|
(if (%null-ptr-p result)
|
31
33
|
(setf err #$coreFoundationUnknownErr)))
|
32
34
|
|
33
35
|
;; if everything's cool, and the user wants it loaded, load it
|
34
36
|
(when (and load-executable (zerop err))
|
35
37
|
(if (not (#_CFBundleLoadExecutable result))
|
36
38
|
(setf err #$coreFoundationUnknownErr)))
|
37
39
|
|
38
40
|
;; if there's an error, but we've got a pointer, free it and clear result
|
39
41
|
(when (and (not (zerop err)) (not (%null-ptr-p result)))
|
40
42
|
(#_CFRelease result)
|
41
43
|
(setf result nil))
|
42
44
|
|
43
45
|
;; free the URLs if there non-null
|
44
46
|
(when (not (%null-ptr-p bundleURL))
|
45
47
|
(#_CFRelease bundleURL))
|
46
48
|
(when (not (%null-ptr-p baseURL))
|
47
49
|
(#_CFRelease baseURL))
|
48
50
|
|
49
51
|
;; return pointer + error value
|
50
52
|
(values result err)))))
|
51
53
|
(let* ((addr (#_CFBundleGetFunctionPointerForName bundle name)))
|
52
54
|
(rlet ((buf :long))
|
53
55
|
(setf (%get-ptr buf) addr)
|
54
56
|
(ash (%get-signed-long buf) -2))))
|
55
57
|
(with-cfstrs ((str name))
|
56
58
|
(let* ((addr (#_CFBundleGetFunctionPointerForName bundle str)))
|
57
59
|
(if (%null-ptr-p addr)
|
58
60
|
(unless nil-if-not-found
|
59
61
|
(error "Couldn't resolve address of foreign function ~s" name))
|
60
62
|
(rlet ((buf :long)) ;; mcl 5.2 uses %fixnum-from-macptr here
|
61
63
|
(setf (%get-ptr buf) addr)
|
62
64
|
(ash (%get-signed-long buf) -2))))))
|
63
65
|
#+ccl-5.2 (get-bundle-for-framework-name "System.framework")
|
64
66
|
#-ccl-5.2
|
65
67
|
(let ((bundle (load-framework-bundle "System.framework")))
|
66
68
|
(terminate-when-unreachable bundle (lambda (b)(#_CFRelease b)))
|
67
69
|
bundle))
|
68
70
|
;; Is there an existing define-trap like macro for this? or could one be modified for use with bundles?
|
69
71
|
`(progn
|
70
72
|
(defloadvar ,fn
|
71
73
|
(let* ((bundle #+ccl-5.2 (get-bundle-for-framework-name "System.framework")
|
72
74
|
#-ccl-5.2
|
73
75
|
(let ((bundle (load-framework-bundle "System.framework")))
|
74
76
|
(terminate-when-unreachable bundle (lambda (b)(#_CFRelease b)))
|
75
77
|
bundle)))
|
76
78
|
(lookup-function-in-bundle ,name-string bundle)))
|
77
79
|
,(let ((args (do ((arglist arglist (cddr arglist))
|
78
80
|
(result))
|
79
81
|
((not (cdr arglist)) (nreverse result))
|
80
82
|
(push (second arglist) result))))
|
81
83
|
`(defun ,name ,args
|
82
84
|
(ppc-ff-call ,fn ,@arglist)))))
|
83
85
|
:signed-fullword) ;; returns a file descriptor no!
|
84
86
|
(let ((kq (%system-kqueue)))
|
85
87
|
(if (= kq -1)
|
86
88
|
(ecase (%system-errno)
|
87
89
|
(12 (error "The kernel failed to allocate enough memory for the kernel queue")) ; ENOMEM
|
88
90
|
(24 (error "The per-process descriptor table is full")) ; EMFILE
|
89
91
|
(23 (error "The system file table is full"))) ; ENFILE
|
90
92
|
kq)))
|
91
93
|
:unsigned-fullword kq
|
92
94
|
:address ke
|
93
95
|
:unsigned-fullword nke
|
94
96
|
:address ko
|
95
97
|
:unsigned-fullword nko
|
96
98
|
:address timeout
|
97
99
|
:signed-fullword)
|
98
100
|
:address name
|
99
101
|
:unsigned-fullword mode
|
100
102
|
:unsigned-fullword arg
|
101
103
|
:signed-fullword)
|
102
104
|
|
103
105
|
:unsigned-fullword fd
|
104
106
|
:signed-fullword)
|
105
107
|
:signed-fullword)
|
106
108
|
:signed-fullword errno
|
107
109
|
:address)
|
108
110
|
(%get-fixnum (%int-to-ptr (%system-errno*))))
|
109
111
|
"Low level open function, as in C, returns an fd number"
|
110
112
|
(with-cstrs ((name posix-namestring))
|
111
113
|
(%system-open name $O-EVTONLY 0)))
|
112
114
|
(%system-close fd))
|
113
115
|
(sec :unsigned-long)
|
114
116
|
(usec :unsigned-long))
|
115
117
|
(setf *kevent-record*
|
116
118
|
(if (ccl::gestalt #$gestaltPowerPCProcessorFeatures
|
117
119
|
#+ccl-5.2 #$gestaltPowerPCHas64BitSupport #-ccl-5.2 6)
|
118
120
|
:kevent32
|
119
121
|
:kevent64)))
|
120
122
|
(ident :unsigned-long) ; uintptr_t
|
121
123
|
(filter :short)
|
122
124
|
(flags :unsigned-short)
|
123
125
|
(fflags :unsigned-long)
|
124
126
|
(data :long) ; intptr_t
|
125
127
|
(udata :pointer))
|
126
128
|
(:variant ; uintptr_t
|
127
129
|
((ident64 :uint64))
|
128
130
|
((ident :unsigned-long)))
|
129
131
|
(filter :short)
|
130
132
|
(flags :unsigned-short)
|
131
133
|
(fflags :unsigned-long)
|
132
134
|
(:variant ; intptr_t
|
133
135
|
((data64 :sint64))
|
134
136
|
((data :long)))
|
135
137
|
(:variant ; RMCL :pointer is 32bit
|
136
138
|
((udata64 :uint64))
|
137
139
|
((udata :pointer))))
|
138
140
|
(ecase *kevent-record*
|
139
141
|
(:kevent64
|
140
142
|
(make-record kevent64
|
141
143
|
:ident ident
|
142
144
|
:filter filter
|
143
145
|
:flags flags
|
144
146
|
:fflags fflags
|
145
147
|
:data data
|
146
148
|
:udata udata))
|
147
149
|
(:kevent32
|
148
150
|
(make-record kevent32
|
149
151
|
:ident ident
|
150
152
|
:filter filter
|
151
153
|
:flags flags
|
152
154
|
:fflags fflags
|
153
155
|
:data data
|
154
156
|
:udata udata))))
|
155
157
|
(ecase *kevent-record*
|
156
158
|
(:kevent32
|
157
159
|
(ecase field
|
158
160
|
(:ident (rref ke :kevent32.ident))
|
159
161
|
(:filter (rref ke :kevent32.filter))
|
160
162
|
(:flags (rref ke :kevent32.flags))
|
161
163
|
(:fflags (rref ke :kevent32.fflags))
|
162
164
|
(:data (rref ke :kevent32.data))
|
163
165
|
(:udata (rref ke :kevent32.udata))))
|
164
166
|
(:kevent64
|
165
167
|
(ecase field
|
166
168
|
(:ident (rref ke :kevent64.ident))
|
167
169
|
(:filter (rref ke :kevent64.filter))
|
168
170
|
(:flags (rref ke :kevent64.flags))
|
169
171
|
(:fflags (rref ke :kevent64.fflags))
|
170
172
|
(:data (rref ke :kevent64.data))
|
171
173
|
(:udata (rref ke :kevent64.udata))))))
|
172
174
|
(kevent-rref ke :filter))
|
173
175
|
(kevent-rref ke :flags))
|
174
176
|
(kevent-rref ke :data))
|
175
177
|
$kevent-file-attrib $kevent-file-link $kevent-file-rename $kevent-file-revoke))
|
176
178
|
((errno :initform NIL :initarg :errno)
|
177
179
|
(ko :initform nil :type (or null kevent) :initarg :ko)
|
178
180
|
(syserr :initform (%system-errno)))
|
179
181
|
(:report
|
180
182
|
(lambda (c s)
|
181
183
|
(with-slots (errno ko syserr) c
|
182
184
|
(format s "kevent system call error ~A [~A]" errno syserr)
|
183
185
|
(when errno
|
184
186
|
(format s "(~A)" (%get-cstring (%system-strerror errno))))
|
185
187
|
(when ko
|
186
188
|
(format s " for ")
|
187
189
|
(let ((*standard-output* s))
|
188
190
|
(print-record ko *kevent-record*)))))))
|
189
191
|
(check-type kq integer)
|
190
192
|
(rlet ((&timeout :timespec :sec timeout :usec 1))
|
191
193
|
(let ((num (with-timer ;; does not seem to make a difference...
|
192
194
|
(%system-kevent kq (or ke (%null-ptr))(if ke 1 0)(or ko (%null-ptr))(if ko 1 0) &timeout))))
|
193
195
|
; "If an error occurs while processing an element of the changelist and there
|
194
196
|
; is enough room in the eventlist, then the event will be placed in the eventlist with
|
195
197
|
; EV_ERROR set in flags and the system error in data."
|
196
198
|
(when (and ko (plusp (logand $kevent-error (kevent-flags ko))))
|
197
199
|
(error 'kevent-error
|
198
200
|
:errno (kevent-data ko)
|
199
201
|
:ko ko))
|
200
202
|
; "Otherwise, -1 will be returned, and errno will be set to indicate the error condition."
|
201
203
|
(when (= num -1)
|
202
204
|
;; hack - opentransport provides the constants for the errors documented for the call
|
203
205
|
(case (%system-errno)
|
204
206
|
(0 (error "kevent system call failed with an unspecified error")) ;; should not happen!
|
205
207
|
(13 (error "The process does not have permission to register a filter"))
|
206
208
|
(14 (error "There was an error reading or writing the kevent structure")) ; EFAULT
|
207
209
|
(9 (error "The specified descriptor is invalid")) ; EBADF
|
208
210
|
(4 (error "A signal was delivered before the timeout expired and before any events were placed on the kqueue for return.")) ; EINTR
|
209
211
|
(22 (error "The specified time limit or filter is invalid")) ; EINVAL
|
210
212
|
(2 (error "The event could not be found to be modified or deleted")) ; ENOENT
|
211
213
|
(12 (error "No memory was available to register the event")) ; ENOMEM
|
212
214
|
(78 (error "The specified process to attach to does not exist"))) ; ESRCH
|
213
215
|
;; shouldn't get here...
|
214
216
|
(errchk (%system-errno))
|
215
217
|
(error "error ~A" (%system-errno)))
|
216
218
|
(unless (zerop num)
|
217
219
|
(values ko num)))))
|
218
220
|
((kq :initform (system-kqueue)
|
219
221
|
:documentation "file descriptor referencing the kqueue")
|
220
222
|
(fds :initform NIL)) ;; ## better if kept on top level, perhaps as a hash table...
|
221
223
|
(:documentation "A kernal event notification channel"))
|
222
224
|
(declare (ignore rest))
|
223
225
|
(terminate-when-unreachable q 'kqueue-close))
|
224
226
|
(with-slots (kq fds) q
|
225
227
|
(when (or kq fds) ;; allow repeated close
|
226
228
|
(system-close kq)
|
227
229
|
(setf fds NIL)
|
228
230
|
(setf kq NIL))))
|
229
231
|
"Polls a kqueue for kevents"
|
230
232
|
;; may not have to be cleared, but just in case:
|
231
233
|
(flet ((kqueue-poll2 (ko)
|
232
234
|
(let ((result (with-slots (kq) q
|
233
235
|
(without-interrupts
|
234
236
|
(%kevent kq NIL ko)))))
|
235
237
|
(when result
|
236
238
|
(let ((type (kevent-filter result)))
|
237
239
|
(ecase type
|
238
240
|
(0 (values))
|
239
241
|
(#.$kevent-read-filter
|
240
242
|
(values
|
241
243
|
:read
|
242
244
|
(kevent-rref result :ident)
|
243
245
|
(kevent-rref result :flags)
|
244
246
|
(kevent-rref result :fflags)
|
245
247
|
(kevent-rref result :data)
|
246
248
|
(kevent-rref result :udata)))
|
247
249
|
(#.$kevent-write-filter :write)
|
248
250
|
(#.$kevent-aio-filter :aio)
|
249
251
|
(#.$kevent-vnode-filter
|
250
252
|
(values
|
251
253
|
:vnode
|
252
254
|
(cdr (assoc (kevent-rref result :ident) (slot-value q 'fds)))
|
253
255
|
(kevent-rref result :flags)
|
254
256
|
(kevent-rref result :fflags)
|
255
257
|
(kevent-rref result :data)
|
256
258
|
(kevent-rref result :udata)))
|
257
259
|
(#.$kevent-filesystem-filter :filesystem)))))))
|
258
260
|
(ecase *kevent-record*
|
259
261
|
(:kevent64
|
260
262
|
(rlet ((ko :kevent64 :ident 0 :filter 0 :flags 0 :fflags 0 :data 0 :udata (%null-ptr)))
|
261
263
|
(kqueue-poll2 ko)))
|
262
264
|
(:kevent32
|
263
265
|
(rlet ((ko :kevent32 :ident 0 :filter 0 :flags 0 :fflags 0 :data 0 :udata (%null-ptr)))
|
264
266
|
(kqueue-poll2 ko))))))
|
265
267
|
(let ((ke (make-kevent :ident ident
|
266
268
|
:filter filter
|
267
269
|
:flags flags
|
268
270
|
:fflags fflags
|
269
271
|
:data data
|
270
272
|
:udata udata)))
|
271
273
|
(with-slots (kq) q
|
272
274
|
(without-interrupts
|
273
275
|
(%kevent kq ke)))))
|
274
276
|
"Makes the queue report an event when there is a change to a directory or file"
|
275
277
|
(let* ((namestring (posix-namestring (full-pathname pathname)))
|
276
278
|
(fd (system-open namestring)))
|
277
279
|
(with-slots (fds) q
|
278
280
|
(push (cons fd pathname) fds))
|
279
281
|
(kqueue-subscribe q
|
280
282
|
:ident fd
|
281
283
|
:filter $kevent-vnode-filter
|
282
284
|
:flags (logior $kevent-add $kevent-clear)
|
283
285
|
:fflags $kevent-file-all)
|
284
286
|
namestring))
|
285
287
|
"Report changes to a file or directory"
|
286
288
|
(loop
|
287
289
|
with kqueue = (make-instance 'kqueue)
|
288
290
|
with sub = (kqueue-vnode-subscribe kqueue pathname)
|
289
291
|
for i from 1 to 60
|
290
292
|
for result = (multiple-value-list (kqueue-poll kqueue))
|
291
293
|
unless (equal result '(NIL))
|
292
294
|
do (progn
|
293
295
|
(format T "~A~%" result)
|
294
296
|
(force-output))
|
295
297
|
; do (process-allow-schedule)
|
296
298
|
do (sleep 1)
|
297
299
|
finally (write-line "Done")
|
298
300
|
))
|
299
301
|
(fred))
|
300
302
|
(make-pathname :directory (pathname-directory *loading-file-source-file*))
|
301
303
|
(fred))
|
@@ -0,0 +1,245 @@
|
|
1
|
+
;;;; SPLIT-SEQUENCE
|
2
|
+
;;;
|
3
|
+
;;; This code was based on Arthur Lemmens' in
|
4
|
+
;;; <URL:http://groups.google.com/groups?as_umsgid=39F36F1A.B8F19D20%40simplex.nl>;
|
5
|
+
;;;
|
6
|
+
;;; changes include:
|
7
|
+
;;;
|
8
|
+
;;; * altering the behaviour of the :from-end keyword argument to
|
9
|
+
;;; return the subsequences in original order, for consistency with
|
10
|
+
;;; CL:REMOVE, CL:SUBSTITUTE et al. (:from-end being non-NIL only
|
11
|
+
;;; affects the answer if :count is less than the number of
|
12
|
+
;;; subsequences, by analogy with the above-referenced functions).
|
13
|
+
;;;
|
14
|
+
;;; * changing the :maximum keyword argument to :count, by analogy
|
15
|
+
;;; with CL:REMOVE, CL:SUBSTITUTE, and so on.
|
16
|
+
;;;
|
17
|
+
;;; * naming the function SPLIT-SEQUENCE rather than PARTITION rather
|
18
|
+
;;; than SPLIT.
|
19
|
+
;;;
|
20
|
+
;;; * adding SPLIT-SEQUENCE-IF and SPLIT-SEQUENCE-IF-NOT.
|
21
|
+
;;;
|
22
|
+
;;; * The second return value is now an index rather than a copy of a
|
23
|
+
;;; portion of the sequence; this index is the `right' one to feed to
|
24
|
+
;;; CL:SUBSEQ for continued processing.
|
25
|
+
|
26
|
+
;;; There's a certain amount of code duplication here, which is kept
|
27
|
+
;;; to illustrate the relationship between the SPLIT-SEQUENCE
|
28
|
+
;;; functions and the CL:POSITION functions.
|
29
|
+
|
30
|
+
;;; Examples:
|
31
|
+
;;;
|
32
|
+
;;; * (split-sequence #\; "a;;b;c")
|
33
|
+
;;; -> ("a" "" "b" "c"), 6
|
34
|
+
;;;
|
35
|
+
;;; * (split-sequence #\; "a;;b;c" :from-end t)
|
36
|
+
;;; -> ("a" "" "b" "c"), 0
|
37
|
+
;;;
|
38
|
+
;;; * (split-sequence #\; "a;;b;c" :from-end t :count 1)
|
39
|
+
;;; -> ("c"), 4
|
40
|
+
;;;
|
41
|
+
;;; * (split-sequence #\; "a;;b;c" :remove-empty-subseqs t)
|
42
|
+
;;; -> ("a" "b" "c"), 6
|
43
|
+
;;;
|
44
|
+
;;; * (split-sequence-if (lambda (x) (member x '(#\a #\b))) "abracadabra")
|
45
|
+
;;; -> ("" "" "r" "c" "d" "" "r" ""), 11
|
46
|
+
;;;
|
47
|
+
;;; * (split-sequence-if-not (lambda (x) (member x '(#\a #\b))) "abracadabra")
|
48
|
+
;;; -> ("ab" "a" "a" "ab" "a"), 11
|
49
|
+
;;;
|
50
|
+
;;; * (split-sequence #\; ";oo;bar;ba;" :start 1 :end 9)
|
51
|
+
;;; -> ("oo" "bar" "b"), 9
|
52
|
+
|
53
|
+
#+ignore ; comment by usocket
|
54
|
+
(defpackage "SPLIT-SEQUENCE"
|
55
|
+
(:use "CL")
|
56
|
+
(:nicknames "PARTITION")
|
57
|
+
(:export "SPLIT-SEQUENCE" "SPLIT-SEQUENCE-IF" "SPLIT-SEQUENCE-IF-NOT"
|
58
|
+
"PARTITION" "PARTITION-IF" "PARTITION-IF-NOT"))
|
59
|
+
|
60
|
+
(in-package :usocket #+ignore "SPLIT-SEQUENCE")
|
61
|
+
|
62
|
+
(defun split-sequence (delimiter seq &key (count nil) (remove-empty-subseqs nil) (from-end nil) (start 0) (end nil) (test nil test-supplied) (test-not nil test-not-supplied) (key nil key-supplied))
|
63
|
+
"Return a list of subsequences in seq delimited by delimiter.
|
64
|
+
|
65
|
+
If :remove-empty-subseqs is NIL, empty subsequences will be included
|
66
|
+
in the result; otherwise they will be discarded. All other keywords
|
67
|
+
work analogously to those for CL:SUBSTITUTE. In particular, the
|
68
|
+
behaviour of :from-end is possibly different from other versions of
|
69
|
+
this function; :from-end values of NIL and T are equivalent unless
|
70
|
+
:count is supplied. The second return value is an index suitable as an
|
71
|
+
argument to CL:SUBSEQ into the sequence indicating where processing
|
72
|
+
stopped."
|
73
|
+
(let ((len (length seq))
|
74
|
+
(other-keys (nconc (when test-supplied
|
75
|
+
(list :test test))
|
76
|
+
(when test-not-supplied
|
77
|
+
(list :test-not test-not))
|
78
|
+
(when key-supplied
|
79
|
+
(list :key key)))))
|
80
|
+
(unless end (setq end len))
|
81
|
+
(if from-end
|
82
|
+
(loop for right = end then left
|
83
|
+
for left = (max (or (apply #'position delimiter seq
|
84
|
+
:end right
|
85
|
+
:from-end t
|
86
|
+
other-keys)
|
87
|
+
-1)
|
88
|
+
(1- start))
|
89
|
+
unless (and (= right (1+ left))
|
90
|
+
remove-empty-subseqs) ; empty subseq we don't want
|
91
|
+
if (and count (>= nr-elts count))
|
92
|
+
;; We can't take any more. Return now.
|
93
|
+
return (values (nreverse subseqs) right)
|
94
|
+
else
|
95
|
+
collect (subseq seq (1+ left) right) into subseqs
|
96
|
+
and sum 1 into nr-elts
|
97
|
+
until (< left start)
|
98
|
+
finally (return (values (nreverse subseqs) (1+ left))))
|
99
|
+
(loop for left = start then (+ right 1)
|
100
|
+
for right = (min (or (apply #'position delimiter seq
|
101
|
+
:start left
|
102
|
+
other-keys)
|
103
|
+
len)
|
104
|
+
end)
|
105
|
+
unless (and (= right left)
|
106
|
+
remove-empty-subseqs) ; empty subseq we don't want
|
107
|
+
if (and count (>= nr-elts count))
|
108
|
+
;; We can't take any more. Return now.
|
109
|
+
return (values subseqs left)
|
110
|
+
else
|
111
|
+
collect (subseq seq left right) into subseqs
|
112
|
+
and sum 1 into nr-elts
|
113
|
+
until (>= right end)
|
114
|
+
finally (return (values subseqs right))))))
|
115
|
+
|
116
|
+
(defun split-sequence-if (predicate seq &key (count nil) (remove-empty-subseqs nil) (from-end nil) (start 0) (end nil) (key nil key-supplied))
|
117
|
+
"Return a list of subsequences in seq delimited by items satisfying
|
118
|
+
predicate.
|
119
|
+
|
120
|
+
If :remove-empty-subseqs is NIL, empty subsequences will be included
|
121
|
+
in the result; otherwise they will be discarded. All other keywords
|
122
|
+
work analogously to those for CL:SUBSTITUTE-IF. In particular, the
|
123
|
+
behaviour of :from-end is possibly different from other versions of
|
124
|
+
this function; :from-end values of NIL and T are equivalent unless
|
125
|
+
:count is supplied. The second return value is an index suitable as an
|
126
|
+
argument to CL:SUBSEQ into the sequence indicating where processing
|
127
|
+
stopped."
|
128
|
+
(let ((len (length seq))
|
129
|
+
(other-keys (when key-supplied
|
130
|
+
(list :key key))))
|
131
|
+
(unless end (setq end len))
|
132
|
+
(if from-end
|
133
|
+
(loop for right = end then left
|
134
|
+
for left = (max (or (apply #'position-if predicate seq
|
135
|
+
:end right
|
136
|
+
:from-end t
|
137
|
+
other-keys)
|
138
|
+
-1)
|
139
|
+
(1- start))
|
140
|
+
unless (and (= right (1+ left))
|
141
|
+
remove-empty-subseqs) ; empty subseq we don't want
|
142
|
+
if (and count (>= nr-elts count))
|
143
|
+
;; We can't take any more. Return now.
|
144
|
+
return (values (nreverse subseqs) right)
|
145
|
+
else
|
146
|
+
collect (subseq seq (1+ left) right) into subseqs
|
147
|
+
and sum 1 into nr-elts
|
148
|
+
until (< left start)
|
149
|
+
finally (return (values (nreverse subseqs) (1+ left))))
|
150
|
+
(loop for left = start then (+ right 1)
|
151
|
+
for right = (min (or (apply #'position-if predicate seq
|
152
|
+
:start left
|
153
|
+
other-keys)
|
154
|
+
len)
|
155
|
+
end)
|
156
|
+
unless (and (= right left)
|
157
|
+
remove-empty-subseqs) ; empty subseq we don't want
|
158
|
+
if (and count (>= nr-elts count))
|
159
|
+
;; We can't take any more. Return now.
|
160
|
+
return (values subseqs left)
|
161
|
+
else
|
162
|
+
collect (subseq seq left right) into subseqs
|
163
|
+
and sum 1 into nr-elts
|
164
|
+
until (>= right end)
|
165
|
+
finally (return (values subseqs right))))))
|
166
|
+
|
167
|
+
(defun split-sequence-if-not (predicate seq &key (count nil) (remove-empty-subseqs nil) (from-end nil) (start 0) (end nil) (key nil key-supplied))
|
168
|
+
"Return a list of subsequences in seq delimited by items satisfying
|
169
|
+
(CL:COMPLEMENT predicate).
|
170
|
+
|
171
|
+
If :remove-empty-subseqs is NIL, empty subsequences will be included
|
172
|
+
in the result; otherwise they will be discarded. All other keywords
|
173
|
+
work analogously to those for CL:SUBSTITUTE-IF-NOT. In particular,
|
174
|
+
the behaviour of :from-end is possibly different from other versions
|
175
|
+
of this function; :from-end values of NIL and T are equivalent unless
|
176
|
+
:count is supplied. The second return value is an index suitable as an
|
177
|
+
argument to CL:SUBSEQ into the sequence indicating where processing
|
178
|
+
stopped."
|
179
|
+
(let ((len (length seq))
|
180
|
+
(other-keys (when key-supplied
|
181
|
+
(list :key key))))
|
182
|
+
(unless end (setq end len))
|
183
|
+
(if from-end
|
184
|
+
(loop for right = end then left
|
185
|
+
for left = (max (or (apply #'position-if-not predicate seq
|
186
|
+
:end right
|
187
|
+
:from-end t
|
188
|
+
other-keys)
|
189
|
+
-1)
|
190
|
+
(1- start))
|
191
|
+
unless (and (= right (1+ left))
|
192
|
+
remove-empty-subseqs) ; empty subseq we don't want
|
193
|
+
if (and count (>= nr-elts count))
|
194
|
+
;; We can't take any more. Return now.
|
195
|
+
return (values (nreverse subseqs) right)
|
196
|
+
else
|
197
|
+
collect (subseq seq (1+ left) right) into subseqs
|
198
|
+
and sum 1 into nr-elts
|
199
|
+
until (< left start)
|
200
|
+
finally (return (values (nreverse subseqs) (1+ left))))
|
201
|
+
(loop for left = start then (+ right 1)
|
202
|
+
for right = (min (or (apply #'position-if-not predicate seq
|
203
|
+
:start left
|
204
|
+
other-keys)
|
205
|
+
len)
|
206
|
+
end)
|
207
|
+
unless (and (= right left)
|
208
|
+
remove-empty-subseqs) ; empty subseq we don't want
|
209
|
+
if (and count (>= nr-elts count))
|
210
|
+
;; We can't take any more. Return now.
|
211
|
+
return (values subseqs left)
|
212
|
+
else
|
213
|
+
collect (subseq seq left right) into subseqs
|
214
|
+
and sum 1 into nr-elts
|
215
|
+
until (>= right end)
|
216
|
+
finally (return (values subseqs right))))))
|
217
|
+
|
218
|
+
;;; clean deprecation
|
219
|
+
|
220
|
+
(defun partition (&rest args)
|
221
|
+
(apply #'split-sequence args))
|
222
|
+
|
223
|
+
(defun partition-if (&rest args)
|
224
|
+
(apply #'split-sequence-if args))
|
225
|
+
|
226
|
+
(defun partition-if-not (&rest args)
|
227
|
+
(apply #'split-sequence-if-not args))
|
228
|
+
|
229
|
+
(define-compiler-macro partition (&whole form &rest args)
|
230
|
+
(declare (ignore args))
|
231
|
+
(warn "PARTITION is deprecated; use SPLIT-SEQUENCE instead.")
|
232
|
+
form)
|
233
|
+
|
234
|
+
(define-compiler-macro partition-if (&whole form &rest args)
|
235
|
+
(declare (ignore args))
|
236
|
+
(warn "PARTITION-IF is deprecated; use SPLIT-SEQUENCE-IF instead.")
|
237
|
+
form)
|
238
|
+
|
239
|
+
(define-compiler-macro partition-if-not (&whole form &rest args)
|
240
|
+
(declare (ignore args))
|
241
|
+
(warn "PARTITION-IF-NOT is deprecated; use SPLIT-SEQUENCE-IF-NOT instead")
|
242
|
+
form)
|
243
|
+
|
244
|
+
#+ignore ; comment by usocket
|
245
|
+
(pushnew :split-sequence *features*)
|
data/lib/clucumber.rb
CHANGED
@@ -6,25 +6,39 @@ class ClucumberSubprocess
|
|
6
6
|
|
7
7
|
attr_reader :output
|
8
8
|
|
9
|
+
def self.launch(dir, options={})
|
10
|
+
proc = ClucumberSubprocess.new(dir, options)
|
11
|
+
at_exit do
|
12
|
+
proc.kill
|
13
|
+
end
|
14
|
+
proc.run
|
15
|
+
proc
|
16
|
+
end
|
17
|
+
|
9
18
|
def initialize(dir, options={})
|
10
19
|
@dir = dir
|
11
|
-
lisp = options[:lisp] || ENV['LISP'] || 'sbcl --disable-debugger'
|
20
|
+
@lisp = options[:lisp] || ENV['LISP'] || 'sbcl --disable-debugger'
|
12
21
|
@port = options[:port] || raise("Need a port to run clucumber on.")
|
13
22
|
@output = ""
|
14
|
-
|
23
|
+
end
|
24
|
+
|
25
|
+
def run
|
15
26
|
Dir.chdir(@dir) do
|
16
|
-
@out, @in, @pid = PTY.spawn(lisp)
|
27
|
+
@out, @in, @pid = PTY.spawn(@lisp)
|
17
28
|
end
|
18
29
|
@reader = Thread.start {
|
19
30
|
record_output
|
20
|
-
}
|
31
|
+
}
|
32
|
+
cluke_dir = File.expand_path("clucumber/", File.dirname(__FILE__))
|
33
|
+
Dir[cluke_dir + '/**/*.fasl'].each do |fasl|
|
34
|
+
FileUtils.rm(fasl)
|
35
|
+
end
|
21
36
|
@in.puts(<<-LISP)
|
22
|
-
(
|
23
|
-
(load #p"#{File.expand_path("clucumber/clucumber.asd", File.dirname(__FILE__))}")
|
37
|
+
(load #p"#{File.expand_path("clucumber/clucumber-bootstrap.lisp", File.dirname(__FILE__))}")
|
24
38
|
LISP
|
25
39
|
end
|
26
40
|
|
27
|
-
def
|
41
|
+
def listen(additional_forms="")
|
28
42
|
@in.puts <<-LISP
|
29
43
|
#{additional_forms}
|
30
44
|
(asdf:oos 'asdf:load-op :clucumber)
|
@@ -68,4 +82,12 @@ class ClucumberSubprocess
|
|
68
82
|
(Process.kill("CONT", @pid) && true) rescue false
|
69
83
|
end
|
70
84
|
end
|
85
|
+
|
86
|
+
def vendor_path
|
87
|
+
File.expand_path("../clucumber/vendor/", __FILE__)
|
88
|
+
end
|
89
|
+
|
90
|
+
def vendor_libs
|
91
|
+
Dir[vendor_path + '/*'].map {|dir| File.basename(dir)}
|
92
|
+
end
|
71
93
|
end
|