bknr-cvs
Threads by month
- ----- 2025 -----
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- 1964 discussions
Author: hhubner
Date: 2006-12-03 05:47:39 -0500 (Sun, 03 Dec 2006)
New Revision: 2098
Modified:
trunk/projects/bos/m2/bitmap.lisp
trunk/projects/bos/m2/m2.lisp
trunk/projects/bos/m2/packages.lisp
trunk/projects/bos/worldpay-test/boi-handlers.lisp
trunk/projects/bos/worldpay-test/map-handlers.lisp
trunk/projects/bos/worldpay-test/packages.lisp
trunk/projects/bos/worldpay-test/reports-xml-handler.lisp
trunk/projects/bos/worldpay-test/tags.lisp
Log:
SBCL compatibility changes.
Modified: trunk/projects/bos/m2/bitmap.lisp
===================================================================
--- trunk/projects/bos/m2/bitmap.lisp 2006-12-03 10:46:55 UTC (rev 2097)
+++ trunk/projects/bos/m2/bitmap.lisp 2006-12-03 10:47:39 UTC (rev 2098)
@@ -150,7 +150,7 @@
:first-name "Otto"
:last-name "Mustermann"
:email-address "otto.mustermann(a)t-online.de"))))
- (flet ((step ()
+ (flet ((make-one-contract ()
(let* ((limit 0.0001)
(n (max 1 (round (/ 0.5 (+ (random (- 1.0 limit)) limit))))))
@@ -159,9 +159,9 @@
(make-contract u n))))
(if limit
(dotimes (x limit)
- (step))
+ (make-one-contract))
(loop
- (step)))))))
+ (make-one-contract)))))))
#+(or)
(progn
Modified: trunk/projects/bos/m2/m2.lisp
===================================================================
--- trunk/projects/bos/m2/m2.lisp 2006-12-03 10:46:55 UTC (rev 2097)
+++ trunk/projects/bos/m2/m2.lisp 2006-12-03 10:47:39 UTC (rev 2098)
@@ -388,7 +388,9 @@
(excl:delete-directory-and-files pathname)
#+cmu
(unix:unix-rmdir (ext:unix-namestring pathname))
- #-(or allegro cmu)
+ #+sbcl
+ (sb-posix:rmdir (namestring pathname))
+ #-(or allegro cmu sbcl)
...))
(defun reinit (&key delete directory website-url)
Modified: trunk/projects/bos/m2/packages.lisp
===================================================================
--- trunk/projects/bos/m2/packages.lisp 2006-12-03 10:46:55 UTC (rev 2097)
+++ trunk/projects/bos/m2/packages.lisp 2006-12-03 10:47:39 UTC (rev 2098)
@@ -189,6 +189,13 @@
#:*cert-download-directory*))
(defpackage :bos.m2.cert-generator
- (:use :cl :extensions :bos.m2.config :bknr.utils :cl-ppcre :cl-interpol :cl-gd)
+ (:use :cl
+ #+cmu :extensions
+ #+sbcl :sb-ext
+ :bos.m2.config
+ :bknr.utils
+ :cl-ppcre
+ :cl-interpol
+ :cl-gd)
(:shadowing-import-from :cl-interpol #:quote-meta-chars)
(:export #:cert-daemon))
Modified: trunk/projects/bos/worldpay-test/boi-handlers.lisp
===================================================================
--- trunk/projects/bos/worldpay-test/boi-handlers.lisp 2006-12-03 10:46:55 UTC (rev 2097)
+++ trunk/projects/bos/worldpay-test/boi-handlers.lisp 2006-12-03 10:47:39 UTC (rev 2098)
@@ -3,6 +3,8 @@
(enable-interpol-syntax)
+(defvar *xml-sink*)
+
(defmacro with-xml-response (req &body body)
`(with-http-response (,req *ent* :content-type "text/xml")
(with-query-params (,req download)
@@ -16,6 +18,7 @@
,@body))))))
(defmacro with-xml-error-handler (req &body body)
+ (declare (ignore req))
`(handler-case
(progn ,@body)
(error (e)
Modified: trunk/projects/bos/worldpay-test/map-handlers.lisp
===================================================================
--- trunk/projects/bos/worldpay-test/map-handlers.lisp 2006-12-03 10:46:55 UTC (rev 2097)
+++ trunk/projects/bos/worldpay-test/map-handlers.lisp 2006-12-03 10:47:39 UTC (rev 2098)
@@ -54,6 +54,7 @@
(defmethod object-handler-get-object ((handler image-tile-handler) req)
(destructuring-bind (x y &rest operations) (decoded-handler-path handler req)
+ (declare (ignore operations))
(setf x (parse-integer x))
(setf y (parse-integer y))
(ensure-map-tile x y)))
Modified: trunk/projects/bos/worldpay-test/packages.lisp
===================================================================
--- trunk/projects/bos/worldpay-test/packages.lisp 2006-12-03 10:46:55 UTC (rev 2097)
+++ trunk/projects/bos/worldpay-test/packages.lisp 2006-12-03 10:47:39 UTC (rev 2098)
@@ -3,7 +3,8 @@
(defpackage :worldpay-test
(:use :cl
:date-calc
- :extensions
+ #+cmu :extensions
+ #+sbcl :sb-ext
:cl-user
:cl-interpol
:cl-ppcre
@@ -14,7 +15,6 @@
:puri
#+(or) :mime
:acl-compat.socket
- :acl-compat.mp
:bknr.web
:bknr.datastore
:bknr.indices
Modified: trunk/projects/bos/worldpay-test/reports-xml-handler.lisp
===================================================================
--- trunk/projects/bos/worldpay-test/reports-xml-handler.lisp 2006-12-03 10:46:55 UTC (rev 2097)
+++ trunk/projects/bos/worldpay-test/reports-xml-handler.lisp 2006-12-03 10:47:39 UTC (rev 2098)
@@ -16,6 +16,7 @@
(defun contract-year (contract)
(multiple-value-bind (second minute hour date month year day-of-week is-dst tz) (decode-universal-time (contract-date contract))
+ (declare (ignore second minute hour date month day-of-week is-dst tz))
year))
(defmethod handle ((handler reports-xml-handler) req)
@@ -48,6 +49,7 @@
(defun week-of-contract (contract)
"Return Week key (YYYY-WW) for given contract."
(multiple-value-bind (second minute hour date month year day-of-week is-dst tz) (decode-universal-time (contract-date contract))
+ (declare (ignore second minute hour day-of-week is-dst tz))
(multiple-value-bind (week-no week-year)
(week-of-year year month date)
(when (and (> week-no 50)
@@ -61,6 +63,7 @@
(defun week-first-yday (contract)
"Return the day-of year of the first day of the contract's date"
(multiple-value-bind (second minute hour date month year day-of-week is-dst tz) (decode-universal-time (contract-date contract))
+ (declare (ignore second minute hour day-of-week is-dst tz))
(max 0 (- (day-of-year year month date) (day-of-week year month date)))))
(defreport contracts-by-week ()
Modified: trunk/projects/bos/worldpay-test/tags.lisp
===================================================================
--- trunk/projects/bos/worldpay-test/tags.lisp 2006-12-03 10:46:55 UTC (rev 2097)
+++ trunk/projects/bos/worldpay-test/tags.lisp 2006-12-03 10:47:39 UTC (rev 2098)
@@ -6,7 +6,7 @@
;; das ist fuer WPDISPLAY
(let ((s (cxml::chained-handler *html-sink*)))
(cxml::maybe-close-tag s)
- (map nil (lambda (c) (cxml::write-rune (char-code c) s)) str)))
+ (map nil (lambda (c) (cxml::write-rune #+sbcl c #+cmu (char-code c) s)) str)))
(defun language-options-1 (current-language)
(loop for (language-symbol language-name) in (website-languages)
1
0
Author: hhubner
Date: 2006-12-03 05:46:55 -0500 (Sun, 03 Dec 2006)
New Revision: 2097
Modified:
trunk/bknr/src/data/txn.lisp
trunk/bknr/src/utils/acl-mp-compat.lisp
trunk/bknr/src/utils/utils.lisp
trunk/bknr/src/web/authorizer.lisp
trunk/bknr/src/web/handlers.lisp
trunk/bknr/src/web/sessions.lisp
trunk/bknr/src/web/web-utils.lisp
Log:
Changes to make file uploads from forms work again.
Small SBCL compatibility changes.
Further change to properly generate UTF-8 on cmucl. This is really
becoming too sick to be bearable.
Modified: trunk/bknr/src/data/txn.lisp
===================================================================
--- trunk/bknr/src/data/txn.lisp 2006-12-03 08:33:51 UTC (rev 2096)
+++ trunk/bknr/src/data/txn.lisp 2006-12-03 10:46:55 UTC (rev 2097)
@@ -42,13 +42,13 @@
(defclass mp-store (store)
()
(:default-initargs :guard (let ((lock (make-process-lock)))
- #'(lambda (thunk)
- (with-process-lock (lock)
- (funcall thunk))))
+ (lambda (thunk)
+ (mp-with-lock-held (lock)
+ (funcall thunk))))
:log-guard (let ((lock (make-process-lock)))
- #'(lambda (thunk)
- (with-process-lock (lock)
- (funcall thunk)))))
+ (lambda (thunk)
+ (mp-with-lock-held (lock)
+ (funcall thunk)))))
(:documentation
"Store in which every transaction and operation is protected by a giant lock."))
Modified: trunk/bknr/src/utils/acl-mp-compat.lisp
===================================================================
--- trunk/bknr/src/utils/acl-mp-compat.lisp 2006-12-03 08:33:51 UTC (rev 2096)
+++ trunk/bknr/src/utils/acl-mp-compat.lisp 2006-12-03 10:46:55 UTC (rev 2097)
@@ -1,6 +1,6 @@
(in-package :bknr.utils)
-(defun mp-make-lock (name)
+(defun mp-make-lock (&optional (name "Anonymous"))
#+allegro
(mp:make-process-lock :name name)
#+sbcl
Modified: trunk/bknr/src/utils/utils.lisp
===================================================================
--- trunk/bknr/src/utils/utils.lisp 2006-12-03 08:33:51 UTC (rev 2096)
+++ trunk/bknr/src/utils/utils.lisp 2006-12-03 10:46:55 UTC (rev 2097)
@@ -364,7 +364,7 @@
(defun md5-string (input-string)
(apply #'concatenate 'string (mapcar #'(lambda (c)
(format nil "~2,'0X" c))
- (coerce (md5sum-sequence input-string) 'list))))
+ (coerce (#+cmu md5sum-sequence #+sbcl md5sum-string input-string) 'list))))
#+(or)
(defun md5-string (string)
Modified: trunk/bknr/src/web/authorizer.lisp
===================================================================
--- trunk/bknr/src/web/authorizer.lisp 2006-12-03 08:33:51 UTC (rev 2096)
+++ trunk/bknr/src/web/authorizer.lisp 2006-12-03 10:46:55 UTC (rev 2097)
@@ -71,7 +71,6 @@
(defmethod authorize ((authorizer bknr-authorizer)
(req http-request)
ent)
-
;; Catch any errors that occur during request body processing
(handler-case
;; first check session cookie or bknr-sessionid parameter. the
Modified: trunk/bknr/src/web/handlers.lisp
===================================================================
--- trunk/bknr/src/web/handlers.lisp 2006-12-03 08:33:51 UTC (rev 2096)
+++ trunk/bknr/src/web/handlers.lisp 2006-12-03 10:46:55 UTC (rev 2097)
@@ -465,8 +465,8 @@
(defgeneric object-list-handler-show-object-xml (handler object req))
(defmethod object-list-handler-show-object-xml ((handler xml-object-list-handler) object req)
- (write-to-xml object
- :string-rod-fn #'cxml::utf8-string-to-rod))
+ (set-string-rod-fn #'cxml::utf8-string-to-rod)
+ (write-to-xml object))
(defmethod handle-object ((handler xml-object-list-handler) object req)
(let ((element-name (xml-object-list-handler-toplevel-element-name handler)))
Modified: trunk/bknr/src/web/sessions.lisp
===================================================================
--- trunk/bknr/src/web/sessions.lisp 2006-12-03 08:33:51 UTC (rev 2096)
+++ trunk/bknr/src/web/sessions.lisp 2006-12-03 10:46:55 UTC (rev 2097)
@@ -166,6 +166,13 @@
(defmethod update-instance-for-different-class :before ((old http-request)
(new bknr-request) &key session)
+ ;; Clear parsed parameters in request. During
+ ;; authorization, parameters are not completely parsed in
+ ;; order to save time. In particular, uploaded files are
+ ;; only parsed after authorization. This is accomplished by
+ ;; clearing the cache for the parsed parameters here.
+ (setf (getf (request-reply-plist old) 'bknr-parsed-parameters) nil)
+ (setf (getf (request-reply-plist old) 'bknr-parsed-body-parameters) nil)
(setf (slot-value new 'session) session))
(defmethod bknr-request-user ((req bknr-request))
Modified: trunk/bknr/src/web/web-utils.lisp
===================================================================
--- trunk/bknr/src/web/web-utils.lisp 2006-12-03 08:33:51 UTC (rev 2096)
+++ trunk/bknr/src/web/web-utils.lisp 2006-12-03 10:46:55 UTC (rev 2097)
@@ -117,8 +117,9 @@
"utf-8")))
(get-parameters-from-body request)
(setf (getf (request-reply-plist request) 'bknr-parsed-parameters)
- (mapcar (lambda (param) (cons (car param)
- (iconv:iconv request-charset "utf-8" (cdr param))))
+ (mapcar (lambda (param)
+ (cons (car param)
+ (iconv:iconv request-charset "utf-8" (cdr param))))
(remove "" (append (form-urlencoded-to-query (uri-query (request-uri request)))
(getf (request-reply-plist request) 'bknr-parsed-body-parameters))
:key #'cdr :test #'string-equal)))))
1
0

[bknr-cvs] r2096 - in branches/grin-neu/thirdparty: cl-gd portableaserve/acl-compat uffi/src
by bknr@bknr.net 03 Dec '06
by bknr@bknr.net 03 Dec '06
03 Dec '06
Author: hhubner
Date: 2006-12-03 03:33:51 -0500 (Sun, 03 Dec 2006)
New Revision: 2096
Modified:
branches/grin-neu/thirdparty/cl-gd/packages.lisp
branches/grin-neu/thirdparty/portableaserve/acl-compat/acl-excl-common.lisp
branches/grin-neu/thirdparty/uffi/src/aggregates.lisp
branches/grin-neu/thirdparty/uffi/src/strings.lisp
Log:
Further SBCL tweaks
Modified: branches/grin-neu/thirdparty/cl-gd/packages.lisp
===================================================================
--- branches/grin-neu/thirdparty/cl-gd/packages.lisp 2006-12-03 08:14:14 UTC (rev 2095)
+++ branches/grin-neu/thirdparty/cl-gd/packages.lisp 2006-12-03 08:33:51 UTC (rev 2096)
@@ -1,7 +1,9 @@
(in-package #:cl-user)
(defpackage #:cl-gd
- (:use #:cl #:uffi)
+ (:use #:cl
+ #-(or :clisp :openmcl) #:uffi
+ #+(or :clisp :openmcl) #:cffi-uffi-compat)
(:export #:*default-image*
#:*default-color*
#:*default-font*
Modified: branches/grin-neu/thirdparty/portableaserve/acl-compat/acl-excl-common.lisp
===================================================================
--- branches/grin-neu/thirdparty/portableaserve/acl-compat/acl-excl-common.lisp 2006-12-03 08:14:14 UTC (rev 2095)
+++ branches/grin-neu/thirdparty/portableaserve/acl-compat/acl-excl-common.lisp 2006-12-03 08:33:51 UTC (rev 2096)
@@ -189,6 +189,7 @@
(array (signed-byte 8) 1)))
(write-sequence sequence stream :start start :end end))
+#-sbcl
(defun string-to-octets (string &key (null-terminate t) (start 0)
end mb-vector make-mb-vector?
(external-format :default))
Modified: branches/grin-neu/thirdparty/uffi/src/aggregates.lisp
===================================================================
--- branches/grin-neu/thirdparty/uffi/src/aggregates.lisp 2006-12-03 08:14:14 UTC (rev 2095)
+++ branches/grin-neu/thirdparty/uffi/src/aggregates.lisp 2006-12-03 08:33:51 UTC (rev 2096)
@@ -224,28 +224,13 @@
(setf (aref a i) (uffi:deref-array s '(:array :unsigned-byte) i)))))
#+sbcl
-(eval-when (:compile-toplevel :load-toplevel :execute)
- (sb-ext:without-package-locks
- (defvar *system-copy-fn* (if (fboundp (intern "COPY-FROM-SYSTEM-AREA" "SB-KERNEL"))
- (intern "COPY-FROM-SYSTEM-AREA" "SB-KERNEL")
- (intern "COPY-UB8-FROM-SYSTEM-AREA" "SB-KERNEL")))
- (defconstant +system-copy-offset+ (if (fboundp (intern "COPY-FROM-SYSTEM-AREA" "SB-KERNEL"))
- (* sb-vm:vector-data-offset sb-vm:n-word-bits)
- 0))
- (defconstant +system-copy-multiplier+ (if (fboundp (intern "COPY-FROM-SYSTEM-AREA" "SB-KERNEL"))
- sb-vm:n-byte-bits
- 1))))
-
-
-#+sbcl
(defun convert-from-foreign-usb8 (s len)
(let ((sap (sb-alien:alien-sap s)))
(declare (type sb-sys:system-area-pointer sap))
(locally
(declare (optimize (speed 3) (safety 0)))
(let ((result (make-array len :element-type '(unsigned-byte 8))))
- (funcall *system-copy-fn* sap 0 result +system-copy-offset+
- (* len +system-copy-multiplier+))
+ (sb-kernel:copy-ub8-from-system-area sap 0 result 0 len)
result))))
#+cmu
Modified: branches/grin-neu/thirdparty/uffi/src/strings.lisp
===================================================================
--- branches/grin-neu/thirdparty/uffi/src/strings.lisp 2006-12-03 08:14:14 UTC (rev 2095)
+++ branches/grin-neu/thirdparty/uffi/src/strings.lisp 2006-12-03 08:33:51 UTC (rev 2096)
@@ -207,6 +207,8 @@
:null-terminated-p ,null-terminated-p))))
#+sbcl
+ (declare (ignore locale))
+ #+sbcl
(let ((stored-obj (gensym)))
`(let ((,stored-obj ,obj))
(if (null-pointer-p ,stored-obj)
1
0
Author: hhubner
Date: 2006-12-03 03:14:14 -0500 (Sun, 03 Dec 2006)
New Revision: 2095
Removed:
branches/grin-neu/thirdparty/ironclad/
Log:
no longer in use
1
0
Author: hhubner
Date: 2006-12-01 05:39:49 -0500 (Fri, 01 Dec 2006)
New Revision: 2094
Added:
branches/grin-neu/thirdparty/cxml/COPYING
branches/grin-neu/thirdparty/cxml/DOMTEST
branches/grin-neu/thirdparty/cxml/GNUmakefile
branches/grin-neu/thirdparty/cxml/OLDNEWS
branches/grin-neu/thirdparty/cxml/XMLCONF
branches/grin-neu/thirdparty/cxml/XMLS-SYMBOLS.diff
branches/grin-neu/thirdparty/cxml/contrib/
branches/grin-neu/thirdparty/cxml/contrib/xhtmlgen.lisp
branches/grin-neu/thirdparty/cxml/doc/
branches/grin-neu/thirdparty/cxml/doc/bg.png
branches/grin-neu/thirdparty/cxml/doc/cxml.css
branches/grin-neu/thirdparty/cxml/doc/dom.html
branches/grin-neu/thirdparty/cxml/doc/installation.html
branches/grin-neu/thirdparty/cxml/doc/quickstart.html
branches/grin-neu/thirdparty/cxml/doc/using.html
branches/grin-neu/thirdparty/cxml/doc/xmls-compat.html
branches/grin-neu/thirdparty/cxml/glisp/
branches/grin-neu/thirdparty/cxml/runes/definline.lisp
branches/grin-neu/thirdparty/cxml/runes/definline.x86f
branches/grin-neu/thirdparty/cxml/runes/utf8.lisp
branches/grin-neu/thirdparty/cxml/runes/ystream.lisp
branches/grin-neu/thirdparty/cxml/test/utf8domtest.diff
branches/grin-neu/thirdparty/cxml/xml/sax-proxy.lisp
branches/grin-neu/thirdparty/cxml/xml/space-normalizer.lisp
branches/grin-neu/thirdparty/cxml/xml/util.lisp
branches/grin-neu/thirdparty/cxml/xml/xmlns-normalizer.lisp
branches/grin-neu/thirdparty/net-telent-date/
branches/grin-neu/thirdparty/net-telent-date/CVS/
branches/grin-neu/thirdparty/net-telent-date/INSTALL.asdf
branches/grin-neu/thirdparty/net-telent-date/README
branches/grin-neu/thirdparty/net-telent-date/date.lisp
branches/grin-neu/thirdparty/net-telent-date/defpackage.lisp
branches/grin-neu/thirdparty/net-telent-date/maintainer-Makefile
branches/grin-neu/thirdparty/net-telent-date/make-makefile.lisp
branches/grin-neu/thirdparty/net-telent-date/net-telent-date.asd
branches/grin-neu/thirdparty/net-telent-date/net-telent-date.system
branches/grin-neu/thirdparty/net-telent-date/parse-time.lisp
branches/grin-neu/thirdparty/net-telent-date/tests.lisp
branches/grin-neu/thirdparty/puri/
branches/grin-neu/thirdparty/puri/LICENSE
branches/grin-neu/thirdparty/puri/README
branches/grin-neu/thirdparty/puri/puri.asd
branches/grin-neu/thirdparty/puri/src.lisp
branches/grin-neu/thirdparty/puri/tests.lisp
branches/grin-neu/thirdparty/puri/uri.html
branches/grin-neu/thirdparty/trivial-gray-streams/
branches/grin-neu/thirdparty/trivial-gray-streams/COPYING
branches/grin-neu/thirdparty/trivial-gray-streams/CVS/
branches/grin-neu/thirdparty/trivial-gray-streams/CVS/Entries
branches/grin-neu/thirdparty/trivial-gray-streams/CVS/Repository
branches/grin-neu/thirdparty/trivial-gray-streams/CVS/Root
branches/grin-neu/thirdparty/trivial-gray-streams/CVS/Template
branches/grin-neu/thirdparty/trivial-gray-streams/Makefile
branches/grin-neu/thirdparty/trivial-gray-streams/README
branches/grin-neu/thirdparty/trivial-gray-streams/mixin.lisp
branches/grin-neu/thirdparty/trivial-gray-streams/package.lisp
branches/grin-neu/thirdparty/trivial-gray-streams/trivial-gray-streams.asd
Removed:
branches/grin-neu/thirdparty/cl-ppcre/testdata
branches/grin-neu/thirdparty/cl-ppcre/testinput
Modified:
branches/grin-neu/bknr/src/bknr-utils.asd
branches/grin-neu/bknr/src/bknr.asd
branches/grin-neu/bknr/src/packages.lisp
branches/grin-neu/bknr/src/utils/package.lisp
branches/grin-neu/bknr/src/web/handlers.lisp
branches/grin-neu/bknr/src/web/templates.lisp
branches/grin-neu/bknr/src/xml-impex/package.lisp
branches/grin-neu/bknr/src/xml-impex/xml-export.lisp
branches/grin-neu/bknr/src/xml-impex/xml-import.lisp
branches/grin-neu/projects/bos/payment-website/templates/da/bestellung.xml
branches/grin-neu/projects/bos/worldpay-test/tags.lisp
branches/grin-neu/projects/mah-jongg/src/game.lisp
branches/grin-neu/projects/mah-jongg/website/game.xsl
branches/grin-neu/site/svn-config
branches/grin-neu/thirdparty/cl-ppcre/CHANGELOG
branches/grin-neu/thirdparty/cl-ppcre/api.lisp
branches/grin-neu/thirdparty/cl-ppcre/cl-ppcre-test.asd
branches/grin-neu/thirdparty/cl-ppcre/cl-ppcre-test.system
branches/grin-neu/thirdparty/cl-ppcre/cl-ppcre.asd
branches/grin-neu/thirdparty/cl-ppcre/cl-ppcre.system
branches/grin-neu/thirdparty/cl-ppcre/closures.lisp
branches/grin-neu/thirdparty/cl-ppcre/convert.lisp
branches/grin-neu/thirdparty/cl-ppcre/doc/index.html
branches/grin-neu/thirdparty/cl-ppcre/errors.lisp
branches/grin-neu/thirdparty/cl-ppcre/lexer.lisp
branches/grin-neu/thirdparty/cl-ppcre/lispworks-defsystem.lisp
branches/grin-neu/thirdparty/cl-ppcre/load.lisp
branches/grin-neu/thirdparty/cl-ppcre/optimize.lisp
branches/grin-neu/thirdparty/cl-ppcre/packages.lisp
branches/grin-neu/thirdparty/cl-ppcre/parser.lisp
branches/grin-neu/thirdparty/cl-ppcre/ppcre-tests.lisp
branches/grin-neu/thirdparty/cl-ppcre/regex-class.lisp
branches/grin-neu/thirdparty/cl-ppcre/repetition-closures.lisp
branches/grin-neu/thirdparty/cl-ppcre/scanner.lisp
branches/grin-neu/thirdparty/cl-ppcre/specials.lisp
branches/grin-neu/thirdparty/cl-ppcre/util.lisp
branches/grin-neu/thirdparty/cxml/README.html
branches/grin-neu/thirdparty/cxml/catalog.dtd
branches/grin-neu/thirdparty/cxml/cxml.asd
branches/grin-neu/thirdparty/cxml/dom/dom-builder.lisp
branches/grin-neu/thirdparty/cxml/dom/dom-impl.lisp
branches/grin-neu/thirdparty/cxml/dom/dom-sax.lisp
branches/grin-neu/thirdparty/cxml/dom/package.lisp
branches/grin-neu/thirdparty/cxml/mlisp-patch.diff
branches/grin-neu/thirdparty/cxml/runes/characters.lisp
branches/grin-neu/thirdparty/cxml/runes/encodings-data.lisp
branches/grin-neu/thirdparty/cxml/runes/encodings.lisp
branches/grin-neu/thirdparty/cxml/runes/package.lisp
branches/grin-neu/thirdparty/cxml/runes/runes.lisp
branches/grin-neu/thirdparty/cxml/runes/syntax.lisp
branches/grin-neu/thirdparty/cxml/runes/xstream.lisp
branches/grin-neu/thirdparty/cxml/test/domtest.lisp
branches/grin-neu/thirdparty/cxml/test/xmlconf.lisp
branches/grin-neu/thirdparty/cxml/xml/catalog.lisp
branches/grin-neu/thirdparty/cxml/xml/package.lisp
branches/grin-neu/thirdparty/cxml/xml/recoder.lisp
branches/grin-neu/thirdparty/cxml/xml/sax-handler.lisp
branches/grin-neu/thirdparty/cxml/xml/sax-tests/tests.lisp
branches/grin-neu/thirdparty/cxml/xml/unparse.lisp
branches/grin-neu/thirdparty/cxml/xml/xml-name-rune-p.lisp
branches/grin-neu/thirdparty/cxml/xml/xml-parse.lisp
branches/grin-neu/thirdparty/cxml/xml/xmls-compat.lisp
branches/grin-neu/thirdparty/emacs/slime/swank-loader.x86f
branches/grin-neu/thirdparty/kmrcl-1.72/byte-stream.lisp
branches/grin-neu/thirdparty/kmrcl-1.72/kmrcl.asd
branches/grin-neu/thirdparty/net.post-office/net.post-office.asd
branches/grin-neu/thirdparty/net.post-office/packages.lisp
branches/grin-neu/thirdparty/portableaserve/acl-compat/sbcl/acl-excl.lisp
branches/grin-neu/thirdparty/portableaserve/acl-compat/sbcl/acl-mp.lisp
branches/grin-neu/thirdparty/portableaserve/acl-compat/sbcl/acl-socket.lisp
branches/grin-neu/thirdparty/portableaserve/aserve/main.cl
branches/grin-neu/thirdparty/uffi/src/corman/getenv-ccl.lisp
branches/grin-neu/thirdparty/uffi/tests/package.lisp
branches/grin-neu/tools/make-core.lisp
Log:
SBCL-1.0 compatibility changes and package updates.
Modified: branches/grin-neu/bknr/src/bknr-utils.asd
===================================================================
--- branches/grin-neu/bknr/src/bknr-utils.asd 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/bknr/src/bknr-utils.asd 2006-12-01 10:39:49 UTC (rev 2094)
@@ -18,7 +18,8 @@
:depends-on (:cl-interpol :cl-ppcre
:cxml
- :md5
+ #-sbcl :md5
+ #+sbcl :sb-md5
#+(not allegro)
:acl-compat
:iconv)
Modified: branches/grin-neu/bknr/src/bknr.asd
===================================================================
--- branches/grin-neu/bknr/src/bknr.asd 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/bknr/src/bknr.asd 2006-12-01 10:39:49 UTC (rev 2094)
@@ -24,7 +24,8 @@
:cl-gd
:aserve
;:net.post-office
- :md5
+ #-sbcl :md5
+ #+sbcl :sb-md5
:cxml
:unit-test
:bknr-utils
Modified: branches/grin-neu/bknr/src/packages.lisp
===================================================================
--- branches/grin-neu/bknr/src/packages.lisp 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/bknr/src/packages.lisp 2006-12-01 10:39:49 UTC (rev 2094)
@@ -113,7 +113,8 @@
:cl-user
:cl-interpol
:cl-ppcre
- :md5
+ #+cmu :md5
+ #+sbcl :sb-md5
:bknr.datastore
:bknr.indices
:bknr.utils
@@ -183,7 +184,8 @@
:cxml-xmls
:xhtml-generator
:puri
- :md5
+ #+cmu :md5
+ #+sbcl :sb-md5
:js
:bknr.datastore
:bknr.indices
Modified: branches/grin-neu/bknr/src/utils/package.lisp
===================================================================
--- branches/grin-neu/bknr/src/utils/package.lisp 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/bknr/src/utils/package.lisp 2006-12-01 10:39:49 UTC (rev 2094)
@@ -5,7 +5,8 @@
:cl-ppcre
:cl-interpol
:cxml-xmls
- :md5
+ #+cmu :md5
+ #+sbcl :sb-md5
#+cmu :extensions
; #+sbcl :sb-ext
#+(not allegro) :acl-compat.mp
Modified: branches/grin-neu/bknr/src/web/handlers.lisp
===================================================================
--- branches/grin-neu/bknr/src/web/handlers.lisp 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/bknr/src/web/handlers.lisp 2006-12-01 10:39:49 UTC (rev 2094)
@@ -449,8 +449,7 @@
(defgeneric xml-object-handler-show-object (handler object req))
(defmethod xml-object-handler-show-object ((handler xml-object-handler) object req)
- (write-to-xml object
- :string-rod-fn #'cxml::utf8-string-to-rod))
+ (write-to-xml object))
(defmethod handle-object ((handler xml-object-handler) object req)
(xml-object-handler-show-object handler object req))
Modified: branches/grin-neu/bknr/src/web/templates.lisp
===================================================================
--- branches/grin-neu/bknr/src/web/templates.lisp 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/bknr/src/web/templates.lisp 2006-12-01 10:39:49 UTC (rev 2094)
@@ -11,6 +11,7 @@
;; FreeBSD
"/usr/local/share/xml/catalog.ports"))
+#-sbcl
(eval-when (:load-toplevel :execute)
(let ((env-catalog (assoc :xmlcatalog ext:*environment-list*)))
(when env-catalog
Modified: branches/grin-neu/bknr/src/xml-impex/package.lisp
===================================================================
--- branches/grin-neu/bknr/src/xml-impex/package.lisp 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/bknr/src/xml-impex/package.lisp 2006-12-01 10:39:49 UTC (rev 2094)
@@ -24,5 +24,7 @@
#:with-xml-export*
#:write-to-xml
+ #:set-string-rod-fn
+
#:create-instance
#:set-slot-value))
Modified: branches/grin-neu/bknr/src/xml-impex/xml-export.lisp
===================================================================
--- branches/grin-neu/bknr/src/xml-impex/xml-export.lisp 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/bknr/src/xml-impex/xml-export.lisp 2006-12-01 10:39:49 UTC (rev 2094)
@@ -1,5 +1,10 @@
(in-package :bknr.impex)
+(defvar *string-rod-fn* #'cxml::string-rod)
+
+(defun set-string-rod-fn (function)
+ (setf *string-rod-fn* function))
+
(defmethod slot-serialize-value ((slot xml-effective-slot-definition) value)
(with-slots (serializer object-to-id) slot
(when object-to-id
@@ -12,7 +17,7 @@
(defmacro with-xml-export* ((&key output indentation canonical) &body body)
`(let ((*objects-written* (make-hash-table :test #'equal))
(cxml::*sink* (cxml:make-character-stream-sink ,output
- :indentation ,indentation :canonical ,canonical)))
+ :indentation ,indentation :canonical ,canonical)))
,@body))
(defmacro with-xml-export (nil &body body)
@@ -26,23 +31,23 @@
(declare (ignore name)))
(defmethod write-to-xml ((object list) &key (name (error "Can not serialize list to XML without an element name~%")) no-recurse)
- (sax:start-element cxml::*sink* nil nil (cxml::string-rod name) nil)
+ (sax:start-element cxml::*sink* nil nil (funcall *string-rod-fn* name) nil)
(dolist (obj object)
(write-to-xml obj))
- (sax:end-element cxml::*sink* nil nil (cxml::string-rod name)))
+ (sax:end-element cxml::*sink* nil nil (funcall *string-rod-fn* name)))
(defmethod write-to-xml ((object string) &key (name (error "Can not serialize string ~A to XML without an element name." object)) no-recurse)
- (sax:start-element cxml::*sink* nil nil (cxml::string-rod name) nil)
- (sax:characters cxml::*sink* (cxml::string-rod object))
- (sax:end-element cxml::*sink* nil nil (cxml::string-rod name)))
+ (sax:start-element cxml::*sink* nil nil (funcall *string-rod-fn* name) nil)
+ (sax:characters cxml::*sink* (funcall *string-rod-fn* object))
+ (sax:end-element cxml::*sink* nil nil (funcall *string-rod-fn* name)))
(defun write-object-reference (class object unique-id-slot-name name)
(let ((slotdef (find unique-id-slot-name (class-slots class) :key #'slot-definition-name)))
(unless (xml-effective-slot-definition-attribute slotdef)
(error "Slot ~A is not defined as :attribute slot and cannot be used as unique-id slot for class ~A" unique-id-slot-name (class-name class)))
(sax:start-element cxml::*sink* nil nil name
- (list (sax:make-attribute :qname (cxml::string-rod (xml-effective-slot-definition-attribute slotdef))
- :value (cxml::string-rod (slot-serialize-value slotdef (slot-value object unique-id-slot-name))))))
+ (list (sax:make-attribute :qname (funcall *string-rod-fn* (xml-effective-slot-definition-attribute slotdef))
+ :value (funcall *string-rod-fn* (slot-serialize-value slotdef (slot-value object unique-id-slot-name))))))
(sax:end-element cxml::*sink* nil nil name)))
(defmethod write-to-xml ((object t) &key name no-recurse)
@@ -50,7 +55,7 @@
(cond
((typep class 'xml-class)
(xml-object-check-validity object)
- (let ((qname (cxml::string-rod (or name (xml-class-element class)))))
+ (let ((qname (funcall *string-rod-fn* (or name (xml-class-element class)))))
;; If this object has been serialized to the XML stream,
;; write a reference to the object and return.
@@ -72,13 +77,13 @@
;; attributes
(attributes (loop for slot in attr-slots
for name = (slot-definition-name slot)
- for attdef = (cxml::string-rod (xml-effective-slot-definition-attribute slot))
+ for attdef = (funcall *string-rod-fn* (xml-effective-slot-definition-attribute slot))
when (and (slot-boundp object name)
(slot-value object name))
collect (sax:make-attribute
:qname attdef
:value
- (cxml::string-rod
+ (funcall *string-rod-fn*
(slot-serialize-value slot (slot-value object name)))))))
(sax:start-element cxml::*sink* nil nil qname attributes)
@@ -104,9 +109,9 @@
(when (slot-boundp object name)
(sax:characters
cxml::*sink*
- (cxml::string-rod
+ (funcall *string-rod-fn*
(funcall (xml-effective-slot-definition-serializer body-slot)
(slot-value object name)))))))
(sax:end-element cxml::*sink* nil nil qname))))
- (t nil)))))
+ (t nil))))
Modified: branches/grin-neu/bknr/src/xml-impex/xml-import.lisp
===================================================================
--- branches/grin-neu/bknr/src/xml-impex/xml-import.lisp 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/bknr/src/xml-impex/xml-import.lisp 2006-12-01 10:39:49 UTC (rev 2094)
@@ -185,3 +185,14 @@
:class-hash class-hash)))
(cxml:parse-file xml-file (cxml:make-recoder importer recoder))
(importer-root-elt importer))))
+
+(defun parse-xml-string (string classes &key (recoder #'cxml::rod-string)
+ (importer-class 'xml-class-importer))
+ (with-input-from-string (stream string)
+ (let ((class-hash (make-hash-table :test #'equal)))
+ (dolist (class classes)
+ (setf (gethash (xml-class-element class) class-hash) class))
+ (let ((importer (make-instance importer-class
+ :class-hash class-hash)))
+ (cxml:parse-stream stream (cxml:make-recoder importer recoder))
+ (importer-root-elt importer)))))
\ No newline at end of file
Modified: branches/grin-neu/projects/bos/payment-website/templates/da/bestellung.xml
===================================================================
--- branches/grin-neu/projects/bos/payment-website/templates/da/bestellung.xml 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/projects/bos/payment-website/templates/da/bestellung.xml 2006-12-01 10:39:49 UTC (rev 2094)
@@ -19,7 +19,7 @@
<td colspan="2">
<span class="link_titlered">
Plant regnskov
- <br></br>for kun 3,- Euro/24,- Kroner per m²
+ <br></br>for kun 24,- Kroner per m²
</span>
<br></br><br></br>
</td>
@@ -58,6 +58,7 @@
<div id="textbox_content_big">
<form name="bestellformular" method="post" action="buy-sqm">
<input type="hidden" name="download-only" value="1"></input>
+ <input type="hidden" name="currency" value="DKK"></input>
<table id="formTable" width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td colspan="3">
@@ -72,21 +73,21 @@
<tr>
<td colspan="3">
<input type="radio" name="numsqm" value="1" onclick="document.bestellformular.numsqm1.value = '';"></input>
- 1 m² regnskov [3 Euro/24 Kroner],
+ 1 m² regnskov [24 Kroner],
<br></br>
<input type="radio" name="numsqm" value="5" onclick="document.bestellformular.numsqm1.value = '';"></input>
- 5 m² regnskov [15 Euro/120 Kroner],
+ 5 m² regnskov [120 Kroner],
<br></br>
<input type="radio" name="numsqm" value="10" checked="checked" onclick="document.bestellformular.numsqm1.value = '';"></input>
- 10 m² regnskov [30 Euro/240 Kroner],
+ 10 m² regnskov [240 Kroner],
<br></br>
<input type="radio" name="numsqm" value="30" onclick="document.bestellformular.numsqm1.value = '';"></input>
- 30 m² regnskov [90 Euro/720 Kroner],
+ 30 m² regnskov [720 Kroner],
<br></br>
<input type="radio" name="numsqm" value=""></input>
or
<input type="text" name="numsqm1" size="5" value="" onfocus="document.bestellformular.numsqm[4].click()"></input>
- m² [3 Euro/24 Kroner stk].
+ m² [24 Kroner stk].
<br></br>
</td>
</tr>
Modified: branches/grin-neu/projects/bos/worldpay-test/tags.lisp
===================================================================
--- branches/grin-neu/projects/bos/worldpay-test/tags.lisp 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/projects/bos/worldpay-test/tags.lisp 2006-12-01 10:39:49 UTC (rev 2094)
@@ -56,8 +56,13 @@
(not (equal "" href)))
(html ((:base "href" href)))))
+(defun get-sqm-price (currency)
+ (ecase (make-keyword-from-string currency)
+ (:eur 3)
+ (:dkk 24)))
+
(define-bknr-tag buy-sqm (&key children)
- (with-template-vars (numsqm numsqm1 action gift donationcert-yearly download-only)
+ (with-template-vars (currency numsqm numsqm1 action gift donationcert-yearly download-only)
(let* ((numsqm (parse-integer (or numsqm numsqm1)))
;; Wer ueber dieses Formular bestellt, ist ein neuer Sponsor,
;; also ein neues Sponsorenobjekt anlegen. Eine Profil-ID
@@ -70,7 +75,8 @@
(manual-transfer (or (scan #?r"rweisen" action)
(scan #?r"rweisung" action)))
(sponsor (make-sponsor))
- (price (* numsqm 3))
+ (currency (or currency "EUR"))
+ (price (* numsqm (get-sqm-price currency)))
(contract (make-contract sponsor numsqm
:download-only download-only
:expires (+ (if manual-transfer
@@ -80,15 +86,17 @@
(language (session-variable :language)))
(setf (get-template-var :worldpay-url)
(if manual-transfer
- (format nil "ueberweisung?contract-id=~A&amount=~A&numsqm=~A~@[&donationcert-yearly=1~]"
+ (format nil "ueberweisung?contract-id=~A¤cy=~A&amount=~A&numsqm=~A~@[&donationcert-yearly=1~]"
(store-object-id contract)
+ currency
price
numsqm
donationcert-yearly)
- (format nil "https://select.worldpay.com/wcc/purchase?instId=~A&cartId=~A&amount=~A&curr…"
+ (format nil "https://select.worldpay.com/wcc/purchase?instId=~A&cartId=~A&amount=~A&curr…"
*worldpay-installation-id*
(store-object-id contract)
price
+ currency
language
(encode-urlencoded (format nil "~A ~A in Samboja Lestari"
numsqm
Modified: branches/grin-neu/projects/mah-jongg/src/game.lisp
===================================================================
--- branches/grin-neu/projects/mah-jongg/src/game.lisp 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/projects/mah-jongg/src/game.lisp 2006-12-01 10:39:49 UTC (rev 2094)
@@ -142,5 +142,6 @@
(make-instance 'store
:directory "../datastore/")
(publish :path "/game" :function 'handle-game)
- (publish-directory :prefix "/" :destination "../website/")
+ (publish-directory :prefix "/"
+ :destination #-sbcl "../website/" #+sbcl (namestring (merge-pathnames "../website/" *default-pathname-defaults*)))
(start :port port))
\ No newline at end of file
Modified: branches/grin-neu/projects/mah-jongg/website/game.xsl
===================================================================
--- branches/grin-neu/projects/mah-jongg/website/game.xsl 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/projects/mah-jongg/website/game.xsl 2006-12-01 10:39:49 UTC (rev 2094)
@@ -79,7 +79,7 @@
</tr>
</tbody>
</table>
- <form method="post" action="#">
+ <form method="post" action="game">
<table id="current-game">
<tbody>
<xsl:apply-templates select="player" mode="form"/>
Modified: branches/grin-neu/site/svn-config
===================================================================
--- branches/grin-neu/site/svn-config 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/site/svn-config 2006-12-01 10:39:49 UTC (rev 2094)
@@ -61,7 +61,7 @@
[miscellany]
### Set global-ignores to a set of whitespace-delimited globs
### which Subversion will ignore in its 'status' output.
-global-ignores = *.o *.lo *.la #*# .*.rej *.rej .*~ *~ .#* .DS_Store *.x86f datastore *.core datastore
+global-ignores = *.o *.lo *.la #*# .*.rej *.rej .*~ *~ .#* .DS_Store *.x86f datastore *.core datastore *.fasl
### Set log-encoding to the default encoding for log messages
log-encoding = latin1
### Set use-commit-times to make checkout/update/switch/revert
Modified: branches/grin-neu/thirdparty/cl-ppcre/CHANGELOG
===================================================================
--- branches/grin-neu/thirdparty/cl-ppcre/CHANGELOG 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/cl-ppcre/CHANGELOG 2006-12-01 10:39:49 UTC (rev 2094)
@@ -1,3 +1,30 @@
+Version 1.2.18
+2006-10-12
+Changed default element type for LispWorks
+Fixed documentation for REGEX-REPLACE-ALL
+
+Version 1.2.17
+2006-10-11
+Fixed bug in DO-SCANS which affected anchors (caught by RegexCoach user Laurent Taupiac)
+Update link for 'man perlre' (thanks to Ricardo Boccato Alves)
+
+Version 1.2.16
+2006-07-16
+Added :ELEMENT-TYPE to REGEX-REPLACE(-ALL)
+
+Version 1.2.15
+2006-07-03
+Added :REGEX tag to parse tree syntax (thanks to Fr�d�ric Jolliton)
+
+Version 1.2.14
+2006-05-24
+Added missing </code> tag in docs (thanks to Wojciech Kaczmarek)
+Fixed IMPORT statement for LW
+
+Version 1.2.13
+2005-12-06
+Fixed bug involving *REAL-START-POS* (caught by "tichy")
+
Version 1.2.12
2005-11-01
REGEX-APROPOS-AUX now also uses :INHERITED
Modified: branches/grin-neu/thirdparty/cl-ppcre/api.lisp
===================================================================
--- branches/grin-neu/thirdparty/cl-ppcre/api.lisp 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/cl-ppcre/api.lisp 2006-12-01 10:39:49 UTC (rev 2094)
@@ -1,9 +1,9 @@
;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-PPCRE; Base: 10 -*-
-;;; $Header: /usr/local/cvsrep/cl-ppcre/api.lisp,v 1.60 2005/11/01 09:51:01 edi Exp $
+;;; $Header: /usr/local/cvsrep/cl-ppcre/api.lisp,v 1.70 2006/10/12 06:24:41 edi Exp $
;;; The external API for creating and using scanners.
-;;; Copyright (c) 2002-2005, Dr. Edmund Weitz. All rights reserved.
+;;; Copyright (c) 2002-2006, Dr. Edmund Weitz. All rights reserved.
;;; Redistribution and use in source and binary forms, with or without
;;; modification, are permitted provided that the following conditions
@@ -185,6 +185,7 @@
single-line-mode
extended-mode
destructive)
+ (declare #.*standard-optimize-settings*)
(declare (ignore destructive))
(when (or case-insensitive-mode multi-line-mode single-line-mode extended-mode)
(signal-ppcre-invocation-error
@@ -197,6 +198,7 @@
single-line-mode
extended-mode
destructive)
+ (declare #.*standard-optimize-settings*)
(declare (ignore destructive))
(excl:compile-re parse-tree
:case-fold case-insensitive-mode
@@ -205,19 +207,22 @@
:single-line single-line-mode
:return :index))
-(defgeneric scan (regex target-string &key start end)
+(defgeneric scan (regex target-string &key start end real-start-pos)
(:documentation "Searches TARGET-STRING from START to END and tries
-to match REGEX. On success returns four values - the start of the
+to match REGEX. On success returns four values - the start of the
match, the end of the match, and two arrays denoting the beginnings
-and ends of register matches. On failure returns NIL. REGEX can be a
+and ends of register matches. On failure returns NIL. REGEX can be a
string which will be parsed according to Perl syntax, a parse tree, or
-a pre-compiled scanner created by CREATE-SCANNER. TARGET-STRING will
-be coerced to a simple string if it isn't one already."))
+a pre-compiled scanner created by CREATE-SCANNER. TARGET-STRING will
+be coerced to a simple string if it isn't one already. The
+REAL-START-POS parameter should be ignored - it exists only for
+internal purposes."))
#-:use-acl-regexp2-engine
(defmethod scan ((regex-string string) target-string
&key (start 0)
- (end (length target-string)))
+ (end (length target-string))
+ ((:real-start-pos *real-start-pos*) nil))
(declare #.*standard-optimize-settings*)
;; note that the scanners are optimized for simple strings so we
;; have to coerce TARGET-STRING into one if it isn't already
@@ -228,7 +233,8 @@
#-:use-acl-regexp2-engine
(defmethod scan ((scanner function) target-string
&key (start 0)
- (end (length target-string)))
+ (end (length target-string))
+ ((:real-start-pos *real-start-pos*) nil))
(declare #.*standard-optimize-settings*)
(funcall scanner
(maybe-coerce-to-simple-string target-string)
@@ -237,7 +243,8 @@
#-:use-acl-regexp2-engine
(defmethod scan ((parse-tree t) target-string
&key (start 0)
- (end (length target-string)))
+ (end (length target-string))
+ ((:real-start-pos *real-start-pos*) nil))
(declare #.*standard-optimize-settings*)
(funcall (create-scanner parse-tree)
(maybe-coerce-to-simple-string target-string)
@@ -249,7 +256,9 @@
#+:use-acl-regexp2-engine
(defmethod scan ((parse-tree t) target-string
&key (start 0)
- (end (length target-string)))
+ (end (length target-string))
+ ((:real-start-pos *real-start-pos*) nil))
+ (declare #.*standard-optimize-settings*)
(when (< end start)
(return-from scan nil))
(let ((results (multiple-value-list (excl:match-re parse-tree target-string
@@ -274,9 +283,8 @@
(define-compiler-macro scan (&whole form &environment env regex target-string &rest rest)
"Make sure that constant forms are compiled into scanners at compile time."
(cond ((constantp regex env)
- `(scan (load-time-value
- (create-scanner ,regex))
- ,target-string ,@rest))
+ `(scan (load-time-value (create-scanner ,regex))
+ ,target-string ,@rest))
(t form)))
(defun scan-to-strings (regex target-string &key (start 0)
@@ -309,8 +317,7 @@
(&whole form &environment env regex target-string &rest rest)
"Make sure that constant forms are compiled into scanners at compile time."
(cond ((constantp regex env)
- `(scan-to-strings (load-time-value
- (create-scanner ,regex))
+ `(scan-to-strings (load-time-value (create-scanner ,regex))
,target-string ,@rest))
(t form)))
@@ -371,7 +378,6 @@
;; the NIL BLOCK to enable exits via (RETURN ...)
`(block nil
(let* ((,%start (or ,start 0))
- (*real-start-pos* ,%start)
(,%end (or ,end (length ,target-string)))
,@(unless (constantp regex env)
;; leave constant regular expressions as they are -
@@ -397,7 +403,8 @@
(,match-start ,match-end ,reg-starts ,reg-ends)
(scan ,(cond ((constantp regex env) regex)
(t scanner))
- ,target-string :start ,%start :end ,%end)
+ ,target-string :start ,%start :end ,%end
+ :real-start-pos (or ,start 0))
;; declare the variables to be IGNORABLE to prevent the
;; compiler from issuing warnings
(declare
@@ -523,8 +530,7 @@
"Make sure that constant forms are compiled into scanners at
compile time."
(cond ((constantp regex env)
- `(all-matches (load-time-value
- (create-scanner ,regex))
+ `(all-matches (load-time-value (create-scanner ,regex))
,@rest))
(t form)))
@@ -548,9 +554,8 @@
compile time."
(cond ((constantp regex env)
`(all-matches-as-strings
- (load-time-value
- (create-scanner ,regex))
- ,@rest))
+ (load-time-value (create-scanner ,regex))
+ ,@rest))
(t form)))
(defun split (regex target-string
@@ -628,8 +633,7 @@
(define-compiler-macro split (&whole form &environment env regex target-string &rest rest)
"Make sure that constant forms are compiled into scanners at compile time."
(cond ((constantp regex env)
- `(split (load-time-value
- (create-scanner ,regex))
+ `(split (load-time-value (create-scanner ,regex))
,target-string ,@rest))
(t form)))
@@ -751,14 +755,17 @@
#-:cormanlisp
(defmethod build-replacement-template ((replacement-function function))
+ (declare #.*standard-optimize-settings*)
(list replacement-function))
#-:cormanlisp
(defmethod build-replacement-template ((replacement-function-symbol symbol))
+ (declare #.*standard-optimize-settings*)
(list replacement-function-symbol))
#-:cormanlisp
(defmethod build-replacement-template ((replacement-list list))
+ (declare #.*standard-optimize-settings*)
replacement-list)
;;; Corman Lisp's methods can't be closures... :(
@@ -816,17 +823,18 @@
start end
match-start match-end
reg-starts reg-ends
- simple-calls)
+ simple-calls
+ element-type)
(declare #.*standard-optimize-settings*)
"Accepts a replacement template and the current values from the
matching process in REGEX-REPLACE or REGEX-REPLACE-ALL and returns the
-corresponding template."
+corresponding string."
;; the upper exclusive bound of the register numbers in the regular
;; expression
(let ((reg-bound (if reg-starts
(array-dimension reg-starts 0)
0)))
- (with-output-to-string (s)
+ (with-output-to-string (s nil :element-type element-type)
(loop for token in replacement-template
do (typecase token
(string
@@ -901,8 +909,8 @@
reg-starts reg-ends)))
s)))))))))
-(defun replace-aux (target-string replacement pos-list reg-list
- start end preserve-case simple-calls)
+(defun replace-aux (target-string replacement pos-list reg-list start end
+ preserve-case simple-calls element-type)
(declare #.*standard-optimize-settings*)
"Auxiliary function used by REGEX-REPLACE and
REGEX-REPLACE-ALL. POS-LIST contains a list with the start and end
@@ -910,7 +918,7 @@
representing the corresponding register start and end positions."
;; build the template once before we start the loop
(let ((replacement-template (build-replacement-template replacement)))
- (with-output-to-string (s)
+ (with-output-to-string (s nil :element-type element-type)
;; loop through all matches and take the start and end of the
;; whole string into account
(loop for (from to) on (append (list start) pos-list (list end))
@@ -925,7 +933,8 @@
start end
from to
reg-starts reg-ends
- simple-calls)
+ simple-calls
+ element-type)
nil)
while to
if replace
@@ -946,7 +955,8 @@
&key (start 0)
(end (length target-string))
preserve-case
- simple-calls)
+ simple-calls
+ (element-type #+:lispworks 'lw:simple-char #-:lispworks 'character))
(declare #.*standard-optimize-settings*)
"Try to match TARGET-STRING between START and END against REGEX and
replace the first match with REPLACEMENT.
@@ -973,14 +983,17 @@
If PRESERVE-CASE is true, the replacement will try to preserve the
case (all upper case, all lower case, or capitalized) of the
match. The result will always be a fresh string, even if REGEX doesn't
-match."
+match.
+
+ ELEMENT-TYPE is the element type of the resulting string."
(multiple-value-bind (match-start match-end reg-starts reg-ends)
(scan regex target-string :start start :end end)
(if match-start
(replace-aux target-string replacement
(list match-start match-end)
(list reg-starts reg-ends)
- start end preserve-case simple-calls)
+ start end preserve-case
+ simple-calls element-type)
(subseq target-string start end))))
#-:cormanlisp
@@ -988,8 +1001,7 @@
(&whole form &environment env regex target-string replacement &rest rest)
"Make sure that constant forms are compiled into scanners at compile time."
(cond ((constantp regex env)
- `(regex-replace (load-time-value
- (create-scanner ,regex))
+ `(regex-replace (load-time-value (create-scanner ,regex))
,target-string ,replacement ,@rest))
(t form)))
@@ -997,7 +1009,8 @@
&key (start 0)
(end (length target-string))
preserve-case
- simple-calls)
+ simple-calls
+ (element-type #+:lispworks 'lw:simple-char #-:lispworks 'character))
(declare #.*standard-optimize-settings*)
"Try to match TARGET-STRING between START and END against REGEX and
replace all matches with REPLACEMENT.
@@ -1024,7 +1037,9 @@
If PRESERVE-CASE is true, the replacement will try to preserve the
case (all upper case, all lower case, or capitalized) of the
match. The result will always be a fresh string, even if REGEX doesn't
-match."
+match.
+
+ ELEMENT-TYPE is the element type of the resulting string."
(let ((pos-list '())
(reg-list '()))
(do-scans (match-start match-end reg-starts reg-ends regex target-string
@@ -1038,7 +1053,8 @@
(replace-aux target-string replacement
(nreverse pos-list)
(nreverse reg-list)
- start end preserve-case simple-calls)
+ start end preserve-case
+ simple-calls element-type)
(subseq target-string start end))))
#-:cormanlisp
@@ -1046,8 +1062,7 @@
(&whole form &environment env regex target-string replacement &rest rest)
"Make sure that constant forms are compiled into scanners at compile time."
(cond ((constantp regex env)
- `(regex-replace-all (load-time-value
- (create-scanner ,regex))
+ `(regex-replace-all (load-time-value (create-scanner ,regex))
,target-string ,replacement ,@rest))
(t form)))
@@ -1148,8 +1163,8 @@
(push (format nil "[constant]~:[~; value: ~S~]"
(boundp symbol) (symbol-value symbol)) output-list))
((boundp symbol)
- (push #+(or LispWorks CLISP) "[variable]"
- #-(or LispWorks CLISP) (format nil "[variable] value: ~S"
+ (push #+(or :lispworks :clisp) "[variable]"
+ #-(or :lispworks :clisp) (format nil "[variable] value: ~S"
(symbol-value symbol))
output-list)))
#-(or :cormanlisp :clisp)
Modified: branches/grin-neu/thirdparty/cl-ppcre/cl-ppcre-test.asd
===================================================================
--- branches/grin-neu/thirdparty/cl-ppcre/cl-ppcre-test.asd 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/cl-ppcre/cl-ppcre-test.asd 2006-12-01 10:39:49 UTC (rev 2094)
@@ -1,9 +1,9 @@
;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-USER; Base: 10 -*-
-;;; $Header: /usr/local/cvsrep/cl-ppcre/cl-ppcre-test.asd,v 1.8 2005/11/01 09:51:01 edi Exp $
+;;; $Header: /usr/local/cvsrep/cl-ppcre/cl-ppcre-test.asd,v 1.12 2006/10/11 15:41:42 edi Exp $
;;; This ASDF system definition was kindly provided by Marco Baringer.
-;;; Copyright (c) 2002-2005, Dr. Edmund Weitz. All rights reserved.
+;;; Copyright (c) 2002-2006, Dr. Edmund Weitz. All rights reserved.
;;; Redistribution and use in source and binary forms, with or without
;;; modification, are permitted provided that the following conditions
@@ -29,13 +29,6 @@
;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-(defpackage #:cl-ppcre-test.system
- (:use #:cl
- #:asdf))
-
-(in-package #:cl-ppcre-test.system)
-
-(defsystem #:cl-ppcre-test
- :version "1.2.12"
- :depends-on (#:cl-ppcre)
+(asdf:defsystem :cl-ppcre-test
+ :depends-on (:cl-ppcre)
:components ((:file "ppcre-tests")))
Modified: branches/grin-neu/thirdparty/cl-ppcre/cl-ppcre-test.system
===================================================================
--- branches/grin-neu/thirdparty/cl-ppcre/cl-ppcre-test.system 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/cl-ppcre/cl-ppcre-test.system 2006-12-01 10:39:49 UTC (rev 2094)
@@ -1,7 +1,7 @@
;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-USER; Base: 10 -*-
-;;; $Header: /usr/local/cvsrep/cl-ppcre/cl-ppcre-test.system,v 1.9 2005/04/01 21:29:09 edi Exp $
+;;; $Header: /usr/local/cvsrep/cl-ppcre/cl-ppcre-test.system,v 1.10 2006/01/03 18:38:55 edi Exp $
-;;; Copyright (c) 2002-2005, Dr. Edmund Weitz. All rights reserved.
+;;; Copyright (c) 2002-2006, Dr. Edmund Weitz. All rights reserved.
;;; Redistribution and use in source and binary forms, with or without
;;; modification, are permitted provided that the following conditions
Modified: branches/grin-neu/thirdparty/cl-ppcre/cl-ppcre.asd
===================================================================
--- branches/grin-neu/thirdparty/cl-ppcre/cl-ppcre.asd 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/cl-ppcre/cl-ppcre.asd 2006-12-01 10:39:49 UTC (rev 2094)
@@ -1,9 +1,9 @@
;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-USER; Base: 10 -*-
-;;; $Header: /usr/local/cvsrep/cl-ppcre/cl-ppcre.asd,v 1.12 2005/11/01 09:51:01 edi Exp $
+;;; $Header: /usr/local/cvsrep/cl-ppcre/cl-ppcre.asd,v 1.21 2006/10/12 06:24:41 edi Exp $
;;; This ASDF system definition was kindly provided by Marco Baringer.
-;;; Copyright (c) 2002-2005, Dr. Edmund Weitz. All rights reserved.
+;;; Copyright (c) 2002-2006, Dr. Edmund Weitz. All rights reserved.
;;; Redistribution and use in source and binary forms, with or without
;;; modification, are permitted provided that the following conditions
@@ -29,14 +29,8 @@
;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-(defpackage #:cl-ppcre.system
- (:use #:cl
- #:asdf))
-
-(in-package #:cl-ppcre.system)
-
-(defsystem #:cl-ppcre
- :version "1.2.12"
+(asdf:defsystem :cl-ppcre
+ :version "1.2.18"
:serial t
:components ((:file "packages")
(:file "specials")
Modified: branches/grin-neu/thirdparty/cl-ppcre/cl-ppcre.system
===================================================================
--- branches/grin-neu/thirdparty/cl-ppcre/cl-ppcre.system 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/cl-ppcre/cl-ppcre.system 2006-12-01 10:39:49 UTC (rev 2094)
@@ -1,7 +1,7 @@
;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-USER; Base: 10 -*-
-;;; $Header: /usr/local/cvsrep/cl-ppcre/cl-ppcre.system,v 1.11 2005/04/01 21:29:09 edi Exp $
+;;; $Header: /usr/local/cvsrep/cl-ppcre/cl-ppcre.system,v 1.12 2006/01/03 18:38:55 edi Exp $
-;;; Copyright (c) 2002-2005, Dr. Edmund Weitz. All rights reserved.
+;;; Copyright (c) 2002-2006, Dr. Edmund Weitz. All rights reserved.
;;; Redistribution and use in source and binary forms, with or without
;;; modification, are permitted provided that the following conditions
Modified: branches/grin-neu/thirdparty/cl-ppcre/closures.lisp
===================================================================
--- branches/grin-neu/thirdparty/cl-ppcre/closures.lisp 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/cl-ppcre/closures.lisp 2006-12-01 10:39:49 UTC (rev 2094)
@@ -1,10 +1,10 @@
;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-PPCRE; Base: 10 -*-
-;;; $Header: /usr/local/cvsrep/cl-ppcre/closures.lisp,v 1.29 2005/05/16 16:29:23 edi Exp $
+;;; $Header: /usr/local/cvsrep/cl-ppcre/closures.lisp,v 1.32 2006/10/11 15:41:42 edi Exp $
;;; Here we create the closures which together build the final
;;; scanner.
-;;; Copyright (c) 2002-2005, Dr. Edmund Weitz. All rights reserved.
+;;; Copyright (c) 2002-2006, Dr. Edmund Weitz. All rights reserved.
;;; Redistribution and use in source and binary forms, with or without
;;; modification, are permitted provided that the following conditions
@@ -63,6 +63,7 @@
such that the call to NEXT-FN after the match would succeed."))
(defmethod create-matcher-aux ((seq seq) next-fn)
+ (declare #.*standard-optimize-settings*)
;; the closure for a SEQ is a chain of closures for the elements of
;; this sequence which call each other in turn; the last closure
;; calls NEXT-FN
@@ -72,6 +73,7 @@
finally (return next-matcher)))
(defmethod create-matcher-aux ((alternation alternation) next-fn)
+ (declare #.*standard-optimize-settings*)
;; first create closures for all alternations of ALTERNATION
(let ((all-matchers (mapcar #'(lambda (choice)
(create-matcher-aux choice next-fn))
@@ -84,6 +86,7 @@
thereis (funcall (the function matcher) start-pos)))))
(defmethod create-matcher-aux ((register register) next-fn)
+ (declare #.*standard-optimize-settings*)
;; the position of this REGISTER within the whole regex; we start to
;; count at 0
(let ((num (num register)))
@@ -122,6 +125,7 @@
next-pos)))))))
(defmethod create-matcher-aux ((lookahead lookahead) next-fn)
+ (declare #.*standard-optimize-settings*)
;; create a closure which just checks for the inner regex and
;; doesn't care about NEXT-FN
(let ((test-matcher (create-matcher-aux (regex lookahead) #'identity)))
@@ -139,6 +143,7 @@
(funcall next-fn start-pos))))))
(defmethod create-matcher-aux ((lookbehind lookbehind) next-fn)
+ (declare #.*standard-optimize-settings*)
(let ((len (len lookbehind))
;; create a closure which just checks for the inner regex and
;; doesn't care about NEXT-FN
@@ -275,6 +280,7 @@
`(gethash ,chr-expr hash)))))))))
(defmethod create-matcher-aux ((char-class char-class) next-fn)
+ (declare #.*standard-optimize-settings*)
(declare (type function next-fn))
;; insert a test against the current character within *STRING*
(insert-char-class-tester (char-class (schar *string* start-pos))
@@ -291,6 +297,7 @@
(funcall next-fn (1+ start-pos)))))))
(defmethod create-matcher-aux ((str str) next-fn)
+ (declare #.*standard-optimize-settings*)
(declare (type fixnum *end-string-pos*)
(type function next-fn)
;; this special value is set by CREATE-SCANNER when the
@@ -405,6 +412,7 @@
(word-char-p (schar *string* start-pos)))))))
(defmethod create-matcher-aux ((word-boundary word-boundary) next-fn)
+ (declare #.*standard-optimize-settings*)
(declare (type function next-fn))
(if (negatedp word-boundary)
(lambda (start-pos)
@@ -415,6 +423,7 @@
(funcall next-fn start-pos)))))
(defmethod create-matcher-aux ((everything everything) next-fn)
+ (declare #.*standard-optimize-settings*)
(declare (type function next-fn))
(if (single-line-p everything)
;; closure for single-line-mode: we really match everything, so we
@@ -432,11 +441,12 @@
(funcall next-fn (1+ start-pos))))))
(defmethod create-matcher-aux ((anchor anchor) next-fn)
+ (declare #.*standard-optimize-settings*)
(declare (type function next-fn))
(let ((startp (startp anchor))
(multi-line-p (multi-line-p anchor)))
(cond ((no-newline-p anchor)
- ;; this must be and end-anchor and it must be modeless, so
+ ;; this must be an end-anchor and it must be modeless, so
;; we just have to check whether START-POS equals
;; *END-POS*
(lambda (start-pos)
@@ -486,6 +496,7 @@
(funcall next-fn start-pos)))))))
(defmethod create-matcher-aux ((back-reference back-reference) next-fn)
+ (declare #.*standard-optimize-settings*)
(declare (type function next-fn))
;; the position of the corresponding REGISTER within the whole
;; regex; we start to count at 0
@@ -525,6 +536,7 @@
(funcall next-fn next-pos)))))))))
(defmethod create-matcher-aux ((branch branch) next-fn)
+ (declare #.*standard-optimize-settings*)
(let* ((test (test branch))
(then-matcher (create-matcher-aux (then-regex branch) next-fn))
(else-matcher (create-matcher-aux (else-regex branch) next-fn)))
@@ -545,6 +557,7 @@
(funcall else-matcher start-pos))))))))
(defmethod create-matcher-aux ((standalone standalone) next-fn)
+ (declare #.*standard-optimize-settings*)
(let ((inner-matcher (create-matcher-aux (regex standalone) #'identity)))
(declare (type function next-fn inner-matcher))
(lambda (start-pos)
@@ -553,6 +566,7 @@
(funcall next-fn next-pos))))))
(defmethod create-matcher-aux ((filter filter) next-fn)
+ (declare #.*standard-optimize-settings*)
(let ((fn (fn filter)))
(lambda (start-pos)
(let ((next-pos (funcall fn start-pos)))
@@ -560,5 +574,6 @@
(funcall next-fn next-pos))))))
(defmethod create-matcher-aux ((void void) next-fn)
+ (declare #.*standard-optimize-settings*)
;; optimize away VOIDs: don't create a closure, just return NEXT-FN
next-fn)
Modified: branches/grin-neu/thirdparty/cl-ppcre/convert.lisp
===================================================================
--- branches/grin-neu/thirdparty/cl-ppcre/convert.lisp 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/cl-ppcre/convert.lisp 2006-12-01 10:39:49 UTC (rev 2094)
@@ -1,11 +1,11 @@
;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-PPCRE; Base: 10 -*-
-;;; $Header: /usr/local/cvsrep/cl-ppcre/convert.lisp,v 1.22 2005/04/01 21:29:09 edi Exp $
+;;; $Header: /usr/local/cvsrep/cl-ppcre/convert.lisp,v 1.24 2006/07/03 11:16:48 edi Exp $
;;; Here the parse tree is converted into its internal representation
;;; using REGEX objects. At the same time some optimizations are
;;; already applied.
-;;; Copyright (c) 2002-2005, Dr. Edmund Weitz. All rights reserved.
+;;; Copyright (c) 2002-2006, Dr. Edmund Weitz. All rights reserved.
;;; Redistribution and use in source and binary forms, with or without
;;; modification, are permitted provided that the following conditions
@@ -544,6 +544,10 @@
:num (1- backref-number)
:case-insensitive-p (case-insensitive-mode-p
flags))))
+ ;; (:REGEX <string>)
+ ((:regex)
+ (let ((regex (second parse-tree)))
+ (convert-aux (parse-string regex))))
;; (:CHAR-CLASS|:INVERTED-CHAR-CLASS {<item>}*)
;; where item is one of
;; - a character
Modified: branches/grin-neu/thirdparty/cl-ppcre/doc/index.html
===================================================================
--- branches/grin-neu/thirdparty/cl-ppcre/doc/index.html 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/cl-ppcre/doc/index.html 2006-12-01 10:39:49 UTC (rev 2094)
@@ -3,7 +3,7 @@
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
- <title>CL-PPCRE - portable Perl-compatible regular expressions for Common Lisp</title>
+ <title>CL-PPCRE - Portable Perl-compatible regular expressions for Common Lisp</title>
<style type="text/css">
pre { padding:5px; background-color:#e0e0e0 }
a { text-decoration: none; }
@@ -17,7 +17,7 @@
<body bgcolor=white>
-<h2>CL-PPCRE - portable Perl-compatible regular expressions for Common Lisp</h2>
+<h2>CL-PPCRE - Portable Perl-compatible regular expressions for Common Lisp</h2>
<blockquote>
<br> <br><h3>Abstract</h3>
@@ -117,7 +117,7 @@
</ul>
CL-PPCRE has been used successfully in various applications like <a
-href="http://nostoc.stanford.edu/Docs/">BioLingua</a>, <a
+href="http://nostoc.stanford.edu/Docs/">BioBike</a>, <a
href="http://www.hpc.unm.edu/~download/LoGS/">LoGS</a>, <a href="http://cafespot.net/">CafeSpot</a>, <a href="http://www.eboy.com/">Eboy</a>, or <a
href="http://weitz.de/regex-coach/">The Regex Coach</a>.
@@ -192,15 +192,14 @@
CL-PPCRE together with this documentation can be downloaded from <a
href="http://weitz.de/files/cl-ppcre.tar.gz">http://weitz.de/files/cl-ppcre.tar.gz</a>. The
-current version is 1.2.12. A <a
-href="CHANGELOG">CHANGELOG</a> is available.
+current version is 1.2.18.
<p>
If you're on <a href="http://www.debian.org/">Debian</a> you should
probably use the <a
-href="http://packages.debian.org/cgi-bin/search_packages.pl?keywords=cl-ppcre&sea…">cl-ppcre
+href="http://packages.debian.org/cgi-bin/search_packages.pl?keywords=cl-ppcre&…">cl-ppcre
Debian package</a> which is available thanks to <a href="http://pvaneynd.mailworks.org/">Peter van Eynde</a> and <a href="http://b9.com/">Kevin
Rosenberg</a>. There's also a port
-for <a href="http://www.cliki.net/gentoo">Gentoo Linux</a> thanks to Matthew Kennedy and a <a href="http://www.freebsd.org/cgi/url.cgi?ports/textproc/cl-ppcre/pkg-descr">FreeBSD port</a> thanks to Henrik Motakef.
+for <a href="http://www.gentoo.org/proj/en/common-lisp/index.xml">Gentoo Linux</a> thanks to Matthew Kennedy and a <a href="http://www.freebsd.org/cgi/url.cgi?ports/textproc/cl-ppcre/pkg-descr">FreeBSD port</a> thanks to Henrik Motakef.
Installation via <a
href="http://www.cliki.net/asdf-install">asdf-install</a> should as well
be possible.
@@ -267,7 +266,7 @@
<p>
The function accepts most of the regex syntax of Perl 5 as described
in <a
-href="http://www.perldoc.com/perl5.8.0/pod/perlre.html"><code>man
+href="http://perldoc.perl.org/perlre.html"><code>man
perlre</code></a> including extended features like non-greedy
repetitions, positive and negative look-ahead and look-behind
assertions, "standalone" subexpressions, and conditional
@@ -405,7 +404,7 @@
look-behind assertion. See the entry for
<code>(?(<<i>condition</i>>)<<i>yes-pattern</i>>|<<i>no-pattern</i>>)</code>
in <a
-href="http://www.perldoc.com/perl5.8.0/pod/perlre.html#Extended-Patterns"><code>man
+href="http://perldoc.perl.org/perlre.html#Extended-Patterns"><code>man
perlre</code></a> for the semantics of this construct. If
<code><<i>parse-tree</i>></code> is an alternation is
<em>must</em> enclose exactly one or two parse trees where the second
@@ -451,6 +450,11 @@
non-negative integer or <code>NIL</code> is a user-defined <a
href="#filters">filter</a>.
+<li><code>(:REGEX <<i>string</i>>)</code> where
+<code><<i>string</i>></code> is an
+embedded <a href="#create-scanner">regular expression in Perl
+syntax</a>.
+
<li><code>(:CHAR-CLASS|:INVERTED-CHAR-CLASS
{<<i>item</i>>}*)</code> where <code><<i>item</i>></code>
is either a character, a <em>character range</em>, or a symbol for a
@@ -514,7 +518,7 @@
<p><br>[Accessor]
<br><a class="none" name="parse-tree-synonym"><b>parse-tree-synonym</b> <i>symbol</i> => <i>parse-tree</i>
-<br><tt>(setf (</tt><b>parse-tree-synonym</b> <i>symbol</i>) <i>new-parse-tree</i><tt>)</tt></a>
+<br><tt>(setf (</tt><b>parse-tree-synonym</b> <i>symbol</i><tt>)</tt> <i>new-parse-tree</i><tt>)</tt></a>
</p><blockquote><br>
Any symbol (unless it's a keyword with a special meaning in parse
@@ -590,19 +594,21 @@
-<p><br>[Standard Generic Function]
+<p><br>[Generic Function]
<br><a class=none name="scan"><b>scan</b> <i>regex target-string <tt>&key</tt> start end</i> => <i>match-start, match-end, reg-starts, reg-ends</i></a>
<blockquote><br>
-Searches the string <code><i>target-string</i></code> from
-<code><i>start</i></code> (which defaults to 0) to
+Searches the string <code><i>target-string</i></code>
+from <code><i>start</i></code> (which defaults to 0) to
<code><i>end</i></code> (which default to the length of
<code><i>target-string</i></code>) and tries to match
<code><i>regex</i></code>. On success returns four values - the start
of the match, the end of the match, and two arrays denoting the
beginnings and ends of register matches. On failure returns
-<code>NIL</code>. <code><i>target-string</i></code> will be coerced to a
-simple string if it isn't one already.
+<code>NIL</code>. <code><i>target-string</i></code> will be coerced
+to a simple string if it isn't one already. (There's another keyword
+parameter <code><i>real-start-pos</i></code>. This one should
+<em>never</em> be set from user code - it is only used internally.)
<p>
<code>SCAN</code> acts as if the part of
<code><i>target-string</i></code> between <code><i>start</i></code>
@@ -691,7 +697,7 @@
href="http://www.lispworks.com/documentation/HyperSpec/Body/26_glo_f.htm#function…">function
designator</a> (which is evaluated) denoting a function which is to be applied to the string before the result is bound to <code>VAR</code>.
To make this even more convenient the form <code>(FN VAR1 ...VARn)</code> can be used as an abbreviation for
-<code>(FN VAR1) ... (FN VARn).
+<code>(FN VAR1) ... (FN VARn)</code>.
<p>
If there is no match, the <code><i>statement*</i></code> forms are <em>not</em>
executed. For each element of
@@ -970,7 +976,7 @@
<p><br>[Function]
-<br><a class=none name="regex-replace"><b>regex-replace</b> <i>regex target-string replacement <tt>&key</tt> start end preserve-case simple-calls</i> => <i>list</i></a>
+<br><a class=none name="regex-replace"><b>regex-replace</b> <i>regex target-string replacement <tt>&key</tt> start end preserve-case simple-calls element-type</i> => <i>string</i></a>
<blockquote><br> Try to match <code><i>target-string</i></code>
between <code><i>start</i></code> and <code><i>end</i></code> against
@@ -1024,6 +1030,17 @@
href="http://www.lispworks.com/documentation/HyperSpec/Body/26_glo_f.htm#fresh">fresh</a>
string, even if <code><i>regex</i></code> doesn't match.
<p>
+<code><i>element-type</i></code> specifies
+the <a
+href="http://www.lispworks.com/documentation/HyperSpec/Body/26_glo_a.htm#array_el…">array
+element type</a> of the string which is returned, the default
+is <a
+href="http://www.lispworks.com/documentation/lw50/LWRM/html/lwref-346.htm"><code>LW:SIMPLE-CHAR</code></a>
+for LispWorks
+and <a
+href="http://www.lispworks.com/documentation/HyperSpec/Body/t_ch.htm"><code>CHARACTER</code></a>
+for other Lisps.
+<p>
Examples:
<pre>
@@ -1048,11 +1065,18 @@
* (cl-ppcre:regex-replace "bar" "foo bar baz"
'("[frob (was '" :match "' between '" :before-match "' and '" :after-match "')]"))
"foo [frob (was 'bar' between 'foo ' and ' baz')] baz"
+
+* (cl-ppcre:regex-replace "(be)(nev)(o)(lent)"
+ "benevolent: adj. generous, kind"
+ #'(lambda (match &rest registers)
+ (format nil "~A [~{~A~^.~}]" match registers))
+ :simple-calls t)
+"benevolent [be.nev.o.lent]: adj. generous, kind"
</pre></blockquote>
<p><br>[Function]
-<br><a class=none name="regex-replace-all"><b>regex-replace-all</b> <i>regex target-string replacement <tt>&key</tt> start end preserve-case simple-calls</i> => <i>list</i></a>
+<br><a class=none name="regex-replace-all"><b>regex-replace-all</b> <i>regex target-string replacement <tt>&key</tt> start end preserve-case simple-calls element-type</i> => <i>string</i></a>
<blockquote><br>
Like <a href="#regex-replace"><code>REGEX-REPLACE</code></a> but replaces all matches.
@@ -1228,7 +1252,7 @@
href="http://www.lispworks.com/documentation/HyperSpec/Body/v_char_c.htm"><code>CHAR-CODE-LIMIT</code></a>,
and you might see significant speed and space improvements during
scanner <em>creation</em> if, say, your target strings only contain <a
-href="http://wwwwbs.cs.tu-berlin.de/user/czyborra/charsets/">ISO-8859-1</a>
+href="http://czyborra.com/charsets/iso8859.html">ISO-8859-1</a>
characters and you're using an implementation like AllegroCL,
CLISP, LispWorks, or SBCL where <code>CHAR-CODE-LIMIT</code> has a value
much higher than 256. The <a href="#test">test suite</a> will
@@ -1420,7 +1444,7 @@
</blockquote>
<p><br>[Function]
-<br><a class=none name="ppcre-syntax-error-string"><b>ppcre-syntax-error-string</b></a> <i>condition</i> => <i>string</i></a>
+<br><a class=none name="ppcre-syntax-error-string"><b>ppcre-syntax-error-string</b></a> <i>condition</i> => <i>string</i>
<blockquote><br>
If <code><i>condition</i></code> is a condition of type <a
@@ -1434,7 +1458,7 @@
</blockquote>
<p><br>[Function]
-<br><a class=none name="ppcre-syntax-error-pos"><b>ppcre-syntax-error-pos</b></a> <i>condition</i> => <i>number</i></a>
+<br><a class=none name="ppcre-syntax-error-pos"><b>ppcre-syntax-error-pos</b></a> <i>condition</i> => <i>number</i>
<blockquote><br>
If <code><i>condition</i></code> is a condition of type <a
@@ -1653,7 +1677,7 @@
* (cl-ppcre-test:test)
<font color=orange>;; ....
-;; (a list of <a class=noborder href="#perl">incompatibilities with Perl</a>)</font color=orange>
+;; (a list of <a class=noborder href="#perl">incompatibilities with Perl</a>)</font>
</pre>
(If you're not using MK:DEFSYSTEM or asdf it suffices to build
@@ -2304,13 +2328,13 @@
also helped to improve/fix the test suite and the compiler macro.
<p>
-Thanks to the guys at "Café Olé" in Hamburg
+Thanks to the guys at "<a href="http://www.weinhandel-ottensen.de/">Café Olé</a>" in Hamburg
where I wrote most of the code and thanks to my wife for lending me
her PowerBook to test CL-PPCRE with MCL and OpenMCL.
<p>
-$Header: /usr/local/cvsrep/cl-ppcre/doc/index.html,v 1.131 2005/11/01 09:51:02 edi Exp $
+$Header: /usr/local/cvsrep/cl-ppcre/doc/index.html,v 1.150 2006/10/12 06:24:42 edi Exp $
<p><a href="http://weitz.de/index.html">BACK TO MY HOMEPAGE</a>
</body>
-</html>
\ No newline at end of file
+</html>
Modified: branches/grin-neu/thirdparty/cl-ppcre/errors.lisp
===================================================================
--- branches/grin-neu/thirdparty/cl-ppcre/errors.lisp 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/cl-ppcre/errors.lisp 2006-12-01 10:39:49 UTC (rev 2094)
@@ -1,7 +1,7 @@
;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-PPCRE; Base: 10 -*-
-;;; $Header: /usr/local/cvsrep/cl-ppcre/errors.lisp,v 1.14 2005/04/01 21:29:09 edi Exp $
+;;; $Header: /usr/local/cvsrep/cl-ppcre/errors.lisp,v 1.15 2006/01/03 18:38:55 edi Exp $
-;;; Copyright (c) 2002-2005, Dr. Edmund Weitz. All rights reserved.
+;;; Copyright (c) 2002-2006, Dr. Edmund Weitz. All rights reserved.
;;; Redistribution and use in source and binary forms, with or without
;;; modification, are permitted provided that the following conditions
Modified: branches/grin-neu/thirdparty/cl-ppcre/lexer.lisp
===================================================================
--- branches/grin-neu/thirdparty/cl-ppcre/lexer.lisp 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/cl-ppcre/lexer.lisp 2006-12-01 10:39:49 UTC (rev 2094)
@@ -1,5 +1,5 @@
;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-PPCRE; Base: 10 -*-
-;;; $Header: /usr/local/cvsrep/cl-ppcre/lexer.lisp,v 1.24 2005/04/01 21:29:09 edi Exp $
+;;; $Header: /usr/local/cvsrep/cl-ppcre/lexer.lisp,v 1.25 2006/01/03 18:38:55 edi Exp $
;;; The lexer's responsibility is to convert the regex string into a
;;; sequence of tokens which are in turn consumed by the parser.
@@ -9,7 +9,7 @@
;;; has opened so far. (The latter is necessary for interpreting
;;; strings like "\\10" correctly.)
-;;; Copyright (c) 2002-2005, Dr. Edmund Weitz. All rights reserved.
+;;; Copyright (c) 2002-2006, Dr. Edmund Weitz. All rights reserved.
;;; Redistribution and use in source and binary forms, with or without
;;; modification, are permitted provided that the following conditions
Modified: branches/grin-neu/thirdparty/cl-ppcre/lispworks-defsystem.lisp
===================================================================
--- branches/grin-neu/thirdparty/cl-ppcre/lispworks-defsystem.lisp 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/cl-ppcre/lispworks-defsystem.lisp 2006-12-01 10:39:49 UTC (rev 2094)
@@ -1,9 +1,9 @@
;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-USER; Base: 10 -*-
-;;; $Header: /usr/local/cvsrep/cl-ppcre/lispworks-defsystem.lisp,v 1.1 2005/04/30 20:00:50 edi Exp $
+;;; $Header: /usr/local/cvsrep/cl-ppcre/lispworks-defsystem.lisp,v 1.2 2006/01/03 18:38:55 edi Exp $
;;; This system definition for LispWorks was kindly provided by Wade Humeniuk
-;;; Copyright (c) 2002-2005, Dr. Edmund Weitz. All rights reserved.
+;;; Copyright (c) 2002-2006, Dr. Edmund Weitz. All rights reserved.
;;; Redistribution and use in source and binary forms, with or without
;;; modification, are permitted provided that the following conditions
Modified: branches/grin-neu/thirdparty/cl-ppcre/load.lisp
===================================================================
--- branches/grin-neu/thirdparty/cl-ppcre/load.lisp 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/cl-ppcre/load.lisp 2006-12-01 10:39:49 UTC (rev 2094)
@@ -1,7 +1,7 @@
;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-USER; Base: 10 -*-
-;;; $Header: /usr/local/cvsrep/cl-ppcre/load.lisp,v 1.13 2005/04/01 21:29:09 edi Exp $
+;;; $Header: /usr/local/cvsrep/cl-ppcre/load.lisp,v 1.14 2006/01/03 18:38:55 edi Exp $
-;;; Copyright (c) 2002-2005, Dr. Edmund Weitz. All rights reserved.
+;;; Copyright (c) 2002-2006, Dr. Edmund Weitz. All rights reserved.
;;; Redistribution and use in source and binary forms, with or without
;;; modification, are permitted provided that the following conditions
Modified: branches/grin-neu/thirdparty/cl-ppcre/optimize.lisp
===================================================================
--- branches/grin-neu/thirdparty/cl-ppcre/optimize.lisp 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/cl-ppcre/optimize.lisp 2006-12-01 10:39:49 UTC (rev 2094)
@@ -1,10 +1,10 @@
;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-PPCRE; Base: 10 -*-
-;;; $Header: /usr/local/cvsrep/cl-ppcre/optimize.lisp,v 1.26 2005/04/13 15:35:57 edi Exp $
+;;; $Header: /usr/local/cvsrep/cl-ppcre/optimize.lisp,v 1.29 2006/10/11 14:56:34 edi Exp $
;;; This file contains optimizations which can be applied to converted
;;; parse trees.
-;;; Copyright (c) 2002-2005, Dr. Edmund Weitz. All rights reserved.
+;;; Copyright (c) 2002-2006, Dr. Edmund Weitz. All rights reserved.
;;; Redistribution and use in source and binary forms, with or without
;;; modification, are permitted provided that the following conditions
@@ -40,6 +40,7 @@
operation on REGEX."))
(defmethod flatten ((seq seq))
+ (declare #.*standard-optimize-settings*)
;; this looks more complicated than it is because we modify SEQ in
;; place to avoid unnecessary consing
(let ((elements-rest (elements seq)))
@@ -71,6 +72,7 @@
(t (make-instance 'void)))))
(defmethod flatten ((alternation alternation))
+ (declare #.*standard-optimize-settings*)
;; same algorithm as above
(let ((choices-rest (choices alternation)))
(loop
@@ -98,9 +100,8 @@
"Encountered alternation without choices.")))))
(defmethod flatten ((branch branch))
- (with-slots ((test test)
- (then-regex then-regex)
- (else-regex else-regex))
+ (declare #.*standard-optimize-settings*)
+ (with-slots (test then-regex else-regex)
branch
(setq test
(if (numberp test)
@@ -111,6 +112,7 @@
branch))
(defmethod flatten ((regex regex))
+ (declare #.*standard-optimize-settings*)
(typecase regex
((or repetition register lookahead lookbehind standalone)
;; if REGEX contains exactly one inner REGEX object flatten it
@@ -124,12 +126,13 @@
regex)))
(defgeneric gather-strings (regex)
- (declare #.*standard-optimize-settings*)
+ (declare #.*standard-optimize-settings*)
(:documentation "Collects adjacent strings or characters into one
string provided they have the same case mode. This is a destructive
operation on REGEX."))
(defmethod gather-strings ((seq seq))
+ (declare #.*standard-optimize-settings*)
;; note that GATHER-STRINGS is to be applied after FLATTEN, i.e. it
;; expects SEQ to be flattened already; in particular, SEQ cannot be
;; empty and cannot contain embedded SEQ objects
@@ -246,6 +249,7 @@
seq))
(defmethod gather-strings ((alternation alternation))
+ (declare #.*standard-optimize-settings*)
;; loop ON the choices of ALTERNATION so we can modify them directly
(loop for choices-rest on (choices alternation)
while choices-rest
@@ -254,9 +258,8 @@
alternation)
(defmethod gather-strings ((branch branch))
- (with-slots ((test test)
- (then-regex then-regex)
- (else-regex else-regex))
+ (declare #.*standard-optimize-settings*)
+ (with-slots (test then-regex else-regex)
branch
(setq test
(if (numberp test)
@@ -267,6 +270,7 @@
branch))
(defmethod gather-strings ((regex regex))
+ (declare #.*standard-optimize-settings*)
(typecase regex
((or repetition register lookahead lookbehind standalone)
;; if REGEX contains exactly one inner REGEX object apply
@@ -283,7 +287,7 @@
;; Note that START-ANCHORED-P will be called after FLATTEN and GATHER-STRINGS.
(defgeneric start-anchored-p (regex &optional in-seq-p)
- (declare #.*standard-optimize-settings*)
+ (declare #.*standard-optimize-settings*)
(:documentation "Returns T if REGEX starts with a \"real\" start
anchor, i.e. one that's not in multi-line mode, NIL otherwise. If
IN-SEQ-P is true the function will return :ZERO-LENGTH if REGEX is a
@@ -302,6 +306,7 @@
finally (return (and anchored-p (not (eq anchored-p :zero-length))))))
(defmethod start-anchored-p ((alternation alternation) &optional in-seq-p)
+ (declare #.*standard-optimize-settings*)
(declare (ignore in-seq-p))
;; clearly an alternation can only be start-anchored if all of its
;; choices are start-anchored
@@ -309,30 +314,36 @@
always (start-anchored-p choice)))
(defmethod start-anchored-p ((branch branch) &optional in-seq-p)
+ (declare #.*standard-optimize-settings*)
(declare (ignore in-seq-p))
(and (start-anchored-p (then-regex branch))
(start-anchored-p (else-regex branch))))
(defmethod start-anchored-p ((repetition repetition) &optional in-seq-p)
+ (declare #.*standard-optimize-settings*)
(declare (ignore in-seq-p))
;; well, this wouldn't make much sense, but anyway...
(and (plusp (minimum repetition))
(start-anchored-p (regex repetition))))
(defmethod start-anchored-p ((register register) &optional in-seq-p)
+ (declare #.*standard-optimize-settings*)
(declare (ignore in-seq-p))
(start-anchored-p (regex register)))
(defmethod start-anchored-p ((standalone standalone) &optional in-seq-p)
+ (declare #.*standard-optimize-settings*)
(declare (ignore in-seq-p))
(start-anchored-p (regex standalone)))
(defmethod start-anchored-p ((anchor anchor) &optional in-seq-p)
+ (declare #.*standard-optimize-settings*)
(declare (ignore in-seq-p))
(and (startp anchor)
(not (multi-line-p anchor))))
(defmethod start-anchored-p ((regex regex) &optional in-seq-p)
+ (declare #.*standard-optimize-settings*)
(typecase regex
((or lookahead lookbehind word-boundary void)
;; zero-length assertions
@@ -352,7 +363,7 @@
;; Note that END-STRING-AUX will be called after FLATTEN and GATHER-STRINGS.
(defgeneric end-string-aux (regex &optional old-case-insensitive-p)
- (declare #.*standard-optimize-settings*)
+ (declare #.*standard-optimize-settings*)
(:documentation "Returns the constant string (if it exists) REGEX
ends with wrapped into a STR object, otherwise NIL.
OLD-CASE-INSENSITIVE-P is the CASE-INSENSITIVE-P slot of the last STR
@@ -361,6 +372,7 @@
(defmethod end-string-aux ((str str)
&optional (old-case-insensitive-p :void))
+ (declare #.*standard-optimize-settings*)
(declare (special last-str))
(cond ((and (not (skip str)) ; avoid constituents of STARTS-WITH
;; only use STR if nothing has been collected yet or if
@@ -376,6 +388,7 @@
(defmethod end-string-aux ((seq seq)
&optional (old-case-insensitive-p :void))
+ (declare #.*standard-optimize-settings*)
(declare (special continuep))
(let (case-insensitive-p
concatenated-string
@@ -444,14 +457,17 @@
(defmethod end-string-aux ((register register)
&optional (old-case-insensitive-p :void))
+ (declare #.*standard-optimize-settings*)
(end-string-aux (regex register) old-case-insensitive-p))
(defmethod end-string-aux ((standalone standalone)
&optional (old-case-insensitive-p :void))
+ (declare #.*standard-optimize-settings*)
(end-string-aux (regex standalone) old-case-insensitive-p))
(defmethod end-string-aux ((regex regex)
&optional (old-case-insensitive-p :void))
+ (declare #.*standard-optimize-settings*)
(declare (special last-str end-anchored-p continuep))
(typecase regex
((or anchor lookahead lookbehind word-boundary void)
@@ -474,14 +490,11 @@
;; REPETITION, FILTER)
nil)))
-(defgeneric end-string (regex)
+(defun end-string (regex)
+ (declare (special end-string-offset))
(declare #.*standard-optimize-settings*)
- (:documentation "Returns the constant string (if it exists) REGEX ends with wrapped
-into a STR object, otherwise NIL."))
-
-(defmethod end-string ((regex regex))
- (declare (special end-string-offset))
- (declare #.*standard-optimize-settings*)
+ "Returns the constant string (if it exists) REGEX ends with wrapped
+into a STR object, otherwise NIL."
;; LAST-STR points to the last STR object (seen from the end) that's
;; part of END-STRING; CONTINUEP is set to T if we stop collecting
;; in the middle of a SEQ
@@ -499,53 +512,64 @@
end-string-offset (offset last-str))))))
(defgeneric compute-min-rest (regex current-min-rest)
- (declare #.*standard-optimize-settings*)
+ (declare #.*standard-optimize-settings*)
(:documentation "Returns the minimal length of REGEX plus
CURRENT-MIN-REST. This is similar to REGEX-MIN-LENGTH except that it
recurses down into REGEX and sets the MIN-REST slots of REPETITION
objects."))
(defmethod compute-min-rest ((seq seq) current-min-rest)
+ (declare #.*standard-optimize-settings*)
(loop for element in (reverse (elements seq))
for last-min-rest = current-min-rest then this-min-rest
for this-min-rest = (compute-min-rest element last-min-rest)
finally (return this-min-rest)))
(defmethod compute-min-rest ((alternation alternation) current-min-rest)
+ (declare #.*standard-optimize-settings*)
(loop for choice in (choices alternation)
minimize (compute-min-rest choice current-min-rest)))
(defmethod compute-min-rest ((branch branch) current-min-rest)
+ (declare #.*standard-optimize-settings*)
(min (compute-min-rest (then-regex branch) current-min-rest)
(compute-min-rest (else-regex branch) current-min-rest)))
(defmethod compute-min-rest ((str str) current-min-rest)
+ (declare #.*standard-optimize-settings*)
(+ current-min-rest (len str)))
(defmethod compute-min-rest ((filter filter) current-min-rest)
+ (declare #.*standard-optimize-settings*)
(+ current-min-rest (or (len filter) 0)))
(defmethod compute-min-rest ((repetition repetition) current-min-rest)
+ (declare #.*standard-optimize-settings*)
(setf (min-rest repetition) current-min-rest)
(compute-min-rest (regex repetition) current-min-rest)
(+ current-min-rest (* (minimum repetition) (min-len repetition))))
(defmethod compute-min-rest ((register register) current-min-rest)
+ (declare #.*standard-optimize-settings*)
(compute-min-rest (regex register) current-min-rest))
(defmethod compute-min-rest ((standalone standalone) current-min-rest)
+ (declare #.*standard-optimize-settings*)
(declare (ignore current-min-rest))
(compute-min-rest (regex standalone) 0))
(defmethod compute-min-rest ((lookahead lookahead) current-min-rest)
+ (declare #.*standard-optimize-settings*)
(compute-min-rest (regex lookahead) 0)
current-min-rest)
(defmethod compute-min-rest ((lookbehind lookbehind) current-min-rest)
+ (declare #.*standard-optimize-settings*)
(compute-min-rest (regex lookbehind) (+ current-min-rest (len lookbehind)))
current-min-rest)
(defmethod compute-min-rest ((regex regex) current-min-rest)
+ (declare #.*standard-optimize-settings*)
(typecase regex
((or char-class everything)
(1+ current-min-rest))
Modified: branches/grin-neu/thirdparty/cl-ppcre/packages.lisp
===================================================================
--- branches/grin-neu/thirdparty/cl-ppcre/packages.lisp 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/cl-ppcre/packages.lisp 2006-12-01 10:39:49 UTC (rev 2094)
@@ -1,7 +1,7 @@
;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-USER; Base: 10 -*-
-;;; $Header: /usr/local/cvsrep/cl-ppcre/packages.lisp,v 1.19 2005/04/01 21:29:10 edi Exp $
+;;; $Header: /usr/local/cvsrep/cl-ppcre/packages.lisp,v 1.21 2006/10/11 14:36:35 edi Exp $
-;;; Copyright (c) 2002-2005, Dr. Edmund Weitz. All rights reserved.
+;;; Copyright (c) 2002-2006, Dr. Edmund Weitz. All rights reserved.
;;; Redistribution and use in source and binary forms, with or without
;;; modification, are permitted provided that the following conditions
@@ -59,9 +59,7 @@
#:ppcre-syntax-error-string
#:ppcre-syntax-error-pos
#:register-groups-bind
- #:do-register-groups
- #:*standard-optimize-settings*
- #:*special-optimize-settings*))
+ #:do-register-groups))
#+:cormanlisp
(defpackage "CL-PPCRE"
@@ -92,9 +90,7 @@
"PPCRE-SYNTAX-ERROR-STRING"
"PPCRE-SYNTAX-ERROR-POS"
"REGISTER-GROUPS-BIND"
- "DO-REGISTER-GROUPS"
- "*STANDARD-OPTIMIZE-SETTINGS*"
- "*SPECIAL-OPTIMIZE-SETTINGS*"))
+ "DO-REGISTER-GROUPS"))
#-:cormanlisp
(defpackage #:cl-ppcre-test
Modified: branches/grin-neu/thirdparty/cl-ppcre/parser.lisp
===================================================================
--- branches/grin-neu/thirdparty/cl-ppcre/parser.lisp 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/cl-ppcre/parser.lisp 2006-12-01 10:39:49 UTC (rev 2094)
@@ -1,5 +1,5 @@
;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-PPCRE; Base: 10 -*-
-;;; $Header: /usr/local/cvsrep/cl-ppcre/parser.lisp,v 1.21 2005/08/03 21:11:27 edi Exp $
+;;; $Header: /usr/local/cvsrep/cl-ppcre/parser.lisp,v 1.22 2006/01/03 18:38:55 edi Exp $
;;; The parser will - with the help of the lexer - parse a regex
;;; string and convert it into a "parse tree" (see docs for details
@@ -7,7 +7,7 @@
;;; illegal parse trees. It is assumed that the conversion process
;;; later on will track them down.
-;;; Copyright (c) 2002-2005, Dr. Edmund Weitz. All rights reserved.
+;;; Copyright (c) 2002-2006, Dr. Edmund Weitz. All rights reserved.
;;; Redistribution and use in source and binary forms, with or without
;;; modification, are permitted provided that the following conditions
Modified: branches/grin-neu/thirdparty/cl-ppcre/ppcre-tests.lisp
===================================================================
--- branches/grin-neu/thirdparty/cl-ppcre/ppcre-tests.lisp 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/cl-ppcre/ppcre-tests.lisp 2006-12-01 10:39:49 UTC (rev 2094)
@@ -1,7 +1,7 @@
;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-PPCRE-TEST; Base: 10 -*-
-;;; $Header: /usr/local/cvsrep/cl-ppcre/ppcre-tests.lisp,v 1.31 2005/08/23 12:23:13 edi Exp $
+;;; $Header: /usr/local/cvsrep/cl-ppcre/ppcre-tests.lisp,v 1.33 2006/10/11 14:36:35 edi Exp $
-;;; Copyright (c) 2002-2005, Dr. Edmund Weitz. All rights reserved.
+;;; Copyright (c) 2002-2006, Dr. Edmund Weitz. All rights reserved.
;;; Redistribution and use in source and binary forms, with or without
;;; modification, are permitted provided that the following conditions
@@ -52,7 +52,7 @@
multi-line-mode
single-line-mode
extended-mode)
- (declare #.*standard-optimize-settings*)
+ (declare #.ppcre::*standard-optimize-settings*)
"Auxiliary function used by TEST to benchmark a regex scanner
against Perl timings."
(declare (type string string))
@@ -73,7 +73,7 @@
lispworks
(and sbcl sb-thread))
(defun threaded-scan (scanner target-string &key (threads 10) (repetitions 5000))
- (declare #.*standard-optimize-settings*)
+ (declare #.ppcre::*standard-optimize-settings*)
"Auxiliary function used by TEST to check whether SCANNER is thread-safe."
(full-gc)
(let ((collector (make-array threads))
@@ -133,7 +133,7 @@
:defaults *cl-ppcre-test-base-directory*)
file-name-provided-p)
threaded)
- (declare #.*standard-optimize-settings*)
+ (declare #.ppcre::*standard-optimize-settings*)
(declare (ignorable threaded))
"Loop through all test cases in FILE-NAME and print report. Only in
LispWorks and SCL: If THREADED is true, also test whether the scanners
Modified: branches/grin-neu/thirdparty/cl-ppcre/regex-class.lisp
===================================================================
--- branches/grin-neu/thirdparty/cl-ppcre/regex-class.lisp 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/cl-ppcre/regex-class.lisp 2006-12-01 10:39:49 UTC (rev 2094)
@@ -1,11 +1,11 @@
;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-PPCRE; Base: 10 -*-
-;;; $Header: /usr/local/cvsrep/cl-ppcre/regex-class.lisp,v 1.26 2005/06/10 10:23:42 edi Exp $
+;;; $Header: /usr/local/cvsrep/cl-ppcre/regex-class.lisp,v 1.30 2006/10/12 06:24:41 edi Exp $
;;; This file defines the REGEX class and some utility methods for
;;; this class. REGEX objects are used to represent the (transformed)
;;; parse trees internally
-;;; Copyright (c) 2002-2005, Dr. Edmund Weitz. All rights reserved.
+;;; Copyright (c) 2002-2006, Dr. Edmund Weitz. All rights reserved.
;;; Redistribution and use in source and binary forms, with or without
;;; modification, are permitted provided that the following conditions
@@ -265,9 +265,6 @@
(slot-value char-class 'invertedp)
(not (slot-value char-class 'invertedp))))))
-;;; The following four methods allow a VOID object to behave like a
-;;; zero-length STR object (only readers needed)
-
(defmethod initialize-instance :after ((str str) &rest init-args)
(declare #.*standard-optimize-settings*)
(declare (ignore init-args))
@@ -277,6 +274,9 @@
(setf (slot-value str 'str) (coerce str-slot 'simple-string))))
(setf (len str) (length (str str))))
+;;; The following four methods allow a VOID object to behave like a
+;;; zero-length STR object (only readers needed)
+
(defmethod len ((void void))
(declare #.*standard-optimize-settings*)
0)
@@ -301,6 +301,7 @@
which are not of type STR."))
(defmethod case-mode ((str str) old-case-mode)
+ (declare #.*standard-optimize-settings*)
(cond ((zerop (len str))
old-case-mode)
((case-insensitive-p str)
@@ -309,6 +310,7 @@
:case-sensitive)))
(defmethod case-mode ((regex regex) old-case-mode)
+ (declare #.*standard-optimize-settings*)
(declare (ignore old-case-mode))
nil)
@@ -317,37 +319,45 @@
(:documentation "Implements a deep copy of a REGEX object."))
(defmethod copy-regex ((anchor anchor))
+ (declare #.*standard-optimize-settings*)
(make-instance 'anchor
:startp (startp anchor)
:multi-line-p (multi-line-p anchor)
:no-newline-p (no-newline-p anchor)))
(defmethod copy-regex ((everything everything))
+ (declare #.*standard-optimize-settings*)
(make-instance 'everything
:single-line-p (single-line-p everything)))
(defmethod copy-regex ((word-boundary word-boundary))
+ (declare #.*standard-optimize-settings*)
(make-instance 'word-boundary
:negatedp (negatedp word-boundary)))
(defmethod copy-regex ((void void))
+ (declare #.*standard-optimize-settings*)
(make-instance 'void))
(defmethod copy-regex ((lookahead lookahead))
+ (declare #.*standard-optimize-settings*)
(make-instance 'lookahead
:regex (copy-regex (regex lookahead))
:positivep (positivep lookahead)))
(defmethod copy-regex ((seq seq))
+ (declare #.*standard-optimize-settings*)
(make-instance 'seq
:elements (mapcar #'copy-regex (elements seq))))
(defmethod copy-regex ((alternation alternation))
+ (declare #.*standard-optimize-settings*)
(make-instance 'alternation
:choices (mapcar #'copy-regex (choices alternation))))
(defmethod copy-regex ((branch branch))
- (with-slots ((test test))
+ (declare #.*standard-optimize-settings*)
+ (with-slots (test)
branch
(make-instance 'branch
:test (if (typep test 'regex)
@@ -357,12 +367,14 @@
:else-regex (copy-regex (else-regex branch)))))
(defmethod copy-regex ((lookbehind lookbehind))
+ (declare #.*standard-optimize-settings*)
(make-instance 'lookbehind
:regex (copy-regex (regex lookbehind))
:positivep (positivep lookbehind)
:len (len lookbehind)))
(defmethod copy-regex ((repetition repetition))
+ (declare #.*standard-optimize-settings*)
(make-instance 'repetition
:regex (copy-regex (regex repetition))
:greedyp (greedyp repetition)
@@ -373,20 +385,24 @@
:contains-register-p (contains-register-p repetition)))
(defmethod copy-regex ((register register))
+ (declare #.*standard-optimize-settings*)
(make-instance 'register
:regex (copy-regex (regex register))
:num (num register)))
(defmethod copy-regex ((standalone standalone))
+ (declare #.*standard-optimize-settings*)
(make-instance 'standalone
:regex (copy-regex (regex standalone))))
(defmethod copy-regex ((back-reference back-reference))
+ (declare #.*standard-optimize-settings*)
(make-instance 'back-reference
:num (num back-reference)
:case-insensitive-p (case-insensitive-p back-reference)))
(defmethod copy-regex ((char-class char-class))
+ (declare #.*standard-optimize-settings*)
(make-instance 'char-class
:hash (hash char-class)
:case-insensitive-p (case-insensitive-p char-class)
@@ -394,11 +410,13 @@
:word-char-class-p (word-char-class-p char-class)))
(defmethod copy-regex ((str str))
+ (declare #.*standard-optimize-settings*)
(make-instance 'str
:str (str str)
:case-insensitive-p (case-insensitive-p str)))
(defmethod copy-regex ((filter filter))
+ (declare #.*standard-optimize-settings*)
(make-instance 'filter
:fn (fn filter)
:len (len filter)))
@@ -420,6 +438,7 @@
special variable REMOVE-REGISTERS-P is true."))
(defmethod remove-registers ((register register))
+ (declare #.*standard-optimize-settings*)
(declare (special remove-registers-p reg-seen))
(cond (remove-registers-p
(remove-registers (regex register)))
@@ -430,6 +449,7 @@
(copy-regex register))))
(defmethod remove-registers ((repetition repetition))
+ (declare #.*standard-optimize-settings*)
(let* (reg-seen
(inner-regex (remove-registers (regex repetition))))
;; REMOVE-REGISTERS will set REG-SEEN (see method above) if
@@ -445,22 +465,26 @@
:contains-register-p reg-seen)))
(defmethod remove-registers ((standalone standalone))
+ (declare #.*standard-optimize-settings*)
(make-instance 'standalone
:regex (remove-registers (regex standalone))))
(defmethod remove-registers ((lookahead lookahead))
+ (declare #.*standard-optimize-settings*)
(make-instance 'lookahead
:regex (remove-registers (regex lookahead))
:positivep (positivep lookahead)))
(defmethod remove-registers ((lookbehind lookbehind))
+ (declare #.*standard-optimize-settings*)
(make-instance 'lookbehind
:regex (remove-registers (regex lookbehind))
:positivep (positivep lookbehind)
:len (len lookbehind)))
(defmethod remove-registers ((branch branch))
- (with-slots ((test test))
+ (declare #.*standard-optimize-settings*)
+ (with-slots (test)
branch
(make-instance 'branch
:test (if (typep test 'regex)
@@ -470,15 +494,18 @@
:else-regex (remove-registers (else-regex branch)))))
(defmethod remove-registers ((alternation alternation))
+ (declare #.*standard-optimize-settings*)
(declare (special remove-registers-p))
;; an ALTERNATION, so we can't remove REGISTER objects further down
(setq remove-registers-p nil)
(copy-regex alternation))
(defmethod remove-registers ((regex regex))
+ (declare #.*standard-optimize-settings*)
(copy-regex regex))
(defmethod remove-registers ((seq seq))
+ (declare #.*standard-optimize-settings*)
(make-instance 'seq
:elements (mapcar #'remove-registers (elements seq))))
@@ -489,6 +516,7 @@
(i.e. the object corresponding to \".\", for example."))
(defmethod everythingp ((seq seq))
+ (declare #.*standard-optimize-settings*)
;; we might have degenerate cases like (:SEQUENCE :VOID ...)
;; due to the parsing process
(let ((cleaned-elements (remove-if #'(lambda (element)
@@ -498,7 +526,8 @@
(everythingp (first cleaned-elements)))))
(defmethod everythingp ((alternation alternation))
- (with-slots ((choices choices))
+ (declare #.*standard-optimize-settings*)
+ (with-slots (choices)
alternation
(and (= 1 (length choices))
;; this is unlikely to happen for human-generated regexes,
@@ -506,9 +535,8 @@
(everythingp (first choices)))))
(defmethod everythingp ((repetition repetition))
- (with-slots ((maximum maximum)
- (minimum minimum)
- (regex regex))
+ (declare #.*standard-optimize-settings*)
+ (with-slots (maximum minimum regex)
repetition
(and maximum
(= 1 minimum maximum)
@@ -516,15 +544,19 @@
(everythingp regex))))
(defmethod everythingp ((register register))
+ (declare #.*standard-optimize-settings*)
(everythingp (regex register)))
(defmethod everythingp ((standalone standalone))
+ (declare #.*standard-optimize-settings*)
(everythingp (regex standalone)))
(defmethod everythingp ((everything everything))
+ (declare #.*standard-optimize-settings*)
everything)
(defmethod everythingp ((regex regex))
+ (declare #.*standard-optimize-settings*)
;; the general case for ANCHOR, BACK-REFERENCE, BRANCH, CHAR-CLASS,
;; LOOKAHEAD, LOOKBEHIND, STR, VOID, FILTER, and WORD-BOUNDARY
nil)
@@ -534,6 +566,7 @@
(:documentation "Return the length of REGEX if it is fixed, NIL otherwise."))
(defmethod regex-length ((seq seq))
+ (declare #.*standard-optimize-settings*)
;; simply add all inner lengths unless one of them is NIL
(loop for sub-regex in (elements seq)
for len = (regex-length sub-regex)
@@ -541,6 +574,7 @@
sum len))
(defmethod regex-length ((alternation alternation))
+ (declare #.*standard-optimize-settings*)
;; only return a true value if all inner lengths are non-NIL and
;; mutually equal
(loop for sub-regex in (choices alternation)
@@ -551,6 +585,7 @@
finally (return len)))
(defmethod regex-length ((branch branch))
+ (declare #.*standard-optimize-settings*)
;; only return a true value if both alternations have a length and
;; if they're equal
(let ((then-length (regex-length (then-regex branch))))
@@ -559,13 +594,12 @@
then-length)))
(defmethod regex-length ((repetition repetition))
+ (declare #.*standard-optimize-settings*)
;; we can only compute the length of a REPETITION object if the
;; number of repetitions is fixed; note that we don't call
;; REGEX-LENGTH for the inner regex, we assume that the LEN slot is
;; always set correctly
- (with-slots ((len len)
- (minimum minimum)
- (maximum maximum))
+ (with-slots (len minimum maximum)
repetition
(if (and len
(eql minimum maximum))
@@ -573,29 +607,37 @@
nil)))
(defmethod regex-length ((register register))
+ (declare #.*standard-optimize-settings*)
(regex-length (regex register)))
(defmethod regex-length ((standalone standalone))
+ (declare #.*standard-optimize-settings*)
(regex-length (regex standalone)))
(defmethod regex-length ((back-reference back-reference))
+ (declare #.*standard-optimize-settings*)
;; with enough effort we could possibly do better here, but
;; currently we just give up and return NIL
nil)
(defmethod regex-length ((char-class char-class))
+ (declare #.*standard-optimize-settings*)
1)
(defmethod regex-length ((everything everything))
+ (declare #.*standard-optimize-settings*)
1)
(defmethod regex-length ((str str))
+ (declare #.*standard-optimize-settings*)
(len str))
(defmethod regex-length ((filter filter))
+ (declare #.*standard-optimize-settings*)
(len filter))
(defmethod regex-length ((regex regex))
+ (declare #.*standard-optimize-settings*)
;; the general case for ANCHOR, LOOKAHEAD, LOOKBEHIND, VOID, and
;; WORD-BOUNDARY (which all have zero-length)
0)
@@ -605,12 +647,14 @@
(:documentation "Returns the minimal length of REGEX."))
(defmethod regex-min-length ((seq seq))
+ (declare #.*standard-optimize-settings*)
;; simply add all inner minimal lengths
(loop for sub-regex in (elements seq)
for len = (regex-min-length sub-regex)
sum len))
(defmethod regex-min-length ((alternation alternation))
+ (declare #.*standard-optimize-settings*)
;; minimal length of an alternation is the minimal length of the
;; "shortest" element
(loop for sub-regex in (choices alternation)
@@ -618,35 +662,44 @@
minimize len))
(defmethod regex-min-length ((branch branch))
+ (declare #.*standard-optimize-settings*)
;; minimal length of both alternations
(min (regex-min-length (then-regex branch))
(regex-min-length (else-regex branch))))
(defmethod regex-min-length ((repetition repetition))
+ (declare #.*standard-optimize-settings*)
;; obviously the product of the inner minimal length and the minimal
;; number of repetitions
(* (minimum repetition) (min-len repetition)))
(defmethod regex-min-length ((register register))
+ (declare #.*standard-optimize-settings*)
(regex-min-length (regex register)))
(defmethod regex-min-length ((standalone standalone))
+ (declare #.*standard-optimize-settings*)
(regex-min-length (regex standalone)))
(defmethod regex-min-length ((char-class char-class))
+ (declare #.*standard-optimize-settings*)
1)
(defmethod regex-min-length ((everything everything))
+ (declare #.*standard-optimize-settings*)
1)
(defmethod regex-min-length ((str str))
+ (declare #.*standard-optimize-settings*)
(len str))
(defmethod regex-min-length ((filter filter))
+ (declare #.*standard-optimize-settings*)
(or (len filter)
0))
(defmethod regex-min-length ((regex regex))
+ (declare #.*standard-optimize-settings*)
;; the general case for ANCHOR, BACK-REFERENCE, LOOKAHEAD,
;; LOOKBEHIND, VOID, and WORD-BOUNDARY
0)
@@ -664,6 +717,7 @@
;; into repetitions
(defmethod compute-offsets ((seq seq) start-pos)
+ (declare #.*standard-optimize-settings*)
(loop for element in (elements seq)
;; advance offset argument for next call while looping through
;; the elements
@@ -673,6 +727,7 @@
finally (return curr-offset)))
(defmethod compute-offsets ((alternation alternation) start-pos)
+ (declare #.*standard-optimize-settings*)
(loop for choice in (choices alternation)
for old-offset = nil then curr-offset
for curr-offset = (compute-offsets choice start-pos)
@@ -684,6 +739,7 @@
finally (return curr-offset)))
(defmethod compute-offsets ((branch branch) start-pos)
+ (declare #.*standard-optimize-settings*)
;; only return offset if both alternations have equal value
(let ((then-offset (compute-offsets (then-regex branch) start-pos)))
(and then-offset
@@ -691,10 +747,9 @@
then-offset)))
(defmethod compute-offsets ((repetition repetition) start-pos)
+ (declare #.*standard-optimize-settings*)
;; no need to descend into the inner regex
- (with-slots ((len len)
- (minimum minimum)
- (maximum maximum))
+ (with-slots (len minimum maximum)
repetition
(if (and len
(eq minimum maximum))
@@ -704,34 +759,42 @@
nil)))
(defmethod compute-offsets ((register register) start-pos)
+ (declare #.*standard-optimize-settings*)
(compute-offsets (regex register) start-pos))
(defmethod compute-offsets ((standalone standalone) start-pos)
+ (declare #.*standard-optimize-settings*)
(compute-offsets (regex standalone) start-pos))
(defmethod compute-offsets ((char-class char-class) start-pos)
+ (declare #.*standard-optimize-settings*)
(1+ start-pos))
(defmethod compute-offsets ((everything everything) start-pos)
+ (declare #.*standard-optimize-settings*)
(1+ start-pos))
(defmethod compute-offsets ((str str) start-pos)
+ (declare #.*standard-optimize-settings*)
(setf (offset str) start-pos)
(+ start-pos (len str)))
(defmethod compute-offsets ((back-reference back-reference) start-pos)
+ (declare #.*standard-optimize-settings*)
;; with enough effort we could possibly do better here, but
;; currently we just give up and return NIL
(declare (ignore start-pos))
nil)
(defmethod compute-offsets ((filter filter) start-pos)
+ (declare #.*standard-optimize-settings*)
(let ((len (len filter)))
(if len
(+ start-pos len)
nil)))
(defmethod compute-offsets ((regex regex) start-pos)
+ (declare #.*standard-optimize-settings*)
;; the general case for ANCHOR, LOOKAHEAD, LOOKBEHIND, VOID, and
;; WORD-BOUNDARY (which all have zero-length)
start-pos)
Modified: branches/grin-neu/thirdparty/cl-ppcre/repetition-closures.lisp
===================================================================
--- branches/grin-neu/thirdparty/cl-ppcre/repetition-closures.lisp 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/cl-ppcre/repetition-closures.lisp 2006-12-01 10:39:49 UTC (rev 2094)
@@ -1,5 +1,5 @@
;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-PPCRE; Base: 10 -*-
-;;; $Header: /usr/local/cvsrep/cl-ppcre/repetition-closures.lisp,v 1.24 2005/04/13 15:35:58 edi Exp $
+;;; $Header: /usr/local/cvsrep/cl-ppcre/repetition-closures.lisp,v 1.27 2006/10/11 14:56:34 edi Exp $
;;; This is actually a part of closures.lisp which we put into a
;;; separate file because it is rather complex. We only deal with
@@ -7,7 +7,7 @@
;;; rather crazy micro-optimizations which were introduced to be as
;;; competitive with Perl as possible in tight loops.
-;;; Copyright (c) 2002-2005, Dr. Edmund Weitz. All rights reserved.
+;;; Copyright (c) 2002-2006, Dr. Edmund Weitz. All rights reserved.
;;; Redistribution and use in source and binary forms, with or without
;;; modification, are permitted provided that the following conditions
@@ -804,45 +804,41 @@
;; utilizes all the functions and macros defined above
(defmethod create-matcher-aux ((repetition repetition) next-fn)
- (with-slots ((minimum minimum)
- (maximum maximum)
- (len len)
- (min-len min-len)
- (greedyp greedyp)
- (contains-register-p contains-register-p))
+ (declare #.*standard-optimize-settings*)
+ (with-slots (minimum maximum len min-len greedyp contains-register-p)
repetition
(cond ((and maximum
(zerop maximum))
- ;; this should have been optimized away by CONVERT but just
- ;; in case...
- (error "Got REPETITION with MAXIMUM 0 \(should not happen)"))
+ ;; this should have been optimized away by CONVERT but just
+ ;; in case...
+ (error "Got REPETITION with MAXIMUM 0 \(should not happen)"))
((and maximum
(= minimum maximum 1))
- ;; this should have been optimized away by CONVERT but just
- ;; in case...
- (error "Got REPETITION with MAXIMUM 1 and MINIMUM 1 \(should not happen)"))
+ ;; this should have been optimized away by CONVERT but just
+ ;; in case...
+ (error "Got REPETITION with MAXIMUM 1 and MINIMUM 1 \(should not happen)"))
((and (eql minimum maximum)
len
(not contains-register-p))
- (create-constant-repetition-constant-length-matcher repetition next-fn))
+ (create-constant-repetition-constant-length-matcher repetition next-fn))
((eql minimum maximum)
- (create-constant-repetition-matcher repetition next-fn))
+ (create-constant-repetition-matcher repetition next-fn))
((and greedyp
len
(not contains-register-p))
- (create-greedy-constant-length-matcher repetition next-fn))
+ (create-greedy-constant-length-matcher repetition next-fn))
((and greedyp
(or (plusp min-len)
(eql maximum 1)))
- (create-greedy-no-zero-matcher repetition next-fn))
+ (create-greedy-no-zero-matcher repetition next-fn))
(greedyp
- (create-greedy-matcher repetition next-fn))
+ (create-greedy-matcher repetition next-fn))
((and len
(plusp len)
(not contains-register-p))
- (create-non-greedy-constant-length-matcher repetition next-fn))
+ (create-non-greedy-constant-length-matcher repetition next-fn))
((or (plusp min-len)
(eql maximum 1))
- (create-non-greedy-no-zero-matcher repetition next-fn))
+ (create-non-greedy-no-zero-matcher repetition next-fn))
(t
- (create-non-greedy-matcher repetition next-fn)))))
+ (create-non-greedy-matcher repetition next-fn)))))
Modified: branches/grin-neu/thirdparty/cl-ppcre/scanner.lisp
===================================================================
--- branches/grin-neu/thirdparty/cl-ppcre/scanner.lisp 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/cl-ppcre/scanner.lisp 2006-12-01 10:39:49 UTC (rev 2094)
@@ -1,10 +1,10 @@
;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-PPCRE; Base: 10 -*-
-;;; $Header: /usr/local/cvsrep/cl-ppcre/scanner.lisp,v 1.26 2005/07/19 23:18:15 edi Exp $
+;;; $Header: /usr/local/cvsrep/cl-ppcre/scanner.lisp,v 1.27 2006/01/03 18:38:55 edi Exp $
;;; Here the scanner for the actual regex as well as utility scanners
;;; for the constant start and end strings are created.
-;;; Copyright (c) 2002-2005, Dr. Edmund Weitz. All rights reserved.
+;;; Copyright (c) 2002-2006, Dr. Edmund Weitz. All rights reserved.
;;; Redistribution and use in source and binary forms, with or without
;;; modification, are permitted provided that the following conditions
Modified: branches/grin-neu/thirdparty/cl-ppcre/specials.lisp
===================================================================
--- branches/grin-neu/thirdparty/cl-ppcre/specials.lisp 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/cl-ppcre/specials.lisp 2006-12-01 10:39:49 UTC (rev 2094)
@@ -1,9 +1,9 @@
;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-PPCRE; Base: 10 -*-
-;;; $Header: /usr/local/cvsrep/cl-ppcre/specials.lisp,v 1.21 2005/04/01 21:29:10 edi Exp $
+;;; $Header: /usr/local/cvsrep/cl-ppcre/specials.lisp,v 1.23 2006/08/10 14:45:24 edi Exp $
;;; globally declared special variables
-;;; Copyright (c) 2002-2005, Dr. Edmund Weitz. All rights reserved.
+;;; Copyright (c) 2002-2006, Dr. Edmund Weitz. All rights reserved.
;;; Redistribution and use in source and binary forms, with or without
;;; modification, are permitted provided that the following conditions
@@ -45,7 +45,7 @@
(defvar *special-optimize-settings*
'(optimize speed space)
- "Special optimize settings used only be a few declaration expressions.")
+ "Special optimize settings used only by a few declaration expressions.")
;;; special variables used by the lexer/parser combo
@@ -125,6 +125,7 @@
;; stuff for Nikodemus Siivola's HYPERDOC
;; see <http://common-lisp.net/project/hyperdoc/>
;; and <http://www.cliki.net/hyperdoc>
+;; also used by LW-ADD-ONS
(defvar *hyperdoc-base-uri* "http://weitz.de/cl-ppcre/")
Deleted: branches/grin-neu/thirdparty/cl-ppcre/testdata
===================================================================
--- branches/grin-neu/thirdparty/cl-ppcre/testdata 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/cl-ppcre/testdata 2006-12-01 10:39:49 UTC (rev 2094)
@@ -1,14287 +0,0 @@
-(1 "\"the quick brown fox\" =~ /the quick brown fox/" "the quick brown fox" nil nil nil nil "the quick brown fox" nil 1 0 "the quick brown fox" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(2 "\"The quick brown FOX\" =~ /the quick brown fox/" "the quick brown fox" nil nil nil nil "The quick brown FOX" nil 1 0 nil nil)
-(3 "\"What do you know about the quick brown fox?\" =~ /the quick brown fox/" "the quick brown fox" nil nil nil nil "What do you know about the quick brown fox?" nil 1 0 "the quick brown fox" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(4 "\"What do you know about THE QUICK BROWN FOX?\" =~ /the quick brown fox/" "the quick brown fox" nil nil nil nil "What do you know about THE QUICK BROWN FOX?" nil 1 0 nil nil)
-(5 "\"the quick brown fox\" =~ /The quick brown fox/i" "The quick brown fox" t nil nil nil "the quick brown fox" nil 1 0 "the quick brown fox" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(6 "\"The quick brown FOX\" =~ /The quick brown fox/i" "The quick brown fox" t nil nil nil "The quick brown FOX" nil 1 0 "The quick brown FOX" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(7 "\"What do you know about the quick brown fox?\" =~ /The quick brown fox/i" "The quick brown fox" t nil nil nil "What do you know about the quick brown fox?" nil 1 0 "the quick brown fox" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(8 "\"What do you know about THE QUICK BROWN FOX?\" =~ /The quick brown fox/i" "The quick brown fox" t nil nil nil "What do you know about THE QUICK BROWN FOX?" nil 1 0 "THE QUICK BROWN FOX" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(9 "\"abcd\\t\\n\\r\\f\\a\\e9;\\$\\\\?caxyz\" =~ /abcd\\t\\n\\r\\f\\a\\e\\071\\x3b\\$\\\\\\?caxyz/" "abcd\\t\\n\\r\\f\\a\\e\\071\\x3b\\$\\\\\\?caxyz" nil nil nil nil ("abcd" 9 10 13 12 7 27 "9;$\\?caxyz") nil 1 0 ("abcd" 9 10 13 12 7 27 "9;$\\?caxyz") (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(10 "\"abxyzpqrrrabbxyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "abxyzpqrrrabbxyyyypqAzz" nil 1 0 "abxyzpqrrrabbxyyyypqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(11 "\"abxyzpqrrrabbxyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "abxyzpqrrrabbxyyyypqAzz" nil 1 0 "abxyzpqrrrabbxyyyypqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(12 "\"aabxyzpqrrrabbxyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "aabxyzpqrrrabbxyyyypqAzz" nil 1 0 "aabxyzpqrrrabbxyyyypqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(13 "\"aaabxyzpqrrrabbxyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "aaabxyzpqrrrabbxyyyypqAzz" nil 1 0 "aaabxyzpqrrrabbxyyyypqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(14 "\"aaaabxyzpqrrrabbxyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "aaaabxyzpqrrrabbxyyyypqAzz" nil 1 0 "aaaabxyzpqrrrabbxyyyypqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(15 "\"abcxyzpqrrrabbxyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "abcxyzpqrrrabbxyyyypqAzz" nil 1 0 "abcxyzpqrrrabbxyyyypqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(16 "\"aabcxyzpqrrrabbxyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "aabcxyzpqrrrabbxyyyypqAzz" nil 1 0 "aabcxyzpqrrrabbxyyyypqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(17 "\"aaabcxyzpqrrrabbxyyyypAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "aaabcxyzpqrrrabbxyyyypAzz" nil 1 0 "aaabcxyzpqrrrabbxyyyypAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(18 "\"aaabcxyzpqrrrabbxyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "aaabcxyzpqrrrabbxyyyypqAzz" nil 1 0 "aaabcxyzpqrrrabbxyyyypqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(19 "\"aaabcxyzpqrrrabbxyyyypqqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "aaabcxyzpqrrrabbxyyyypqqAzz" nil 1 0 "aaabcxyzpqrrrabbxyyyypqqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(20 "\"aaabcxyzpqrrrabbxyyyypqqqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "aaabcxyzpqrrrabbxyyyypqqqAzz" nil 1 0 "aaabcxyzpqrrrabbxyyyypqqqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(21 "\"aaabcxyzpqrrrabbxyyyypqqqqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "aaabcxyzpqrrrabbxyyyypqqqqAzz" nil 1 0 "aaabcxyzpqrrrabbxyyyypqqqqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(22 "\"aaabcxyzpqrrrabbxyyyypqqqqqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "aaabcxyzpqrrrabbxyyyypqqqqqAzz" nil 1 0 "aaabcxyzpqrrrabbxyyyypqqqqqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(23 "\"aaabcxyzpqrrrabbxyyyypqqqqqqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "aaabcxyzpqrrrabbxyyyypqqqqqqAzz" nil 1 0 "aaabcxyzpqrrrabbxyyyypqqqqqqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(24 "\"aaaabcxyzpqrrrabbxyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "aaaabcxyzpqrrrabbxyyyypqAzz" nil 1 0 "aaaabcxyzpqrrrabbxyyyypqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(25 "\"abxyzzpqrrrabbxyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "abxyzzpqrrrabbxyyyypqAzz" nil 1 0 "abxyzzpqrrrabbxyyyypqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(26 "\"aabxyzzzpqrrrabbxyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "aabxyzzzpqrrrabbxyyyypqAzz" nil 1 0 "aabxyzzzpqrrrabbxyyyypqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(27 "\"aaabxyzzzzpqrrrabbxyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "aaabxyzzzzpqrrrabbxyyyypqAzz" nil 1 0 "aaabxyzzzzpqrrrabbxyyyypqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(28 "\"aaaabxyzzzzpqrrrabbxyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "aaaabxyzzzzpqrrrabbxyyyypqAzz" nil 1 0 "aaaabxyzzzzpqrrrabbxyyyypqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(29 "\"abcxyzzpqrrrabbxyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "abcxyzzpqrrrabbxyyyypqAzz" nil 1 0 "abcxyzzpqrrrabbxyyyypqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(30 "\"aabcxyzzzpqrrrabbxyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "aabcxyzzzpqrrrabbxyyyypqAzz" nil 1 0 "aabcxyzzzpqrrrabbxyyyypqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(31 "\"aaabcxyzzzzpqrrrabbxyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "aaabcxyzzzzpqrrrabbxyyyypqAzz" nil 1 0 "aaabcxyzzzzpqrrrabbxyyyypqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(32 "\"aaaabcxyzzzzpqrrrabbxyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "aaaabcxyzzzzpqrrrabbxyyyypqAzz" nil 1 0 "aaaabcxyzzzzpqrrrabbxyyyypqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(33 "\"aaaabcxyzzzzpqrrrabbbxyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "aaaabcxyzzzzpqrrrabbbxyyyypqAzz" nil 1 0 "aaaabcxyzzzzpqrrrabbbxyyyypqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(34 "\"aaaabcxyzzzzpqrrrabbbxyyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "aaaabcxyzzzzpqrrrabbbxyyyyypqAzz" nil 1 0 "aaaabcxyzzzzpqrrrabbbxyyyyypqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(35 "\"aaabcxyzpqrrrabbxyyyypABzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "aaabcxyzpqrrrabbxyyyypABzz" nil 1 0 "aaabcxyzpqrrrabbxyyyypABzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(36 "\"aaabcxyzpqrrrabbxyyyypABBzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "aaabcxyzpqrrrabbxyyyypABBzz" nil 1 0 "aaabcxyzpqrrrabbxyyyypABBzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(37 "\">>>aaabxyzpqrrrabbxyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil ">>>aaabxyzpqrrrabbxyyyypqAzz" nil 1 0 "aaabxyzpqrrrabbxyyyypqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(38 "\">aaaabxyzpqrrrabbxyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil ">aaaabxyzpqrrrabbxyyyypqAzz" nil 1 0 "aaaabxyzpqrrrabbxyyyypqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(39 "\">>>>abcxyzpqrrrabbxyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil ">>>>abcxyzpqrrrabbxyyyypqAzz" nil 1 0 "abcxyzpqrrrabbxyyyypqAzz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(40 "\"abxyzpqrrabbxyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "abxyzpqrrabbxyyyypqAzz" nil 1 0 nil nil)
-(41 "\"abxyzpqrrrrabbxyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "abxyzpqrrrrabbxyyyypqAzz" nil 1 0 nil nil)
-(42 "\"abxyzpqrrrabxyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "abxyzpqrrrabxyyyypqAzz" nil 1 0 nil nil)
-(43 "\"aaaabcxyzzzzpqrrrabbbxyyyyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "aaaabcxyzzzzpqrrrabbbxyyyyyypqAzz" nil 1 0 nil nil)
-(44 "\"aaaabcxyzzzzpqrrrabbbxyyypqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "aaaabcxyzzzzpqrrrabbbxyyypqAzz" nil 1 0 nil nil)
-(45 "\"aaabcxyzpqrrrabbxyyyypqqqqqqqAzz\" =~ /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/" "a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz" nil nil nil nil "aaabcxyzpqrrrabbxyyyypqqqqqqqAzz" nil 1 0 nil nil)
-(46 "\"abczz\" =~ /^(abc){1,2}zz/" "^(abc){1,2}zz" nil nil nil nil "abczz" nil 1 0 "abczz" ("abc" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(47 "\"abcabczz\" =~ /^(abc){1,2}zz/" "^(abc){1,2}zz" nil nil nil nil "abcabczz" nil 1 0 "abcabczz" ("abc" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(48 "\"zz\" =~ /^(abc){1,2}zz/" "^(abc){1,2}zz" nil nil nil nil "zz" nil 1 0 nil nil)
-(49 "\"abcabcabczz\" =~ /^(abc){1,2}zz/" "^(abc){1,2}zz" nil nil nil nil "abcabcabczz" nil 1 0 nil nil)
-(50 "\">>abczz\" =~ /^(abc){1,2}zz/" "^(abc){1,2}zz" nil nil nil nil ">>abczz" nil 1 0 nil nil)
-(51 "\"bc\" =~ /^(b+?|a){1,2}?c/" "^(b+?|a){1,2}?c" nil nil nil nil "bc" nil 1 0 "bc" ("b" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(52 "\"bbc\" =~ /^(b+?|a){1,2}?c/" "^(b+?|a){1,2}?c" nil nil nil nil "bbc" nil 1 0 "bbc" ("b" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(53 "\"bbbc\" =~ /^(b+?|a){1,2}?c/" "^(b+?|a){1,2}?c" nil nil nil nil "bbbc" nil 1 0 "bbbc" ("bb" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(54 "\"bac\" =~ /^(b+?|a){1,2}?c/" "^(b+?|a){1,2}?c" nil nil nil nil "bac" nil 1 0 "bac" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(55 "\"bbac\" =~ /^(b+?|a){1,2}?c/" "^(b+?|a){1,2}?c" nil nil nil nil "bbac" nil 1 0 "bbac" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(56 "\"aac\" =~ /^(b+?|a){1,2}?c/" "^(b+?|a){1,2}?c" nil nil nil nil "aac" nil 1 0 "aac" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(57 "\"abbbbbbbbbbbc\" =~ /^(b+?|a){1,2}?c/" "^(b+?|a){1,2}?c" nil nil nil nil "abbbbbbbbbbbc" nil 1 0 "abbbbbbbbbbbc" ("bbbbbbbbbbb" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(58 "\"bbbbbbbbbbbac\" =~ /^(b+?|a){1,2}?c/" "^(b+?|a){1,2}?c" nil nil nil nil "bbbbbbbbbbbac" nil 1 0 "bbbbbbbbbbbac" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(59 "\"aaac\" =~ /^(b+?|a){1,2}?c/" "^(b+?|a){1,2}?c" nil nil nil nil "aaac" nil 1 0 nil nil)
-(60 "\"abbbbbbbbbbbac\" =~ /^(b+?|a){1,2}?c/" "^(b+?|a){1,2}?c" nil nil nil nil "abbbbbbbbbbbac" nil 1 0 nil nil)
-(61 "\"bc\" =~ /^(b+|a){1,2}c/" "^(b+|a){1,2}c" nil nil nil nil "bc" nil 1 0 "bc" ("b" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(62 "\"bbc\" =~ /^(b+|a){1,2}c/" "^(b+|a){1,2}c" nil nil nil nil "bbc" nil 1 0 "bbc" ("bb" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(63 "\"bbbc\" =~ /^(b+|a){1,2}c/" "^(b+|a){1,2}c" nil nil nil nil "bbbc" nil 1 0 "bbbc" ("bbb" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(64 "\"bac\" =~ /^(b+|a){1,2}c/" "^(b+|a){1,2}c" nil nil nil nil "bac" nil 1 0 "bac" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(65 "\"bbac\" =~ /^(b+|a){1,2}c/" "^(b+|a){1,2}c" nil nil nil nil "bbac" nil 1 0 "bbac" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(66 "\"aac\" =~ /^(b+|a){1,2}c/" "^(b+|a){1,2}c" nil nil nil nil "aac" nil 1 0 "aac" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(67 "\"abbbbbbbbbbbc\" =~ /^(b+|a){1,2}c/" "^(b+|a){1,2}c" nil nil nil nil "abbbbbbbbbbbc" nil 1 0 "abbbbbbbbbbbc" ("bbbbbbbbbbb" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(68 "\"bbbbbbbbbbbac\" =~ /^(b+|a){1,2}c/" "^(b+|a){1,2}c" nil nil nil nil "bbbbbbbbbbbac" nil 1 0 "bbbbbbbbbbbac" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(69 "\"aaac\" =~ /^(b+|a){1,2}c/" "^(b+|a){1,2}c" nil nil nil nil "aaac" nil 1 0 nil nil)
-(70 "\"abbbbbbbbbbbac\" =~ /^(b+|a){1,2}c/" "^(b+|a){1,2}c" nil nil nil nil "abbbbbbbbbbbac" nil 1 0 nil nil)
-(71 "\"bbc\" =~ /^(b+|a){1,2}?bc/" "^(b+|a){1,2}?bc" nil nil nil nil "bbc" nil 1 0 "bbc" ("b" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(72 "\"babc\" =~ /^(b*|ba){1,2}?bc/" "^(b*|ba){1,2}?bc" nil nil nil nil "babc" nil 1 0 "babc" ("ba" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(73 "\"bbabc\" =~ /^(b*|ba){1,2}?bc/" "^(b*|ba){1,2}?bc" nil nil nil nil "bbabc" nil 1 0 "bbabc" ("ba" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(74 "\"bababc\" =~ /^(b*|ba){1,2}?bc/" "^(b*|ba){1,2}?bc" nil nil nil nil "bababc" nil 1 0 "bababc" ("ba" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(75 "\"bababbc\" =~ /^(b*|ba){1,2}?bc/" "^(b*|ba){1,2}?bc" nil nil nil nil "bababbc" nil 1 0 nil nil)
-(76 "\"babababc\" =~ /^(b*|ba){1,2}?bc/" "^(b*|ba){1,2}?bc" nil nil nil nil "babababc" nil 1 0 nil nil)
-(77 "\"babc\" =~ /^(ba|b*){1,2}?bc/" "^(ba|b*){1,2}?bc" nil nil nil nil "babc" nil 1 0 "babc" ("ba" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(78 "\"bbabc\" =~ /^(ba|b*){1,2}?bc/" "^(ba|b*){1,2}?bc" nil nil nil nil "bbabc" nil 1 0 "bbabc" ("ba" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(79 "\"bababc\" =~ /^(ba|b*){1,2}?bc/" "^(ba|b*){1,2}?bc" nil nil nil nil "bababc" nil 1 0 "bababc" ("ba" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(80 "\"bababbc\" =~ /^(ba|b*){1,2}?bc/" "^(ba|b*){1,2}?bc" nil nil nil nil "bababbc" nil 1 0 nil nil)
-(81 "\"babababc\" =~ /^(ba|b*){1,2}?bc/" "^(ba|b*){1,2}?bc" nil nil nil nil "babababc" nil 1 0 nil nil)
-(82 "\"\\x01\\x01\\e;z\" =~ /^\\ca\\cA\\c[\\c{\\c:/" "^\\ca\\cA\\c[\\c{\\c:" nil nil nil nil ("" 1 1 27 ";z") nil 1 0 ("" 1 1 27 ";z") (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(83 "\"athing\" =~ /^[ab\\]cde]/" "^[ab\\]cde]" nil nil nil nil "athing" nil 1 0 "a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(84 "\"bthing\" =~ /^[ab\\]cde]/" "^[ab\\]cde]" nil nil nil nil "bthing" nil 1 0 "b" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(85 "\"]thing\" =~ /^[ab\\]cde]/" "^[ab\\]cde]" nil nil nil nil "]thing" nil 1 0 "]" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(86 "\"cthing\" =~ /^[ab\\]cde]/" "^[ab\\]cde]" nil nil nil nil "cthing" nil 1 0 "c" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(87 "\"dthing\" =~ /^[ab\\]cde]/" "^[ab\\]cde]" nil nil nil nil "dthing" nil 1 0 "d" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(88 "\"ething\" =~ /^[ab\\]cde]/" "^[ab\\]cde]" nil nil nil nil "ething" nil 1 0 "e" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(89 "\"fthing\" =~ /^[ab\\]cde]/" "^[ab\\]cde]" nil nil nil nil "fthing" nil 1 0 nil nil)
-(90 "\"[thing\" =~ /^[ab\\]cde]/" "^[ab\\]cde]" nil nil nil nil "[thing" nil 1 0 nil nil)
-(91 "\"\\\\thing\" =~ /^[ab\\]cde]/" "^[ab\\]cde]" nil nil nil nil "\\thing" nil 1 0 nil nil)
-(92 "\"]thing\" =~ /^[]cde]/" "^[]cde]" nil nil nil nil "]thing" nil 1 0 "]" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(93 "\"cthing\" =~ /^[]cde]/" "^[]cde]" nil nil nil nil "cthing" nil 1 0 "c" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(94 "\"dthing\" =~ /^[]cde]/" "^[]cde]" nil nil nil nil "dthing" nil 1 0 "d" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(95 "\"ething\" =~ /^[]cde]/" "^[]cde]" nil nil nil nil "ething" nil 1 0 "e" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(96 "\"athing\" =~ /^[]cde]/" "^[]cde]" nil nil nil nil "athing" nil 1 0 nil nil)
-(97 "\"fthing\" =~ /^[]cde]/" "^[]cde]" nil nil nil nil "fthing" nil 1 0 nil nil)
-(98 "\"fthing\" =~ /^[^ab\\]cde]/" "^[^ab\\]cde]" nil nil nil nil "fthing" nil 1 0 "f" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(99 "\"[thing\" =~ /^[^ab\\]cde]/" "^[^ab\\]cde]" nil nil nil nil "[thing" nil 1 0 "[" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(100 "\"\\\\thing\" =~ /^[^ab\\]cde]/" "^[^ab\\]cde]" nil nil nil nil "\\thing" nil 1 0 "\\" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(101 "\"athing\" =~ /^[^ab\\]cde]/" "^[^ab\\]cde]" nil nil nil nil "athing" nil 1 0 nil nil)
-(102 "\"bthing\" =~ /^[^ab\\]cde]/" "^[^ab\\]cde]" nil nil nil nil "bthing" nil 1 0 nil nil)
-(103 "\"]thing\" =~ /^[^ab\\]cde]/" "^[^ab\\]cde]" nil nil nil nil "]thing" nil 1 0 nil nil)
-(104 "\"cthing\" =~ /^[^ab\\]cde]/" "^[^ab\\]cde]" nil nil nil nil "cthing" nil 1 0 nil nil)
-(105 "\"dthing\" =~ /^[^ab\\]cde]/" "^[^ab\\]cde]" nil nil nil nil "dthing" nil 1 0 nil nil)
-(106 "\"ething\" =~ /^[^ab\\]cde]/" "^[^ab\\]cde]" nil nil nil nil "ething" nil 1 0 nil nil)
-(107 "\"athing\" =~ /^[^]cde]/" "^[^]cde]" nil nil nil nil "athing" nil 1 0 "a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(108 "\"fthing\" =~ /^[^]cde]/" "^[^]cde]" nil nil nil nil "fthing" nil 1 0 "f" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(109 "\"]thing\" =~ /^[^]cde]/" "^[^]cde]" nil nil nil nil "]thing" nil 1 0 nil nil)
-(110 "\"cthing\" =~ /^[^]cde]/" "^[^]cde]" nil nil nil nil "cthing" nil 1 0 nil nil)
-(111 "\"dthing\" =~ /^[^]cde]/" "^[^]cde]" nil nil nil nil "dthing" nil 1 0 nil nil)
-(112 "\"ething\" =~ /^[^]cde]/" "^[^]cde]" nil nil nil nil "ething" nil 1 0 nil nil)
-(113 ("\"" 129 "\" =~ /^\\" 129 "/") "^\\�" nil nil nil nil ("" 129) nil 1 0 ("" 129) (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(114 ("\"" 255 "\" =~ /^" 255 "/") "^�" nil nil nil nil ("" 255) nil 1 0 ("" 255) (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(115 "\"0\" =~ /^[0-9]+$/" "^[0-9]+$" nil nil nil nil "0" nil 1 0 "0" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(116 "\"1\" =~ /^[0-9]+$/" "^[0-9]+$" nil nil nil nil "1" nil 1 0 "1" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(117 "\"2\" =~ /^[0-9]+$/" "^[0-9]+$" nil nil nil nil "2" nil 1 0 "2" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(118 "\"3\" =~ /^[0-9]+$/" "^[0-9]+$" nil nil nil nil "3" nil 1 0 "3" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(119 "\"4\" =~ /^[0-9]+$/" "^[0-9]+$" nil nil nil nil "4" nil 1 0 "4" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(120 "\"5\" =~ /^[0-9]+$/" "^[0-9]+$" nil nil nil nil "5" nil 1 0 "5" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(121 "\"6\" =~ /^[0-9]+$/" "^[0-9]+$" nil nil nil nil "6" nil 1 0 "6" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(122 "\"7\" =~ /^[0-9]+$/" "^[0-9]+$" nil nil nil nil "7" nil 1 0 "7" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(123 "\"8\" =~ /^[0-9]+$/" "^[0-9]+$" nil nil nil nil "8" nil 1 0 "8" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(124 "\"9\" =~ /^[0-9]+$/" "^[0-9]+$" nil nil nil nil "9" nil 1 0 "9" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(125 "\"10\" =~ /^[0-9]+$/" "^[0-9]+$" nil nil nil nil "10" nil 1 0 "10" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(126 "\"100\" =~ /^[0-9]+$/" "^[0-9]+$" nil nil nil nil "100" nil 1 0 "100" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(127 "\"abc\" =~ /^[0-9]+$/" "^[0-9]+$" nil nil nil nil "abc" nil 1 0 nil nil)
-(128 "\"enter\" =~ /^.*nter/" "^.*nter" nil nil nil nil "enter" nil 1 0 "enter" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(129 "\"inter\" =~ /^.*nter/" "^.*nter" nil nil nil nil "inter" nil 1 0 "inter" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(130 "\"uponter\" =~ /^.*nter/" "^.*nter" nil nil nil nil "uponter" nil 1 0 "uponter" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(131 "\"xxx0\" =~ /^xxx[0-9]+$/" "^xxx[0-9]+$" nil nil nil nil "xxx0" nil 1 0 "xxx0" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(132 "\"xxx1234\" =~ /^xxx[0-9]+$/" "^xxx[0-9]+$" nil nil nil nil "xxx1234" nil 1 0 "xxx1234" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(133 "\"xxx\" =~ /^xxx[0-9]+$/" "^xxx[0-9]+$" nil nil nil nil "xxx" nil 1 0 nil nil)
-(134 "\"x123\" =~ /^.+[0-9][0-9][0-9]$/" "^.+[0-9][0-9][0-9]$" nil nil nil nil "x123" nil 1 0 "x123" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(135 "\"xx123\" =~ /^.+[0-9][0-9][0-9]$/" "^.+[0-9][0-9][0-9]$" nil nil nil nil "xx123" nil 1 0 "xx123" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(136 "\"123456\" =~ /^.+[0-9][0-9][0-9]$/" "^.+[0-9][0-9][0-9]$" nil nil nil nil "123456" nil 1 0 "123456" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(137 "\"123\" =~ /^.+[0-9][0-9][0-9]$/" "^.+[0-9][0-9][0-9]$" nil nil nil nil "123" nil 1 0 nil nil)
-(138 "\"x1234\" =~ /^.+[0-9][0-9][0-9]$/" "^.+[0-9][0-9][0-9]$" nil nil nil nil "x1234" nil 1 0 "x1234" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(139 "\"x123\" =~ /^.+?[0-9][0-9][0-9]$/" "^.+?[0-9][0-9][0-9]$" nil nil nil nil "x123" nil 1 0 "x123" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(140 "\"xx123\" =~ /^.+?[0-9][0-9][0-9]$/" "^.+?[0-9][0-9][0-9]$" nil nil nil nil "xx123" nil 1 0 "xx123" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(141 "\"123456\" =~ /^.+?[0-9][0-9][0-9]$/" "^.+?[0-9][0-9][0-9]$" nil nil nil nil "123456" nil 1 0 "123456" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(142 "\"123\" =~ /^.+?[0-9][0-9][0-9]$/" "^.+?[0-9][0-9][0-9]$" nil nil nil nil "123" nil 1 0 nil nil)
-(143 "\"x1234\" =~ /^.+?[0-9][0-9][0-9]$/" "^.+?[0-9][0-9][0-9]$" nil nil nil nil "x1234" nil 1 0 "x1234" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(144 "\"abc!pqr=apquxz.ixr.zzz.ac.uk\" =~ /^([^!]+)!(.+)=apquxz\\.ixr\\.zzz\\.ac\\.uk$/" "^([^!]+)!(.+)=apquxz\\.ixr\\.zzz\\.ac\\.uk$" nil nil nil nil "abc!pqr=apquxz.ixr.zzz.ac.uk" nil 1 0 "abc!pqr=apquxz.ixr.zzz.ac.uk" ("abc" "pqr" nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(145 "\"!pqr=apquxz.ixr.zzz.ac.uk\" =~ /^([^!]+)!(.+)=apquxz\\.ixr\\.zzz\\.ac\\.uk$/" "^([^!]+)!(.+)=apquxz\\.ixr\\.zzz\\.ac\\.uk$" nil nil nil nil "!pqr=apquxz.ixr.zzz.ac.uk" nil 1 0 nil nil)
-(146 "\"abc!=apquxz.ixr.zzz.ac.uk\" =~ /^([^!]+)!(.+)=apquxz\\.ixr\\.zzz\\.ac\\.uk$/" "^([^!]+)!(.+)=apquxz\\.ixr\\.zzz\\.ac\\.uk$" nil nil nil nil "abc!=apquxz.ixr.zzz.ac.uk" nil 1 0 nil nil)
-(147 "\"abc!pqr=apquxz:ixr.zzz.ac.uk\" =~ /^([^!]+)!(.+)=apquxz\\.ixr\\.zzz\\.ac\\.uk$/" "^([^!]+)!(.+)=apquxz\\.ixr\\.zzz\\.ac\\.uk$" nil nil nil nil "abc!pqr=apquxz:ixr.zzz.ac.uk" nil 1 0 nil nil)
-(148 "\"abc!pqr=apquxz.ixr.zzz.ac.ukk\" =~ /^([^!]+)!(.+)=apquxz\\.ixr\\.zzz\\.ac\\.uk$/" "^([^!]+)!(.+)=apquxz\\.ixr\\.zzz\\.ac\\.uk$" nil nil nil nil "abc!pqr=apquxz.ixr.zzz.ac.ukk" nil 1 0 nil nil)
-(149 "\"Well, we need a colon: somewhere\" =~ /:/" ":" nil nil nil nil "Well, we need a colon: somewhere" nil 1 0 ":" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(150 "\"Fail if we don't\" =~ /:/" ":" nil nil nil nil "Fail if we don't" nil 1 0 nil nil)
-(151 "\"0abc\" =~ /([\\da-f:]+)$/i" "([\\da-f:]+)$" t nil nil nil "0abc" nil 1 0 "0abc" ("0abc" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(152 "\"abc\" =~ /([\\da-f:]+)$/i" "([\\da-f:]+)$" t nil nil nil "abc" nil 1 0 "abc" ("abc" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(153 "\"fed\" =~ /([\\da-f:]+)$/i" "([\\da-f:]+)$" t nil nil nil "fed" nil 1 0 "fed" ("fed" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(154 "\"E\" =~ /([\\da-f:]+)$/i" "([\\da-f:]+)$" t nil nil nil "E" nil 1 0 "E" ("E" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(155 "\"::\" =~ /([\\da-f:]+)$/i" "([\\da-f:]+)$" t nil nil nil "::" nil 1 0 "::" ("::" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(156 "\"5f03:12C0::932e\" =~ /([\\da-f:]+)$/i" "([\\da-f:]+)$" t nil nil nil "5f03:12C0::932e" nil 1 0 "5f03:12C0::932e" ("5f03:12C0::932e" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(157 "\"fed def\" =~ /([\\da-f:]+)$/i" "([\\da-f:]+)$" t nil nil nil "fed def" nil 1 0 "def" ("def" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(158 "\"Any old stuff\" =~ /([\\da-f:]+)$/i" "([\\da-f:]+)$" t nil nil nil "Any old stuff" nil 1 0 "ff" ("ff" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(159 "\"0zzz\" =~ /([\\da-f:]+)$/i" "([\\da-f:]+)$" t nil nil nil "0zzz" nil 1 0 nil nil)
-(160 "\"gzzz\" =~ /([\\da-f:]+)$/i" "([\\da-f:]+)$" t nil nil nil "gzzz" nil 1 0 nil nil)
-(161 "\"fed\\x20\" =~ /([\\da-f:]+)$/i" "([\\da-f:]+)$" t nil nil nil "fed " nil 1 0 nil nil)
-(162 "\"Any old rubbish\" =~ /([\\da-f:]+)$/i" "([\\da-f:]+)$" t nil nil nil "Any old rubbish" nil 1 0 nil nil)
-(163 "\".1.2.3\" =~ /^.*\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$/" "^.*\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$" nil nil nil nil ".1.2.3" nil 1 0 ".1.2.3" ("1" "2" "3" nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(164 "\"A.12.123.0\" =~ /^.*\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$/" "^.*\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$" nil nil nil nil "A.12.123.0" nil 1 0 "A.12.123.0" ("12" "123" "0" nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(165 "\".1.2.3333\" =~ /^.*\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$/" "^.*\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$" nil nil nil nil ".1.2.3333" nil 1 0 nil nil)
-(166 "\"1.2.3\" =~ /^.*\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$/" "^.*\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$" nil nil nil nil "1.2.3" nil 1 0 nil nil)
-(167 "\"1234.2.3\" =~ /^.*\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$/" "^.*\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$" nil nil nil nil "1234.2.3" nil 1 0 nil nil)
-(168 "\"1 IN SOA non-sp1 non-sp2(\" =~ /^(\\d+)\\s+IN\\s+SOA\\s+(\\S+)\\s+(\\S+)\\s*\\(\\s*$/" "^(\\d+)\\s+IN\\s+SOA\\s+(\\S+)\\s+(\\S+)\\s*\\(\\s*$" nil nil nil nil "1 IN SOA non-sp1 non-sp2(" nil 1 0 "1 IN SOA non-sp1 non-sp2(" ("1" "non-sp1" "non-sp2" nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(169 "\"1 IN SOA non-sp1 non-sp2 (\" =~ /^(\\d+)\\s+IN\\s+SOA\\s+(\\S+)\\s+(\\S+)\\s*\\(\\s*$/" "^(\\d+)\\s+IN\\s+SOA\\s+(\\S+)\\s+(\\S+)\\s*\\(\\s*$" nil nil nil nil "1 IN SOA non-sp1 non-sp2 (" nil 1 0 "1 IN SOA non-sp1 non-sp2 (" ("1" "non-sp1" "non-sp2" nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(170 "\"1IN SOA non-sp1 non-sp2(\" =~ /^(\\d+)\\s+IN\\s+SOA\\s+(\\S+)\\s+(\\S+)\\s*\\(\\s*$/" "^(\\d+)\\s+IN\\s+SOA\\s+(\\S+)\\s+(\\S+)\\s*\\(\\s*$" nil nil nil nil "1IN SOA non-sp1 non-sp2(" nil 1 0 nil nil)
-(171 "\"a.\" =~ /^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-z\\d\\-]*)*\\.$/" "^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-z\\d\\-]*)*\\.$" nil nil nil nil "a." nil 1 0 "a." (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(172 "\"Z.\" =~ /^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-z\\d\\-]*)*\\.$/" "^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-z\\d\\-]*)*\\.$" nil nil nil nil "Z." nil 1 0 "Z." (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(173 "\"2.\" =~ /^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-z\\d\\-]*)*\\.$/" "^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-z\\d\\-]*)*\\.$" nil nil nil nil "2." nil 1 0 "2." (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(174 "\"ab-c.pq-r.\" =~ /^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-z\\d\\-]*)*\\.$/" "^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-z\\d\\-]*)*\\.$" nil nil nil nil "ab-c.pq-r." nil 1 0 "ab-c.pq-r." (".pq-r" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(175 "\"sxk.zzz.ac.uk.\" =~ /^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-z\\d\\-]*)*\\.$/" "^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-z\\d\\-]*)*\\.$" nil nil nil nil "sxk.zzz.ac.uk." nil 1 0 "sxk.zzz.ac.uk." (".uk" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(176 "\"x-.y-.\" =~ /^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-z\\d\\-]*)*\\.$/" "^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-z\\d\\-]*)*\\.$" nil nil nil nil "x-.y-." nil 1 0 "x-.y-." (".y-" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(177 "\"-abc.peq.\" =~ /^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-z\\d\\-]*)*\\.$/" "^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-z\\d\\-]*)*\\.$" nil nil nil nil "-abc.peq." nil 1 0 nil nil)
-(178 "\"*.a\" =~ /^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$/" "^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$" nil nil nil nil "*.a" nil 1 0 "*.a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(179 "\"*.b0-a\" =~ /^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$/" "^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$" nil nil nil nil "*.b0-a" nil 1 0 "*.b0-a" ("0-a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(180 "\"*.c3-b.c\" =~ /^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$/" "^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$" nil nil nil nil "*.c3-b.c" nil 1 0 "*.c3-b.c" ("3-b" ".c" nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(181 "\"*.c-a.b-c\" =~ /^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$/" "^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$" nil nil nil nil "*.c-a.b-c" nil 1 0 "*.c-a.b-c" ("-a" ".b-c" "-c" nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(182 "\"*.0\" =~ /^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$/" "^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$" nil nil nil nil "*.0" nil 1 0 nil nil)
-(183 "\"*.a-\" =~ /^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$/" "^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$" nil nil nil nil "*.a-" nil 1 0 nil nil)
-(184 "\"*.a-b.c-\" =~ /^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$/" "^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$" nil nil nil nil "*.a-b.c-" nil 1 0 nil nil)
-(185 "\"*.c-a.0-c\" =~ /^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$/" "^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$" nil nil nil nil "*.c-a.0-c" nil 1 0 nil nil)
-(186 "\"abde\" =~ /^(?=ab(de))(abd)(e)/" "^(?=ab(de))(abd)(e)" nil nil nil nil "abde" nil 1 0 "abde" ("de" "abd" "e" nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(187 "\"abdf\" =~ /^(?!(ab)de|x)(abd)(f)/" "^(?!(ab)de|x)(abd)(f)" nil nil nil nil "abdf" nil 1 0 "abdf" (nil "abd" "f" nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(188 "\"abcd\" =~ /^(?=(ab(cd)))(ab)/" "^(?=(ab(cd)))(ab)" nil nil nil nil "abcd" nil 1 0 "ab" ("abcd" "cd" "ab" nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(189 "\"a.b.c.d\" =~ /^[\\da-f](\\.[\\da-f])*$/i" "^[\\da-f](\\.[\\da-f])*$" t nil nil nil "a.b.c.d" nil 1 0 "a.b.c.d" (".d" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(190 "\"A.B.C.D\" =~ /^[\\da-f](\\.[\\da-f])*$/i" "^[\\da-f](\\.[\\da-f])*$" t nil nil nil "A.B.C.D" nil 1 0 "A.B.C.D" (".D" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(191 "\"a.b.c.1.2.3.C\" =~ /^[\\da-f](\\.[\\da-f])*$/i" "^[\\da-f](\\.[\\da-f])*$" t nil nil nil "a.b.c.1.2.3.C" nil 1 0 "a.b.c.1.2.3.C" (".C" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(192 "\"\\\"1234\\\"\" =~ /^\\\".*\\\"\\s*(;.*)?$/" "^\\\".*\\\"\\s*(;.*)?$" nil nil nil nil "\"1234\"" nil 1 0 "\"1234\"" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(193 "\"\\\"abcd\\\" ;\" =~ /^\\\".*\\\"\\s*(;.*)?$/" "^\\\".*\\\"\\s*(;.*)?$" nil nil nil nil "\"abcd\" ;" nil 1 0 "\"abcd\" ;" (";" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(194 "\"\\\"\\\" ; rhubarb\" =~ /^\\\".*\\\"\\s*(;.*)?$/" "^\\\".*\\\"\\s*(;.*)?$" nil nil nil nil "\"\" ; rhubarb" nil 1 0 "\"\" ; rhubarb" ("; rhubarb" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(195 "\"\\\"1234\\\" : things\" =~ /^\\\".*\\\"\\s*(;.*)?$/" "^\\\".*\\\"\\s*(;.*)?$" nil nil nil nil "\"1234\" : things" nil 1 0 nil nil)
-(196 "\"\\\" =~ /^$/" "^$" nil nil nil nil "" nil 1 0 "" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(197 "\"ab c\" =~ / ^ a (?# begins with a) b\\sc (?# then b c) $ (?# then end)/x" " ^ a (?# begins with a) b\\sc (?# then b c) $ (?# then end)" nil nil nil t "ab c" nil 1 0 "ab c" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(198 "\"abc\" =~ / ^ a (?# begins with a) b\\sc (?# then b c) $ (?# then end)/x" " ^ a (?# begins with a) b\\sc (?# then b c) $ (?# then end)" nil nil nil t "abc" nil 1 0 nil nil)
-(199 "\"ab cde\" =~ / ^ a (?# begins with a) b\\sc (?# then b c) $ (?# then end)/x" " ^ a (?# begins with a) b\\sc (?# then b c) $ (?# then end)" nil nil nil t "ab cde" nil 1 0 nil nil)
-(200 "\"ab c\" =~ /(?x) ^ a (?# begins with a) b\\sc (?# then b c) $ (?# then end)/" "(?x) ^ a (?# begins with a) b\\sc (?# then b c) $ (?# then end)" nil nil nil nil "ab c" nil 1 0 "ab c" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(201 "\"abc\" =~ /(?x) ^ a (?# begins with a) b\\sc (?# then b c) $ (?# then end)/" "(?x) ^ a (?# begins with a) b\\sc (?# then b c) $ (?# then end)" nil nil nil nil "abc" nil 1 0 nil nil)
-(202 "\"ab cde\" =~ /(?x) ^ a (?# begins with a) b\\sc (?# then b c) $ (?# then end)/" "(?x) ^ a (?# begins with a) b\\sc (?# then b c) $ (?# then end)" nil nil nil nil "ab cde" nil 1 0 nil nil)
-(203 "\"a bcd\" =~ /^ a\\ b[c ]d $/x" "^ a\\ b[c ]d $" nil nil nil t "a bcd" nil 1 0 "a bcd" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(204 "\"a b d\" =~ /^ a\\ b[c ]d $/x" "^ a\\ b[c ]d $" nil nil nil t "a b d" nil 1 0 "a b d" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(205 "\"abcd\" =~ /^ a\\ b[c ]d $/x" "^ a\\ b[c ]d $" nil nil nil t "abcd" nil 1 0 nil nil)
-(206 "\"ab d\" =~ /^ a\\ b[c ]d $/x" "^ a\\ b[c ]d $" nil nil nil t "ab d" nil 1 0 nil nil)
-(207 "\"abcdefhijklm\" =~ /^(a(b(c)))(d(e(f)))(h(i(j)))(k(l(m)))$/" "^(a(b(c)))(d(e(f)))(h(i(j)))(k(l(m)))$" nil nil nil nil "abcdefhijklm" nil 1 0 "abcdefhijklm" ("abc" "bc" "c" "def" "ef" "f" "hij" "ij" "j" "klm" "lm" "m" nil nil nil nil))
-(208 "\"abcdefhijklm\" =~ /^(?:a(b(c)))(?:d(e(f)))(?:h(i(j)))(?:k(l(m)))$/" "^(?:a(b(c)))(?:d(e(f)))(?:h(i(j)))(?:k(l(m)))$" nil nil nil nil "abcdefhijklm" nil 1 0 "abcdefhijklm" ("bc" "c" "ef" "f" "ij" "j" "lm" "m" nil nil nil nil nil nil nil nil))
-(209 "\"a+ Z0+\\x08\\n\\x1d\\x12\" =~ /^[\\w][\\W][\\s][\\S][\\d][\\D][\\b][\\n][\\c]][\\022]/" "^[\\w][\\W][\\s][\\S][\\d][\\D][\\b][\\n][\\c]][\\022]" nil nil nil nil ("a+ Z0+" 8 10 29 18) nil 1 0 ("a+ Z0+" 8 10 29 18) (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(210 "\".^\\$(*+)|{?,?}\" =~ /^[.^$|()*+?{,}]+/" "^[.^$|()*+?{,}]+" nil nil nil nil ".^$(*+)|{?,?}" nil 1 0 ".^$(*+)|{?,?}" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(211 "\"z\" =~ /^a*\\w/" "^a*\\w" nil nil nil nil "z" nil 1 0 "z" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(212 "\"az\" =~ /^a*\\w/" "^a*\\w" nil nil nil nil "az" nil 1 0 "az" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(213 "\"aaaz\" =~ /^a*\\w/" "^a*\\w" nil nil nil nil "aaaz" nil 1 0 "aaaz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(214 "\"a\" =~ /^a*\\w/" "^a*\\w" nil nil nil nil "a" nil 1 0 "a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(215 "\"aa\" =~ /^a*\\w/" "^a*\\w" nil nil nil nil "aa" nil 1 0 "aa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(216 "\"aaaa\" =~ /^a*\\w/" "^a*\\w" nil nil nil nil "aaaa" nil 1 0 "aaaa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(217 "\"a+\" =~ /^a*\\w/" "^a*\\w" nil nil nil nil "a+" nil 1 0 "a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(218 "\"aa+\" =~ /^a*\\w/" "^a*\\w" nil nil nil nil "aa+" nil 1 0 "aa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(219 "\"z\" =~ /^a*?\\w/" "^a*?\\w" nil nil nil nil "z" nil 1 0 "z" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(220 "\"az\" =~ /^a*?\\w/" "^a*?\\w" nil nil nil nil "az" nil 1 0 "a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(221 "\"aaaz\" =~ /^a*?\\w/" "^a*?\\w" nil nil nil nil "aaaz" nil 1 0 "a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(222 "\"a\" =~ /^a*?\\w/" "^a*?\\w" nil nil nil nil "a" nil 1 0 "a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(223 "\"aa\" =~ /^a*?\\w/" "^a*?\\w" nil nil nil nil "aa" nil 1 0 "a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(224 "\"aaaa\" =~ /^a*?\\w/" "^a*?\\w" nil nil nil nil "aaaa" nil 1 0 "a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(225 "\"a+\" =~ /^a*?\\w/" "^a*?\\w" nil nil nil nil "a+" nil 1 0 "a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(226 "\"aa+\" =~ /^a*?\\w/" "^a*?\\w" nil nil nil nil "aa+" nil 1 0 "a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(227 "\"az\" =~ /^a+\\w/" "^a+\\w" nil nil nil nil "az" nil 1 0 "az" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(228 "\"aaaz\" =~ /^a+\\w/" "^a+\\w" nil nil nil nil "aaaz" nil 1 0 "aaaz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(229 "\"aa\" =~ /^a+\\w/" "^a+\\w" nil nil nil nil "aa" nil 1 0 "aa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(230 "\"aaaa\" =~ /^a+\\w/" "^a+\\w" nil nil nil nil "aaaa" nil 1 0 "aaaa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(231 "\"aa+\" =~ /^a+\\w/" "^a+\\w" nil nil nil nil "aa+" nil 1 0 "aa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(232 "\"az\" =~ /^a+?\\w/" "^a+?\\w" nil nil nil nil "az" nil 1 0 "az" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(233 "\"aaaz\" =~ /^a+?\\w/" "^a+?\\w" nil nil nil nil "aaaz" nil 1 0 "aa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(234 "\"aa\" =~ /^a+?\\w/" "^a+?\\w" nil nil nil nil "aa" nil 1 0 "aa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(235 "\"aaaa\" =~ /^a+?\\w/" "^a+?\\w" nil nil nil nil "aaaa" nil 1 0 "aa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(236 "\"aa+\" =~ /^a+?\\w/" "^a+?\\w" nil nil nil nil "aa+" nil 1 0 "aa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(237 "\"1234567890\" =~ /^\\d{8}\\w{2,}/" "^\\d{8}\\w{2,}" nil nil nil nil "1234567890" nil 1 0 "1234567890" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(238 "\"12345678ab\" =~ /^\\d{8}\\w{2,}/" "^\\d{8}\\w{2,}" nil nil nil nil "12345678ab" nil 1 0 "12345678ab" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(239 "\"12345678__\" =~ /^\\d{8}\\w{2,}/" "^\\d{8}\\w{2,}" nil nil nil nil "12345678__" nil 1 0 "12345678__" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(240 "\"1234567\" =~ /^\\d{8}\\w{2,}/" "^\\d{8}\\w{2,}" nil nil nil nil "1234567" nil 1 0 nil nil)
-(241 "\"uoie\" =~ /^[aeiou\\d]{4,5}$/" "^[aeiou\\d]{4,5}$" nil nil nil nil "uoie" nil 1 0 "uoie" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(242 "\"1234\" =~ /^[aeiou\\d]{4,5}$/" "^[aeiou\\d]{4,5}$" nil nil nil nil "1234" nil 1 0 "1234" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(243 "\"12345\" =~ /^[aeiou\\d]{4,5}$/" "^[aeiou\\d]{4,5}$" nil nil nil nil "12345" nil 1 0 "12345" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(244 "\"aaaaa\" =~ /^[aeiou\\d]{4,5}$/" "^[aeiou\\d]{4,5}$" nil nil nil nil "aaaaa" nil 1 0 "aaaaa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(245 "\"123456\" =~ /^[aeiou\\d]{4,5}$/" "^[aeiou\\d]{4,5}$" nil nil nil nil "123456" nil 1 0 nil nil)
-(246 "\"uoie\" =~ /^[aeiou\\d]{4,5}?/" "^[aeiou\\d]{4,5}?" nil nil nil nil "uoie" nil 1 0 "uoie" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(247 "\"1234\" =~ /^[aeiou\\d]{4,5}?/" "^[aeiou\\d]{4,5}?" nil nil nil nil "1234" nil 1 0 "1234" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(248 "\"12345\" =~ /^[aeiou\\d]{4,5}?/" "^[aeiou\\d]{4,5}?" nil nil nil nil "12345" nil 1 0 "1234" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(249 "\"aaaaa\" =~ /^[aeiou\\d]{4,5}?/" "^[aeiou\\d]{4,5}?" nil nil nil nil "aaaaa" nil 1 0 "aaaa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(250 "\"123456\" =~ /^[aeiou\\d]{4,5}?/" "^[aeiou\\d]{4,5}?" nil nil nil nil "123456" nil 1 0 "1234" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(251 "\"abc=abcabc\" =~ /\\A(abc|def)=(\\1){2,3}\\Z/" "\\A(abc|def)=(\\1){2,3}\\Z" nil nil nil nil "abc=abcabc" nil 1 0 "abc=abcabc" ("abc" "abc" nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(252 "\"def=defdefdef\" =~ /\\A(abc|def)=(\\1){2,3}\\Z/" "\\A(abc|def)=(\\1){2,3}\\Z" nil nil nil nil "def=defdefdef" nil 1 0 "def=defdefdef" ("def" "def" nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(253 "\"abc=defdef\" =~ /\\A(abc|def)=(\\1){2,3}\\Z/" "\\A(abc|def)=(\\1){2,3}\\Z" nil nil nil nil "abc=defdef" nil 1 0 nil nil)
-(254 "\"abcdefghijkcda2\" =~ /^(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)\\11*(\\3\\4)\\1(?#)2$/" "^(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)\\11*(\\3\\4)\\1(?#)2$" nil nil nil nil "abcdefghijkcda2" nil 1 0 "abcdefghijkcda2" ("a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "cd" nil nil nil nil))
-(255 "\"abcdefghijkkkkcda2\" =~ /^(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)\\11*(\\3\\4)\\1(?#)2$/" "^(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)\\11*(\\3\\4)\\1(?#)2$" nil nil nil nil "abcdefghijkkkkcda2" nil 1 0 "abcdefghijkkkkcda2" ("a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "cd" nil nil nil nil))
-(256 "\"cataract cataract23\" =~ /(cat(a(ract|tonic)|erpillar)) \\1()2(3)/" "(cat(a(ract|tonic)|erpillar)) \\1()2(3)" nil nil nil nil "cataract cataract23" nil 1 0 "cataract cataract23" ("cataract" "aract" "ract" "" "3" nil nil nil nil nil nil nil nil nil nil nil))
-(257 "\"catatonic catatonic23\" =~ /(cat(a(ract|tonic)|erpillar)) \\1()2(3)/" "(cat(a(ract|tonic)|erpillar)) \\1()2(3)" nil nil nil nil "catatonic catatonic23" nil 1 0 "catatonic catatonic23" ("catatonic" "atonic" "tonic" "" "3" nil nil nil nil nil nil nil nil nil nil nil))
-(258 "\"caterpillar caterpillar23\" =~ /(cat(a(ract|tonic)|erpillar)) \\1()2(3)/" "(cat(a(ract|tonic)|erpillar)) \\1()2(3)" nil nil nil nil "caterpillar caterpillar23" nil 1 0 "caterpillar caterpillar23" ("caterpillar" "erpillar" nil "" "3" nil nil nil nil nil nil nil nil nil nil nil))
-(259 "\"From abcd Mon Sep 01 12:33:02 1997\" =~
-/^From +([^ ]+) +[a-zA-Z][a-zA-Z][a-zA-Z] +[a-zA-Z][a-zA-Z][a-zA-Z] +[0-9]?[0-9] +[0-9][0-9]:[0-9][0-9]/" "^From +([^ ]+) +[a-zA-Z][a-zA-Z][a-zA-Z] +[a-zA-Z][a-zA-Z][a-zA-Z] +[0-9]?[0-9] +[0-9][0-9]:[0-9][0-9]" nil nil nil nil "From abcd Mon Sep 01 12:33:02 1997" nil 1 0 "From abcd Mon Sep 01 12:33" ("abcd" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(260 "\"From abcd Mon Sep 01 12:33:02 1997\" =~ /^From\\s+\\S+\\s+([a-zA-Z]{3}\\s+){2}\\d{1,2}\\s+\\d\\d:\\d\\d/" "^From\\s+\\S+\\s+([a-zA-Z]{3}\\s+){2}\\d{1,2}\\s+\\d\\d:\\d\\d" nil nil nil nil "From abcd Mon Sep 01 12:33:02 1997" nil 1 0 "From abcd Mon Sep 01 12:33" ("Sep " nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(261 "\"From abcd Mon Sep 1 12:33:02 1997\" =~ /^From\\s+\\S+\\s+([a-zA-Z]{3}\\s+){2}\\d{1,2}\\s+\\d\\d:\\d\\d/" "^From\\s+\\S+\\s+([a-zA-Z]{3}\\s+){2}\\d{1,2}\\s+\\d\\d:\\d\\d" nil nil nil nil "From abcd Mon Sep 1 12:33:02 1997" nil 1 0 "From abcd Mon Sep 1 12:33" ("Sep " nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(262 "\"From abcd Sep 01 12:33:02 1997\" =~ /^From\\s+\\S+\\s+([a-zA-Z]{3}\\s+){2}\\d{1,2}\\s+\\d\\d:\\d\\d/" "^From\\s+\\S+\\s+([a-zA-Z]{3}\\s+){2}\\d{1,2}\\s+\\d\\d:\\d\\d" nil nil nil nil "From abcd Sep 01 12:33:02 1997" nil 1 0 nil nil)
-(263 "\"12\\n34\" =~ /^12.34/s" "^12.34" nil nil t nil "12
-34" nil 1 0 "12
-34" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(264 "\"12\\r34\" =~ /^12.34/s" "^12.34" nil nil t nil ("12" 13 "34") nil 1 0 ("12" 13 "34") (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(265 "\"the quick brown\\t fox\" =~ /\\w+(?=\\t)/" "\\w+(?=\\t)" nil nil nil nil ("the quick brown" 9 " fox") nil 1 0 "brown" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(266 "\"foobar is foolish see?\" =~ /foo(?!bar)(.*)/" "foo(?!bar)(.*)" nil nil nil nil "foobar is foolish see?" nil 1 0 "foolish see?" ("lish see?" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(267 "\"foobar crowbar etc\" =~ /(?:(?!foo)...|^.{0,2})bar(.*)/" "(?:(?!foo)...|^.{0,2})bar(.*)" nil nil nil nil "foobar crowbar etc" nil 1 0 "rowbar etc" (" etc" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(268 "\"barrel\" =~ /(?:(?!foo)...|^.{0,2})bar(.*)/" "(?:(?!foo)...|^.{0,2})bar(.*)" nil nil nil nil "barrel" nil 1 0 "barrel" ("rel" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(269 "\"2barrel\" =~ /(?:(?!foo)...|^.{0,2})bar(.*)/" "(?:(?!foo)...|^.{0,2})bar(.*)" nil nil nil nil "2barrel" nil 1 0 "2barrel" ("rel" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(270 "\"A barrel\" =~ /(?:(?!foo)...|^.{0,2})bar(.*)/" "(?:(?!foo)...|^.{0,2})bar(.*)" nil nil nil nil "A barrel" nil 1 0 "A barrel" ("rel" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(271 "\"abc456\" =~ /^(\\D*)(?=\\d)(?!123)/" "^(\\D*)(?=\\d)(?!123)" nil nil nil nil "abc456" nil 1 0 "abc" ("abc" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(272 "\"abc123\" =~ /^(\\D*)(?=\\d)(?!123)/" "^(\\D*)(?=\\d)(?!123)" nil nil nil nil "abc123" nil 1 0 nil nil)
-(273 "\"1234\" =~ /^1234(?# test newlines
- inside)/" "^1234(?# test newlines
- inside)" nil nil nil nil "1234" nil 1 0 "1234" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(274 "\"1234\" =~ /^1234 #comment in extended re
- /x" "^1234 #comment in extended re
- " nil nil nil t "1234" nil 1 0 "1234" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(275 "\"abcd\" =~ /#rhubarb
- abcd/x" "#rhubarb
- abcd" nil nil nil t "abcd" nil 1 0 "abcd" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(276 "\"abcd\" =~ /^abcd#rhubarb/x" "^abcd#rhubarb" nil nil nil t "abcd" nil 1 0 "abcd" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(277 "\"aaab\" =~ /^(a)\\1{2,3}(.)/" "^(a)\\1{2,3}(.)" nil nil nil nil "aaab" nil 1 0 "aaab" ("a" "b" nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(278 "\"aaaab\" =~ /^(a)\\1{2,3}(.)/" "^(a)\\1{2,3}(.)" nil nil nil nil "aaaab" nil 1 0 "aaaab" ("a" "b" nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(279 "\"aaaaab\" =~ /^(a)\\1{2,3}(.)/" "^(a)\\1{2,3}(.)" nil nil nil nil "aaaaab" nil 1 0 "aaaaa" ("a" "a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(280 "\"aaaaaab\" =~ /^(a)\\1{2,3}(.)/" "^(a)\\1{2,3}(.)" nil nil nil nil "aaaaaab" nil 1 0 "aaaaa" ("a" "a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(281 "\"the abc\" =~ /(?!^)abc/" "(?!^)abc" nil nil nil nil "the abc" nil 1 0 "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(282 "\"abc\" =~ /(?!^)abc/" "(?!^)abc" nil nil nil nil "abc" nil 1 0 nil nil)
-(283 "\"abc\" =~ /(?=^)abc/" "(?=^)abc" nil nil nil nil "abc" nil 1 0 "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(284 "\"the abc\" =~ /(?=^)abc/" "(?=^)abc" nil nil nil nil "the abc" nil 1 0 nil nil)
-(285 "\"aabbbbb\" =~ /^[ab]{1,3}(ab*|b)/" "^[ab]{1,3}(ab*|b)" nil nil nil nil "aabbbbb" nil 1 0 "aabb" ("b" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(286 "\"aabbbbb\" =~ /^[ab]{1,3}?(ab*|b)/" "^[ab]{1,3}?(ab*|b)" nil nil nil nil "aabbbbb" nil 1 0 "aabbbbb" ("abbbbb" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(287 "\"aabbbbb\" =~ /^[ab]{1,3}?(ab*?|b)/" "^[ab]{1,3}?(ab*?|b)" nil nil nil nil "aabbbbb" nil 1 0 "aa" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(288 "\"aabbbbb\" =~ /^[ab]{1,3}(ab*?|b)/" "^[ab]{1,3}(ab*?|b)" nil nil nil nil "aabbbbb" nil 1 0 "aabb" ("b" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(289 "\"Alan Other <user\\(a)dom.ain>\" =~ / (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* # optional leading comment
-(?: (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\" (?: # opening quote...
-[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
-| # or
-\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
-)* \" # closing quote
-) # initial word
-(?: (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* \\. (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\" (?: # opening quote...
-[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
-| # or
-\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
-)* \" # closing quote
-) )* # further okay, if led by a period
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* @ (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # initial subdomain
-(?: #
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* \\. # if led by a period...
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # ...further okay
-)*
-# address
-| # or
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\" (?: # opening quote...
-[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
-| # or
-\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
-)* \" # closing quote
-) # one word, optionally followed by....
-(?:
-[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] | # atom and space parts, or...
-\\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) | # comments, or...
-
-\" (?: # opening quote...
-[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
-| # or
-\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
-)* \" # closing quote
-# quoted strings
-)*
-< (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* # leading <
-(?: @ (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # initial subdomain
-(?: #
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* \\. # if led by a period...
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # ...further okay
-)*
-
-(?: (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* , (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* @ (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # initial subdomain
-(?: #
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* \\. # if led by a period...
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # ...further okay
-)*
-)* # further okay, if led by comma
-: # closing colon
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* )? # optional route
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\" (?: # opening quote...
-[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
-| # or
-\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
-)* \" # closing quote
-) # initial word
-(?: (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* \\. (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\" (?: # opening quote...
-[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
-| # or
-\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
-)* \" # closing quote
-) )* # further okay, if led by a period
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* @ (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # initial subdomain
-(?: #
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* \\. # if led by a period...
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # ...further okay
-)*
-# address spec
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* > # trailing >
-# name and address
-) (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* # optional trailing comment
-/x" " (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* # optional leading comment
-(?: (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\" (?: # opening quote...
-[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
-| # or
-\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
-)* \" # closing quote
-) # initial word
-(?: (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* \\. (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\" (?: # opening quote...
-[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
-| # or
-\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
-)* \" # closing quote
-) )* # further okay, if led by a period
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* @ (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # initial subdomain
-(?: #
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* \\. # if led by a period...
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # ...further okay
-)*
-# address
-| # or
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\" (?: # opening quote...
-[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
-| # or
-\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
-)* \" # closing quote
-) # one word, optionally followed by....
-(?:
-[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] | # atom and space parts, or...
-\\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) | # comments, or...
-
-\" (?: # opening quote...
-[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
-| # or
-\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
-)* \" # closing quote
-# quoted strings
-)*
-< (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* # leading <
-(?: @ (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # initial subdomain
-(?: #
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* \\. # if led by a period...
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # ...further okay
-)*
-
-(?: (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* , (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* @ (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # initial subdomain
-(?: #
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* \\. # if led by a period...
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # ...further okay
-)*
-)* # further okay, if led by comma
-: # closing colon
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* )? # optional route
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\" (?: # opening quote...
-[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
-| # or
-\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
-)* \" # closing quote
-) # initial word
-(?: (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* \\. (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\" (?: # opening quote...
-[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
-| # or
-\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
-)* \" # closing quote
-) )* # further okay, if led by a period
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* @ (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # initial subdomain
-(?: #
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* \\. # if led by a period...
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # ...further okay
-)*
-# address spec
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* > # trailing >
-# name and address
-) (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* # optional trailing comment
-" nil nil nil t "Alan Other <user(a)dom.ain>" nil 1 0 "Alan Other <user(a)dom.ain>" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(290 "\"<user\\(a)dom.ain>\" =~ / (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* # optional leading comment
-(?: (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\" (?: # opening quote...
-[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
-| # or
-\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
-)* \" # closing quote
-) # initial word
-(?: (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* \\. (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\" (?: # opening quote...
-[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
-| # or
-\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
-)* \" # closing quote
-) )* # further okay, if led by a period
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* @ (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # initial subdomain
-(?: #
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* \\. # if led by a period...
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # ...further okay
-)*
-# address
-| # or
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\" (?: # opening quote...
-[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
-| # or
-\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
-)* \" # closing quote
-) # one word, optionally followed by....
-(?:
-[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] | # atom and space parts, or...
-\\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) | # comments, or...
-
-\" (?: # opening quote...
-[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
-| # or
-\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
-)* \" # closing quote
-# quoted strings
-)*
-< (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* # leading <
-(?: @ (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # initial subdomain
-(?: #
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* \\. # if led by a period...
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # ...further okay
-)*
-
-(?: (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* , (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* @ (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # initial subdomain
-(?: #
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* \\. # if led by a period...
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # ...further okay
-)*
-)* # further okay, if led by comma
-: # closing colon
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* )? # optional route
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\" (?: # opening quote...
-[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
-| # or
-\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
-)* \" # closing quote
-) # initial word
-(?: (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* \\. (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\" (?: # opening quote...
-[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
-| # or
-\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
-)* \" # closing quote
-) )* # further okay, if led by a period
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* @ (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # initial subdomain
-(?: #
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* \\. # if led by a period...
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # ...further okay
-)*
-# address spec
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* > # trailing >
-# name and address
-) (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* # optional trailing comment
-/x" " (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* # optional leading comment
-(?: (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\" (?: # opening quote...
-[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
-| # or
-\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
-)* \" # closing quote
-) # initial word
-(?: (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* \\. (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\" (?: # opening quote...
-[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
-| # or
-\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
-)* \" # closing quote
-) )* # further okay, if led by a period
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* @ (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # initial subdomain
-(?: #
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* \\. # if led by a period...
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # ...further okay
-)*
-# address
-| # or
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\" (?: # opening quote...
-[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
-| # or
-\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
-)* \" # closing quote
-) # one word, optionally followed by....
-(?:
-[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] | # atom and space parts, or...
-\\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) | # comments, or...
-
-\" (?: # opening quote...
-[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
-| # or
-\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
-)* \" # closing quote
-# quoted strings
-)*
-< (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* # leading <
-(?: @ (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # initial subdomain
-(?: #
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* \\. # if led by a period...
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # ...further okay
-)*
-
-(?: (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* , (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* @ (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # initial subdomain
-(?: #
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* \\. # if led by a period...
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # ...further okay
-)*
-)* # further okay, if led by comma
-: # closing colon
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* )? # optional route
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\" (?: # opening quote...
-[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
-| # or
-\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
-)* \" # closing quote
-) # initial word
-(?: (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* \\. (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\" (?: # opening quote...
-[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
-| # or
-\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
-)* \" # closing quote
-) )* # further okay, if led by a period
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* @ (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # initial subdomain
-(?: #
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* \\. # if led by a period...
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # ...further okay
-)*
-# address spec
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* > # trailing >
-# name and address
-) (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* # optional trailing comment
-" nil nil nil t "<user(a)dom.ain>" nil 1 0 "user(a)dom.ain" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(291 "\"user\\(a)dom.ain\" =~ / (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* # optional leading comment
-(?: (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\" (?: # opening quote...
-[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
-| # or
-\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
-)* \" # closing quote
-) # initial word
-(?: (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* \\. (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\" (?: # opening quote...
-[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
-| # or
-\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
-)* \" # closing quote
-) )* # further okay, if led by a period
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* @ (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # initial subdomain
-(?: #
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* \\. # if led by a period...
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # ...further okay
-)*
-# address
-| # or
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\" (?: # opening quote...
-[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
-| # or
-\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
-)* \" # closing quote
-) # one word, optionally followed by....
-(?:
-[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] | # atom and space parts, or...
-\\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) | # comments, or...
-
-\" (?: # opening quote...
-[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
-| # or
-\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
-)* \" # closing quote
-# quoted strings
-)*
-< (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* # leading <
-(?: @ (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # initial subdomain
-(?: #
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* \\. # if led by a period...
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # ...further okay
-)*
-
-(?: (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* , (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* @ (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # initial subdomain
-(?: #
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* \\. # if led by a period...
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # ...further okay
-)*
-)* # further okay, if led by comma
-: # closing colon
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* )? # optional route
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\" (?: # opening quote...
-[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
-| # or
-\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
-)* \" # closing quote
-) # initial word
-(?: (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* \\. (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\" (?: # opening quote...
-[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
-| # or
-\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
-)* \" # closing quote
-) )* # further okay, if led by a period
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* @ (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # initial subdomain
-(?: #
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* \\. # if led by a period...
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # ...further okay
-)*
-# address spec
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* > # trailing >
-# name and address
-) (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* # optional trailing comment
-/x" " (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* # optional leading comment
-(?: (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\" (?: # opening quote...
-[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
-| # or
-\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
-)* \" # closing quote
-) # initial word
-(?: (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* \\. (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\" (?: # opening quote...
-[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
-| # or
-\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
-)* \" # closing quote
-) )* # further okay, if led by a period
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* @ (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # initial subdomain
-(?: #
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* \\. # if led by a period...
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # ...further okay
-)*
-# address
-| # or
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\" (?: # opening quote...
-[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
-| # or
-\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
-)* \" # closing quote
-) # one word, optionally followed by....
-(?:
-[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] | # atom and space parts, or...
-\\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) | # comments, or...
-
-\" (?: # opening quote...
-[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
-| # or
-\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
-)* \" # closing quote
-# quoted strings
-)*
-< (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* # leading <
-(?: @ (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # initial subdomain
-(?: #
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* \\. # if led by a period...
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # ...further okay
-)*
-
-(?: (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* , (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* @ (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # initial subdomain
-(?: #
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* \\. # if led by a period...
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # ...further okay
-)*
-)* # further okay, if led by comma
-: # closing colon
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* )? # optional route
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\" (?: # opening quote...
-[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
-| # or
-\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
-)* \" # closing quote
-) # initial word
-(?: (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* \\. (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\" (?: # opening quote...
-[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
-| # or
-\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
-)* \" # closing quote
-) )* # further okay, if led by a period
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* @ (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # initial subdomain
-(?: #
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* \\. # if led by a period...
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # ...further okay
-)*
-# address spec
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* > # trailing >
-# name and address
-) (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* # optional trailing comment
-" nil nil nil t "user(a)dom.ain" nil 1 0 "user(a)dom.ain" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(292 "\"\\\"A. Other\\\" <user.1234\\(a)dom.ain> (a comment)\" =~ / (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* # optional leading comment
-(?: (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\" (?: # opening quote...
-[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
-| # or
-\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
-)* \" # closing quote
-) # initial word
-(?: (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* \\. (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\" (?: # opening quote...
-[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
-| # or
-\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
-)* \" # closing quote
-) )* # further okay, if led by a period
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* @ (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # initial subdomain
-(?: #
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* \\. # if led by a period...
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # ...further okay
-)*
-# address
-| # or
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\" (?: # opening quote...
-[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
-| # or
-\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
-)* \" # closing quote
-) # one word, optionally followed by....
-(?:
-[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] | # atom and space parts, or...
-\\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) | # comments, or...
-
-\" (?: # opening quote...
-[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
-| # or
-\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
-)* \" # closing quote
-# quoted strings
-)*
-< (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* # leading <
-(?: @ (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # initial subdomain
-(?: #
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* \\. # if led by a period...
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # ...further okay
-)*
-
-(?: (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* , (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* @ (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # initial subdomain
-(?: #
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* \\. # if led by a period...
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # ...further okay
-)*
-)* # further okay, if led by comma
-: # closing colon
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* )? # optional route
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\" (?: # opening quote...
-[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
-| # or
-\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
-)* \" # closing quote
-) # initial word
-(?: (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* \\. (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\" (?: # opening quote...
-[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
-| # or
-\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
-)* \" # closing quote
-) )* # further okay, if led by a period
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* @ (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # initial subdomain
-(?: #
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* \\. # if led by a period...
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # ...further okay
-)*
-# address spec
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* > # trailing >
-# name and address
-) (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* # optional trailing comment
-/x" " (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* # optional leading comment
-(?: (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\" (?: # opening quote...
-[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
-| # or
-\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
-)* \" # closing quote
-) # initial word
-(?: (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* \\. (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\" (?: # opening quote...
-[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
-| # or
-\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
-)* \" # closing quote
-) )* # further okay, if led by a period
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* @ (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # initial subdomain
-(?: #
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* \\. # if led by a period...
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # ...further okay
-)*
-# address
-| # or
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\" (?: # opening quote...
-[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
-| # or
-\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
-)* \" # closing quote
-) # one word, optionally followed by....
-(?:
-[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] | # atom and space parts, or...
-\\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) | # comments, or...
-
-\" (?: # opening quote...
-[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
-| # or
-\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
-)* \" # closing quote
-# quoted strings
-)*
-< (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* # leading <
-(?: @ (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # initial subdomain
-(?: #
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* \\. # if led by a period...
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # ...further okay
-)*
-
-(?: (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* , (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* @ (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # initial subdomain
-(?: #
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* \\. # if led by a period...
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # ...further okay
-)*
-)* # further okay, if led by comma
-: # closing colon
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* )? # optional route
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\" (?: # opening quote...
-[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
-| # or
-\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
-)* \" # closing quote
-) # initial word
-(?: (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* \\. (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\" (?: # opening quote...
-[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
-| # or
-\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
-)* \" # closing quote
-) )* # further okay, if led by a period
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* @ (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # initial subdomain
-(?: #
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* \\. # if led by a period...
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # ...further okay
-)*
-# address spec
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* > # trailing >
-# name and address
-) (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* # optional trailing comment
-" nil nil nil t "\"A. Other\" <user.1234(a)dom.ain> (a comment)" nil 1 0 "\"A. Other\" <user.1234(a)dom.ain> (a comment)" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(293 "\"A. Other <user.1234\\(a)dom.ain> (a comment)\" =~ / (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* # optional leading comment
-(?: (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\" (?: # opening quote...
-[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
-| # or
-\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
-)* \" # closing quote
-) # initial word
-(?: (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* \\. (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\" (?: # opening quote...
-[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
-| # or
-\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
-)* \" # closing quote
-) )* # further okay, if led by a period
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* @ (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # initial subdomain
-(?: #
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* \\. # if led by a period...
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # ...further okay
-)*
-# address
-| # or
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\" (?: # opening quote...
-[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
-| # or
-\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
-)* \" # closing quote
-) # one word, optionally followed by....
-(?:
-[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] | # atom and space parts, or...
-\\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) | # comments, or...
-
-\" (?: # opening quote...
-[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
-| # or
-\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
-)* \" # closing quote
-# quoted strings
-)*
-< (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* # leading <
-(?: @ (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # initial subdomain
-(?: #
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* \\. # if led by a period...
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # ...further okay
-)*
-
-(?: (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* , (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* @ (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # initial subdomain
-(?: #
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* \\. # if led by a period...
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # ...further okay
-)*
-)* # further okay, if led by comma
-: # closing colon
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* )? # optional route
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\" (?: # opening quote...
-[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
-| # or
-\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
-)* \" # closing quote
-) # initial word
-(?: (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* \\. (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\" (?: # opening quote...
-[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
-| # or
-\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
-)* \" # closing quote
-) )* # further okay, if led by a period
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* @ (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # initial subdomain
-(?: #
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* \\. # if led by a period...
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # ...further okay
-)*
-# address spec
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* > # trailing >
-# name and address
-) (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* # optional trailing comment
-/x" " (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* # optional leading comment
-(?: (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\" (?: # opening quote...
-[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
-| # or
-\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
-)* \" # closing quote
-) # initial word
-(?: (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* \\. (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\" (?: # opening quote...
-[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
-| # or
-\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
-)* \" # closing quote
-) )* # further okay, if led by a period
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* @ (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # initial subdomain
-(?: #
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* \\. # if led by a period...
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # ...further okay
-)*
-# address
-| # or
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\" (?: # opening quote...
-[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
-| # or
-\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
-)* \" # closing quote
-) # one word, optionally followed by....
-(?:
-[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] | # atom and space parts, or...
-\\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) | # comments, or...
-
-\" (?: # opening quote...
-[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
-| # or
-\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
-)* \" # closing quote
-# quoted strings
-)*
-< (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* # leading <
-(?: @ (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # initial subdomain
-(?: #
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* \\. # if led by a period...
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # ...further okay
-)*
-
-(?: (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* , (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* @ (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # initial subdomain
-(?: #
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* \\. # if led by a period...
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # ...further okay
-)*
-)* # further okay, if led by comma
-: # closing colon
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* )? # optional route
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\" (?: # opening quote...
-[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
-| # or
-\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
-)* \" # closing quote
-) # initial word
-(?: (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* \\. (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\" (?: # opening quote...
-[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
-| # or
-\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
-)* \" # closing quote
-) )* # further okay, if led by a period
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* @ (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # initial subdomain
-(?: #
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* \\. # if led by a period...
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # ...further okay
-)*
-# address spec
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* > # trailing >
-# name and address
-) (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* # optional trailing comment
-" nil nil nil t "A. Other <user.1234(a)dom.ain> (a comment)" nil 1 0 " Other <user.1234(a)dom.ain> (a comment)" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(294 "\"\\\"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\\\"\\(a)x400-re.lay\" =~ / (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* # optional leading comment
-(?: (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\" (?: # opening quote...
-[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
-| # or
-\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
-)* \" # closing quote
-) # initial word
-(?: (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* \\. (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\" (?: # opening quote...
-[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
-| # or
-\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
-)* \" # closing quote
-) )* # further okay, if led by a period
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* @ (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # initial subdomain
-(?: #
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* \\. # if led by a period...
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # ...further okay
-)*
-# address
-| # or
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\" (?: # opening quote...
-[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
-| # or
-\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
-)* \" # closing quote
-) # one word, optionally followed by....
-(?:
-[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] | # atom and space parts, or...
-\\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) | # comments, or...
-
-\" (?: # opening quote...
-[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
-| # or
-\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
-)* \" # closing quote
-# quoted strings
-)*
-< (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* # leading <
-(?: @ (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # initial subdomain
-(?: #
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* \\. # if led by a period...
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # ...further okay
-)*
-
-(?: (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* , (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* @ (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # initial subdomain
-(?: #
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* \\. # if led by a period...
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # ...further okay
-)*
-)* # further okay, if led by comma
-: # closing colon
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* )? # optional route
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\" (?: # opening quote...
-[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
-| # or
-\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
-)* \" # closing quote
-) # initial word
-(?: (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* \\. (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\" (?: # opening quote...
-[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
-| # or
-\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
-)* \" # closing quote
-) )* # further okay, if led by a period
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* @ (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # initial subdomain
-(?: #
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* \\. # if led by a period...
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # ...further okay
-)*
-# address spec
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* > # trailing >
-# name and address
-) (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* # optional trailing comment
-/x" " (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* # optional leading comment
-(?: (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\" (?: # opening quote...
-[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
-| # or
-\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
-)* \" # closing quote
-) # initial word
-(?: (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* \\. (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\" (?: # opening quote...
-[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
-| # or
-\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
-)* \" # closing quote
-) )* # further okay, if led by a period
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* @ (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # initial subdomain
-(?: #
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* \\. # if led by a period...
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # ...further okay
-)*
-# address
-| # or
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\" (?: # opening quote...
-[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
-| # or
-\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
-)* \" # closing quote
-) # one word, optionally followed by....
-(?:
-[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] | # atom and space parts, or...
-\\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) | # comments, or...
-
-\" (?: # opening quote...
-[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
-| # or
-\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
-)* \" # closing quote
-# quoted strings
-)*
-< (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* # leading <
-(?: @ (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # initial subdomain
-(?: #
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* \\. # if led by a period...
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # ...further okay
-)*
-
-(?: (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* , (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* @ (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # initial subdomain
-(?: #
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* \\. # if led by a period...
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # ...further okay
-)*
-)* # further okay, if led by comma
-: # closing colon
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* )? # optional route
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\" (?: # opening quote...
-[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
-| # or
-\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
-)* \" # closing quote
-) # initial word
-(?: (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* \\. (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\" (?: # opening quote...
-[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
-| # or
-\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
-)* \" # closing quote
-) )* # further okay, if led by a period
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* @ (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # initial subdomain
-(?: #
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* \\. # if led by a period...
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # ...further okay
-)*
-# address spec
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* > # trailing >
-# name and address
-) (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* # optional trailing comment
-" nil nil nil t "\"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\"@x400-re.lay" nil 1 0 "\"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\"@x400-re.lay" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(295 "\"A missing angle <user\\(a)some.where\" =~ / (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* # optional leading comment
-(?: (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\" (?: # opening quote...
-[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
-| # or
-\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
-)* \" # closing quote
-) # initial word
-(?: (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* \\. (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\" (?: # opening quote...
-[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
-| # or
-\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
-)* \" # closing quote
-) )* # further okay, if led by a period
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* @ (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # initial subdomain
-(?: #
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* \\. # if led by a period...
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # ...further okay
-)*
-# address
-| # or
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\" (?: # opening quote...
-[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
-| # or
-\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
-)* \" # closing quote
-) # one word, optionally followed by....
-(?:
-[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] | # atom and space parts, or...
-\\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) | # comments, or...
-
-\" (?: # opening quote...
-[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
-| # or
-\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
-)* \" # closing quote
-# quoted strings
-)*
-< (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* # leading <
-(?: @ (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # initial subdomain
-(?: #
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* \\. # if led by a period...
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # ...further okay
-)*
-
-(?: (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* , (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* @ (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # initial subdomain
-(?: #
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* \\. # if led by a period...
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # ...further okay
-)*
-)* # further okay, if led by comma
-: # closing colon
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* )? # optional route
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\" (?: # opening quote...
-[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
-| # or
-\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
-)* \" # closing quote
-) # initial word
-(?: (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* \\. (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\" (?: # opening quote...
-[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
-| # or
-\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
-)* \" # closing quote
-) )* # further okay, if led by a period
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* @ (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # initial subdomain
-(?: #
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* \\. # if led by a period...
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # ...further okay
-)*
-# address spec
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* > # trailing >
-# name and address
-) (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* # optional trailing comment
-/x" " (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* # optional leading comment
-(?: (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\" (?: # opening quote...
-[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
-| # or
-\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
-)* \" # closing quote
-) # initial word
-(?: (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* \\. (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\" (?: # opening quote...
-[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
-| # or
-\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
-)* \" # closing quote
-) )* # further okay, if led by a period
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* @ (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # initial subdomain
-(?: #
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* \\. # if led by a period...
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # ...further okay
-)*
-# address
-| # or
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\" (?: # opening quote...
-[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
-| # or
-\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
-)* \" # closing quote
-) # one word, optionally followed by....
-(?:
-[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] | # atom and space parts, or...
-\\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) | # comments, or...
-
-\" (?: # opening quote...
-[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
-| # or
-\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
-)* \" # closing quote
-# quoted strings
-)*
-< (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* # leading <
-(?: @ (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # initial subdomain
-(?: #
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* \\. # if led by a period...
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # ...further okay
-)*
-
-(?: (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* , (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* @ (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # initial subdomain
-(?: #
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* \\. # if led by a period...
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # ...further okay
-)*
-)* # further okay, if led by comma
-: # closing colon
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* )? # optional route
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\" (?: # opening quote...
-[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
-| # or
-\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
-)* \" # closing quote
-) # initial word
-(?: (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* \\. (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\" (?: # opening quote...
-[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
-| # or
-\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
-)* \" # closing quote
-) )* # further okay, if led by a period
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* @ (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # initial subdomain
-(?: #
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* \\. # if led by a period...
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # ...further okay
-)*
-# address spec
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* > # trailing >
-# name and address
-) (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* # optional trailing comment
-" nil nil nil t "A missing angle <user(a)some.where" nil 1 0 "user(a)some.where" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(296 "\"The quick brown fox\" =~ / (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* # optional leading comment
-(?: (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\" (?: # opening quote...
-[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
-| # or
-\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
-)* \" # closing quote
-) # initial word
-(?: (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* \\. (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\" (?: # opening quote...
-[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
-| # or
-\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
-)* \" # closing quote
-) )* # further okay, if led by a period
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* @ (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # initial subdomain
-(?: #
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* \\. # if led by a period...
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # ...further okay
-)*
-# address
-| # or
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\" (?: # opening quote...
-[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
-| # or
-\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
-)* \" # closing quote
-) # one word, optionally followed by....
-(?:
-[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] | # atom and space parts, or...
-\\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) | # comments, or...
-
-\" (?: # opening quote...
-[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
-| # or
-\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
-)* \" # closing quote
-# quoted strings
-)*
-< (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* # leading <
-(?: @ (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # initial subdomain
-(?: #
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* \\. # if led by a period...
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # ...further okay
-)*
-
-(?: (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* , (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* @ (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # initial subdomain
-(?: #
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* \\. # if led by a period...
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # ...further okay
-)*
-)* # further okay, if led by comma
-: # closing colon
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* )? # optional route
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\" (?: # opening quote...
-[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
-| # or
-\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
-)* \" # closing quote
-) # initial word
-(?: (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* \\. (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\" (?: # opening quote...
-[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
-| # or
-\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
-)* \" # closing quote
-) )* # further okay, if led by a period
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* @ (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # initial subdomain
-(?: #
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* \\. # if led by a period...
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # ...further okay
-)*
-# address spec
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* > # trailing >
-# name and address
-) (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* # optional trailing comment
-/x" " (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* # optional leading comment
-(?: (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\" (?: # opening quote...
-[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
-| # or
-\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
-)* \" # closing quote
-) # initial word
-(?: (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* \\. (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\" (?: # opening quote...
-[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
-| # or
-\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
-)* \" # closing quote
-) )* # further okay, if led by a period
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* @ (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # initial subdomain
-(?: #
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* \\. # if led by a period...
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # ...further okay
-)*
-# address
-| # or
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\" (?: # opening quote...
-[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
-| # or
-\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
-)* \" # closing quote
-) # one word, optionally followed by....
-(?:
-[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] | # atom and space parts, or...
-\\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) | # comments, or...
-
-\" (?: # opening quote...
-[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
-| # or
-\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
-)* \" # closing quote
-# quoted strings
-)*
-< (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* # leading <
-(?: @ (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # initial subdomain
-(?: #
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* \\. # if led by a period...
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # ...further okay
-)*
-
-(?: (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* , (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* @ (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # initial subdomain
-(?: #
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* \\. # if led by a period...
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # ...further okay
-)*
-)* # further okay, if led by comma
-: # closing colon
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* )? # optional route
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\" (?: # opening quote...
-[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
-| # or
-\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
-)* \" # closing quote
-) # initial word
-(?: (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* \\. (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\" (?: # opening quote...
-[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote
-| # or
-\\\\ [^\\x80-\\xff] # Escaped something (something != CR)
-)* \" # closing quote
-) )* # further okay, if led by a period
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* @ (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # initial subdomain
-(?: #
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* \\. # if led by a period...
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* (?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-| \\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-) # ...further okay
-)*
-# address spec
-(?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* > # trailing >
-# name and address
-) (?: [\\040\\t] | \\(
-(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*
-\\) )* # optional trailing comment
-" nil nil nil t "The quick brown fox" nil 1 0 nil nil)
-(297 "\"Alan Other <user\\(a)dom.ain>\" =~ /[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional leading comment
-(?:
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-# Atom
-| # or
-\" # \"
-[^\\\\\\x80-\\xff\\n\\015\"] * # normal
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
-\" # \"
-# Quoted string
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-\\.
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-# Atom
-| # or
-\" # \"
-[^\\\\\\x80-\\xff\\n\\015\"] * # normal
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
-\" # \"
-# Quoted string
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# additional words
-)*
-@
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-(?:
-\\.
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-)*
-# address
-| # or
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-# Atom
-| # or
-\" # \"
-[^\\\\\\x80-\\xff\\n\\015\"] * # normal
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
-\" # \"
-# Quoted string
-)
-# leading word
-[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # \"normal\" atoms and or spaces
-(?:
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-|
-\" # \"
-[^\\\\\\x80-\\xff\\n\\015\"] * # normal
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
-\" # \"
-) # \"special\" comment or quoted string
-[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # more \"normal\"
-)*
-<
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# <
-(?:
-@
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-(?:
-\\.
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-)*
-(?: ,
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-@
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-(?:
-\\.
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-)*
-)* # additional domains
-:
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-)? # optional route
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-# Atom
-| # or
-\" # \"
-[^\\\\\\x80-\\xff\\n\\015\"] * # normal
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
-\" # \"
-# Quoted string
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-\\.
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-# Atom
-| # or
-\" # \"
-[^\\\\\\x80-\\xff\\n\\015\"] * # normal
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
-\" # \"
-# Quoted string
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# additional words
-)*
-@
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-(?:
-\\.
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-)*
-# address spec
-> # >
-# name and address
-)
-/x" "[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional leading comment
-(?:
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-# Atom
-| # or
-\" # \"
-[^\\\\\\x80-\\xff\\n\\015\"] * # normal
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
-\" # \"
-# Quoted string
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-\\.
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-# Atom
-| # or
-\" # \"
-[^\\\\\\x80-\\xff\\n\\015\"] * # normal
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
-\" # \"
-# Quoted string
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# additional words
-)*
-@
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-(?:
-\\.
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-)*
-# address
-| # or
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-# Atom
-| # or
-\" # \"
-[^\\\\\\x80-\\xff\\n\\015\"] * # normal
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
-\" # \"
-# Quoted string
-)
-# leading word
-[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # \"normal\" atoms and or spaces
-(?:
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-|
-\" # \"
-[^\\\\\\x80-\\xff\\n\\015\"] * # normal
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
-\" # \"
-) # \"special\" comment or quoted string
-[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # more \"normal\"
-)*
-<
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# <
-(?:
-@
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-(?:
-\\.
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-)*
-(?: ,
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-@
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-(?:
-\\.
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-)*
-)* # additional domains
-:
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-)? # optional route
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-# Atom
-| # or
-\" # \"
-[^\\\\\\x80-\\xff\\n\\015\"] * # normal
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
-\" # \"
-# Quoted string
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-\\.
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-# Atom
-| # or
-\" # \"
-[^\\\\\\x80-\\xff\\n\\015\"] * # normal
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
-\" # \"
-# Quoted string
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# additional words
-)*
-@
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-(?:
-\\.
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-)*
-# address spec
-> # >
-# name and address
-)
-" nil nil nil t "Alan Other <user(a)dom.ain>" nil 1 0 "Alan Other <user(a)dom.ain>" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(298 "\"<user\\(a)dom.ain>\" =~ /[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional leading comment
-(?:
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-# Atom
-| # or
-\" # \"
-[^\\\\\\x80-\\xff\\n\\015\"] * # normal
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
-\" # \"
-# Quoted string
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-\\.
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-# Atom
-| # or
-\" # \"
-[^\\\\\\x80-\\xff\\n\\015\"] * # normal
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
-\" # \"
-# Quoted string
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# additional words
-)*
-@
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-(?:
-\\.
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-)*
-# address
-| # or
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-# Atom
-| # or
-\" # \"
-[^\\\\\\x80-\\xff\\n\\015\"] * # normal
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
-\" # \"
-# Quoted string
-)
-# leading word
-[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # \"normal\" atoms and or spaces
-(?:
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-|
-\" # \"
-[^\\\\\\x80-\\xff\\n\\015\"] * # normal
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
-\" # \"
-) # \"special\" comment or quoted string
-[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # more \"normal\"
-)*
-<
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# <
-(?:
-@
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-(?:
-\\.
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-)*
-(?: ,
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-@
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-(?:
-\\.
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-)*
-)* # additional domains
-:
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-)? # optional route
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-# Atom
-| # or
-\" # \"
-[^\\\\\\x80-\\xff\\n\\015\"] * # normal
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
-\" # \"
-# Quoted string
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-\\.
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-# Atom
-| # or
-\" # \"
-[^\\\\\\x80-\\xff\\n\\015\"] * # normal
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
-\" # \"
-# Quoted string
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# additional words
-)*
-@
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-(?:
-\\.
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-)*
-# address spec
-> # >
-# name and address
-)
-/x" "[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional leading comment
-(?:
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-# Atom
-| # or
-\" # \"
-[^\\\\\\x80-\\xff\\n\\015\"] * # normal
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
-\" # \"
-# Quoted string
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-\\.
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-# Atom
-| # or
-\" # \"
-[^\\\\\\x80-\\xff\\n\\015\"] * # normal
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
-\" # \"
-# Quoted string
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# additional words
-)*
-@
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-(?:
-\\.
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-)*
-# address
-| # or
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-# Atom
-| # or
-\" # \"
-[^\\\\\\x80-\\xff\\n\\015\"] * # normal
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
-\" # \"
-# Quoted string
-)
-# leading word
-[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # \"normal\" atoms and or spaces
-(?:
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-|
-\" # \"
-[^\\\\\\x80-\\xff\\n\\015\"] * # normal
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
-\" # \"
-) # \"special\" comment or quoted string
-[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # more \"normal\"
-)*
-<
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# <
-(?:
-@
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-(?:
-\\.
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-)*
-(?: ,
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-@
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-(?:
-\\.
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-)*
-)* # additional domains
-:
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-)? # optional route
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-# Atom
-| # or
-\" # \"
-[^\\\\\\x80-\\xff\\n\\015\"] * # normal
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
-\" # \"
-# Quoted string
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-\\.
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-# Atom
-| # or
-\" # \"
-[^\\\\\\x80-\\xff\\n\\015\"] * # normal
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
-\" # \"
-# Quoted string
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# additional words
-)*
-@
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-(?:
-\\.
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-)*
-# address spec
-> # >
-# name and address
-)
-" nil nil nil t "<user(a)dom.ain>" nil 1 0 "user(a)dom.ain" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(299 "\"user\\(a)dom.ain\" =~ /[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional leading comment
-(?:
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-# Atom
-| # or
-\" # \"
-[^\\\\\\x80-\\xff\\n\\015\"] * # normal
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
-\" # \"
-# Quoted string
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-\\.
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-# Atom
-| # or
-\" # \"
-[^\\\\\\x80-\\xff\\n\\015\"] * # normal
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
-\" # \"
-# Quoted string
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# additional words
-)*
-@
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-(?:
-\\.
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-)*
-# address
-| # or
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-# Atom
-| # or
-\" # \"
-[^\\\\\\x80-\\xff\\n\\015\"] * # normal
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
-\" # \"
-# Quoted string
-)
-# leading word
-[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # \"normal\" atoms and or spaces
-(?:
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-|
-\" # \"
-[^\\\\\\x80-\\xff\\n\\015\"] * # normal
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
-\" # \"
-) # \"special\" comment or quoted string
-[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # more \"normal\"
-)*
-<
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# <
-(?:
-@
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-(?:
-\\.
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-)*
-(?: ,
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-@
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-(?:
-\\.
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-)*
-)* # additional domains
-:
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-)? # optional route
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-# Atom
-| # or
-\" # \"
-[^\\\\\\x80-\\xff\\n\\015\"] * # normal
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
-\" # \"
-# Quoted string
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-\\.
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-# Atom
-| # or
-\" # \"
-[^\\\\\\x80-\\xff\\n\\015\"] * # normal
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
-\" # \"
-# Quoted string
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# additional words
-)*
-@
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-(?:
-\\.
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-)*
-# address spec
-> # >
-# name and address
-)
-/x" "[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional leading comment
-(?:
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-# Atom
-| # or
-\" # \"
-[^\\\\\\x80-\\xff\\n\\015\"] * # normal
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
-\" # \"
-# Quoted string
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-\\.
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-# Atom
-| # or
-\" # \"
-[^\\\\\\x80-\\xff\\n\\015\"] * # normal
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
-\" # \"
-# Quoted string
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# additional words
-)*
-@
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-(?:
-\\.
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-)*
-# address
-| # or
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-# Atom
-| # or
-\" # \"
-[^\\\\\\x80-\\xff\\n\\015\"] * # normal
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
-\" # \"
-# Quoted string
-)
-# leading word
-[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # \"normal\" atoms and or spaces
-(?:
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-|
-\" # \"
-[^\\\\\\x80-\\xff\\n\\015\"] * # normal
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
-\" # \"
-) # \"special\" comment or quoted string
-[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # more \"normal\"
-)*
-<
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# <
-(?:
-@
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-(?:
-\\.
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-)*
-(?: ,
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-@
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-(?:
-\\.
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-)*
-)* # additional domains
-:
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-)? # optional route
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-# Atom
-| # or
-\" # \"
-[^\\\\\\x80-\\xff\\n\\015\"] * # normal
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
-\" # \"
-# Quoted string
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-\\.
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-# Atom
-| # or
-\" # \"
-[^\\\\\\x80-\\xff\\n\\015\"] * # normal
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
-\" # \"
-# Quoted string
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# additional words
-)*
-@
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-(?:
-\\.
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-)*
-# address spec
-> # >
-# name and address
-)
-" nil nil nil t "user(a)dom.ain" nil 1 0 "user(a)dom.ain" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(300 "\"\\\"A. Other\\\" <user.1234\\(a)dom.ain> (a comment)\" =~ /[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional leading comment
-(?:
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-# Atom
-| # or
-\" # \"
-[^\\\\\\x80-\\xff\\n\\015\"] * # normal
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
-\" # \"
-# Quoted string
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-\\.
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-# Atom
-| # or
-\" # \"
-[^\\\\\\x80-\\xff\\n\\015\"] * # normal
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
-\" # \"
-# Quoted string
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# additional words
-)*
-@
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-(?:
-\\.
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-)*
-# address
-| # or
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-# Atom
-| # or
-\" # \"
-[^\\\\\\x80-\\xff\\n\\015\"] * # normal
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
-\" # \"
-# Quoted string
-)
-# leading word
-[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # \"normal\" atoms and or spaces
-(?:
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-|
-\" # \"
-[^\\\\\\x80-\\xff\\n\\015\"] * # normal
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
-\" # \"
-) # \"special\" comment or quoted string
-[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # more \"normal\"
-)*
-<
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# <
-(?:
-@
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-(?:
-\\.
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-)*
-(?: ,
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-@
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-(?:
-\\.
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-)*
-)* # additional domains
-:
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-)? # optional route
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-# Atom
-| # or
-\" # \"
-[^\\\\\\x80-\\xff\\n\\015\"] * # normal
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
-\" # \"
-# Quoted string
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-\\.
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-# Atom
-| # or
-\" # \"
-[^\\\\\\x80-\\xff\\n\\015\"] * # normal
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
-\" # \"
-# Quoted string
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# additional words
-)*
-@
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-(?:
-\\.
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-)*
-# address spec
-> # >
-# name and address
-)
-/x" "[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional leading comment
-(?:
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-# Atom
-| # or
-\" # \"
-[^\\\\\\x80-\\xff\\n\\015\"] * # normal
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
-\" # \"
-# Quoted string
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-\\.
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-# Atom
-| # or
-\" # \"
-[^\\\\\\x80-\\xff\\n\\015\"] * # normal
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
-\" # \"
-# Quoted string
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# additional words
-)*
-@
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-(?:
-\\.
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-)*
-# address
-| # or
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-# Atom
-| # or
-\" # \"
-[^\\\\\\x80-\\xff\\n\\015\"] * # normal
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
-\" # \"
-# Quoted string
-)
-# leading word
-[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # \"normal\" atoms and or spaces
-(?:
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-|
-\" # \"
-[^\\\\\\x80-\\xff\\n\\015\"] * # normal
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
-\" # \"
-) # \"special\" comment or quoted string
-[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # more \"normal\"
-)*
-<
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# <
-(?:
-@
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-(?:
-\\.
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-)*
-(?: ,
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-@
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-(?:
-\\.
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-)*
-)* # additional domains
-:
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-)? # optional route
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-# Atom
-| # or
-\" # \"
-[^\\\\\\x80-\\xff\\n\\015\"] * # normal
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
-\" # \"
-# Quoted string
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-\\.
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-# Atom
-| # or
-\" # \"
-[^\\\\\\x80-\\xff\\n\\015\"] * # normal
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
-\" # \"
-# Quoted string
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# additional words
-)*
-@
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-(?:
-\\.
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-)*
-# address spec
-> # >
-# name and address
-)
-" nil nil nil t "\"A. Other\" <user.1234(a)dom.ain> (a comment)" nil 1 0 "\"A. Other\" <user.1234(a)dom.ain>" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(301 "\"A. Other <user.1234\\(a)dom.ain> (a comment)\" =~ /[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional leading comment
-(?:
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-# Atom
-| # or
-\" # \"
-[^\\\\\\x80-\\xff\\n\\015\"] * # normal
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
-\" # \"
-# Quoted string
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-\\.
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-# Atom
-| # or
-\" # \"
-[^\\\\\\x80-\\xff\\n\\015\"] * # normal
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
-\" # \"
-# Quoted string
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# additional words
-)*
-@
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-(?:
-\\.
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-)*
-# address
-| # or
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-# Atom
-| # or
-\" # \"
-[^\\\\\\x80-\\xff\\n\\015\"] * # normal
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
-\" # \"
-# Quoted string
-)
-# leading word
-[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # \"normal\" atoms and or spaces
-(?:
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-|
-\" # \"
-[^\\\\\\x80-\\xff\\n\\015\"] * # normal
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
-\" # \"
-) # \"special\" comment or quoted string
-[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # more \"normal\"
-)*
-<
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# <
-(?:
-@
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-(?:
-\\.
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-)*
-(?: ,
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-@
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-(?:
-\\.
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-)*
-)* # additional domains
-:
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-)? # optional route
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-# Atom
-| # or
-\" # \"
-[^\\\\\\x80-\\xff\\n\\015\"] * # normal
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
-\" # \"
-# Quoted string
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-\\.
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-# Atom
-| # or
-\" # \"
-[^\\\\\\x80-\\xff\\n\\015\"] * # normal
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
-\" # \"
-# Quoted string
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# additional words
-)*
-@
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-(?:
-\\.
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-)*
-# address spec
-> # >
-# name and address
-)
-/x" "[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional leading comment
-(?:
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-# Atom
-| # or
-\" # \"
-[^\\\\\\x80-\\xff\\n\\015\"] * # normal
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
-\" # \"
-# Quoted string
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-\\.
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-# Atom
-| # or
-\" # \"
-[^\\\\\\x80-\\xff\\n\\015\"] * # normal
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
-\" # \"
-# Quoted string
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# additional words
-)*
-@
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-(?:
-\\.
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-)*
-# address
-| # or
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-# Atom
-| # or
-\" # \"
-[^\\\\\\x80-\\xff\\n\\015\"] * # normal
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
-\" # \"
-# Quoted string
-)
-# leading word
-[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # \"normal\" atoms and or spaces
-(?:
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-|
-\" # \"
-[^\\\\\\x80-\\xff\\n\\015\"] * # normal
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
-\" # \"
-) # \"special\" comment or quoted string
-[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # more \"normal\"
-)*
-<
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# <
-(?:
-@
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-(?:
-\\.
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-)*
-(?: ,
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-@
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-(?:
-\\.
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-)*
-)* # additional domains
-:
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-)? # optional route
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-# Atom
-| # or
-\" # \"
-[^\\\\\\x80-\\xff\\n\\015\"] * # normal
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
-\" # \"
-# Quoted string
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-\\.
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-# Atom
-| # or
-\" # \"
-[^\\\\\\x80-\\xff\\n\\015\"] * # normal
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
-\" # \"
-# Quoted string
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# additional words
-)*
-@
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-(?:
-\\.
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-)*
-# address spec
-> # >
-# name and address
-)
-" nil nil nil t "A. Other <user.1234(a)dom.ain> (a comment)" nil 1 0 " Other <user.1234(a)dom.ain>" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(302 "\"\\\"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\\\"\\(a)x400-re.lay\" =~ /[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional leading comment
-(?:
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-# Atom
-| # or
-\" # \"
-[^\\\\\\x80-\\xff\\n\\015\"] * # normal
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
-\" # \"
-# Quoted string
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-\\.
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-# Atom
-| # or
-\" # \"
-[^\\\\\\x80-\\xff\\n\\015\"] * # normal
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
-\" # \"
-# Quoted string
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# additional words
-)*
-@
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-(?:
-\\.
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-)*
-# address
-| # or
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-# Atom
-| # or
-\" # \"
-[^\\\\\\x80-\\xff\\n\\015\"] * # normal
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
-\" # \"
-# Quoted string
-)
-# leading word
-[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # \"normal\" atoms and or spaces
-(?:
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-|
-\" # \"
-[^\\\\\\x80-\\xff\\n\\015\"] * # normal
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
-\" # \"
-) # \"special\" comment or quoted string
-[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # more \"normal\"
-)*
-<
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# <
-(?:
-@
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-(?:
-\\.
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-)*
-(?: ,
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-@
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-(?:
-\\.
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-)*
-)* # additional domains
-:
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-)? # optional route
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-# Atom
-| # or
-\" # \"
-[^\\\\\\x80-\\xff\\n\\015\"] * # normal
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
-\" # \"
-# Quoted string
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-\\.
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-# Atom
-| # or
-\" # \"
-[^\\\\\\x80-\\xff\\n\\015\"] * # normal
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
-\" # \"
-# Quoted string
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# additional words
-)*
-@
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-(?:
-\\.
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-)*
-# address spec
-> # >
-# name and address
-)
-/x" "[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional leading comment
-(?:
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-# Atom
-| # or
-\" # \"
-[^\\\\\\x80-\\xff\\n\\015\"] * # normal
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
-\" # \"
-# Quoted string
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-\\.
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-# Atom
-| # or
-\" # \"
-[^\\\\\\x80-\\xff\\n\\015\"] * # normal
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
-\" # \"
-# Quoted string
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# additional words
-)*
-@
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-(?:
-\\.
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-)*
-# address
-| # or
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-# Atom
-| # or
-\" # \"
-[^\\\\\\x80-\\xff\\n\\015\"] * # normal
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
-\" # \"
-# Quoted string
-)
-# leading word
-[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # \"normal\" atoms and or spaces
-(?:
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-|
-\" # \"
-[^\\\\\\x80-\\xff\\n\\015\"] * # normal
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
-\" # \"
-) # \"special\" comment or quoted string
-[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # more \"normal\"
-)*
-<
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# <
-(?:
-@
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-(?:
-\\.
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-)*
-(?: ,
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-@
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-(?:
-\\.
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-)*
-)* # additional domains
-:
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-)? # optional route
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-# Atom
-| # or
-\" # \"
-[^\\\\\\x80-\\xff\\n\\015\"] * # normal
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
-\" # \"
-# Quoted string
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-\\.
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-# Atom
-| # or
-\" # \"
-[^\\\\\\x80-\\xff\\n\\015\"] * # normal
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
-\" # \"
-# Quoted string
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# additional words
-)*
-@
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-(?:
-\\.
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-)*
-# address spec
-> # >
-# name and address
-)
-" nil nil nil t "\"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\"@x400-re.lay" nil 1 0 "\"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\"@x400-re.lay" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(303 "\"A missing angle <user\\(a)some.where\" =~ /[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional leading comment
-(?:
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-# Atom
-| # or
-\" # \"
-[^\\\\\\x80-\\xff\\n\\015\"] * # normal
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
-\" # \"
-# Quoted string
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-\\.
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-# Atom
-| # or
-\" # \"
-[^\\\\\\x80-\\xff\\n\\015\"] * # normal
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
-\" # \"
-# Quoted string
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# additional words
-)*
-@
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-(?:
-\\.
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-)*
-# address
-| # or
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-# Atom
-| # or
-\" # \"
-[^\\\\\\x80-\\xff\\n\\015\"] * # normal
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
-\" # \"
-# Quoted string
-)
-# leading word
-[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # \"normal\" atoms and or spaces
-(?:
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-|
-\" # \"
-[^\\\\\\x80-\\xff\\n\\015\"] * # normal
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
-\" # \"
-) # \"special\" comment or quoted string
-[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # more \"normal\"
-)*
-<
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# <
-(?:
-@
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-(?:
-\\.
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-)*
-(?: ,
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-@
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-(?:
-\\.
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-)*
-)* # additional domains
-:
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-)? # optional route
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-# Atom
-| # or
-\" # \"
-[^\\\\\\x80-\\xff\\n\\015\"] * # normal
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
-\" # \"
-# Quoted string
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-\\.
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-# Atom
-| # or
-\" # \"
-[^\\\\\\x80-\\xff\\n\\015\"] * # normal
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
-\" # \"
-# Quoted string
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# additional words
-)*
-@
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-(?:
-\\.
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-)*
-# address spec
-> # >
-# name and address
-)
-/x" "[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional leading comment
-(?:
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-# Atom
-| # or
-\" # \"
-[^\\\\\\x80-\\xff\\n\\015\"] * # normal
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
-\" # \"
-# Quoted string
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-\\.
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-# Atom
-| # or
-\" # \"
-[^\\\\\\x80-\\xff\\n\\015\"] * # normal
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
-\" # \"
-# Quoted string
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# additional words
-)*
-@
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-(?:
-\\.
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-)*
-# address
-| # or
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-# Atom
-| # or
-\" # \"
-[^\\\\\\x80-\\xff\\n\\015\"] * # normal
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
-\" # \"
-# Quoted string
-)
-# leading word
-[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # \"normal\" atoms and or spaces
-(?:
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-|
-\" # \"
-[^\\\\\\x80-\\xff\\n\\015\"] * # normal
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
-\" # \"
-) # \"special\" comment or quoted string
-[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # more \"normal\"
-)*
-<
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# <
-(?:
-@
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-(?:
-\\.
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-)*
-(?: ,
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-@
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-(?:
-\\.
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-)*
-)* # additional domains
-:
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-)? # optional route
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-# Atom
-| # or
-\" # \"
-[^\\\\\\x80-\\xff\\n\\015\"] * # normal
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
-\" # \"
-# Quoted string
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-\\.
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-# Atom
-| # or
-\" # \"
-[^\\\\\\x80-\\xff\\n\\015\"] * # normal
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
-\" # \"
-# Quoted string
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# additional words
-)*
-@
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-(?:
-\\.
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-)*
-# address spec
-> # >
-# name and address
-)
-" nil nil nil t "A missing angle <user(a)some.where" nil 1 0 "user(a)some.where" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(304 "\"The quick brown fox\" =~ /[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional leading comment
-(?:
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-# Atom
-| # or
-\" # \"
-[^\\\\\\x80-\\xff\\n\\015\"] * # normal
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
-\" # \"
-# Quoted string
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-\\.
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-# Atom
-| # or
-\" # \"
-[^\\\\\\x80-\\xff\\n\\015\"] * # normal
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
-\" # \"
-# Quoted string
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# additional words
-)*
-@
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-(?:
-\\.
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-)*
-# address
-| # or
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-# Atom
-| # or
-\" # \"
-[^\\\\\\x80-\\xff\\n\\015\"] * # normal
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
-\" # \"
-# Quoted string
-)
-# leading word
-[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # \"normal\" atoms and or spaces
-(?:
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-|
-\" # \"
-[^\\\\\\x80-\\xff\\n\\015\"] * # normal
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
-\" # \"
-) # \"special\" comment or quoted string
-[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # more \"normal\"
-)*
-<
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# <
-(?:
-@
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-(?:
-\\.
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-)*
-(?: ,
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-@
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-(?:
-\\.
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-)*
-)* # additional domains
-:
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-)? # optional route
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-# Atom
-| # or
-\" # \"
-[^\\\\\\x80-\\xff\\n\\015\"] * # normal
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
-\" # \"
-# Quoted string
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-\\.
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-# Atom
-| # or
-\" # \"
-[^\\\\\\x80-\\xff\\n\\015\"] * # normal
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
-\" # \"
-# Quoted string
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# additional words
-)*
-@
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-(?:
-\\.
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-)*
-# address spec
-> # >
-# name and address
-)
-/x" "[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional leading comment
-(?:
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-# Atom
-| # or
-\" # \"
-[^\\\\\\x80-\\xff\\n\\015\"] * # normal
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
-\" # \"
-# Quoted string
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-\\.
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-# Atom
-| # or
-\" # \"
-[^\\\\\\x80-\\xff\\n\\015\"] * # normal
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
-\" # \"
-# Quoted string
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# additional words
-)*
-@
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-(?:
-\\.
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-)*
-# address
-| # or
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-# Atom
-| # or
-\" # \"
-[^\\\\\\x80-\\xff\\n\\015\"] * # normal
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
-\" # \"
-# Quoted string
-)
-# leading word
-[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # \"normal\" atoms and or spaces
-(?:
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-|
-\" # \"
-[^\\\\\\x80-\\xff\\n\\015\"] * # normal
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
-\" # \"
-) # \"special\" comment or quoted string
-[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # more \"normal\"
-)*
-<
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# <
-(?:
-@
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-(?:
-\\.
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-)*
-(?: ,
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-@
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-(?:
-\\.
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-)*
-)* # additional domains
-:
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-)? # optional route
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-# Atom
-| # or
-\" # \"
-[^\\\\\\x80-\\xff\\n\\015\"] * # normal
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
-\" # \"
-# Quoted string
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-\\.
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-# Atom
-| # or
-\" # \"
-[^\\\\\\x80-\\xff\\n\\015\"] * # normal
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )*
-\" # \"
-# Quoted string
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# additional words
-)*
-@
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-(?:
-\\.
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...
-(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom
-|
-\\[ # [
-(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff
-\\] # ]
-)
-[\\040\\t]* # Nab whitespace.
-(?:
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: # (
-(?: \\\\ [^\\x80-\\xff] |
-\\( # (
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*
-\\) # )
-) # special
-[^\\\\\\x80-\\xff\\n\\015()] * # normal*
-)* # )*
-\\) # )
-[\\040\\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-)*
-# address spec
-> # >
-# name and address
-)
-" nil nil nil t "The quick brown fox" nil 1 0 nil nil)
-(305 "\"abc\\0def\\00pqr\\000xyz\\0000AB\" =~ /abc\\0def\\00pqr\\000xyz\\0000AB/" "abc\\0def\\00pqr\\000xyz\\0000AB" nil nil nil nil ("abc" 0 "def" 0 "pqr" 0 "xyz" 0 "0AB") nil 1 0 ("abc" 0 "def" 0 "pqr" 0 "xyz" 0 "0AB") (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(306 "\"abc456 abc\\0def\\00pqr\\000xyz\\0000ABCDE\" =~ /abc\\0def\\00pqr\\000xyz\\0000AB/" "abc\\0def\\00pqr\\000xyz\\0000AB" nil nil nil nil ("abc456 abc" 0 "def" 0 "pqr" 0 "xyz" 0 "0ABCDE") nil 1 0 ("abc" 0 "def" 0 "pqr" 0 "xyz" 0 "0AB") (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(307 "\"abc\\x0def\\x00pqr\\x000xyz\\x0000AB\" =~ /abc\\x0def\\x00pqr\\x000xyz\\x0000AB/" "abc\\x0def\\x00pqr\\x000xyz\\x0000AB" nil nil nil nil ("abc" 13 "ef" 0 "pqr" 0 "0xyz" 0 "00AB") nil 1 0 ("abc" 13 "ef" 0 "pqr" 0 "0xyz" 0 "00AB") (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(308 "\"abc456 abc\\x0def\\x00pqr\\x000xyz\\x0000ABCDE\" =~ /abc\\x0def\\x00pqr\\x000xyz\\x0000AB/" "abc\\x0def\\x00pqr\\x000xyz\\x0000AB" nil nil nil nil ("abc456 abc" 13 "ef" 0 "pqr" 0 "0xyz" 0 "00ABCDE") nil 1 0 ("abc" 13 "ef" 0 "pqr" 0 "0xyz" 0 "00AB") (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(309 "\"\\0A\" =~ /^[\\000-\\037]/" "^[\\000-\\037]" nil nil nil nil ("" 0 "A") nil 1 0 ("" 0) (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(310 "\"\\01B\" =~ /^[\\000-\\037]/" "^[\\000-\\037]" nil nil nil nil ("" 1 "B") nil 1 0 ("" 1) (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(311 "\"\\037C\" =~ /^[\\000-\\037]/" "^[\\000-\\037]" nil nil nil nil ("" 31 "C") nil 1 0 ("" 31) (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(312 "\"\\0\\0\\0\\0\" =~ /\\0*/" "\\0*" nil nil nil nil ("" 0 0 0 0) nil 1 0 ("" 0 0 0 0) (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(313 "\"The A\\x0\\x0Z\" =~ /A\\x0{2,3}Z/" "A\\x0{2,3}Z" nil nil nil nil ("The A" 0 0 "Z") nil 1 0 ("A" 0 0 "Z") (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(314 "\"An A\\0\\x0\\0Z\" =~ /A\\x0{2,3}Z/" "A\\x0{2,3}Z" nil nil nil nil ("An A" 0 0 0 "Z") nil 1 0 ("A" 0 0 0 "Z") (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(315 "\"A\\0Z\" =~ /A\\x0{2,3}Z/" "A\\x0{2,3}Z" nil nil nil nil ("A" 0 "Z") nil 1 0 nil nil)
-(316 "\"A\\0\\x0\\0\\x0Z\" =~ /A\\x0{2,3}Z/" "A\\x0{2,3}Z" nil nil nil nil ("A" 0 0 0 0 "Z") nil 1 0 nil nil)
-(317 "\"cowcowbell\" =~ /^(cow|)\\1(bell)/" "^(cow|)\\1(bell)" nil nil nil nil "cowcowbell" nil 1 0 "cowcowbell" ("cow" "bell" nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(318 "\"bell\" =~ /^(cow|)\\1(bell)/" "^(cow|)\\1(bell)" nil nil nil nil "bell" nil 1 0 "bell" ("" "bell" nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(319 "\"cowbell\" =~ /^(cow|)\\1(bell)/" "^(cow|)\\1(bell)" nil nil nil nil "cowbell" nil 1 0 nil nil)
-(320 "\"\\040abc\" =~ /^\\s/" "^\\s" nil nil nil nil " abc" nil 1 0 " " (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(321 "\"\\x0cabc\" =~ /^\\s/" "^\\s" nil nil nil nil ("" 12 "abc") nil 1 0 ("" 12) (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(322 "\"\\nabc\" =~ /^\\s/" "^\\s" nil nil nil nil "
-abc" nil 1 0 "
-" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(323 "\"\\rabc\" =~ /^\\s/" "^\\s" nil nil nil nil ("" 13 "abc") nil 1 0 ("" 13) (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(324 "\"\\tabc\" =~ /^\\s/" "^\\s" nil nil nil nil ("" 9 "abc") nil 1 0 ("" 9) (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(325 "\"abc\" =~ /^\\s/" "^\\s" nil nil nil nil "abc" nil 1 0 nil nil)
-(326 ("\"abc\" =~ /^a" 9 "b" 10 " " 13 " " 12 " c/x") "^a b
-
c" nil nil nil t "abc" nil 1 0 "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(327 "\"ab\" =~ /^(a|)\\1*b/" "^(a|)\\1*b" nil nil nil nil "ab" nil 1 0 "ab" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(328 "\"aaaab\" =~ /^(a|)\\1*b/" "^(a|)\\1*b" nil nil nil nil "aaaab" nil 1 0 "aaaab" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(329 "\"b\" =~ /^(a|)\\1*b/" "^(a|)\\1*b" nil nil nil nil "b" nil 1 0 "b" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(330 "\"acb\" =~ /^(a|)\\1*b/" "^(a|)\\1*b" nil nil nil nil "acb" nil 1 0 nil nil)
-(331 "\"aab\" =~ /^(a|)\\1+b/" "^(a|)\\1+b" nil nil nil nil "aab" nil 1 0 "aab" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(332 "\"aaaab\" =~ /^(a|)\\1+b/" "^(a|)\\1+b" nil nil nil nil "aaaab" nil 1 0 "aaaab" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(333 "\"b\" =~ /^(a|)\\1+b/" "^(a|)\\1+b" nil nil nil nil "b" nil 1 0 "b" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(334 "\"ab\" =~ /^(a|)\\1+b/" "^(a|)\\1+b" nil nil nil nil "ab" nil 1 0 nil nil)
-(335 "\"ab\" =~ /^(a|)\\1?b/" "^(a|)\\1?b" nil nil nil nil "ab" nil 1 0 "ab" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(336 "\"aab\" =~ /^(a|)\\1?b/" "^(a|)\\1?b" nil nil nil nil "aab" nil 1 0 "aab" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(337 "\"b\" =~ /^(a|)\\1?b/" "^(a|)\\1?b" nil nil nil nil "b" nil 1 0 "b" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(338 "\"acb\" =~ /^(a|)\\1?b/" "^(a|)\\1?b" nil nil nil nil "acb" nil 1 0 nil nil)
-(339 "\"aaab\" =~ /^(a|)\\1{2}b/" "^(a|)\\1{2}b" nil nil nil nil "aaab" nil 1 0 "aaab" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(340 "\"b\" =~ /^(a|)\\1{2}b/" "^(a|)\\1{2}b" nil nil nil nil "b" nil 1 0 "b" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(341 "\"ab\" =~ /^(a|)\\1{2}b/" "^(a|)\\1{2}b" nil nil nil nil "ab" nil 1 0 nil nil)
-(342 "\"aab\" =~ /^(a|)\\1{2}b/" "^(a|)\\1{2}b" nil nil nil nil "aab" nil 1 0 nil nil)
-(343 "\"aaaab\" =~ /^(a|)\\1{2}b/" "^(a|)\\1{2}b" nil nil nil nil "aaaab" nil 1 0 nil nil)
-(344 "\"aaab\" =~ /^(a|)\\1{2,3}b/" "^(a|)\\1{2,3}b" nil nil nil nil "aaab" nil 1 0 "aaab" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(345 "\"aaaab\" =~ /^(a|)\\1{2,3}b/" "^(a|)\\1{2,3}b" nil nil nil nil "aaaab" nil 1 0 "aaaab" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(346 "\"b\" =~ /^(a|)\\1{2,3}b/" "^(a|)\\1{2,3}b" nil nil nil nil "b" nil 1 0 "b" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(347 "\"ab\" =~ /^(a|)\\1{2,3}b/" "^(a|)\\1{2,3}b" nil nil nil nil "ab" nil 1 0 nil nil)
-(348 "\"aab\" =~ /^(a|)\\1{2,3}b/" "^(a|)\\1{2,3}b" nil nil nil nil "aab" nil 1 0 nil nil)
-(349 "\"aaaaab\" =~ /^(a|)\\1{2,3}b/" "^(a|)\\1{2,3}b" nil nil nil nil "aaaaab" nil 1 0 nil nil)
-(350 "\"abbbbc\" =~ /ab{1,3}bc/" "ab{1,3}bc" nil nil nil nil "abbbbc" nil 1 0 "abbbbc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(351 "\"abbbc\" =~ /ab{1,3}bc/" "ab{1,3}bc" nil nil nil nil "abbbc" nil 1 0 "abbbc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(352 "\"abbc\" =~ /ab{1,3}bc/" "ab{1,3}bc" nil nil nil nil "abbc" nil 1 0 "abbc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(353 "\"abc\" =~ /ab{1,3}bc/" "ab{1,3}bc" nil nil nil nil "abc" nil 1 0 nil nil)
-(354 "\"abbbbbc\" =~ /ab{1,3}bc/" "ab{1,3}bc" nil nil nil nil "abbbbbc" nil 1 0 nil nil)
-(355 "\"track1.title:TBlah blah blah\" =~ /([^.]*)\\.([^:]*):[T ]+(.*)/" "([^.]*)\\.([^:]*):[T ]+(.*)" nil nil nil nil "track1.title:TBlah blah blah" nil 1 0 "track1.title:TBlah blah blah" ("track1" "title" "Blah blah blah" nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(356 "\"track1.title:TBlah blah blah\" =~ /([^.]*)\\.([^:]*):[T ]+(.*)/i" "([^.]*)\\.([^:]*):[T ]+(.*)" t nil nil nil "track1.title:TBlah blah blah" nil 1 0 "track1.title:TBlah blah blah" ("track1" "title" "Blah blah blah" nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(357 "\"track1.title:TBlah blah blah\" =~ /([^.]*)\\.([^:]*):[t ]+(.*)/i" "([^.]*)\\.([^:]*):[t ]+(.*)" t nil nil nil "track1.title:TBlah blah blah" nil 1 0 "track1.title:TBlah blah blah" ("track1" "title" "Blah blah blah" nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(358 "\"WXY_^abc\" =~ /^[W-c]+$/" "^[W-c]+$" nil nil nil nil "WXY_^abc" nil 1 0 "WXY_^abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(359 "\"wxy\" =~ /^[W-c]+$/" "^[W-c]+$" nil nil nil nil "wxy" nil 1 0 nil nil)
-(360 "\"WXY_^abc\" =~ /^[W-c]+$/i" "^[W-c]+$" t nil nil nil "WXY_^abc" nil 1 0 "WXY_^abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(361 "\"wxy_^ABC\" =~ /^[W-c]+$/i" "^[W-c]+$" t nil nil nil "wxy_^ABC" nil 1 0 "wxy_^ABC" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(362 "\"WXY_^abc\" =~ /^[\\x3f-\\x5F]+$/i" "^[\\x3f-\\x5F]+$" t nil nil nil "WXY_^abc" nil 1 0 "WXY_^abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(363 "\"wxy_^ABC\" =~ /^[\\x3f-\\x5F]+$/i" "^[\\x3f-\\x5F]+$" t nil nil nil "wxy_^ABC" nil 1 0 "wxy_^ABC" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(364 "\"abc\" =~ /^abc$/m" "^abc$" nil t nil nil "abc" nil 1 0 "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(365 "\"qqq\\nabc\" =~ /^abc$/m" "^abc$" nil t nil nil "qqq
-abc" nil 1 0 "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(366 "\"abc\\nzzz\" =~ /^abc$/m" "^abc$" nil t nil nil "abc
-zzz" nil 1 0 "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(367 "\"qqq\\nabc\\nzzz\" =~ /^abc$/m" "^abc$" nil t nil nil "qqq
-abc
-zzz" nil 1 0 "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(368 "\"abc\" =~ /^abc$/" "^abc$" nil nil nil nil "abc" nil 1 0 "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(369 "\"qqq\\nabc\" =~ /^abc$/" "^abc$" nil nil nil nil "qqq
-abc" nil 1 0 nil nil)
-(370 "\"abc\\nzzz\" =~ /^abc$/" "^abc$" nil nil nil nil "abc
-zzz" nil 1 0 nil nil)
-(371 "\"qqq\\nabc\\nzzz\" =~ /^abc$/" "^abc$" nil nil nil nil "qqq
-abc
-zzz" nil 1 0 nil nil)
-(372 "\"abc\" =~ /\\Aabc\\Z/m" "\\Aabc\\Z" nil t nil nil "abc" nil 1 0 "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(373 "\"abc\\n\" =~ /\\Aabc\\Z/m" "\\Aabc\\Z" nil t nil nil "abc
-" nil 1 0 "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(374 "\"qqq\\nabc\" =~ /\\Aabc\\Z/m" "\\Aabc\\Z" nil t nil nil "qqq
-abc" nil 1 0 nil nil)
-(375 "\"abc\\nzzz\" =~ /\\Aabc\\Z/m" "\\Aabc\\Z" nil t nil nil "abc
-zzz" nil 1 0 nil nil)
-(376 "\"qqq\\nabc\\nzzz\" =~ /\\Aabc\\Z/m" "\\Aabc\\Z" nil t nil nil "qqq
-abc
-zzz" nil 1 0 nil nil)
-(377 "\"abc\\ndef\" =~ /\\A(.)*\\Z/s" "\\A(.)*\\Z" nil nil t nil "abc
-def" nil 1 0 "abc
-def" ("f" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(378 "\"abc\\ndef\" =~ /\\A(.)*\\Z/m" "\\A(.)*\\Z" nil t nil nil "abc
-def" nil 1 0 nil nil)
-(379 "\"b::c\" =~ /(?:b)|(?::+)/" "(?:b)|(?::+)" nil nil nil nil "b::c" nil 1 0 "b" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(380 "\"c::b\" =~ /(?:b)|(?::+)/" "(?:b)|(?::+)" nil nil nil nil "c::b" nil 1 0 "::" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(381 "\"az-\" =~ /[-az]+/" "[-az]+" nil nil nil nil "az-" nil 1 0 "az-" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(382 "\"b\" =~ /[-az]+/" "[-az]+" nil nil nil nil "b" nil 1 0 nil nil)
-(383 "\"za-\" =~ /[az-]+/" "[az-]+" nil nil nil nil "za-" nil 1 0 "za-" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(384 "\"b\" =~ /[az-]+/" "[az-]+" nil nil nil nil "b" nil 1 0 nil nil)
-(385 "\"a-z\" =~ /[a\\-z]+/" "[a\\-z]+" nil nil nil nil "a-z" nil 1 0 "a-z" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(386 "\"b\" =~ /[a\\-z]+/" "[a\\-z]+" nil nil nil nil "b" nil 1 0 nil nil)
-(387 "\"abcdxyz\" =~ /[a-z]+/" "[a-z]+" nil nil nil nil "abcdxyz" nil 1 0 "abcdxyz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(388 "\"12-34\" =~ /[\\d-]+/" "[\\d-]+" nil nil nil nil "12-34" nil 1 0 "12-34" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(389 "\"aaa\" =~ /[\\d-]+/" "[\\d-]+" nil nil nil nil "aaa" nil 1 0 nil nil)
-(390 "\"12-34z\" =~ /[\\d-z]+/" "[\\d-z]+" nil nil nil nil "12-34z" nil 1 0 "12-34z" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(391 "\"aaa\" =~ /[\\d-z]+/" "[\\d-z]+" nil nil nil nil "aaa" nil 1 0 nil nil)
-(392 "\"\\\\\" =~ /\\x5c/" "\\x5c" nil nil nil nil "\\" nil 1 0 "\\" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(393 "\"the Zoo\" =~ /\\x20Z/" "\\x20Z" nil nil nil nil "the Zoo" nil 1 0 " Z" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(394 "\"Zulu\" =~ /\\x20Z/" "\\x20Z" nil nil nil nil "Zulu" nil 1 0 nil nil)
-(395 "\"abcabc\" =~ /(abc)\\1/i" "(abc)\\1" t nil nil nil "abcabc" nil 1 0 "abcabc" ("abc" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(396 "\"ABCabc\" =~ /(abc)\\1/i" "(abc)\\1" t nil nil nil "ABCabc" nil 1 0 "ABCabc" ("ABC" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(397 "\"abcABC\" =~ /(abc)\\1/i" "(abc)\\1" t nil nil nil "abcABC" nil 1 0 "abcABC" ("abc" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(398 "\"ab{3cd\" =~ /ab{3cd/" "ab{3cd" nil nil nil nil "ab{3cd" nil 1 0 "ab{3cd" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(399 "\"ab{3,cd\" =~ /ab{3,cd/" "ab{3,cd" nil nil nil nil "ab{3,cd" nil 1 0 "ab{3,cd" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(400 "\"ab{3,4a}cd\" =~ /ab{3,4a}cd/" "ab{3,4a}cd" nil nil nil nil "ab{3,4a}cd" nil 1 0 "ab{3,4a}cd" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(401 "\"{4,5a}bc\" =~ /{4,5a}bc/" "{4,5a}bc" nil nil nil nil "{4,5a}bc" nil 1 0 "{4,5a}bc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(402 "\"a\\rb\" =~ /^a.b/" "^a.b" nil nil nil nil ("a" 13 "b") nil 1 0 ("a" 13 "b") (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(403 "\"a\\nb\" =~ /^a.b/" "^a.b" nil nil nil nil "a
-b" nil 1 0 nil nil)
-(404 "\"abc\" =~ /abc$/" "abc$" nil nil nil nil "abc" nil 1 0 "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(405 "\"abc\\n\" =~ /abc$/" "abc$" nil nil nil nil "abc
-" nil 1 0 "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(406 "\"abc\\ndef\" =~ /abc$/" "abc$" nil nil nil nil "abc
-def" nil 1 0 nil nil)
-(407 "\"abc\\x53\" =~ /(abc)\\123/" "(abc)\\123" nil nil nil nil "abcS" nil 1 0 "abcS" ("abc" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(408 "\"abc\\x93\" =~ /(abc)\\223/" "(abc)\\223" nil nil nil nil ("abc" 147) nil 1 0 ("abc" 147) ("abc" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(409 "\"abc\\xd3\" =~ /(abc)\\323/" "(abc)\\323" nil nil nil nil ("abc" 211) nil 1 0 ("abc" 211) ("abc" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(410 "\"abc\\x40\" =~ /(abc)\\500/" "(abc)\\500" nil nil nil nil "abc@" nil 1 0 "abc@" ("abc" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(411 "\"abc\\100\" =~ /(abc)\\500/" "(abc)\\500" nil nil nil nil "abc@" nil 1 0 "abc@" ("abc" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(412 "\"abc\\x400\" =~ /(abc)\\5000/" "(abc)\\5000" nil nil nil nil "abc@0" nil 1 0 "abc@0" ("abc" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(413 "\"abc\\x40\\x30\" =~ /(abc)\\5000/" "(abc)\\5000" nil nil nil nil "abc@0" nil 1 0 "abc@0" ("abc" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(414 "\"abc\\1000\" =~ /(abc)\\5000/" "(abc)\\5000" nil nil nil nil "abc@0" nil 1 0 "abc@0" ("abc" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(415 "\"abc\\100\\x30\" =~ /(abc)\\5000/" "(abc)\\5000" nil nil nil nil "abc@0" nil 1 0 "abc@0" ("abc" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(416 "\"abc\\100\\060\" =~ /(abc)\\5000/" "(abc)\\5000" nil nil nil nil "abc@0" nil 1 0 "abc@0" ("abc" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(417 "\"abc\\100\\60\" =~ /(abc)\\5000/" "(abc)\\5000" nil nil nil nil "abc@0" nil 1 0 "abc@0" ("abc" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(418 "\"abc\\081\" =~ /abc\\81/" "abc\\81" nil nil nil nil ("abc" 0 "81") nil 1 0 ("abc" 0 "81") (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(419 "\"abc\\0\\x38\\x31\" =~ /abc\\81/" "abc\\81" nil nil nil nil ("abc" 0 "81") nil 1 0 ("abc" 0 "81") (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(420 "\"abc\\091\" =~ /abc\\91/" "abc\\91" nil nil nil nil ("abc" 0 "91") nil 1 0 ("abc" 0 "91") (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(421 "\"abc\\0\\x39\\x31\" =~ /abc\\91/" "abc\\91" nil nil nil nil ("abc" 0 "91") nil 1 0 ("abc" 0 "91") (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(422 "\"abcdefghijkllS\" =~ /(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)(l)\\12\\123/" "(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)(l)\\12\\123" nil nil nil nil "abcdefghijkllS" nil 1 0 "abcdefghijkllS" ("a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" nil nil nil nil))
-(423 "\"abcdefghijk\\12S\" =~ /(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)\\12\\123/" "(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)\\12\\123" nil nil nil nil "abcdefghijk
-S" nil 1 0 "abcdefghijk
-S" ("a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" nil nil nil nil nil))
-(424 "\"abgdef\" =~ /ab\\gdef/" "ab\\gdef" nil nil nil nil "abgdef" nil 1 0 "abgdef" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(425 "\"bc\" =~ /a{0}bc/" "a{0}bc" nil nil nil nil "bc" nil 1 0 "bc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(426 "\"xyz\" =~ /(a|(bc)){0,0}?xyz/" "(a|(bc)){0,0}?xyz" nil nil nil nil "xyz" nil 1 0 "xyz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(427 "\"abc\\010de\" =~ /abc[\\10]de/" "abc[\\10]de" nil nil nil nil ("abc" 8 "de") nil 1 0 ("abc" 8 "de") (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(428 "\"abc\\1de\" =~ /abc[\\1]de/" "abc[\\1]de" nil nil nil nil ("abc" 1 "de") nil 1 0 ("abc" 1 "de") (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(429 "\"abc\\1de\" =~ /(abc)[\\1]de/" "(abc)[\\1]de" nil nil nil nil ("abc" 1 "de") nil 1 0 ("abc" 1 "de") ("abc" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(430 "\"a\\nb\" =~ /a.b(?s)/" "a.b(?s)" nil nil nil nil "a
-b" nil 1 0 nil nil)
-(431 "\"baNOTccccd\" =~ /^([^a])([^\\b])([^c]*)([^d]{3,4})/" "^([^a])([^\\b])([^c]*)([^d]{3,4})" nil nil nil nil "baNOTccccd" nil 1 0 "baNOTcccc" ("b" "a" "NOT" "cccc" nil nil nil nil nil nil nil nil nil nil nil nil))
-(432 "\"baNOTcccd\" =~ /^([^a])([^\\b])([^c]*)([^d]{3,4})/" "^([^a])([^\\b])([^c]*)([^d]{3,4})" nil nil nil nil "baNOTcccd" nil 1 0 "baNOTccc" ("b" "a" "NOT" "ccc" nil nil nil nil nil nil nil nil nil nil nil nil))
-(433 "\"baNOTccd\" =~ /^([^a])([^\\b])([^c]*)([^d]{3,4})/" "^([^a])([^\\b])([^c]*)([^d]{3,4})" nil nil nil nil "baNOTccd" nil 1 0 "baNOTcc" ("b" "a" "NO" "Tcc" nil nil nil nil nil nil nil nil nil nil nil nil))
-(434 "\"bacccd\" =~ /^([^a])([^\\b])([^c]*)([^d]{3,4})/" "^([^a])([^\\b])([^c]*)([^d]{3,4})" nil nil nil nil "bacccd" nil 1 0 "baccc" ("b" "a" "" "ccc" nil nil nil nil nil nil nil nil nil nil nil nil))
-(435 "\"anything\" =~ /^([^a])([^\\b])([^c]*)([^d]{3,4})/" "^([^a])([^\\b])([^c]*)([^d]{3,4})" nil nil nil nil "anything" nil 1 0 nil nil)
-(436 "\"b\\bc\" =~ /^([^a])([^\\b])([^c]*)([^d]{3,4})/" "^([^a])([^\\b])([^c]*)([^d]{3,4})" nil nil nil nil ("b" 8 "c") nil 1 0 nil nil)
-(437 "\"baccd\" =~ /^([^a])([^\\b])([^c]*)([^d]{3,4})/" "^([^a])([^\\b])([^c]*)([^d]{3,4})" nil nil nil nil "baccd" nil 1 0 nil nil)
-(438 "\"Abc\" =~ /[^a]/" "[^a]" nil nil nil nil "Abc" nil 1 0 "A" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(439 "\"Abc\" =~ /[^a]/i" "[^a]" t nil nil nil "Abc" nil 1 0 "b" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(440 "\"AAAaAbc\" =~ /[^a]+/" "[^a]+" nil nil nil nil "AAAaAbc" nil 1 0 "AAA" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(441 "\"AAAaAbc\" =~ /[^a]+/i" "[^a]+" t nil nil nil "AAAaAbc" nil 1 0 "bc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(442 "\"bbb\\nccc\" =~ /[^a]+/" "[^a]+" nil nil nil nil "bbb
-ccc" nil 1 0 "bbb
-ccc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(443 "\"abc\" =~ /[^k]$/" "[^k]$" nil nil nil nil "abc" nil 1 0 "c" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(444 "\"abk\" =~ /[^k]$/" "[^k]$" nil nil nil nil "abk" nil 1 0 nil nil)
-(445 "\"abc\" =~ /[^k]{2,3}$/" "[^k]{2,3}$" nil nil nil nil "abc" nil 1 0 "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(446 "\"kbc\" =~ /[^k]{2,3}$/" "[^k]{2,3}$" nil nil nil nil "kbc" nil 1 0 "bc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(447 "\"kabc\" =~ /[^k]{2,3}$/" "[^k]{2,3}$" nil nil nil nil "kabc" nil 1 0 "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(448 "\"abk\" =~ /[^k]{2,3}$/" "[^k]{2,3}$" nil nil nil nil "abk" nil 1 0 nil nil)
-(449 "\"akb\" =~ /[^k]{2,3}$/" "[^k]{2,3}$" nil nil nil nil "akb" nil 1 0 nil nil)
-(450 "\"akk\" =~ /[^k]{2,3}$/" "[^k]{2,3}$" nil nil nil nil "akk" nil 1 0 nil nil)
-(451 "\"12345678\\(a)a.b.c.d\" =~ /^\\d{8,}\\@.+[^k]$/" "^\\d{8,}\\@.+[^k]$" nil nil nil nil "12345678(a)a.b.c.d" nil 1 0 "12345678(a)a.b.c.d" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(452 "\"123456789\\(a)x.y.z\" =~ /^\\d{8,}\\@.+[^k]$/" "^\\d{8,}\\@.+[^k]$" nil nil nil nil "123456789(a)x.y.z" nil 1 0 "123456789(a)x.y.z" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(453 "\"12345678\\(a)x.y.uk\" =~ /^\\d{8,}\\@.+[^k]$/" "^\\d{8,}\\@.+[^k]$" nil nil nil nil "12345678(a)x.y.uk" nil 1 0 nil nil)
-(454 "\"1234567\\(a)a.b.c.d\" =~ /^\\d{8,}\\@.+[^k]$/" "^\\d{8,}\\@.+[^k]$" nil nil nil nil "1234567(a)a.b.c.d" nil 1 0 nil nil)
-(455 "\"aaaaaaaaa\" =~ /(a)\\1{8,}/" "(a)\\1{8,}" nil nil nil nil "aaaaaaaaa" nil 1 0 "aaaaaaaaa" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(456 "\"aaaaaaaaaa\" =~ /(a)\\1{8,}/" "(a)\\1{8,}" nil nil nil nil "aaaaaaaaaa" nil 1 0 "aaaaaaaaaa" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(457 "\"aaaaaaa\" =~ /(a)\\1{8,}/" "(a)\\1{8,}" nil nil nil nil "aaaaaaa" nil 1 0 nil nil)
-(458 "\"aaaabcd\" =~ /[^a]/" "[^a]" nil nil nil nil "aaaabcd" nil 1 0 "b" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(459 "\"aaAabcd\" =~ /[^a]/" "[^a]" nil nil nil nil "aaAabcd" nil 1 0 "A" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(460 "\"aaaabcd\" =~ /[^a]/i" "[^a]" t nil nil nil "aaaabcd" nil 1 0 "b" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(461 "\"aaAabcd\" =~ /[^a]/i" "[^a]" t nil nil nil "aaAabcd" nil 1 0 "b" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(462 "\"aaaabcd\" =~ /[^az]/" "[^az]" nil nil nil nil "aaaabcd" nil 1 0 "b" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(463 "\"aaAabcd\" =~ /[^az]/" "[^az]" nil nil nil nil "aaAabcd" nil 1 0 "A" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(464 "\"aaaabcd\" =~ /[^az]/i" "[^az]" t nil nil nil "aaaabcd" nil 1 0 "b" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(465 "\"aaAabcd\" =~ /[^az]/i" "[^az]" t nil nil nil "aaAabcd" nil 1 0 "b" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(466 "\"\\000\\001\\002\\003\\004\\005\\006\\007\\010\\011\\012\\013\\014\\015\\016\\017\\020\\021\\022\\023\\024\\025\\026\\027\\030\\031\\032\\033\\034\\035\\036\\037\\040\\041\\042\\043\\044\\045\\046\\047\\050\\051\\052\\053\\054\\055\\056\\057\\060\\061\\062\\063\\064\\065\\066\\067\\070\\071\\072\\073\\074\\075\\076\\077\\100\\101\\102\\103\\104\\105\\106\\107\\110\\111\\112\\113\\114\\115\\116\\117\\120\\121\\122\\123\\124\\125\\126\\127\\130\\131\\132\\133\\134\\135\\136\\137\\140\\141\\142\\143\\144\\145\\146\\147\\150\\151\\152\\153\\154\\155\\156\\157\\160\\161\\162\\163\\164\\165\\166\\167\\170\\171\\172\\173\\174\\175\\176\\177\\200\\201\\202\\203\\204\\205\\206\\207\\210\\211\\212\\213\\214\\215\\216\\217\\220\\221\\222\\223\\224\\225\\226\\227\\230\\231\\232\\233\\234\\235\\236\\237\\240\\241\\242\\243\\244\\245\\246\\247\\250\\251\\252\\253\\254\\255\\256\\257\\260\\261\\262\\263\\264\\265\\266\\267\\270\\271\\272\\273\\274\\275\\276\\277\\300\\301\\302\\303\\304\\305\\306\\307\\310\\311\\312\\313\\314\\315\\316\\317\\320\\321\\322\\323\\324\\325\\326\\327\\330\\331\\332\\333\\334\\335\\336\\337\\340\\341\\342\\343\\344\\345\\346\\347\\350\\351\\352\\353\\354\\355\\356\\357\\360\\361\\362\\363\\364\\365\\366\\367\\370\\371\\372\\373\\374\\375\\376\\377\" =~ /\\000\\001\\002\\003\\004\\005\\006\\007\\010\\011\\012\\013\\014\\015\\016\\017\\020\\021\\022\\023\\024\\025\\026\\027\\030\\031\\032\\033\\034\\035\\036\\037\\040\\041\\042\\043\\044\\045\\046\\047\\050\\051\\052\\053\\054\\055\\056\\057\\060\\061\\062\\063\\064\\065\\066\\067\\070\\071\\072\\073\\074\\075\\076\\077\\100\\101\\102\\103\\104\\105\\106\\107\\110\\111\\112\\113\\114\\115\\116\\117\\120\\121\\122\\123\\124\\125\\126\\127\\130\\131\\132\\133\\134\\135\\136\\137\\140\\141\\142\\143\\144\\145\\146\\147\\150\\151\\152\\153\\154\\155\\156\\157\\160\\161\\162\\163\\164\\165\\166\\167\\170\\171\\172\\173\\174\\175\\176\\177\\200\\201\\202\\203\\204\\205\\206\\207\\210\\211\\212\\213\\214\\215\\216\\217\\220\\221\\222\\223\\224\\225\\226\\227\\230\\231\\232\\233\\234\\235\\236\\237\\240\\241\\242\\243\\244\\245\\246\\247\\250\\251\\252\\253\\254\\255\\256\\257\\260\\261\\262\\263\\264\\265\\266\\267\\270\\271\\272\\273\\274\\275\\276\\277\\300\\301\\302\\303\\304\\305\\306\\307\\310\\311\\312\\313\\314\\315\\316\\317\\320\\321\\322\\323\\324\\325\\326\\327\\330\\331\\332\\333\\334\\335\\336\\337\\340\\341\\342\\343\\344\\345\\346\\347\\350\\351\\352\\353\\354\\355\\356\\357\\360\\361\\362\\363\\364\\365\\366\\367\\370\\371\\372\\373\\374\\375\\376\\377/" "\\000\\001\\002\\003\\004\\005\\006\\007\\010\\011\\012\\013\\014\\015\\016\\017\\020\\021\\022\\023\\024\\025\\026\\027\\030\\031\\032\\033\\034\\035\\036\\037\\040\\041\\042\\043\\044\\045\\046\\047\\050\\051\\052\\053\\054\\055\\056\\057\\060\\061\\062\\063\\064\\065\\066\\067\\070\\071\\072\\073\\074\\075\\076\\077\\100\\101\\102\\103\\104\\105\\106\\107\\110\\111\\112\\113\\114\\115\\116\\117\\120\\121\\122\\123\\124\\125\\126\\127\\130\\131\\132\\133\\134\\135\\136\\137\\140\\141\\142\\143\\144\\145\\146\\147\\150\\151\\152\\153\\154\\155\\156\\157\\160\\161\\162\\163\\164\\165\\166\\167\\170\\171\\172\\173\\174\\175\\176\\177\\200\\201\\202\\203\\204\\205\\206\\207\\210\\211\\212\\213\\214\\215\\216\\217\\220\\221\\222\\223\\224\\225\\226\\227\\230\\231\\232\\233\\234\\235\\236\\237\\240\\241\\242\\243\\244\\245\\246\\247\\250\\251\\252\\253\\254\\255\\256\\257\\260\\261\\262\\263\\264\\265\\266\\267\\270\\271\\272\\273\\274\\275\\276\\277\\300\\301\\302\\303\\304\\305\\306\\307\\310\\311\\312\\313\\314\\315\\316\\317\\320\\321\\322\\323\\324\\325\\326\\327\\330\\331\\332\\333\\334\\335\\336\\337\\340\\341\\342\\343\\344\\345\\346\\347\\350\\351\\352\\353\\354\\355\\356\\357\\360\\361\\362\\363\\364\\365\\366\\367\\370\\371\\372\\373\\374\\375\\376\\377" nil nil nil nil ("" 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~" 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255) nil 1 0 ("" 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~" 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255) (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(467 "\"xxxxxxxxxxxPSTAIREISLLxxxxxxxxx\" =~ /P[^*]TAIRE[^*]{1,6}?LL/" "P[^*]TAIRE[^*]{1,6}?LL" nil nil nil nil "xxxxxxxxxxxPSTAIREISLLxxxxxxxxx" nil 1 0 "PSTAIREISLL" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(468 "\"xxxxxxxxxxxPSTAIREISLLxxxxxxxxx\" =~ /P[^*]TAIRE[^*]{1,}?LL/" "P[^*]TAIRE[^*]{1,}?LL" nil nil nil nil "xxxxxxxxxxxPSTAIREISLLxxxxxxxxx" nil 1 0 "PSTAIREISLL" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(469 "\"1.230003938\" =~ /(\\.\\d\\d[1-9]?)\\d+/" "(\\.\\d\\d[1-9]?)\\d+" nil nil nil nil "1.230003938" nil 1 0 ".230003938" (".23" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(470 "\"1.875000282\" =~ /(\\.\\d\\d[1-9]?)\\d+/" "(\\.\\d\\d[1-9]?)\\d+" nil nil nil nil "1.875000282" nil 1 0 ".875000282" (".875" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(471 "\"1.235\" =~ /(\\.\\d\\d[1-9]?)\\d+/" "(\\.\\d\\d[1-9]?)\\d+" nil nil nil nil "1.235" nil 1 0 ".235" (".23" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(472 "\"1.230003938\" =~ /(\\.\\d\\d((?=0)|\\d(?=\\d)))/" "(\\.\\d\\d((?=0)|\\d(?=\\d)))" nil nil nil nil "1.230003938" nil 1 0 ".23" (".23" "" nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(473 "\"1.875000282\" =~ /(\\.\\d\\d((?=0)|\\d(?=\\d)))/" "(\\.\\d\\d((?=0)|\\d(?=\\d)))" nil nil nil nil "1.875000282" nil 1 0 ".875" (".875" "5" nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(474 "\"1.235\" =~ /(\\.\\d\\d((?=0)|\\d(?=\\d)))/" "(\\.\\d\\d((?=0)|\\d(?=\\d)))" nil nil nil nil "1.235" nil 1 0 nil nil)
-(475 "\"ab\" =~ /a(?)b/" "a(?)b" nil nil nil nil "ab" nil 1 0 "ab" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(476 "\"Food is on the foo table\" =~ /\\b(foo)\\s+(\\w+)/i" "\\b(foo)\\s+(\\w+)" t nil nil nil "Food is on the foo table" nil 1 0 "foo table" ("foo" "table" nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(477 "\"The food is under the bar in the barn.\" =~ /foo(.*)bar/" "foo(.*)bar" nil nil nil nil "The food is under the bar in the barn." nil 1 0 "food is under the bar in the bar" ("d is under the bar in the " nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(478 "\"The food is under the bar in the barn.\" =~ /foo(.*?)bar/" "foo(.*?)bar" nil nil nil nil "The food is under the bar in the barn." nil 1 0 "food is under the bar" ("d is under the " nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(479 "\"I have 2 numbers: 53147\" =~ /(.*)(\\d*)/" "(.*)(\\d*)" nil nil nil nil "I have 2 numbers: 53147" nil 1 0 "I have 2 numbers: 53147" ("I have 2 numbers: 53147" "" nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(480 "\"I have 2 numbers: 53147\" =~ /(.*)(\\d+)/" "(.*)(\\d+)" nil nil nil nil "I have 2 numbers: 53147" nil 1 0 "I have 2 numbers: 53147" ("I have 2 numbers: 5314" "7" nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(481 "\"I have 2 numbers: 53147\" =~ /(.*?)(\\d*)/" "(.*?)(\\d*)" nil nil nil nil "I have 2 numbers: 53147" nil 1 0 "" ("" "" nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(482 "\"I have 2 numbers: 53147\" =~ /(.*?)(\\d+)/" "(.*?)(\\d+)" nil nil nil nil "I have 2 numbers: 53147" nil 1 0 "I have 2" ("I have " "2" nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(483 "\"I have 2 numbers: 53147\" =~ /(.*)(\\d+)$/" "(.*)(\\d+)$" nil nil nil nil "I have 2 numbers: 53147" nil 1 0 "I have 2 numbers: 53147" ("I have 2 numbers: 5314" "7" nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(484 "\"I have 2 numbers: 53147\" =~ /(.*?)(\\d+)$/" "(.*?)(\\d+)$" nil nil nil nil "I have 2 numbers: 53147" nil 1 0 "I have 2 numbers: 53147" ("I have 2 numbers: " "53147" nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(485 "\"I have 2 numbers: 53147\" =~ /(.*)\\b(\\d+)$/" "(.*)\\b(\\d+)$" nil nil nil nil "I have 2 numbers: 53147" nil 1 0 "I have 2 numbers: 53147" ("I have 2 numbers: " "53147" nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(486 "\"I have 2 numbers: 53147\" =~ /(.*\\D)(\\d+)$/" "(.*\\D)(\\d+)$" nil nil nil nil "I have 2 numbers: 53147" nil 1 0 "I have 2 numbers: 53147" ("I have 2 numbers: " "53147" nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(487 "\"ABC123\" =~ /^\\D*(?!123)/" "^\\D*(?!123)" nil nil nil nil "ABC123" nil 1 0 "AB" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(488 "\"ABC445\" =~ /^(\\D*)(?=\\d)(?!123)/" "^(\\D*)(?=\\d)(?!123)" nil nil nil nil "ABC445" nil 1 0 "ABC" ("ABC" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(489 "\"ABC123\" =~ /^(\\D*)(?=\\d)(?!123)/" "^(\\D*)(?=\\d)(?!123)" nil nil nil nil "ABC123" nil 1 0 nil nil)
-(490 "\"W46]789\" =~ /^[W-]46]/" "^[W-]46]" nil nil nil nil "W46]789" nil 1 0 "W46]" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(491 "\"-46]789\" =~ /^[W-]46]/" "^[W-]46]" nil nil nil nil "-46]789" nil 1 0 "-46]" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(492 "\"Wall\" =~ /^[W-]46]/" "^[W-]46]" nil nil nil nil "Wall" nil 1 0 nil nil)
-(493 "\"Zebra\" =~ /^[W-]46]/" "^[W-]46]" nil nil nil nil "Zebra" nil 1 0 nil nil)
-(494 "\"42\" =~ /^[W-]46]/" "^[W-]46]" nil nil nil nil "42" nil 1 0 nil nil)
-(495 "\"[abcd]\" =~ /^[W-]46]/" "^[W-]46]" nil nil nil nil "[abcd]" nil 1 0 nil nil)
-(496 "\"]abcd[\" =~ /^[W-]46]/" "^[W-]46]" nil nil nil nil "]abcd[" nil 1 0 nil nil)
-(497 "\"W46]789\" =~ /^[W-\\]46]/" "^[W-\\]46]" nil nil nil nil "W46]789" nil 1 0 "W" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(498 "\"Wall\" =~ /^[W-\\]46]/" "^[W-\\]46]" nil nil nil nil "Wall" nil 1 0 "W" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(499 "\"Zebra\" =~ /^[W-\\]46]/" "^[W-\\]46]" nil nil nil nil "Zebra" nil 1 0 "Z" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(500 "\"Xylophone\" =~ /^[W-\\]46]/" "^[W-\\]46]" nil nil nil nil "Xylophone" nil 1 0 "X" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(501 "\"42\" =~ /^[W-\\]46]/" "^[W-\\]46]" nil nil nil nil "42" nil 1 0 "4" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(502 "\"[abcd]\" =~ /^[W-\\]46]/" "^[W-\\]46]" nil nil nil nil "[abcd]" nil 1 0 "[" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(503 "\"]abcd[\" =~ /^[W-\\]46]/" "^[W-\\]46]" nil nil nil nil "]abcd[" nil 1 0 "]" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(504 "\"\\\\backslash\" =~ /^[W-\\]46]/" "^[W-\\]46]" nil nil nil nil "\\backslash" nil 1 0 "\\" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(505 "\"-46]789\" =~ /^[W-\\]46]/" "^[W-\\]46]" nil nil nil nil "-46]789" nil 1 0 nil nil)
-(506 "\"well\" =~ /^[W-\\]46]/" "^[W-\\]46]" nil nil nil nil "well" nil 1 0 nil nil)
-(507 "\"01/01/2000\" =~ /\\d\\d\\/\\d\\d\\/\\d\\d\\d\\d/" "\\d\\d\\/\\d\\d\\/\\d\\d\\d\\d" nil nil nil nil "01/01/2000" nil 1 0 "01/01/2000" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(508 "\"word cat dog elephant mussel cow horse canary baboon snake shark otherword\" =~ /word (?:[a-zA-Z0-9]+ ){0,10}otherword/" "word (?:[a-zA-Z0-9]+ ){0,10}otherword" nil nil nil nil "word cat dog elephant mussel cow horse canary baboon snake shark otherword" nil 1 0 "word cat dog elephant mussel cow horse canary baboon snake shark otherword" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(509 "\"word cat dog elephant mussel cow horse canary baboon snake shark\" =~ /word (?:[a-zA-Z0-9]+ ){0,10}otherword/" "word (?:[a-zA-Z0-9]+ ){0,10}otherword" nil nil nil nil "word cat dog elephant mussel cow horse canary baboon snake shark" nil 1 0 nil nil)
-(510 "\"word cat dog elephant mussel cow horse canary baboon snake shark the quick brown fox and the lazy dog and several other words getting close to thirty by now I hope\" =~ /word (?:[a-zA-Z0-9]+ ){0,300}otherword/" "word (?:[a-zA-Z0-9]+ ){0,300}otherword" nil nil nil nil "word cat dog elephant mussel cow horse canary baboon snake shark the quick brown fox and the lazy dog and several other words getting close to thirty by now I hope" nil 1 0 nil nil)
-(511 "\"bcd\" =~ /^(a){0,0}/" "^(a){0,0}" nil nil nil nil "bcd" nil 1 0 "" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(512 "\"abc\" =~ /^(a){0,0}/" "^(a){0,0}" nil nil nil nil "abc" nil 1 0 "" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(513 "\"aab\" =~ /^(a){0,0}/" "^(a){0,0}" nil nil nil nil "aab" nil 1 0 "" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(514 "\"bcd\" =~ /^(a){0,1}/" "^(a){0,1}" nil nil nil nil "bcd" nil 1 0 "" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(515 "\"abc\" =~ /^(a){0,1}/" "^(a){0,1}" nil nil nil nil "abc" nil 1 0 "a" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(516 "\"aab\" =~ /^(a){0,1}/" "^(a){0,1}" nil nil nil nil "aab" nil 1 0 "a" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(517 "\"bcd\" =~ /^(a){0,2}/" "^(a){0,2}" nil nil nil nil "bcd" nil 1 0 "" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(518 "\"abc\" =~ /^(a){0,2}/" "^(a){0,2}" nil nil nil nil "abc" nil 1 0 "a" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(519 "\"aab\" =~ /^(a){0,2}/" "^(a){0,2}" nil nil nil nil "aab" nil 1 0 "aa" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(520 "\"bcd\" =~ /^(a){0,3}/" "^(a){0,3}" nil nil nil nil "bcd" nil 1 0 "" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(521 "\"abc\" =~ /^(a){0,3}/" "^(a){0,3}" nil nil nil nil "abc" nil 1 0 "a" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(522 "\"aab\" =~ /^(a){0,3}/" "^(a){0,3}" nil nil nil nil "aab" nil 1 0 "aa" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(523 "\"aaa\" =~ /^(a){0,3}/" "^(a){0,3}" nil nil nil nil "aaa" nil 1 0 "aaa" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(524 "\"bcd\" =~ /^(a){0,}/" "^(a){0,}" nil nil nil nil "bcd" nil 1 0 "" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(525 "\"abc\" =~ /^(a){0,}/" "^(a){0,}" nil nil nil nil "abc" nil 1 0 "a" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(526 "\"aab\" =~ /^(a){0,}/" "^(a){0,}" nil nil nil nil "aab" nil 1 0 "aa" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(527 "\"aaa\" =~ /^(a){0,}/" "^(a){0,}" nil nil nil nil "aaa" nil 1 0 "aaa" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(528 "\"aaaaaaaa\" =~ /^(a){0,}/" "^(a){0,}" nil nil nil nil "aaaaaaaa" nil 1 0 "aaaaaaaa" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(529 "\"bcd\" =~ /^(a){1,1}/" "^(a){1,1}" nil nil nil nil "bcd" nil 1 0 nil nil)
-(530 "\"abc\" =~ /^(a){1,1}/" "^(a){1,1}" nil nil nil nil "abc" nil 1 0 "a" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(531 "\"aab\" =~ /^(a){1,1}/" "^(a){1,1}" nil nil nil nil "aab" nil 1 0 "a" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(532 "\"bcd\" =~ /^(a){1,2}/" "^(a){1,2}" nil nil nil nil "bcd" nil 1 0 nil nil)
-(533 "\"abc\" =~ /^(a){1,2}/" "^(a){1,2}" nil nil nil nil "abc" nil 1 0 "a" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(534 "\"aab\" =~ /^(a){1,2}/" "^(a){1,2}" nil nil nil nil "aab" nil 1 0 "aa" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(535 "\"bcd\" =~ /^(a){1,3}/" "^(a){1,3}" nil nil nil nil "bcd" nil 1 0 nil nil)
-(536 "\"abc\" =~ /^(a){1,3}/" "^(a){1,3}" nil nil nil nil "abc" nil 1 0 "a" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(537 "\"aab\" =~ /^(a){1,3}/" "^(a){1,3}" nil nil nil nil "aab" nil 1 0 "aa" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(538 "\"aaa\" =~ /^(a){1,3}/" "^(a){1,3}" nil nil nil nil "aaa" nil 1 0 "aaa" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(539 "\"bcd\" =~ /^(a){1,}/" "^(a){1,}" nil nil nil nil "bcd" nil 1 0 nil nil)
-(540 "\"abc\" =~ /^(a){1,}/" "^(a){1,}" nil nil nil nil "abc" nil 1 0 "a" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(541 "\"aab\" =~ /^(a){1,}/" "^(a){1,}" nil nil nil nil "aab" nil 1 0 "aa" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(542 "\"aaa\" =~ /^(a){1,}/" "^(a){1,}" nil nil nil nil "aaa" nil 1 0 "aaa" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(543 "\"aaaaaaaa\" =~ /^(a){1,}/" "^(a){1,}" nil nil nil nil "aaaaaaaa" nil 1 0 "aaaaaaaa" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(544 "\"borfle\\nbib.gif\\nno\" =~ /.*\\.gif/" ".*\\.gif" nil nil nil nil "borfle
-bib.gif
-no" nil 1 0 "bib.gif" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(545 "\"borfle\\nbib.gif\\nno\" =~ /.{0,}\\.gif/" ".{0,}\\.gif" nil nil nil nil "borfle
-bib.gif
-no" nil 1 0 "bib.gif" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(546 "\"borfle\\nbib.gif\\nno\" =~ /.*\\.gif/m" ".*\\.gif" nil t nil nil "borfle
-bib.gif
-no" nil 1 0 "bib.gif" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(547 "\"borfle\\nbib.gif\\nno\" =~ /.*\\.gif/s" ".*\\.gif" nil nil t nil "borfle
-bib.gif
-no" nil 1 0 "borfle
-bib.gif" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(548 "\"borfle\\nbib.gif\\nno\" =~ /.*\\.gif/ms" ".*\\.gif" nil t t nil "borfle
-bib.gif
-no" nil 1 0 "borfle
-bib.gif" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(549 "\"borfle\\nbib.gif\\nno\" =~ /.*$/" ".*$" nil nil nil nil "borfle
-bib.gif
-no" nil 1 0 "no" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(550 "\"borfle\\nbib.gif\\nno\" =~ /.*$/m" ".*$" nil t nil nil "borfle
-bib.gif
-no" nil 1 0 "borfle" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(551 "\"borfle\\nbib.gif\\nno\" =~ /.*$/s" ".*$" nil nil t nil "borfle
-bib.gif
-no" nil 1 0 "borfle
-bib.gif
-no" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(552 "\"borfle\\nbib.gif\\nno\" =~ /.*$/ms" ".*$" nil t t nil "borfle
-bib.gif
-no" nil 1 0 "borfle
-bib.gif
-no" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(553 "\"borfle\\nbib.gif\\nno\\n\" =~ /.*$/" ".*$" nil nil nil nil "borfle
-bib.gif
-no
-" nil 1 0 "no" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(554 "\"borfle\\nbib.gif\\nno\\n\" =~ /.*$/m" ".*$" nil t nil nil "borfle
-bib.gif
-no
-" nil 1 0 "borfle" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(555 "\"borfle\\nbib.gif\\nno\\n\" =~ /.*$/s" ".*$" nil nil t nil "borfle
-bib.gif
-no
-" nil 1 0 "borfle
-bib.gif
-no
-" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(556 "\"borfle\\nbib.gif\\nno\\n\" =~ /.*$/ms" ".*$" nil t t nil "borfle
-bib.gif
-no
-" nil 1 0 "borfle
-bib.gif
-no
-" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(557 "\"abcde\\n1234Xyz\" =~ /(.*X|^B)/" "(.*X|^B)" nil nil nil nil "abcde
-1234Xyz" nil 1 0 "1234X" ("1234X" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(558 "\"BarFoo\" =~ /(.*X|^B)/" "(.*X|^B)" nil nil nil nil "BarFoo" nil 1 0 "B" ("B" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(559 "\"abcde\\nBar\" =~ /(.*X|^B)/" "(.*X|^B)" nil nil nil nil "abcde
-Bar" nil 1 0 nil nil)
-(560 "\"abcde\\n1234Xyz\" =~ /(.*X|^B)/m" "(.*X|^B)" nil t nil nil "abcde
-1234Xyz" nil 1 0 "1234X" ("1234X" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(561 "\"BarFoo\" =~ /(.*X|^B)/m" "(.*X|^B)" nil t nil nil "BarFoo" nil 1 0 "B" ("B" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(562 "\"abcde\\nBar\" =~ /(.*X|^B)/m" "(.*X|^B)" nil t nil nil "abcde
-Bar" nil 1 0 "B" ("B" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(563 "\"abcde\\n1234Xyz\" =~ /(.*X|^B)/s" "(.*X|^B)" nil nil t nil "abcde
-1234Xyz" nil 1 0 "abcde
-1234X" ("abcde
-1234X" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(564 "\"BarFoo\" =~ /(.*X|^B)/s" "(.*X|^B)" nil nil t nil "BarFoo" nil 1 0 "B" ("B" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(565 "\"abcde\\nBar\" =~ /(.*X|^B)/s" "(.*X|^B)" nil nil t nil "abcde
-Bar" nil 1 0 nil nil)
-(566 "\"abcde\\n1234Xyz\" =~ /(.*X|^B)/ms" "(.*X|^B)" nil t t nil "abcde
-1234Xyz" nil 1 0 "abcde
-1234X" ("abcde
-1234X" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(567 "\"BarFoo\" =~ /(.*X|^B)/ms" "(.*X|^B)" nil t t nil "BarFoo" nil 1 0 "B" ("B" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(568 "\"abcde\\nBar\" =~ /(.*X|^B)/ms" "(.*X|^B)" nil t t nil "abcde
-Bar" nil 1 0 "B" ("B" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(569 "\"abcde\\n1234Xyz\" =~ /(?s)(.*X|^B)/" "(?s)(.*X|^B)" nil nil nil nil "abcde
-1234Xyz" nil 1 0 "abcde
-1234X" ("abcde
-1234X" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(570 "\"BarFoo\" =~ /(?s)(.*X|^B)/" "(?s)(.*X|^B)" nil nil nil nil "BarFoo" nil 1 0 "B" ("B" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(571 "\"abcde\\nBar\" =~ /(?s)(.*X|^B)/" "(?s)(.*X|^B)" nil nil nil nil "abcde
-Bar" nil 1 0 nil nil)
-(572 "\"abcde\\n1234Xyz\" =~ /(?s:.*X|^B)/" "(?s:.*X|^B)" nil nil nil nil "abcde
-1234Xyz" nil 1 0 "abcde
-1234X" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(573 "\"BarFoo\" =~ /(?s:.*X|^B)/" "(?s:.*X|^B)" nil nil nil nil "BarFoo" nil 1 0 "B" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(574 "\"abcde\\nBar\" =~ /(?s:.*X|^B)/" "(?s:.*X|^B)" nil nil nil nil "abcde
-Bar" nil 1 0 nil nil)
-(575 "\"abc\\nB\" =~ /^.*B/" "^.*B" nil nil nil nil "abc
-B" nil 1 0 nil nil)
-(576 "\"abc\\nB\" =~ /(?s)^.*B/" "(?s)^.*B" nil nil nil nil "abc
-B" nil 1 0 "abc
-B" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(577 "\"abc\\nB\" =~ /(?m)^.*B/" "(?m)^.*B" nil nil nil nil "abc
-B" nil 1 0 "B" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(578 "\"abc\\nB\" =~ /(?ms)^.*B/" "(?ms)^.*B" nil nil nil nil "abc
-B" nil 1 0 "abc
-B" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(579 "\"abc\\nB\" =~ /(?ms)^B/" "(?ms)^B" nil nil nil nil "abc
-B" nil 1 0 "B" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(580 "\"B\\n\" =~ /(?s)B$/" "(?s)B$" nil nil nil nil "B
-" nil 1 0 "B" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(581 "\"123456654321\" =~ /^[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]/" "^[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]" nil nil nil nil "123456654321" nil 1 0 "123456654321" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(582 "\"123456654321\" =~ /^\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d/" "^\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d" nil nil nil nil "123456654321" nil 1 0 "123456654321" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(583 "\"123456654321\" =~ /^[\\d][\\d][\\d][\\d][\\d][\\d][\\d][\\d][\\d][\\d][\\d][\\d]/" "^[\\d][\\d][\\d][\\d][\\d][\\d][\\d][\\d][\\d][\\d][\\d][\\d]" nil nil nil nil "123456654321" nil 1 0 "123456654321" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(584 "\"abcabcabcabc\" =~ /^[abc]{12}/" "^[abc]{12}" nil nil nil nil "abcabcabcabc" nil 1 0 "abcabcabcabc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(585 "\"abcabcabcabc\" =~ /^[a-c]{12}/" "^[a-c]{12}" nil nil nil nil "abcabcabcabc" nil 1 0 "abcabcabcabc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(586 "\"abcabcabcabc\" =~ /^(a|b|c){12}/" "^(a|b|c){12}" nil nil nil nil "abcabcabcabc" nil 1 0 "abcabcabcabc" ("c" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(587 "\"n\" =~ /^[abcdefghijklmnopqrstuvwxy0123456789]/" "^[abcdefghijklmnopqrstuvwxy0123456789]" nil nil nil nil "n" nil 1 0 "n" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(588 "\"z\" =~ /^[abcdefghijklmnopqrstuvwxy0123456789]/" "^[abcdefghijklmnopqrstuvwxy0123456789]" nil nil nil nil "z" nil 1 0 nil nil)
-(589 "\"abcd\" =~ /abcde{0,0}/" "abcde{0,0}" nil nil nil nil "abcd" nil 1 0 "abcd" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(590 "\"abce\" =~ /abcde{0,0}/" "abcde{0,0}" nil nil nil nil "abce" nil 1 0 nil nil)
-(591 "\"abe\" =~ /ab[cd]{0,0}e/" "ab[cd]{0,0}e" nil nil nil nil "abe" nil 1 0 "abe" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(592 "\"abcde\" =~ /ab[cd]{0,0}e/" "ab[cd]{0,0}e" nil nil nil nil "abcde" nil 1 0 nil nil)
-(593 "\"abd\" =~ /ab(c){0,0}d/" "ab(c){0,0}d" nil nil nil nil "abd" nil 1 0 "abd" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(594 "\"abcd\" =~ /ab(c){0,0}d/" "ab(c){0,0}d" nil nil nil nil "abcd" nil 1 0 nil nil)
-(595 "\"a\" =~ /a(b*)/" "a(b*)" nil nil nil nil "a" nil 1 0 "a" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(596 "\"ab\" =~ /a(b*)/" "a(b*)" nil nil nil nil "ab" nil 1 0 "ab" ("b" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(597 "\"abbbb\" =~ /a(b*)/" "a(b*)" nil nil nil nil "abbbb" nil 1 0 "abbbb" ("bbbb" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(598 "\"bbbbb\" =~ /a(b*)/" "a(b*)" nil nil nil nil "bbbbb" nil 1 0 nil nil)
-(599 "\"abe\" =~ /ab\\d{0}e/" "ab\\d{0}e" nil nil nil nil "abe" nil 1 0 "abe" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(600 "\"ab1e\" =~ /ab\\d{0}e/" "ab\\d{0}e" nil nil nil nil "ab1e" nil 1 0 nil nil)
-(601 "\"the \\\"quick\\\" brown fox\" =~ /\"([^\\\\\"]+|\\\\.)*\"/" "\"([^\\\\\"]+|\\\\.)*\"" nil nil nil nil "the \"quick\" brown fox" nil 1 0 "\"quick\"" ("quick" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(602 "\"\\\"the \\\\\\\"quick\\\\\\\" brown fox\\\"\" =~ /\"([^\\\\\"]+|\\\\.)*\"/" "\"([^\\\\\"]+|\\\\.)*\"" nil nil nil nil "\"the \\\"quick\\\" brown fox\"" nil 1 0 "\"the \\\"quick\\\" brown fox\"" (" brown fox" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(603 "\"abc\" =~ /.*?/" ".*?" nil nil nil nil "abc" nil 1 0 "" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(604 "\"abc\" =~ /\\b/" "\\b" nil nil nil nil "abc" nil 1 0 "" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(605 "\"abc\" =~ /\\b/" "\\b" nil nil nil nil "abc" nil 1 0 "" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(606 "\"abc\" =~ /(?#)/" "" nil nil nil nil "abc" nil 1 0 "" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(607 "\"<TR BGCOLOR='#DBE9E9'><TD align=left valign=top>43.<a href='joblist.cfm?JobID=94 6735&Keyword='>Word Processor<BR>(N-1286)</a></TD><TD align=left valign=top>Lega lstaff.com</TD><TD align=left valign=top>CA - Statewide</TD></TR>\" =~ /<tr([\\w\\W\\s\\d][^<>]{0,})><TD([\\w\\W\\s\\d][^<>]{0,})>([\\d]{0,}\\.)(.*)((<BR>([\\w\\W\\s\\d][^<>]{0,})|[\\s]{0,}))<\\/a><\\/TD><TD([\\w\\W\\s\\d][^<>]{0,})>([\\w\\W\\s\\d][^<>]{0,})<\\/TD><TD([\\w\\W\\s\\d][^<>]{0,})>([\\w\\W\\s\\d][^<>]{0,})<\\/TD><\\/TR>/is" "<tr([\\w\\W\\s\\d][^<>]{0,})><TD([\\w\\W\\s\\d][^<>]{0,})>([\\d]{0,}\\.)(.*)((<BR>([\\w\\W\\s\\d][^<>]{0,})|[\\s]{0,}))<\\/a><\\/TD><TD([\\w\\W\\s\\d][^<>]{0,})>([\\w\\W\\s\\d][^<>]{0,})<\\/TD><TD([\\w\\W\\s\\d][^<>]{0,})>([\\w\\W\\s\\d][^<>]{0,})<\\/TD><\\/TR>" t nil t nil "<TR BGCOLOR='#DBE9E9'><TD align=left valign=top>43.<a href='joblist.cfm?JobID=94 6735&Keyword='>Word Processor<BR>(N-1286)</a></TD><TD align=left valign=top>Lega lstaff.com</TD><TD align=left valign=top>CA - Statewide</TD></TR>" nil 1 0 "<TR BGCOLOR='#DBE9E9'><TD align=left valign=top>43.<a href='joblist.cfm?JobID=94 6735&Keyword='>Word Processor<BR>(N-1286)</a></TD><TD align=left valign=top>Lega lstaff.com</TD><TD align=left valign=top>CA - Statewide</TD></TR>" (" BGCOLOR='#DBE9E9'" " align=left valign=top" "43." "<a href='joblist.cfm?JobID=94 6735&Keyword='>Word Processor<BR>(N-1286)" "" "" nil " align=left valign=top" "Lega lstaff.com" " align=left valign=top" "CA - Statewide" nil nil nil nil nil))
-(608 "\"acb\" =~ /a[^a]b/" "a[^a]b" nil nil nil nil "acb" nil 1 0 "acb" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(609 "\"a\\nb\" =~ /a[^a]b/" "a[^a]b" nil nil nil nil "a
-b" nil 1 0 "a
-b" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(610 "\"acb\" =~ /a.b/" "a.b" nil nil nil nil "acb" nil 1 0 "acb" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(611 "\"a\\nb\" =~ /a.b/" "a.b" nil nil nil nil "a
-b" nil 1 0 nil nil)
-(612 "\"acb\" =~ /a[^a]b/s" "a[^a]b" nil nil t nil "acb" nil 1 0 "acb" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(613 "\"a\\nb\" =~ /a[^a]b/s" "a[^a]b" nil nil t nil "a
-b" nil 1 0 "a
-b" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(614 "\"acb\" =~ /a.b/s" "a.b" nil nil t nil "acb" nil 1 0 "acb" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(615 "\"a\\nb\" =~ /a.b/s" "a.b" nil nil t nil "a
-b" nil 1 0 "a
-b" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(616 "\"bac\" =~ /^(b+?|a){1,2}?c/" "^(b+?|a){1,2}?c" nil nil nil nil "bac" nil 1 0 "bac" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(617 "\"bbac\" =~ /^(b+?|a){1,2}?c/" "^(b+?|a){1,2}?c" nil nil nil nil "bbac" nil 1 0 "bbac" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(618 "\"bbbac\" =~ /^(b+?|a){1,2}?c/" "^(b+?|a){1,2}?c" nil nil nil nil "bbbac" nil 1 0 "bbbac" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(619 "\"bbbbac\" =~ /^(b+?|a){1,2}?c/" "^(b+?|a){1,2}?c" nil nil nil nil "bbbbac" nil 1 0 "bbbbac" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(620 "\"bbbbbac\" =~ /^(b+?|a){1,2}?c/" "^(b+?|a){1,2}?c" nil nil nil nil "bbbbbac" nil 1 0 "bbbbbac" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(621 "\"bac\" =~ /^(b+|a){1,2}?c/" "^(b+|a){1,2}?c" nil nil nil nil "bac" nil 1 0 "bac" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(622 "\"bbac\" =~ /^(b+|a){1,2}?c/" "^(b+|a){1,2}?c" nil nil nil nil "bbac" nil 1 0 "bbac" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(623 "\"bbbac\" =~ /^(b+|a){1,2}?c/" "^(b+|a){1,2}?c" nil nil nil nil "bbbac" nil 1 0 "bbbac" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(624 "\"bbbbac\" =~ /^(b+|a){1,2}?c/" "^(b+|a){1,2}?c" nil nil nil nil "bbbbac" nil 1 0 "bbbbac" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(625 "\"bbbbbac\" =~ /^(b+|a){1,2}?c/" "^(b+|a){1,2}?c" nil nil nil nil "bbbbbac" nil 1 0 "bbbbbac" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(626 "\"x\\nb\\n\" =~ /(?!\\A)x/m" "(?!\\A)x" nil t nil nil "x
-b
-" nil 1 0 nil nil)
-(627 "\"a\\bx\\n\" =~ /(?!\\A)x/m" "(?!\\A)x" nil t nil nil ("a" 8 "x" 10) nil 1 0 "x" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(628 "\"\\0{ab}\" =~ /\\x0{ab}/" "\\x0{ab}" nil nil nil nil ("" 0 "{ab}") nil 1 0 ("" 0 "{ab}") (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(629 "\"CD\" =~ /(A|B)*?CD/" "(A|B)*?CD" nil nil nil nil "CD" nil 1 0 "CD" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(630 "\"CD\" =~ /(A|B)*CD/" "(A|B)*CD" nil nil nil nil "CD" nil 1 0 "CD" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(631 "\"ABABAB\" =~ /(AB)*?\\1/" "(AB)*?\\1" nil nil nil nil "ABABAB" nil 1 0 "ABAB" ("AB" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(632 "\"ABABAB\" =~ /(AB)*\\1/" "(AB)*\\1" nil nil nil nil "ABABAB" nil 1 0 "ABABAB" ("AB" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(633 "\"doesn't matter\" =~ /(/" "(" nil nil nil nil "doesn't matter" t 1 0 nil nil)
-(634 "\"doesn't matter\" =~ /(x)\\2/" "(x)\\2" nil nil nil nil "doesn't matter" t 1 0 nil nil)
-(635 "\"aaaaaaaaaac\" =~ /((a{0,5}){0,5}){0,5}[c]/" "((a{0,5}){0,5}){0,5}[c]" nil nil nil nil "aaaaaaaaaac" nil 1 0 "aaaaaaaaaac" ("" "" nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(636 "\"aaaaaaaaaa\" =~ /((a{0,5}){0,5}){0,5}[c]/" "((a{0,5}){0,5}){0,5}[c]" nil nil nil nil "aaaaaaaaaa" nil 1 0 nil nil)
-(637 "\"aaaaaaaaaac\" =~ /((a{0,5}){0,5})*[c]/" "((a{0,5}){0,5})*[c]" nil nil nil nil "aaaaaaaaaac" nil 1 0 "aaaaaaaaaac" ("" "" nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(638 "\"aaaaaaaaaa\" =~ /((a{0,5}){0,5})*[c]/" "((a{0,5}){0,5})*[c]" nil nil nil nil "aaaaaaaaaa" nil 1 0 nil nil)
-(639 "\"a\" =~ /(\\b)*a/" "(\\b)*a" nil nil nil nil "a" nil 1 0 "a" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(640 "\"ab\" =~ /(a)*b/" "(a)*b" nil nil nil nil "ab" nil 1 0 "ab" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(641 "\"ab\" =~ /(a|)*b/" "(a|)*b" nil nil nil nil "ab" nil 1 0 "ab" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(642 "\"b\" =~ /(a|)*b/" "(a|)*b" nil nil nil nil "b" nil 1 0 "b" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(643 "\"x\" =~ /(a|)*b/" "(a|)*b" nil nil nil nil "x" nil 1 0 nil nil)
-(644 "\"abab\" =~ /^(?:(a)|(b))*\\1\\2$/" "^(?:(a)|(b))*\\1\\2$" nil nil nil nil "abab" nil 1 0 "abab" ("a" "b" nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(645 "\"abcxabcydef\" =~ /abc[^x]def/" "abc[^x]def" nil nil nil nil "abcxabcydef" nil 1 0 "abcydef" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(646 "\"aax\" =~ /^(a|\\1x)*$/" "^(a|\\1x)*$" nil nil nil nil "aax" nil 1 0 "aax" ("ax" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(647 "\"aaxa\" =~ /^(a|\\1x)*$/" "^(a|\\1x)*$" nil nil nil nil "aaxa" nil 1 0 "aaxa" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(648 "\"@{['']}\" =~ /(?#)/" "" nil nil nil nil "" nil 1 0 "" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(649 "\"ab\" =~ /^(?:(a)|(b))*$/" "^(?:(a)|(b))*$" nil nil nil nil "ab" nil 1 0 "ab" ("a" "b" nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(650 "\"a\" =~ /[\\0]/" "[\\0]" nil nil nil nil "a" nil 1 0 nil nil)
-(651 "\"\\0\" =~ /[\\0]/" "[\\0]" nil nil nil nil ("" 0) nil 1 0 ("" 0) (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(652 "\"a\" =~ /[\\1]/" "[\\1]" nil nil nil nil "a" nil 1 0 nil nil)
-(653 "\"\\1\" =~ /[\\1]/" "[\\1]" nil nil nil nil ("" 1) nil 1 0 ("" 1) (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(654 "\"doesn't matter\" =~ /\\10()()()()()()()()()/" "\\10()()()()()()()()()" nil nil nil nil "doesn't matter" nil 1 0 nil nil)
-(655 "\"a\" =~ /\\10()()()()()()()()()()/" "\\10()()()()()()()()()()" nil nil nil nil "a" nil 1 0 nil nil)
-(656 "\"ab\" =~ /a(?<)b/" "a(?<)b" nil nil nil nil "ab" nil 1 0 "ab" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(657 "\"doesn't matter\" =~ /[]/" "[]" nil nil nil nil "doesn't matter" t 1 0 nil nil)
-(658 "\"doesn't matter\" =~ /[\\]/" "[\\]" nil nil nil nil "doesn't matter" t 1 0 nil nil)
-(659 "\"a\" =~ /()/" "()" nil nil nil nil "a" nil 1 0 "" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(660 "\"x\" =~ /[\\x]/" "[\\x]" nil nil nil nil "x" nil 1 0 nil nil)
-(661 "\"\\0\" =~ /[\\x]/" "[\\x]" nil nil nil nil ("" 0) nil 1 0 ("" 0) (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(662 "\"a\" =~ /((a)*)*/" "((a)*)*" nil nil nil nil "a" nil 1 0 "a" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(663 "\"a\" =~ /()a\\1/" "()a\\1" nil nil nil nil "a" nil 1 0 "a" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(664 "\"a\" =~ /a\\1()/" "a\\1()" nil nil nil nil "a" nil 1 0 nil nil)
-(665 "\"aaa\" =~ /a(?i)a(?-i)a/" "a(?i)a(?-i)a" nil nil nil nil "aaa" nil 1 0 "aaa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(666 "\"aAa\" =~ /a(?i)a(?-i)a/" "a(?i)a(?-i)a" nil nil nil nil "aAa" nil 1 0 "aAa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(667 "\"aAA\" =~ /a(?i)a(?-i)a/" "a(?i)a(?-i)a" nil nil nil nil "aAA" nil 1 0 nil nil)
-(668 "\"aaaaa\" =~ /a(?i)a(?-i)a(?i)a(?-i)a/" "a(?i)a(?-i)a(?i)a(?-i)a" nil nil nil nil "aaaaa" nil 1 0 "aaaaa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(669 "\"aAaAa\" =~ /a(?i)a(?-i)a(?i)a(?-i)a/" "a(?i)a(?-i)a(?i)a(?-i)a" nil nil nil nil "aAaAa" nil 1 0 "aAaAa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(670 "\"AaAaA\" =~ /a(?i)a(?-i)a(?i)a(?-i)a/" "a(?i)a(?-i)a(?i)a(?-i)a" nil nil nil nil "AaAaA" nil 1 0 nil nil)
-(671 "\"aAAAa\" =~ /a(?i)a(?-i)a(?i)a(?-i)a/" "a(?i)a(?-i)a(?i)a(?-i)a" nil nil nil nil "aAAAa" nil 1 0 nil nil)
-(672 "\"AaaaA\" =~ /a(?i)a(?-i)a(?i)a(?-i)a/" "a(?i)a(?-i)a(?i)a(?-i)a" nil nil nil nil "AaaaA" nil 1 0 nil nil)
-(673 "\"AAAAA\" =~ /a(?i)a(?-i)a(?i)a(?-i)a/" "a(?i)a(?-i)a(?i)a(?-i)a" nil nil nil nil "AAAAA" nil 1 0 nil nil)
-(674 "\"aaAAA\" =~ /a(?i)a(?-i)a(?i)a(?-i)a/" "a(?i)a(?-i)a(?i)a(?-i)a" nil nil nil nil "aaAAA" nil 1 0 nil nil)
-(675 "\"AAaaa\" =~ /a(?i)a(?-i)a(?i)a(?-i)a/" "a(?i)a(?-i)a(?i)a(?-i)a" nil nil nil nil "AAaaa" nil 1 0 nil nil)
-(676 "\"a\" =~ /\\x/" "\\x" nil nil nil nil "a" nil 1 0 nil nil)
-(677 "\"X\" =~ /\\x/" "\\x" nil nil nil nil "X" nil 1 0 nil nil)
-(678 "\"\\0\" =~ /\\x/" "\\x" nil nil nil nil ("" 0) nil 1 0 ("" 0) (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(679 "\"a\" =~ /[a-c-e]/" "[a-c-e]" nil nil nil nil "a" nil 1 0 "a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(680 "\"b\" =~ /[a-c-e]/" "[a-c-e]" nil nil nil nil "b" nil 1 0 "b" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(681 "\"d\" =~ /[a-c-e]/" "[a-c-e]" nil nil nil nil "d" nil 1 0 nil nil)
-(682 "\"-\" =~ /[a-c-e]/" "[a-c-e]" nil nil nil nil "-" nil 1 0 "-" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(683 "\"b\" =~ /[b-\\d]/" "[b-\\d]" nil nil nil nil "b" nil 1 0 "b" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(684 "\"c\" =~ /[b-\\d]/" "[b-\\d]" nil nil nil nil "c" nil 1 0 nil nil)
-(685 "\"d\" =~ /[b-\\d]/" "[b-\\d]" nil nil nil nil "d" nil 1 0 nil nil)
-(686 "\"-\" =~ /[b-\\d]/" "[b-\\d]" nil nil nil nil "-" nil 1 0 "-" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(687 "\"1\" =~ /[b-\\d]/" "[b-\\d]" nil nil nil nil "1" nil 1 0 "1" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(688 "\"d\" =~ /[\\d-f]/" "[\\d-f]" nil nil nil nil "d" nil 1 0 nil nil)
-(689 "\"e\" =~ /[\\d-f]/" "[\\d-f]" nil nil nil nil "e" nil 1 0 nil nil)
-(690 "\"f\" =~ /[\\d-f]/" "[\\d-f]" nil nil nil nil "f" nil 1 0 "f" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(691 "\"-\" =~ /[\\d-f]/" "[\\d-f]" nil nil nil nil "-" nil 1 0 "-" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(692 "\"1\" =~ /[\\d-f]/" "[\\d-f]" nil nil nil nil "1" nil 1 0 "1" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(693 "\"doesn't matter\" =~ /[/" "[" nil nil nil nil "doesn't matter" t 1 0 nil nil)
-(694 "\"]\" =~ /]/" "]" nil nil nil nil "]" nil 1 0 "]" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(695 "\"a\" =~ /]/" "]" nil nil nil nil "a" nil 1 0 nil nil)
-(696 "\"doesn't matter\" =~ /[]/" "[]" nil nil nil nil "doesn't matter" t 1 0 nil nil)
-(697 "\"-\" =~ /[-a-c]/" "[-a-c]" nil nil nil nil "-" nil 1 0 "-" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(698 "\"a\" =~ /[-a-c]/" "[-a-c]" nil nil nil nil "a" nil 1 0 "a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(699 "\"b\" =~ /[-a-c]/" "[-a-c]" nil nil nil nil "b" nil 1 0 "b" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(700 "\"d\" =~ /[-a-c]/" "[-a-c]" nil nil nil nil "d" nil 1 0 nil nil)
-(701 "\"-\" =~ /[a-c-]/" "[a-c-]" nil nil nil nil "-" nil 1 0 "-" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(702 "\"a\" =~ /[a-c-]/" "[a-c-]" nil nil nil nil "a" nil 1 0 "a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(703 "\"b\" =~ /[a-c-]/" "[a-c-]" nil nil nil nil "b" nil 1 0 "b" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(704 "\"d\" =~ /[a-c-]/" "[a-c-]" nil nil nil nil "d" nil 1 0 nil nil)
-(705 "\"a\" =~ /[-]/" "[-]" nil nil nil nil "a" nil 1 0 nil nil)
-(706 "\"-\" =~ /[-]/" "[-]" nil nil nil nil "-" nil 1 0 "-" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(707 "\"a\" =~ /[--]/" "[--]" nil nil nil nil "a" nil 1 0 nil nil)
-(708 "\"-\" =~ /[--]/" "[--]" nil nil nil nil "-" nil 1 0 "-" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(709 "\"a\" =~ /[---]/" "[---]" nil nil nil nil "a" nil 1 0 nil nil)
-(710 "\"-\" =~ /[---]/" "[---]" nil nil nil nil "-" nil 1 0 "-" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(711 "\"-\" =~ /[--b]/" "[--b]" nil nil nil nil "-" nil 1 0 "-" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(712 "\"a\" =~ /[--b]/" "[--b]" nil nil nil nil "a" nil 1 0 "a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(713 "\"c\" =~ /[--b]/" "[--b]" nil nil nil nil "c" nil 1 0 nil nil)
-(714 "\"doesn't matter\" =~ /[b--]/" "[b--]" nil nil nil nil "doesn't matter" t 1 0 nil nil)
-(715 "\"a{\" =~ /a{/" "a{" nil nil nil nil "a{" nil 1 0 "a{" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(716 "\"a{}\" =~ /a{}/" "a{}" nil nil nil nil "a{}" nil 1 0 "a{}" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(717 "\"a{3\" =~ /a{3/" "a{3" nil nil nil nil "a{3" nil 1 0 "a{3" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(718 "\"a{3,\" =~ /a{3,/" "a{3," nil nil nil nil "a{3," nil 1 0 "a{3," (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(719 "\"a{3,3}\" =~ /a{3, 3}/" "a{3, 3}" nil nil nil nil "a{3,3}" nil 1 0 nil nil)
-(720 "\"a{3, 3}\" =~ /a{3, 3}/" "a{3, 3}" nil nil nil nil "a{3, 3}" nil 1 0 "a{3, 3}" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(721 "\"aaa\" =~ /a{3, 3}/" "a{3, 3}" nil nil nil nil "aaa" nil 1 0 nil nil)
-(722 "\"a{3,3}\" =~ /a{3, 3}/x" "a{3, 3}" nil nil nil t "a{3,3}" nil 1 0 "a{3,3}" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(723 "\"a{3, 3}\" =~ /a{3, 3}/x" "a{3, 3}" nil nil nil t "a{3, 3}" nil 1 0 nil nil)
-(724 "\"aaa\" =~ /a{3, 3}/x" "a{3, 3}" nil nil nil t "aaa" nil 1 0 nil nil)
-(725 "\"a{3,}\" =~ /a{3, }/" "a{3, }" nil nil nil nil "a{3,}" nil 1 0 nil nil)
-(726 "\"a{3, }\" =~ /a{3, }/" "a{3, }" nil nil nil nil "a{3, }" nil 1 0 "a{3, }" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(727 "\"aaa\" =~ /a{3, }/" "a{3, }" nil nil nil nil "aaa" nil 1 0 nil nil)
-(728 "\"a{3,}\" =~ /a{3, }/x" "a{3, }" nil nil nil t "a{3,}" nil 1 0 "a{3,}" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(729 "\"a{3, }\" =~ /a{3, }/x" "a{3, }" nil nil nil t "a{3, }" nil 1 0 nil nil)
-(730 "\"aaa\" =~ /a{3, }/x" "a{3, }" nil nil nil t "aaa" nil 1 0 nil nil)
-(731 "\"\\0 x\" =~ /\\x x/" "\\x x" nil nil nil nil ("" 0 " x") nil 1 0 ("" 0 " x") (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(732 "\"\\0x\" =~ /\\x x/" "\\x x" nil nil nil nil ("" 0 "x") nil 1 0 nil nil)
-(733 "\"\\0 x\" =~ /\\x x/x" "\\x x" nil nil nil t ("" 0 " x") nil 1 0 nil nil)
-(734 "\"\\0x\" =~ /\\x x/x" "\\x x" nil nil nil t ("" 0 "x") nil 1 0 ("" 0 "x") (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(735 "\"\\0003\" =~ /\\x 3/" "\\x 3" nil nil nil nil ("" 0 "3") nil 1 0 nil nil)
-(736 "\"\\000 3\" =~ /\\x 3/" "\\x 3" nil nil nil nil ("" 0 " 3") nil 1 0 ("" 0 " 3") (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(737 "\"x3\" =~ /\\x 3/" "\\x 3" nil nil nil nil "x3" nil 1 0 nil nil)
-(738 "\"x 3\" =~ /\\x 3/" "\\x 3" nil nil nil nil "x 3" nil 1 0 nil nil)
-(739 "\"\\0003\" =~ /\\x 3/x" "\\x 3" nil nil nil t ("" 0 "3") nil 1 0 ("" 0 "3") (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(740 "\"\\000 3\" =~ /\\x 3/x" "\\x 3" nil nil nil t ("" 0 " 3") nil 1 0 nil nil)
-(741 "\"x3\" =~ /\\x 3/x" "\\x 3" nil nil nil t "x3" nil 1 0 nil nil)
-(742 "\"x 3\" =~ /\\x 3/x" "\\x 3" nil nil nil t "x 3" nil 1 0 nil nil)
-(743 "\"a\" =~ /^a{ 1}$/" "^a{ 1}$" nil nil nil nil "a" nil 1 0 nil nil)
-(744 "\"a{ 1}\" =~ /^a{ 1}$/" "^a{ 1}$" nil nil nil nil "a{ 1}" nil 1 0 "a{ 1}" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(745 "\"a{1}\" =~ /^a{ 1}$/" "^a{ 1}$" nil nil nil nil "a{1}" nil 1 0 nil nil)
-(746 "\"a\" =~ /^a{ 1}$/x" "^a{ 1}$" nil nil nil t "a" nil 1 0 nil nil)
-(747 "\"a{ 1}\" =~ /^a{ 1}$/x" "^a{ 1}$" nil nil nil t "a{ 1}" nil 1 0 nil nil)
-(748 "\"a{1}\" =~ /^a{ 1}$/x" "^a{ 1}$" nil nil nil t "a{1}" nil 1 0 "a{1}" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(749 "\"{}\" =~ /{}/" "{}" nil nil nil nil "{}" nil 1 0 "{}" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(750 "\"a\" =~ /{}/" "{}" nil nil nil nil "a" nil 1 0 nil nil)
-(751 "\"doesn't matter\" =~ /{1}/" "{1}" nil nil nil nil "doesn't matter" t 1 0 nil nil)
-(752 "\"doesn't matter\" =~ /*/" "*" nil nil nil nil "doesn't matter" t 1 0 nil nil)
-(753 "\"x\" =~ /|/" "|" nil nil nil nil "x" nil 1 0 "" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(754 "\"\\0000\" =~ /\\0000/" "\\0000" nil nil nil nil ("" 0 "0") nil 1 0 ("" 0 "0") (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(755 "\"ab\" =~ /a(?<)b/" "a(?<)b" nil nil nil nil "ab" nil 1 0 "ab" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(756 "\"ab\" =~ /a(?i)b/" "a(?i)b" nil nil nil nil "ab" nil 1 0 "ab" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(757 "\"aB\" =~ /a(?i)b/" "a(?i)b" nil nil nil nil "aB" nil 1 0 "aB" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(758 "\"Ab\" =~ /a(?i)b/" "a(?i)b" nil nil nil nil "Ab" nil 1 0 nil nil)
-(759 "\"doesn't matter\" =~ /a(?i=a)/" "a(?i=a)" nil nil nil nil "doesn't matter" t 1 0 nil nil)
-(760 "\"aa\" =~ /a(?<=a){3000}a/" "a(?<=a){3000}a" nil nil nil nil "aa" nil 1 0 "aa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(761 "\"xa\" =~ /a(?<=a){3000}a/" "a(?<=a){3000}a" nil nil nil nil "xa" nil 1 0 nil nil)
-(762 "\"ax\" =~ /a(?<=a){3000}a/" "a(?<=a){3000}a" nil nil nil nil "ax" nil 1 0 nil nil)
-(763 "\"aa\" =~ /a(?!=a){3000}a/" "a(?!=a){3000}a" nil nil nil nil "aa" nil 1 0 "aa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(764 "\"ax\" =~ /a(?!=a){3000}a/" "a(?!=a){3000}a" nil nil nil nil "ax" nil 1 0 nil nil)
-(765 "\"xa\" =~ /a(?!=a){3000}a/" "a(?!=a){3000}a" nil nil nil nil "xa" nil 1 0 nil nil)
-(766 "\"aa\" =~ /a(){3000}a/" "a(){3000}a" nil nil nil nil "aa" nil 1 0 "aa" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(767 "\"ax\" =~ /a(){3000}a/" "a(){3000}a" nil nil nil nil "ax" nil 1 0 nil nil)
-(768 "\"xa\" =~ /a(){3000}a/" "a(){3000}a" nil nil nil nil "xa" nil 1 0 nil nil)
-(769 "\"aa\" =~ /a(?:){3000}a/" "a(?:){3000}a" nil nil nil nil "aa" nil 1 0 "aa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(770 "\"ax\" =~ /a(?:){3000}a/" "a(?:){3000}a" nil nil nil nil "ax" nil 1 0 nil nil)
-(771 "\"aa\" =~ /a(?<=a)*a/" "a(?<=a)*a" nil nil nil nil "aa" nil 1 0 "aa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(772 "\"ax\" =~ /a(?<=a)*a/" "a(?<=a)*a" nil nil nil nil "ax" nil 1 0 nil nil)
-(773 "\"xa\" =~ /a(?<=a)*a/" "a(?<=a)*a" nil nil nil nil "xa" nil 1 0 nil nil)
-(774 "\"aa\" =~ /a(?!=a)*a/" "a(?!=a)*a" nil nil nil nil "aa" nil 1 0 "aa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(775 "\"ax\" =~ /a(?!=a)*a/" "a(?!=a)*a" nil nil nil nil "ax" nil 1 0 nil nil)
-(776 "\"xa\" =~ /a(?!=a)*a/" "a(?!=a)*a" nil nil nil nil "xa" nil 1 0 nil nil)
-(777 "\"aa\" =~ /a()*a/" "a()*a" nil nil nil nil "aa" nil 1 0 "aa" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(778 "\"ax\" =~ /a()*a/" "a()*a" nil nil nil nil "ax" nil 1 0 nil nil)
-(779 "\"xa\" =~ /a()*a/" "a()*a" nil nil nil nil "xa" nil 1 0 nil nil)
-(780 "\"aa\" =~ /a(?:)*a/" "a(?:)*a" nil nil nil nil "aa" nil 1 0 "aa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(781 "\"ax\" =~ /a(?:)*a/" "a(?:)*a" nil nil nil nil "ax" nil 1 0 nil nil)
-(782 "\"xa\" =~ /a(?:)*a/" "a(?:)*a" nil nil nil nil "xa" nil 1 0 nil nil)
-(783 "\"aa\" =~ /x(?<=a)*a/" "x(?<=a)*a" nil nil nil nil "aa" nil 1 0 nil nil)
-(784 "\"xa\" =~ /x(?<=a)*a/" "x(?<=a)*a" nil nil nil nil "xa" nil 1 0 "xa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(785 "\"ax\" =~ /x(?<=a)*a/" "x(?<=a)*a" nil nil nil nil "ax" nil 1 0 nil nil)
-(786 "\"aa\" =~ /a(?<=(a))*\\1/" "a(?<=(a))*\\1" nil nil nil nil "aa" nil 1 0 "aa" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(787 "\"aa\" =~ /a(?<=(a))*?\\1/" "a(?<=(a))*?\\1" nil nil nil nil "aa" nil 1 0 "aa" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(788 "\"aa\" =~ /(?=(a)\\1)*aa/" "(?=(a)\\1)*aa" nil nil nil nil "aa" nil 1 0 "aa" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(789 "\"aaaaabbbbb\" =~ /^((a|b){2,5}){2}$/" "^((a|b){2,5}){2}$" nil nil nil nil "aaaaabbbbb" nil 1 0 "aaaaabbbbb" ("bbbbb" "b" nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(790 "\"babc\" =~ /^(b*|ba){1,2}bc/" "^(b*|ba){1,2}bc" nil nil nil nil "babc" nil 1 0 "babc" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(791 "\"bbabc\" =~ /^(b*|ba){1,2}bc/" "^(b*|ba){1,2}bc" nil nil nil nil "bbabc" nil 1 0 "bbabc" ("ba" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(792 "\"bababc\" =~ /^(b*|ba){1,2}bc/" "^(b*|ba){1,2}bc" nil nil nil nil "bababc" nil 1 0 "bababc" ("ba" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(793 "\"bababbc\" =~ /^(b*|ba){1,2}bc/" "^(b*|ba){1,2}bc" nil nil nil nil "bababbc" nil 1 0 nil nil)
-(794 "\"babababc\" =~ /^(b*|ba){1,2}bc/" "^(b*|ba){1,2}bc" nil nil nil nil "babababc" nil 1 0 nil nil)
-(795 "\"aaaaac\" =~ /^a{4,5}(?:c|a)c$/" "^a{4,5}(?:c|a)c$" nil nil nil nil "aaaaac" nil 1 0 "aaaaac" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(796 "\"aaaaaac\" =~ /^a{4,5}(?:c|a)c$/" "^a{4,5}(?:c|a)c$" nil nil nil nil "aaaaaac" nil 1 0 "aaaaaac" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(797 "\"aaaaac\" =~ /^(a|){4,5}(?:c|a)c$/" "^(a|){4,5}(?:c|a)c$" nil nil nil nil "aaaaac" nil 1 0 "aaaaac" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(798 "\"aaaaaac\" =~ /^(a|){4,5}(?:c|a)c$/" "^(a|){4,5}(?:c|a)c$" nil nil nil nil "aaaaaac" nil 1 0 "aaaaaac" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(799 "\"eeexabc\" =~ /(?m:^).abc$/" "(?m:^).abc$" nil nil nil nil "eeexabc" nil 1 0 nil nil)
-(800 "\"eee\\nxabc\" =~ /(?m:^).abc$/" "(?m:^).abc$" nil nil nil nil "eee
-xabc" nil 1 0 "xabc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(801 "\"abc\" =~ /(?m:^)abc/" "(?m:^)abc" nil nil nil nil "abc" nil 1 0 "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(802 "\"\\nabc\" =~ /(?m:^)abc/" "(?m:^)abc" nil nil nil nil "
-abc" nil 1 0 "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(803 "\"abc\" =~
-/^abc/" "^abc" nil nil nil nil "abc" nil 1 0 "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(804 "\"\\nabc\" =~
-/^abc/" "^abc" nil nil nil nil "
-abc" nil 1 0 nil nil)
-(805 "\"abc\" =~ /\\Aabc/" "\\Aabc" nil nil nil nil "abc" nil 1 0 "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(806 "\"\\nabc\" =~ /\\Aabc/" "\\Aabc" nil nil nil nil "
-abc" nil 1 0 nil nil)
-(807 "\"foo\" =~ /(?<!bar)foo/" "(?<!bar)foo" nil nil nil nil "foo" nil 1 0 "foo" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(808 "\"catfood\" =~ /(?<!bar)foo/" "(?<!bar)foo" nil nil nil nil "catfood" nil 1 0 "foo" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(809 "\"arfootle\" =~ /(?<!bar)foo/" "(?<!bar)foo" nil nil nil nil "arfootle" nil 1 0 "foo" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(810 "\"rfoosh\" =~ /(?<!bar)foo/" "(?<!bar)foo" nil nil nil nil "rfoosh" nil 1 0 "foo" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(811 "\"barfoo\" =~ /(?<!bar)foo/" "(?<!bar)foo" nil nil nil nil "barfoo" nil 1 0 nil nil)
-(812 "\"towbarfoo\" =~ /(?<!bar)foo/" "(?<!bar)foo" nil nil nil nil "towbarfoo" nil 1 0 nil nil)
-(813 "\"catfood\" =~ /\\w{3}(?<!bar)foo/" "\\w{3}(?<!bar)foo" nil nil nil nil "catfood" nil 1 0 "catfoo" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(814 "\"foo\" =~ /\\w{3}(?<!bar)foo/" "\\w{3}(?<!bar)foo" nil nil nil nil "foo" nil 1 0 nil nil)
-(815 "\"barfoo\" =~ /\\w{3}(?<!bar)foo/" "\\w{3}(?<!bar)foo" nil nil nil nil "barfoo" nil 1 0 nil nil)
-(816 "\"towbarfoo\" =~ /\\w{3}(?<!bar)foo/" "\\w{3}(?<!bar)foo" nil nil nil nil "towbarfoo" nil 1 0 nil nil)
-(817 "\"fooabar\" =~ /(?<=(foo)a)bar/" "(?<=(foo)a)bar" nil nil nil nil "fooabar" nil 1 0 "bar" ("foo" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(818 "\"bar\" =~ /(?<=(foo)a)bar/" "(?<=(foo)a)bar" nil nil nil nil "bar" nil 1 0 nil nil)
-(819 "\"foobbar\" =~ /(?<=(foo)a)bar/" "(?<=(foo)a)bar" nil nil nil nil "foobbar" nil 1 0 nil nil)
-(820 "\"abc\" =~ /\\Aabc\\z/m" "\\Aabc\\z" nil t nil nil "abc" nil 1 0 "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(821 "\"abc\\n\" =~ /\\Aabc\\z/m" "\\Aabc\\z" nil t nil nil "abc
-" nil 1 0 nil nil)
-(822 "\"qqq\\nabc\" =~ /\\Aabc\\z/m" "\\Aabc\\z" nil t nil nil "qqq
-abc" nil 1 0 nil nil)
-(823 "\"abc\\nzzz\" =~ /\\Aabc\\z/m" "\\Aabc\\z" nil t nil nil "abc
-zzz" nil 1 0 nil nil)
-(824 "\"qqq\\nabc\\nzzz\" =~ /\\Aabc\\z/m" "\\Aabc\\z" nil t nil nil "qqq
-abc
-zzz" nil 1 0 nil nil)
-(825 "\"/this/is/a/very/long/line/in/deed/with/very/many/slashes/in/it/you/see/\" =~ \"(?>.*/)foo\"" "(?>.*/)foo" nil nil nil nil "/this/is/a/very/long/line/in/deed/with/very/many/slashes/in/it/you/see/" nil 1 0 nil nil)
-(826 "\"/this/is/a/very/long/line/in/deed/with/very/many/slashes/in/and/foo\" =~ \"(?>.*/)foo\"" "(?>.*/)foo" nil nil nil nil "/this/is/a/very/long/line/in/deed/with/very/many/slashes/in/and/foo" nil 1 0 "/this/is/a/very/long/line/in/deed/with/very/many/slashes/in/and/foo" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(827 "\"1.230003938\" =~ /(?>(\\.\\d\\d[1-9]?))\\d+/" "(?>(\\.\\d\\d[1-9]?))\\d+" nil nil nil nil "1.230003938" nil 1 0 ".230003938" (".23" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(828 "\"1.875000282\" =~ /(?>(\\.\\d\\d[1-9]?))\\d+/" "(?>(\\.\\d\\d[1-9]?))\\d+" nil nil nil nil "1.875000282" nil 1 0 ".875000282" (".875" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(829 "\"1.235\" =~ /(?>(\\.\\d\\d[1-9]?))\\d+/" "(?>(\\.\\d\\d[1-9]?))\\d+" nil nil nil nil "1.235" nil 1 0 nil nil)
-(830 "\"now is the time for all good men to come to the aid of the party\" =~ /^((?>\\w+)|(?>\\s+))*$/" "^((?>\\w+)|(?>\\s+))*$" nil nil nil nil "now is the time for all good men to come to the aid of the party" nil 1 0 "now is the time for all good men to come to the aid of the party" ("party" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(831 "\"this is not a line with only words and spaces!\" =~ /^((?>\\w+)|(?>\\s+))*$/" "^((?>\\w+)|(?>\\s+))*$" nil nil nil nil "this is not a line with only words and spaces!" nil 1 0 nil nil)
-(832 "\"12345a\" =~ /(\\d+)(\\w)/" "(\\d+)(\\w)" nil nil nil nil "12345a" nil 1 0 "12345a" ("12345" "a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(833 "\"12345+\" =~ /(\\d+)(\\w)/" "(\\d+)(\\w)" nil nil nil nil "12345+" nil 1 0 "12345" ("1234" "5" nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(834 "\"12345a\" =~ /((?>\\d+))(\\w)/" "((?>\\d+))(\\w)" nil nil nil nil "12345a" nil 1 0 "12345a" ("12345" "a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(835 "\"12345+\" =~ /((?>\\d+))(\\w)/" "((?>\\d+))(\\w)" nil nil nil nil "12345+" nil 1 0 nil nil)
-(836 "\"aaab\" =~ /(?>a+)b/" "(?>a+)b" nil nil nil nil "aaab" nil 1 0 "aaab" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(837 "\"aaab\" =~ /((?>a+)b)/" "((?>a+)b)" nil nil nil nil "aaab" nil 1 0 "aaab" ("aaab" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(838 "\"aaab\" =~ /(?>(a+))b/" "(?>(a+))b" nil nil nil nil "aaab" nil 1 0 "aaab" ("aaa" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(839 "\"aaabbbccc\" =~ /(?>b)+/" "(?>b)+" nil nil nil nil "aaabbbccc" nil 1 0 "bbb" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(840 "\"aaabbbbccccd\" =~ /(?>a+|b+|c+)*c/" "(?>a+|b+|c+)*c" nil nil nil nil "aaabbbbccccd" nil 1 0 "aaabbbbc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(841 "\"((abc(ade)ufh()()x\" =~ /((?>[^()]+)|\\([^()]*\\))+/" "((?>[^()]+)|\\([^()]*\\))+" nil nil nil nil "((abc(ade)ufh()()x" nil 1 0 "abc(ade)ufh()()x" ("x" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(842 "\"(abc)\" =~ /\\(((?>[^()]+)|\\([^()]+\\))+\\)/" "\\(((?>[^()]+)|\\([^()]+\\))+\\)" nil nil nil nil "(abc)" nil 1 0 "(abc)" ("abc" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(843 "\"(abc(def)xyz)\" =~ /\\(((?>[^()]+)|\\([^()]+\\))+\\)/" "\\(((?>[^()]+)|\\([^()]+\\))+\\)" nil nil nil nil "(abc(def)xyz)" nil 1 0 "(abc(def)xyz)" ("xyz" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(844 "\"((()aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" =~ /\\(((?>[^()]+)|\\([^()]+\\))+\\)/" "\\(((?>[^()]+)|\\([^()]+\\))+\\)" nil nil nil nil "((()aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" nil 1 0 nil nil)
-(845 "\"ab\" =~ /a(?-i)b/i" "a(?-i)b" t nil nil nil "ab" nil 1 0 "ab" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(846 "\"Ab\" =~ /a(?-i)b/i" "a(?-i)b" t nil nil nil "Ab" nil 1 0 "Ab" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(847 "\"aB\" =~ /a(?-i)b/i" "a(?-i)b" t nil nil nil "aB" nil 1 0 nil nil)
-(848 "\"AB\" =~ /a(?-i)b/i" "a(?-i)b" t nil nil nil "AB" nil 1 0 nil nil)
-(849 "\"a bcd e\" =~ /(a (?x)b c)d e/" "(a (?x)b c)d e" nil nil nil nil "a bcd e" nil 1 0 "a bcd e" ("a bc" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(850 "\"a b cd e\" =~ /(a (?x)b c)d e/" "(a (?x)b c)d e" nil nil nil nil "a b cd e" nil 1 0 nil nil)
-(851 "\"abcd e\" =~ /(a (?x)b c)d e/" "(a (?x)b c)d e" nil nil nil nil "abcd e" nil 1 0 nil nil)
-(852 "\"a bcde\" =~ /(a (?x)b c)d e/" "(a (?x)b c)d e" nil nil nil nil "a bcde" nil 1 0 nil nil)
-(853 "\"a bcde f\" =~ /(a b(?x)c d (?-x)e f)/" "(a b(?x)c d (?-x)e f)" nil nil nil nil "a bcde f" nil 1 0 "a bcde f" ("a bcde f" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(854 "\"abcdef\" =~ /(a b(?x)c d (?-x)e f)/" "(a b(?x)c d (?-x)e f)" nil nil nil nil "abcdef" nil 1 0 nil nil)
-(855 "\"abc\" =~ /(a(?i)b)c/" "(a(?i)b)c" nil nil nil nil "abc" nil 1 0 "abc" ("ab" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(856 "\"aBc\" =~ /(a(?i)b)c/" "(a(?i)b)c" nil nil nil nil "aBc" nil 1 0 "aBc" ("aB" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(857 "\"abC\" =~ /(a(?i)b)c/" "(a(?i)b)c" nil nil nil nil "abC" nil 1 0 nil nil)
-(858 "\"aBC\" =~ /(a(?i)b)c/" "(a(?i)b)c" nil nil nil nil "aBC" nil 1 0 nil nil)
-(859 "\"Abc\" =~ /(a(?i)b)c/" "(a(?i)b)c" nil nil nil nil "Abc" nil 1 0 nil nil)
-(860 "\"ABc\" =~ /(a(?i)b)c/" "(a(?i)b)c" nil nil nil nil "ABc" nil 1 0 nil nil)
-(861 "\"ABC\" =~ /(a(?i)b)c/" "(a(?i)b)c" nil nil nil nil "ABC" nil 1 0 nil nil)
-(862 "\"AbC\" =~ /(a(?i)b)c/" "(a(?i)b)c" nil nil nil nil "AbC" nil 1 0 nil nil)
-(863 "\"abc\" =~ /a(?i:b)c/" "a(?i:b)c" nil nil nil nil "abc" nil 1 0 "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(864 "\"aBc\" =~ /a(?i:b)c/" "a(?i:b)c" nil nil nil nil "aBc" nil 1 0 "aBc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(865 "\"ABC\" =~ /a(?i:b)c/" "a(?i:b)c" nil nil nil nil "ABC" nil 1 0 nil nil)
-(866 "\"abC\" =~ /a(?i:b)c/" "a(?i:b)c" nil nil nil nil "abC" nil 1 0 nil nil)
-(867 "\"aBC\" =~ /a(?i:b)c/" "a(?i:b)c" nil nil nil nil "aBC" nil 1 0 nil nil)
-(868 "\"aBc\" =~ /a(?i:b)*c/" "a(?i:b)*c" nil nil nil nil "aBc" nil 1 0 "aBc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(869 "\"aBBc\" =~ /a(?i:b)*c/" "a(?i:b)*c" nil nil nil nil "aBBc" nil 1 0 "aBBc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(870 "\"aBC\" =~ /a(?i:b)*c/" "a(?i:b)*c" nil nil nil nil "aBC" nil 1 0 nil nil)
-(871 "\"aBBC\" =~ /a(?i:b)*c/" "a(?i:b)*c" nil nil nil nil "aBBC" nil 1 0 nil nil)
-(872 "\"abcd\" =~ /a(?=b(?i)c)\\w\\wd/" "a(?=b(?i)c)\\w\\wd" nil nil nil nil "abcd" nil 1 0 "abcd" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(873 "\"abCd\" =~ /a(?=b(?i)c)\\w\\wd/" "a(?=b(?i)c)\\w\\wd" nil nil nil nil "abCd" nil 1 0 "abCd" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(874 "\"aBCd\" =~ /a(?=b(?i)c)\\w\\wd/" "a(?=b(?i)c)\\w\\wd" nil nil nil nil "aBCd" nil 1 0 nil nil)
-(875 "\"abcD\" =~ /a(?=b(?i)c)\\w\\wd/" "a(?=b(?i)c)\\w\\wd" nil nil nil nil "abcD" nil 1 0 nil nil)
-(876 "\"more than million\" =~ /(?s-i:more.*than).*million/i" "(?s-i:more.*than).*million" t nil nil nil "more than million" nil 1 0 "more than million" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(877 "\"more than MILLION\" =~ /(?s-i:more.*than).*million/i" "(?s-i:more.*than).*million" t nil nil nil "more than MILLION" nil 1 0 "more than MILLION" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(878 "\"more \\n than Million\" =~ /(?s-i:more.*than).*million/i" "(?s-i:more.*than).*million" t nil nil nil "more
- than Million" nil 1 0 "more
- than Million" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(879 "\"MORE THAN MILLION\" =~ /(?s-i:more.*than).*million/i" "(?s-i:more.*than).*million" t nil nil nil "MORE THAN MILLION" nil 1 0 nil nil)
-(880 "\"more \\n than \\n million\" =~ /(?s-i:more.*than).*million/i" "(?s-i:more.*than).*million" t nil nil nil "more
- than
- million" nil 1 0 nil nil)
-(881 "\"more than million\" =~ /(?:(?s-i)more.*than).*million/i" "(?:(?s-i)more.*than).*million" t nil nil nil "more than million" nil 1 0 "more than million" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(882 "\"more than MILLION\" =~ /(?:(?s-i)more.*than).*million/i" "(?:(?s-i)more.*than).*million" t nil nil nil "more than MILLION" nil 1 0 "more than MILLION" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(883 "\"more \\n than Million\" =~ /(?:(?s-i)more.*than).*million/i" "(?:(?s-i)more.*than).*million" t nil nil nil "more
- than Million" nil 1 0 "more
- than Million" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(884 "\"MORE THAN MILLION\" =~ /(?:(?s-i)more.*than).*million/i" "(?:(?s-i)more.*than).*million" t nil nil nil "MORE THAN MILLION" nil 1 0 nil nil)
-(885 "\"more \\n than \\n million\" =~ /(?:(?s-i)more.*than).*million/i" "(?:(?s-i)more.*than).*million" t nil nil nil "more
- than
- million" nil 1 0 nil nil)
-(886 "\"abc\" =~ /(?>a(?i)b+)+c/" "(?>a(?i)b+)+c" nil nil nil nil "abc" nil 1 0 "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(887 "\"aBbc\" =~ /(?>a(?i)b+)+c/" "(?>a(?i)b+)+c" nil nil nil nil "aBbc" nil 1 0 "aBbc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(888 "\"aBBc\" =~ /(?>a(?i)b+)+c/" "(?>a(?i)b+)+c" nil nil nil nil "aBBc" nil 1 0 "aBBc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(889 "\"Abc\" =~ /(?>a(?i)b+)+c/" "(?>a(?i)b+)+c" nil nil nil nil "Abc" nil 1 0 nil nil)
-(890 "\"abAb\" =~ /(?>a(?i)b+)+c/" "(?>a(?i)b+)+c" nil nil nil nil "abAb" nil 1 0 nil nil)
-(891 "\"abbC\" =~ /(?>a(?i)b+)+c/" "(?>a(?i)b+)+c" nil nil nil nil "abbC" nil 1 0 nil nil)
-(892 "\"abc\" =~ /(?=a(?i)b)\\w\\wc/" "(?=a(?i)b)\\w\\wc" nil nil nil nil "abc" nil 1 0 "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(893 "\"aBc\" =~ /(?=a(?i)b)\\w\\wc/" "(?=a(?i)b)\\w\\wc" nil nil nil nil "aBc" nil 1 0 "aBc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(894 "\"Ab\" =~ /(?=a(?i)b)\\w\\wc/" "(?=a(?i)b)\\w\\wc" nil nil nil nil "Ab" nil 1 0 nil nil)
-(895 "\"abC\" =~ /(?=a(?i)b)\\w\\wc/" "(?=a(?i)b)\\w\\wc" nil nil nil nil "abC" nil 1 0 nil nil)
-(896 "\"aBC\" =~ /(?=a(?i)b)\\w\\wc/" "(?=a(?i)b)\\w\\wc" nil nil nil nil "aBC" nil 1 0 nil nil)
-(897 "\"abxxc\" =~ /(?<=a(?i)b)(\\w\\w)c/" "(?<=a(?i)b)(\\w\\w)c" nil nil nil nil "abxxc" nil 1 0 "xxc" ("xx" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(898 "\"aBxxc\" =~ /(?<=a(?i)b)(\\w\\w)c/" "(?<=a(?i)b)(\\w\\w)c" nil nil nil nil "aBxxc" nil 1 0 "xxc" ("xx" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(899 "\"Abxxc\" =~ /(?<=a(?i)b)(\\w\\w)c/" "(?<=a(?i)b)(\\w\\w)c" nil nil nil nil "Abxxc" nil 1 0 nil nil)
-(900 "\"ABxxc\" =~ /(?<=a(?i)b)(\\w\\w)c/" "(?<=a(?i)b)(\\w\\w)c" nil nil nil nil "ABxxc" nil 1 0 nil nil)
-(901 "\"abxxC\" =~ /(?<=a(?i)b)(\\w\\w)c/" "(?<=a(?i)b)(\\w\\w)c" nil nil nil nil "abxxC" nil 1 0 nil nil)
-(902 "\"aA\" =~ /(?:(a)|b)(?(1)A|B)/" "(?:(a)|b)(?(1)A|B)" nil nil nil nil "aA" nil 1 0 "aA" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(903 "\"bB\" =~ /(?:(a)|b)(?(1)A|B)/" "(?:(a)|b)(?(1)A|B)" nil nil nil nil "bB" nil 1 0 "bB" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(904 "\"aB\" =~ /(?:(a)|b)(?(1)A|B)/" "(?:(a)|b)(?(1)A|B)" nil nil nil nil "aB" nil 1 0 nil nil)
-(905 "\"bA\" =~ /(?:(a)|b)(?(1)A|B)/" "(?:(a)|b)(?(1)A|B)" nil nil nil nil "bA" nil 1 0 nil nil)
-(906 "\"aa\" =~ /^(a)?(?(1)a|b)+$/" "^(a)?(?(1)a|b)+$" nil nil nil nil "aa" nil 1 0 "aa" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(907 "\"b\" =~ /^(a)?(?(1)a|b)+$/" "^(a)?(?(1)a|b)+$" nil nil nil nil "b" nil 1 0 "b" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(908 "\"bb\" =~ /^(a)?(?(1)a|b)+$/" "^(a)?(?(1)a|b)+$" nil nil nil nil "bb" nil 1 0 "bb" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(909 "\"ab\" =~ /^(a)?(?(1)a|b)+$/" "^(a)?(?(1)a|b)+$" nil nil nil nil "ab" nil 1 0 nil nil)
-(910 "\"abc:\" =~ /^(?(?=abc)\\w{3}:|\\d\\d)$/" "^(?(?=abc)\\w{3}:|\\d\\d)$" nil nil nil nil "abc:" nil 1 0 "abc:" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(911 "\"12\" =~ /^(?(?=abc)\\w{3}:|\\d\\d)$/" "^(?(?=abc)\\w{3}:|\\d\\d)$" nil nil nil nil "12" nil 1 0 "12" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(912 "\"123\" =~ /^(?(?=abc)\\w{3}:|\\d\\d)$/" "^(?(?=abc)\\w{3}:|\\d\\d)$" nil nil nil nil "123" nil 1 0 nil nil)
-(913 "\"xyz\" =~ /^(?(?=abc)\\w{3}:|\\d\\d)$/" "^(?(?=abc)\\w{3}:|\\d\\d)$" nil nil nil nil "xyz" nil 1 0 nil nil)
-(914 "\"abc:\" =~ /^(?(?!abc)\\d\\d|\\w{3}:)$/" "^(?(?!abc)\\d\\d|\\w{3}:)$" nil nil nil nil "abc:" nil 1 0 "abc:" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(915 "\"12\" =~ /^(?(?!abc)\\d\\d|\\w{3}:)$/" "^(?(?!abc)\\d\\d|\\w{3}:)$" nil nil nil nil "12" nil 1 0 "12" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(916 "\"123\" =~ /^(?(?!abc)\\d\\d|\\w{3}:)$/" "^(?(?!abc)\\d\\d|\\w{3}:)$" nil nil nil nil "123" nil 1 0 nil nil)
-(917 "\"xyz\" =~ /^(?(?!abc)\\d\\d|\\w{3}:)$/" "^(?(?!abc)\\d\\d|\\w{3}:)$" nil nil nil nil "xyz" nil 1 0 nil nil)
-(918 "\"foobar\" =~ /(?(?<=foo)bar|cat)/" "(?(?<=foo)bar|cat)" nil nil nil nil "foobar" nil 1 0 "bar" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(919 "\"cat\" =~ /(?(?<=foo)bar|cat)/" "(?(?<=foo)bar|cat)" nil nil nil nil "cat" nil 1 0 "cat" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(920 "\"fcat\" =~ /(?(?<=foo)bar|cat)/" "(?(?<=foo)bar|cat)" nil nil nil nil "fcat" nil 1 0 "cat" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(921 "\"focat\" =~ /(?(?<=foo)bar|cat)/" "(?(?<=foo)bar|cat)" nil nil nil nil "focat" nil 1 0 "cat" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(922 "\"foocat\" =~ /(?(?<=foo)bar|cat)/" "(?(?<=foo)bar|cat)" nil nil nil nil "foocat" nil 1 0 nil nil)
-(923 "\"foobar\" =~ /(?(?<!foo)cat|bar)/" "(?(?<!foo)cat|bar)" nil nil nil nil "foobar" nil 1 0 "bar" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(924 "\"cat\" =~ /(?(?<!foo)cat|bar)/" "(?(?<!foo)cat|bar)" nil nil nil nil "cat" nil 1 0 "cat" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(925 "\"fcat\" =~ /(?(?<!foo)cat|bar)/" "(?(?<!foo)cat|bar)" nil nil nil nil "fcat" nil 1 0 "cat" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(926 "\"focat\" =~ /(?(?<!foo)cat|bar)/" "(?(?<!foo)cat|bar)" nil nil nil nil "focat" nil 1 0 "cat" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(927 "\"foocat\" =~ /(?(?<!foo)cat|bar)/" "(?(?<!foo)cat|bar)" nil nil nil nil "foocat" nil 1 0 nil nil)
-(928 "\"abcd\" =~ /( \\( )? [^()]+ (?(1) \\) |) /x" "( \\( )? [^()]+ (?(1) \\) |) " nil nil nil t "abcd" nil 1 0 "abcd" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(929 "\"(abcd)\" =~ /( \\( )? [^()]+ (?(1) \\) |) /x" "( \\( )? [^()]+ (?(1) \\) |) " nil nil nil t "(abcd)" nil 1 0 "(abcd)" ("(" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(930 "\"the quick (abcd) fox\" =~ /( \\( )? [^()]+ (?(1) \\) |) /x" "( \\( )? [^()]+ (?(1) \\) |) " nil nil nil t "the quick (abcd) fox" nil 1 0 "the quick " (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(931 "\"(abcd\" =~ /( \\( )? [^()]+ (?(1) \\) |) /x" "( \\( )? [^()]+ (?(1) \\) |) " nil nil nil t "(abcd" nil 1 0 "abcd" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(932 "\"abcd\" =~ /( \\( )? [^()]+ (?(1) \\) ) /x" "( \\( )? [^()]+ (?(1) \\) ) " nil nil nil t "abcd" nil 1 0 "abcd" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(933 "\"(abcd)\" =~ /( \\( )? [^()]+ (?(1) \\) ) /x" "( \\( )? [^()]+ (?(1) \\) ) " nil nil nil t "(abcd)" nil 1 0 "(abcd)" ("(" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(934 "\"the quick (abcd) fox\" =~ /( \\( )? [^()]+ (?(1) \\) ) /x" "( \\( )? [^()]+ (?(1) \\) ) " nil nil nil t "the quick (abcd) fox" nil 1 0 "the quick " (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(935 "\"(abcd\" =~ /( \\( )? [^()]+ (?(1) \\) ) /x" "( \\( )? [^()]+ (?(1) \\) ) " nil nil nil t "(abcd" nil 1 0 "abcd" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(936 "\"12\" =~ /^(?(2)a|(1)(2))+$/" "^(?(2)a|(1)(2))+$" nil nil nil nil "12" nil 1 0 "12" ("1" "2" nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(937 "\"12a\" =~ /^(?(2)a|(1)(2))+$/" "^(?(2)a|(1)(2))+$" nil nil nil nil "12a" nil 1 0 "12a" ("1" "2" nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(938 "\"12aa\" =~ /^(?(2)a|(1)(2))+$/" "^(?(2)a|(1)(2))+$" nil nil nil nil "12aa" nil 1 0 "12aa" ("1" "2" nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(939 "\"1234\" =~ /^(?(2)a|(1)(2))+$/" "^(?(2)a|(1)(2))+$" nil nil nil nil "1234" nil 1 0 nil nil)
-(940 "\"blah blah\" =~ /((?i)blah)\\s+\\1/" "((?i)blah)\\s+\\1" nil nil nil nil "blah blah" nil 1 0 "blah blah" ("blah" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(941 "\"BLAH BLAH\" =~ /((?i)blah)\\s+\\1/" "((?i)blah)\\s+\\1" nil nil nil nil "BLAH BLAH" nil 1 0 "BLAH BLAH" ("BLAH" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(942 "\"Blah Blah\" =~ /((?i)blah)\\s+\\1/" "((?i)blah)\\s+\\1" nil nil nil nil "Blah Blah" nil 1 0 "Blah Blah" ("Blah" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(943 "\"blaH blaH\" =~ /((?i)blah)\\s+\\1/" "((?i)blah)\\s+\\1" nil nil nil nil "blaH blaH" nil 1 0 "blaH blaH" ("blaH" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(944 "\"blah BLAH\" =~ /((?i)blah)\\s+\\1/" "((?i)blah)\\s+\\1" nil nil nil nil "blah BLAH" nil 1 0 nil nil)
-(945 "\"Blah blah\" =~ /((?i)blah)\\s+\\1/" "((?i)blah)\\s+\\1" nil nil nil nil "Blah blah" nil 1 0 nil nil)
-(946 "\"blaH blah\" =~ /((?i)blah)\\s+\\1/" "((?i)blah)\\s+\\1" nil nil nil nil "blaH blah" nil 1 0 nil nil)
-(947 "\"blah blah\" =~ /((?i)blah)\\s+(?i:\\1)/" "((?i)blah)\\s+(?i:\\1)" nil nil nil nil "blah blah" nil 1 0 "blah blah" ("blah" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(948 "\"BLAH BLAH\" =~ /((?i)blah)\\s+(?i:\\1)/" "((?i)blah)\\s+(?i:\\1)" nil nil nil nil "BLAH BLAH" nil 1 0 "BLAH BLAH" ("BLAH" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(949 "\"Blah Blah\" =~ /((?i)blah)\\s+(?i:\\1)/" "((?i)blah)\\s+(?i:\\1)" nil nil nil nil "Blah Blah" nil 1 0 "Blah Blah" ("Blah" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(950 "\"blaH blaH\" =~ /((?i)blah)\\s+(?i:\\1)/" "((?i)blah)\\s+(?i:\\1)" nil nil nil nil "blaH blaH" nil 1 0 "blaH blaH" ("blaH" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(951 "\"blah BLAH\" =~ /((?i)blah)\\s+(?i:\\1)/" "((?i)blah)\\s+(?i:\\1)" nil nil nil nil "blah BLAH" nil 1 0 "blah BLAH" ("blah" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(952 "\"Blah blah\" =~ /((?i)blah)\\s+(?i:\\1)/" "((?i)blah)\\s+(?i:\\1)" nil nil nil nil "Blah blah" nil 1 0 "Blah blah" ("Blah" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(953 "\"blaH blah\" =~ /((?i)blah)\\s+(?i:\\1)/" "((?i)blah)\\s+(?i:\\1)" nil nil nil nil "blaH blah" nil 1 0 "blaH blah" ("blaH" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(954 "\"a\" =~ /(?>a*)*/" "(?>a*)*" nil nil nil nil "a" nil 1 0 "a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(955 "\"aa\" =~ /(?>a*)*/" "(?>a*)*" nil nil nil nil "aa" nil 1 0 "aa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(956 "\"aaaa\" =~ /(?>a*)*/" "(?>a*)*" nil nil nil nil "aaaa" nil 1 0 "aaaa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(957 "\"abc\" =~ /(abc|)+/" "(abc|)+" nil nil nil nil "abc" nil 1 0 "abc" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(958 "\"abcabc\" =~ /(abc|)+/" "(abc|)+" nil nil nil nil "abcabc" nil 1 0 "abcabc" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(959 "\"abcabcabc\" =~ /(abc|)+/" "(abc|)+" nil nil nil nil "abcabcabc" nil 1 0 "abcabcabc" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(960 "\"xyz\" =~ /(abc|)+/" "(abc|)+" nil nil nil nil "xyz" nil 1 0 "" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(961 "\"a\" =~ /([a]*)*/" "([a]*)*" nil nil nil nil "a" nil 1 0 "a" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(962 "\"aaaaa\" =~ /([a]*)*/" "([a]*)*" nil nil nil nil "aaaaa" nil 1 0 "aaaaa" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(963 "\"a\" =~ /([ab]*)*/" "([ab]*)*" nil nil nil nil "a" nil 1 0 "a" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(964 "\"b\" =~ /([ab]*)*/" "([ab]*)*" nil nil nil nil "b" nil 1 0 "b" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(965 "\"ababab\" =~ /([ab]*)*/" "([ab]*)*" nil nil nil nil "ababab" nil 1 0 "ababab" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(966 "\"aaaabcde\" =~ /([ab]*)*/" "([ab]*)*" nil nil nil nil "aaaabcde" nil 1 0 "aaaab" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(967 "\"bbbb\" =~ /([ab]*)*/" "([ab]*)*" nil nil nil nil "bbbb" nil 1 0 "bbbb" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(968 "\"b\" =~ /([^a]*)*/" "([^a]*)*" nil nil nil nil "b" nil 1 0 "b" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(969 "\"bbbb\" =~ /([^a]*)*/" "([^a]*)*" nil nil nil nil "bbbb" nil 1 0 "bbbb" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(970 "\"aaa\" =~ /([^a]*)*/" "([^a]*)*" nil nil nil nil "aaa" nil 1 0 "" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(971 "\"cccc\" =~ /([^ab]*)*/" "([^ab]*)*" nil nil nil nil "cccc" nil 1 0 "cccc" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(972 "\"abab\" =~ /([^ab]*)*/" "([^ab]*)*" nil nil nil nil "abab" nil 1 0 "" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(973 "\"a\" =~ /([a]*?)*/" "([a]*?)*" nil nil nil nil "a" nil 1 0 "" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(974 "\"aaaa\" =~ /([a]*?)*/" "([a]*?)*" nil nil nil nil "aaaa" nil 1 0 "" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(975 "\"a\" =~ /([ab]*?)*/" "([ab]*?)*" nil nil nil nil "a" nil 1 0 "" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(976 "\"b\" =~ /([ab]*?)*/" "([ab]*?)*" nil nil nil nil "b" nil 1 0 "" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(977 "\"abab\" =~ /([ab]*?)*/" "([ab]*?)*" nil nil nil nil "abab" nil 1 0 "" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(978 "\"baba\" =~ /([ab]*?)*/" "([ab]*?)*" nil nil nil nil "baba" nil 1 0 "" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(979 "\"b\" =~ /([^a]*?)*/" "([^a]*?)*" nil nil nil nil "b" nil 1 0 "" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(980 "\"bbbb\" =~ /([^a]*?)*/" "([^a]*?)*" nil nil nil nil "bbbb" nil 1 0 "" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(981 "\"aaa\" =~ /([^a]*?)*/" "([^a]*?)*" nil nil nil nil "aaa" nil 1 0 "" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(982 "\"c\" =~ /([^ab]*?)*/" "([^ab]*?)*" nil nil nil nil "c" nil 1 0 "" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(983 "\"cccc\" =~ /([^ab]*?)*/" "([^ab]*?)*" nil nil nil nil "cccc" nil 1 0 "" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(984 "\"baba\" =~ /([^ab]*?)*/" "([^ab]*?)*" nil nil nil nil "baba" nil 1 0 "" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(985 "\"a\" =~ /(?>a*)*/" "(?>a*)*" nil nil nil nil "a" nil 1 0 "a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(986 "\"aaabcde\" =~ /(?>a*)*/" "(?>a*)*" nil nil nil nil "aaabcde" nil 1 0 "aaa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(987 "\"aaaaa\" =~ /((?>a*))*/" "((?>a*))*" nil nil nil nil "aaaaa" nil 1 0 "aaaaa" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(988 "\"aabbaa\" =~ /((?>a*))*/" "((?>a*))*" nil nil nil nil "aabbaa" nil 1 0 "aa" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(989 "\"aaaaa\" =~ /((?>a*?))*/" "((?>a*?))*" nil nil nil nil "aaaaa" nil 1 0 "" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(990 "\"aabbaa\" =~ /((?>a*?))*/" "((?>a*?))*" nil nil nil nil "aabbaa" nil 1 0 "" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(991 "\"12-sep-98\" =~ /(?(?=[^a-z]+[a-z]) \\d{2}-[a-z]{3}-\\d{2} | \\d{2}-\\d{2}-\\d{2} ) /x" "(?(?=[^a-z]+[a-z]) \\d{2}-[a-z]{3}-\\d{2} | \\d{2}-\\d{2}-\\d{2} ) " nil nil nil t "12-sep-98" nil 1 0 "12-sep-98" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(992 "\"12-09-98\" =~ /(?(?=[^a-z]+[a-z]) \\d{2}-[a-z]{3}-\\d{2} | \\d{2}-\\d{2}-\\d{2} ) /x" "(?(?=[^a-z]+[a-z]) \\d{2}-[a-z]{3}-\\d{2} | \\d{2}-\\d{2}-\\d{2} ) " nil nil nil t "12-09-98" nil 1 0 "12-09-98" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(993 "\"sep-12-98\" =~ /(?(?=[^a-z]+[a-z]) \\d{2}-[a-z]{3}-\\d{2} | \\d{2}-\\d{2}-\\d{2} ) /x" "(?(?=[^a-z]+[a-z]) \\d{2}-[a-z]{3}-\\d{2} | \\d{2}-\\d{2}-\\d{2} ) " nil nil nil t "sep-12-98" nil 1 0 nil nil)
-(994 "\"foobarfoo\" =~ /(?<=(foo))bar\\1/" "(?<=(foo))bar\\1" nil nil nil nil "foobarfoo" nil 1 0 "barfoo" ("foo" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(995 "\"foobarfootling\" =~ /(?<=(foo))bar\\1/" "(?<=(foo))bar\\1" nil nil nil nil "foobarfootling" nil 1 0 "barfoo" ("foo" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(996 "\"foobar\" =~ /(?<=(foo))bar\\1/" "(?<=(foo))bar\\1" nil nil nil nil "foobar" nil 1 0 nil nil)
-(997 "\"barfoo\" =~ /(?<=(foo))bar\\1/" "(?<=(foo))bar\\1" nil nil nil nil "barfoo" nil 1 0 nil nil)
-(998 "\"saturday\" =~ /(?i:saturday|sunday)/" "(?i:saturday|sunday)" nil nil nil nil "saturday" nil 1 0 "saturday" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(999 "\"sunday\" =~ /(?i:saturday|sunday)/" "(?i:saturday|sunday)" nil nil nil nil "sunday" nil 1 0 "sunday" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1000 "\"Saturday\" =~ /(?i:saturday|sunday)/" "(?i:saturday|sunday)" nil nil nil nil "Saturday" nil 1 0 "Saturday" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1001 "\"Sunday\" =~ /(?i:saturday|sunday)/" "(?i:saturday|sunday)" nil nil nil nil "Sunday" nil 1 0 "Sunday" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1002 "\"SATURDAY\" =~ /(?i:saturday|sunday)/" "(?i:saturday|sunday)" nil nil nil nil "SATURDAY" nil 1 0 "SATURDAY" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1003 "\"SUNDAY\" =~ /(?i:saturday|sunday)/" "(?i:saturday|sunday)" nil nil nil nil "SUNDAY" nil 1 0 "SUNDAY" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1004 "\"SunDay\" =~ /(?i:saturday|sunday)/" "(?i:saturday|sunday)" nil nil nil nil "SunDay" nil 1 0 "SunDay" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1005 "\"abcx\" =~ /(a(?i)bc|BB)x/" "(a(?i)bc|BB)x" nil nil nil nil "abcx" nil 1 0 "abcx" ("abc" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1006 "\"aBCx\" =~ /(a(?i)bc|BB)x/" "(a(?i)bc|BB)x" nil nil nil nil "aBCx" nil 1 0 "aBCx" ("aBC" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1007 "\"bbx\" =~ /(a(?i)bc|BB)x/" "(a(?i)bc|BB)x" nil nil nil nil "bbx" nil 1 0 "bbx" ("bb" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1008 "\"BBx\" =~ /(a(?i)bc|BB)x/" "(a(?i)bc|BB)x" nil nil nil nil "BBx" nil 1 0 "BBx" ("BB" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1009 "\"abcX\" =~ /(a(?i)bc|BB)x/" "(a(?i)bc|BB)x" nil nil nil nil "abcX" nil 1 0 nil nil)
-(1010 "\"aBCX\" =~ /(a(?i)bc|BB)x/" "(a(?i)bc|BB)x" nil nil nil nil "aBCX" nil 1 0 nil nil)
-(1011 "\"bbX\" =~ /(a(?i)bc|BB)x/" "(a(?i)bc|BB)x" nil nil nil nil "bbX" nil 1 0 nil nil)
-(1012 "\"BBX\" =~ /(a(?i)bc|BB)x/" "(a(?i)bc|BB)x" nil nil nil nil "BBX" nil 1 0 nil nil)
-(1013 "\"ac\" =~ /^([ab](?i)[cd]|[ef])/" "^([ab](?i)[cd]|[ef])" nil nil nil nil "ac" nil 1 0 "ac" ("ac" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1014 "\"aC\" =~ /^([ab](?i)[cd]|[ef])/" "^([ab](?i)[cd]|[ef])" nil nil nil nil "aC" nil 1 0 "aC" ("aC" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1015 "\"bD\" =~ /^([ab](?i)[cd]|[ef])/" "^([ab](?i)[cd]|[ef])" nil nil nil nil "bD" nil 1 0 "bD" ("bD" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1016 "\"elephant\" =~ /^([ab](?i)[cd]|[ef])/" "^([ab](?i)[cd]|[ef])" nil nil nil nil "elephant" nil 1 0 "e" ("e" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1017 "\"Europe\" =~ /^([ab](?i)[cd]|[ef])/" "^([ab](?i)[cd]|[ef])" nil nil nil nil "Europe" nil 1 0 "E" ("E" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1018 "\"frog\" =~ /^([ab](?i)[cd]|[ef])/" "^([ab](?i)[cd]|[ef])" nil nil nil nil "frog" nil 1 0 "f" ("f" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1019 "\"France\" =~ /^([ab](?i)[cd]|[ef])/" "^([ab](?i)[cd]|[ef])" nil nil nil nil "France" nil 1 0 "F" ("F" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1020 "\"Africa\" =~ /^([ab](?i)[cd]|[ef])/" "^([ab](?i)[cd]|[ef])" nil nil nil nil "Africa" nil 1 0 nil nil)
-(1021 "\"ab\" =~ /^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)/" "^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)" nil nil nil nil "ab" nil 1 0 "ab" ("ab" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1022 "\"aBd\" =~ /^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)/" "^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)" nil nil nil nil "aBd" nil 1 0 "aBd" ("aBd" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1023 "\"xy\" =~ /^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)/" "^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)" nil nil nil nil "xy" nil 1 0 "xy" ("xy" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1024 "\"xY\" =~ /^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)/" "^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)" nil nil nil nil "xY" nil 1 0 "xY" ("xY" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1025 "\"zebra\" =~ /^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)/" "^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)" nil nil nil nil "zebra" nil 1 0 "z" ("z" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1026 "\"Zambesi\" =~ /^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)/" "^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)" nil nil nil nil "Zambesi" nil 1 0 "Z" ("Z" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1027 "\"aCD\" =~ /^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)/" "^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)" nil nil nil nil "aCD" nil 1 0 nil nil)
-(1028 "\"XY\" =~ /^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)/" "^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)" nil nil nil nil "XY" nil 1 0 nil nil)
-(1029 "\"foo\\nbar\" =~ /(?<=foo\\n)^bar/m" "(?<=foo\\n)^bar" nil t nil nil "foo
-bar" nil 1 0 "bar" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1030 "\"bar\" =~ /(?<=foo\\n)^bar/m" "(?<=foo\\n)^bar" nil t nil nil "bar" nil 1 0 nil nil)
-(1031 "\"baz\\nbar\" =~ /(?<=foo\\n)^bar/m" "(?<=foo\\n)^bar" nil t nil nil "baz
-bar" nil 1 0 nil nil)
-(1032 "\"barbaz\" =~ /(?<=(?<!foo)bar)baz/" "(?<=(?<!foo)bar)baz" nil nil nil nil "barbaz" nil 1 0 "baz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1033 "\"barbarbaz\" =~ /(?<=(?<!foo)bar)baz/" "(?<=(?<!foo)bar)baz" nil nil nil nil "barbarbaz" nil 1 0 "baz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1034 "\"koobarbaz\" =~ /(?<=(?<!foo)bar)baz/" "(?<=(?<!foo)bar)baz" nil nil nil nil "koobarbaz" nil 1 0 "baz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1035 "\"baz\" =~ /(?<=(?<!foo)bar)baz/" "(?<=(?<!foo)bar)baz" nil nil nil nil "baz" nil 1 0 nil nil)
-(1036 "\"foobarbaz\" =~ /(?<=(?<!foo)bar)baz/" "(?<=(?<!foo)bar)baz" nil nil nil nil "foobarbaz" nil 1 0 nil nil)
-(1037 "\"a\" =~ /^(a\\1?){4}$/" "^(a\\1?){4}$" nil nil nil nil "a" nil 1 0 nil nil)
-(1038 "\"aa\" =~ /^(a\\1?){4}$/" "^(a\\1?){4}$" nil nil nil nil "aa" nil 1 0 nil nil)
-(1039 "\"aaa\" =~ /^(a\\1?){4}$/" "^(a\\1?){4}$" nil nil nil nil "aaa" nil 1 0 nil nil)
-(1040 "\"aaaa\" =~ /^(a\\1?){4}$/" "^(a\\1?){4}$" nil nil nil nil "aaaa" nil 1 0 "aaaa" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1041 "\"aaaaa\" =~ /^(a\\1?){4}$/" "^(a\\1?){4}$" nil nil nil nil "aaaaa" nil 1 0 "aaaaa" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1042 "\"aaaaaa\" =~ /^(a\\1?){4}$/" "^(a\\1?){4}$" nil nil nil nil "aaaaaa" nil 1 0 "aaaaaa" ("aa" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1043 "\"aaaaaaa\" =~ /^(a\\1?){4}$/" "^(a\\1?){4}$" nil nil nil nil "aaaaaaa" nil 1 0 "aaaaaaa" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1044 "\"aaaaaaaa\" =~ /^(a\\1?){4}$/" "^(a\\1?){4}$" nil nil nil nil "aaaaaaaa" nil 1 0 nil nil)
-(1045 "\"aaaaaaaaa\" =~ /^(a\\1?){4}$/" "^(a\\1?){4}$" nil nil nil nil "aaaaaaaaa" nil 1 0 nil nil)
-(1046 "\"aaaaaaaaaa\" =~ /^(a\\1?){4}$/" "^(a\\1?){4}$" nil nil nil nil "aaaaaaaaaa" nil 1 0 "aaaaaaaaaa" ("aaaa" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1047 "\"aaaaaaaaaaa\" =~ /^(a\\1?){4}$/" "^(a\\1?){4}$" nil nil nil nil "aaaaaaaaaaa" nil 1 0 nil nil)
-(1048 "\"aaaaaaaaaaaa\" =~ /^(a\\1?){4}$/" "^(a\\1?){4}$" nil nil nil nil "aaaaaaaaaaaa" nil 1 0 nil nil)
-(1049 "\"aaaaaaaaaaaaa\" =~ /^(a\\1?){4}$/" "^(a\\1?){4}$" nil nil nil nil "aaaaaaaaaaaaa" nil 1 0 nil nil)
-(1050 "\"aaaaaaaaaaaaaa\" =~ /^(a\\1?){4}$/" "^(a\\1?){4}$" nil nil nil nil "aaaaaaaaaaaaaa" nil 1 0 nil nil)
-(1051 "\"aaaaaaaaaaaaaaa\" =~ /^(a\\1?){4}$/" "^(a\\1?){4}$" nil nil nil nil "aaaaaaaaaaaaaaa" nil 1 0 nil nil)
-(1052 "\"aaaaaaaaaaaaaaaa\" =~ /^(a\\1?){4}$/" "^(a\\1?){4}$" nil nil nil nil "aaaaaaaaaaaaaaaa" nil 1 0 nil nil)
-(1053 "\"a\" =~ /^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$/" "^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$" nil nil nil nil "a" nil 1 0 nil nil)
-(1054 "\"aa\" =~ /^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$/" "^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$" nil nil nil nil "aa" nil 1 0 nil nil)
-(1055 "\"aaa\" =~ /^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$/" "^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$" nil nil nil nil "aaa" nil 1 0 nil nil)
-(1056 "\"aaaa\" =~ /^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$/" "^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$" nil nil nil nil "aaaa" nil 1 0 "aaaa" ("a" "a" "a" "a" nil nil nil nil nil nil nil nil nil nil nil nil))
-(1057 "\"aaaaa\" =~ /^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$/" "^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$" nil nil nil nil "aaaaa" nil 1 0 "aaaaa" ("a" "aa" "a" "a" nil nil nil nil nil nil nil nil nil nil nil nil))
-(1058 "\"aaaaaa\" =~ /^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$/" "^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$" nil nil nil nil "aaaaaa" nil 1 0 "aaaaaa" ("a" "aa" "a" "aa" nil nil nil nil nil nil nil nil nil nil nil nil))
-(1059 "\"aaaaaaa\" =~ /^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$/" "^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$" nil nil nil nil "aaaaaaa" nil 1 0 "aaaaaaa" ("a" "aa" "aaa" "a" nil nil nil nil nil nil nil nil nil nil nil nil))
-(1060 "\"aaaaaaaa\" =~ /^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$/" "^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$" nil nil nil nil "aaaaaaaa" nil 1 0 nil nil)
-(1061 "\"aaaaaaaaa\" =~ /^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$/" "^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$" nil nil nil nil "aaaaaaaaa" nil 1 0 nil nil)
-(1062 "\"aaaaaaaaaa\" =~ /^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$/" "^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$" nil nil nil nil "aaaaaaaaaa" nil 1 0 "aaaaaaaaaa" ("a" "aa" "aaa" "aaaa" nil nil nil nil nil nil nil nil nil nil nil nil))
-(1063 "\"aaaaaaaaaaa\" =~ /^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$/" "^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$" nil nil nil nil "aaaaaaaaaaa" nil 1 0 nil nil)
-(1064 "\"aaaaaaaaaaaa\" =~ /^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$/" "^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$" nil nil nil nil "aaaaaaaaaaaa" nil 1 0 nil nil)
-(1065 "\"aaaaaaaaaaaaa\" =~ /^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$/" "^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$" nil nil nil nil "aaaaaaaaaaaaa" nil 1 0 nil nil)
-(1066 "\"aaaaaaaaaaaaaa\" =~ /^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$/" "^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$" nil nil nil nil "aaaaaaaaaaaaaa" nil 1 0 nil nil)
-(1067 "\"aaaaaaaaaaaaaaa\" =~ /^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$/" "^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$" nil nil nil nil "aaaaaaaaaaaaaaa" nil 1 0 nil nil)
-(1068 "\"aaaaaaaaaaaaaaaa\" =~ /^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$/" "^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$" nil nil nil nil "aaaaaaaaaaaaaaaa" nil 1 0 nil nil)
-(1069 "\"abc\" =~ /abc/" "abc" nil nil nil nil "abc" nil 1 0 "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1070 "\"xabcy\" =~ /abc/" "abc" nil nil nil nil "xabcy" nil 1 0 "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1071 "\"ababc\" =~ /abc/" "abc" nil nil nil nil "ababc" nil 1 0 "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1072 "\"xbc\" =~ /abc/" "abc" nil nil nil nil "xbc" nil 1 0 nil nil)
-(1073 "\"axc\" =~ /abc/" "abc" nil nil nil nil "axc" nil 1 0 nil nil)
-(1074 "\"abx\" =~ /abc/" "abc" nil nil nil nil "abx" nil 1 0 nil nil)
-(1075 "\"abc\" =~ /ab*c/" "ab*c" nil nil nil nil "abc" nil 1 0 "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1076 "\"abc\" =~ /ab*bc/" "ab*bc" nil nil nil nil "abc" nil 1 0 "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1077 "\"abbc\" =~ /ab*bc/" "ab*bc" nil nil nil nil "abbc" nil 1 0 "abbc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1078 "\"abbbbc\" =~ /ab*bc/" "ab*bc" nil nil nil nil "abbbbc" nil 1 0 "abbbbc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1079 "\"abbbbc\" =~ /.{1}/" ".{1}" nil nil nil nil "abbbbc" nil 1 0 "a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1080 "\"abbbbc\" =~ /.{3,4}/" ".{3,4}" nil nil nil nil "abbbbc" nil 1 0 "abbb" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1081 "\"abbbbc\" =~ /ab{0,}bc/" "ab{0,}bc" nil nil nil nil "abbbbc" nil 1 0 "abbbbc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1082 "\"abbc\" =~ /ab+bc/" "ab+bc" nil nil nil nil "abbc" nil 1 0 "abbc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1083 "\"abc\" =~ /ab+bc/" "ab+bc" nil nil nil nil "abc" nil 1 0 nil nil)
-(1084 "\"abq\" =~ /ab+bc/" "ab+bc" nil nil nil nil "abq" nil 1 0 nil nil)
-(1085 "\"abbbbc\" =~ /ab+bc/" "ab+bc" nil nil nil nil "abbbbc" nil 1 0 "abbbbc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1086 "\"abbbbc\" =~ /ab{1,}bc/" "ab{1,}bc" nil nil nil nil "abbbbc" nil 1 0 "abbbbc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1087 "\"abbbbc\" =~ /ab{1,3}bc/" "ab{1,3}bc" nil nil nil nil "abbbbc" nil 1 0 "abbbbc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1088 "\"abbbbc\" =~ /ab{3,4}bc/" "ab{3,4}bc" nil nil nil nil "abbbbc" nil 1 0 "abbbbc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1089 "\"abq\" =~ /ab{4,5}bc/" "ab{4,5}bc" nil nil nil nil "abq" nil 1 0 nil nil)
-(1090 "\"abbbbc\" =~ /ab{4,5}bc/" "ab{4,5}bc" nil nil nil nil "abbbbc" nil 1 0 nil nil)
-(1091 "\"abbc\" =~ /ab?bc/" "ab?bc" nil nil nil nil "abbc" nil 1 0 "abbc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1092 "\"abc\" =~ /ab?bc/" "ab?bc" nil nil nil nil "abc" nil 1 0 "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1093 "\"abc\" =~ /ab{0,1}bc/" "ab{0,1}bc" nil nil nil nil "abc" nil 1 0 "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1094 "\"abc\" =~ /ab?c/" "ab?c" nil nil nil nil "abc" nil 1 0 "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1095 "\"abc\" =~ /ab{0,1}c/" "ab{0,1}c" nil nil nil nil "abc" nil 1 0 "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1096 "\"abc\" =~ /^abc$/" "^abc$" nil nil nil nil "abc" nil 1 0 "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1097 "\"abbbbc\" =~ /^abc$/" "^abc$" nil nil nil nil "abbbbc" nil 1 0 nil nil)
-(1098 "\"abcc\" =~ /^abc$/" "^abc$" nil nil nil nil "abcc" nil 1 0 nil nil)
-(1099 "\"abcc\" =~ /^abc/" "^abc" nil nil nil nil "abcc" nil 1 0 "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1100 "\"aabc\" =~ /abc$/" "abc$" nil nil nil nil "aabc" nil 1 0 "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1101 "\"aabc\" =~ /abc$/" "abc$" nil nil nil nil "aabc" nil 1 0 "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1102 "\"aabcd\" =~ /abc$/" "abc$" nil nil nil nil "aabcd" nil 1 0 nil nil)
-(1103 "\"abc\" =~ /^/" "^" nil nil nil nil "abc" nil 1 0 "" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1104 "\"abc\" =~ /$/" "$" nil nil nil nil "abc" nil 1 0 "" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1105 "\"abc\" =~ /a.c/" "a.c" nil nil nil nil "abc" nil 1 0 "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1106 "\"axc\" =~ /a.c/" "a.c" nil nil nil nil "axc" nil 1 0 "axc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1107 "\"axyzc\" =~ /a.*c/" "a.*c" nil nil nil nil "axyzc" nil 1 0 "axyzc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1108 "\"abd\" =~ /a[bc]d/" "a[bc]d" nil nil nil nil "abd" nil 1 0 "abd" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1109 "\"axyzd\" =~ /a[bc]d/" "a[bc]d" nil nil nil nil "axyzd" nil 1 0 nil nil)
-(1110 "\"abc\" =~ /a[bc]d/" "a[bc]d" nil nil nil nil "abc" nil 1 0 nil nil)
-(1111 "\"ace\" =~ /a[b-d]e/" "a[b-d]e" nil nil nil nil "ace" nil 1 0 "ace" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1112 "\"aac\" =~ /a[b-d]/" "a[b-d]" nil nil nil nil "aac" nil 1 0 "ac" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1113 "\"a-\" =~ /a[-b]/" "a[-b]" nil nil nil nil "a-" nil 1 0 "a-" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1114 "\"a-\" =~ /a[b-]/" "a[b-]" nil nil nil nil "a-" nil 1 0 "a-" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1115 "\"a]\" =~ /a]/" "a]" nil nil nil nil "a]" nil 1 0 "a]" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1116 "\"a]b\" =~ /a[]]b/" "a[]]b" nil nil nil nil "a]b" nil 1 0 "a]b" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1117 "\"aed\" =~ /a[^bc]d/" "a[^bc]d" nil nil nil nil "aed" nil 1 0 "aed" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1118 "\"abd\" =~ /a[^bc]d/" "a[^bc]d" nil nil nil nil "abd" nil 1 0 nil nil)
-(1119 "\"abd\" =~ /a[^bc]d/" "a[^bc]d" nil nil nil nil "abd" nil 1 0 nil nil)
-(1120 "\"adc\" =~ /a[^-b]c/" "a[^-b]c" nil nil nil nil "adc" nil 1 0 "adc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1121 "\"adc\" =~ /a[^]b]c/" "a[^]b]c" nil nil nil nil "adc" nil 1 0 "adc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1122 "\"a-c\" =~ /a[^]b]c/" "a[^]b]c" nil nil nil nil "a-c" nil 1 0 "a-c" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1123 "\"a]c\" =~ /a[^]b]c/" "a[^]b]c" nil nil nil nil "a]c" nil 1 0 nil nil)
-(1124 "\"a-\" =~ /\\ba\\b/" "\\ba\\b" nil nil nil nil "a-" nil 1 0 "a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1125 "\"-a\" =~ /\\ba\\b/" "\\ba\\b" nil nil nil nil "-a" nil 1 0 "a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1126 "\"-a-\" =~ /\\ba\\b/" "\\ba\\b" nil nil nil nil "-a-" nil 1 0 "a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1127 "\"xy\" =~ /\\by\\b/" "\\by\\b" nil nil nil nil "xy" nil 1 0 nil nil)
-(1128 "\"yz\" =~ /\\by\\b/" "\\by\\b" nil nil nil nil "yz" nil 1 0 nil nil)
-(1129 "\"xyz\" =~ /\\by\\b/" "\\by\\b" nil nil nil nil "xyz" nil 1 0 nil nil)
-(1130 "\"a-\" =~ /\\Ba\\B/" "\\Ba\\B" nil nil nil nil "a-" nil 1 0 nil nil)
-(1131 "\"-a\" =~ /\\Ba\\B/" "\\Ba\\B" nil nil nil nil "-a" nil 1 0 nil nil)
-(1132 "\"-a-\" =~ /\\Ba\\B/" "\\Ba\\B" nil nil nil nil "-a-" nil 1 0 nil nil)
-(1133 "\"xy\" =~ /\\By\\b/" "\\By\\b" nil nil nil nil "xy" nil 1 0 "y" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1134 "\"yz\" =~ /\\by\\B/" "\\by\\B" nil nil nil nil "yz" nil 1 0 "y" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1135 "\"xyz\" =~ /\\By\\B/" "\\By\\B" nil nil nil nil "xyz" nil 1 0 "y" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1136 "\"a\" =~ /\\w/" "\\w" nil nil nil nil "a" nil 1 0 "a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1137 "\"-\" =~ /\\W/" "\\W" nil nil nil nil "-" nil 1 0 "-" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1138 "\"-\" =~ /\\W/" "\\W" nil nil nil nil "-" nil 1 0 "-" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1139 "\"a\" =~ /\\W/" "\\W" nil nil nil nil "a" nil 1 0 nil nil)
-(1140 "\"a b\" =~ /a\\sb/" "a\\sb" nil nil nil nil "a b" nil 1 0 "a b" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1141 "\"a-b\" =~ /a\\Sb/" "a\\Sb" nil nil nil nil "a-b" nil 1 0 "a-b" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1142 "\"a-b\" =~ /a\\Sb/" "a\\Sb" nil nil nil nil "a-b" nil 1 0 "a-b" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1143 "\"a b\" =~ /a\\Sb/" "a\\Sb" nil nil nil nil "a b" nil 1 0 nil nil)
-(1144 "\"1\" =~ /\\d/" "\\d" nil nil nil nil "1" nil 1 0 "1" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1145 "\"-\" =~ /\\D/" "\\D" nil nil nil nil "-" nil 1 0 "-" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1146 "\"-\" =~ /\\D/" "\\D" nil nil nil nil "-" nil 1 0 "-" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1147 "\"1\" =~ /\\D/" "\\D" nil nil nil nil "1" nil 1 0 nil nil)
-(1148 "\"a\" =~ /[\\w]/" "[\\w]" nil nil nil nil "a" nil 1 0 "a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1149 "\"-\" =~ /[\\W]/" "[\\W]" nil nil nil nil "-" nil 1 0 "-" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1150 "\"-\" =~ /[\\W]/" "[\\W]" nil nil nil nil "-" nil 1 0 "-" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1151 "\"a\" =~ /[\\W]/" "[\\W]" nil nil nil nil "a" nil 1 0 nil nil)
-(1152 "\"a b\" =~ /a[\\s]b/" "a[\\s]b" nil nil nil nil "a b" nil 1 0 "a b" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1153 "\"a-b\" =~ /a[\\S]b/" "a[\\S]b" nil nil nil nil "a-b" nil 1 0 "a-b" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1154 "\"a-b\" =~ /a[\\S]b/" "a[\\S]b" nil nil nil nil "a-b" nil 1 0 "a-b" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1155 "\"a b\" =~ /a[\\S]b/" "a[\\S]b" nil nil nil nil "a b" nil 1 0 nil nil)
-(1156 "\"1\" =~ /[\\d]/" "[\\d]" nil nil nil nil "1" nil 1 0 "1" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1157 "\"-\" =~ /[\\D]/" "[\\D]" nil nil nil nil "-" nil 1 0 "-" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1158 "\"-\" =~ /[\\D]/" "[\\D]" nil nil nil nil "-" nil 1 0 "-" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1159 "\"1\" =~ /[\\D]/" "[\\D]" nil nil nil nil "1" nil 1 0 nil nil)
-(1160 "\"abc\" =~ /ab|cd/" "ab|cd" nil nil nil nil "abc" nil 1 0 "ab" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1161 "\"abcd\" =~ /ab|cd/" "ab|cd" nil nil nil nil "abcd" nil 1 0 "ab" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1162 "\"def\" =~ /()ef/" "()ef" nil nil nil nil "def" nil 1 0 "ef" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1163 "\"a(b\" =~ /a\\(b/" "a\\(b" nil nil nil nil "a(b" nil 1 0 "a(b" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1164 "\"ab\" =~ /a\\(*b/" "a\\(*b" nil nil nil nil "ab" nil 1 0 "ab" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1165 "\"a((b\" =~ /a\\(*b/" "a\\(*b" nil nil nil nil "a((b" nil 1 0 "a((b" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1166 "\"a\\b\" =~ /a\\\\b/" "a\\\\b" nil nil nil nil ("a" 8) nil 1 0 nil nil)
-(1167 "\"abc\" =~ /((a))/" "((a))" nil nil nil nil "abc" nil 1 0 "a" ("a" "a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1168 "\"abc\" =~ /(a)b(c)/" "(a)b(c)" nil nil nil nil "abc" nil 1 0 "abc" ("a" "c" nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1169 "\"aabbabc\" =~ /a+b+c/" "a+b+c" nil nil nil nil "aabbabc" nil 1 0 "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1170 "\"aabbabc\" =~ /a{1,}b{1,}c/" "a{1,}b{1,}c" nil nil nil nil "aabbabc" nil 1 0 "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1171 "\"abcabc\" =~ /a.+?c/" "a.+?c" nil nil nil nil "abcabc" nil 1 0 "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1172 "\"ab\" =~ /(a+|b)*/" "(a+|b)*" nil nil nil nil "ab" nil 1 0 "ab" ("b" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1173 "\"ab\" =~ /(a+|b){0,}/" "(a+|b){0,}" nil nil nil nil "ab" nil 1 0 "ab" ("b" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1174 "\"ab\" =~ /(a+|b)+/" "(a+|b)+" nil nil nil nil "ab" nil 1 0 "ab" ("b" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1175 "\"ab\" =~ /(a+|b){1,}/" "(a+|b){1,}" nil nil nil nil "ab" nil 1 0 "ab" ("b" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1176 "\"ab\" =~ /(a+|b)?/" "(a+|b)?" nil nil nil nil "ab" nil 1 0 "a" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1177 "\"ab\" =~ /(a+|b){0,1}/" "(a+|b){0,1}" nil nil nil nil "ab" nil 1 0 "a" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1178 "\"cde\" =~ /[^ab]*/" "[^ab]*" nil nil nil nil "cde" nil 1 0 "cde" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1179 "\"b\" =~ /abc/" "abc" nil nil nil nil "b" nil 1 0 nil nil)
-(1180 "\"abbbcd\" =~
-/([abc])*d/" "([abc])*d" nil nil nil nil "abbbcd" nil 1 0 "abbbcd" ("c" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1181 "\"abcd\" =~ /([abc])*bcd/" "([abc])*bcd" nil nil nil nil "abcd" nil 1 0 "abcd" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1182 "\"e\" =~ /a|b|c|d|e/" "a|b|c|d|e" nil nil nil nil "e" nil 1 0 "e" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1183 "\"ef\" =~ /(a|b|c|d|e)f/" "(a|b|c|d|e)f" nil nil nil nil "ef" nil 1 0 "ef" ("e" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1184 "\"abcdefg\" =~ /abcd*efg/" "abcd*efg" nil nil nil nil "abcdefg" nil 1 0 "abcdefg" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1185 "\"xabyabbbz\" =~ /ab*/" "ab*" nil nil nil nil "xabyabbbz" nil 1 0 "ab" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1186 "\"xayabbbz\" =~ /ab*/" "ab*" nil nil nil nil "xayabbbz" nil 1 0 "a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1187 "\"abcde\" =~ /(ab|cd)e/" "(ab|cd)e" nil nil nil nil "abcde" nil 1 0 "cde" ("cd" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1188 "\"hij\" =~ /[abhgefdc]ij/" "[abhgefdc]ij" nil nil nil nil "hij" nil 1 0 "hij" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1189 "\"abcdef\" =~ /(abc|)ef/" "(abc|)ef" nil nil nil nil "abcdef" nil 1 0 "ef" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1190 "\"abcd\" =~ /(a|b)c*d/" "(a|b)c*d" nil nil nil nil "abcd" nil 1 0 "bcd" ("b" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1191 "\"abc\" =~ /(ab|ab*)bc/" "(ab|ab*)bc" nil nil nil nil "abc" nil 1 0 "abc" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1192 "\"abc\" =~ /a([bc]*)c*/" "a([bc]*)c*" nil nil nil nil "abc" nil 1 0 "abc" ("bc" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1193 "\"abcd\" =~ /a([bc]*)(c*d)/" "a([bc]*)(c*d)" nil nil nil nil "abcd" nil 1 0 "abcd" ("bc" "d" nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1194 "\"abcd\" =~ /a([bc]+)(c*d)/" "a([bc]+)(c*d)" nil nil nil nil "abcd" nil 1 0 "abcd" ("bc" "d" nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1195 "\"abcd\" =~ /a([bc]*)(c+d)/" "a([bc]*)(c+d)" nil nil nil nil "abcd" nil 1 0 "abcd" ("b" "cd" nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1196 "\"adcdcde\" =~ /a[bcd]*dcdcde/" "a[bcd]*dcdcde" nil nil nil nil "adcdcde" nil 1 0 "adcdcde" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1197 "\"abcde\" =~ /a[bcd]+dcdcde/" "a[bcd]+dcdcde" nil nil nil nil "abcde" nil 1 0 nil nil)
-(1198 "\"adcdcde\" =~ /a[bcd]+dcdcde/" "a[bcd]+dcdcde" nil nil nil nil "adcdcde" nil 1 0 nil nil)
-(1199 "\"abc\" =~ /(ab|a)b*c/" "(ab|a)b*c" nil nil nil nil "abc" nil 1 0 "abc" ("ab" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1200 "\"abcd\" =~ /((a)(b)c)(d)/" "((a)(b)c)(d)" nil nil nil nil "abcd" nil 1 0 "abcd" ("abc" "a" "b" "d" nil nil nil nil nil nil nil nil nil nil nil nil))
-(1201 "\"alpha\" =~ /[a-zA-Z_][a-zA-Z0-9_]*/" "[a-zA-Z_][a-zA-Z0-9_]*" nil nil nil nil "alpha" nil 1 0 "alpha" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1202 "\"abh\" =~ /^a(bc+|b[eh])g|.h$/" "^a(bc+|b[eh])g|.h$" nil nil nil nil "abh" nil 1 0 "bh" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1203 "\"effgz\" =~ /(bc+d$|ef*g.|h?i(j|k))/" "(bc+d$|ef*g.|h?i(j|k))" nil nil nil nil "effgz" nil 1 0 "effgz" ("effgz" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1204 "\"ij\" =~ /(bc+d$|ef*g.|h?i(j|k))/" "(bc+d$|ef*g.|h?i(j|k))" nil nil nil nil "ij" nil 1 0 "ij" ("ij" "j" nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1205 "\"reffgz\" =~ /(bc+d$|ef*g.|h?i(j|k))/" "(bc+d$|ef*g.|h?i(j|k))" nil nil nil nil "reffgz" nil 1 0 "effgz" ("effgz" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1206 "\"effg\" =~ /(bc+d$|ef*g.|h?i(j|k))/" "(bc+d$|ef*g.|h?i(j|k))" nil nil nil nil "effg" nil 1 0 nil nil)
-(1207 "\"bcdd\" =~ /(bc+d$|ef*g.|h?i(j|k))/" "(bc+d$|ef*g.|h?i(j|k))" nil nil nil nil "bcdd" nil 1 0 nil nil)
-(1208 "\"a\" =~ /((((((((((a))))))))))/" "((((((((((a))))))))))" nil nil nil nil "a" nil 1 0 "a" ("a" "a" "a" "a" "a" "a" "a" "a" "a" "a" nil nil nil nil nil nil))
-(1209 "\"aa\" =~ /((((((((((a))))))))))\\10/" "((((((((((a))))))))))\\10" nil nil nil nil "aa" nil 1 0 "aa" ("a" "a" "a" "a" "a" "a" "a" "a" "a" "a" nil nil nil nil nil nil))
-(1210 "\"a\" =~ /(((((((((a)))))))))/" "(((((((((a)))))))))" nil nil nil nil "a" nil 1 0 "a" ("a" "a" "a" "a" "a" "a" "a" "a" "a" nil nil nil nil nil nil nil))
-(1211 "\"aa\" =~ /multiple words of text/" "multiple words of text" nil nil nil nil "aa" nil 1 0 nil nil)
-(1212 "\"uh-uh\" =~ /multiple words of text/" "multiple words of text" nil nil nil nil "uh-uh" nil 1 0 nil nil)
-(1213 "\"multiple words, yeah\" =~ /multiple words/" "multiple words" nil nil nil nil "multiple words, yeah" nil 1 0 "multiple words" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1214 "\"abcde\" =~ /(.*)c(.*)/" "(.*)c(.*)" nil nil nil nil "abcde" nil 1 0 "abcde" ("ab" "de" nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1215 "\"(a, b)\" =~ /\\((.*), (.*)\\)/" "\\((.*), (.*)\\)" nil nil nil nil "(a, b)" nil 1 0 "(a, b)" ("a" "b" nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1216 "\"abcd\" =~ /abcd/" "abcd" nil nil nil nil "abcd" nil 1 0 "abcd" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1217 "\"abcd\" =~ /a(bc)d/" "a(bc)d" nil nil nil nil "abcd" nil 1 0 "abcd" ("bc" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1218 "\"ac\" =~ /a[-]?c/" "a[-]?c" nil nil nil nil "ac" nil 1 0 "ac" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1219 "\"abcabc\" =~ /(abc)\\1/" "(abc)\\1" nil nil nil nil "abcabc" nil 1 0 "abcabc" ("abc" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1220 "\"abcabc\" =~ /([a-c]*)\\1/" "([a-c]*)\\1" nil nil nil nil "abcabc" nil 1 0 "abcabc" ("abc" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1221 "\"a\" =~ /(a)|\\1/" "(a)|\\1" nil nil nil nil "a" nil 1 0 "a" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1222 "\"ab\" =~ /(a)|\\1/" "(a)|\\1" nil nil nil nil "ab" nil 1 0 "a" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1223 "\"x\" =~ /(a)|\\1/" "(a)|\\1" nil nil nil nil "x" nil 1 0 nil nil)
-(1224 "\"ababbbcbc\" =~ /(([a-c])b*?\\2)*/" "(([a-c])b*?\\2)*" nil nil nil nil "ababbbcbc" nil 1 0 "ababb" ("bb" "b" nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1225 "\"ababbbcbc\" =~ /(([a-c])b*?\\2){3}/" "(([a-c])b*?\\2){3}" nil nil nil nil "ababbbcbc" nil 1 0 "ababbbcbc" ("cbc" "c" nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1226 "\"aaaxabaxbaaxbbax\" =~ /((\\3|b)\\2(a)x)+/" "((\\3|b)\\2(a)x)+" nil nil nil nil "aaaxabaxbaaxbbax" nil 1 0 "bbax" ("bbax" "b" "a" nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1227 "\"bbaababbabaaaaabbaaaabba\" =~ /((\\3|b)\\2(a)){2,}/" "((\\3|b)\\2(a)){2,}" nil nil nil nil "bbaababbabaaaaabbaaaabba" nil 1 0 "bbaaaabba" ("bba" "b" "a" nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1228 "\"ABC\" =~ /abc/i" "abc" t nil nil nil "ABC" nil 1 0 "ABC" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1229 "\"XABCY\" =~ /abc/i" "abc" t nil nil nil "XABCY" nil 1 0 "ABC" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1230 "\"ABABC\" =~ /abc/i" "abc" t nil nil nil "ABABC" nil 1 0 "ABC" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1231 "\"aaxabxbaxbbx\" =~ /abc/i" "abc" t nil nil nil "aaxabxbaxbbx" nil 1 0 nil nil)
-(1232 "\"XBC\" =~ /abc/i" "abc" t nil nil nil "XBC" nil 1 0 nil nil)
-(1233 "\"AXC\" =~ /abc/i" "abc" t nil nil nil "AXC" nil 1 0 nil nil)
-(1234 "\"ABX\" =~ /abc/i" "abc" t nil nil nil "ABX" nil 1 0 nil nil)
-(1235 "\"ABC\" =~ /ab*c/i" "ab*c" t nil nil nil "ABC" nil 1 0 "ABC" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1236 "\"ABC\" =~ /ab*bc/i" "ab*bc" t nil nil nil "ABC" nil 1 0 "ABC" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1237 "\"ABBC\" =~ /ab*bc/i" "ab*bc" t nil nil nil "ABBC" nil 1 0 "ABBC" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1238 "\"ABBBBC\" =~ /ab*?bc/i" "ab*?bc" t nil nil nil "ABBBBC" nil 1 0 "ABBBBC" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1239 "\"ABBBBC\" =~ /ab{0,}?bc/i" "ab{0,}?bc" t nil nil nil "ABBBBC" nil 1 0 "ABBBBC" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1240 "\"ABBC\" =~ /ab+?bc/i" "ab+?bc" t nil nil nil "ABBC" nil 1 0 "ABBC" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1241 "\"ABC\" =~ /ab+bc/i" "ab+bc" t nil nil nil "ABC" nil 1 0 nil nil)
-(1242 "\"ABQ\" =~ /ab+bc/i" "ab+bc" t nil nil nil "ABQ" nil 1 0 nil nil)
-(1243 "\"ABBBBC\" =~ /ab+bc/i" "ab+bc" t nil nil nil "ABBBBC" nil 1 0 "ABBBBC" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1244 "\"ABBBBC\" =~ /ab{1,}?bc/i" "ab{1,}?bc" t nil nil nil "ABBBBC" nil 1 0 "ABBBBC" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1245 "\"ABBBBC\" =~ /ab{1,3}?bc/i" "ab{1,3}?bc" t nil nil nil "ABBBBC" nil 1 0 "ABBBBC" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1246 "\"ABBBBC\" =~ /ab{3,4}?bc/i" "ab{3,4}?bc" t nil nil nil "ABBBBC" nil 1 0 "ABBBBC" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1247 "\"ABQ\" =~ /ab{4,5}?bc/i" "ab{4,5}?bc" t nil nil nil "ABQ" nil 1 0 nil nil)
-(1248 "\"ABBBBC\" =~ /ab{4,5}?bc/i" "ab{4,5}?bc" t nil nil nil "ABBBBC" nil 1 0 nil nil)
-(1249 "\"ABBC\" =~ /ab??bc/i" "ab??bc" t nil nil nil "ABBC" nil 1 0 "ABBC" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1250 "\"ABC\" =~ /ab??bc/i" "ab??bc" t nil nil nil "ABC" nil 1 0 "ABC" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1251 "\"ABC\" =~ /ab{0,1}?bc/i" "ab{0,1}?bc" t nil nil nil "ABC" nil 1 0 "ABC" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1252 "\"ABC\" =~ /ab??c/i" "ab??c" t nil nil nil "ABC" nil 1 0 "ABC" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1253 "\"ABC\" =~ /ab{0,1}?c/i" "ab{0,1}?c" t nil nil nil "ABC" nil 1 0 "ABC" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1254 "\"ABC\" =~ /^abc$/i" "^abc$" t nil nil nil "ABC" nil 1 0 "ABC" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1255 "\"ABBBBC\" =~ /^abc$/i" "^abc$" t nil nil nil "ABBBBC" nil 1 0 nil nil)
-(1256 "\"ABCC\" =~ /^abc$/i" "^abc$" t nil nil nil "ABCC" nil 1 0 nil nil)
-(1257 "\"ABCC\" =~ /^abc/i" "^abc" t nil nil nil "ABCC" nil 1 0 "ABC" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1258 "\"AABC\" =~ /abc$/i" "abc$" t nil nil nil "AABC" nil 1 0 "ABC" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1259 "\"ABC\" =~ /^/i" "^" t nil nil nil "ABC" nil 1 0 "" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1260 "\"ABC\" =~ /$/i" "$" t nil nil nil "ABC" nil 1 0 "" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1261 "\"ABC\" =~ /a.c/i" "a.c" t nil nil nil "ABC" nil 1 0 "ABC" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1262 "\"AXC\" =~ /a.c/i" "a.c" t nil nil nil "AXC" nil 1 0 "AXC" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1263 "\"AXYZC\" =~ /a.*?c/i" "a.*?c" t nil nil nil "AXYZC" nil 1 0 "AXYZC" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1264 "\"AABC\" =~ /a.*c/i" "a.*c" t nil nil nil "AABC" nil 1 0 "AABC" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1265 "\"AXYZD\" =~ /a.*c/i" "a.*c" t nil nil nil "AXYZD" nil 1 0 nil nil)
-(1266 "\"ABD\" =~ /a[bc]d/i" "a[bc]d" t nil nil nil "ABD" nil 1 0 "ABD" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1267 "\"ACE\" =~ /a[b-d]e/i" "a[b-d]e" t nil nil nil "ACE" nil 1 0 "ACE" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1268 "\"ABC\" =~ /a[b-d]e/i" "a[b-d]e" t nil nil nil "ABC" nil 1 0 nil nil)
-(1269 "\"ABD\" =~ /a[b-d]e/i" "a[b-d]e" t nil nil nil "ABD" nil 1 0 nil nil)
-(1270 "\"AAC\" =~ /a[b-d]/i" "a[b-d]" t nil nil nil "AAC" nil 1 0 "AC" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1271 "\"A-\" =~ /a[-b]/i" "a[-b]" t nil nil nil "A-" nil 1 0 "A-" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1272 "\"A-\" =~ /a[b-]/i" "a[b-]" t nil nil nil "A-" nil 1 0 "A-" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1273 "\"A]\" =~ /a]/i" "a]" t nil nil nil "A]" nil 1 0 "A]" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1274 "\"A]B\" =~ /a[]]b/i" "a[]]b" t nil nil nil "A]B" nil 1 0 "A]B" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1275 "\"AED\" =~ /a[^bc]d/i" "a[^bc]d" t nil nil nil "AED" nil 1 0 "AED" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1276 "\"ADC\" =~ /a[^-b]c/i" "a[^-b]c" t nil nil nil "ADC" nil 1 0 "ADC" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1277 "\"ABD\" =~ /a[^-b]c/i" "a[^-b]c" t nil nil nil "ABD" nil 1 0 nil nil)
-(1278 "\"A-C\" =~ /a[^-b]c/i" "a[^-b]c" t nil nil nil "A-C" nil 1 0 nil nil)
-(1279 "\"ADC\" =~ /a[^]b]c/i" "a[^]b]c" t nil nil nil "ADC" nil 1 0 "ADC" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1280 "\"ABC\" =~ /ab|cd/i" "ab|cd" t nil nil nil "ABC" nil 1 0 "AB" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1281 "\"ABCD\" =~ /ab|cd/i" "ab|cd" t nil nil nil "ABCD" nil 1 0 "AB" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1282 "\"DEF\" =~ /()ef/i" "()ef" t nil nil nil "DEF" nil 1 0 "EF" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1283 "\"A]C\" =~ /$b/i" "$b" t nil nil nil "A]C" nil 1 0 nil nil)
-(1284 "\"B\" =~ /$b/i" "$b" t nil nil nil "B" nil 1 0 nil nil)
-(1285 "\"A(B\" =~ /a\\(b/i" "a\\(b" t nil nil nil "A(B" nil 1 0 "A(B" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1286 "\"AB\" =~ /a\\(*b/i" "a\\(*b" t nil nil nil "AB" nil 1 0 "AB" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1287 "\"A((B\" =~ /a\\(*b/i" "a\\(*b" t nil nil nil "A((B" nil 1 0 "A((B" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1288 "\"A\\B\" =~ /a\\\\b/i" "a\\\\b" t nil nil nil "AB" nil 1 0 nil nil)
-(1289 "\"ABC\" =~ /((a))/i" "((a))" t nil nil nil "ABC" nil 1 0 "A" ("A" "A" nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1290 "\"ABC\" =~ /(a)b(c)/i" "(a)b(c)" t nil nil nil "ABC" nil 1 0 "ABC" ("A" "C" nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1291 "\"AABBABC\" =~ /a+b+c/i" "a+b+c" t nil nil nil "AABBABC" nil 1 0 "ABC" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1292 "\"AABBABC\" =~ /a{1,}b{1,}c/i" "a{1,}b{1,}c" t nil nil nil "AABBABC" nil 1 0 "ABC" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1293 "\"ABCABC\" =~ /a.+?c/i" "a.+?c" t nil nil nil "ABCABC" nil 1 0 "ABC" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1294 "\"ABCABC\" =~ /a.*?c/i" "a.*?c" t nil nil nil "ABCABC" nil 1 0 "ABC" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1295 "\"ABCABC\" =~ /a.{0,5}?c/i" "a.{0,5}?c" t nil nil nil "ABCABC" nil 1 0 "ABC" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1296 "\"AB\" =~ /(a+|b)*/i" "(a+|b)*" t nil nil nil "AB" nil 1 0 "AB" ("B" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1297 "\"AB\" =~ /(a+|b){0,}/i" "(a+|b){0,}" t nil nil nil "AB" nil 1 0 "AB" ("B" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1298 "\"AB\" =~ /(a+|b)+/i" "(a+|b)+" t nil nil nil "AB" nil 1 0 "AB" ("B" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1299 "\"AB\" =~ /(a+|b){1,}/i" "(a+|b){1,}" t nil nil nil "AB" nil 1 0 "AB" ("B" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1300 "\"AB\" =~ /(a+|b)?/i" "(a+|b)?" t nil nil nil "AB" nil 1 0 "A" ("A" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1301 "\"AB\" =~ /(a+|b){0,1}/i" "(a+|b){0,1}" t nil nil nil "AB" nil 1 0 "A" ("A" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1302 "\"AB\" =~ /(a+|b){0,1}?/i" "(a+|b){0,1}?" t nil nil nil "AB" nil 1 0 "" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1303 "\"CDE\" =~ /[^ab]*/i" "[^ab]*" t nil nil nil "CDE" nil 1 0 "CDE" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1304 "\"ABBBCD\" =~
-/([abc])*d/i" "([abc])*d" t nil nil nil "ABBBCD" nil 1 0 "ABBBCD" ("C" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1305 "\"ABCD\" =~ /([abc])*bcd/i" "([abc])*bcd" t nil nil nil "ABCD" nil 1 0 "ABCD" ("A" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1306 "\"E\" =~ /a|b|c|d|e/i" "a|b|c|d|e" t nil nil nil "E" nil 1 0 "E" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1307 "\"EF\" =~ /(a|b|c|d|e)f/i" "(a|b|c|d|e)f" t nil nil nil "EF" nil 1 0 "EF" ("E" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1308 "\"ABCDEFG\" =~ /abcd*efg/i" "abcd*efg" t nil nil nil "ABCDEFG" nil 1 0 "ABCDEFG" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1309 "\"XABYABBBZ\" =~ /ab*/i" "ab*" t nil nil nil "XABYABBBZ" nil 1 0 "AB" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1310 "\"XAYABBBZ\" =~ /ab*/i" "ab*" t nil nil nil "XAYABBBZ" nil 1 0 "A" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1311 "\"ABCDE\" =~ /(ab|cd)e/i" "(ab|cd)e" t nil nil nil "ABCDE" nil 1 0 "CDE" ("CD" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1312 "\"HIJ\" =~ /[abhgefdc]ij/i" "[abhgefdc]ij" t nil nil nil "HIJ" nil 1 0 "HIJ" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1313 "\"ABCDE\" =~ /^(ab|cd)e/i" "^(ab|cd)e" t nil nil nil "ABCDE" nil 1 0 nil nil)
-(1314 "\"ABCDEF\" =~ /(abc|)ef/i" "(abc|)ef" t nil nil nil "ABCDEF" nil 1 0 "EF" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1315 "\"ABCD\" =~ /(a|b)c*d/i" "(a|b)c*d" t nil nil nil "ABCD" nil 1 0 "BCD" ("B" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1316 "\"ABC\" =~ /(ab|ab*)bc/i" "(ab|ab*)bc" t nil nil nil "ABC" nil 1 0 "ABC" ("A" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1317 "\"ABC\" =~ /a([bc]*)c*/i" "a([bc]*)c*" t nil nil nil "ABC" nil 1 0 "ABC" ("BC" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1318 "\"ABCD\" =~ /a([bc]*)(c*d)/i" "a([bc]*)(c*d)" t nil nil nil "ABCD" nil 1 0 "ABCD" ("BC" "D" nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1319 "\"ABCD\" =~ /a([bc]+)(c*d)/i" "a([bc]+)(c*d)" t nil nil nil "ABCD" nil 1 0 "ABCD" ("BC" "D" nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1320 "\"ABCD\" =~ /a([bc]*)(c+d)/i" "a([bc]*)(c+d)" t nil nil nil "ABCD" nil 1 0 "ABCD" ("B" "CD" nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1321 "\"ADCDCDE\" =~ /a[bcd]*dcdcde/i" "a[bcd]*dcdcde" t nil nil nil "ADCDCDE" nil 1 0 "ADCDCDE" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1322 "\"ABC\" =~ /(ab|a)b*c/i" "(ab|a)b*c" t nil nil nil "ABC" nil 1 0 "ABC" ("AB" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1323 "\"ABCD\" =~ /((a)(b)c)(d)/i" "((a)(b)c)(d)" t nil nil nil "ABCD" nil 1 0 "ABCD" ("ABC" "A" "B" "D" nil nil nil nil nil nil nil nil nil nil nil nil))
-(1324 "\"ALPHA\" =~ /[a-zA-Z_][a-zA-Z0-9_]*/i" "[a-zA-Z_][a-zA-Z0-9_]*" t nil nil nil "ALPHA" nil 1 0 "ALPHA" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1325 "\"ABH\" =~ /^a(bc+|b[eh])g|.h$/i" "^a(bc+|b[eh])g|.h$" t nil nil nil "ABH" nil 1 0 "BH" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1326 "\"EFFGZ\" =~ /(bc+d$|ef*g.|h?i(j|k))/i" "(bc+d$|ef*g.|h?i(j|k))" t nil nil nil "EFFGZ" nil 1 0 "EFFGZ" ("EFFGZ" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1327 "\"IJ\" =~ /(bc+d$|ef*g.|h?i(j|k))/i" "(bc+d$|ef*g.|h?i(j|k))" t nil nil nil "IJ" nil 1 0 "IJ" ("IJ" "J" nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1328 "\"REFFGZ\" =~ /(bc+d$|ef*g.|h?i(j|k))/i" "(bc+d$|ef*g.|h?i(j|k))" t nil nil nil "REFFGZ" nil 1 0 "EFFGZ" ("EFFGZ" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1329 "\"ADCDCDE\" =~ /(bc+d$|ef*g.|h?i(j|k))/i" "(bc+d$|ef*g.|h?i(j|k))" t nil nil nil "ADCDCDE" nil 1 0 nil nil)
-(1330 "\"EFFG\" =~ /(bc+d$|ef*g.|h?i(j|k))/i" "(bc+d$|ef*g.|h?i(j|k))" t nil nil nil "EFFG" nil 1 0 nil nil)
-(1331 "\"BCDD\" =~ /(bc+d$|ef*g.|h?i(j|k))/i" "(bc+d$|ef*g.|h?i(j|k))" t nil nil nil "BCDD" nil 1 0 nil nil)
-(1332 "\"A\" =~ /((((((((((a))))))))))/i" "((((((((((a))))))))))" t nil nil nil "A" nil 1 0 "A" ("A" "A" "A" "A" "A" "A" "A" "A" "A" "A" nil nil nil nil nil nil))
-(1333 "\"AA\" =~ /((((((((((a))))))))))\\10/i" "((((((((((a))))))))))\\10" t nil nil nil "AA" nil 1 0 "AA" ("A" "A" "A" "A" "A" "A" "A" "A" "A" "A" nil nil nil nil nil nil))
-(1334 "\"A\" =~ /(((((((((a)))))))))/i" "(((((((((a)))))))))" t nil nil nil "A" nil 1 0 "A" ("A" "A" "A" "A" "A" "A" "A" "A" "A" nil nil nil nil nil nil nil))
-(1335 "\"A\" =~ /(?:(?:(?:(?:(?:(?:(?:(?:(?:(a))))))))))/i" "(?:(?:(?:(?:(?:(?:(?:(?:(?:(a))))))))))" t nil nil nil "A" nil 1 0 "A" ("A" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1336 "\"C\" =~ /(?:(?:(?:(?:(?:(?:(?:(?:(?:(a|b|c))))))))))/i" "(?:(?:(?:(?:(?:(?:(?:(?:(?:(a|b|c))))))))))" t nil nil nil "C" nil 1 0 "C" ("C" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1337 "\"AA\" =~ /multiple words of text/i" "multiple words of text" t nil nil nil "AA" nil 1 0 nil nil)
-(1338 "\"UH-UH\" =~ /multiple words of text/i" "multiple words of text" t nil nil nil "UH-UH" nil 1 0 nil nil)
-(1339 "\"MULTIPLE WORDS, YEAH\" =~ /multiple words/i" "multiple words" t nil nil nil "MULTIPLE WORDS, YEAH" nil 1 0 "MULTIPLE WORDS" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1340 "\"ABCDE\" =~ /(.*)c(.*)/i" "(.*)c(.*)" t nil nil nil "ABCDE" nil 1 0 "ABCDE" ("AB" "DE" nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1341 "\"(A, B)\" =~ /\\((.*), (.*)\\)/i" "\\((.*), (.*)\\)" t nil nil nil "(A, B)" nil 1 0 "(A, B)" ("A" "B" nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1342 "\"ABCD\" =~ /abcd/i" "abcd" t nil nil nil "ABCD" nil 1 0 "ABCD" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1343 "\"ABCD\" =~ /a(bc)d/i" "a(bc)d" t nil nil nil "ABCD" nil 1 0 "ABCD" ("BC" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1344 "\"AC\" =~ /a[-]?c/i" "a[-]?c" t nil nil nil "AC" nil 1 0 "AC" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1345 "\"ABCABC\" =~ /(abc)\\1/i" "(abc)\\1" t nil nil nil "ABCABC" nil 1 0 "ABCABC" ("ABC" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1346 "\"ABCABC\" =~ /([a-c]*)\\1/i" "([a-c]*)\\1" t nil nil nil "ABCABC" nil 1 0 "ABCABC" ("ABC" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1347 "\"abad\" =~ /a(?!b)./" "a(?!b)." nil nil nil nil "abad" nil 1 0 "ad" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1348 "\"abad\" =~ /a(?=d)./" "a(?=d)." nil nil nil nil "abad" nil 1 0 "ad" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1349 "\"abad\" =~ /a(?=c|d)./" "a(?=c|d)." nil nil nil nil "abad" nil 1 0 "ad" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1350 "\"ace\" =~ /a(?:b|c|d)(.)/" "a(?:b|c|d)(.)" nil nil nil nil "ace" nil 1 0 "ace" ("e" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1351 "\"ace\" =~ /a(?:b|c|d)*(.)/" "a(?:b|c|d)*(.)" nil nil nil nil "ace" nil 1 0 "ace" ("e" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1352 "\"ace\" =~ /a(?:b|c|d)+?(.)/" "a(?:b|c|d)+?(.)" nil nil nil nil "ace" nil 1 0 "ace" ("e" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1353 "\"acdbcdbe\" =~ /a(?:b|c|d)+?(.)/" "a(?:b|c|d)+?(.)" nil nil nil nil "acdbcdbe" nil 1 0 "acd" ("d" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1354 "\"acdbcdbe\" =~ /a(?:b|c|d)+(.)/" "a(?:b|c|d)+(.)" nil nil nil nil "acdbcdbe" nil 1 0 "acdbcdbe" ("e" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1355 "\"acdbcdbe\" =~ /a(?:b|c|d){2}(.)/" "a(?:b|c|d){2}(.)" nil nil nil nil "acdbcdbe" nil 1 0 "acdb" ("b" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1356 "\"acdbcdbe\" =~ /a(?:b|c|d){4,5}(.)/" "a(?:b|c|d){4,5}(.)" nil nil nil nil "acdbcdbe" nil 1 0 "acdbcdb" ("b" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1357 "\"acdbcdbe\" =~ /a(?:b|c|d){4,5}?(.)/" "a(?:b|c|d){4,5}?(.)" nil nil nil nil "acdbcdbe" nil 1 0 "acdbcd" ("d" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1358 "\"foobar\" =~ /((foo)|(bar))*/" "((foo)|(bar))*" nil nil nil nil "foobar" nil 1 0 "foobar" ("bar" "foo" "bar" nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1359 "\"acdbcdbe\" =~ /a(?:b|c|d){6,7}(.)/" "a(?:b|c|d){6,7}(.)" nil nil nil nil "acdbcdbe" nil 1 0 "acdbcdbe" ("e" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1360 "\"acdbcdbe\" =~ /a(?:b|c|d){6,7}?(.)/" "a(?:b|c|d){6,7}?(.)" nil nil nil nil "acdbcdbe" nil 1 0 "acdbcdbe" ("e" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1361 "\"acdbcdbe\" =~ /a(?:b|c|d){5,6}(.)/" "a(?:b|c|d){5,6}(.)" nil nil nil nil "acdbcdbe" nil 1 0 "acdbcdbe" ("e" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1362 "\"acdbcdbe\" =~ /a(?:b|c|d){5,6}?(.)/" "a(?:b|c|d){5,6}?(.)" nil nil nil nil "acdbcdbe" nil 1 0 "acdbcdb" ("b" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1363 "\"acdbcdbe\" =~ /a(?:b|c|d){5,7}(.)/" "a(?:b|c|d){5,7}(.)" nil nil nil nil "acdbcdbe" nil 1 0 "acdbcdbe" ("e" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1364 "\"acdbcdbe\" =~ /a(?:b|c|d){5,7}?(.)/" "a(?:b|c|d){5,7}?(.)" nil nil nil nil "acdbcdbe" nil 1 0 "acdbcdb" ("b" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1365 "\"ace\" =~ /a(?:b|(c|e){1,2}?|d)+?(.)/" "a(?:b|(c|e){1,2}?|d)+?(.)" nil nil nil nil "ace" nil 1 0 "ace" ("c" "e" nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1366 "\"AB\" =~ /^(.+)?B/" "^(.+)?B" nil nil nil nil "AB" nil 1 0 "AB" ("A" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1367 "\".\" =~ /^([^a-z])|(\\^)$/" "^([^a-z])|(\\^)$" nil nil nil nil "." nil 1 0 "." ("." nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1368 "\"<&OUT\" =~ /^[<>]&/" "^[<>]&" nil nil nil nil "<&OUT" nil 1 0 "<&" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1369 "\"aaaaaaaaaa\" =~ /^(a\\1?){4}$/" "^(a\\1?){4}$" nil nil nil nil "aaaaaaaaaa" nil 1 0 "aaaaaaaaaa" ("aaaa" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1370 "\"AB\" =~ /^(a\\1?){4}$/" "^(a\\1?){4}$" nil nil nil nil "AB" nil 1 0 nil nil)
-(1371 "\"aaaaaaaaa\" =~ /^(a\\1?){4}$/" "^(a\\1?){4}$" nil nil nil nil "aaaaaaaaa" nil 1 0 nil nil)
-(1372 "\"aaaaaaaaaaa\" =~ /^(a\\1?){4}$/" "^(a\\1?){4}$" nil nil nil nil "aaaaaaaaaaa" nil 1 0 nil nil)
-(1373 "\"aaaaaaaaaa\" =~ /^(a(?(1)\\1)){4}$/" "^(a(?(1)\\1)){4}$" nil nil nil nil "aaaaaaaaaa" nil 1 0 "aaaaaaaaaa" ("aaaa" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1374 "\"aaaaaaaaa\" =~ /^(a(?(1)\\1)){4}$/" "^(a(?(1)\\1)){4}$" nil nil nil nil "aaaaaaaaa" nil 1 0 nil nil)
-(1375 "\"aaaaaaaaaaa\" =~ /^(a(?(1)\\1)){4}$/" "^(a(?(1)\\1)){4}$" nil nil nil nil "aaaaaaaaaaa" nil 1 0 nil nil)
-(1376 "\"foobar\" =~ /(?:(f)(o)(o)|(b)(a)(r))*/" "(?:(f)(o)(o)|(b)(a)(r))*" nil nil nil nil "foobar" nil 1 0 "foobar" ("f" "o" "o" "b" "a" "r" nil nil nil nil nil nil nil nil nil nil))
-(1377 "\"ab\" =~ /(?<=a)b/" "(?<=a)b" nil nil nil nil "ab" nil 1 0 "b" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1378 "\"cb\" =~ /(?<=a)b/" "(?<=a)b" nil nil nil nil "cb" nil 1 0 nil nil)
-(1379 "\"b\" =~ /(?<=a)b/" "(?<=a)b" nil nil nil nil "b" nil 1 0 nil nil)
-(1380 "\"ab\" =~ /(?<!c)b/" "(?<!c)b" nil nil nil nil "ab" nil 1 0 "b" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1381 "\"b\" =~ /(?<!c)b/" "(?<!c)b" nil nil nil nil "b" nil 1 0 "b" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1382 "\"b\" =~ /(?<!c)b/" "(?<!c)b" nil nil nil nil "b" nil 1 0 "b" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1383 "\"aba\" =~ /(?:..)*a/" "(?:..)*a" nil nil nil nil "aba" nil 1 0 "aba" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1384 "\"aba\" =~ /(?:..)*?a/" "(?:..)*?a" nil nil nil nil "aba" nil 1 0 "a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1385 "\"abc\" =~ /^(?:b|a(?=(.)))*\\1/" "^(?:b|a(?=(.)))*\\1" nil nil nil nil "abc" nil 1 0 "ab" ("b" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1386 "\"abc\" =~ /^(){3,5}/" "^(){3,5}" nil nil nil nil "abc" nil 1 0 "" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1387 "\"aax\" =~ /^(a+)*ax/" "^(a+)*ax" nil nil nil nil "aax" nil 1 0 "aax" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1388 "\"aax\" =~ /^((a|b)+)*ax/" "^((a|b)+)*ax" nil nil nil nil "aax" nil 1 0 "aax" ("a" "a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1389 "\"aax\" =~ /^((a|bc)+)*ax/" "^((a|bc)+)*ax" nil nil nil nil "aax" nil 1 0 "aax" ("a" "a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1390 "\"cab\" =~ /(a|x)*ab/" "(a|x)*ab" nil nil nil nil "cab" nil 1 0 "ab" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1391 "\"cab\" =~ /(a)*ab/" "(a)*ab" nil nil nil nil "cab" nil 1 0 "ab" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1392 "\"ab\" =~ /(?:(?i)a)b/" "(?:(?i)a)b" nil nil nil nil "ab" nil 1 0 "ab" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1393 "\"ab\" =~ /((?i)a)b/" "((?i)a)b" nil nil nil nil "ab" nil 1 0 "ab" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1394 "\"Ab\" =~ /(?:(?i)a)b/" "(?:(?i)a)b" nil nil nil nil "Ab" nil 1 0 "Ab" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1395 "\"Ab\" =~ /((?i)a)b/" "((?i)a)b" nil nil nil nil "Ab" nil 1 0 "Ab" ("A" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1396 "\"cb\" =~ /(?:(?i)a)b/" "(?:(?i)a)b" nil nil nil nil "cb" nil 1 0 nil nil)
-(1397 "\"aB\" =~ /(?:(?i)a)b/" "(?:(?i)a)b" nil nil nil nil "aB" nil 1 0 nil nil)
-(1398 "\"ab\" =~ /(?i:a)b/" "(?i:a)b" nil nil nil nil "ab" nil 1 0 "ab" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1399 "\"ab\" =~ /((?i:a))b/" "((?i:a))b" nil nil nil nil "ab" nil 1 0 "ab" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1400 "\"Ab\" =~ /(?i:a)b/" "(?i:a)b" nil nil nil nil "Ab" nil 1 0 "Ab" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1401 "\"Ab\" =~ /((?i:a))b/" "((?i:a))b" nil nil nil nil "Ab" nil 1 0 "Ab" ("A" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1402 "\"aB\" =~ /(?i:a)b/" "(?i:a)b" nil nil nil nil "aB" nil 1 0 nil nil)
-(1403 "\"aB\" =~ /(?i:a)b/" "(?i:a)b" nil nil nil nil "aB" nil 1 0 nil nil)
-(1404 "\"ab\" =~ /(?:(?-i)a)b/i" "(?:(?-i)a)b" t nil nil nil "ab" nil 1 0 "ab" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1405 "\"ab\" =~ /((?-i)a)b/i" "((?-i)a)b" t nil nil nil "ab" nil 1 0 "ab" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1406 "\"aB\" =~ /(?:(?-i)a)b/i" "(?:(?-i)a)b" t nil nil nil "aB" nil 1 0 "aB" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1407 "\"aB\" =~ /((?-i)a)b/i" "((?-i)a)b" t nil nil nil "aB" nil 1 0 "aB" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1408 "\"aB\" =~ /(?:(?-i)a)b/i" "(?:(?-i)a)b" t nil nil nil "aB" nil 1 0 "aB" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1409 "\"Ab\" =~ /(?:(?-i)a)b/i" "(?:(?-i)a)b" t nil nil nil "Ab" nil 1 0 nil nil)
-(1410 "\"aB\" =~ /(?:(?-i)a)b/i" "(?:(?-i)a)b" t nil nil nil "aB" nil 1 0 "aB" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1411 "\"aB\" =~ /((?-i)a)b/i" "((?-i)a)b" t nil nil nil "aB" nil 1 0 "aB" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1412 "\"Ab\" =~ /(?:(?-i)a)b/i" "(?:(?-i)a)b" t nil nil nil "Ab" nil 1 0 nil nil)
-(1413 "\"AB\" =~ /(?:(?-i)a)b/i" "(?:(?-i)a)b" t nil nil nil "AB" nil 1 0 nil nil)
-(1414 "\"ab\" =~ /(?-i:a)b/i" "(?-i:a)b" t nil nil nil "ab" nil 1 0 "ab" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1415 "\"ab\" =~ /((?-i:a))b/i" "((?-i:a))b" t nil nil nil "ab" nil 1 0 "ab" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1416 "\"aB\" =~ /(?-i:a)b/i" "(?-i:a)b" t nil nil nil "aB" nil 1 0 "aB" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1417 "\"aB\" =~ /((?-i:a))b/i" "((?-i:a))b" t nil nil nil "aB" nil 1 0 "aB" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1418 "\"AB\" =~ /(?-i:a)b/i" "(?-i:a)b" t nil nil nil "AB" nil 1 0 nil nil)
-(1419 "\"Ab\" =~ /(?-i:a)b/i" "(?-i:a)b" t nil nil nil "Ab" nil 1 0 nil nil)
-(1420 "\"aB\" =~ /(?-i:a)b/i" "(?-i:a)b" t nil nil nil "aB" nil 1 0 "aB" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1421 "\"aB\" =~ /((?-i:a))b/i" "((?-i:a))b" t nil nil nil "aB" nil 1 0 "aB" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1422 "\"Ab\" =~ /(?-i:a)b/i" "(?-i:a)b" t nil nil nil "Ab" nil 1 0 nil nil)
-(1423 "\"AB\" =~ /(?-i:a)b/i" "(?-i:a)b" t nil nil nil "AB" nil 1 0 nil nil)
-(1424 "\"AB\" =~ /((?-i:a.))b/i" "((?-i:a.))b" t nil nil nil "AB" nil 1 0 nil nil)
-(1425 "\"a\\nB\" =~ /((?-i:a.))b/i" "((?-i:a.))b" t nil nil nil "a
-B" nil 1 0 nil nil)
-(1426 "\"a\\nB\" =~ /((?s-i:a.))b/i" "((?s-i:a.))b" t nil nil nil "a
-B" nil 1 0 "a
-B" ("a
-" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1427 "\"cabbbb\" =~ /(?:c|d)(?:)(?:a(?:)(?:b)(?:b(?:))(?:b(?:)(?:b)))/" "(?:c|d)(?:)(?:a(?:)(?:b)(?:b(?:))(?:b(?:)(?:b)))" nil nil nil nil "cabbbb" nil 1 0 "cabbbb" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1428 "\"caaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\" =~ /(?:c|d)(?:)(?:aaaaaaaa(?:)(?:bbbbbbbb)(?:bbbbbbbb(?:))(?:bbbbbbbb(?:)(?:bbbbbbbb)))/" "(?:c|d)(?:)(?:aaaaaaaa(?:)(?:bbbbbbbb)(?:bbbbbbbb(?:))(?:bbbbbbbb(?:)(?:bbbbbbbb)))" nil nil nil nil "caaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" nil 1 0 "caaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1429 "\"Ab4ab\" =~ /(ab)\\d\\1/i" "(ab)\\d\\1" t nil nil nil "Ab4ab" nil 1 0 "Ab4ab" ("Ab" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1430 "\"ab4Ab\" =~ /(ab)\\d\\1/i" "(ab)\\d\\1" t nil nil nil "ab4Ab" nil 1 0 "ab4Ab" ("ab" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1431 "\"foobar1234baz\" =~ /foo\\w*\\d{4}baz/" "foo\\w*\\d{4}baz" nil nil nil nil "foobar1234baz" nil 1 0 "foobar1234baz" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1432 "\"x~~\" =~ /x(~~)*(?:(?:F)?)?/" "x(~~)*(?:(?:F)?)?" nil nil nil nil "x~~" nil 1 0 "x~~" ("~~" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1433 "\"aaac\" =~ /^a(?#xxx){3}c/" "^a(?#xxx){3}c" nil nil nil nil "aaac" nil 1 0 "aaac" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1434 "\"aaac\" =~ /^a(?#xxx)(?#xxx){3}c/" "^a(?#xxx)(?#xxx){3}c" nil nil nil nil "aaac" nil 1 0 "aaac" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1435 "\"aaac\" =~ /^a (?#xxx) (?#yyy) {3}c/x" "^a (?#xxx) (?#yyy) {3}c" nil nil nil t "aaac" nil 1 0 "aaac" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1436 "\"B\\nB\" =~ /(?<![cd])b/" "(?<![cd])b" nil nil nil nil "B
-B" nil 1 0 nil nil)
-(1437 "\"dbcb\" =~ /(?<![cd])b/" "(?<![cd])b" nil nil nil nil "dbcb" nil 1 0 nil nil)
-(1438 "\"dbaacb\" =~ /(?<![cd])[ab]/" "(?<![cd])[ab]" nil nil nil nil "dbaacb" nil 1 0 "a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1439 "\"dbaacb\" =~ /(?<!(c|d))[ab]/" "(?<!(c|d))[ab]" nil nil nil nil "dbaacb" nil 1 0 "a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1440 "\"cdaccb\" =~ /(?<!cd)[ab]/" "(?<!cd)[ab]" nil nil nil nil "cdaccb" nil 1 0 "b" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1441 "\"dbcb\" =~ /^(?:a?b?)*$/" "^(?:a?b?)*$" nil nil nil nil "dbcb" nil 1 0 nil nil)
-(1442 "\"a--\" =~ /^(?:a?b?)*$/" "^(?:a?b?)*$" nil nil nil nil "a--" nil 1 0 nil nil)
-(1443 "\"a\\nb\\nc\\n\" =~ /((?s)^a(.))((?m)^b$)/" "((?s)^a(.))((?m)^b$)" nil nil nil nil "a
-b
-c
-" nil 1 0 "a
-b" ("a
-" "
-" "b" nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1444 "\"a\\nb\\nc\\n\" =~ /((?m)^b$)/" "((?m)^b$)" nil nil nil nil "a
-b
-c
-" nil 1 0 "b" ("b" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1445 "\"a\\nb\\n\" =~ /(?m)^b/" "(?m)^b" nil nil nil nil "a
-b
-" nil 1 0 "b" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1446 "\"a\\nb\\n\" =~ /(?m)^(b)/" "(?m)^(b)" nil nil nil nil "a
-b
-" nil 1 0 "b" ("b" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1447 "\"a\\nb\\n\" =~ /((?m)^b)/" "((?m)^b)" nil nil nil nil "a
-b
-" nil 1 0 "b" ("b" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1448 "\"a\\nb\\n\" =~ /\\n((?m)^b)/" "\\n((?m)^b)" nil nil nil nil "a
-b
-" nil 1 0 "
-b" ("b" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1449 "\"a\\nb\\nc\\n\" =~ /((?s).)c(?!.)/" "((?s).)c(?!.)" nil nil nil nil "a
-b
-c
-" nil 1 0 "
-c" ("
-" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1450 "\"a\\nb\\nc\\n\" =~ /((?s).)c(?!.)/" "((?s).)c(?!.)" nil nil nil nil "a
-b
-c
-" nil 1 0 "
-c" ("
-" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1451 "\"a\\nb\\nc\\n\" =~ /((?s)b.)c(?!.)/" "((?s)b.)c(?!.)" nil nil nil nil "a
-b
-c
-" nil 1 0 "b
-c" ("b
-" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1452 "\"a\\nb\\nc\\n\" =~ /((?s)b.)c(?!.)/" "((?s)b.)c(?!.)" nil nil nil nil "a
-b
-c
-" nil 1 0 "b
-c" ("b
-" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1453 "\"a\\nb\\nc\\n\" =~ /()^b/" "()^b" nil nil nil nil "a
-b
-c
-" nil 1 0 nil nil)
-(1454 "\"a\\nb\\nc\\n\" =~ /()^b/" "()^b" nil nil nil nil "a
-b
-c
-" nil 1 0 nil nil)
-(1455 "\"a\\nb\\nc\\n\" =~ /((?m)^b)/" "((?m)^b)" nil nil nil nil "a
-b
-c
-" nil 1 0 "b" ("b" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1456 "\"a\" =~ /(?(1)b|a)/" "(?(1)b|a)" nil nil nil nil "a" nil 1 0 "a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1457 "\"a\" =~ /(x)?(?(1)a|b)/" "(x)?(?(1)a|b)" nil nil nil nil "a" nil 1 0 nil nil)
-(1458 "\"a\" =~ /(x)?(?(1)a|b)/" "(x)?(?(1)a|b)" nil nil nil nil "a" nil 1 0 nil nil)
-(1459 "\"a\" =~ /(x)?(?(1)b|a)/" "(x)?(?(1)b|a)" nil nil nil nil "a" nil 1 0 "a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1460 "\"a\" =~ /()?(?(1)b|a)/" "()?(?(1)b|a)" nil nil nil nil "a" nil 1 0 "a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1461 "\"a\" =~ /()?(?(1)a|b)/" "()?(?(1)a|b)" nil nil nil nil "a" nil 1 0 "a" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1462 "\"(blah)\" =~ /^(\\()?blah(?(1)(\\)))$/" "^(\\()?blah(?(1)(\\)))$" nil nil nil nil "(blah)" nil 1 0 "(blah)" ("(" ")" nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1463 "\"blah\" =~ /^(\\()?blah(?(1)(\\)))$/" "^(\\()?blah(?(1)(\\)))$" nil nil nil nil "blah" nil 1 0 "blah" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1464 "\"a\" =~ /^(\\()?blah(?(1)(\\)))$/" "^(\\()?blah(?(1)(\\)))$" nil nil nil nil "a" nil 1 0 nil nil)
-(1465 "\"blah)\" =~ /^(\\()?blah(?(1)(\\)))$/" "^(\\()?blah(?(1)(\\)))$" nil nil nil nil "blah)" nil 1 0 nil nil)
-(1466 "\"(blah\" =~ /^(\\()?blah(?(1)(\\)))$/" "^(\\()?blah(?(1)(\\)))$" nil nil nil nil "(blah" nil 1 0 nil nil)
-(1467 "\"(blah)\" =~ /^(\\(+)?blah(?(1)(\\)))$/" "^(\\(+)?blah(?(1)(\\)))$" nil nil nil nil "(blah)" nil 1 0 "(blah)" ("(" ")" nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1468 "\"blah\" =~ /^(\\(+)?blah(?(1)(\\)))$/" "^(\\(+)?blah(?(1)(\\)))$" nil nil nil nil "blah" nil 1 0 "blah" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1469 "\"blah)\" =~ /^(\\(+)?blah(?(1)(\\)))$/" "^(\\(+)?blah(?(1)(\\)))$" nil nil nil nil "blah)" nil 1 0 nil nil)
-(1470 "\"(blah\" =~ /^(\\(+)?blah(?(1)(\\)))$/" "^(\\(+)?blah(?(1)(\\)))$" nil nil nil nil "(blah" nil 1 0 nil nil)
-(1471 "\"a\" =~ /(?(?!a)b|a)/" "(?(?!a)b|a)" nil nil nil nil "a" nil 1 0 "a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1472 "\"a\" =~ /(?(?=a)b|a)/" "(?(?=a)b|a)" nil nil nil nil "a" nil 1 0 nil nil)
-(1473 "\"a\" =~ /(?(?=a)b|a)/" "(?(?=a)b|a)" nil nil nil nil "a" nil 1 0 nil nil)
-(1474 "\"a\" =~ /(?(?=a)a|b)/" "(?(?=a)a|b)" nil nil nil nil "a" nil 1 0 "a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1475 "\"aaab\" =~ /(?=(a+?))(\\1ab)/" "(?=(a+?))(\\1ab)" nil nil nil nil "aaab" nil 1 0 "aab" ("a" "aab" nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1476 "\"one:\" =~ /(\\w+:)+/" "(\\w+:)+" nil nil nil nil "one:" nil 1 0 "one:" ("one:" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1477 "\"a\" =~ /$(?<=^(a))/" "$(?<=^(a))" nil nil nil nil "a" nil 1 0 "" ("a" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1478 "\"aaab\" =~ /(?=(a+?))(\\1ab)/" "(?=(a+?))(\\1ab)" nil nil nil nil "aaab" nil 1 0 "aab" ("a" "aab" nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1479 "\"aaab\" =~ /^(?=(a+?))\\1ab/" "^(?=(a+?))\\1ab" nil nil nil nil "aaab" nil 1 0 nil nil)
-(1480 "\"aaab\" =~ /^(?=(a+?))\\1ab/" "^(?=(a+?))\\1ab" nil nil nil nil "aaab" nil 1 0 nil nil)
-(1481 "\"abcd\" =~ /([\\w:]+::)?(\\w+)$/" "([\\w:]+::)?(\\w+)$" nil nil nil nil "abcd" nil 1 0 "abcd" (nil "abcd" nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1482 "\"xy:z:::abcd\" =~ /([\\w:]+::)?(\\w+)$/" "([\\w:]+::)?(\\w+)$" nil nil nil nil "xy:z:::abcd" nil 1 0 "xy:z:::abcd" ("xy:z:::" "abcd" nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1483 "\"aexycd\" =~ /^[^bcd]*(c+)/" "^[^bcd]*(c+)" nil nil nil nil "aexycd" nil 1 0 "aexyc" ("c" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1484 "\"caab\" =~ /(a*)b+/" "(a*)b+" nil nil nil nil "caab" nil 1 0 "aab" ("aa" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1485 "\"abcd\" =~ /([\\w:]+::)?(\\w+)$/" "([\\w:]+::)?(\\w+)$" nil nil nil nil "abcd" nil 1 0 "abcd" (nil "abcd" nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1486 "\"xy:z:::abcd\" =~ /([\\w:]+::)?(\\w+)$/" "([\\w:]+::)?(\\w+)$" nil nil nil nil "xy:z:::abcd" nil 1 0 "xy:z:::abcd" ("xy:z:::" "abcd" nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1487 "\"abcd:\" =~ /([\\w:]+::)?(\\w+)$/" "([\\w:]+::)?(\\w+)$" nil nil nil nil "abcd:" nil 1 0 nil nil)
-(1488 "\"abcd:\" =~ /([\\w:]+::)?(\\w+)$/" "([\\w:]+::)?(\\w+)$" nil nil nil nil "abcd:" nil 1 0 nil nil)
-(1489 "\"aexycd\" =~ /^[^bcd]*(c+)/" "^[^bcd]*(c+)" nil nil nil nil "aexycd" nil 1 0 "aexyc" ("c" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1490 "\"aaab\" =~ /(?>a+)b/" "(?>a+)b" nil nil nil nil "aaab" nil 1 0 "aaab" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1491 "\"a:[b]:\" =~ /([[:]+)/" "([[:]+)" nil nil nil nil "a:[b]:" nil 1 0 ":[" (":[" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1492 "\"a=[b]=\" =~ /([[=]+)/" "([[=]+)" nil nil nil nil "a=[b]=" nil 1 0 "=[" ("=[" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1493 "\"a.[b].\" =~ /([[.]+)/" "([[.]+)" nil nil nil nil "a.[b]." nil 1 0 ".[" (".[" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1494 "\"aaab\" =~ /((?>a+)b)/" "((?>a+)b)" nil nil nil nil "aaab" nil 1 0 "aaab" ("aaab" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1495 "\"aaab\" =~ /(?>(a+))b/" "(?>(a+))b" nil nil nil nil "aaab" nil 1 0 "aaab" ("aaa" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1496 "\"((abc(ade)ufh()()x\" =~ /((?>[^()]+)|\\([^()]*\\))+/" "((?>[^()]+)|\\([^()]*\\))+" nil nil nil nil "((abc(ade)ufh()()x" nil 1 0 "abc(ade)ufh()()x" ("x" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1497 "\"aaab\" =~ /a\\Z/" "a\\Z" nil nil nil nil "aaab" nil 1 0 nil nil)
-(1498 "\"a\\nb\\n\" =~ /a\\Z/" "a\\Z" nil nil nil nil "a
-b
-" nil 1 0 nil nil)
-(1499 "\"a\\nb\\n\" =~ /b\\Z/" "b\\Z" nil nil nil nil "a
-b
-" nil 1 0 "b" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1500 "\"a\\nb\" =~ /b\\Z/" "b\\Z" nil nil nil nil "a
-b" nil 1 0 "b" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1501 "\"a\\nb\" =~ /b\\z/" "b\\z" nil nil nil nil "a
-b" nil 1 0 "b" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1502 "\"a\" =~ /^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$/" "^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$" nil nil nil nil "a" nil 1 0 "a" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1503 "\"abc\" =~ /^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$/" "^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$" nil nil nil nil "abc" nil 1 0 "abc" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1504 "\"a-b\" =~ /^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$/" "^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$" nil nil nil nil "a-b" nil 1 0 "a-b" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1505 "\"0-9\" =~ /^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$/" "^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$" nil nil nil nil "0-9" nil 1 0 "0-9" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1506 "\"a.b\" =~ /^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$/" "^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$" nil nil nil nil "a.b" nil 1 0 "a.b" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1507 "\"5.6.7\" =~ /^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$/" "^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$" nil nil nil nil "5.6.7" nil 1 0 "5.6.7" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1508 "\"the.quick.brown.fox\" =~ /^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$/" "^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$" nil nil nil nil "the.quick.brown.fox" nil 1 0 "the.quick.brown.fox" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1509 "\"a100.b200.300c\" =~ /^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$/" "^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$" nil nil nil nil "a100.b200.300c" nil 1 0 "a100.b200.300c" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1510 "\"12-ab.1245\" =~ /^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$/" "^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$" nil nil nil nil "12-ab.1245" nil 1 0 "12-ab.1245" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1511 "\"\\\" =~ /^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$/" "^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$" nil nil nil nil "" nil 1 0 nil nil)
-(1512 "\".a\" =~ /^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$/" "^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$" nil nil nil nil ".a" nil 1 0 nil nil)
-(1513 "\"-a\" =~ /^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$/" "^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$" nil nil nil nil "-a" nil 1 0 nil nil)
-(1514 "\"a-\" =~ /^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$/" "^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$" nil nil nil nil "a-" nil 1 0 nil nil)
-(1515 "\"a.\" =~ /^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$/" "^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$" nil nil nil nil "a." nil 1 0 nil nil)
-(1516 "\"a_b\" =~ /^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$/" "^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$" nil nil nil nil "a_b" nil 1 0 nil nil)
-(1517 "\"a.-\" =~ /^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$/" "^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$" nil nil nil nil "a.-" nil 1 0 nil nil)
-(1518 "\"a..\" =~ /^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$/" "^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$" nil nil nil nil "a.." nil 1 0 nil nil)
-(1519 "\"ab..bc\" =~ /^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$/" "^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$" nil nil nil nil "ab..bc" nil 1 0 nil nil)
-(1520 "\"the.quick.brown.fox-\" =~ /^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$/" "^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$" nil nil nil nil "the.quick.brown.fox-" nil 1 0 nil nil)
-(1521 "\"the.quick.brown.fox.\" =~ /^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$/" "^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$" nil nil nil nil "the.quick.brown.fox." nil 1 0 nil nil)
-(1522 "\"the.quick.brown.fox_\" =~ /^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$/" "^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$" nil nil nil nil "the.quick.brown.fox_" nil 1 0 nil nil)
-(1523 "\"the.quick.brown.fox+\" =~ /^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$/" "^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$" nil nil nil nil "the.quick.brown.fox+" nil 1 0 nil nil)
-(1524 "\"alphabetabcd\" =~ /(?>.*)(?<=(abcd|wxyz))/" "(?>.*)(?<=(abcd|wxyz))" nil nil nil nil "alphabetabcd" nil 1 0 "alphabetabcd" ("abcd" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1525 "\"endingwxyz\" =~ /(?>.*)(?<=(abcd|wxyz))/" "(?>.*)(?<=(abcd|wxyz))" nil nil nil nil "endingwxyz" nil 1 0 "endingwxyz" ("wxyz" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1526 "\"a rather long string that doesn't end with one of them\" =~ /(?>.*)(?<=(abcd|wxyz))/" "(?>.*)(?<=(abcd|wxyz))" nil nil nil nil "a rather long string that doesn't end with one of them" nil 1 0 nil nil)
-(1527 "\"word cat dog elephant mussel cow horse canary baboon snake shark otherword\" =~ /word (?>(?:(?!otherword)[a-zA-Z0-9]+ ){0,30})otherword/" "word (?>(?:(?!otherword)[a-zA-Z0-9]+ ){0,30})otherword" nil nil nil nil "word cat dog elephant mussel cow horse canary baboon snake shark otherword" nil 1 0 "word cat dog elephant mussel cow horse canary baboon snake shark otherword" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1528 "\"word cat dog elephant mussel cow horse canary baboon snake shark\" =~ /word (?>(?:(?!otherword)[a-zA-Z0-9]+ ){0,30})otherword/" "word (?>(?:(?!otherword)[a-zA-Z0-9]+ ){0,30})otherword" nil nil nil nil "word cat dog elephant mussel cow horse canary baboon snake shark" nil 1 0 nil nil)
-(1529 "\"word cat dog elephant mussel cow horse canary baboon snake shark the quick brown fox and the lazy dog and several other words getting close to thirty by now I hope\" =~ /word (?>[a-zA-Z0-9]+ ){0,30}otherword/" "word (?>[a-zA-Z0-9]+ ){0,30}otherword" nil nil nil nil "word cat dog elephant mussel cow horse canary baboon snake shark the quick brown fox and the lazy dog and several other words getting close to thirty by now I hope" nil 1 0 nil nil)
-(1530 "\"999foo\" =~ /(?<=\\d{3}(?!999))foo/" "(?<=\\d{3}(?!999))foo" nil nil nil nil "999foo" nil 1 0 "foo" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1531 "\"123999foo\" =~ /(?<=\\d{3}(?!999))foo/" "(?<=\\d{3}(?!999))foo" nil nil nil nil "123999foo" nil 1 0 "foo" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1532 "\"123abcfoo\" =~ /(?<=\\d{3}(?!999))foo/" "(?<=\\d{3}(?!999))foo" nil nil nil nil "123abcfoo" nil 1 0 nil nil)
-(1533 "\"999foo\" =~ /(?<=(?!...999)\\d{3})foo/" "(?<=(?!...999)\\d{3})foo" nil nil nil nil "999foo" nil 1 0 "foo" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1534 "\"123999foo\" =~ /(?<=(?!...999)\\d{3})foo/" "(?<=(?!...999)\\d{3})foo" nil nil nil nil "123999foo" nil 1 0 "foo" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1535 "\"123abcfoo\" =~ /(?<=(?!...999)\\d{3})foo/" "(?<=(?!...999)\\d{3})foo" nil nil nil nil "123abcfoo" nil 1 0 nil nil)
-(1536 "\"123abcfoo\" =~ /(?<=\\d{3}(?!999)...)foo/" "(?<=\\d{3}(?!999)...)foo" nil nil nil nil "123abcfoo" nil 1 0 "foo" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1537 "\"123456foo\" =~ /(?<=\\d{3}(?!999)...)foo/" "(?<=\\d{3}(?!999)...)foo" nil nil nil nil "123456foo" nil 1 0 "foo" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1538 "\"123999foo\" =~ /(?<=\\d{3}(?!999)...)foo/" "(?<=\\d{3}(?!999)...)foo" nil nil nil nil "123999foo" nil 1 0 nil nil)
-(1539 "\"123abcfoo\" =~ /(?<=\\d{3}...)(?<!999)foo/" "(?<=\\d{3}...)(?<!999)foo" nil nil nil nil "123abcfoo" nil 1 0 "foo" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1540 "\"123456foo\" =~ /(?<=\\d{3}...)(?<!999)foo/" "(?<=\\d{3}...)(?<!999)foo" nil nil nil nil "123456foo" nil 1 0 "foo" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1541 "\"123999foo\" =~ /(?<=\\d{3}...)(?<!999)foo/" "(?<=\\d{3}...)(?<!999)foo" nil nil nil nil "123999foo" nil 1 0 nil nil)
-(1542 "\"<a href=abcd xyz\" =~ /<a[\\s]+href[\\s]*=[\\s]* # find <a href=
- ([\\\"\\'])? # find single or double quote
- (?(1) (.*?)\\1 | ([^\\s]+)) # if quote found, match up to next matching
- # quote, otherwise match up to next space
-/isx" "<a[\\s]+href[\\s]*=[\\s]* # find <a href=
- ([\\\"\\'])? # find single or double quote
- (?(1) (.*?)\\1 | ([^\\s]+)) # if quote found, match up to next matching
- # quote, otherwise match up to next space
-" t nil t t "<a href=abcd xyz" nil 1 0 "<a href=abcd" (nil nil "abcd" nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1543 "\"<a href=\\\"abcd xyz pqr\\\" cats\" =~ /<a[\\s]+href[\\s]*=[\\s]* # find <a href=
- ([\\\"\\'])? # find single or double quote
- (?(1) (.*?)\\1 | ([^\\s]+)) # if quote found, match up to next matching
- # quote, otherwise match up to next space
-/isx" "<a[\\s]+href[\\s]*=[\\s]* # find <a href=
- ([\\\"\\'])? # find single or double quote
- (?(1) (.*?)\\1 | ([^\\s]+)) # if quote found, match up to next matching
- # quote, otherwise match up to next space
-" t nil t t "<a href=\"abcd xyz pqr\" cats" nil 1 0 "<a href=\"abcd xyz pqr\"" ("\"" "abcd xyz pqr" nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1544 "\"<a href=\\'abcd xyz pqr\\' cats\" =~ /<a[\\s]+href[\\s]*=[\\s]* # find <a href=
- ([\\\"\\'])? # find single or double quote
- (?(1) (.*?)\\1 | ([^\\s]+)) # if quote found, match up to next matching
- # quote, otherwise match up to next space
-/isx" "<a[\\s]+href[\\s]*=[\\s]* # find <a href=
- ([\\\"\\'])? # find single or double quote
- (?(1) (.*?)\\1 | ([^\\s]+)) # if quote found, match up to next matching
- # quote, otherwise match up to next space
-" t nil t t "<a href='abcd xyz pqr' cats" nil 1 0 "<a href='abcd xyz pqr'" ("'" "abcd xyz pqr" nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1545 "\"<a href=abcd xyz\" =~ /<a\\s+href\\s*=\\s* # find <a href=
- ([\"'])? # find single or double quote
- (?(1) (.*?)\\1 | (\\S+)) # if quote found, match up to next matching
- # quote, otherwise match up to next space
-/isx" "<a\\s+href\\s*=\\s* # find <a href=
- ([\"'])? # find single or double quote
- (?(1) (.*?)\\1 | (\\S+)) # if quote found, match up to next matching
- # quote, otherwise match up to next space
-" t nil t t "<a href=abcd xyz" nil 1 0 "<a href=abcd" (nil nil "abcd" nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1546 "\"<a href=\\\"abcd xyz pqr\\\" cats\" =~ /<a\\s+href\\s*=\\s* # find <a href=
- ([\"'])? # find single or double quote
- (?(1) (.*?)\\1 | (\\S+)) # if quote found, match up to next matching
- # quote, otherwise match up to next space
-/isx" "<a\\s+href\\s*=\\s* # find <a href=
- ([\"'])? # find single or double quote
- (?(1) (.*?)\\1 | (\\S+)) # if quote found, match up to next matching
- # quote, otherwise match up to next space
-" t nil t t "<a href=\"abcd xyz pqr\" cats" nil 1 0 "<a href=\"abcd xyz pqr\"" ("\"" "abcd xyz pqr" nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1547 "\"<a href = \\'abcd xyz pqr\\' cats\" =~ /<a\\s+href\\s*=\\s* # find <a href=
- ([\"'])? # find single or double quote
- (?(1) (.*?)\\1 | (\\S+)) # if quote found, match up to next matching
- # quote, otherwise match up to next space
-/isx" "<a\\s+href\\s*=\\s* # find <a href=
- ([\"'])? # find single or double quote
- (?(1) (.*?)\\1 | (\\S+)) # if quote found, match up to next matching
- # quote, otherwise match up to next space
-" t nil t t "<a href = 'abcd xyz pqr' cats" nil 1 0 "<a href = 'abcd xyz pqr'" ("'" "abcd xyz pqr" nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1548 "\"<a href=abcd xyz\" =~ /<a\\s+href(?>\\s*)=(?>\\s*) # find <a href=
- ([\"'])? # find single or double quote
- (?(1) (.*?)\\1 | (\\S+)) # if quote found, match up to next matching
- # quote, otherwise match up to next space
-/isx" "<a\\s+href(?>\\s*)=(?>\\s*) # find <a href=
- ([\"'])? # find single or double quote
- (?(1) (.*?)\\1 | (\\S+)) # if quote found, match up to next matching
- # quote, otherwise match up to next space
-" t nil t t "<a href=abcd xyz" nil 1 0 "<a href=abcd" (nil nil "abcd" nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1549 "\"<a href=\\\"abcd xyz pqr\\\" cats\" =~ /<a\\s+href(?>\\s*)=(?>\\s*) # find <a href=
- ([\"'])? # find single or double quote
- (?(1) (.*?)\\1 | (\\S+)) # if quote found, match up to next matching
- # quote, otherwise match up to next space
-/isx" "<a\\s+href(?>\\s*)=(?>\\s*) # find <a href=
- ([\"'])? # find single or double quote
- (?(1) (.*?)\\1 | (\\S+)) # if quote found, match up to next matching
- # quote, otherwise match up to next space
-" t nil t t "<a href=\"abcd xyz pqr\" cats" nil 1 0 "<a href=\"abcd xyz pqr\"" ("\"" "abcd xyz pqr" nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1550 "\"<a href = \\'abcd xyz pqr\\' cats\" =~ /<a\\s+href(?>\\s*)=(?>\\s*) # find <a href=
- ([\"'])? # find single or double quote
- (?(1) (.*?)\\1 | (\\S+)) # if quote found, match up to next matching
- # quote, otherwise match up to next space
-/isx" "<a\\s+href(?>\\s*)=(?>\\s*) # find <a href=
- ([\"'])? # find single or double quote
- (?(1) (.*?)\\1 | (\\S+)) # if quote found, match up to next matching
- # quote, otherwise match up to next space
-" t nil t t "<a href = 'abcd xyz pqr' cats" nil 1 0 "<a href = 'abcd xyz pqr'" ("'" "abcd xyz pqr" nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1551 "\"ZABCDEFG\" =~ /((Z)+|A)*/" "((Z)+|A)*" nil nil nil nil "ZABCDEFG" nil 1 0 "ZA" ("A" "Z" nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1552 "\"ZABCDEFG\" =~ /(Z()|A)*/" "(Z()|A)*" nil nil nil nil "ZABCDEFG" nil 1 0 "ZA" ("A" "" nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1553 "\"ZABCDEFG\" =~ /(Z(())|A)*/" "(Z(())|A)*" nil nil nil nil "ZABCDEFG" nil 1 0 "ZA" ("A" "" "" nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1554 "\"ZABCDEFG\" =~ /((?>Z)+|A)*/" "((?>Z)+|A)*" nil nil nil nil "ZABCDEFG" nil 1 0 "ZA" ("A" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1555 "\"ZABCDEFG\" =~ /((?>)+|A)*/" "((?>)+|A)*" nil nil nil nil "ZABCDEFG" nil 1 0 "" ("" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1556 "\"abbab\" =~ /a*/" "a*" nil nil nil nil "abbab" nil 1 0 "a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1557 "\"abcde\" =~ /^[a-\\d]/" "^[a-\\d]" nil nil nil nil "abcde" nil 1 0 "a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1558 "\"-things\" =~ /^[a-\\d]/" "^[a-\\d]" nil nil nil nil "-things" nil 1 0 "-" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1559 "\"0digit\" =~ /^[a-\\d]/" "^[a-\\d]" nil nil nil nil "0digit" nil 1 0 "0" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1560 "\"bcdef\" =~ /^[a-\\d]/" "^[a-\\d]" nil nil nil nil "bcdef" nil 1 0 nil nil)
-(1561 "\"abcde\" =~ /^[\\d-a]/" "^[\\d-a]" nil nil nil nil "abcde" nil 1 0 "a" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1562 "\"-things\" =~ /^[\\d-a]/" "^[\\d-a]" nil nil nil nil "-things" nil 1 0 "-" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1563 "\"0digit\" =~ /^[\\d-a]/" "^[\\d-a]" nil nil nil nil "0digit" nil 1 0 "0" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1564 "\"bcdef\" =~ /^[\\d-a]/" "^[\\d-a]" nil nil nil nil "bcdef" nil 1 0 nil nil)
-(1565 "\"abcdef\" =~ /(?<=abc).*(?=def)/" "(?<=abc).*(?=def)" nil nil nil nil "abcdef" nil 1 0 "" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1566 "\"abcxdef\" =~ /(?<=abc).*(?=def)/" "(?<=abc).*(?=def)" nil nil nil nil "abcxdef" nil 1 0 "x" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1567 "\"abcxdefxdef\" =~ /(?<=abc).*(?=def)/" "(?<=abc).*(?=def)" nil nil nil nil "abcxdefxdef" nil 1 0 "xdefx" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1568 "\"abcdef\" =~ /(?<=abc).*?(?=def)/" "(?<=abc).*?(?=def)" nil nil nil nil "abcdef" nil 1 0 "" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1569 "\"abcxdef\" =~ /(?<=abc).*?(?=def)/" "(?<=abc).*?(?=def)" nil nil nil nil "abcxdef" nil 1 0 "x" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1570 "\"abcxdefxdef\" =~ /(?<=abc).*?(?=def)/" "(?<=abc).*?(?=def)" nil nil nil nil "abcxdefxdef" nil 1 0 "x" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1571 "\"abcdef\" =~ /(?<=abc).+(?=def)/" "(?<=abc).+(?=def)" nil nil nil nil "abcdef" nil 1 0 nil nil)
-(1572 "\"abcxdef\" =~ /(?<=abc).+(?=def)/" "(?<=abc).+(?=def)" nil nil nil nil "abcxdef" nil 1 0 "x" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1573 "\"abcxdefxdef\" =~ /(?<=abc).+(?=def)/" "(?<=abc).+(?=def)" nil nil nil nil "abcxdefxdef" nil 1 0 "xdefx" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1574 "\"abcdef\" =~ /(?<=abc).+?(?=def)/" "(?<=abc).+?(?=def)" nil nil nil nil "abcdef" nil 1 0 nil nil)
-(1575 "\"abcxdef\" =~ /(?<=abc).+?(?=def)/" "(?<=abc).+?(?=def)" nil nil nil nil "abcxdef" nil 1 0 "x" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1576 "\"abcxdefxdef\" =~ /(?<=abc).+?(?=def)/" "(?<=abc).+?(?=def)" nil nil nil nil "abcxdefxdef" nil 1 0 "x" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1577 "\"-abcdef\" =~ /(?<=\\b)(.*)/" "(?<=\\b)(.*)" nil nil nil nil "-abcdef" nil 1 0 "abcdef" ("abcdef" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1578 "\"abcdef\" =~ /(?<=\\b)(.*)/" "(?<=\\b)(.*)" nil nil nil nil "abcdef" nil 1 0 "abcdef" ("abcdef" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1579 "\"-abcdef\" =~ /(?<=\\B)(.*)/" "(?<=\\B)(.*)" nil nil nil nil "-abcdef" nil 1 0 "-abcdef" ("-abcdef" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1580 "\"abcdef\" =~ /(?<=\\B)(.*)/" "(?<=\\B)(.*)" nil nil nil nil "abcdef" nil 1 0 "bcdef" ("bcdef" nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1581 "\"'a'\" =~ /^'[ab]'/" "^'[ab]'" nil nil nil nil "'a'" nil 1 0 "'a'" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1582 "\"'b'\" =~ /^'[ab]'/" "^'[ab]'" nil nil nil nil "'b'" nil 1 0 "'b'" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1583 "\"x'a'\" =~ /^'[ab]'/" "^'[ab]'" nil nil nil nil "x'a'" nil 1 0 nil nil)
-(1584 "\"'a'x\" =~ /^'[ab]'/" "^'[ab]'" nil nil nil nil "'a'x" nil 1 0 "'a'" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1585 "\"'ab'\" =~ /^'[ab]'/" "^'[ab]'" nil nil nil nil "'ab'" nil 1 0 nil nil)
-(1586 "\"'a'\" =~ /^'[ab]'$/" "^'[ab]'$" nil nil nil nil "'a'" nil 1 0 "'a'" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1587 "\"'b'\" =~ /^'[ab]'$/" "^'[ab]'$" nil nil nil nil "'b'" nil 1 0 "'b'" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1588 "\"x'a'\" =~ /^'[ab]'$/" "^'[ab]'$" nil nil nil nil "x'a'" nil 1 0 nil nil)
-(1589 "\"'a'x\" =~ /^'[ab]'$/" "^'[ab]'$" nil nil nil nil "'a'x" nil 1 0 nil nil)
-(1590 "\"'ab'\" =~ /^'[ab]'$/" "^'[ab]'$" nil nil nil nil "'ab'" nil 1 0 nil nil)
-(1591 "\"'a'\" =~ /'[ab]'$/" "'[ab]'$" nil nil nil nil "'a'" nil 1 0 "'a'" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1592 "\"'b'\" =~ /'[ab]'$/" "'[ab]'$" nil nil nil nil "'b'" nil 1 0 "'b'" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1593 "\"x'a'\" =~ /'[ab]'$/" "'[ab]'$" nil nil nil nil "x'a'" nil 1 0 "'a'" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1594 "\"'a'x\" =~ /'[ab]'$/" "'[ab]'$" nil nil nil nil "'a'x" nil 1 0 nil nil)
-(1595 "\"'ab'\" =~ /'[ab]'$/" "'[ab]'$" nil nil nil nil "'ab'" nil 1 0 nil nil)
-(1596 "\"'a'\" =~ /'[ab]'/" "'[ab]'" nil nil nil nil "'a'" nil 1 0 "'a'" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1597 "\"'b'\" =~ /'[ab]'/" "'[ab]'" nil nil nil nil "'b'" nil 1 0 "'b'" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1598 "\"x'a'\" =~ /'[ab]'/" "'[ab]'" nil nil nil nil "x'a'" nil 1 0 "'a'" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1599 "\"'a'x\" =~ /'[ab]'/" "'[ab]'" nil nil nil nil "'a'x" nil 1 0 "'a'" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1600 "\"'ab'\" =~ /'[ab]'/" "'[ab]'" nil nil nil nil "'ab'" nil 1 0 nil nil)
-(1601 "\"abc\" =~ /abc\\E/" "abc\\E" nil nil nil nil "abc" nil 1 0 "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1602 "\"abcE\" =~ /abc\\E/" "abc\\E" nil nil nil nil "abcE" nil 1 0 "abc" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1603 "\"abcx\" =~ /abc[\\Ex]/" "abc[\\Ex]" nil nil nil nil "abcx" nil 1 0 "abcx" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1604 "\"abcE\" =~ /abc[\\Ex]/" "abc[\\Ex]" nil nil nil nil "abcE" nil 1 0 nil nil)
-(1605 "\"a*\" =~ /^\\Qa*\\E$/" "^\\Qa*\\E$" nil nil nil nil "a*" nil 1 0 "a*" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1606 "\"a\" =~ /^\\Qa*\\E$/" "^\\Qa*\\E$" nil nil nil nil "a" nil 1 0 nil nil)
-(1607 "\"a*x\" =~ /\\Qa*x\\E/" "\\Qa*x\\E" nil nil nil nil "a*x" nil 1 0 "a*x" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1608 "\"a*\" =~ /\\Qa*x\\E/" "\\Qa*x\\E" nil nil nil nil "a*" nil 1 0 nil nil)
-(1609 "\"a*x\" =~ /\\Qa*x/" "\\Qa*x" nil nil nil nil "a*x" nil 1 0 "a*x" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1610 "\"a*\" =~ /\\Qa*x/" "\\Qa*x" nil nil nil nil "a*" nil 1 0 nil nil)
-(1611 "\"a*x\" =~ /\\Q\\Qa*x\\E\\E/" "\\Q\\Qa*x\\E\\E" nil nil nil nil "a*x" nil 1 0 nil nil)
-(1612 "\"a\\\\*x\" =~ /\\Q\\Qa*x\\E\\E/" "\\Q\\Qa*x\\E\\E" nil nil nil nil "a\\*x" nil 1 0 "a\\*x" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1613 "\"a*x\" =~ /\\Q\\Qa*x\\E/" "\\Q\\Qa*x\\E" nil nil nil nil "a*x" nil 1 0 nil nil)
-(1614 "\"a\\\\*x\" =~ /\\Q\\Qa*x\\E/" "\\Q\\Qa*x\\E" nil nil nil nil "a\\*x" nil 1 0 "a\\*x" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1615 "\"a[x]\" =~ /a\\Q[x\\E]/" "a\\Q[x\\E]" nil nil nil nil "a[x]" nil 1 0 "a[x]" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1616 "\"ax\" =~ /a\\Q[x\\E]/" "a\\Q[x\\E]" nil nil nil nil "ax" nil 1 0 nil nil)
-(1617 "\"a\" =~ /a#comment\\Q...
-{2}/x" "a#comment\\Q...
-{2}" nil nil nil t "a" nil 1 0 nil nil)
-(1618 "\"aa\" =~ /a#comment\\Q...
-{2}/x" "a#comment\\Q...
-{2}" nil nil nil t "aa" nil 1 0 "aa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1619 "\"a\" =~ /a(?#comment\\Q...
-){2}/x" "a(?#comment\\Q...
-){2}" nil nil nil t "a" nil 1 0 nil nil)
-(1620 "\"aa\" =~ /a(?#comment\\Q...
-){2}/x" "a(?#comment\\Q...
-){2}" nil nil nil t "aa" nil 1 0 "aa" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1621 "\"a.\" =~ /(?x)a#\\Q
-./" "(?x)a#\\Q
-." nil nil nil nil "a." nil 1 0 "a." (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1622 "\"aa\" =~ /(?x)a#\\Q
-./" "(?x)a#\\Q
-." nil nil nil nil "aa" nil 1 0 nil nil)
-(1623 "\"abcdxklqj\" =~ /ab(?=.*q)cd/" "ab(?=.*q)cd" nil nil nil nil "abcdxklqj" nil 1 0 "abcd" (nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
-(1624 "\"ab\" =~ /a(?!.*$)b/" "a(?!.*$)b" nil nil nil nil "ab" nil 1 0 nil nil)
Deleted: branches/grin-neu/thirdparty/cl-ppcre/testinput
===================================================================
--- branches/grin-neu/thirdparty/cl-ppcre/testinput 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/cl-ppcre/testinput 2006-12-01 10:39:49 UTC (rev 2094)
@@ -1,3945 +0,0 @@
-/the quick brown fox/
- the quick brown fox
- The quick brown FOX
- What do you know about the quick brown fox?
- What do you know about THE QUICK BROWN FOX?
-
-/The quick brown fox/i
- the quick brown fox
- The quick brown FOX
- What do you know about the quick brown fox?
- What do you know about THE QUICK BROWN FOX?
-
-/abcd\t\n\r\f\a\e\071\x3b\$\\\?caxyz/
- abcd\t\n\r\f\a\e9;\$\\?caxyz
-
-/a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/
- abxyzpqrrrabbxyyyypqAzz
- abxyzpqrrrabbxyyyypqAzz
- aabxyzpqrrrabbxyyyypqAzz
- aaabxyzpqrrrabbxyyyypqAzz
- aaaabxyzpqrrrabbxyyyypqAzz
- abcxyzpqrrrabbxyyyypqAzz
- aabcxyzpqrrrabbxyyyypqAzz
- aaabcxyzpqrrrabbxyyyypAzz
- aaabcxyzpqrrrabbxyyyypqAzz
- aaabcxyzpqrrrabbxyyyypqqAzz
- aaabcxyzpqrrrabbxyyyypqqqAzz
- aaabcxyzpqrrrabbxyyyypqqqqAzz
- aaabcxyzpqrrrabbxyyyypqqqqqAzz
- aaabcxyzpqrrrabbxyyyypqqqqqqAzz
- aaaabcxyzpqrrrabbxyyyypqAzz
- abxyzzpqrrrabbxyyyypqAzz
- aabxyzzzpqrrrabbxyyyypqAzz
- aaabxyzzzzpqrrrabbxyyyypqAzz
- aaaabxyzzzzpqrrrabbxyyyypqAzz
- abcxyzzpqrrrabbxyyyypqAzz
- aabcxyzzzpqrrrabbxyyyypqAzz
- aaabcxyzzzzpqrrrabbxyyyypqAzz
- aaaabcxyzzzzpqrrrabbxyyyypqAzz
- aaaabcxyzzzzpqrrrabbbxyyyypqAzz
- aaaabcxyzzzzpqrrrabbbxyyyyypqAzz
- aaabcxyzpqrrrabbxyyyypABzz
- aaabcxyzpqrrrabbxyyyypABBzz
- >>>aaabxyzpqrrrabbxyyyypqAzz
- >aaaabxyzpqrrrabbxyyyypqAzz
- >>>>abcxyzpqrrrabbxyyyypqAzz
- abxyzpqrrabbxyyyypqAzz
- abxyzpqrrrrabbxyyyypqAzz
- abxyzpqrrrabxyyyypqAzz
- aaaabcxyzzzzpqrrrabbbxyyyyyypqAzz
- aaaabcxyzzzzpqrrrabbbxyyypqAzz
- aaabcxyzpqrrrabbxyyyypqqqqqqqAzz
-
-/^(abc){1,2}zz/
- abczz
- abcabczz
- zz
- abcabcabczz
- >>abczz
-
-/^(b+?|a){1,2}?c/
- bc
- bbc
- bbbc
- bac
- bbac
- aac
- abbbbbbbbbbbc
- bbbbbbbbbbbac
- aaac
- abbbbbbbbbbbac
-
-/^(b+|a){1,2}c/
- bc
- bbc
- bbbc
- bac
- bbac
- aac
- abbbbbbbbbbbc
- bbbbbbbbbbbac
- aaac
- abbbbbbbbbbbac
-
-/^(b+|a){1,2}?bc/
- bbc
-
-/^(b*|ba){1,2}?bc/
- babc
- bbabc
- bababc
- bababbc
- babababc
-
-/^(ba|b*){1,2}?bc/
- babc
- bbabc
- bababc
- bababbc
- babababc
-
-/^\ca\cA\c[\c{\c:/
- \x01\x01\e;z
-
-/^[ab\]cde]/
- athing
- bthing
- ]thing
- cthing
- dthing
- ething
- fthing
- [thing
- \\thing
-
-/^[]cde]/
- ]thing
- cthing
- dthing
- ething
- athing
- fthing
-
-/^[^ab\]cde]/
- fthing
- [thing
- \\thing
- athing
- bthing
- ]thing
- cthing
- dthing
- ething
-
-/^[^]cde]/
- athing
- fthing
- ]thing
- cthing
- dthing
- ething
-
-/^\�/
- �
-
-/^�/
- �
-
-/^[0-9]+$/
- 0
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 100
- abc
-
-/^.*nter/
- enter
- inter
- uponter
-
-/^xxx[0-9]+$/
- xxx0
- xxx1234
- xxx
-
-/^.+[0-9][0-9][0-9]$/
- x123
- xx123
- 123456
- 123
- x1234
-
-/^.+?[0-9][0-9][0-9]$/
- x123
- xx123
- 123456
- 123
- x1234
-
-/^([^!]+)!(.+)=apquxz\.ixr\.zzz\.ac\.uk$/
- abc!pqr=apquxz.ixr.zzz.ac.uk
- !pqr=apquxz.ixr.zzz.ac.uk
- abc!=apquxz.ixr.zzz.ac.uk
- abc!pqr=apquxz:ixr.zzz.ac.uk
- abc!pqr=apquxz.ixr.zzz.ac.ukk
-
-/:/
- Well, we need a colon: somewhere
- Fail if we don't
-
-/([\da-f:]+)$/i
- 0abc
- abc
- fed
- E
- ::
- 5f03:12C0::932e
- fed def
- Any old stuff
- 0zzz
- gzzz
- fed\x20
- Any old rubbish
-
-/^.*\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/
- .1.2.3
- A.12.123.0
- .1.2.3333
- 1.2.3
- 1234.2.3
-
-/^(\d+)\s+IN\s+SOA\s+(\S+)\s+(\S+)\s*\(\s*$/
- 1 IN SOA non-sp1 non-sp2(
- 1 IN SOA non-sp1 non-sp2 (
- 1IN SOA non-sp1 non-sp2(
-
-/^[a-zA-Z\d][a-zA-Z\d\-]*(\.[a-zA-Z\d][a-zA-z\d\-]*)*\.$/
- a.
- Z.
- 2.
- ab-c.pq-r.
- sxk.zzz.ac.uk.
- x-.y-.
- -abc.peq.
-
-/^\*\.[a-z]([a-z\-\d]*[a-z\d]+)?(\.[a-z]([a-z\-\d]*[a-z\d]+)?)*$/
- *.a
- *.b0-a
- *.c3-b.c
- *.c-a.b-c
- *.0
- *.a-
- *.a-b.c-
- *.c-a.0-c
-
-/^(?=ab(de))(abd)(e)/
- abde
-
-/^(?!(ab)de|x)(abd)(f)/
- abdf
-
-/^(?=(ab(cd)))(ab)/
- abcd
-
-/^[\da-f](\.[\da-f])*$/i
- a.b.c.d
- A.B.C.D
- a.b.c.1.2.3.C
-
-/^\".*\"\s*(;.*)?$/
- \"1234\"
- \"abcd\" ;
- \"\" ; rhubarb
- \"1234\" : things
-
-/^$/
- \
-
-/ ^ a (?# begins with a) b\sc (?# then b c) $ (?# then end)/x
- ab c
- abc
- ab cde
-
-/(?x) ^ a (?# begins with a) b\sc (?# then b c) $ (?# then end)/
- ab c
- abc
- ab cde
-
-/^ a\ b[c ]d $/x
- a bcd
- a b d
- abcd
- ab d
-
-/^(a(b(c)))(d(e(f)))(h(i(j)))(k(l(m)))$/
- abcdefhijklm
-
-/^(?:a(b(c)))(?:d(e(f)))(?:h(i(j)))(?:k(l(m)))$/
- abcdefhijklm
-
-/^[\w][\W][\s][\S][\d][\D][\b][\n][\c]][\022]/
- a+ Z0+\x08\n\x1d\x12
-
-/^[.^$|()*+?{,}]+/
- .^\$(*+)|{?,?}
-
-/^a*\w/
- z
- az
- aaaz
- a
- aa
- aaaa
- a+
- aa+
-
-/^a*?\w/
- z
- az
- aaaz
- a
- aa
- aaaa
- a+
- aa+
-
-/^a+\w/
- az
- aaaz
- aa
- aaaa
- aa+
-
-/^a+?\w/
- az
- aaaz
- aa
- aaaa
- aa+
-
-/^\d{8}\w{2,}/
- 1234567890
- 12345678ab
- 12345678__
- 1234567
-
-/^[aeiou\d]{4,5}$/
- uoie
- 1234
- 12345
- aaaaa
- 123456
-
-/^[aeiou\d]{4,5}?/
- uoie
- 1234
- 12345
- aaaaa
- 123456
-
-/\A(abc|def)=(\1){2,3}\Z/
- abc=abcabc
- def=defdefdef
- abc=defdef
-
-/^(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)\11*(\3\4)\1(?#)2$/
- abcdefghijkcda2
- abcdefghijkkkkcda2
-
-/(cat(a(ract|tonic)|erpillar)) \1()2(3)/
- cataract cataract23
- catatonic catatonic23
- caterpillar caterpillar23
-
-
-/^From +([^ ]+) +[a-zA-Z][a-zA-Z][a-zA-Z] +[a-zA-Z][a-zA-Z][a-zA-Z] +[0-9]?[0-9] +[0-9][0-9]:[0-9][0-9]/
- From abcd Mon Sep 01 12:33:02 1997
-
-/^From\s+\S+\s+([a-zA-Z]{3}\s+){2}\d{1,2}\s+\d\d:\d\d/
- From abcd Mon Sep 01 12:33:02 1997
- From abcd Mon Sep 1 12:33:02 1997
- From abcd Sep 01 12:33:02 1997
-
-/^12.34/s
- 12\n34
- 12\r34
-
-/\w+(?=\t)/
- the quick brown\t fox
-
-/foo(?!bar)(.*)/
- foobar is foolish see?
-
-/(?:(?!foo)...|^.{0,2})bar(.*)/
- foobar crowbar etc
- barrel
- 2barrel
- A barrel
-
-/^(\D*)(?=\d)(?!123)/
- abc456
- abc123
-
-/^1234(?# test newlines
- inside)/
- 1234
-
-/^1234 #comment in extended re
- /x
- 1234
-
-/#rhubarb
- abcd/x
- abcd
-
-/^abcd#rhubarb/x
- abcd
-
-/^(a)\1{2,3}(.)/
- aaab
- aaaab
- aaaaab
- aaaaaab
-
-/(?!^)abc/
- the abc
- abc
-
-/(?=^)abc/
- abc
- the abc
-
-/^[ab]{1,3}(ab*|b)/
- aabbbbb
-
-/^[ab]{1,3}?(ab*|b)/
- aabbbbb
-
-/^[ab]{1,3}?(ab*?|b)/
- aabbbbb
-
-/^[ab]{1,3}(ab*?|b)/
- aabbbbb
-
-/ (?: [\040\t] | \(
-(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
-\) )* # optional leading comment
-(?: (?:
-[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
-(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
-|
-" (?: # opening quote...
-[^\\\x80-\xff\n\015"] # Anything except backslash and quote
-| # or
-\\ [^\x80-\xff] # Escaped something (something != CR)
-)* " # closing quote
-) # initial word
-(?: (?: [\040\t] | \(
-(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
-\) )* \. (?: [\040\t] | \(
-(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
-\) )* (?:
-[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
-(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
-|
-" (?: # opening quote...
-[^\\\x80-\xff\n\015"] # Anything except backslash and quote
-| # or
-\\ [^\x80-\xff] # Escaped something (something != CR)
-)* " # closing quote
-) )* # further okay, if led by a period
-(?: [\040\t] | \(
-(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
-\) )* @ (?: [\040\t] | \(
-(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
-\) )* (?:
-[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
-(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
-| \[ # [
-(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff
-\] # ]
-) # initial subdomain
-(?: #
-(?: [\040\t] | \(
-(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
-\) )* \. # if led by a period...
-(?: [\040\t] | \(
-(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
-\) )* (?:
-[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
-(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
-| \[ # [
-(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff
-\] # ]
-) # ...further okay
-)*
-# address
-| # or
-(?:
-[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
-(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
-|
-" (?: # opening quote...
-[^\\\x80-\xff\n\015"] # Anything except backslash and quote
-| # or
-\\ [^\x80-\xff] # Escaped something (something != CR)
-)* " # closing quote
-) # one word, optionally followed by....
-(?:
-[^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037] | # atom and space parts, or...
-\(
-(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
-\) | # comments, or...
-
-" (?: # opening quote...
-[^\\\x80-\xff\n\015"] # Anything except backslash and quote
-| # or
-\\ [^\x80-\xff] # Escaped something (something != CR)
-)* " # closing quote
-# quoted strings
-)*
-< (?: [\040\t] | \(
-(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
-\) )* # leading <
-(?: @ (?: [\040\t] | \(
-(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
-\) )* (?:
-[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
-(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
-| \[ # [
-(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff
-\] # ]
-) # initial subdomain
-(?: #
-(?: [\040\t] | \(
-(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
-\) )* \. # if led by a period...
-(?: [\040\t] | \(
-(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
-\) )* (?:
-[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
-(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
-| \[ # [
-(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff
-\] # ]
-) # ...further okay
-)*
-
-(?: (?: [\040\t] | \(
-(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
-\) )* , (?: [\040\t] | \(
-(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
-\) )* @ (?: [\040\t] | \(
-(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
-\) )* (?:
-[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
-(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
-| \[ # [
-(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff
-\] # ]
-) # initial subdomain
-(?: #
-(?: [\040\t] | \(
-(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
-\) )* \. # if led by a period...
-(?: [\040\t] | \(
-(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
-\) )* (?:
-[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
-(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
-| \[ # [
-(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff
-\] # ]
-) # ...further okay
-)*
-)* # further okay, if led by comma
-: # closing colon
-(?: [\040\t] | \(
-(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
-\) )* )? # optional route
-(?:
-[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
-(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
-|
-" (?: # opening quote...
-[^\\\x80-\xff\n\015"] # Anything except backslash and quote
-| # or
-\\ [^\x80-\xff] # Escaped something (something != CR)
-)* " # closing quote
-) # initial word
-(?: (?: [\040\t] | \(
-(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
-\) )* \. (?: [\040\t] | \(
-(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
-\) )* (?:
-[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
-(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
-|
-" (?: # opening quote...
-[^\\\x80-\xff\n\015"] # Anything except backslash and quote
-| # or
-\\ [^\x80-\xff] # Escaped something (something != CR)
-)* " # closing quote
-) )* # further okay, if led by a period
-(?: [\040\t] | \(
-(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
-\) )* @ (?: [\040\t] | \(
-(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
-\) )* (?:
-[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
-(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
-| \[ # [
-(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff
-\] # ]
-) # initial subdomain
-(?: #
-(?: [\040\t] | \(
-(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
-\) )* \. # if led by a period...
-(?: [\040\t] | \(
-(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
-\) )* (?:
-[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
-(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
-| \[ # [
-(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff
-\] # ]
-) # ...further okay
-)*
-# address spec
-(?: [\040\t] | \(
-(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
-\) )* > # trailing >
-# name and address
-) (?: [\040\t] | \(
-(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
-\) )* # optional trailing comment
-/x
- Alan Other <user\(a)dom.ain>
- <user\(a)dom.ain>
- user\(a)dom.ain
- \"A. Other\" <user.1234\(a)dom.ain> (a comment)
- A. Other <user.1234\(a)dom.ain> (a comment)
- \"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\"\(a)x400-re.lay
- A missing angle <user\(a)some.where
- The quick brown fox
-
-/[\040\t]* # Nab whitespace.
-(?:
-\( # (
-[^\\\x80-\xff\n\015()] * # normal*
-(?: # (
-(?: \\ [^\x80-\xff] |
-\( # (
-[^\\\x80-\xff\n\015()] * # normal*
-(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
-\) # )
-) # special
-[^\\\x80-\xff\n\015()] * # normal*
-)* # )*
-\) # )
-[\040\t]* )* # If comment found, allow more spaces.
-# optional leading comment
-(?:
-(?:
-[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
-(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
-# Atom
-| # or
-" # "
-[^\\\x80-\xff\n\015"] * # normal
-(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )*
-" # "
-# Quoted string
-)
-[\040\t]* # Nab whitespace.
-(?:
-\( # (
-[^\\\x80-\xff\n\015()] * # normal*
-(?: # (
-(?: \\ [^\x80-\xff] |
-\( # (
-[^\\\x80-\xff\n\015()] * # normal*
-(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
-\) # )
-) # special
-[^\\\x80-\xff\n\015()] * # normal*
-)* # )*
-\) # )
-[\040\t]* )* # If comment found, allow more spaces.
-(?:
-\.
-[\040\t]* # Nab whitespace.
-(?:
-\( # (
-[^\\\x80-\xff\n\015()] * # normal*
-(?: # (
-(?: \\ [^\x80-\xff] |
-\( # (
-[^\\\x80-\xff\n\015()] * # normal*
-(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
-\) # )
-) # special
-[^\\\x80-\xff\n\015()] * # normal*
-)* # )*
-\) # )
-[\040\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
-(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
-# Atom
-| # or
-" # "
-[^\\\x80-\xff\n\015"] * # normal
-(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )*
-" # "
-# Quoted string
-)
-[\040\t]* # Nab whitespace.
-(?:
-\( # (
-[^\\\x80-\xff\n\015()] * # normal*
-(?: # (
-(?: \\ [^\x80-\xff] |
-\( # (
-[^\\\x80-\xff\n\015()] * # normal*
-(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
-\) # )
-) # special
-[^\\\x80-\xff\n\015()] * # normal*
-)* # )*
-\) # )
-[\040\t]* )* # If comment found, allow more spaces.
-# additional words
-)*
-@
-[\040\t]* # Nab whitespace.
-(?:
-\( # (
-[^\\\x80-\xff\n\015()] * # normal*
-(?: # (
-(?: \\ [^\x80-\xff] |
-\( # (
-[^\\\x80-\xff\n\015()] * # normal*
-(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
-\) # )
-) # special
-[^\\\x80-\xff\n\015()] * # normal*
-)* # )*
-\) # )
-[\040\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
-(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
-|
-\[ # [
-(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff
-\] # ]
-)
-[\040\t]* # Nab whitespace.
-(?:
-\( # (
-[^\\\x80-\xff\n\015()] * # normal*
-(?: # (
-(?: \\ [^\x80-\xff] |
-\( # (
-[^\\\x80-\xff\n\015()] * # normal*
-(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
-\) # )
-) # special
-[^\\\x80-\xff\n\015()] * # normal*
-)* # )*
-\) # )
-[\040\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-(?:
-\.
-[\040\t]* # Nab whitespace.
-(?:
-\( # (
-[^\\\x80-\xff\n\015()] * # normal*
-(?: # (
-(?: \\ [^\x80-\xff] |
-\( # (
-[^\\\x80-\xff\n\015()] * # normal*
-(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
-\) # )
-) # special
-[^\\\x80-\xff\n\015()] * # normal*
-)* # )*
-\) # )
-[\040\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
-(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
-|
-\[ # [
-(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff
-\] # ]
-)
-[\040\t]* # Nab whitespace.
-(?:
-\( # (
-[^\\\x80-\xff\n\015()] * # normal*
-(?: # (
-(?: \\ [^\x80-\xff] |
-\( # (
-[^\\\x80-\xff\n\015()] * # normal*
-(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
-\) # )
-) # special
-[^\\\x80-\xff\n\015()] * # normal*
-)* # )*
-\) # )
-[\040\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-)*
-# address
-| # or
-(?:
-[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
-(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
-# Atom
-| # or
-" # "
-[^\\\x80-\xff\n\015"] * # normal
-(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )*
-" # "
-# Quoted string
-)
-# leading word
-[^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037] * # "normal" atoms and or spaces
-(?:
-(?:
-\( # (
-[^\\\x80-\xff\n\015()] * # normal*
-(?: # (
-(?: \\ [^\x80-\xff] |
-\( # (
-[^\\\x80-\xff\n\015()] * # normal*
-(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
-\) # )
-) # special
-[^\\\x80-\xff\n\015()] * # normal*
-)* # )*
-\) # )
-|
-" # "
-[^\\\x80-\xff\n\015"] * # normal
-(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )*
-" # "
-) # "special" comment or quoted string
-[^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037] * # more "normal"
-)*
-<
-[\040\t]* # Nab whitespace.
-(?:
-\( # (
-[^\\\x80-\xff\n\015()] * # normal*
-(?: # (
-(?: \\ [^\x80-\xff] |
-\( # (
-[^\\\x80-\xff\n\015()] * # normal*
-(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
-\) # )
-) # special
-[^\\\x80-\xff\n\015()] * # normal*
-)* # )*
-\) # )
-[\040\t]* )* # If comment found, allow more spaces.
-# <
-(?:
-@
-[\040\t]* # Nab whitespace.
-(?:
-\( # (
-[^\\\x80-\xff\n\015()] * # normal*
-(?: # (
-(?: \\ [^\x80-\xff] |
-\( # (
-[^\\\x80-\xff\n\015()] * # normal*
-(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
-\) # )
-) # special
-[^\\\x80-\xff\n\015()] * # normal*
-)* # )*
-\) # )
-[\040\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
-(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
-|
-\[ # [
-(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff
-\] # ]
-)
-[\040\t]* # Nab whitespace.
-(?:
-\( # (
-[^\\\x80-\xff\n\015()] * # normal*
-(?: # (
-(?: \\ [^\x80-\xff] |
-\( # (
-[^\\\x80-\xff\n\015()] * # normal*
-(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
-\) # )
-) # special
-[^\\\x80-\xff\n\015()] * # normal*
-)* # )*
-\) # )
-[\040\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-(?:
-\.
-[\040\t]* # Nab whitespace.
-(?:
-\( # (
-[^\\\x80-\xff\n\015()] * # normal*
-(?: # (
-(?: \\ [^\x80-\xff] |
-\( # (
-[^\\\x80-\xff\n\015()] * # normal*
-(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
-\) # )
-) # special
-[^\\\x80-\xff\n\015()] * # normal*
-)* # )*
-\) # )
-[\040\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
-(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
-|
-\[ # [
-(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff
-\] # ]
-)
-[\040\t]* # Nab whitespace.
-(?:
-\( # (
-[^\\\x80-\xff\n\015()] * # normal*
-(?: # (
-(?: \\ [^\x80-\xff] |
-\( # (
-[^\\\x80-\xff\n\015()] * # normal*
-(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
-\) # )
-) # special
-[^\\\x80-\xff\n\015()] * # normal*
-)* # )*
-\) # )
-[\040\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-)*
-(?: ,
-[\040\t]* # Nab whitespace.
-(?:
-\( # (
-[^\\\x80-\xff\n\015()] * # normal*
-(?: # (
-(?: \\ [^\x80-\xff] |
-\( # (
-[^\\\x80-\xff\n\015()] * # normal*
-(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
-\) # )
-) # special
-[^\\\x80-\xff\n\015()] * # normal*
-)* # )*
-\) # )
-[\040\t]* )* # If comment found, allow more spaces.
-@
-[\040\t]* # Nab whitespace.
-(?:
-\( # (
-[^\\\x80-\xff\n\015()] * # normal*
-(?: # (
-(?: \\ [^\x80-\xff] |
-\( # (
-[^\\\x80-\xff\n\015()] * # normal*
-(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
-\) # )
-) # special
-[^\\\x80-\xff\n\015()] * # normal*
-)* # )*
-\) # )
-[\040\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
-(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
-|
-\[ # [
-(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff
-\] # ]
-)
-[\040\t]* # Nab whitespace.
-(?:
-\( # (
-[^\\\x80-\xff\n\015()] * # normal*
-(?: # (
-(?: \\ [^\x80-\xff] |
-\( # (
-[^\\\x80-\xff\n\015()] * # normal*
-(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
-\) # )
-) # special
-[^\\\x80-\xff\n\015()] * # normal*
-)* # )*
-\) # )
-[\040\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-(?:
-\.
-[\040\t]* # Nab whitespace.
-(?:
-\( # (
-[^\\\x80-\xff\n\015()] * # normal*
-(?: # (
-(?: \\ [^\x80-\xff] |
-\( # (
-[^\\\x80-\xff\n\015()] * # normal*
-(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
-\) # )
-) # special
-[^\\\x80-\xff\n\015()] * # normal*
-)* # )*
-\) # )
-[\040\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
-(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
-|
-\[ # [
-(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff
-\] # ]
-)
-[\040\t]* # Nab whitespace.
-(?:
-\( # (
-[^\\\x80-\xff\n\015()] * # normal*
-(?: # (
-(?: \\ [^\x80-\xff] |
-\( # (
-[^\\\x80-\xff\n\015()] * # normal*
-(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
-\) # )
-) # special
-[^\\\x80-\xff\n\015()] * # normal*
-)* # )*
-\) # )
-[\040\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-)*
-)* # additional domains
-:
-[\040\t]* # Nab whitespace.
-(?:
-\( # (
-[^\\\x80-\xff\n\015()] * # normal*
-(?: # (
-(?: \\ [^\x80-\xff] |
-\( # (
-[^\\\x80-\xff\n\015()] * # normal*
-(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
-\) # )
-) # special
-[^\\\x80-\xff\n\015()] * # normal*
-)* # )*
-\) # )
-[\040\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-)? # optional route
-(?:
-[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
-(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
-# Atom
-| # or
-" # "
-[^\\\x80-\xff\n\015"] * # normal
-(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )*
-" # "
-# Quoted string
-)
-[\040\t]* # Nab whitespace.
-(?:
-\( # (
-[^\\\x80-\xff\n\015()] * # normal*
-(?: # (
-(?: \\ [^\x80-\xff] |
-\( # (
-[^\\\x80-\xff\n\015()] * # normal*
-(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
-\) # )
-) # special
-[^\\\x80-\xff\n\015()] * # normal*
-)* # )*
-\) # )
-[\040\t]* )* # If comment found, allow more spaces.
-(?:
-\.
-[\040\t]* # Nab whitespace.
-(?:
-\( # (
-[^\\\x80-\xff\n\015()] * # normal*
-(?: # (
-(?: \\ [^\x80-\xff] |
-\( # (
-[^\\\x80-\xff\n\015()] * # normal*
-(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
-\) # )
-) # special
-[^\\\x80-\xff\n\015()] * # normal*
-)* # )*
-\) # )
-[\040\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
-(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
-# Atom
-| # or
-" # "
-[^\\\x80-\xff\n\015"] * # normal
-(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )*
-" # "
-# Quoted string
-)
-[\040\t]* # Nab whitespace.
-(?:
-\( # (
-[^\\\x80-\xff\n\015()] * # normal*
-(?: # (
-(?: \\ [^\x80-\xff] |
-\( # (
-[^\\\x80-\xff\n\015()] * # normal*
-(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
-\) # )
-) # special
-[^\\\x80-\xff\n\015()] * # normal*
-)* # )*
-\) # )
-[\040\t]* )* # If comment found, allow more spaces.
-# additional words
-)*
-@
-[\040\t]* # Nab whitespace.
-(?:
-\( # (
-[^\\\x80-\xff\n\015()] * # normal*
-(?: # (
-(?: \\ [^\x80-\xff] |
-\( # (
-[^\\\x80-\xff\n\015()] * # normal*
-(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
-\) # )
-) # special
-[^\\\x80-\xff\n\015()] * # normal*
-)* # )*
-\) # )
-[\040\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
-(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
-|
-\[ # [
-(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff
-\] # ]
-)
-[\040\t]* # Nab whitespace.
-(?:
-\( # (
-[^\\\x80-\xff\n\015()] * # normal*
-(?: # (
-(?: \\ [^\x80-\xff] |
-\( # (
-[^\\\x80-\xff\n\015()] * # normal*
-(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
-\) # )
-) # special
-[^\\\x80-\xff\n\015()] * # normal*
-)* # )*
-\) # )
-[\040\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-(?:
-\.
-[\040\t]* # Nab whitespace.
-(?:
-\( # (
-[^\\\x80-\xff\n\015()] * # normal*
-(?: # (
-(?: \\ [^\x80-\xff] |
-\( # (
-[^\\\x80-\xff\n\015()] * # normal*
-(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
-\) # )
-) # special
-[^\\\x80-\xff\n\015()] * # normal*
-)* # )*
-\) # )
-[\040\t]* )* # If comment found, allow more spaces.
-(?:
-[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
-(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
-|
-\[ # [
-(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff
-\] # ]
-)
-[\040\t]* # Nab whitespace.
-(?:
-\( # (
-[^\\\x80-\xff\n\015()] * # normal*
-(?: # (
-(?: \\ [^\x80-\xff] |
-\( # (
-[^\\\x80-\xff\n\015()] * # normal*
-(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
-\) # )
-) # special
-[^\\\x80-\xff\n\015()] * # normal*
-)* # )*
-\) # )
-[\040\t]* )* # If comment found, allow more spaces.
-# optional trailing comments
-)*
-# address spec
-> # >
-# name and address
-)
-/x
- Alan Other <user\(a)dom.ain>
- <user\(a)dom.ain>
- user\(a)dom.ain
- \"A. Other\" <user.1234\(a)dom.ain> (a comment)
- A. Other <user.1234\(a)dom.ain> (a comment)
- \"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\"\(a)x400-re.lay
- A missing angle <user\(a)some.where
- The quick brown fox
-
-/abc\0def\00pqr\000xyz\0000AB/
- abc\0def\00pqr\000xyz\0000AB
- abc456 abc\0def\00pqr\000xyz\0000ABCDE
-
-/abc\x0def\x00pqr\x000xyz\x0000AB/
- abc\x0def\x00pqr\x000xyz\x0000AB
- abc456 abc\x0def\x00pqr\x000xyz\x0000ABCDE
-
-/^[\000-\037]/
- \0A
- \01B
- \037C
-
-/\0*/
- \0\0\0\0
-
-/A\x0{2,3}Z/
- The A\x0\x0Z
- An A\0\x0\0Z
- A\0Z
- A\0\x0\0\x0Z
-
-/^(cow|)\1(bell)/
- cowcowbell
- bell
- cowbell
-
-/^\s/
- \040abc
- \x0cabc
- \nabc
- \rabc
- \tabc
- abc
-
-/^a b
-
c/x
- abc
-
-/^(a|)\1*b/
- ab
- aaaab
- b
- acb
-
-/^(a|)\1+b/
- aab
- aaaab
- b
- ab
-
-/^(a|)\1?b/
- ab
- aab
- b
- acb
-
-/^(a|)\1{2}b/
- aaab
- b
- ab
- aab
- aaaab
-
-/^(a|)\1{2,3}b/
- aaab
- aaaab
- b
- ab
- aab
- aaaaab
-
-/ab{1,3}bc/
- abbbbc
- abbbc
- abbc
- abc
- abbbbbc
-
-/([^.]*)\.([^:]*):[T ]+(.*)/
- track1.title:TBlah blah blah
-
-/([^.]*)\.([^:]*):[T ]+(.*)/i
- track1.title:TBlah blah blah
-
-/([^.]*)\.([^:]*):[t ]+(.*)/i
- track1.title:TBlah blah blah
-
-/^[W-c]+$/
- WXY_^abc
- wxy
-
-/^[W-c]+$/i
- WXY_^abc
- wxy_^ABC
-
-/^[\x3f-\x5F]+$/i
- WXY_^abc
- wxy_^ABC
-
-/^abc$/m
- abc
- qqq\nabc
- abc\nzzz
- qqq\nabc\nzzz
-
-/^abc$/
- abc
- qqq\nabc
- abc\nzzz
- qqq\nabc\nzzz
-
-/\Aabc\Z/m
- abc
- abc\n
- qqq\nabc
- abc\nzzz
- qqq\nabc\nzzz
-
-/\A(.)*\Z/s
- abc\ndef
-
-/\A(.)*\Z/m
- abc\ndef
-
-/(?:b)|(?::+)/
- b::c
- c::b
-
-/[-az]+/
- az-
- b
-
-/[az-]+/
- za-
- b
-
-/[a\-z]+/
- a-z
- b
-
-/[a-z]+/
- abcdxyz
-
-/[\d-]+/
- 12-34
- aaa
-
-/[\d-z]+/
- 12-34z
- aaa
-
-/\x5c/
- \\
-
-/\x20Z/
- the Zoo
- Zulu
-
-/(abc)\1/i
- abcabc
- ABCabc
- abcABC
-
-/ab{3cd/
- ab{3cd
-
-/ab{3,cd/
- ab{3,cd
-
-/ab{3,4a}cd/
- ab{3,4a}cd
-
-/{4,5a}bc/
- {4,5a}bc
-
-/^a.b/
- a\rb
- a\nb
-
-/abc$/
- abc
- abc\n
- abc\ndef
-
-/(abc)\123/
- abc\x53
-
-/(abc)\223/
- abc\x93
-
-/(abc)\323/
- abc\xd3
-
-/(abc)\500/
- abc\x40
- abc\100
-
-/(abc)\5000/
- abc\x400
- abc\x40\x30
- abc\1000
- abc\100\x30
- abc\100\060
- abc\100\60
-
-/abc\81/
- abc\081
- abc\0\x38\x31
-
-/abc\91/
- abc\091
- abc\0\x39\x31
-
-/(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)(l)\12\123/
- abcdefghijkllS
-
-/(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)\12\123/
- abcdefghijk\12S
-
-/ab\gdef/
- abgdef
-
-/a{0}bc/
- bc
-
-/(a|(bc)){0,0}?xyz/
- xyz
-
-/abc[\10]de/
- abc\010de
-
-/abc[\1]de/
- abc\1de
-
-/(abc)[\1]de/
- abc\1de
-
-/a.b(?s)/
- a\nb
-
-/^([^a])([^\b])([^c]*)([^d]{3,4})/
- baNOTccccd
- baNOTcccd
- baNOTccd
- bacccd
- anything
- b\bc
- baccd
-
-/[^a]/
- Abc
-
-/[^a]/i
- Abc
-
-/[^a]+/
- AAAaAbc
-
-/[^a]+/i
- AAAaAbc
-
-/[^a]+/
- bbb\nccc
-
-/[^k]$/
- abc
- abk
-
-/[^k]{2,3}$/
- abc
- kbc
- kabc
- abk
- akb
- akk
-
-/^\d{8,}\@.+[^k]$/
- 12345678\(a)a.b.c.d
- 123456789\(a)x.y.z
- 12345678\(a)x.y.uk
- 1234567\(a)a.b.c.d
-
-/(a)\1{8,}/
- aaaaaaaaa
- aaaaaaaaaa
- aaaaaaa
-
-/[^a]/
- aaaabcd
- aaAabcd
-
-/[^a]/i
- aaaabcd
- aaAabcd
-
-/[^az]/
- aaaabcd
- aaAabcd
-
-/[^az]/i
- aaaabcd
- aaAabcd
-
-/\000\001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037\040\041\042\043\044\045\046\047\050\051\052\053\054\055\056\057\060\061\062\063\064\065\066\067\070\071\072\073\074\075\076\077\100\101\102\103\104\105\106\107\110\111\112\113\114\115\116\117\120\121\122\123\124\125\126\127\130\131\132\133\134\135\136\137\140\141\142\143\144\145\146\147\150\151\152\153\154\155\156\157\160\161\162\163\164\165\166\167\170\171\172\173\174\175\176\177\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357\360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377/
- \000\001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037\040\041\042\043\044\045\046\047\050\051\052\053\054\055\056\057\060\061\062\063\064\065\066\067\070\071\072\073\074\075\076\077\100\101\102\103\104\105\106\107\110\111\112\113\114\115\116\117\120\121\122\123\124\125\126\127\130\131\132\133\134\135\136\137\140\141\142\143\144\145\146\147\150\151\152\153\154\155\156\157\160\161\162\163\164\165\166\167\170\171\172\173\174\175\176\177\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357\360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377
-
-/P[^*]TAIRE[^*]{1,6}?LL/
- xxxxxxxxxxxPSTAIREISLLxxxxxxxxx
-
-/P[^*]TAIRE[^*]{1,}?LL/
- xxxxxxxxxxxPSTAIREISLLxxxxxxxxx
-
-/(\.\d\d[1-9]?)\d+/
- 1.230003938
- 1.875000282
- 1.235
-
-/(\.\d\d((?=0)|\d(?=\d)))/
- 1.230003938
- 1.875000282
- 1.235
-
-/a(?)b/
- ab
-
-/\b(foo)\s+(\w+)/i
- Food is on the foo table
-
-/foo(.*)bar/
- The food is under the bar in the barn.
-
-/foo(.*?)bar/
- The food is under the bar in the barn.
-
-/(.*)(\d*)/
- I have 2 numbers: 53147
-
-/(.*)(\d+)/
- I have 2 numbers: 53147
-
-/(.*?)(\d*)/
- I have 2 numbers: 53147
-
-/(.*?)(\d+)/
- I have 2 numbers: 53147
-
-/(.*)(\d+)$/
- I have 2 numbers: 53147
-
-/(.*?)(\d+)$/
- I have 2 numbers: 53147
-
-/(.*)\b(\d+)$/
- I have 2 numbers: 53147
-
-/(.*\D)(\d+)$/
- I have 2 numbers: 53147
-
-/^\D*(?!123)/
- ABC123
-
-/^(\D*)(?=\d)(?!123)/
- ABC445
- ABC123
-
-/^[W-]46]/
- W46]789
- -46]789
- Wall
- Zebra
- 42
- [abcd]
- ]abcd[
-
-/^[W-\]46]/
- W46]789
- Wall
- Zebra
- Xylophone
- 42
- [abcd]
- ]abcd[
- \\backslash
- -46]789
- well
-
-/\d\d\/\d\d\/\d\d\d\d/
- 01/01/2000
-
-/word (?:[a-zA-Z0-9]+ ){0,10}otherword/
- word cat dog elephant mussel cow horse canary baboon snake shark otherword
- word cat dog elephant mussel cow horse canary baboon snake shark
-
-/word (?:[a-zA-Z0-9]+ ){0,300}otherword/
- word cat dog elephant mussel cow horse canary baboon snake shark the quick brown fox and the lazy dog and several other words getting close to thirty by now I hope
-
-/^(a){0,0}/
- bcd
- abc
- aab
-
-/^(a){0,1}/
- bcd
- abc
- aab
-
-/^(a){0,2}/
- bcd
- abc
- aab
-
-/^(a){0,3}/
- bcd
- abc
- aab
- aaa
-
-/^(a){0,}/
- bcd
- abc
- aab
- aaa
- aaaaaaaa
-
-/^(a){1,1}/
- bcd
- abc
- aab
-
-/^(a){1,2}/
- bcd
- abc
- aab
-
-/^(a){1,3}/
- bcd
- abc
- aab
- aaa
-
-/^(a){1,}/
- bcd
- abc
- aab
- aaa
- aaaaaaaa
-
-/.*\.gif/
- borfle\nbib.gif\nno
-
-/.{0,}\.gif/
- borfle\nbib.gif\nno
-
-/.*\.gif/m
- borfle\nbib.gif\nno
-
-/.*\.gif/s
- borfle\nbib.gif\nno
-
-/.*\.gif/ms
- borfle\nbib.gif\nno
-
-/.*$/
- borfle\nbib.gif\nno
-
-/.*$/m
- borfle\nbib.gif\nno
-
-/.*$/s
- borfle\nbib.gif\nno
-
-/.*$/ms
- borfle\nbib.gif\nno
-
-/.*$/
- borfle\nbib.gif\nno\n
-
-/.*$/m
- borfle\nbib.gif\nno\n
-
-/.*$/s
- borfle\nbib.gif\nno\n
-
-/.*$/ms
- borfle\nbib.gif\nno\n
-
-/(.*X|^B)/
- abcde\n1234Xyz
- BarFoo
- abcde\nBar
-
-/(.*X|^B)/m
- abcde\n1234Xyz
- BarFoo
- abcde\nBar
-
-/(.*X|^B)/s
- abcde\n1234Xyz
- BarFoo
- abcde\nBar
-
-/(.*X|^B)/ms
- abcde\n1234Xyz
- BarFoo
- abcde\nBar
-
-/(?s)(.*X|^B)/
- abcde\n1234Xyz
- BarFoo
- abcde\nBar
-
-/(?s:.*X|^B)/
- abcde\n1234Xyz
- BarFoo
- abcde\nBar
-
-/^.*B/
- abc\nB
-
-/(?s)^.*B/
- abc\nB
-
-/(?m)^.*B/
- abc\nB
-
-/(?ms)^.*B/
- abc\nB
-
-/(?ms)^B/
- abc\nB
-
-/(?s)B$/
- B\n
-
-/^[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]/
- 123456654321
-
-/^\d\d\d\d\d\d\d\d\d\d\d\d/
- 123456654321
-
-/^[\d][\d][\d][\d][\d][\d][\d][\d][\d][\d][\d][\d]/
- 123456654321
-
-/^[abc]{12}/
- abcabcabcabc
-
-/^[a-c]{12}/
- abcabcabcabc
-
-/^(a|b|c){12}/
- abcabcabcabc
-
-/^[abcdefghijklmnopqrstuvwxy0123456789]/
- n
- z
-
-/abcde{0,0}/
- abcd
- abce
-
-/ab[cd]{0,0}e/
- abe
- abcde
-
-/ab(c){0,0}d/
- abd
- abcd
-
-/a(b*)/
- a
- ab
- abbbb
- bbbbb
-
-/ab\d{0}e/
- abe
- ab1e
-
-/"([^\\"]+|\\.)*"/
- the \"quick\" brown fox
- \"the \\\"quick\\\" brown fox\"
-
-/.*?/g+
- abc
-
-/\b/g+
- abc
-
-/\b/+g
- abc
-
-//g
- abc
-
-/<tr([\w\W\s\d][^<>]{0,})><TD([\w\W\s\d][^<>]{0,})>([\d]{0,}\.)(.*)((<BR>([\w\W\s\d][^<>]{0,})|[\s]{0,}))<\/a><\/TD><TD([\w\W\s\d][^<>]{0,})>([\w\W\s\d][^<>]{0,})<\/TD><TD([\w\W\s\d][^<>]{0,})>([\w\W\s\d][^<>]{0,})<\/TD><\/TR>/is
- <TR BGCOLOR='#DBE9E9'><TD align=left valign=top>43.<a href='joblist.cfm?JobID=94 6735&Keyword='>Word Processor<BR>(N-1286)</a></TD><TD align=left valign=top>Lega lstaff.com</TD><TD align=left valign=top>CA - Statewide</TD></TR>
-
-/a[^a]b/
- acb
- a\nb
-
-/a.b/
- acb
- a\nb
-
-/a[^a]b/s
- acb
- a\nb
-
-/a.b/s
- acb
- a\nb
-
-/^(b+?|a){1,2}?c/
- bac
- bbac
- bbbac
- bbbbac
- bbbbbac
-
-/^(b+|a){1,2}?c/
- bac
- bbac
- bbbac
- bbbbac
- bbbbbac
-
-/(?!\A)x/m
- x\nb\n
- a\bx\n
-
-/\x0{ab}/
- \0{ab}
-
-/(A|B)*?CD/
- CD
-
-/(A|B)*CD/
- CD
-
-/(AB)*?\1/
- ABABAB
-
-/(AB)*\1/
- ABABAB
-
-/(/
- doesn't matter
-
-/(x)\2/
- doesn't matter
-
-/((a{0,5}){0,5}){0,5}[c]/
- aaaaaaaaaac
- aaaaaaaaaa
-
-/((a{0,5}){0,5})*[c]/
- aaaaaaaaaac
- aaaaaaaaaa
-
-/(\b)*a/
- a
-
-/(a)*b/
- ab
-
-/(a|)*b/
- ab
- b
- x
-
-/^(?:(a)|(b))*\1\2$/
- abab
-
-/abc[^x]def/
- abcxabcydef
-
-/^(a|\1x)*$/
- aax
- aaxa
-
-//
- @{['']}
-
-/^(?:(a)|(b))*$/
- ab
-
-/[\0]/
- a
- \0
-
-/[\1]/
- a
- \1
-
-/\10()()()()()()()()()/
- doesn't matter
-
-/\10()()()()()()()()()()/
- a
-
-/a(?<)b/
- ab
-
-/[]/
- doesn't matter
-
-/[\]/
- doesn't matter
-
-/()/
- a
-
-/[\x]/
- x
- \0
-
-/((a)*)*/
- a
-
-/()a\1/
- a
-
-/a\1()/
- a
-
-/a(?i)a(?-i)a/
- aaa
- aAa
- aAA
-
-/a(?i)a(?-i)a(?i)a(?-i)a/
- aaaaa
- aAaAa
- AaAaA
- aAAAa
- AaaaA
- AAAAA
- aaAAA
- AAaaa
-
-/\x/
- a
- X
- \0
-
-/[a-c-e]/
- a
- b
- d
- -
-
-/[b-\d]/
- b
- c
- d
- -
- 1
-
-/[\d-f]/
- d
- e
- f
- -
- 1
-
-/[/
- doesn't matter
-
-/]/
- ]
- a
-
-/[]/
- doesn't matter
-
-/[-a-c]/
- -
- a
- b
- d
-
-/[a-c-]/
- -
- a
- b
- d
-
-/[-]/
- a
- -
-
-/[--]/
- a
- -
-
-/[---]/
- a
- -
-
-/[--b]/
- -
- a
- c
-
-/[b--]/
- doesn't matter
-
-/a{/
- a{
-
-/a{}/
- a{}
-
-/a{3/
- a{3
-
-/a{3,/
- a{3,
-
-/a{3, 3}/
- a{3,3}
- a{3, 3}
- aaa
-
-/a{3, 3}/x
- a{3,3}
- a{3, 3}
- aaa
-
-/a{3, }/
- a{3,}
- a{3, }
- aaa
-
-/a{3, }/x
- a{3,}
- a{3, }
- aaa
-
-/\x x/
- \0 x
- \0x
-
-/\x x/x
- \0 x
- \0x
-
-/\x 3/
- \0003
- \000 3
- x3
- x 3
-
-/\x 3/x
- \0003
- \000 3
- x3
- x 3
-
-/^a{ 1}$/
- a
- a{ 1}
- a{1}
-
-/^a{ 1}$/x
- a
- a{ 1}
- a{1}
-
-/{}/
- {}
- a
-
-/{1}/
- doesn't matter
-
-/*/
- doesn't matter
-
-/|/
- x
-
-/\0000/
- \0000
-
-/a(?<)b/
- ab
-
-/a(?i)b/
- ab
- aB
- Ab
-
-/a(?i=a)/
- doesn't matter
-
-/a(?<=a){3000}a/
- aa
- xa
- ax
-
-/a(?!=a){3000}a/
- aa
- ax
- xa
-
-/a(){3000}a/
- aa
- ax
- xa
-
-/a(?:){3000}a/
- aa
- ax
-
-/a(?<=a)*a/
- aa
- ax
- xa
-
-/a(?!=a)*a/
- aa
- ax
- xa
-
-/a()*a/
- aa
- ax
- xa
-
-/a(?:)*a/
- aa
- ax
- xa
-
-/x(?<=a)*a/
- aa
- xa
- ax
-
-/a(?<=(a))*\1/
- aa
-
-/a(?<=(a))*?\1/
- aa
-
-/(?=(a)\1)*aa/
- aa
-
-/^((a|b){2,5}){2}$/
- aaaaabbbbb
-
-/^(b*|ba){1,2}bc/
- babc
- bbabc
- bababc
- bababbc
- babababc
-
-/^a{4,5}(?:c|a)c$/
- aaaaac
- aaaaaac
-
-/^(a|){4,5}(?:c|a)c$/
- aaaaac
- aaaaaac
-
-/(?m:^).abc$/
- eeexabc
- eee\nxabc
-
-/(?m:^)abc/
- abc
- \nabc
-
-
-/^abc/
- abc
- \nabc
-
-/\Aabc/
- abc
- \nabc
-
-/(?<!bar)foo/
- foo
- catfood
- arfootle
- rfoosh
- barfoo
- towbarfoo
-
-/\w{3}(?<!bar)foo/
- catfood
- foo
- barfoo
- towbarfoo
-
-/(?<=(foo)a)bar/
- fooabar
- bar
- foobbar
-
-/\Aabc\z/m
- abc
- abc\n
- qqq\nabc
- abc\nzzz
- qqq\nabc\nzzz
-
-"(?>.*/)foo"
- /this/is/a/very/long/line/in/deed/with/very/many/slashes/in/it/you/see/
-
-"(?>.*/)foo"
- /this/is/a/very/long/line/in/deed/with/very/many/slashes/in/and/foo
-
-/(?>(\.\d\d[1-9]?))\d+/
- 1.230003938
- 1.875000282
- 1.235
-
-/^((?>\w+)|(?>\s+))*$/
- now is the time for all good men to come to the aid of the party
- this is not a line with only words and spaces!
-
-/(\d+)(\w)/
- 12345a
- 12345+
-
-/((?>\d+))(\w)/
- 12345a
- 12345+
-
-/(?>a+)b/
- aaab
-
-/((?>a+)b)/
- aaab
-
-/(?>(a+))b/
- aaab
-
-/(?>b)+/
- aaabbbccc
-
-/(?>a+|b+|c+)*c/
- aaabbbbccccd
-
-/((?>[^()]+)|\([^()]*\))+/
- ((abc(ade)ufh()()x
-
-/\(((?>[^()]+)|\([^()]+\))+\)/
- (abc)
- (abc(def)xyz)
- ((()aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-
-/a(?-i)b/i
- ab
- Ab
- aB
- AB
-
-/(a (?x)b c)d e/
- a bcd e
- a b cd e
- abcd e
- a bcde
-
-/(a b(?x)c d (?-x)e f)/
- a bcde f
- abcdef
-
-/(a(?i)b)c/
- abc
- aBc
- abC
- aBC
- Abc
- ABc
- ABC
- AbC
-
-/a(?i:b)c/
- abc
- aBc
- ABC
- abC
- aBC
-
-/a(?i:b)*c/
- aBc
- aBBc
- aBC
- aBBC
-
-/a(?=b(?i)c)\w\wd/
- abcd
- abCd
- aBCd
- abcD
-
-/(?s-i:more.*than).*million/i
- more than million
- more than MILLION
- more \n than Million
- MORE THAN MILLION
- more \n than \n million
-
-/(?:(?s-i)more.*than).*million/i
- more than million
- more than MILLION
- more \n than Million
- MORE THAN MILLION
- more \n than \n million
-
-/(?>a(?i)b+)+c/
- abc
- aBbc
- aBBc
- Abc
- abAb
- abbC
-
-/(?=a(?i)b)\w\wc/
- abc
- aBc
- Ab
- abC
- aBC
-
-/(?<=a(?i)b)(\w\w)c/
- abxxc
- aBxxc
- Abxxc
- ABxxc
- abxxC
-
-/(?:(a)|b)(?(1)A|B)/
- aA
- bB
- aB
- bA
-
-/^(a)?(?(1)a|b)+$/
- aa
- b
- bb
- ab
-
-/^(?(?=abc)\w{3}:|\d\d)$/
- abc:
- 12
- 123
- xyz
-
-/^(?(?!abc)\d\d|\w{3}:)$/
- abc:
- 12
- 123
- xyz
-
-/(?(?<=foo)bar|cat)/
- foobar
- cat
- fcat
- focat
- foocat
-
-/(?(?<!foo)cat|bar)/
- foobar
- cat
- fcat
- focat
- foocat
-
-/( \( )? [^()]+ (?(1) \) |) /x
- abcd
- (abcd)
- the quick (abcd) fox
- (abcd
-
-/( \( )? [^()]+ (?(1) \) ) /x
- abcd
- (abcd)
- the quick (abcd) fox
- (abcd
-
-/^(?(2)a|(1)(2))+$/
- 12
- 12a
- 12aa
- 1234
-
-/((?i)blah)\s+\1/
- blah blah
- BLAH BLAH
- Blah Blah
- blaH blaH
- blah BLAH
- Blah blah
- blaH blah
-
-/((?i)blah)\s+(?i:\1)/
- blah blah
- BLAH BLAH
- Blah Blah
- blaH blaH
- blah BLAH
- Blah blah
- blaH blah
-
-/(?>a*)*/
- a
- aa
- aaaa
-
-/(abc|)+/
- abc
- abcabc
- abcabcabc
- xyz
-
-/([a]*)*/
- a
- aaaaa
-
-/([ab]*)*/
- a
- b
- ababab
- aaaabcde
- bbbb
-
-/([^a]*)*/
- b
- bbbb
- aaa
-
-/([^ab]*)*/
- cccc
- abab
-
-/([a]*?)*/
- a
- aaaa
-
-/([ab]*?)*/
- a
- b
- abab
- baba
-
-/([^a]*?)*/
- b
- bbbb
- aaa
-
-/([^ab]*?)*/
- c
- cccc
- baba
-
-/(?>a*)*/
- a
- aaabcde
-
-/((?>a*))*/
- aaaaa
- aabbaa
-
-/((?>a*?))*/
- aaaaa
- aabbaa
-
-/(?(?=[^a-z]+[a-z]) \d{2}-[a-z]{3}-\d{2} | \d{2}-\d{2}-\d{2} ) /x
- 12-sep-98
- 12-09-98
- sep-12-98
-
-/(?<=(foo))bar\1/
- foobarfoo
- foobarfootling
- foobar
- barfoo
-
-/(?i:saturday|sunday)/
- saturday
- sunday
- Saturday
- Sunday
- SATURDAY
- SUNDAY
- SunDay
-
-/(a(?i)bc|BB)x/
- abcx
- aBCx
- bbx
- BBx
- abcX
- aBCX
- bbX
- BBX
-
-/^([ab](?i)[cd]|[ef])/
- ac
- aC
- bD
- elephant
- Europe
- frog
- France
- Africa
-
-/^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)/
- ab
- aBd
- xy
- xY
- zebra
- Zambesi
- aCD
- XY
-
-/(?<=foo\n)^bar/m
- foo\nbar
- bar
- baz\nbar
-
-/(?<=(?<!foo)bar)baz/
- barbaz
- barbarbaz
- koobarbaz
- baz
- foobarbaz
-
-/^(a\1?){4}$/
- a
- aa
- aaa
- aaaa
- aaaaa
- aaaaaa
- aaaaaaa
- aaaaaaaa
- aaaaaaaaa
- aaaaaaaaaa
- aaaaaaaaaaa
- aaaaaaaaaaaa
- aaaaaaaaaaaaa
- aaaaaaaaaaaaaa
- aaaaaaaaaaaaaaa
- aaaaaaaaaaaaaaaa
-
-/^(a\1?)(a\1?)(a\2?)(a\3?)$/
- a
- aa
- aaa
- aaaa
- aaaaa
- aaaaaa
- aaaaaaa
- aaaaaaaa
- aaaaaaaaa
- aaaaaaaaaa
- aaaaaaaaaaa
- aaaaaaaaaaaa
- aaaaaaaaaaaaa
- aaaaaaaaaaaaaa
- aaaaaaaaaaaaaaa
- aaaaaaaaaaaaaaaa
-
-/abc/
- abc
- xabcy
- ababc
- xbc
- axc
- abx
-
-/ab*c/
- abc
-
-/ab*bc/
- abc
- abbc
- abbbbc
-
-/.{1}/
- abbbbc
-
-/.{3,4}/
- abbbbc
-
-/ab{0,}bc/
- abbbbc
-
-/ab+bc/
- abbc
- abc
- abq
-
-/ab{1,}bc/
-
-/ab+bc/
- abbbbc
-
-/ab{1,}bc/
- abbbbc
-
-/ab{1,3}bc/
- abbbbc
-
-/ab{3,4}bc/
- abbbbc
-
-/ab{4,5}bc/
- abq
- abbbbc
-
-/ab?bc/
- abbc
- abc
-
-/ab{0,1}bc/
- abc
-
-/ab?bc/
-
-/ab?c/
- abc
-
-/ab{0,1}c/
- abc
-
-/^abc$/
- abc
- abbbbc
- abcc
-
-/^abc/
- abcc
-
-/^abc$/
-
-/abc$/
- aabc
- aabc
- aabcd
-
-/^/
- abc
-
-/$/
- abc
-
-/a.c/
- abc
- axc
-
-/a.*c/
- axyzc
-
-/a[bc]d/
- abd
- axyzd
- abc
-
-/a[b-d]e/
- ace
-
-/a[b-d]/
- aac
-
-/a[-b]/
- a-
-
-/a[b-]/
- a-
-
-/a]/
- a]
-
-/a[]]b/
- a]b
-
-/a[^bc]d/
- aed
- abd
- abd
-
-/a[^-b]c/
- adc
-
-/a[^]b]c/
- adc
- a-c
- a]c
-
-/\ba\b/
- a-
- -a
- -a-
-
-/\by\b/
- xy
- yz
- xyz
-
-/\Ba\B/
- a-
- -a
- -a-
-
-/\By\b/
- xy
-
-/\by\B/
- yz
-
-/\By\B/
- xyz
-
-/\w/
- a
-
-/\W/
- -
- -
- a
-
-/a\sb/
- a b
-
-/a\Sb/
- a-b
- a-b
- a b
-
-/\d/
- 1
-
-/\D/
- -
- -
- 1
-
-/[\w]/
- a
-
-/[\W]/
- -
- -
- a
-
-/a[\s]b/
- a b
-
-/a[\S]b/
- a-b
- a-b
- a b
-
-/[\d]/
- 1
-
-/[\D]/
- -
- -
- 1
-
-/ab|cd/
- abc
- abcd
-
-/()ef/
- def
-
-/$b/
-
-/a\(b/
- a(b
-
-/a\(*b/
- ab
- a((b
-
-/a\\b/
- a\b
-
-/((a))/
- abc
-
-/(a)b(c)/
- abc
-
-/a+b+c/
- aabbabc
-
-/a{1,}b{1,}c/
- aabbabc
-
-/a.+?c/
- abcabc
-
-/(a+|b)*/
- ab
-
-/(a+|b){0,}/
- ab
-
-/(a+|b)+/
- ab
-
-/(a+|b){1,}/
- ab
-
-/(a+|b)?/
- ab
-
-/(a+|b){0,1}/
- ab
-
-/[^ab]*/
- cde
-
-/abc/
- b
-
-
-/a*/
-
-
-/([abc])*d/
- abbbcd
-
-/([abc])*bcd/
- abcd
-
-/a|b|c|d|e/
- e
-
-/(a|b|c|d|e)f/
- ef
-
-/abcd*efg/
- abcdefg
-
-/ab*/
- xabyabbbz
- xayabbbz
-
-/(ab|cd)e/
- abcde
-
-/[abhgefdc]ij/
- hij
-
-/^(ab|cd)e/
-
-/(abc|)ef/
- abcdef
-
-/(a|b)c*d/
- abcd
-
-/(ab|ab*)bc/
- abc
-
-/a([bc]*)c*/
- abc
-
-/a([bc]*)(c*d)/
- abcd
-
-/a([bc]+)(c*d)/
- abcd
-
-/a([bc]*)(c+d)/
- abcd
-
-/a[bcd]*dcdcde/
- adcdcde
-
-/a[bcd]+dcdcde/
- abcde
- adcdcde
-
-/(ab|a)b*c/
- abc
-
-/((a)(b)c)(d)/
- abcd
-
-/[a-zA-Z_][a-zA-Z0-9_]*/
- alpha
-
-/^a(bc+|b[eh])g|.h$/
- abh
-
-/(bc+d$|ef*g.|h?i(j|k))/
- effgz
- ij
- reffgz
- effg
- bcdd
-
-/((((((((((a))))))))))/
- a
-
-/((((((((((a))))))))))\10/
- aa
-
-/(((((((((a)))))))))/
- a
-
-/multiple words of text/
- aa
- uh-uh
-
-/multiple words/
- multiple words, yeah
-
-/(.*)c(.*)/
- abcde
-
-/\((.*), (.*)\)/
- (a, b)
-
-/[k]/
-
-/abcd/
- abcd
-
-/a(bc)d/
- abcd
-
-/a[-]?c/
- ac
-
-/(abc)\1/
- abcabc
-
-/([a-c]*)\1/
- abcabc
-
-/(a)|\1/
- a
- ab
- x
-
-/(([a-c])b*?\2)*/
- ababbbcbc
-
-/(([a-c])b*?\2){3}/
- ababbbcbc
-
-/((\3|b)\2(a)x)+/
- aaaxabaxbaaxbbax
-
-/((\3|b)\2(a)){2,}/
- bbaababbabaaaaabbaaaabba
-
-/abc/i
- ABC
- XABCY
- ABABC
- aaxabxbaxbbx
- XBC
- AXC
- ABX
-
-/ab*c/i
- ABC
-
-/ab*bc/i
- ABC
- ABBC
-
-/ab*?bc/i
- ABBBBC
-
-/ab{0,}?bc/i
- ABBBBC
-
-/ab+?bc/i
- ABBC
-
-/ab+bc/i
- ABC
- ABQ
-
-/ab{1,}bc/i
-
-/ab+bc/i
- ABBBBC
-
-/ab{1,}?bc/i
- ABBBBC
-
-/ab{1,3}?bc/i
- ABBBBC
-
-/ab{3,4}?bc/i
- ABBBBC
-
-/ab{4,5}?bc/i
- ABQ
- ABBBBC
-
-/ab??bc/i
- ABBC
- ABC
-
-/ab{0,1}?bc/i
- ABC
-
-/ab??bc/i
-
-/ab??c/i
- ABC
-
-/ab{0,1}?c/i
- ABC
-
-/^abc$/i
- ABC
- ABBBBC
- ABCC
-
-/^abc/i
- ABCC
-
-/^abc$/i
-
-/abc$/i
- AABC
-
-/^/i
- ABC
-
-/$/i
- ABC
-
-/a.c/i
- ABC
- AXC
-
-/a.*?c/i
- AXYZC
-
-/a.*c/i
- AABC
- AXYZD
-
-/a[bc]d/i
- ABD
-
-/a[b-d]e/i
- ACE
- ABC
- ABD
-
-/a[b-d]/i
- AAC
-
-/a[-b]/i
- A-
-
-/a[b-]/i
- A-
-
-/a]/i
- A]
-
-/a[]]b/i
- A]B
-
-/a[^bc]d/i
- AED
-
-/a[^-b]c/i
- ADC
- ABD
- A-C
-
-/a[^]b]c/i
- ADC
-
-/ab|cd/i
- ABC
- ABCD
-
-/()ef/i
- DEF
-
-/$b/i
- A]C
- B
-
-/a\(b/i
- A(B
-
-/a\(*b/i
- AB
- A((B
-
-/a\\b/i
- A\B
-
-/((a))/i
- ABC
-
-/(a)b(c)/i
- ABC
-
-/a+b+c/i
- AABBABC
-
-/a{1,}b{1,}c/i
- AABBABC
-
-/a.+?c/i
- ABCABC
-
-/a.*?c/i
- ABCABC
-
-/a.{0,5}?c/i
- ABCABC
-
-/(a+|b)*/i
- AB
-
-/(a+|b){0,}/i
- AB
-
-/(a+|b)+/i
- AB
-
-/(a+|b){1,}/i
- AB
-
-/(a+|b)?/i
- AB
-
-/(a+|b){0,1}/i
- AB
-
-/(a+|b){0,1}?/i
- AB
-
-/[^ab]*/i
- CDE
-
-/abc/i
-
-/a*/i
-
-
-/([abc])*d/i
- ABBBCD
-
-/([abc])*bcd/i
- ABCD
-
-/a|b|c|d|e/i
- E
-
-/(a|b|c|d|e)f/i
- EF
-
-/abcd*efg/i
- ABCDEFG
-
-/ab*/i
- XABYABBBZ
- XAYABBBZ
-
-/(ab|cd)e/i
- ABCDE
-
-/[abhgefdc]ij/i
- HIJ
-
-/^(ab|cd)e/i
- ABCDE
-
-/(abc|)ef/i
- ABCDEF
-
-/(a|b)c*d/i
- ABCD
-
-/(ab|ab*)bc/i
- ABC
-
-/a([bc]*)c*/i
- ABC
-
-/a([bc]*)(c*d)/i
- ABCD
-
-/a([bc]+)(c*d)/i
- ABCD
-
-/a([bc]*)(c+d)/i
- ABCD
-
-/a[bcd]*dcdcde/i
- ADCDCDE
-
-/a[bcd]+dcdcde/i
-
-/(ab|a)b*c/i
- ABC
-
-/((a)(b)c)(d)/i
- ABCD
-
-/[a-zA-Z_][a-zA-Z0-9_]*/i
- ALPHA
-
-/^a(bc+|b[eh])g|.h$/i
- ABH
-
-/(bc+d$|ef*g.|h?i(j|k))/i
- EFFGZ
- IJ
- REFFGZ
- ADCDCDE
- EFFG
- BCDD
-
-/((((((((((a))))))))))/i
- A
-
-/((((((((((a))))))))))\10/i
- AA
-
-/(((((((((a)))))))))/i
- A
-
-/(?:(?:(?:(?:(?:(?:(?:(?:(?:(a))))))))))/i
- A
-
-/(?:(?:(?:(?:(?:(?:(?:(?:(?:(a|b|c))))))))))/i
- C
-
-/multiple words of text/i
- AA
- UH-UH
-
-/multiple words/i
- MULTIPLE WORDS, YEAH
-
-/(.*)c(.*)/i
- ABCDE
-
-/\((.*), (.*)\)/i
- (A, B)
-
-/[k]/i
-
-/abcd/i
- ABCD
-
-/a(bc)d/i
- ABCD
-
-/a[-]?c/i
- AC
-
-/(abc)\1/i
- ABCABC
-
-/([a-c]*)\1/i
- ABCABC
-
-/a(?!b)./
- abad
-
-/a(?=d)./
- abad
-
-/a(?=c|d)./
- abad
-
-/a(?:b|c|d)(.)/
- ace
-
-/a(?:b|c|d)*(.)/
- ace
-
-/a(?:b|c|d)+?(.)/
- ace
- acdbcdbe
-
-/a(?:b|c|d)+(.)/
- acdbcdbe
-
-/a(?:b|c|d){2}(.)/
- acdbcdbe
-
-/a(?:b|c|d){4,5}(.)/
- acdbcdbe
-
-/a(?:b|c|d){4,5}?(.)/
- acdbcdbe
-
-/((foo)|(bar))*/
- foobar
-
-/a(?:b|c|d){6,7}(.)/
- acdbcdbe
-
-/a(?:b|c|d){6,7}?(.)/
- acdbcdbe
-
-/a(?:b|c|d){5,6}(.)/
- acdbcdbe
-
-/a(?:b|c|d){5,6}?(.)/
- acdbcdbe
-
-/a(?:b|c|d){5,7}(.)/
- acdbcdbe
-
-/a(?:b|c|d){5,7}?(.)/
- acdbcdbe
-
-/a(?:b|(c|e){1,2}?|d)+?(.)/
- ace
-
-/^(.+)?B/
- AB
-
-/^([^a-z])|(\^)$/
- .
-
-/^[<>]&/
- <&OUT
-
-/^(a\1?){4}$/
- aaaaaaaaaa
- AB
- aaaaaaaaa
- aaaaaaaaaaa
-
-/^(a(?(1)\1)){4}$/
- aaaaaaaaaa
- aaaaaaaaa
- aaaaaaaaaaa
-
-/(?:(f)(o)(o)|(b)(a)(r))*/
- foobar
-
-/(?<=a)b/
- ab
- cb
- b
-
-/(?<!c)b/
- ab
- b
- b
-
-/(?:..)*a/
- aba
-
-/(?:..)*?a/
- aba
-
-/^(?:b|a(?=(.)))*\1/
- abc
-
-/^(){3,5}/
- abc
-
-/^(a+)*ax/
- aax
-
-/^((a|b)+)*ax/
- aax
-
-/^((a|bc)+)*ax/
- aax
-
-/(a|x)*ab/
- cab
-
-/(a)*ab/
- cab
-
-/(?:(?i)a)b/
- ab
-
-/((?i)a)b/
- ab
-
-/(?:(?i)a)b/
- Ab
-
-/((?i)a)b/
- Ab
-
-/(?:(?i)a)b/
- cb
- aB
-
-/((?i)a)b/
-
-/(?i:a)b/
- ab
-
-/((?i:a))b/
- ab
-
-/(?i:a)b/
- Ab
-
-/((?i:a))b/
- Ab
-
-/(?i:a)b/
- aB
- aB
-
-/((?i:a))b/
-
-/(?:(?-i)a)b/i
- ab
-
-/((?-i)a)b/i
- ab
-
-/(?:(?-i)a)b/i
- aB
-
-/((?-i)a)b/i
- aB
-
-/(?:(?-i)a)b/i
- aB
- Ab
-
-/((?-i)a)b/i
-
-/(?:(?-i)a)b/i
- aB
-
-/((?-i)a)b/i
- aB
-
-/(?:(?-i)a)b/i
- Ab
- AB
-
-/((?-i)a)b/i
-
-/(?-i:a)b/i
- ab
-
-/((?-i:a))b/i
- ab
-
-/(?-i:a)b/i
- aB
-
-/((?-i:a))b/i
- aB
-
-/(?-i:a)b/i
- AB
- Ab
-
-/((?-i:a))b/i
-
-/(?-i:a)b/i
- aB
-
-/((?-i:a))b/i
- aB
-
-/(?-i:a)b/i
- Ab
- AB
-
-/((?-i:a))b/i
-
-/((?-i:a.))b/i
- AB
- a\nB
-
-/((?s-i:a.))b/i
- a\nB
-
-/(?:c|d)(?:)(?:a(?:)(?:b)(?:b(?:))(?:b(?:)(?:b)))/
- cabbbb
-
-/(?:c|d)(?:)(?:aaaaaaaa(?:)(?:bbbbbbbb)(?:bbbbbbbb(?:))(?:bbbbbbbb(?:)(?:bbbbbbbb)))/
- caaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-
-/(ab)\d\1/i
- Ab4ab
- ab4Ab
-
-/foo\w*\d{4}baz/
- foobar1234baz
-
-/x(~~)*(?:(?:F)?)?/
- x~~
-
-/^a(?#xxx){3}c/
- aaac
-
-/^a(?#xxx)(?#xxx){3}c/
- aaac
-
-/^a (?#xxx) (?#yyy) {3}c/x
- aaac
-
-/(?<![cd])b/
- B\nB
- dbcb
-
-/(?<![cd])[ab]/
- dbaacb
-
-/(?<!(c|d))b/
-
-/(?<!(c|d))[ab]/
- dbaacb
-
-/(?<!cd)[ab]/
- cdaccb
-
-/^(?:a?b?)*$/
- dbcb
- a--
-
-/((?s)^a(.))((?m)^b$)/
- a\nb\nc\n
-
-/((?m)^b$)/
- a\nb\nc\n
-
-/(?m)^b/
- a\nb\n
-
-/(?m)^(b)/
- a\nb\n
-
-/((?m)^b)/
- a\nb\n
-
-/\n((?m)^b)/
- a\nb\n
-
-/((?s).)c(?!.)/
- a\nb\nc\n
- a\nb\nc\n
-
-/((?s)b.)c(?!.)/
- a\nb\nc\n
- a\nb\nc\n
-
-/^b/
-
-/()^b/
- a\nb\nc\n
- a\nb\nc\n
-
-/((?m)^b)/
- a\nb\nc\n
-
-/(?(1)a|b)/
-
-/(?(1)b|a)/
- a
-
-/(x)?(?(1)a|b)/
- a
- a
-
-/(x)?(?(1)b|a)/
- a
-
-/()?(?(1)b|a)/
- a
-
-/()(?(1)b|a)/
-
-/()?(?(1)a|b)/
- a
-
-/^(\()?blah(?(1)(\)))$/
- (blah)
- blah
- a
- blah)
- (blah
-
-/^(\(+)?blah(?(1)(\)))$/
- (blah)
- blah
- blah)
- (blah
-
-/(?(?!a)a|b)/
-
-/(?(?!a)b|a)/
- a
-
-/(?(?=a)b|a)/
- a
- a
-
-/(?(?=a)a|b)/
- a
-
-/(?=(a+?))(\1ab)/
- aaab
-
-/^(?=(a+?))\1ab/
-
-/(\w+:)+/
- one:
-
-/$(?<=^(a))/
- a
-
-/(?=(a+?))(\1ab)/
- aaab
-
-/^(?=(a+?))\1ab/
- aaab
- aaab
-
-/([\w:]+::)?(\w+)$/
- abcd
- xy:z:::abcd
-
-/^[^bcd]*(c+)/
- aexycd
-
-/(a*)b+/
- caab
-
-/([\w:]+::)?(\w+)$/
- abcd
- xy:z:::abcd
- abcd:
- abcd:
-
-/^[^bcd]*(c+)/
- aexycd
-
-/(>a+)ab/
-
-/(?>a+)b/
- aaab
-
-/([[:]+)/
- a:[b]:
-
-/([[=]+)/
- a=[b]=
-
-/([[.]+)/
- a.[b].
-
-/((?>a+)b)/
- aaab
-
-/(?>(a+))b/
- aaab
-
-/((?>[^()]+)|\([^()]*\))+/
- ((abc(ade)ufh()()x
-
-/a\Z/
- aaab
- a\nb\n
-
-/b\Z/
- a\nb\n
-
-/b\z/
-
-/b\Z/
- a\nb
-
-/b\z/
- a\nb
-
-/^(?>(?(1)\.|())[^\W_](?>[a-z0-9-]*[^\W_])?)+$/
- a
- abc
- a-b
- 0-9
- a.b
- 5.6.7
- the.quick.brown.fox
- a100.b200.300c
- 12-ab.1245
- \
- .a
- -a
- a-
- a.
- a_b
- a.-
- a..
- ab..bc
- the.quick.brown.fox-
- the.quick.brown.fox.
- the.quick.brown.fox_
- the.quick.brown.fox+
-
-/(?>.*)(?<=(abcd|wxyz))/
- alphabetabcd
- endingwxyz
- a rather long string that doesn't end with one of them
-
-/word (?>(?:(?!otherword)[a-zA-Z0-9]+ ){0,30})otherword/
- word cat dog elephant mussel cow horse canary baboon snake shark otherword
- word cat dog elephant mussel cow horse canary baboon snake shark
-
-/word (?>[a-zA-Z0-9]+ ){0,30}otherword/
- word cat dog elephant mussel cow horse canary baboon snake shark the quick brown fox and the lazy dog and several other words getting close to thirty by now I hope
-
-/(?<=\d{3}(?!999))foo/
- 999foo
- 123999foo
- 123abcfoo
-
-/(?<=(?!...999)\d{3})foo/
- 999foo
- 123999foo
- 123abcfoo
-
-/(?<=\d{3}(?!999)...)foo/
- 123abcfoo
- 123456foo
- 123999foo
-
-/(?<=\d{3}...)(?<!999)foo/
- 123abcfoo
- 123456foo
- 123999foo
-
-/<a[\s]+href[\s]*=[\s]* # find <a href=
- ([\"\'])? # find single or double quote
- (?(1) (.*?)\1 | ([^\s]+)) # if quote found, match up to next matching
- # quote, otherwise match up to next space
-/isx
- <a href=abcd xyz
- <a href=\"abcd xyz pqr\" cats
- <a href=\'abcd xyz pqr\' cats
-
-/<a\s+href\s*=\s* # find <a href=
- (["'])? # find single or double quote
- (?(1) (.*?)\1 | (\S+)) # if quote found, match up to next matching
- # quote, otherwise match up to next space
-/isx
- <a href=abcd xyz
- <a href=\"abcd xyz pqr\" cats
- <a href = \'abcd xyz pqr\' cats
-
-/<a\s+href(?>\s*)=(?>\s*) # find <a href=
- (["'])? # find single or double quote
- (?(1) (.*?)\1 | (\S+)) # if quote found, match up to next matching
- # quote, otherwise match up to next space
-/isx
- <a href=abcd xyz
- <a href=\"abcd xyz pqr\" cats
- <a href = \'abcd xyz pqr\' cats
-
-/((Z)+|A)*/
- ZABCDEFG
-
-/(Z()|A)*/
- ZABCDEFG
-
-/(Z(())|A)*/
- ZABCDEFG
-
-/((?>Z)+|A)*/
- ZABCDEFG
-
-/((?>)+|A)*/
- ZABCDEFG
-
-/a*/g
- abbab
-
-/^[a-\d]/
- abcde
- -things
- 0digit
- bcdef
-
-/^[\d-a]/
- abcde
- -things
- 0digit
- bcdef
-
-/(?<=abc).*(?=def)/
- abcdef
- abcxdef
- abcxdefxdef
-
-/(?<=abc).*?(?=def)/
- abcdef
- abcxdef
- abcxdefxdef
-
-/(?<=abc).+(?=def)/
- abcdef
- abcxdef
- abcxdefxdef
-
-/(?<=abc).+?(?=def)/
- abcdef
- abcxdef
- abcxdefxdef
-
-/(?<=\b)(.*)/
- -abcdef
- abcdef
-
-/(?<=\B)(.*)/
- -abcdef
- abcdef
-
-/^'[ab]'/
- 'a'
- 'b'
- x'a'
- 'a'x
- 'ab'
-
-/^'[ab]'$/
- 'a'
- 'b'
- x'a'
- 'a'x
- 'ab'
-
-/'[ab]'$/
- 'a'
- 'b'
- x'a'
- 'a'x
- 'ab'
-
-/'[ab]'/
- 'a'
- 'b'
- x'a'
- 'a'x
- 'ab'
-
-/abc\E/
- abc
- abcE
-
-/abc[\Ex]/
- abcx
- abcE
-
-/^\Qa*\E$/
- a*
- a
-
-/\Qa*x\E/
- a*x
- a*
-
-/\Qa*x/
- a*x
- a*
-
-/\Q\Qa*x\E\E/
- a*x
- a\\*x
-
-/\Q\Qa*x\E/
- a*x
- a\\*x
-
-/a\Q[x\E]/
- a[x]
- ax
-
-/a#comment\Q...
-{2}/x
- a
- aa
-
-/a(?#comment\Q...
-){2}/x
- a
- aa
-
-/(?x)a#\Q
-./
- a.
- aa
-
-/ab(?=.*q)cd/
- abcdxklqj
-
-/a(?!.*$)b/
- ab
\ No newline at end of file
Modified: branches/grin-neu/thirdparty/cl-ppcre/util.lisp
===================================================================
--- branches/grin-neu/thirdparty/cl-ppcre/util.lisp 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/cl-ppcre/util.lisp 2006-12-01 10:39:49 UTC (rev 2094)
@@ -1,5 +1,5 @@
;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-PPCRE; Base: 10 -*-
-;;; $Header: /usr/local/cvsrep/cl-ppcre/util.lisp,v 1.32 2005/08/23 10:32:30 edi Exp $
+;;; $Header: /usr/local/cvsrep/cl-ppcre/util.lisp,v 1.34 2006/05/24 18:29:44 edi Exp $
;;; Utility functions and constants dealing with the hash-tables
;;; we use to encode character classes
@@ -7,7 +7,7 @@
;;; Hash-tables are treated like sets, i.e. a character C is a member of the
;;; hash-table H iff (GETHASH C H) is true.
-;;; Copyright (c) 2002-2005, Dr. Edmund Weitz. All rights reserved.
+;;; Copyright (c) 2002-2006, Dr. Edmund Weitz. All rights reserved.
;;; Redistribution and use in source and binary forms, with or without
;;; modification, are permitted provided that the following conditions
@@ -36,7 +36,8 @@
(in-package #:cl-ppcre)
#+:lispworks
-(import 'lw:with-unique-names)
+(eval-when (:compile-toplevel :load-toplevel :execute)
+ (import 'lw:with-unique-names))
#-:lispworks
(defmacro with-unique-names ((&rest bindings) &body body)
Added: branches/grin-neu/thirdparty/cxml/COPYING
===================================================================
--- branches/grin-neu/thirdparty/cxml/COPYING 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/cxml/COPYING 2006-12-01 10:39:49 UTC (rev 2094)
@@ -0,0 +1,526 @@
+Closure XML -- a Common Lisp XML parser
+
+Copyright (c) 1999 by Gilbert Baumann
+Copyright (c) 2003 by Henrik Motakef
+Copyright (c) 2004 knowledgeTools Int. GmbH
+Copyright (c) 2004,2005 David Lichteblau
+
+Preamble to the Gnu Lesser General Public License
+
+The concept of the GNU Lesser General Public License version 2.1
+("LGPL") has been adopted to govern the use and distribution of
+above-mentioned application. However, the LGPL uses terminology that is
+more appropriate for a program written in C than one written in
+Lisp. Nevertheless, the LGPL can still be applied to a Lisp program if
+certain clarifications are made. This document details those
+clarifications. Accordingly, the license for the open-source Lisp
+applications consists of this document plus the LGPL. Wherever there is
+a conflict between this document and the LGPL, this document takes
+precedence over the LGPL.
+
+A "Library" in Lisp is a collection of Lisp functions, data and foreign
+modules. The form of the Library can be Lisp source code (for processing
+by an interpreter) or object code (usually the result of compilation of
+source code or built with some other mechanisms). Foreign modules are
+object code in a form that can be linked into a Lisp executable. When we
+speak of functions we do so in the most general way to include, in
+addition, methods and unnamed functions. Lisp "data" is also a general
+term that includes the data structures resulting from defining Lisp
+classes. A Lisp application may include the same set of Lisp objects as
+does a Library, but this does not mean that the application is
+necessarily a "work based on the Library" it contains.
+
+The Library consists of everything in the distribution file set before
+any modifications are made to the files. If any of the functions or
+classes in the Library are redefined in other files, then those
+redefinitions ARE considered a work based on the Library. If additional
+methods are added to generic functions in the Library, those additional
+methods are NOT considered a work based on the Library. If Library
+classes are subclassed, these subclasses are NOT considered a work based
+on the Library. If the Library is modified to explicitly call other
+functions that are neither part of Lisp itself nor an available add-on
+module to Lisp, then the functions called by the modified Library ARE
+considered a work based on the Library. The goal is to ensure that the
+Library will compile and run without getting undefined function errors.
+
+It is permitted to add proprietary source code to the Library, but it
+must be done in a way such that the Library will still run without that
+proprietary code present. Section 5 of the LGPL distinguishes between
+the case of a library being dynamically linked at runtime and one being
+statically linked at build time. Section 5 of the LGPL states that the
+former results in an executable that is a "work that uses the Library."
+Section 5 of the LGPL states that the latter results in one that is a
+"derivative of the Library", which is therefore covered by the
+LGPL. Since Lisp only offers one choice, which is to link the Library
+into an executable at build time, we declare that, for the purpose
+applying the LGPL to the Library, an executable that results from
+linking a "work that uses the Library" with the Library is considered a
+"work that uses the Library" and is therefore NOT covered by the LGPL.
+
+Because of this declaration, section 6 of LGPL is not applicable to the
+Library. However, in connection with each distribution of this
+executable, you must also deliver, in accordance with the terms and
+conditions of the LGPL, the source code of Library (or your derivative
+thereof) that is incorporated into this executable.
+
+End of Document
+------------------------------------------------------------------------
+ GNU LESSER GENERAL PUBLIC LICENSE
+ Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL. It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+ This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it. You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+ When we speak of free software, we are referring to freedom of use,
+not price. Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+ To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights. These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+ For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you. You must make sure that they, too, receive or can get the source
+code. If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it. And you must show them these terms so they know their rights.
+
+ We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+ To protect each distributor, we want to make it very clear that
+there is no warranty for the free library. Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+ Finally, software patents pose a constant threat to the existence of
+any free program. We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder. Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+ Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License. This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License. We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+ When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library. The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom. The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+ We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License. It also provides other free software developers Less
+of an advantage over competing non-free programs. These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries. However, the Lesser license provides advantages in certain
+special circumstances.
+
+ For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard. To achieve this, non-free programs must be
+allowed to use the library. A more frequent case is that a free
+library does the same job as widely used non-free libraries. In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+ In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software. For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+ Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+ The precise terms and conditions for copying, distribution and
+modification follow. Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library". The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+ GNU LESSER GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+ A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+ The "Library", below, refers to any such software library or work
+which has been distributed under these terms. A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language. (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+ "Source code" for a work means the preferred form of the work for
+making modifications to it. For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+ Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it). Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+ 1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+ You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+ 2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) The modified work must itself be a software library.
+
+ b) You must cause the files modified to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ c) You must cause the whole of the work to be licensed at no
+ charge to all third parties under the terms of this License.
+
+ d) If a facility in the modified Library refers to a function or a
+ table of data to be supplied by an application program that uses
+ the facility, other than as an argument passed when the facility
+ is invoked, then you must make a good faith effort to ensure that,
+ in the event an application does not supply such function or
+ table, the facility still operates, and performs whatever part of
+ its purpose remains meaningful.
+
+ (For example, a function in a library to compute square roots has
+ a purpose that is entirely well-defined independent of the
+ application. Therefore, Subsection 2d requires that any
+ application-supplied function or table used by this function must
+ be optional: if the application does not supply it, the square
+ root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library. To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License. (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.) Do not make any other change in
+these notices.
+
+ Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+ This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+ 4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+ If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library". Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+ However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library". The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+ When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library. The
+threshold for this to be true is not precisely defined by law.
+
+ If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work. (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+ Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+ 6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+ You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License. You must supply a copy of this License. If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License. Also, you must do one
+of these things:
+
+ a) Accompany the work with the complete corresponding
+ machine-readable source code for the Library including whatever
+ changes were used in the work (which must be distributed under
+ Sections 1 and 2 above); and, if the work is an executable linked
+ with the Library, with the complete machine-readable "work that
+ uses the Library", as object code and/or source code, so that the
+ user can modify the Library and then relink to produce a modified
+ executable containing the modified Library. (It is understood
+ that the user who changes the contents of definitions files in the
+ Library will not necessarily be able to recompile the application
+ to use the modified definitions.)
+
+ b) Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (1) uses at run time a
+ copy of the library already present on the user's computer system,
+ rather than copying library functions into the executable, and (2)
+ will operate properly with a modified version of the library, if
+ the user installs one, as long as the modified version is
+ interface-compatible with the version that the work was made with.
+
+ c) Accompany the work with a written offer, valid for at
+ least three years, to give the same user the materials
+ specified in Subsection 6a, above, for a charge no more
+ than the cost of performing this distribution.
+
+ d) If distribution of the work is made by offering access to copy
+ from a designated place, offer equivalent access to copy the above
+ specified materials from the same place.
+
+ e) Verify that the user has already received a copy of these
+ materials or that you have already sent this user a copy.
+
+ For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it. However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+ It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system. Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+ 7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+ a) Accompany the combined library with a copy of the same work
+ based on the Library, uncombined with any other library
+ facilities. This must be distributed under the terms of the
+ Sections above.
+
+ b) Give prominent notice with the combined library of the fact
+ that part of it is a work based on the Library, and explaining
+ where to find the accompanying uncombined form of the same work.
+
+ 8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License. Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License. However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+ 9. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Library or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+ 10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+ 11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all. For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded. In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+ 13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation. If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+ 14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission. For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this. Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+ NO WARRANTY
+
+ 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
Added: branches/grin-neu/thirdparty/cxml/DOMTEST
===================================================================
--- branches/grin-neu/thirdparty/cxml/DOMTEST 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/cxml/DOMTEST 2006-12-01 10:39:49 UTC (rev 2094)
@@ -0,0 +1,840 @@
+
+#P"/home/david/2001/DOM-Test-Suite/tests/level1/core/"
+0/806 attrcreatedocumentfragment.xml
+1/806 attrcreatetextnode.xml
+2/806 attrcreatetextnode2.xml
+3/806 attrdefaultvalue.xml
+4/806 attreffectivevalue.xml
+5/806 attrentityreplacement.xml
+6/806 attrname.xml
+7/806 attrnextsiblingnull.xml
+8/806 attrnotspecifiedvalue.xml
+9/806 attrparentnodenull.xml
+10/806 attrprevioussiblingnull.xml
+11/806 attrsetvaluenomodificationallowederr.xml
+implementationAttribute expandEntityReferences not supported, skipping test
+12/806 attrsetvaluenomodificationallowederrEE.xml
+13/806 attrspecifiedvalue.xml
+14/806 attrspecifiedvaluechanged.xml
+15/806 attrspecifiedvalueremove.xml
+16/806 cdatasectiongetdata.xml
+implementationAttribute coalescing not supported, skipping test
+17/806 cdatasectionnormalize.xml
+18/806 characterdataappenddata.xml
+19/806 characterdataappenddatagetdata.xml
+20/806 characterdataappenddatanomodificationallowederr.xml
+21/806 characterdataappenddatanomodificationallowederrEE.xml
+22/806 characterdatadeletedatabegining.xml
+23/806 characterdatadeletedataend.xml
+24/806 characterdatadeletedataexceedslength.xml
+25/806 characterdatadeletedatagetlengthanddata.xml
+26/806 characterdatadeletedatamiddle.xml
+27/806 characterdatadeletedatanomodificationallowederrEE.xml
+28/806 characterdatagetdata.xml
+29/806 characterdatagetlength.xml
+30/806 characterdataindexsizeerrdeletedatacountnegative.xml
+implementationAttribute signed not supported, skipping test
+31/806 characterdataindexsizeerrdeletedataoffsetgreater.xml
+32/806 characterdataindexsizeerrdeletedataoffsetnegative.xml
+implementationAttribute signed not supported, skipping test
+33/806 characterdataindexsizeerrinsertdataoffsetgreater.xml
+34/806 characterdataindexsizeerrinsertdataoffsetnegative.xml
+implementationAttribute signed not supported, skipping test
+35/806 characterdataindexsizeerrreplacedatacountnegative.xml
+implementationAttribute signed not supported, skipping test
+36/806 characterdataindexsizeerrreplacedataoffsetgreater.xml
+37/806 characterdataindexsizeerrreplacedataoffsetnegative.xml
+implementationAttribute signed not supported, skipping test
+38/806 characterdataindexsizeerrsubstringcountnegative.xml
+implementationAttribute signed not supported, skipping test
+39/806 characterdataindexsizeerrsubstringnegativeoffset.xml
+implementationAttribute signed not supported, skipping test
+40/806 characterdataindexsizeerrsubstringoffsetgreater.xml
+41/806 characterdatainsertdatabeginning.xml
+42/806 characterdatainsertdataend.xml
+43/806 characterdatainsertdatamiddle.xml
+44/806 characterdatainsertdatanomodificationallowederr.xml
+45/806 characterdatainsertdatanomodificationallowederrEE.xml
+46/806 characterdatareplacedatabegining.xml
+47/806 characterdatareplacedataend.xml
+48/806 characterdatareplacedataexceedslengthofarg.xml
+49/806 characterdatareplacedataexceedslengthofdata.xml
+50/806 characterdatareplacedatamiddle.xml
+51/806 characterdatareplacedatanomodificationallowederr.xml
+52/806 characterdatareplacedatanomodificationallowederrEE.xml
+53/806 characterdatasetdatanomodificationallowederr.xml
+54/806 characterdatasetdatanomodificationallowederrEE.xml
+55/806 characterdatasetnodevalue.xml
+56/806 characterdatasubstringexceedsvalue.xml
+57/806 characterdatasubstringvalue.xml
+58/806 commentgetcomment.xml
+59/806 documentcreateattribute.xml
+60/806 documentcreatecdatasection.xml
+61/806 documentcreatecomment.xml
+62/806 documentcreatedocumentfragment.xml
+63/806 documentcreateelement.xml
+64/806 documentcreateelementcasesensitive.xml
+65/806 documentcreateelementdefaultattr.xml
+66/806 documentcreateentityreference.xml
+67/806 documentcreateentityreferenceknown.xml
+68/806 documentcreateprocessinginstruction.xml
+69/806 documentcreatetextnode.xml
+70/806 documentgetdoctype.xml
+71/806 documentgetdoctypenodtd.xml
+72/806 documentgetelementsbytagnamelength.xml
+73/806 documentgetelementsbytagnametotallength.xml
+74/806 documentgetelementsbytagnamevalue.xml
+75/806 documentgetimplementation.xml
+76/806 documentgetrootnode.xml
+77/806 documentinvalidcharacterexceptioncreateattribute.xml
+78/806 documentinvalidcharacterexceptioncreateelement.xml
+79/806 documentinvalidcharacterexceptioncreateentref.xml
+80/806 documentinvalidcharacterexceptioncreateentref1.xml
+81/806 documentinvalidcharacterexceptioncreatepi.xml
+82/806 documentinvalidcharacterexceptioncreatepi1.xml
+83/806 documenttypegetdoctype.xml
+84/806 documenttypegetentities.xml
+85/806 documenttypegetentitieslength.xml
+86/806 documenttypegetentitiestype.xml
+87/806 documenttypegetnotations.xml
+88/806 documenttypegetnotationstype.xml
+89/806 domimplementationfeaturenoversion.xml
+90/806 domimplementationfeaturenull.xml
+implementationAttribute hasNullString not supported, skipping test
+91/806 domimplementationfeaturexml.xml
+92/806 elementaddnewattribute.xml
+93/806 elementassociatedattribute.xml
+94/806 elementchangeattributevalue.xml
+95/806 elementcreatenewattribute.xml
+96/806 elementgetattributenode.xml
+97/806 elementgetattributenodenull.xml
+98/806 elementgetelementempty.xml
+99/806 elementgetelementsbytagname.xml
+100/806 elementgetelementsbytagnameaccessnodelist.xml
+101/806 elementgetelementsbytagnamenomatch.xml
+102/806 elementgetelementsbytagnamespecialvalue.xml
+103/806 elementgettagname.xml
+104/806 elementinuseattributeerr.xml
+105/806 elementinvalidcharacterexception.xml
+106/806 elementnormalize.xml
+107/806 elementnotfounderr.xml
+108/806 elementremoveattribute.xml
+109/806 elementremoveattributeaftercreate.xml
+110/806 elementremoveattributenode.xml
+111/806 elementremoveattributenodenomodificationallowederr.xml
+112/806 elementremoveattributenodenomodificationallowederrEE.xml
+113/806 elementremoveattributenomodificationallowederr.xml
+114/806 elementremoveattributenomodificationallowederrEE.xml
+115/806 elementremoveattributerestoredefaultvalue.xml
+116/806 elementreplaceattributewithself.xml
+117/806 elementreplaceexistingattribute.xml
+118/806 elementreplaceexistingattributegevalue.xml
+119/806 elementretrieveallattributes.xml
+120/806 elementretrieveattrvalue.xml
+121/806 elementretrievetagname.xml
+122/806 elementsetattributenodenomodificationallowederr.xml
+123/806 elementsetattributenodenomodificationallowederrEE.xml
+implementationAttribute expandEntityReferences not supported, skipping test
+124/806 elementsetattributenodenull.xml
+125/806 elementsetattributenomodificationallowederr.xml
+implementationAttribute expandEntityReferences not supported, skipping test
+126/806 elementsetattributenomodificationallowederrEE.xml
+127/806 elementwrongdocumenterr.xml
+128/806 entitygetentityname.xml
+129/806 entitygetpublicid.xml
+130/806 entitygetpublicidnull.xml
+131/806 namednodemapchildnoderange.xml
+132/806 namednodemapgetnameditem.xml
+133/806 namednodemapinuseattributeerr.xml
+134/806 namednodemapnotfounderr.xml
+135/806 namednodemapnumberofnodes.xml
+136/806 namednodemapremovenameditem.xml
+137/806 namednodemapremovenameditemgetvalue.xml
+138/806 namednodemapremovenameditemreturnnodevalue.xml
+139/806 namednodemapreturnattrnode.xml
+140/806 namednodemapreturnfirstitem.xml
+141/806 namednodemapreturnlastitem.xml
+142/806 namednodemapreturnnull.xml
+143/806 namednodemapsetnameditem.xml
+144/806 namednodemapsetnameditemreturnvalue.xml
+145/806 namednodemapsetnameditemthatexists.xml
+146/806 namednodemapsetnameditemwithnewvalue.xml
+147/806 namednodemapwrongdocumenterr.xml
+148/806 nodeappendchild.xml
+149/806 nodeappendchildchildexists.xml
+150/806 nodeappendchilddocfragment.xml
+151/806 nodeappendchildgetnodename.xml
+152/806 nodeappendchildinvalidnodetype.xml
+153/806 nodeappendchildnewchilddiffdocument.xml
+154/806 nodeappendchildnodeancestor.xml
+155/806 nodeappendchildnomodificationallowederr.xml
+156/806 nodeappendchildnomodificationallowederrEE.xml
+157/806 nodeattributenodeattribute.xml
+158/806 nodeattributenodename.xml
+159/806 nodeattributenodetype.xml
+160/806 nodeattributenodevalue.xml
+161/806 nodecdatasectionnodeattribute.xml
+162/806 nodecdatasectionnodename.xml
+163/806 nodecdatasectionnodetype.xml
+implementationAttribute coalescing not supported, skipping test
+164/806 nodecdatasectionnodevalue.xml
+implementationAttribute coalescing not supported, skipping test
+165/806 nodechildnodes.xml
+166/806 nodechildnodesappendchild.xml
+167/806 nodechildnodesempty.xml
+168/806 nodecloneattributescopied.xml
+169/806 nodeclonefalsenocopytext.xml
+170/806 nodeclonegetparentnull.xml
+171/806 nodeclonenodefalse.xml
+172/806 nodeclonenodetrue.xml
+173/806 nodeclonetruecopytext.xml
+174/806 nodecommentnodeattributes.xml
+175/806 nodecommentnodename.xml
+176/806 nodecommentnodetype.xml
+177/806 nodecommentnodevalue.xml
+178/806 nodedocumentfragmentnodename.xml
+179/806 nodedocumentfragmentnodetype.xml
+180/806 nodedocumentfragmentnodevalue.xml
+181/806 nodedocumentnodeattribute.xml
+182/806 nodedocumentnodename.xml
+183/806 nodedocumentnodetype.xml
+184/806 nodedocumentnodevalue.xml
+185/806 nodedocumenttypenodename.xml
+186/806 nodedocumenttypenodetype.xml
+187/806 nodedocumenttypenodevalue.xml
+188/806 nodeelementnodeattributes.xml
+189/806 nodeelementnodename.xml
+190/806 nodeelementnodetype.xml
+191/806 nodeelementnodevalue.xml
+192/806 nodeentitynodeattributes.xml
+193/806 nodeentitynodename.xml
+194/806 nodeentitynodetype.xml
+195/806 nodeentitynodevalue.xml
+196/806 nodeentitysetnodevalue.xml
+197/806 nodeentityreferencenodeattributes.xml
+198/806 nodeentityreferencenodename.xml
+199/806 nodeentityreferencenodetype.xml
+200/806 nodeentityreferencenodevalue.xml
+201/806 nodegetfirstchild.xml
+202/806 nodegetfirstchildnull.xml
+203/806 nodegetlastchild.xml
+204/806 nodegetlastchildnull.xml
+205/806 nodegetnextsibling.xml
+206/806 nodegetnextsiblingnull.xml
+207/806 nodegetownerdocument.xml
+208/806 nodegetownerdocumentnull.xml
+209/806 nodegetprevioussibling.xml
+210/806 nodegetprevioussiblingnull.xml
+211/806 nodehaschildnodes.xml
+212/806 nodehaschildnodesfalse.xml
+213/806 nodeinsertbefore.xml
+214/806 nodeinsertbeforedocfragment.xml
+215/806 nodeinsertbeforeinvalidnodetype.xml
+216/806 nodeinsertbeforenewchilddiffdocument.xml
+217/806 nodeinsertbeforenewchildexists.xml
+218/806 nodeinsertbeforenodeancestor.xml
+219/806 nodeinsertbeforenodename.xml
+220/806 nodeinsertbeforenomodificationallowederr.xml
+221/806 nodeinsertbeforenomodificationallowederrEE.xml
+222/806 nodeinsertbeforerefchildnonexistent.xml
+223/806 nodeinsertbeforerefchildnull.xml
+224/806 nodelistindexequalzero.xml
+225/806 nodelistindexgetlength.xml
+226/806 nodelistindexgetlengthofemptylist.xml
+227/806 nodelistindexnotzero.xml
+228/806 nodelistreturnfirstitem.xml
+229/806 nodelistreturnlastitem.xml
+230/806 nodelisttraverselist.xml
+231/806 nodenotationnodeattributes.xml
+232/806 nodenotationnodename.xml
+233/806 nodenotationnodetype.xml
+234/806 nodenotationnodevalue.xml
+235/806 nodeparentnode.xml
+236/806 nodeparentnodenull.xml
+237/806 nodeprocessinginstructionnodeattributes.xml
+238/806 nodeprocessinginstructionnodename.xml
+239/806 nodeprocessinginstructionnodetype.xml
+240/806 nodeprocessinginstructionnodevalue.xml
+241/806 nodeprocessinginstructionsetnodevalue.xml
+242/806 noderemovechild.xml
+243/806 noderemovechildgetnodename.xml
+244/806 noderemovechildnode.xml
+245/806 noderemovechildnomodificationallowederr.xml
+246/806 noderemovechildnomodificationallowederrEE.xml
+247/806 noderemovechildoldchildnonexistent.xml
+248/806 nodereplacechild.xml
+249/806 nodereplacechildinvalidnodetype.xml
+250/806 nodereplacechildnewchilddiffdocument.xml
+251/806 nodereplacechildnewchildexists.xml
+252/806 nodereplacechildnodeancestor.xml
+253/806 nodereplacechildnodename.xml
+254/806 nodereplacechildnomodificationallowederr.xml
+255/806 nodereplacechildnomodificationallowederrEE.xml
+256/806 nodereplacechildoldchildnonexistent.xml
+257/806 nodesetnodevaluenomodificationallowederr.xml
+258/806 nodesetnodevaluenomodificationallowederrEE.xml
+259/806 nodetextnodeattribute.xml
+260/806 nodetextnodename.xml
+261/806 nodetextnodetype.xml
+262/806 nodetextnodevalue.xml
+263/806 notationgetnotationname.xml
+264/806 notationgetpublicid.xml
+265/806 notationgetpublicidnull.xml
+266/806 notationgetsystemid.xml
+267/806 notationgetsystemidnull.xml
+268/806 processinginstructiongetdata.xml
+269/806 processinginstructiongettarget.xml
+270/806 processinginstructionsetdatanomodificationallowederr.xml
+implementationAttribute expandEntityReferences not supported, skipping test
+271/806 processinginstructionsetdatanomodificationallowederrEE.xml
+272/806 textindexsizeerrnegativeoffset.xml
+implementationAttribute signed not supported, skipping test
+273/806 textindexsizeerroffsetoutofbounds.xml
+274/806 textparseintolistofelements.xml
+275/806 textsplittextfour.xml
+276/806 textsplittextnomodificationallowederr.xml
+277/806 textsplittextnomodificationallowederrEE.xml
+278/806 textsplittextone.xml
+279/806 textsplittextthree.xml
+280/806 textsplittexttwo.xml
+281/806 textwithnomarkup.xml
+282/806 nodevalue01.xml
+283/806 nodevalue02.xml
+284/806 nodevalue03.xml
+285/806 nodevalue04.xml
+286/806 nodevalue05.xml
+287/806 nodevalue06.xml
+288/806 nodevalue07.xml
+289/806 nodevalue08.xml
+290/806 nodevalue09.xml
+291/806 hc_attrcreatedocumentfragment.xml
+292/806 hc_attrcreatetextnode.xml
+293/806 hc_attrcreatetextnode2.xml
+294/806 hc_attreffectivevalue.xml
+295/806 hc_attrname.xml
+296/806 hc_attrnextsiblingnull.xml
+297/806 hc_attrparentnodenull.xml
+298/806 hc_attrprevioussiblingnull.xml
+299/806 hc_attrspecifiedvalue.xml
+300/806 hc_attrspecifiedvaluechanged.xml
+301/806 hc_characterdataappenddata.xml
+302/806 hc_characterdataappenddatagetdata.xml
+303/806 hc_characterdatadeletedatabegining.xml
+304/806 hc_characterdatadeletedataend.xml
+305/806 hc_characterdatadeletedataexceedslength.xml
+306/806 hc_characterdatadeletedatagetlengthanddata.xml
+307/806 hc_characterdatadeletedatamiddle.xml
+308/806 hc_characterdatagetdata.xml
+309/806 hc_characterdatagetlength.xml
+310/806 hc_characterdataindexsizeerrdeletedatacountnegative.xml
+implementationAttribute signed not supported, skipping test
+311/806 hc_characterdataindexsizeerrdeletedataoffsetgreater.xml
+312/806 hc_characterdataindexsizeerrdeletedataoffsetnegative.xml
+implementationAttribute signed not supported, skipping test
+313/806 hc_characterdataindexsizeerrinsertdataoffsetgreater.xml
+314/806 hc_characterdataindexsizeerrinsertdataoffsetnegative.xml
+implementationAttribute signed not supported, skipping test
+315/806 hc_characterdataindexsizeerrreplacedatacountnegative.xml
+implementationAttribute signed not supported, skipping test
+316/806 hc_characterdataindexsizeerrreplacedataoffsetgreater.xml
+317/806 hc_characterdataindexsizeerrreplacedataoffsetnegative.xml
+implementationAttribute signed not supported, skipping test
+318/806 hc_characterdataindexsizeerrsubstringcountnegative.xml
+implementationAttribute signed not supported, skipping test
+319/806 hc_characterdataindexsizeerrsubstringnegativeoffset.xml
+implementationAttribute signed not supported, skipping test
+320/806 hc_characterdataindexsizeerrsubstringoffsetgreater.xml
+321/806 hc_characterdatainsertdatabeginning.xml
+322/806 hc_characterdatainsertdataend.xml
+323/806 hc_characterdatainsertdatamiddle.xml
+324/806 hc_characterdatareplacedatabegining.xml
+325/806 hc_characterdatareplacedataend.xml
+326/806 hc_characterdatareplacedataexceedslengthofarg.xml
+327/806 hc_characterdatareplacedataexceedslengthofdata.xml
+328/806 hc_characterdatareplacedatamiddle.xml
+329/806 hc_characterdatasetnodevalue.xml
+330/806 hc_characterdatasubstringexceedsvalue.xml
+331/806 hc_characterdatasubstringvalue.xml
+332/806 hc_commentgetcomment.xml
+333/806 hc_documentcreateattribute.xml
+334/806 hc_documentcreatecomment.xml
+335/806 hc_documentcreatedocumentfragment.xml
+336/806 hc_documentcreateelement.xml
+337/806 hc_documentcreateelementcasesensitive.xml
+338/806 hc_documentcreatetextnode.xml
+339/806 hc_documentgetdoctype.xml
+340/806 hc_documentgetelementsbytagnamelength.xml
+341/806 hc_documentgetelementsbytagnametotallength.xml
+342/806 hc_documentgetelementsbytagnamevalue.xml
+343/806 hc_documentgetimplementation.xml
+344/806 hc_documentgetrootnode.xml
+345/806 hc_documentinvalidcharacterexceptioncreateattribute.xml
+346/806 hc_documentinvalidcharacterexceptioncreateattribute1.xml
+347/806 hc_documentinvalidcharacterexceptioncreateelement.xml
+348/806 hc_documentinvalidcharacterexceptioncreateelement1.xml
+349/806 hc_domimplementationfeaturenoversion.xml
+350/806 hc_domimplementationfeaturenull.xml
+implementationAttribute hasNullString not supported, skipping test
+351/806 hc_domimplementationfeaturexml.xml
+352/806 hc_elementaddnewattribute.xml
+353/806 hc_elementassociatedattribute.xml
+354/806 hc_elementchangeattributevalue.xml
+355/806 hc_elementcreatenewattribute.xml
+356/806 hc_elementgetattributenode.xml
+357/806 hc_elementgetattributenodenull.xml
+358/806 hc_elementgetelementempty.xml
+359/806 hc_elementgetelementsbytagname.xml
+360/806 hc_elementgetelementsbytagnameaccessnodelist.xml
+361/806 hc_elementgetelementsbytagnamenomatch.xml
+362/806 hc_elementgetelementsbytagnamespecialvalue.xml
+363/806 hc_elementgettagname.xml
+364/806 hc_elementinuseattributeerr.xml
+365/806 hc_elementinvalidcharacterexception.xml
+366/806 hc_elementinvalidcharacterexception1.xml
+367/806 hc_elementnormalize.xml
+368/806 hc_elementnotfounderr.xml
+369/806 hc_elementremoveattribute.xml
+370/806 hc_elementremoveattributeaftercreate.xml
+371/806 hc_elementremoveattributenode.xml
+372/806 hc_elementreplaceattributewithself.xml
+373/806 hc_elementreplaceexistingattribute.xml
+374/806 hc_elementreplaceexistingattributegevalue.xml
+375/806 hc_elementretrieveallattributes.xml
+376/806 hc_elementretrieveattrvalue.xml
+377/806 hc_elementretrievetagname.xml
+378/806 hc_elementsetattributenodenull.xml
+379/806 hc_elementwrongdocumenterr.xml
+380/806 hc_entitiesremovenameditem1.xml
+381/806 hc_entitiessetnameditem1.xml
+382/806 hc_namednodemapchildnoderange.xml
+383/806 hc_namednodemapgetnameditem.xml
+384/806 hc_namednodemapinuseattributeerr.xml
+385/806 hc_namednodemapnotfounderr.xml
+386/806 hc_namednodemapnumberofnodes.xml
+387/806 hc_namednodemapremovenameditem.xml
+388/806 hc_namednodemapreturnattrnode.xml
+389/806 hc_namednodemapreturnfirstitem.xml
+390/806 hc_namednodemapreturnlastitem.xml
+391/806 hc_namednodemapreturnnull.xml
+392/806 hc_namednodemapsetnameditem.xml
+393/806 hc_namednodemapsetnameditemreturnvalue.xml
+394/806 hc_namednodemapsetnameditemthatexists.xml
+395/806 hc_namednodemapsetnameditemwithnewvalue.xml
+396/806 hc_namednodemapwrongdocumenterr.xml
+397/806 hc_nodeappendchild.xml
+398/806 hc_nodeappendchildchildexists.xml
+399/806 hc_nodeappendchilddocfragment.xml
+400/806 hc_nodeappendchildgetnodename.xml
+401/806 hc_nodeappendchildinvalidnodetype.xml
+402/806 hc_nodeappendchildnewchilddiffdocument.xml
+403/806 hc_nodeappendchildnodeancestor.xml
+404/806 hc_nodeattributenodeattribute.xml
+405/806 hc_nodeattributenodename.xml
+406/806 hc_nodeattributenodetype.xml
+407/806 hc_nodeattributenodevalue.xml
+408/806 hc_nodechildnodes.xml
+409/806 hc_nodechildnodesappendchild.xml
+410/806 hc_nodechildnodesempty.xml
+411/806 hc_nodecloneattributescopied.xml
+412/806 hc_nodeclonefalsenocopytext.xml
+413/806 hc_nodeclonegetparentnull.xml
+414/806 hc_nodeclonenodefalse.xml
+415/806 hc_nodeclonenodetrue.xml
+416/806 hc_nodeclonetruecopytext.xml
+417/806 hc_nodecommentnodeattributes.xml
+418/806 hc_nodecommentnodename.xml
+419/806 hc_nodecommentnodetype.xml
+420/806 hc_nodecommentnodevalue.xml
+421/806 hc_nodedocumentfragmentnodename.xml
+422/806 hc_nodedocumentfragmentnodetype.xml
+423/806 hc_nodedocumentfragmentnodevalue.xml
+424/806 hc_nodedocumentnodeattribute.xml
+425/806 hc_nodedocumentnodename.xml
+426/806 hc_nodedocumentnodetype.xml
+427/806 hc_nodedocumentnodevalue.xml
+428/806 hc_nodeelementnodeattributes.xml
+429/806 hc_nodeelementnodename.xml
+430/806 hc_nodeelementnodetype.xml
+431/806 hc_nodeelementnodevalue.xml
+432/806 hc_nodegetfirstchild.xml
+433/806 hc_nodegetfirstchildnull.xml
+434/806 hc_nodegetlastchild.xml
+435/806 hc_nodegetlastchildnull.xml
+436/806 hc_nodegetnextsibling.xml
+437/806 hc_nodegetnextsiblingnull.xml
+438/806 hc_nodegetownerdocument.xml
+439/806 hc_nodegetownerdocumentnull.xml
+440/806 hc_nodegetprevioussibling.xml
+441/806 hc_nodegetprevioussiblingnull.xml
+442/806 hc_nodehaschildnodes.xml
+443/806 hc_nodehaschildnodesfalse.xml
+444/806 hc_nodeinsertbefore.xml
+445/806 hc_nodeinsertbeforedocfragment.xml
+446/806 hc_nodeinsertbeforeinvalidnodetype.xml
+447/806 hc_nodeinsertbeforenewchilddiffdocument.xml
+448/806 hc_nodeinsertbeforenewchildexists.xml
+449/806 hc_nodeinsertbeforenodeancestor.xml
+450/806 hc_nodeinsertbeforenodename.xml
+451/806 hc_nodeinsertbeforerefchildnonexistent.xml
+452/806 hc_nodeinsertbeforerefchildnull.xml
+453/806 hc_nodelistindexequalzero.xml
+454/806 hc_nodelistindexgetlength.xml
+455/806 hc_nodelistindexgetlengthofemptylist.xml
+456/806 hc_nodelistindexnotzero.xml
+457/806 hc_nodelistreturnfirstitem.xml
+458/806 hc_nodelistreturnlastitem.xml
+459/806 hc_nodelisttraverselist.xml
+460/806 hc_nodeparentnode.xml
+461/806 hc_nodeparentnodenull.xml
+462/806 hc_noderemovechild.xml
+463/806 hc_noderemovechildgetnodename.xml
+464/806 hc_noderemovechildnode.xml
+465/806 hc_noderemovechildoldchildnonexistent.xml
+466/806 hc_nodereplacechild.xml
+467/806 hc_nodereplacechildinvalidnodetype.xml
+468/806 hc_nodereplacechildnewchilddiffdocument.xml
+469/806 hc_nodereplacechildnodeancestor.xml
+470/806 hc_nodereplacechildnodename.xml
+471/806 hc_nodereplacechildoldchildnonexistent.xml
+472/806 hc_nodetextnodeattribute.xml
+473/806 hc_nodetextnodename.xml
+474/806 hc_nodetextnodetype.xml
+475/806 hc_nodetextnodevalue.xml
+476/806 hc_nodevalue01.xml
+477/806 hc_nodevalue02.xml
+478/806 hc_nodevalue03.xml
+479/806 hc_nodevalue04.xml
+480/806 hc_nodevalue05.xml
+481/806 hc_nodevalue06.xml
+482/806 hc_nodevalue07.xml
+483/806 hc_nodevalue08.xml
+484/806 hc_notationsremovenameditem1.xml
+485/806 hc_notationssetnameditem1.xml
+486/806 hc_textindexsizeerrnegativeoffset.xml
+implementationAttribute signed not supported, skipping test
+487/806 hc_textindexsizeerroffsetoutofbounds.xml
+488/806 hc_textparseintolistofelements.xml
+489/806 hc_textsplittextfour.xml
+490/806 hc_textsplittextone.xml
+491/806 hc_textsplittextthree.xml
+492/806 hc_textsplittexttwo.xml
+493/806 hc_textwithnomarkup.xml
+494/806 hc_attrappendchild1.xml
+495/806 hc_attrappendchild2.xml
+496/806 hc_attrappendchild3.xml
+497/806 hc_attrappendchild4.xml
+498/806 hc_attrappendchild5.xml
+499/806 hc_attrappendchild6.xml
+500/806 hc_attrchildnodes1.xml
+501/806 hc_attrchildnodes2.xml
+502/806 hc_attrclonenode1.xml
+503/806 hc_attrfirstchild.xml
+504/806 hc_attrgetvalue1.xml
+505/806 hc_attrgetvalue2.xml
+506/806 hc_attrhaschildnodes.xml
+507/806 hc_attrinsertbefore1.xml
+508/806 hc_attrinsertbefore2.xml
+509/806 hc_attrinsertbefore3.xml
+510/806 hc_attrinsertbefore4.xml
+511/806 hc_attrinsertbefore5.xml
+512/806 hc_attrinsertbefore6.xml
+513/806 hc_attrinsertbefore7.xml
+514/806 hc_attrlastchild.xml
+515/806 hc_attrnormalize.xml
+516/806 hc_attrremovechild1.xml
+517/806 hc_attrremovechild2.xml
+518/806 hc_attrreplacechild1.xml
+519/806 hc_attrreplacechild2.xml
+520/806 hc_attrsetvalue1.xml
+521/806 hc_attrsetvalue2.xml
+522/806 attrremovechild1.xml
+523/806 attrreplacechild1.xml
+
+#P"/home/david/2001/DOM-Test-Suite/tests/level2/core/"
+524/806 attrgetownerelement01.xml
+525/806 attrgetownerelement02.xml
+526/806 attrgetownerelement03.xml
+527/806 attrgetownerelement04.xml
+528/806 attrgetownerelement05.xml
+529/806 createAttributeNS01.xml
+530/806 createAttributeNS02.xml
+531/806 createAttributeNS03.xml
+532/806 createAttributeNS04.xml
+533/806 createAttributeNS05.xml
+534/806 createAttributeNS06.xml
+535/806 createDocument01.xml
+536/806 createDocument02.xml
+537/806 createDocument03.xml
+538/806 createDocument04.xml
+539/806 createDocument05.xml
+540/806 createDocument06.xml
+541/806 createDocument07.xml
+542/806 createDocument08.xml
+543/806 createDocumentType01.xml
+544/806 createDocumentType02.xml
+545/806 createDocumentType03.xml
+546/806 createDocumentType04.xml
+547/806 createElementNS01.xml
+548/806 createElementNS02.xml
+549/806 createElementNS03.xml
+550/806 createElementNS04.xml
+551/806 createElementNS05.xml
+552/806 documentcreateattributeNS01.xml
+553/806 documentcreateattributeNS02.xml
+554/806 documentcreateattributeNS03.xml
+555/806 documentcreateattributeNS04.xml
+556/806 documentcreateattributeNS05.xml
+557/806 documentcreateattributeNS06.xml
+558/806 documentcreateattributeNS07.xml
+559/806 documentcreateelementNS01.xml
+560/806 documentcreateelementNS02.xml
+561/806 documentcreateelementNS05.xml
+562/806 documentcreateelementNS06.xml
+563/806 documentgetelementbyid01.xml
+564/806 documentgetelementsbytagnameNS01.xml
+565/806 documentgetelementsbytagnameNS02.xml
+566/806 documentgetelementsbytagnameNS03.xml
+567/806 documentgetelementsbytagnameNS04.xml
+568/806 documentgetelementsbytagnameNS05.xml
+569/806 documentimportnode01.xml
+570/806 documentimportnode02.xml
+571/806 documentimportnode03.xml
+572/806 documentimportnode04.xml
+573/806 documentimportnode05.xml
+574/806 documentimportnode06.xml
+575/806 documentimportnode07.xml
+576/806 documentimportnode08.xml
+577/806 documentimportnode09.xml
+578/806 documentimportnode10.xml
+579/806 documentimportnode11.xml
+580/806 documentimportnode12.xml
+581/806 documentimportnode13.xml
+582/806 documentimportnode14.xml
+583/806 documentimportnode15.xml
+584/806 documentimportnode17.xml
+585/806 documentimportnode18.xml
+586/806 documentimportnode19.xml
+587/806 documentimportnode20.xml
+implementationAttribute expandEntityReferences not supported, skipping test
+588/806 documentimportnode21.xml
+implementationAttribute expandEntityReferences not supported, skipping test
+589/806 documentimportnode22.xml
+590/806 documenttypeinternalSubset01.xml
+591/806 documenttypepublicid01.xml
+592/806 documenttypesystemid01.xml
+593/806 domimplementationcreatedocument03.xml
+594/806 domimplementationcreatedocument04.xml
+595/806 domimplementationcreatedocument05.xml
+596/806 domimplementationcreatedocument07.xml
+597/806 domimplementationcreatedocumenttype01.xml
+598/806 domimplementationcreatedocumenttype02.xml
+599/806 domimplementationcreatedocumenttype04.xml
+600/806 domimplementationfeaturecore.xml
+601/806 domimplementationfeaturexmlversion2.xml
+602/806 domimplementationhasfeature01.xml
+603/806 domimplementationhasfeature02.xml
+604/806 elementgetattributenodens01.xml
+605/806 elementgetattributenodens02.xml
+606/806 elementgetattributenodens03.xml
+607/806 elementgetattributens02.xml
+608/806 elementgetelementsbytagnamens02.xml
+609/806 elementgetelementsbytagnamens04.xml
+610/806 elementgetelementsbytagnamens05.xml
+611/806 elementhasattribute01.xml
+612/806 elementhasattribute02.xml
+613/806 elementhasattribute03.xml
+614/806 elementhasattribute04.xml
+615/806 elementhasattributens01.xml
+616/806 elementhasattributens02.xml
+617/806 elementhasattributens03.xml
+618/806 elementremoveattributens01.xml
+619/806 elementsetattributenodens01.xml
+620/806 elementsetattributenodens02.xml
+621/806 elementsetattributenodens03.xml
+622/806 elementsetattributenodens04.xml
+623/806 elementsetattributenodens05.xml
+624/806 elementsetattributenodens06.xml
+implementationAttribute expandEntityReferences not supported, skipping test
+625/806 elementsetattributens01.xml
+626/806 elementsetattributens02.xml
+627/806 elementsetattributens03.xml
+628/806 elementsetattributens04.xml
+629/806 elementsetattributens05.xml
+630/806 elementsetattributens08.xml
+631/806 elementsetattributensurinull.xml
+632/806 getAttributeNS01.xml
+633/806 getAttributeNS02.xml
+634/806 getAttributeNS03.xml
+635/806 getAttributeNS04.xml
+636/806 getAttributeNS05.xml
+637/806 getAttributeNodeNS01.xml
+638/806 getAttributeNodeNS02.xml
+639/806 getElementById01.xml
+640/806 getElementById02.xml
+641/806 getElementsByTagNameNS01.xml
+642/806 getElementsByTagNameNS02.xml
+643/806 getElementsByTagNameNS03.xml
+644/806 getElementsByTagNameNS04.xml
+645/806 getElementsByTagNameNS05.xml
+646/806 getElementsByTagNameNS06.xml
+647/806 getElementsByTagNameNS07.xml
+648/806 getElementsByTagNameNS08.xml
+649/806 getElementsByTagNameNS09.xml
+650/806 getElementsByTagNameNS10.xml
+651/806 getElementsByTagNameNS11.xml
+652/806 getElementsByTagNameNS12.xml
+653/806 getElementsByTagNameNS13.xml
+654/806 getElementsByTagNameNS14.xml
+655/806 getNamedItemNS01.xml
+656/806 getNamedItemNS02.xml
+657/806 getNamedItemNS03.xml
+658/806 getNamedItemNS04.xml
+659/806 hasAttribute01.xml
+660/806 hasAttribute02.xml
+661/806 hasAttribute03.xml
+662/806 hasAttribute04.xml
+663/806 hasAttributeNS01.xml
+664/806 hasAttributeNS02.xml
+665/806 hasAttributeNS03.xml
+666/806 hasAttributeNS04.xml
+667/806 hasAttributeNS05.xml
+668/806 hasAttributes01.xml
+669/806 hasAttributes02.xml
+670/806 hc_entitiesremovenameditemns1.xml
+671/806 hc_entitiessetnameditemns1.xml
+672/806 hc_namednodemapinvalidtype1.xml
+673/806 hc_nodedocumentfragmentnormalize1.xml
+674/806 hc_nodedocumentfragmentnormalize2.xml
+675/806 hc_notationsremovenameditemns1.xml
+676/806 hc_notationssetnameditemns1.xml
+677/806 importNode01.xml
+678/806 importNode02.xml
+679/806 importNode03.xml
+680/806 importNode04.xml
+681/806 importNode05.xml
+682/806 importNode06.xml
+683/806 importNode07.xml
+684/806 importNode08.xml
+685/806 importNode09.xml
+686/806 importNode10.xml
+687/806 importNode11.xml
+688/806 importNode12.xml
+689/806 importNode13.xml
+690/806 importNode14.xml
+691/806 importNode15.xml
+692/806 importNode16.xml
+693/806 importNode17.xml
+694/806 internalSubset01.xml
+695/806 isSupported01.xml
+696/806 isSupported02.xml
+697/806 isSupported04.xml
+698/806 isSupported05.xml
+699/806 isSupported06.xml
+700/806 isSupported07.xml
+701/806 isSupported09.xml
+702/806 isSupported10.xml
+703/806 isSupported11.xml
+704/806 isSupported12.xml
+705/806 isSupported13.xml
+706/806 isSupported14.xml
+707/806 localName01.xml
+708/806 localName02.xml
+709/806 localName03.xml
+710/806 localName04.xml
+711/806 namednodemapgetnameditemns01.xml
+712/806 namednodemapgetnameditemns02.xml
+713/806 namednodemapgetnameditemns03.xml
+714/806 namednodemapgetnameditemns04.xml
+715/806 namednodemapgetnameditemns05.xml
+716/806 namednodemapgetnameditemns06.xml
+717/806 namednodemapremovenameditemns01.xml
+718/806 namednodemapremovenameditemns02.xml
+719/806 namednodemapremovenameditemns03.xml
+720/806 namednodemapremovenameditemns04.xml
+721/806 namednodemapremovenameditemns05.xml
+722/806 namednodemapremovenameditemns06.xml
+723/806 namednodemapremovenameditemns07.xml
+724/806 namednodemapremovenameditemns08.xml
+725/806 namednodemapremovenameditemns09.xml
+726/806 namednodemapsetnameditemns01.xml
+727/806 namednodemapsetnameditemns02.xml
+728/806 namednodemapsetnameditemns03.xml
+729/806 namednodemapsetnameditemns04.xml
+730/806 namednodemapsetnameditemns05.xml
+731/806 namednodemapsetnameditemns06.xml
+732/806 namednodemapsetnameditemns07.xml
+733/806 namednodemapsetnameditemns08.xml
+734/806 namednodemapsetnameditemns09.xml
+735/806 namednodemapsetnameditemns10.xml
+736/806 namednodemapsetnameditemns11.xml
+737/806 namespaceURI01.xml
+738/806 namespaceURI02.xml
+739/806 namespaceURI03.xml
+740/806 namespaceURI04.xml
+741/806 nodegetlocalname03.xml
+742/806 nodegetnamespaceuri03.xml
+743/806 nodegetownerdocument01.xml
+744/806 nodegetownerdocument02.xml
+745/806 nodegetprefix03.xml
+746/806 nodehasattributes01.xml
+747/806 nodehasattributes02.xml
+748/806 nodehasattributes03.xml
+749/806 nodehasattributes04.xml
+750/806 nodeissupported01.xml
+751/806 nodeissupported02.xml
+752/806 nodeissupported03.xml
+753/806 nodeissupported04.xml
+754/806 nodeissupported05.xml
+755/806 nodenormalize01.xml
+756/806 nodesetprefix01.xml
+757/806 nodesetprefix02.xml
+758/806 nodesetprefix03.xml
+759/806 nodesetprefix04.xml
+760/806 nodesetprefix05.xml
+761/806 nodesetprefix06.xml
+762/806 nodesetprefix07.xml
+763/806 nodesetprefix08.xml
+764/806 nodesetprefix09.xml
+765/806 normalize01.xml
+766/806 ownerDocument01.xml
+767/806 ownerElement01.xml
+768/806 ownerElement02.xml
+769/806 prefix01.xml
+770/806 prefix02.xml
+771/806 prefix03.xml
+772/806 prefix04.xml
+773/806 prefix05.xml
+774/806 prefix06.xml
+775/806 prefix07.xml
+776/806 prefix08.xml
+777/806 prefix09.xml
+778/806 prefix10.xml
+779/806 prefix11.xml
+780/806 publicId01.xml
+781/806 removeAttributeNS01.xml
+782/806 removeAttributeNS02.xml
+783/806 removeNamedItemNS01.xml
+784/806 removeNamedItemNS02.xml
+785/806 removeNamedItemNS03.xml
+786/806 setAttributeNS01.xml
+787/806 setAttributeNS02.xml
+788/806 setAttributeNS03.xml
+789/806 setAttributeNS04.xml
+790/806 setAttributeNS05.xml
+791/806 setAttributeNS06.xml
+792/806 setAttributeNS07.xml
+793/806 setAttributeNS09.xml
+794/806 setAttributeNS10.xml
+795/806 setAttributeNodeNS01.xml
+796/806 setAttributeNodeNS02.xml
+implementationAttribute expandEntityReferences not supported, skipping test
+797/806 setAttributeNodeNS03.xml
+798/806 setAttributeNodeNS04.xml
+799/806 setAttributeNodeNS05.xml
+800/806 setNamedItemNS01.xml
+801/806 setNamedItemNS02.xml
+802/806 setNamedItemNS03.xml
+803/806 setNamedItemNS04.xml
+804/806 setNamedItemNS05.xml
+805/806 systemId01.xml
+0/763 tests failed; 43 tests were skipped
\ No newline at end of file
Added: branches/grin-neu/thirdparty/cxml/GNUmakefile
===================================================================
--- branches/grin-neu/thirdparty/cxml/GNUmakefile 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/cxml/GNUmakefile 2006-12-01 10:39:49 UTC (rev 2094)
@@ -0,0 +1,8 @@
+all:
+ @echo no such target
+ @exit 1
+
+.PHONY: clean
+clean:
+ touch dummy.fasl
+ find . \( -name \*.fasl -o -name \*.x86f \) -print0 | xargs -0 rm
Added: branches/grin-neu/thirdparty/cxml/OLDNEWS
===================================================================
--- branches/grin-neu/thirdparty/cxml/OLDNEWS 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/cxml/OLDNEWS 2006-12-01 10:39:49 UTC (rev 2094)
@@ -0,0 +1,272 @@
+Changes to Gilbert Baumann's Code
+========================================
+(Stand dieser Liste: patch-190)
+
+base-0
+ Import of Closure's src/xml and src/glisp
+
+
+Build system
+----------------
+patch-14
+ dom-builder.lsp braucht package.lisp
+patch-17
+ xml-parse braucht dom-impl
+patch-18
+ xml-parse braucht encodings
+patch-19
+ xml-parse.lisp needs xml-stream.lisp
+patch-157
+ DOM in eigenes Verzeichnis und System verschoben
+patch-158
+ COPYING auch im DOM
+patch-160
+ tests in eigenes Verzeichnis verschoben
+patch-184
+ commented out most of dep-clisp for now
+patch-185
+ CLISP fixes
+
+
+glisp durch runes ersetzt
+----------------
+patch-139 patch-140 patch-141 patch-142 patch-143
+ unbenutzte Funktionen aus glisp entfernt
+ GLISP keine COMMON-LISP-Symbole mehr exportieren lassen
+ glisp defpackage weiter vereinfacht
+patch-148
+ runes.lisp aufgeteilt in runes.lisp und syntax.lisp
+patch-149
+ CHARACTER-basierte Runen-Implementation
+patch-150
+ removed support for oldish gcl
+patch-151
+ removed dep-gcl-2.lisp
+patch-152
+ clarified glisp license as LLGPL as per Gilbert Baumann
+patch-155
+ GLISP in RUNES umbenannt
+patch-156
+ xstream (und encoding) nach runes verschoben
+patch-178
+patch-180
+ really fixed rune-char
+
+
+DOM fixes
+----------------
+patch-3
+ add dom:remove-child, dom:import-node
+patch-6
+ fixed dom:remove-child
+patch-7
+ strings->rods in set-attribute, too
+patch-21
+ dom:item und dom:length fuer NodeList implementiert
+patch-22
+ s/remove-atttribute/remove-attribute
+patch-23
+ dom:remove-attribute-node korrigiert
+patch-24
+ neu: dom:remove-attribute
+patch-25
+ dom:normalize implementiert
+patch-26
+ get-elements-by-tag-name fuer Element implementiert
+patch-32
+ s/data/value/ fuer CHARACTER-DATA
+patch-33
+ Aufruf von Setter-Methoden
+patch-34
+ (setf value) nachgetragen
+patch-35
+ (DOM:NODE-VALUE ATTRIBUTE) korrigiert
+patch-36
+ writer fuer DOM:DATA
+patch-37
+ (setf dom:node-value) implementiert
+patch-43
+ hack: implemented CHILD-NODES for ENTITY-REFERENCE
+patch-44
+ ENTITY-REFERENCE-Kinder als read-only markieren
+patch-45
+ DOM-EXCEPTION implementiert
+patch-46
+ fixed special cases in delete-data and replace-data
+patch-47
+ delete-data: Arraytyp korrigiert
+patch-48
+ DOM:INSERT-DATA implementiert
+patch-49
+ bugfix: replace-data for count != (length arg)
+patch-50
+ patch-46 nachgebessert: offset == length ist OK
+patch-51
+ fixed special cases in dom:substring-data
+patch-52
+ fixed patch-36, my (setf dom:data) implementation was bogus
+patch-55
+ temporary fix: attributes are created with value ""
+patch-58
+ START-DTD, END-DTD, DOCUMENT-TYPE initialisation
+patch-60
+ neu: CLONE-NODE
+patch-65, patch-66
+ verify attribute name syntax in createAttribute
+patch-67
+ more NAME syntax checks: CREATE-ELEMENT, SET-ATTRIBUTE
+patch-68
+ CREATE-ATTRIBUTE: set SPECIFIED to true
+patch-69, patch-70
+ INUSE_ATTRIBUTE_ERR
+patch-71
+ hacked my resolve-entity function to return NIL for undefined entities
+patch-72
+ INVALID_CHARACTER_ERR in create-entity-reference, too
+patch-73
+ Implement no-op methods on (setf node-value) where required...
+patch-74
+ fixed get-elements-by-tag-name not to include the argument itself
+patch-76, patch-77
+ implemented DOM:SPLIT-TEXT
+patch-80
+ noch unfertig: initialisiere dom:enitities richtig, erzeuge Entity-Knoten
+patch-82
+ dom:notations fuellen
+patch-85
+ WRONG_DOCUMENT_ERR auch in set-attribute-node
+patch-86
+ WRONG_DOCUMENT_ERR nicht nur in set-attribute-node, sondern prinzipiell in set-named-item
+patch-91
+ :NOT_FOUND_ERR in remove-named-item
+patch-94
+ can-adopt-p implementiert
+patch-95
+ ENSURE-VALID-INSERTION-REQUEST korrigiert
+patch-96
+ normalize korrigiert: cdata-section nicht beruehren
+patch-98
+ DOCUMENTs have owner NIL
+patch-101
+ (setf dom:data) fuer PI korrigiert
+patch-102
+ NOT_FOUND_ERR in REMOVE-CHILD
+patch-104
+ oops, split-text korrigiert
+patch-106
+ NOT_FOUND_ERROR in removeAttributeNode sucht das Objekt, nicht seinen Namen
+patch-107, patch-113
+ Defaultwert fuer fehlende Attribute ist der leere Rod-String, nicht NIL
+patch-118
+ entity und notation maps sind read-only
+patch-119
+ dom:item liefert NIL bei ungueltigem index
+patch-120, patch-122, patch-124
+ NodeList reimplementiert
+patch-121
+ NAMED-NODE-MAP muss auch auf HIERARCHY_REQUEST_ERR pruefen...
+patch-128
+ ATTRIBUTE hat jetzt Kinder
+patch-129
+ auch Attribute normalisieren
+patch-130
+ (setf dom:value) auf einem Attribut darf ein etwaiges Kinderobjekt nicht wiederverwenden
+patch-131
+ replace-child fuer document-fragment implementiert
+patch-132
+ CAN-ADOPT-P fuer Parent ATTRIBUTE und Kind CDATA-SECTION korrigiert
+patch-133
+ DOCUMENT darf nur jeweils ein ELEMENT- und DOCTYPE-Kind haben
+patch-137
+ neu: map-node-list, do-node-list. ensure-valid-insertion-request korrigiert
+patch-165
+ ANSI conformance fix in MOVE
+patch-181
+ ignore fill-pointers in MOVE
+
+xml-parse.lisp changes
+----------------
+patch-5
+ (assert (eql initial-speed 1)) in make-xstream
+patch-20
+ added a forward declaration for *namespace-bindings*
+patch-39
+ fix for thread safety in p/document
+patch-41
+ Warnung ueber (nicht) redefinierte Attribute abschalten koennen
+patch-54
+ call sax:comment; create comment nodes
+patch-89
+ public-id und system-id der Entities uebergeben
+patch-100
+ Die XML Deklaration ist keine Processing Instruction.
+patch-146
+ SAX-Aufrufe korrigiert fuer DTD ohne ID; Entitydeklaration mit SYSTEM ID
+patch-166
+ added missing format argument in internal-entity-expansion
+patch-172
+ fixed rod type in appenddata
+patch-174
+ reordered definitions to avoid forward references
+patch-177
+ more SBCL warnings removed
+patch-188
+ new function parse-octets
+(See also: patch-58, patch-80, patch-82)
+
+
+DOM-Builder und SAX-Interface
+----------------
+patch-57
+ Warnungen beseitigt ("undefined variable")
+patch-75
+ fixed PARENT slot initialization and added a rant about the current implementation
+patch-97
+ CDATA sections bauen
+patch-136
+ normalisierte Elemente bauen
+
+(See also: patch-58, patch-80, patch-82, patch-86, patch-118, patch-120)
+
+
+unparse
+----------------
+patch-2
+ export UNPARSE-DOCUMENT
+patch-144
+ Kommentare verstehen (und nicht ausgeben)
+patch-189
+ new function UNPARSE-DOCUMENT-TO-OCTETS
+
+
+Misc.
+----------------
+patch-9
+ print elements with their tag-name
+patch-11
+ print attributes with name and value
+
+patch-138
+ workaround, need to revert this later
+
+patch-10 reverted by patch-12
+patch-114 reverted by patch-115
+patch-63 reverted by patch-134
+patch-4 patch-38 patch-87 patch-90 patch-103 reverted by patch-154
+patch-154 STRING-DOM nicht mehr verwenden. File ist aber noch da.
+
+
+domtest.cl
+----------------
+patch-27 patch-28 patch-29 patch-30 patch-31 patch-40 patch-42 patch-53
+patch-59 patch-61 patch-62 patch-64 patch-78 patch-79 patch-83 patch-84
+patch-88 patch-92 patch-93 patch-99 patch-105 patch-108 patch-111
+patch-116 patch-117 patch-123 patch-153 patch-182
+ DOM tests
+
+
+xmlconf.cl
+----------------
+patch-13 patch-15 patch-16 patch-147 patch-186
+ Testfunktion fuer XML Conformance Test Suite
+(need to merge this with Gilbert's work)
Modified: branches/grin-neu/thirdparty/cxml/README.html
===================================================================
--- branches/grin-neu/thirdparty/cxml/README.html 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/cxml/README.html 2006-12-01 10:39:49 UTC (rev 2094)
@@ -3,33 +3,60 @@
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<title>Closure XML</title>
- <style type="text/css">
- body {
- color: #000000;
- background-color: #ffffff;
- margin-bottom: 10%;
- padding-left: 30px;
- }
- h1,h2,h3 {
- margin-left: -30px;
- }
- pre {
- background-color: #eeeeee;
- border: solid 1px #d0d0d0;
- padding: 1em;
- margin-right: 10%;
- }
- .def {
- background-color: #ddddff;
- font-weight: bold;
- }
- .nomargin {
- margin-bottom: 0;
- margin-top: 0;
- }
- </style>
+ <link rel="stylesheet" type="text/css" href="doc/cxml.css"/>
</head>
<body>
+ <div class="sidebar">
+ <div class="sidebar-title">
+ <a href="README.html">Closure XML</a>
+ </div>
+ <div class="sidebar-main">
+ <ul class="main">
+ <li>
+ <a href="doc/installation.html">Installing Closure XML</a>
+ <ul class="sub">
+ <li><a href="doc/installation.html#download"><b>Download</b></a></li>
+ <li><a href="doc/installation.html#implementations">Implementation-specific notes</a></li>
+ <li><a href="doc/installation.html#compilation">Compilation</a></li>
+ <li><a href="doc/installation.html#tests">Tests</a></li>
+ </ul>
+ </li>
+ <li>
+ <ul class="hack">
+ <li>
+ <a href="doc/quickstart.html"><b>Quick-Start Example</b></a>
+ </li>
+ </ul>
+ </li>
+ <li>
+ <a href="doc/using.html">SAX parser</a>
+ <ul class="sub">
+ <li><a href="doc/using.html#parser">Parsing and Validating</a></li>
+ <li><a href="doc/using.html#serialization">Serialization</a></li>
+ <li><a href="doc/using.html#misc">Miscellaneous SAX handlers</a></li>
+ <li><a href="doc/using.html#rods">Recoders</a></li>
+ <li><a href="doc/using.html#dtdcache">Caching of DTD Objects</a></li>
+ <li><a href="doc/using.html#catalogs">XML Catalogs</a></li>
+ <li><a href="doc/using.html#sax">SAX Interface</a></li>
+ </ul>
+ </li>
+ <li>
+ <a href="doc/dom.html">DOM implementation</a>
+ <ul class="sub">
+ <li><a href="doc/dom.html#parser">Parsing with the DOM builder</a></li>
+ <li><a href="doc/dom.html#serialization">Serialization</a></li>
+ <li><a href="doc/dom.html#mapping">DOM/Lisp mapping</a></li>
+ </ul>
+ </li>
+ <li>
+ <ul class="hack">
+ <li><a href="doc/xmls-compat.html">XMLS Builder</a></li>
+ </ul>
+ </li>
+ </ul>
+ </div>
+ </div>
+
<h1>Closure XML Parser</h1>
<p>An XML parser written in Common Lisp.</p>
@@ -47,62 +74,79 @@
(SAX layer; namespace support)
</li>
<li>
- David Lichteblau at knowledgeTools (david at knowledgetools.de)<br/>
+ <a href="mailto:david@lichteblau.com">David Lichteblau</a> for <a
+ href="http://www.knowledgetools.de">knowledgeTools</a>
(conversion into an independent package; DOM bug fixing; validation)
+ and <a href="http://www.headcraft.de/">headcraft</a>
+ (most september/october 2004 changes) and privately (changes
+ since then).
</li>
</ul>
<p>
- Mailing list <a
- href="http://common-lisp.net/mailman/listinfo/cxml-devel">cxml-devel</a>
- is hosted on common-lisp.net.
+ CXML implements a <a
+ href="http://www.w3.org/TR/REC-xml-names/">namespace-aware</a>,
+ validating SAX-like <a
+ href="http://www.w3.org/TR/2000/REC-xml-20001006">XML 1.0</a>
+ parser as well as the <a
+ href="http://www.w3.org/TR/DOM-Level-2-Core/">DOM Level 2 Core</a>
+ interfaces.
</p>
- <h2>Download</h2>
<p>
- Get a <a href="http://www.common-lisp.net/project/cxml/download/">tarball</a>.
+ CXML is licensed under Lisp-LGPL.
</p>
+
<p>
- David's tla archive is at <a
- href="http://common-lisp.net/project/cxml/david@knowledgetools.de--cxml/">http://www.common-lisp.net/project/cxml/david@knowledgetools.de--cxml/</a>.
- (Brief tla usage instructions: Unpack the cxml tarball.
- Enter <tt>tla register-archive URL</tt> to turn it into a working
- copy. <tt>tla update</tt> is similar to <tt>cvs up</tt>.)
+ Send bug reports to <a
+ href="mailto:cxml-devel@common-lisp.net">cxml-devel(a)common-lisp.net</a>
+ (<a
+ href="http://common-lisp.net/cgi-bin/mailman/listinfo/cxml-devel">list
+ information</a>).
</p>
- <h1>Contents</h1>
- <ul>
- <li><a href="#changes">Recent Changes</a></li>
- <li><a href="#modules">CXML Modules</a></li>
- <li><a href="#installation">Installation</a></li>
- <li><a href="#tests">Tests</a></li>
- <li><a href="#todo">To Do</a></li>
- <li>
- <a href="#using">Using CXML</a>
- <ul>
- <li><a href="#quickstart">Quick-Start Example</a></li>
- <li><a href="#parser">Parsing and Validating</a></li>
- <li><a href="#serialization">Serialization</a></li>
- <li><a href="#misc">Miscellaneous Utility Functions</a></li>
- <li><a href="#xmls">XMLS Compatibility</a></li>
- <li><a href="#rods">Dealing with Rods</a></li>
- <li><a href="#dtdcache">Caching of DTD Objects</a></li>
- <li><a href="#catalogs">XML Catalogs</a></li>
- </ul>
- </li>
- <li><a href="#sax">SAX Interface</a></li>
- <li><a href="#dom">DOM Notes</a></li>
- </ul>
-
<a name="changes"/>
<h2>Recent Changes</h2>
- <p class="nomargin"><tt>patch-xyz</tt> (2004-xx-yy)</p>
+ <p class="nomargin"><tt>rel-2006-xx-yy</tt></p>
<ul class="nomargin">
+ <li>Serialization fixes (thanks to Nathan Bird, Donavon Keithley).</li>
+ <li>characters.lisp cleanup (thanks to Nathan Bird).</li>
+ <li>Namespace normalizer bugfixes.</li>
+ <li>Minor changes: clone-node on document as an extension. DOM
+ class hierarchy reworked. New function parse-empty-document.
+ Fixed the DOM serializer to not throw away local names.
+ Fixed a long-standing bug in the parser for documents without a
+ doctype. ANSI conformance fixes.</li>
+ </ul>
+ <p class="nomargin"><tt>rel-2006-01-05</tt></p>
+ <ul class="nomargin">
+ <li>Implemented DOM 2 Core.</li>
+ <li>Error handling overhaul.</li>
+ <li>UTF-8 string support in DOM on Lisps without Unicode characters.</li>
+ <li>Sink API has been changed.</li>
+ <li>Support internal subset serialization.</li>
+ <li>Whitespace normalizer.</li>
+ <li>Gilbert Baumann has clarified the license as Lisp-LGPL.</li>
+ <li>Use trivial-gray-streams.</li>
+ </ul>
+ <p class="nomargin"><tt>rel-2005-06-25</tt></p>
+ <ul class="nomargin">
+ <li>Port to OpenMCL (thanks to Rudi Schlatte).</li>
+ <li>Port to LispWorks (thanks to Edi Weitz).</li>
+ <li>Minor new features: <tt>include-default-values</tt> argument to
+ <tt>make-xmls-builder</tt>; <tt>handler</tt> argument
+ to <tt>parse-dtd-stream</tt>; SAX proxy class</li>
+ <li>Various bugfixes.</li>
+ </ul>
+ <p class="nomargin"><tt>patch-357</tt> (2004-10-10)</p>
+ <ul class="nomargin">
<li>Auto-detect unicode support for better asdf-installability.</li>
<li>Use the puri library for Sys-ID handling.</li>
<li>Semi-automatic caching of DTD instances.</li>
<li>Support user-defined entity resolvers.</li>
<li>Support for Oasis XML Catalogs.</li>
+ <li>xhtmlgen version of Franz htmlgen.</li>
+ <li>Fixes for SBCL's unicode support.</li>
</ul>
<p class="nomargin"><tt>patch-306</tt> (2004-09-03)</p>
<ul class="nomargin">
@@ -125,111 +169,14 @@
<li>Initial release.</li>
</ul>
- <a name="modules"/>
- <h2>CXML Modules</h2>
- <p>CXML provides three packages:</p>
- <ul>
- <li>
- <tt>RUNES</tt>, a portable implementation of Unicode strings.
- </li>
- <li>
- <tt>CXML</tt>, a namespace-aware validating SAX parser
- implementing the <a
- href="http://www.w3.org/TR/2000/REC-xml-20001006">XML 1.0
- specification</a>.
- </li>
- <li>
- <tt>DOM</tt>, an implementation of the <a
- href="http://www.w3.org/TR/REC-DOM-Level-1/level-one-core.html">DOM
- Level 1 Core</a> interfaces.
- </li>
- </ul>
-
- <a name="installation"/>
- <h2>Installation</h2>
- <p>
- CXML should be portable to all Common Lisp implementations
- supporting gray streams. Currently assumed to work are ACL,
- SBCL, CMUCL, and CLISP. (CLISP needs to be run with an
- option like <tt>-E iso-8869-1</tt> teaching it to accept cxml's
- non-ASCII source files.)
- </p>
-
- <p>
- Optional configuration (skip this unless you know better): CXML
- has full Unicode code support -- even on Lisps without Unicode
- strings. On non-unicode aware Lisps, <tt>DOMString</tt> is
- implemented as an array of character codes. CXML will auto-detect
- at compile-time which string representation to use. To override
- the auto-detection, you can set one of the features
- <tt>:rune-is-character</tt> and <tt>:rune-is-octet</tt> before
- loading <tt>cxml.asd</tt>.
- </p>
-
- <p>
- <a href="http://www.cliki.net/asdf">ASDF</a> is used for
- compilation. The following instructions assume that ASDF has
- already been loaded.
- </p>
-
- <p>
- <b>Prerequisites.</b>
- CXML needs the <a href="http://www.cliki.net/Puri">puri</a> library.
- </p>
-
- <p>
- <b>Compiling and loading CXML.</b>
- Register the .asd file, e.g. by symlinking it:
- </p>
- <pre>$ ln -sf `pwd`/cxml.asd /path/to/your/registry/</pre>
- <p>Then compile CXML using:</p>
- <pre>* (asdf:operate 'asdf:load-op :cxml)</pre>
-
- <p>
- You can then try the <a href="#quickstart">quick-start example</a>.
- </p>
-
- <a name="tests"/>
- <h2>Tests</h2>
- <p>Check out the XML and DOM testsuites:</p>
- <pre>$ export CVSROOT=:pserver:anonymous@dev.w3.org:/sources/public
-$ cvs login # password is "anonymous"
-$ cvs co 2001/XML-Test-Suite/xmlconf
-$ cvs co 2001/DOM-Test-Suite</pre>
- <p>Usage and expected output:</p>
- <pre>* (xmlconf:run-all-tests "/path/to/2001/XML-Test-Suite/xmlconf/")
-0/556 tests failed; 1606 tests were skipped
-* (domtest:run-all-tests "/path/to/2001/DOM-Test-Suite/")
-0/450 tests failed; 71 tests were skipped</pre>
-
- <p>
- <i>fixme</i>: Add an explanation of xml/sax-tests here.
- </p>
-
- <p>
- <b>fixme</b> My parser does not understand the current testsuite
- anymore. To fix this problem, revert the affected files
- manually after check-out:
- </p>
-
- <pre>$ cd 2001/XML-Test-Suite/xmlconf/
-xmltest$ patch -p0 -R </path/to/cxml/test/xmlconf-base.diff</pre>
-
- <p>
- The log message for the changes reads "<i>Removed unnecessary
- xml:base attribute</i>". If I understand correctly, only
- DOM 3 parsers provide the baseURI attribute necessary for
- understanding <tt>xmlconf.xml</tt> now. We don't have that
- yet.
- </p>
-
+<!--
<a name="todo"/>
<h2>To Do</h2>
<ul>
<li>
<strike>David's changes might have affected performance. Some
benchmarking needs to be done here.</strike> (The actual parser
- seems to be faster than xmls -- good enough for me.)
+ seems to be faster than xmls - - good enough for me.)
</li>
<li>
DOM in general is pretty heavyweight. There is/was a
@@ -268,624 +215,7 @@
(Compare also with Gilbert Baumann's older TODO list in
<tt>xml-parse.lisp</tt>.)
</p>
+-->
- <a name="using"/>
- <h2>Using CXML</h2>
-
- <a name="quickstart"/>
- <h3>Quick-Start Example</h3>
-
- <p>
- Make sure to <a href="#installation">install and load</a> cxml first.
- </p>
-
- <p>Create a test file called <tt>example.xml</tt>:</p>
- <pre>* <b>(with-open-file (s "example.xml" :direction :output)
- (write-string "<test a='b'><child/></test>" s))</b></pre>
-
- <p>Parse <tt>example.xml</tt> into a DOM tree (<a href="#parser">read
- more</a>):</p>
- <pre>* <b>(cxml:parse-file "example.xml" (dom:make-dom-builder))</b>
-#<DOM-IMPL::DOCUMENT @ #x72206172>
-;; save result for later:
-* <b>(defparameter *example* *)</b>
-*EXAMPLE*</pre>
-
- <p>Inspect the DOM tree (<a href="#dom">read more</a>):</p>
- <pre>* <b>(dom:document-element *example*)</b>
-#<DOM-IMPL::ELEMENT test @ #x722b6ba2>
-* <b>(dom:tag-name (dom:document-element *example*))</b>
-"test"
-* <b>(dom:child-nodes (dom:document-element *example*))</b>
-#(#<DOM-IMPL::ELEMENT child @ #x722b6d8a>)
-* <b>(dom:get-attribute (dom:document-element *example*) "a")</b>
-"b"</pre>
-
- <p>Serialize the DOM document back into a stream (<a
- href="#serialization">read more</a>):</p>
- <pre><b>(cxml:unparse-document *example* *standard-output*)</b>
-<test a="b"><child></child></test></pre>
-
- <p>As an alternative to DOM, parse into xmls-compatible list
- structure (<a href="#xmls">read more</a>):</p>
- <pre>* <b>(cxml:parse-file "example.xml" (cxml-xmls:make-xmls-builder))</b>
-("test" (("a" "b")) ("child" NIL))</pre>
-
- <a name="parser"/>
- <h3>Parsing and Validating</h3>
- <p>
- <div class="def">Function CXML:PARSE-FILE (pathname handler &key ...)</div>
- <div class="def">Function CXML:PARSE-STREAM (stream handler &key ...)</div>
- <div class="def">Function CXML:PARSE-OCTETS (octets handler &key ...)</div>
- Parse an XML document.
- Return values from this function depend on the SAX handler used.<br/>
- Arguments:
- </p>
- <ul>
- <li><tt>pathname</tt> -- a Common Lisp pathname</li>
- <li><tt>stream</tt> -- a Common Lisp stream with element-type
- <tt>(unsigned-byte 8)</tt></li>
- <li><tt>octets</tt> -- an <tt>(unsigned-byte 8)</tt> array</li>
- <li><tt>handler</tt> -- a SAX handler</li>
- </ul>
- <p>
- Common keyword arguments:
- </p>
- <ul>
- <li>
- <tt>validate</tt> -- A boolean. Defaults to
- <tt>nil</tt>. If true, parse in validating mode, i.e. assert that
- the document contains a DOCTYPE declaration and conforms to the
- DTD declared.
- </li>
- <li>
- <tt>dtd</tt> -- unless <tt>nil</tt>, an extid instance
- specifying the external subset to load. This options overrides
- the extid specified in the document type declaration, if any.
- See below for <tt>make-extid</tt>. This option is useful
- for verification purposes together with the <tt>root</tt>
- and <tt>disallow-internal-subset</tt> arguments.
- </li>
- <li><tt>root</tt> -- the expected root element
- name, or <tt>nil</tt> (the default).
- </li>
- <li>
- <tt>entity-resolver</tt> -- <tt>nil</tt> or a function of two
- arguments which is invoked for every entity referenced by the
- document with the entity's Public ID (a rod) and System ID (an
- URI object) as arguments. The function may either return
- nil, CXML will then try to resolve the entity as usual.
- Alternatively it may return a Common Lisp stream specialized on
- <tt>(unsigned-byte 8)</tt> which will be used instead. (It may
- also signal an error, of course, which can be useful to prohibit
- parsed XML documents from including arbitrary files readable by
- the parser.)
- </li>
- <li>
- <tt>disallow-internal-subset</tt> -- a boolean. If true, signal
- an error if the document contains an internal subset.
- </li>
- </ul>
-
- <p>
- <div class="def">Function CXML:PARSE-DTD-FILE (pathname)</div>
- <div class="def">Function CXML:PARSE-DTD-STREAM (stream)</div>
- Parse <a
- href="http://www.w3.org/TR/2000/REC-xml-20001006#NT-extSubset">declarations</a>
- from a stand-alone file and return an object representing the DTD,
- suitable as an argument to <tt>validate</tt>.
- </p>
- <ul>
- <li><tt>pathname</tt> -- a Common Lisp pathname</li>
- <li><tt>stream</tt> -- a Common Lisp stream with element-type
- <tt>(unsigned-byte 8)</tt></li>
- </ul>
-
- <p>
- <div class="def">Function CXML:MAKE-EXTID (publicid systemid)</div>
- Create an object representing the External ID composed
- of the specified Public ID, a rod or <tt>nil</tt>, and System ID
- (an URI object).
- </p>
-
- <p>
- <div class="def">Function DOM:MAKE-DOM-BUILDER ()</div>
- Create a SAX handler which builds a DOM document. Example:
- </p>
- <pre>(cxml:parse-file "test.xml" (dom:make-dom-builder))</pre>
-
- <a name="serialization"/>
- <h3>Serialization</h3>
- <p>
- <div class="def">Function CXML:UNPARSE-DOCUMENT (document stream &rest keys)</div>
- <div class="def">Function CXML:UNPARSE-DOCUMENT-TO-OCTETS (document &rest keys) => vector</div>
- Serialize a DOM document object.
- </p>
- <ul>
- <li><tt>document</tt> -- a DOM document object</li>
- <li><tt>stream</tt> -- a Common Lisp stream with element-type
- <tt>character</tt></li>
- </ul>
- <p>Keyword arguments:</p>
- <ul>
- <li>
- <tt>canonical</tt> -- canonical form, one of NIL, T, 1, 2
- </li>
- <li>
- <tt>indentation</tt> -- indentation level. An integer or <tt>nil</tt>.
- </li>
- </ul>
- <p>
- The following <tt>canonical</tt> values are allowed:
- </p>
- <ul>
- <li>
- <tt>t</tt> or <tt>1</tt>: <a
- href="http://www.w3.org/TR/2001/REC-xml-c14n-20010315">Canonical
- XML</a>
- </li>
- <li>
- <tt>2</tt>: <a
- href="http://dev.w3.org/cvsweb/~checkout~/2001/XML-Test-Suite/xmlconf/sun/cxml.ht…">Second
- Canonical Form</a>
- </li>
- <li>
- <tt>NIL</tt>: Use a more readable non-canonical representation.
- </li>
- </ul>
- <p>
- With an <tt>indentation</tt> level, pretty-print the XML by
- inserting additional whitespace. Note that indentation
- changes the document model and should only be used if whitespace
- does not matter to the application.
- </p>
- <p>
- <tt>unparse-document-to-octets</tt> returns an <tt>(unsigned-byte
- 8)</tt> array, whereas <tt>unparse-document</tt> writes
- characters. <tt>unparse-document</tt> is useful together
- with <tt>with-output-to-string</tt>. However, note that the
- resulting document in both cases is UTF-8 encoded, so the
- characters written by <tt>unparse-document</tt> are really UTF-8
- bytes encoded as characters.
- </p>
-
- <p>
- <div class="def">Function CXML:MAKE-CHARACTER-STREAM-SINK (stream &rest keys) => sink</div>
- <div class="def">Function CXML:MAKE-OCTET-VECTOR-SINK (&rest keys) => sink</div>
- Return a handle suitable for event-based XML serialization.
- </p>
- <p>
- These function provide the low-level mechanism used by the DOM
- serialization functions. To serialize a document without building
- its DOM tree first, create a sink handle and call SAX functions on that
- handle. <tt>sax:end-document</tt> returns the serialized form of
- the document described by the SAX events.
- </p>
-
- <p>
- <div class="def">Macro CXML:WITH-XML-OUTPUT (sink &body body) => vector</div>
- <div class="def">Macro CXML:WITH-ELEMENT (qname &body body) => result</div>
- <div class="def">Function CXML:ATTRIBUTE (name value) => value</div>
- <div class="def">Function CXML:TEXT (data) => data</div>
- <div class="def">Function CXML:CDATA (data) => data</div>
- Convenience syntax for event-based serialization.
- </p>
- <p>
- Example:
- </p>
- <pre>(with-xml-output (make-octet-stream-sink stream :indentation 2 :canonical nil)
- (with-element "foo"
- (attribute "xyz" "abc")
- (with-element "bar"
- (attribute "blub" "bla"))
- (text "Hi there.")))</pre>
- <p>
- Prints this to <tt>stream</tt>, which must be an
- <tt>(unsigned-byte 8)</tt> stream:
- </p>
- <pre><foo xyz="abc">
- <bar blub="bla"></bar>
- Hi there.
-</foo></pre>
- <p>
- (Note that these functions accept both strings and rods, so we
- could write <tt>"foo"</tt> instead of <tt>#"foo"</tt> above.)
- </p>
-
- <a name="misc"/>
- <h3>Miscellaneous Utility Functions</h3>
- <p>
- <div class="def">Function CXML:MAKE-VALIDATOR (dtd root)</div>
- Create a SAX handler which validates against a DTD instance.
- The document's root element must be named <tt>root</tt>.
- Used with <tt>dom:map-document</tt>, this validates a document
- object as if by re-reading it with a validating parser, except
- that declarations recorded in the document instance are completely
- ignored.<br/>
- Example:
- </p>
- <pre>(let ((d (parse-file "~/test.xml" (dom:make-dom-builder)))
- (x (parse-dtd-file "~/test.dtd")))
- (dom:map-document (cxml:make-validator x #"foo") d))</pre>
-
- <p>
- <div class="def">Function DOM:MAP-DOCUMENT (handler document &key include-xmlns-attributes include-default-values)</div>
- Traverse a DOM document and call SAX functions as if an XML
- representation of the document were processed by a SAX parser.
- </p>
-
- <a name="xmls"/>
- <h3>XMLS Compatibility</h3>
- <p>
- Like other XML parsers written in Lisp, CXML can work with
- documents represented as list structures. The specific model
- implemented by cxml is compatible with the <a
- href="http://common-lisp.net/project/xmls/">xmls parser</a>. Xmls
- list structures are a simpler and faster alternative to full DOM
- document trees. They also serve as an example showing how to
- implement user-defined document models as an independent layer
- over the the base parser (c.f. <tt>xml/xmls-compat.lisp</tt> in
- the cxml distribution). However, note that the list structures do
- not include all information available in DOM documents and are
- sometimes more difficult to work wth since many DOM functions
- cannot be implemented on them.
- </p>
- <p>
- <div class="def">Function CXML-XMLS:MAKE-XMLS-BUILDER ()</div>
- Create a SAX handler which builds XMLS list structures.
- Example:
- </p>
- <pre>(cxml:parse-file "test.xml" (cxml-xmls:make-xmls-builder))</pre>
- <p>
- <div class="def">Function CXML-XMLS:MAP-NODE (handler node &key include-xmlns-attributes)</div>
- Traverse an XMLS document/node and call SAX functions as if an XML
- representation of the document were processed by a SAX parser.
- </p>
- <p>
- Use this function to serialize XMLS data. For example, we could
- define a replacement for <tt>xmls:write-xml</tt> like this:
- </p>
- <pre>(defun write-xml (stream node &key indent)
- (let ((sink (cxml:make-character-stream-sink
- stream :canonical nil :indentation indent)))
- (cxml-xmls:map-node sink node)))</pre>
- <p>
- <div class="def">Function CXML-XMLS:MAKE-NODE (&key name ns attrs
- children) => xmls node</div>
- Build a list node of the form
- (<em>name</em> ((<em>name</em> <em>value</em>)<em>*</em>) <em>child*</em>).
- </p>
- <p>
- The node list's <tt>car</tt> can also be a cons of local <tt>name</tt>
- and namespace prefix <tt>ns</tt>.
- <em>fixme:</em> It is unclear to me how namespaces are meant to
- work in xmls, since xmls documentation differs from how xmls
- actually works in current releases. Usually applications need to
- know both the namespace prefix <em>and</em> the namespace URI. We
- currently follow the xmls <em>implementation</em> and use the
- namespace prefix instead of following its <em>documentation</em> which
- shows the URI. We do not follow xmls in munging xmlns attribute
- values. Attributes themselves have namespaces and it is not clear
- to me how that works in xmls.
- </p>
- <p>
- <div class="def">Accessor CXML-XMLS:NODE-NAME (node)</div>
- <div class="def">Accessor CXML-XMLS:NODE-NS (node)</div>
- <div class="def">Accessor CXML-XMLS:NODE-ATTRS (node)</div>
- <div class="def">Accessor CXML-XMLS:NODE-CHILDREN (node)</div>
- Accessors for xmls node data.
- </p>
- <p>
- </p>
-
- <a name="rods"/>
- <h3>Dealing with Rods</h3>
- <p>
- As explained above, the XML parser handles character encoding and
- uses 16bit strings internally. Instead of using characters and strings
- it uses <em>runes</em> and <em>rods</em>. This is seen as a
- feature, but can be inconvenient.
- </p>
- <ul>
- <li>
- If your Lisp supports 16 bit unicode strings, use feature
- <tt>:rune-is-character</tt> and forget about runes and rods.
- CXML will use ordinary Lisp characters and strings both
- internally and externally.
- </li>
- <li>
- If your Lisp does not support such strings and your application
- needs Unicode support, use functions defined in the
- <tt>runes</tt> package instead of ordinary string operators.
- </li>
- <li>
- If your Lisp does not support such strings and your application
- does not need Unicode support anyway, it will probably be more
- convenient to let CXML convert rods into strings automatically.
- To do that, use <tt>cxml:make-recoder</tt> to chain a special
- sax handler between the parser and your application handler.
- The recoder translates all rods using an application defined
- function, which defaults to <tt>runes:rod-string</tt>. Although
- the actual XML parser still uses rods internally, you SAX
- handler will only see ordinary Lisp strings.
- </li>
- </ul>
- <p>
- Note that the recoder approach does <em>not</em> work with the DOM
- builder, since DOM is specified to use UTF-16.
- </p>
- <p>
- <div class="def">Function CXML:MAKE-RECODER (chained-handler &optional recoder-fn)</div>
- Return a SAX handler which passes all events on to
- <tt>chained-handler</tt> after converting all strings and rods
- using <tt>recoder-fn</tt>, a function of one argument which
- defaults to <tt>runes:rod-string</tt>.
- </p>
- <p>
- <b>Example.</b> In a Lisp which ordinarily would use octet vector rods:
- </p>
- <pre>CL-USER(14): (cxml:parse-string "<test/>" (cxml-xmls:make-xmls-builder))
-(#(116 101 115 116) NIL)</pre>
- <p>
- Use a SAX recoder to get strings instead::
- </p>
- <pre>CL-USER(17): (parse-string "<test/>" (cxml:make-recoder (cxml-xmls:make-xmls-builder)))
-("test" NIL)</pre>
-
- <a name="dtdcache"/>
- <h3>Caching of DTD Objects</h3>
- <p>
- To avoid spending time parsing the same DTD over and over again,
- CXML can cache DTD objects. The parser consults
- <tt>cxml:*dtd-cache*</tt> whenever it is looking for an external
- subset in a document which does not have an internal subset and
- uses the cached DTD instance if one is present in the cache for
- the System ID in question.
- </p>
- <p>
- Note that DTDs do not expire from the cache automatically.
- (Future versions of CXML might introduce automatic checks for
- outdated DTDs.)
- </p>
- <p>
- <div class="def">Variable CXML:*DTD-CACHE*</div>
- The DTD cache object consulted by the parser when it needs a DTD.
- </p>
- <p>
- <div class="def">Function CXML:MAKE-DTD-CACHE ()</div>
- Return a new, empty DTD cache object.
- </p>
- <p>
- <div class="def">Variable CXML:*CACHE-ALL-DTDS*</div>
- If true, instructs the parser to enter all DTDs that could have
- been cached into <tt>*dtd-cache*</tt> if they were not cached
- already. Defaults to <tt>nil</tt>.
- </p>
- <p>
- <div class="def">Reader CXML:GETDTD (uri dtd-cache)</div>
- Return a cached instance of the DTD at <tt>uri</tt>, if present in
- the cache, or <tt>nil</tt>.
- </p>
- <p>
- <div class="def">Writer CXML:GETDTD (uri dtd-cache)</div>
- Enter a new value for <tt>uri</tt> into <tt>dtd-cache</tt>.
- </p>
- <p>
- <div class="def">Function CXML:REMDTD (uri dtd-cache)</div>
- Ensure that no DTD is recorded for <tt>uri</tt> in the cache and
- return true if such a DTD was present.
- </p>
- <p>
- <div class="def">Function CXML:CLEAR-DTD-CACHE (dtd-cache)</div>
- Remove all entries from <tt>dtd-cache</tt>.
- </p>
- <p>
- <em>fixme:</em> thread-safety
- </p>
-
- <a name="catalogs"/>
- <h3>XML Catalogs</h3>
- <p>
- External entities (for example, DTDs) are referred to using their
- Public and System IDs. Usually the System ID, a URI, is used to
- locate the entity. CXML itself handles only file://-URIs, but
- many System IDs in practical use are http://-URIs. There are two
- different mechanims applications can use to allow CXML to locate
- entities using arbitrary Public ID or System ID:
- </p>
- <ul>
- <li>
- User-defined entity resolvers can be used to open entities using
- arbitrary protocols. For example, an entity resolver could
- handle all System-IDs with the <tt>http</tt> scheme using some
- HTTP library. Refer to the description of the
- <tt>entity-resolver</tt> keyword argument to parser functions (see <a
- href="#parser"><tt>cxml:parse-file</tt></a>) to more
- information on entity resolvers.
- </li>
- <li>
- XML Catalogs are (local) tables in XML syntax which map External
- IDs to alternative System IDs. If, say, the xhtml DTD is
- present in the local file system and the local copy has been
- registered with the XML catalog, CXML will use the local copy of
- the DTD instead of trying to open the version available using HTTP.
- </li>
- </ul>
- <p>
- This section describes XML Catalogs, the second solution. CXML
- implements <a
- href="http://www.oasis-open.org/committees/entity/spec.html">Oasis
- XML Catalogs</a>.
- </p>
- <p>
- <div class="def">Variable CXML:*CATALOG*</div>
- The XML Catalog object consulted by the parser before trying to
- open an entity. Initially <tt>nil</tt>.
- </p>
- <p>
- <div class="def">Variable CXML:*PREFER*</div>
- The default "prefer" mode from the Catalog specification, one
- of <tt>:public</tt> or <tt>:system</tt>. Defaults
- to <tt>:public</tt>.
- </p>
- <p>
- <div class="def">Function CXML:MAKE-CATALOG (&optional uris)</div>
- Return a catalog object for the catalog files specified.
- </p>
- <p>
- <div class="def">Function CXML:RESOLVE-URI (uri catalog)</div>
- Look up <tt>uri</tt> in <tt>catalog</tt> and return the
- resulting URI, or <tt>nil</tt> if no match was found.
- </p>
- <p>
- <div class="def">Function CXML:RESOLVE-EXTID (publicid systemid catalog)</div>
- Look up the External ID (<tt>publicid</tt>, <tt>systemid</tt>)
- in <tt>catalog</tt> and return the resulting URI, or <tt>nil</tt>
- if no match was found.
- </p>
- <p>
- Example:
- </p>
- <pre>* (setf cxml:*catalog* nil)
-* (cxml:parse-file "test.xhtml" nil)
-=> Error: URI scheme :HTTP not supported
-
-* (setf cxml:*catalog* (cxml:make-catalog))
-* (cxml:parse-file "test.xhtml" nil)
-;; no error!
-NIL</pre>
- <p>
- Note that parsed catalog files are cached in the catalog object.
- Catalog files cached do not expire automatically. To ensure that
- all catalog files are parsed again, create a new catalog object.
- </p>
-
- <a name="sax"/>
- <h2>SAX Interface</h2>
- <p>
- A SAX handler is an arbitrary objects that implements some of the
- generic functions in the SAX package. Note that no default
- handler class is necessary, because all generic functions have default
- methods which do nothing. SAX functions are:
- <div class="def">Function SAX:START-DOCUMENT (handler)</div>
- <div class="def">Function SAX:END-DOCUMENT (handler)</div>
- <br/>
- <div class="def">Function SAX:START-ELEMENT (handler namespace-uri local-name qname attributes)</div>
- <div class="def">Function SAX:END-ELEMENT (handler namespace-uri local-name qname)</div>
- <div class="def">Function SAX:START-PREFIX-MAPPING (handler prefix uri)</div>
- <div class="def">Function SAX:END-PREFIX-MAPPING (handler prefix)</div>
- <div class="def">Function SAX:PROCESSING-INSTRUCTION (handler target data)</div>
- <div class="def">Function SAX:COMMENT (handler data)</div>
- <div class="def">Function SAX:START-CDATA (handler)</div>
- <div class="def">Function SAX:END-CDATA (handler)</div>
- <div class="def">Function SAX:CHARACTERS (handler data)</div>
- <br/>
- <div class="def">Function SAX:START-DTD (handler name public-id system-id)</div>
- <div class="def">Function SAX:END-DTD (handler)</div>
- <div class="def">Function SAX:UNPARSED-ENTITY-DECLARATION (handler name public-id system-id notation-name)</div>
- <div class="def">Function SAX:EXTERNAL-ENTITY-DECLARATION (handler kind name public-id system-id)</div>
- <div class="def">Function SAX:INTERNAL-ENTITY-DECLARATION (handler kind name value)</div>
- <div class="def">Function SAX:NOTATION-DECLARATION (handler name public-id system-id)</div>
- <div class="def">Function SAX:ELEMENT-DECLARATION (handler name model)</div>
- <div class="def">Function SAX:ATTRIBUTE-DECLARATION (handler ename aname type default)</div>
- <br/>
- <div class="def">Accessor SAX:ATTRIBUTE-PREFIX (attribute)</div>
- <div class="def">Accessor SAX:ATTRIBUTE-NAMESPACE-URI (attribute)</div>
- <div class="def">Accessor SAX:ATTRIBUTE-LOCAL-NAME (attribute)</div>
- <div class="def">Accessor SAX:ATTRIBUTE-VALUE (attribute)</div>
- <div class="def">Accessor SAX:ATTRIBUTE-QNAME (attribute)</div>
- <div class="def">Accessor SAX:ATTRIBUTE-SPECIFIED-P (attribute)</div>
- </p>
- <p>
- The entity declaration methods are similar to Java SAX
- definitions, but parameter entities are distinguished from
- general entities not by a <tt>%</tt> prefix to the name, but by
- the <tt>kind</tt> argument, either <tt>:parameter</tt> or
- <tt>:general</tt>.
- </p>
- <p>
- The arguments to <tt>sax:element-declaration</tt> and
- <tt>sax:attribute-declaration</tt> differ significantly from their
- Java counterparts.
- </p>
- <p>
- <i>fixme</i>: For more information on these functions refer to the docstrings.
- </p>
-
-
- <a name="dom"/>
- <h2>DOM Notes</h2>
- <p>
- CXML implements the DOM Level 1 Core interfaces. Explaining
- DOM is better left to the <a
- href="http://www.w3.org/TR/REC-DOM-Level-1/level-one-core.html">specification</a>,
- so please refer to the official W3C documents for DOM.
- </p>
- <p>
- However, there is no "standard" DOM mapping for Lisp. DOM
- is <a
- href="http://www.w3.org/TR/REC-DOM-Level-1/idl-definitions.html">specified
- in CORBA IDL</a>, but it refrains from using object-oriented IDL
- features, allowing for a much more natural Lisp implemenation than
- the the ordinary IDL/Lisp mapping would.
- </p>
- <p>
- Differences between CXML's DOM and the direct IDL/Lisp mapping:
- </p>
- <ul>
- <li>
- DOM function names are symbols in the <tt>DOM</tt> package (not
- the <tt>OP</tt> package).
- </li>
- <li>
- DOM functions have proper required arguments, not a huge
- <tt>&rest</tt> lambda list.
- </li>
- <li>
- Although most IDL interfaces are implemented as CLOS classes by
- CXML, the Lisp types of DOM objects is not documented and cannot
- be relied upon. A node's type can be determined using
- <tt>dom:node-type</tt> instead.
- </li>
- <li>
- <tt>DOMString</tt> is mapped to <tt>rod</tt>, which is either
- an <tt>(unsigned-byte 16)</tt> array type or a string type.
- </li>
- <li>
- The IDL/Lisp mapping maps CORBA enums to Lisp keywords.
- Unfortunately, the DOM IDL does not use enums. Instead,
- both exception types and node types are defined integer
- constants. CXML chooses to ignore this definition and uses
- keywords instead.
- </li>
- <li>
- DOM uses StudlyCaps. Lisp programmers don't. We
- insert <tt>#\-</tt> before every upper case letter preceded by a
- lower case letter and before every upper case letter which is
- followed by a lower case letter, but preceded by a capital
- letter. This algorithms leads to the natural Lisp spelling
- of DOM function names.
- </li>
- <li>
- Implementation note: DOM's <tt>NodeList</tt> does not
- necessarily map to a native "sequence" type. (For example,
- node lists are objects in Java, not arrays.)
- <tt>NodeList</tt> is specified to reflect changes done after a
- node list was created, so node lists cannot be Lisp lists.
- (A node list could be implemented as a CLOS object pointing to
- said list though.) Instead, CXML currently implements node
- lists as adjustable vectors. Note that code which relies on
- this implementation and uses Lisp sequence functions
- instead of sticking to <tt>dom:item</tt> and <tt>dom:length</tt>
- is not portable. As a compromise, you can use our
- extensions <tt>dom:map-node-list</tt> or
- <tt>dom:do-node-list</tt>, which can be implemented portably.
- </li>
- </ul>
- <p>Example:</p>
- <pre>XML(97): (dom:node-type
- (dom:document-element
- (cxml:parse-file "~/test.xml" (dom:make-dom-builder))))
-:ELEMENT</pre>
</body>
</html>
Added: branches/grin-neu/thirdparty/cxml/XMLCONF
===================================================================
--- branches/grin-neu/thirdparty/cxml/XMLCONF 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/cxml/XMLCONF 2006-12-01 10:39:49 UTC (rev 2094)
@@ -0,0 +1,1834 @@
+xmltest/not-wf/sa/001.xml [not validating:] not-wf [validating:] invalid
+xmltest/not-wf/sa/002.xml [not validating:] not-wf [validating:] invalid
+xmltest/not-wf/sa/003.xml [not validating:] not-wf [validating:] invalid
+xmltest/not-wf/sa/004.xml [not validating:] not-wf [validating:] invalid
+xmltest/not-wf/sa/005.xml [not validating:] not-wf [validating:] invalid
+xmltest/not-wf/sa/006.xml [not validating:] not-wf [validating:] invalid
+xmltest/not-wf/sa/007.xml [not validating:] not-wf [validating:] invalid
+xmltest/not-wf/sa/008.xml [not validating:] not-wf [validating:] invalid
+xmltest/not-wf/sa/009.xml [not validating:] not-wf [validating:] invalid
+xmltest/not-wf/sa/010.xml [not validating:] not-wf [validating:] invalid
+xmltest/not-wf/sa/011.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/012.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/013.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/014.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/015.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/016.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/017.xml [not validating:] not-wf [validating:] invalid
+xmltest/not-wf/sa/018.xml [not validating:] not-wf [validating:] invalid
+xmltest/not-wf/sa/019.xml [not validating:] not-wf [validating:] invalid
+xmltest/not-wf/sa/020.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/021.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/022.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/023.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/024.xml [not validating:] not-wf [validating:] invalid
+xmltest/not-wf/sa/025.xml [not validating:] not-wf [validating:] invalid
+xmltest/not-wf/sa/026.xml [not validating:] not-wf [validating:] invalid
+xmltest/not-wf/sa/027.xml [not validating:] not-wf [validating:] invalid
+xmltest/not-wf/sa/028.xml [not validating:] not-wf [validating:] invalid
+xmltest/not-wf/sa/029.xml [not validating:] not-wf [validating:] invalid
+xmltest/not-wf/sa/030.xml [not validating:] not-wf [validating:] invalid
+xmltest/not-wf/sa/031.xml [not validating:] not-wf [validating:] invalid
+xmltest/not-wf/sa/032.xml [not validating:] not-wf [validating:] invalid
+xmltest/not-wf/sa/033.xml [not validating:] not-wf [validating:] invalid
+xmltest/not-wf/sa/034.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/035.xml [not validating:] not-wf [validating:] invalid
+xmltest/not-wf/sa/036.xml [not validating:] not-wf [validating:] invalid
+xmltest/not-wf/sa/037.xml [not validating:] not-wf [validating:] invalid
+xmltest/not-wf/sa/038.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/039.xml [not validating:] not-wf [validating:] invalid
+xmltest/not-wf/sa/040.xml [not validating:] not-wf [validating:] invalid
+xmltest/not-wf/sa/041.xml [not validating:] not-wf [validating:] invalid
+xmltest/not-wf/sa/042.xml [not validating:] not-wf [validating:] invalid
+xmltest/not-wf/sa/043.xml [not validating:] not-wf [validating:] invalid
+xmltest/not-wf/sa/044.xml [not validating:] not-wf [validating:] invalid
+xmltest/not-wf/sa/045.xml [not validating:] not-wf [validating:] invalid
+xmltest/not-wf/sa/046.xml [not validating:] not-wf [validating:] invalid
+xmltest/not-wf/sa/047.xml [not validating:] not-wf [validating:] invalid
+xmltest/not-wf/sa/048.xml [not validating:] not-wf [validating:] invalid
+xmltest/not-wf/sa/049.xml [not validating:] not-wf [validating:] invalid
+xmltest/not-wf/sa/050.xml [not validating:] not-wf [validating:] invalid
+xmltest/not-wf/sa/051.xml [not validating:] not-wf [validating:] invalid
+xmltest/not-wf/sa/052.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/053.xml [not validating:] not-wf [validating:] invalid
+xmltest/not-wf/sa/054.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/055.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/056.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/057.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/058.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/059.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/060.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/061.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/062.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/063.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/064.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/065.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/066.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/067.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/068.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/069.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/070.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/071.xml [not validating:] not-wf [validating:] invalid
+xmltest/not-wf/sa/072.xml [not validating:] not-wf [validating:] invalid
+xmltest/not-wf/sa/073.xml [not validating:] not-wf [validating:] invalid
+xmltest/not-wf/sa/074.xml [not validating:] not-wf [validating:] invalid
+xmltest/not-wf/sa/075.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/076.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/077.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/078.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/079.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/080.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/081.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/082.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/083.xml [not validating:] not-wf [validating:] invalid
+xmltest/not-wf/sa/084.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/085.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/086.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/087.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/088.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/089.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/090.xml [not validating:] not-wf [validating:] invalid
+xmltest/not-wf/sa/091.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/092.xml [not validating:] not-wf [validating:] invalid
+xmltest/not-wf/sa/093.xml [not validating:] not-wf [validating:] invalid
+xmltest/not-wf/sa/094.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/095.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/096.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/097.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/098.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/099.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/100.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/101.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/102.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/103.xml [not validating:] not-wf [validating:] invalid
+xmltest/not-wf/sa/104.xml [not validating:] not-wf [validating:] invalid
+xmltest/not-wf/sa/105.xml [not validating:] not-wf [validating:] invalid
+xmltest/not-wf/sa/106.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/107.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/108.xml [not validating:] not-wf [validating:] invalid
+xmltest/not-wf/sa/109.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/110.xml [not validating:] not-wf [validating:] invalid
+xmltest/not-wf/sa/111.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/112.xml [not validating:] not-wf [validating:] invalid
+xmltest/not-wf/sa/113.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/114.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/115.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/116.xml [not validating:] not-wf [validating:] invalid
+xmltest/not-wf/sa/117.xml [not validating:] not-wf [validating:] invalid
+xmltest/not-wf/sa/118.xml [not validating:] not-wf [validating:] invalid
+xmltest/not-wf/sa/119.xml [not validating:] not-wf [validating:] invalid
+xmltest/not-wf/sa/120.xml [not validating:] not-wf [validating:] invalid
+xmltest/not-wf/sa/121.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/122.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/123.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/124.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/125.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/126.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/127.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/128.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/129.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/130.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/131.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/132.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/133.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/134.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/135.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/136.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/137.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/138.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/139.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/140.xml [not validating:] not-wf [validating:] invalid
+xmltest/not-wf/sa/141.xml [not validating:] not-wf [validating:] invalid
+xmltest/not-wf/sa/142.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/143.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/144.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/145.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/146.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/147.xml [not validating:] not-wf [validating:] invalid
+xmltest/not-wf/sa/148.xml [not validating:] not-wf [validating:] invalid
+xmltest/not-wf/sa/149.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/150.xml [not validating:] not-wf [validating:] invalid
+xmltest/not-wf/sa/151.xml [not validating:] not-wf [validating:] invalid
+xmltest/not-wf/sa/152.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/153.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/154.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/155.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/156.xml [not validating:] not-wf [validating:] invalid
+xmltest/not-wf/sa/157.xml [not validating:] not-wf [validating:] invalid
+xmltest/not-wf/sa/158.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/159.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/160.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/161.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/162.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/163.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/164.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/165.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/166.xml [not validating:] not-wf [validating:] invalid
+xmltest/not-wf/sa/167.xml [not validating:] not-wf [validating:] invalid
+xmltest/not-wf/sa/168.xml [not validating:] not-wf [validating:] invalid
+xmltest/not-wf/sa/169.xml [not validating:] not-wf [validating:] invalid
+xmltest/not-wf/sa/170.xml [not validating:] not-wf [validating:] invalid
+xmltest/not-wf/sa/171.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/172.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/173.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/174.xml [not validating:] not-wf [validating:] invalid
+xmltest/not-wf/sa/175.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/176.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/177.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/178.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/179.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/180.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/181.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/182.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/183.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/184.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/185.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/sa/186.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/not-sa/001.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/not-sa/002.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/not-sa/003.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/not-sa/004.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/not-sa/006.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/not-sa/007.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/not-sa/008.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/not-sa/009.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/ext-sa/001.xml [not validating:] not-wf [validating:] invalid
+xmltest/not-wf/ext-sa/002.xml [not validating:] not-wf [validating:] not-wf
+xmltest/not-wf/ext-sa/003.xml [not validating:] not-wf [validating:] not-wf
+xmltest/invalid/002.xml [not validating:] input [validating:] invalid
+xmltest/invalid/005.xml [not validating:] input [validating:] invalid
+xmltest/invalid/006.xml [not validating:] input [validating:] invalid
+xmltest/invalid/not-sa/022.xml [not validating:] input/output [validating:] invalid
+xmltest/valid/sa/001.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/002.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/003.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/004.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/005.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/006.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/007.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/008.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/009.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/010.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/011.xml [not validating:] input/output [validating:] input/output
+valid/sa/012.xml: test applies to parsers without namespace support, skipping
+xmltest/valid/sa/013.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/014.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/015.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/016.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/017.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/018.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/019.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/020.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/021.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/022.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/023.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/024.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/025.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/026.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/027.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/028.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/029.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/030.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/031.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/032.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/033.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/034.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/035.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/036.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/037.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/038.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/039.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/040.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/041.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/042.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/043.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/044.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/045.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/046.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/047.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/048.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/049.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/050.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/051.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/052.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/053.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/054.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/055.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/056.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/057.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/058.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/059.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/060.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/061.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/062.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/063.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/064.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/065.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/066.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/067.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/068.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/069.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/070.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/071.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/072.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/073.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/074.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/075.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/076.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/077.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/078.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/079.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/080.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/081.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/082.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/083.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/084.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/085.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/086.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/087.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/088.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/089.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/090.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/091.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/092.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/093.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/094.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/095.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/096.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/097.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/098.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/099.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/100.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/101.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/102.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/103.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/104.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/105.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/106.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/107.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/108.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/109.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/110.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/111.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/112.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/113.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/114.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/115.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/116.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/117.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/118.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/sa/119.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/not-sa/001.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/not-sa/002.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/not-sa/003.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/not-sa/004.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/not-sa/005.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/not-sa/006.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/not-sa/007.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/not-sa/008.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/not-sa/009.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/not-sa/010.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/not-sa/011.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/not-sa/012.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/not-sa/013.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/not-sa/014.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/not-sa/015.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/not-sa/016.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/not-sa/017.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/not-sa/018.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/not-sa/019.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/not-sa/020.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/not-sa/021.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/not-sa/023.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/not-sa/024.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/not-sa/025.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/not-sa/026.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/not-sa/027.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/not-sa/028.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/not-sa/029.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/not-sa/030.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/not-sa/031.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/ext-sa/001.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/ext-sa/002.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/ext-sa/003.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/ext-sa/004.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/ext-sa/005.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/ext-sa/006.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/ext-sa/007.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/ext-sa/008.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/ext-sa/009.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/ext-sa/011.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/ext-sa/012.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/ext-sa/013.xml [not validating:] input/output [validating:] input/output
+xmltest/valid/ext-sa/014.xml [not validating:] input/output [validating:] input/output
+japanese/pr-xml-little-endian.xml [not validating:] input [validating:] input
+japanese/pr-xml-utf-16.xml [not validating:] input [validating:] input
+japanese/pr-xml-utf-8.xml [not validating:] input [validating:] input
+japanese/weekly-little-endian.xml [not validating:] input [validating:] input
+japanese/weekly-utf-16.xml [not validating:] input [validating:] input
+japanese/weekly-utf-8.xml [not validating:] input [validating:] input
+sun/valid/pe01.xml [not validating:] input [validating:] input
+sun/valid/dtd00.xml [not validating:] input/output [validating:] input/output
+sun/valid/dtd01.xml [not validating:] input/output [validating:] input/output
+sun/valid/element.xml [not validating:] input/output [validating:] input/output
+sun/valid/ext01.xml [not validating:] input/output [validating:] input/output
+sun/valid/ext02.xml [not validating:] input/output [validating:] input/output
+sun/valid/not-sa01.xml [not validating:] input/output [validating:] input/output
+sun/valid/not-sa02.xml [not validating:] input/output [validating:] input/output
+sun/valid/not-sa03.xml [not validating:] input/output [validating:] input/output
+sun/valid/not-sa04.xml [not validating:] input/output [validating:] input/output
+sun/valid/notation01.xml [not validating:] input/output [validating:] input/output
+sun/valid/optional.xml [not validating:] input/output [validating:] input/output
+sun/valid/required00.xml [not validating:] input/output [validating:] input/output
+sun/valid/sa01.xml [not validating:] input/output [validating:] input/output
+sun/valid/sa02.xml [not validating:] input/output [validating:] input/output
+sun/valid/sa03.xml [not validating:] input/output [validating:] input/output
+sun/valid/sa04.xml [not validating:] input/output [validating:] input/output
+sun/valid/sa05.xml [not validating:] input/output [validating:] input/output
+sun/valid/sgml01.xml [not validating:] input/output [validating:] input/output
+sun/valid/v-lang01.xml [not validating:] input/output [validating:] input/output
+sun/valid/v-lang02.xml [not validating:] input/output [validating:] input/output
+sun/valid/v-lang03.xml [not validating:] input/output [validating:] input/output
+sun/valid/v-lang04.xml [not validating:] input/output [validating:] input/output
+sun/valid/v-lang05.xml [not validating:] input/output [validating:] input/output
+sun/valid/v-lang06.xml [not validating:] input/output [validating:] input/output
+sun/valid/pe00.xml [not validating:] input/output [validating:] input/output
+sun/valid/pe03.xml [not validating:] input/output [validating:] input/output
+sun/valid/pe02.xml [not validating:] input/output [validating:] input/output
+sun/invalid/dtd01.xml [not validating:] input [validating:] invalid
+sun/invalid/dtd02.xml [not validating:] input [validating:] invalid
+sun/invalid/dtd03.xml [not validating:] input [validating:] invalid
+sun/invalid/el01.xml [not validating:] input [validating:] invalid
+sun/invalid/el02.xml [not validating:] input [validating:] invalid
+sun/invalid/el03.xml [not validating:] input [validating:] invalid
+sun/invalid/el04.xml [not validating:] input [validating:] invalid
+sun/invalid/el05.xml [not validating:] input [validating:] invalid
+sun/invalid/el06.xml [not validating:] input [validating:] invalid
+sun/invalid/id01.xml [not validating:] input [validating:] invalid
+sun/invalid/id02.xml [not validating:] input [validating:] invalid
+sun/invalid/id03.xml [not validating:] input [validating:] invalid
+sun/invalid/id04.xml [not validating:] input [validating:] invalid
+sun/invalid/id05.xml [not validating:] input [validating:] invalid
+sun/invalid/id06.xml [not validating:] input [validating:] invalid
+sun/invalid/id07.xml [not validating:] input [validating:] invalid
+sun/invalid/id08.xml [not validating:] input [validating:] invalid
+sun/invalid/id09.xml [not validating:] input [validating:] invalid
+sun/invalid/not-sa01.xml [not validating:] input [validating:] invalid
+sun/invalid/not-sa02.xml [not validating:] input [validating:] invalid
+sun/invalid/not-sa04.xml [not validating:] input [validating:] invalid
+sun/invalid/not-sa05.xml [not validating:] input [validating:] invalid
+sun/invalid/not-sa06.xml [not validating:] input [validating:] invalid
+sun/invalid/not-sa07.xml [not validating:] input [validating:] invalid
+sun/invalid/not-sa08.xml [not validating:] input [validating:] invalid
+sun/invalid/not-sa09.xml [not validating:] input [validating:] invalid
+sun/invalid/not-sa10.xml [not validating:] input [validating:] invalid
+sun/invalid/not-sa11.xml [not validating:] input [validating:] invalid
+sun/invalid/not-sa12.xml [not validating:] input [validating:] invalid
+sun/invalid/not-sa13.xml [not validating:] input [validating:] invalid
+sun/invalid/not-sa14.xml [not validating:] input [validating:] invalid
+sun/invalid/optional01.xml [not validating:] input [validating:] invalid
+sun/invalid/optional02.xml [not validating:] input [validating:] invalid
+sun/invalid/optional03.xml [not validating:] input [validating:] invalid
+sun/invalid/optional04.xml [not validating:] input [validating:] invalid
+sun/invalid/optional05.xml [not validating:] input [validating:] invalid
+sun/invalid/optional06.xml [not validating:] input [validating:] invalid
+sun/invalid/optional07.xml [not validating:] input [validating:] invalid
+sun/invalid/optional08.xml [not validating:] input [validating:] invalid
+sun/invalid/optional09.xml [not validating:] input [validating:] invalid
+sun/invalid/optional10.xml [not validating:] input [validating:] invalid
+sun/invalid/optional11.xml [not validating:] input [validating:] invalid
+sun/invalid/optional12.xml [not validating:] input [validating:] invalid
+sun/invalid/optional13.xml [not validating:] input [validating:] invalid
+sun/invalid/optional14.xml [not validating:] input [validating:] invalid
+sun/invalid/optional20.xml [not validating:] input [validating:] invalid
+sun/invalid/optional21.xml [not validating:] input [validating:] invalid
+sun/invalid/optional22.xml [not validating:] input [validating:] invalid
+sun/invalid/optional23.xml [not validating:] input [validating:] invalid
+sun/invalid/optional24.xml [not validating:] input [validating:] invalid
+sun/invalid/optional25.xml [not validating:] input [validating:] invalid
+sun/invalid/required00.xml [not validating:] input [validating:] invalid
+sun/invalid/required01.xml [not validating:] input [validating:] invalid
+sun/invalid/required02.xml [not validating:] input [validating:] invalid
+sun/invalid/root.xml [not validating:] input [validating:] invalid
+sun/invalid/attr01.xml [not validating:] input [validating:] invalid
+sun/invalid/attr02.xml [not validating:] input [validating:] invalid
+sun/invalid/attr03.xml [not validating:] input [validating:] invalid
+sun/invalid/attr04.xml [not validating:] input [validating:] invalid
+sun/invalid/attr05.xml [not validating:] input [validating:] invalid
+sun/invalid/attr06.xml [not validating:] input [validating:] invalid
+sun/invalid/attr07.xml [not validating:] input [validating:] invalid
+sun/invalid/attr08.xml [not validating:] input [validating:] invalid
+sun/invalid/attr09.xml [not validating:] input [validating:] invalid
+sun/invalid/attr10.xml [not validating:] input [validating:] invalid
+sun/invalid/attr11.xml [not validating:] input [validating:] invalid
+sun/invalid/attr12.xml [not validating:] input [validating:] invalid
+sun/invalid/attr13.xml [not validating:] input [validating:] invalid
+sun/invalid/attr14.xml [not validating:] input [validating:] invalid
+sun/invalid/attr15.xml [not validating:] input [validating:] invalid
+sun/invalid/attr16.xml [not validating:] input [validating:] invalid
+sun/invalid/utf16b.xml [not validating:] input [validating:] invalid
+sun/invalid/utf16l.xml [not validating:] input [validating:] invalid
+sun/invalid/empty.xml [not validating:] input [validating:] invalid
+sun/not-wf/not-sa03.xml [not validating:] not-wf [validating:] invalid
+sun/not-wf/attlist01.xml [not validating:] not-wf [validating:] not-wf
+sun/not-wf/attlist02.xml [not validating:] not-wf [validating:] not-wf
+sun/not-wf/attlist03.xml [not validating:] not-wf [validating:] not-wf
+sun/not-wf/attlist04.xml [not validating:] not-wf [validating:] not-wf
+sun/not-wf/attlist05.xml [not validating:] not-wf [validating:] not-wf
+sun/not-wf/attlist06.xml [not validating:] not-wf [validating:] not-wf
+sun/not-wf/attlist07.xml [not validating:] not-wf [validating:] not-wf
+sun/not-wf/attlist08.xml [not validating:] not-wf [validating:] not-wf
+sun/not-wf/attlist09.xml [not validating:] not-wf [validating:] not-wf
+sun/not-wf/attlist10.xml [not validating:] not-wf [validating:] not-wf
+sun/not-wf/attlist11.xml [not validating:] not-wf [validating:] not-wf
+sun/not-wf/cond01.xml [not validating:] not-wf [validating:] not-wf
+sun/not-wf/cond02.xml [not validating:] not-wf [validating:] not-wf
+sun/not-wf/content01.xml [not validating:] not-wf [validating:] not-wf
+sun/not-wf/content02.xml [not validating:] not-wf [validating:] not-wf
+sun/not-wf/content03.xml [not validating:] not-wf [validating:] not-wf
+sun/not-wf/decl01.xml [not validating:] not-wf [validating:] not-wf
+sun/not-wf/dtd00.xml [not validating:] not-wf [validating:] not-wf
+sun/not-wf/dtd01.xml [not validating:] not-wf [validating:] not-wf
+sun/not-wf/dtd02.xml [not validating:] not-wf [validating:] not-wf
+sun/not-wf/dtd03.xml [not validating:] not-wf [validating:] not-wf
+sun/not-wf/dtd04.xml [not validating:] not-wf [validating:] not-wf
+sun/not-wf/dtd05.xml [not validating:] not-wf [validating:] not-wf
+sun/not-wf/dtd07.xml [not validating:] not-wf [validating:] not-wf
+sun/not-wf/element00.xml [not validating:] not-wf [validating:] invalid
+sun/not-wf/element01.xml [not validating:] not-wf [validating:] invalid
+sun/not-wf/element02.xml [not validating:] not-wf [validating:] not-wf
+sun/not-wf/element03.xml [not validating:] not-wf [validating:] not-wf
+sun/not-wf/element04.xml [not validating:] not-wf [validating:] not-wf
+sun/not-wf/encoding01.xml [not validating:] not-wf [validating:] not-wf
+sun/not-wf/encoding02.xml [not validating:] not-wf [validating:] not-wf
+sun/not-wf/encoding03.xml [not validating:] not-wf [validating:] not-wf
+sun/not-wf/encoding04.xml [not validating:] not-wf [validating:] not-wf
+sun/not-wf/encoding05.xml [not validating:] not-wf [validating:] not-wf
+sun/not-wf/encoding06.xml [not validating:] not-wf [validating:] not-wf
+sun/not-wf/encoding07.xml [not validating:] not-wf [validating:] not-wf
+sun/not-wf/pi.xml [not validating:] not-wf [validating:] not-wf
+sun/not-wf/pubid01.xml [not validating:] not-wf [validating:] not-wf
+sun/not-wf/pubid02.xml [not validating:] not-wf [validating:] not-wf
+sun/not-wf/pubid03.xml [not validating:] not-wf [validating:] not-wf
+sun/not-wf/pubid04.xml [not validating:] not-wf [validating:] not-wf
+sun/not-wf/pubid05.xml [not validating:] not-wf [validating:] not-wf
+sun/not-wf/sgml01.xml [not validating:] not-wf [validating:] invalid
+sun/not-wf/sgml02.xml [not validating:] not-wf [validating:] invalid
+sun/not-wf/sgml03.xml [not validating:] not-wf [validating:] not-wf
+sun/not-wf/sgml04.xml [not validating:] not-wf [validating:] not-wf
+sun/not-wf/sgml05.xml [not validating:] not-wf [validating:] not-wf
+sun/not-wf/sgml06.xml [not validating:] not-wf [validating:] not-wf
+sun/not-wf/sgml07.xml [not validating:] not-wf [validating:] not-wf
+sun/not-wf/sgml08.xml [not validating:] not-wf [validating:] not-wf
+sun/not-wf/sgml09.xml [not validating:] not-wf [validating:] not-wf
+sun/not-wf/sgml10.xml [not validating:] not-wf [validating:] not-wf
+sun/not-wf/sgml11.xml [not validating:] not-wf [validating:] not-wf
+sun/not-wf/sgml12.xml [not validating:] not-wf [validating:] not-wf
+sun/not-wf/sgml13.xml [not validating:] not-wf [validating:] not-wf
+oasis/p01pass2.xml [not validating:] input [validating:] input
+oasis/p06pass1.xml [not validating:] input [validating:] input
+oasis/p07pass1.xml [not validating:] input [validating:] input
+p08pass1.xml: test applies to parsers without namespace support, skipping
+oasis/p09pass1.xml [not validating:] input [validating:] input
+oasis/p12pass1.xml [not validating:] input [validating:] input
+oasis/p22pass4.xml [not validating:] input [validating:] input
+oasis/p22pass5.xml [not validating:] input [validating:] input
+oasis/p22pass6.xml [not validating:] input [validating:] input
+oasis/p28pass1.xml [not validating:] input [validating:] input
+oasis/p28pass3.xml [not validating:] input [validating:] input
+oasis/p28pass4.xml [not validating:] input [validating:] input
+oasis/p28pass5.xml [not validating:] input [validating:] input
+oasis/p29pass1.xml [not validating:] input [validating:] input
+oasis/p30pass1.xml [not validating:] input [validating:] input
+oasis/p30pass2.xml [not validating:] input [validating:] input
+oasis/p31pass1.xml [not validating:] input [validating:] input
+oasis/p31pass2.xml [not validating:] input [validating:] input
+oasis/p43pass1.xml [not validating:] input [validating:] input
+oasis/p45pass1.xml [not validating:] input [validating:] input
+oasis/p46pass1.xml [not validating:] input [validating:] input
+oasis/p47pass1.xml [not validating:] input [validating:] input
+oasis/p48pass1.xml [not validating:] input [validating:] input
+oasis/p49pass1.xml [not validating:] input [validating:] input
+oasis/p50pass1.xml [not validating:] input [validating:] input
+oasis/p51pass1.xml [not validating:] input [validating:] input
+oasis/p52pass1.xml [not validating:] input [validating:] input
+oasis/p53pass1.xml [not validating:] input [validating:] input
+oasis/p54pass1.xml [not validating:] input [validating:] input
+oasis/p55pass1.xml [not validating:] input [validating:] input
+oasis/p56pass1.xml [not validating:] input [validating:] input
+oasis/p57pass1.xml [not validating:] input [validating:] input
+oasis/p58pass1.xml [not validating:] input [validating:] input
+oasis/p59pass1.xml [not validating:] input [validating:] input
+oasis/p60pass1.xml [not validating:] input [validating:] input
+oasis/p61pass1.xml [not validating:] input [validating:] input
+oasis/p62pass1.xml [not validating:] input [validating:] input
+oasis/p63pass1.xml [not validating:] input [validating:] input
+oasis/p64pass1.xml [not validating:] input [validating:] input
+oasis/p68pass1.xml [not validating:] input [validating:] input
+oasis/p69pass1.xml [not validating:] input [validating:] input
+oasis/p70pass1.xml [not validating:] input [validating:] input
+oasis/p71pass1.xml [not validating:] input [validating:] input
+oasis/p72pass1.xml [not validating:] input [validating:] input
+oasis/p73pass1.xml [not validating:] input [validating:] input
+oasis/p76pass1.xml [not validating:] input [validating:] input
+oasis/p01pass1.xml [not validating:] input [validating:] invalid
+oasis/p01pass3.xml [not validating:] input [validating:] invalid
+oasis/p03pass1.xml [not validating:] input [validating:] invalid
+p04pass1.xml: test applies to parsers without namespace support, skipping
+p05pass1.xml: test applies to parsers without namespace support, skipping
+oasis/p06fail1.xml [not validating:] input [validating:] invalid
+oasis/p08fail1.xml [not validating:] input [validating:] invalid
+oasis/p08fail2.xml [not validating:] input [validating:] invalid
+oasis/p10pass1.xml [not validating:] input [validating:] invalid
+oasis/p14pass1.xml [not validating:] input [validating:] invalid
+oasis/p15pass1.xml [not validating:] input [validating:] invalid
+oasis/p16pass1.xml [not validating:] input [validating:] invalid
+oasis/p16pass2.xml [not validating:] input [validating:] invalid
+oasis/p16pass3.xml [not validating:] input [validating:] invalid
+oasis/p18pass1.xml [not validating:] input [validating:] invalid
+oasis/p22pass1.xml [not validating:] input [validating:] invalid
+oasis/p22pass2.xml [not validating:] input [validating:] invalid
+oasis/p22pass3.xml [not validating:] input [validating:] invalid
+oasis/p23pass1.xml [not validating:] input [validating:] invalid
+oasis/p23pass2.xml [not validating:] input [validating:] invalid
+oasis/p23pass3.xml [not validating:] input [validating:] invalid
+oasis/p23pass4.xml [not validating:] input [validating:] invalid
+oasis/p24pass1.xml [not validating:] input [validating:] invalid
+oasis/p24pass2.xml [not validating:] input [validating:] invalid
+oasis/p24pass3.xml [not validating:] input [validating:] invalid
+oasis/p24pass4.xml [not validating:] input [validating:] invalid
+oasis/p25pass1.xml [not validating:] input [validating:] invalid
+oasis/p25pass2.xml [not validating:] input [validating:] invalid
+oasis/p26pass1.xml [not validating:] input [validating:] invalid
+oasis/p27pass1.xml [not validating:] input [validating:] invalid
+oasis/p27pass2.xml [not validating:] input [validating:] invalid
+oasis/p27pass3.xml [not validating:] input [validating:] invalid
+oasis/p27pass4.xml [not validating:] input [validating:] invalid
+oasis/p32pass1.xml [not validating:] input [validating:] invalid
+oasis/p32pass2.xml [not validating:] input [validating:] invalid
+oasis/p39pass1.xml [not validating:] input [validating:] invalid
+oasis/p39pass2.xml [not validating:] input [validating:] invalid
+oasis/p40pass1.xml [not validating:] input [validating:] invalid
+oasis/p40pass2.xml [not validating:] input [validating:] invalid
+oasis/p40pass3.xml [not validating:] input [validating:] invalid
+oasis/p40pass4.xml [not validating:] input [validating:] invalid
+oasis/p41pass1.xml [not validating:] input [validating:] invalid
+oasis/p41pass2.xml [not validating:] input [validating:] invalid
+oasis/p42pass1.xml [not validating:] input [validating:] invalid
+oasis/p42pass2.xml [not validating:] input [validating:] invalid
+oasis/p44pass1.xml [not validating:] input [validating:] invalid
+oasis/p44pass2.xml [not validating:] input [validating:] invalid
+oasis/p44pass3.xml [not validating:] input [validating:] invalid
+oasis/p44pass4.xml [not validating:] input [validating:] invalid
+oasis/p44pass5.xml [not validating:] input [validating:] invalid
+oasis/p66pass1.xml [not validating:] input [validating:] invalid
+oasis/p74pass1.xml [not validating:] input [validating:] invalid
+oasis/p75pass1.xml [not validating:] input [validating:] invalid
+oasis/e2.xml [not validating:] input [validating:] invalid
+oasis/p01fail1.xml [not validating:] not-wf [validating:] invalid
+oasis/p01fail2.xml [not validating:] not-wf [validating:] invalid
+oasis/p01fail3.xml [not validating:] not-wf [validating:] invalid
+oasis/p01fail4.xml [not validating:] not-wf [validating:] invalid
+oasis/p02fail1.xml [not validating:] not-wf [validating:] invalid
+oasis/p02fail10.xml [not validating:] not-wf [validating:] invalid
+oasis/p02fail11.xml [not validating:] not-wf [validating:] invalid
+oasis/p02fail12.xml [not validating:] not-wf [validating:] invalid
+oasis/p02fail13.xml [not validating:] not-wf [validating:] invalid
+oasis/p02fail14.xml [not validating:] not-wf [validating:] invalid
+oasis/p02fail15.xml [not validating:] not-wf [validating:] invalid
+oasis/p02fail16.xml [not validating:] not-wf [validating:] invalid
+oasis/p02fail17.xml [not validating:] not-wf [validating:] invalid
+oasis/p02fail18.xml [not validating:] not-wf [validating:] invalid
+oasis/p02fail19.xml [not validating:] not-wf [validating:] invalid
+oasis/p02fail2.xml [not validating:] not-wf [validating:] invalid
+oasis/p02fail20.xml [not validating:] not-wf [validating:] invalid
+oasis/p02fail21.xml [not validating:] not-wf [validating:] invalid
+oasis/p02fail22.xml [not validating:] not-wf [validating:] invalid
+oasis/p02fail23.xml [not validating:] not-wf [validating:] invalid
+oasis/p02fail24.xml [not validating:] not-wf [validating:] invalid
+oasis/p02fail25.xml [not validating:] not-wf [validating:] invalid
+oasis/p02fail26.xml [not validating:] not-wf [validating:] invalid
+oasis/p02fail27.xml [not validating:] not-wf [validating:] invalid
+oasis/p02fail28.xml [not validating:] not-wf [validating:] invalid
+oasis/p02fail29.xml [not validating:] not-wf [validating:] invalid
+oasis/p02fail3.xml [not validating:] not-wf [validating:] invalid
+oasis/p02fail30.xml [not validating:] not-wf [validating:] invalid
+oasis/p02fail31.xml [not validating:] not-wf [validating:] invalid
+oasis/p02fail4.xml [not validating:] not-wf [validating:] invalid
+oasis/p02fail5.xml [not validating:] not-wf [validating:] invalid
+oasis/p02fail6.xml [not validating:] not-wf [validating:] invalid
+oasis/p02fail7.xml [not validating:] not-wf [validating:] invalid
+oasis/p02fail8.xml [not validating:] not-wf [validating:] invalid
+oasis/p02fail9.xml [not validating:] not-wf [validating:] invalid
+oasis/p03fail1.xml [not validating:] not-wf [validating:] not-wf
+oasis/p03fail10.xml [not validating:] not-wf [validating:] not-wf
+oasis/p03fail11.xml [not validating:] not-wf [validating:] not-wf
+oasis/p03fail12.xml [not validating:] not-wf [validating:] not-wf
+oasis/p03fail13.xml [not validating:] not-wf [validating:] not-wf
+oasis/p03fail14.xml [not validating:] not-wf [validating:] not-wf
+oasis/p03fail15.xml [not validating:] not-wf [validating:] not-wf
+oasis/p03fail16.xml [not validating:] not-wf [validating:] not-wf
+oasis/p03fail17.xml [not validating:] not-wf [validating:] not-wf
+oasis/p03fail18.xml [not validating:] not-wf [validating:] not-wf
+oasis/p03fail19.xml [not validating:] not-wf [validating:] not-wf
+oasis/p03fail2.xml [not validating:] not-wf [validating:] not-wf
+oasis/p03fail20.xml [not validating:] not-wf [validating:] not-wf
+oasis/p03fail21.xml [not validating:] not-wf [validating:] not-wf
+oasis/p03fail22.xml [not validating:] not-wf [validating:] not-wf
+oasis/p03fail23.xml [not validating:] not-wf [validating:] not-wf
+oasis/p03fail24.xml [not validating:] not-wf [validating:] not-wf
+oasis/p03fail25.xml [not validating:] not-wf [validating:] not-wf
+oasis/p03fail26.xml [not validating:] not-wf [validating:] not-wf
+oasis/p03fail27.xml [not validating:] not-wf [validating:] not-wf
+oasis/p03fail28.xml [not validating:] not-wf [validating:] not-wf
+oasis/p03fail29.xml [not validating:] not-wf [validating:] not-wf
+oasis/p03fail3.xml [not validating:] not-wf [validating:] not-wf
+oasis/p03fail4.xml [not validating:] not-wf [validating:] not-wf
+oasis/p03fail5.xml [not validating:] not-wf [validating:] not-wf
+oasis/p03fail7.xml [not validating:] not-wf [validating:] not-wf
+oasis/p03fail8.xml [not validating:] not-wf [validating:] not-wf
+oasis/p03fail9.xml [not validating:] not-wf [validating:] not-wf
+oasis/p04fail1.xml [not validating:] not-wf [validating:] not-wf
+oasis/p04fail2.xml [not validating:] not-wf [validating:] not-wf
+oasis/p04fail3.xml [not validating:] not-wf [validating:] not-wf
+oasis/p05fail1.xml [not validating:] not-wf [validating:] not-wf
+oasis/p05fail2.xml [not validating:] not-wf [validating:] not-wf
+oasis/p05fail3.xml [not validating:] not-wf [validating:] not-wf
+oasis/p05fail4.xml [not validating:] not-wf [validating:] not-wf
+oasis/p05fail5.xml [not validating:] not-wf [validating:] not-wf
+oasis/p09fail1.xml [not validating:] not-wf [validating:] not-wf
+oasis/p09fail2.xml [not validating:] not-wf [validating:] not-wf
+oasis/p09fail3.xml [not validating:] not-wf [validating:] not-wf
+oasis/p09fail4.xml [not validating:] not-wf [validating:] not-wf
+oasis/p09fail5.xml [not validating:] not-wf [validating:] not-wf
+oasis/p10fail1.xml [not validating:] not-wf [validating:] not-wf
+oasis/p10fail2.xml [not validating:] not-wf [validating:] not-wf
+oasis/p10fail3.xml [not validating:] not-wf [validating:] not-wf
+oasis/p11fail1.xml [not validating:] not-wf [validating:] not-wf
+oasis/p11fail2.xml [not validating:] not-wf [validating:] not-wf
+oasis/p12fail1.xml [not validating:] not-wf [validating:] not-wf
+oasis/p12fail2.xml [not validating:] not-wf [validating:] not-wf
+oasis/p12fail3.xml [not validating:] not-wf [validating:] not-wf
+oasis/p12fail4.xml [not validating:] not-wf [validating:] not-wf
+oasis/p12fail5.xml [not validating:] not-wf [validating:] not-wf
+oasis/p12fail6.xml [not validating:] not-wf [validating:] not-wf
+oasis/p12fail7.xml [not validating:] not-wf [validating:] not-wf
+oasis/p14fail1.xml [not validating:] not-wf [validating:] invalid
+oasis/p14fail2.xml [not validating:] not-wf [validating:] invalid
+oasis/p14fail3.xml [not validating:] not-wf [validating:] invalid
+oasis/p15fail1.xml [not validating:] not-wf [validating:] not-wf
+oasis/p15fail2.xml [not validating:] not-wf [validating:] not-wf
+oasis/p15fail3.xml [not validating:] not-wf [validating:] not-wf
+oasis/p16fail1.xml [not validating:] not-wf [validating:] invalid
+oasis/p16fail2.xml [not validating:] not-wf [validating:] not-wf
+oasis/p16fail3.xml [not validating:] not-wf [validating:] not-wf
+oasis/p18fail1.xml [not validating:] not-wf [validating:] invalid
+oasis/p18fail2.xml [not validating:] not-wf [validating:] invalid
+oasis/p18fail3.xml [not validating:] not-wf [validating:] invalid
+oasis/p22fail1.xml [not validating:] not-wf [validating:] invalid
+oasis/p22fail2.xml [not validating:] not-wf [validating:] not-wf
+oasis/p23fail1.xml [not validating:] not-wf [validating:] not-wf
+oasis/p23fail2.xml [not validating:] not-wf [validating:] not-wf
+oasis/p23fail3.xml [not validating:] not-wf [validating:] not-wf
+oasis/p23fail4.xml [not validating:] not-wf [validating:] not-wf
+oasis/p23fail5.xml [not validating:] not-wf [validating:] not-wf
+oasis/p24fail1.xml [not validating:] not-wf [validating:] not-wf
+oasis/p24fail2.xml [not validating:] not-wf [validating:] not-wf
+oasis/p25fail1.xml [not validating:] not-wf [validating:] not-wf
+oasis/p26fail1.xml [not validating:] not-wf [validating:] not-wf
+oasis/p26fail2.xml [not validating:] not-wf [validating:] not-wf
+oasis/p27fail1.xml [not validating:] not-wf [validating:] not-wf
+oasis/p28fail1.xml [not validating:] not-wf [validating:] not-wf
+oasis/p29fail1.xml [not validating:] not-wf [validating:] not-wf
+oasis/p30fail1.xml [not validating:] not-wf [validating:] not-wf
+oasis/p31fail1.xml [not validating:] not-wf [validating:] not-wf
+oasis/p32fail1.xml [not validating:] not-wf [validating:] not-wf
+oasis/p32fail2.xml [not validating:] not-wf [validating:] not-wf
+oasis/p32fail3.xml [not validating:] not-wf [validating:] not-wf
+oasis/p32fail4.xml [not validating:] not-wf [validating:] not-wf
+oasis/p32fail5.xml [not validating:] not-wf [validating:] not-wf
+oasis/p39fail1.xml [not validating:] not-wf [validating:] invalid
+oasis/p39fail2.xml [not validating:] not-wf [validating:] invalid
+oasis/p39fail3.xml [not validating:] not-wf [validating:] invalid
+oasis/p39fail4.xml [not validating:] not-wf [validating:] not-wf
+oasis/p39fail5.xml [not validating:] not-wf [validating:] not-wf
+oasis/p40fail1.xml [not validating:] not-wf [validating:] not-wf
+oasis/p40fail2.xml [not validating:] not-wf [validating:] not-wf
+oasis/p40fail3.xml [not validating:] not-wf [validating:] not-wf
+oasis/p40fail4.xml [not validating:] not-wf [validating:] not-wf
+oasis/p41fail1.xml [not validating:] not-wf [validating:] not-wf
+oasis/p41fail2.xml [not validating:] not-wf [validating:] not-wf
+oasis/p41fail3.xml [not validating:] not-wf [validating:] not-wf
+oasis/p42fail1.xml [not validating:] not-wf [validating:] invalid
+oasis/p42fail2.xml [not validating:] not-wf [validating:] invalid
+oasis/p42fail3.xml [not validating:] not-wf [validating:] not-wf
+oasis/p43fail1.xml [not validating:] not-wf [validating:] not-wf
+oasis/p43fail2.xml [not validating:] not-wf [validating:] not-wf
+oasis/p43fail3.xml [not validating:] not-wf [validating:] not-wf
+oasis/p44fail1.xml [not validating:] not-wf [validating:] not-wf
+oasis/p44fail2.xml [not validating:] not-wf [validating:] not-wf
+oasis/p44fail3.xml [not validating:] not-wf [validating:] not-wf
+oasis/p44fail4.xml [not validating:] not-wf [validating:] not-wf
+oasis/p44fail5.xml [not validating:] not-wf [validating:] not-wf
+oasis/p45fail1.xml [not validating:] not-wf [validating:] not-wf
+oasis/p45fail2.xml [not validating:] not-wf [validating:] not-wf
+oasis/p45fail3.xml [not validating:] not-wf [validating:] not-wf
+oasis/p45fail4.xml [not validating:] not-wf [validating:] not-wf
+oasis/p46fail1.xml [not validating:] not-wf [validating:] not-wf
+oasis/p46fail2.xml [not validating:] not-wf [validating:] not-wf
+oasis/p46fail3.xml [not validating:] not-wf [validating:] not-wf
+oasis/p46fail4.xml [not validating:] not-wf [validating:] not-wf
+oasis/p46fail5.xml [not validating:] not-wf [validating:] not-wf
+oasis/p46fail6.xml [not validating:] not-wf [validating:] not-wf
+oasis/p47fail1.xml [not validating:] not-wf [validating:] not-wf
+oasis/p47fail2.xml [not validating:] not-wf [validating:] not-wf
+oasis/p47fail3.xml [not validating:] not-wf [validating:] not-wf
+oasis/p47fail4.xml [not validating:] not-wf [validating:] not-wf
+oasis/p48fail1.xml [not validating:] not-wf [validating:] not-wf
+oasis/p48fail2.xml [not validating:] not-wf [validating:] not-wf
+oasis/p49fail1.xml [not validating:] not-wf [validating:] not-wf
+oasis/p50fail1.xml [not validating:] not-wf [validating:] not-wf
+oasis/p51fail1.xml [not validating:] not-wf [validating:] not-wf
+oasis/p51fail2.xml [not validating:] not-wf [validating:] not-wf
+oasis/p51fail3.xml [not validating:] not-wf [validating:] not-wf
+oasis/p51fail4.xml [not validating:] not-wf [validating:] not-wf
+oasis/p51fail5.xml [not validating:] not-wf [validating:] not-wf
+oasis/p51fail6.xml [not validating:] not-wf [validating:] not-wf
+oasis/p51fail7.xml [not validating:] not-wf [validating:] not-wf
+oasis/p52fail1.xml [not validating:] not-wf [validating:] not-wf
+oasis/p52fail2.xml [not validating:] not-wf [validating:] not-wf
+oasis/p53fail1.xml [not validating:] not-wf [validating:] not-wf
+oasis/p53fail2.xml [not validating:] not-wf [validating:] not-wf
+oasis/p53fail3.xml [not validating:] not-wf [validating:] not-wf
+oasis/p53fail4.xml [not validating:] not-wf [validating:] not-wf
+oasis/p53fail5.xml [not validating:] not-wf [validating:] not-wf
+oasis/p54fail1.xml [not validating:] not-wf [validating:] not-wf
+oasis/p55fail1.xml [not validating:] not-wf [validating:] not-wf
+oasis/p56fail1.xml [not validating:] not-wf [validating:] not-wf
+oasis/p56fail2.xml [not validating:] not-wf [validating:] not-wf
+oasis/p56fail3.xml [not validating:] not-wf [validating:] not-wf
+oasis/p56fail4.xml [not validating:] not-wf [validating:] not-wf
+oasis/p56fail5.xml [not validating:] not-wf [validating:] not-wf
+oasis/p57fail1.xml [not validating:] not-wf [validating:] not-wf
+oasis/p58fail1.xml [not validating:] not-wf [validating:] not-wf
+oasis/p58fail2.xml [not validating:] not-wf [validating:] not-wf
+oasis/p58fail3.xml [not validating:] not-wf [validating:] invalid
+oasis/p58fail4.xml [not validating:] not-wf [validating:] not-wf
+oasis/p58fail5.xml [not validating:] not-wf [validating:] not-wf
+oasis/p58fail6.xml [not validating:] not-wf [validating:] not-wf
+oasis/p58fail7.xml [not validating:] not-wf [validating:] not-wf
+oasis/p58fail8.xml [not validating:] not-wf [validating:] not-wf
+oasis/p59fail1.xml [not validating:] not-wf [validating:] not-wf
+oasis/p59fail2.xml [not validating:] not-wf [validating:] not-wf
+oasis/p59fail3.xml [not validating:] not-wf [validating:] not-wf
+oasis/p60fail1.xml [not validating:] not-wf [validating:] not-wf
+oasis/p60fail2.xml [not validating:] not-wf [validating:] not-wf
+oasis/p60fail3.xml [not validating:] not-wf [validating:] not-wf
+oasis/p60fail4.xml [not validating:] not-wf [validating:] not-wf
+oasis/p60fail5.xml [not validating:] not-wf [validating:] not-wf
+oasis/p61fail1.xml [not validating:] not-wf [validating:] not-wf
+oasis/p62fail1.xml [not validating:] not-wf [validating:] not-wf
+oasis/p62fail2.xml [not validating:] not-wf [validating:] not-wf
+oasis/p63fail1.xml [not validating:] not-wf [validating:] not-wf
+oasis/p63fail2.xml [not validating:] not-wf [validating:] not-wf
+oasis/p64fail1.xml [not validating:] not-wf [validating:] not-wf
+oasis/p64fail2.xml [not validating:] not-wf [validating:] not-wf
+oasis/p66fail1.xml [not validating:] not-wf [validating:] invalid
+oasis/p66fail2.xml [not validating:] not-wf [validating:] invalid
+oasis/p66fail3.xml [not validating:] not-wf [validating:] invalid
+oasis/p66fail4.xml [not validating:] not-wf [validating:] invalid
+oasis/p66fail5.xml [not validating:] not-wf [validating:] invalid
+oasis/p66fail6.xml [not validating:] not-wf [validating:] invalid
+oasis/p68fail1.xml [not validating:] not-wf [validating:] not-wf
+oasis/p68fail2.xml [not validating:] not-wf [validating:] not-wf
+oasis/p68fail3.xml [not validating:] not-wf [validating:] not-wf
+oasis/p69fail1.xml [not validating:] not-wf [validating:] not-wf
+oasis/p69fail2.xml [not validating:] not-wf [validating:] not-wf
+oasis/p69fail3.xml [not validating:] not-wf [validating:] not-wf
+oasis/p70fail1.xml [not validating:] not-wf [validating:] not-wf
+oasis/p71fail1.xml [not validating:] not-wf [validating:] not-wf
+oasis/p71fail2.xml [not validating:] not-wf [validating:] not-wf
+oasis/p71fail3.xml [not validating:] not-wf [validating:] not-wf
+oasis/p71fail4.xml [not validating:] not-wf [validating:] not-wf
+oasis/p72fail1.xml [not validating:] not-wf [validating:] not-wf
+oasis/p72fail2.xml [not validating:] not-wf [validating:] not-wf
+oasis/p72fail3.xml [not validating:] not-wf [validating:] not-wf
+oasis/p72fail4.xml [not validating:] not-wf [validating:] not-wf
+oasis/p73fail1.xml [not validating:] not-wf [validating:] not-wf
+oasis/p73fail2.xml [not validating:] not-wf [validating:] not-wf
+oasis/p73fail3.xml [not validating:] not-wf [validating:] not-wf
+oasis/p73fail4.xml [not validating:] not-wf [validating:] not-wf
+oasis/p73fail5.xml [not validating:] not-wf [validating:] not-wf
+oasis/p74fail1.xml [not validating:] not-wf [validating:] not-wf
+oasis/p74fail2.xml [not validating:] not-wf [validating:] not-wf
+oasis/p74fail3.xml [not validating:] not-wf [validating:] not-wf
+oasis/p75fail1.xml [not validating:] not-wf [validating:] not-wf
+oasis/p75fail2.xml [not validating:] not-wf [validating:] not-wf
+oasis/p75fail3.xml [not validating:] not-wf [validating:] not-wf
+oasis/p75fail4.xml [not validating:] not-wf [validating:] not-wf
+oasis/p75fail5.xml [not validating:] not-wf [validating:] not-wf
+oasis/p75fail6.xml [not validating:] not-wf [validating:] not-wf
+oasis/p76fail1.xml [not validating:] not-wf [validating:] not-wf
+oasis/p76fail2.xml [not validating:] not-wf [validating:] not-wf
+oasis/p76fail3.xml [not validating:] not-wf [validating:] not-wf
+oasis/p76fail4.xml [not validating:] not-wf [validating:] not-wf
+ibm/invalid/P28/ibm28i01.xml [not validating:] input/output [validating:] invalid
+ibm/invalid/P32/ibm32i01.xml [not validating:] input/output [validating:] invalid
+ibm/invalid/P32/ibm32i03.xml [not validating:] input/output [validating:] invalid
+ibm/invalid/P32/ibm32i04.xml [not validating:] input/output [validating:] invalid
+ibm/invalid/P39/ibm39i01.xml [not validating:] input/output [validating:] invalid
+ibm/invalid/P39/ibm39i02.xml [not validating:] input/output [validating:] invalid
+ibm/invalid/P39/ibm39i03.xml [not validating:] input/output [validating:] invalid
+ibm/invalid/P39/ibm39i04.xml [not validating:] input/output [validating:] invalid
+ibm/invalid/P41/ibm41i01.xml [not validating:] input/output [validating:] invalid
+ibm/invalid/P41/ibm41i02.xml [not validating:] input/output [validating:] invalid
+ibm/invalid/P45/ibm45i01.xml [not validating:] input/output [validating:] invalid
+ibm/invalid/P49/ibm49i01.xml [not validating:] input/output [validating:] invalid
+ibm/invalid/P50/ibm50i01.xml [not validating:] input/output [validating:] invalid
+ibm/invalid/P51/ibm51i01.xml [not validating:] input/output [validating:] invalid
+ibm/invalid/P51/ibm51i03.xml [not validating:] input/output [validating:] invalid
+ibm/invalid/P56/ibm56i01.xml [not validating:] input/output [validating:] invalid
+ibm/invalid/P56/ibm56i02.xml [not validating:] input/output [validating:] invalid
+ibm/invalid/P56/ibm56i03.xml [not validating:] input/output [validating:] invalid
+ibm/invalid/P56/ibm56i05.xml [not validating:] input/output [validating:] invalid
+ibm/invalid/P56/ibm56i06.xml [not validating:] input/output [validating:] invalid
+ibm/invalid/P56/ibm56i07.xml [not validating:] input/output [validating:] invalid
+ibm/invalid/P56/ibm56i08.xml [not validating:] input/output [validating:] invalid
+ibm/invalid/P56/ibm56i09.xml [not validating:] input/output [validating:] invalid
+ibm/invalid/P56/ibm56i10.xml [not validating:] input/output [validating:] invalid
+ibm/invalid/P56/ibm56i11.xml [not validating:] input/output [validating:] invalid
+ibm/invalid/P56/ibm56i12.xml [not validating:] input/output [validating:] invalid
+ibm/invalid/P56/ibm56i13.xml [not validating:] input/output [validating:] invalid
+ibm/invalid/P56/ibm56i14.xml [not validating:] input/output [validating:] invalid
+ibm/invalid/P56/ibm56i15.xml [not validating:] input/output [validating:] invalid
+ibm/invalid/P56/ibm56i16.xml [not validating:] input/output [validating:] invalid
+ibm/invalid/P56/ibm56i17.xml [not validating:] input/output [validating:] invalid
+ibm/invalid/P56/ibm56i18.xml [not validating:] input/output [validating:] invalid
+ibm/invalid/P58/ibm58i01.xml [not validating:] input/output [validating:] invalid
+ibm/invalid/P58/ibm58i02.xml [not validating:] input/output [validating:] invalid
+ibm/invalid/P59/ibm59i01.xml [not validating:] input/output [validating:] invalid
+ibm/invalid/P60/ibm60i01.xml [not validating:] input/output [validating:] invalid
+ibm/invalid/P60/ibm60i02.xml [not validating:] input/output [validating:] invalid
+ibm/invalid/P60/ibm60i03.xml [not validating:] input/output [validating:] invalid
+ibm/invalid/P60/ibm60i04.xml [not validating:] input/output [validating:] invalid
+ibm/invalid/P76/ibm76i01.xml [not validating:] input/output [validating:] invalid
+ibm/not-wf/P01/ibm01n01.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P01/ibm01n02.xml [not validating:] not-wf [validating:] invalid
+ibm/not-wf/P01/ibm01n03.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P02/ibm02n01.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P02/ibm02n02.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P02/ibm02n03.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P02/ibm02n04.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P02/ibm02n05.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P02/ibm02n06.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P02/ibm02n07.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P02/ibm02n08.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P02/ibm02n09.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P02/ibm02n10.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P02/ibm02n11.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P02/ibm02n12.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P02/ibm02n13.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P02/ibm02n14.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P02/ibm02n15.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P02/ibm02n16.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P02/ibm02n17.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P02/ibm02n18.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P02/ibm02n19.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P02/ibm02n20.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P02/ibm02n21.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P02/ibm02n22.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P02/ibm02n23.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P02/ibm02n24.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P02/ibm02n25.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P02/ibm02n26.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P02/ibm02n27.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P02/ibm02n28.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P02/ibm02n29.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P02/ibm02n30.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P02/ibm02n31.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P02/ibm02n32.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P02/ibm02n33.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P03/ibm03n01.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P04/ibm04n01.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P04/ibm04n02.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P04/ibm04n03.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P04/ibm04n04.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P04/ibm04n05.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P04/ibm04n06.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P04/ibm04n07.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P04/ibm04n08.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P04/ibm04n09.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P04/ibm04n10.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P04/ibm04n11.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P04/ibm04n12.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P04/ibm04n13.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P04/ibm04n14.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P04/ibm04n15.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P04/ibm04n16.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P04/ibm04n17.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P04/ibm04n18.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P05/ibm05n01.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P05/ibm05n02.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P05/ibm05n03.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P09/ibm09n01.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P09/ibm09n02.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P09/ibm09n03.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P09/ibm09n04.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P10/ibm10n01.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P10/ibm10n02.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P10/ibm10n03.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P10/ibm10n04.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P10/ibm10n05.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P10/ibm10n06.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P10/ibm10n07.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P10/ibm10n08.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P11/ibm11n01.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P11/ibm11n02.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P11/ibm11n03.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P11/ibm11n04.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P12/ibm12n01.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P12/ibm12n02.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P12/ibm12n03.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P13/ibm13n01.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P13/ibm13n02.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P13/ibm13n03.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P14/ibm14n01.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P14/ibm14n02.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P14/ibm14n03.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P15/ibm15n01.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P15/ibm15n02.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P15/ibm15n03.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P15/ibm15n04.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P16/ibm16n01.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P16/ibm16n02.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P16/ibm16n03.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P16/ibm16n04.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P17/ibm17n01.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P17/ibm17n02.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P17/ibm17n03.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P17/ibm17n04.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P18/ibm18n01.xml [not validating:] not-wf [validating:] invalid
+ibm/not-wf/P18/ibm18n02.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P19/ibm19n01.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P19/ibm19n02.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P19/ibm19n03.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P20/ibm20n01.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P21/ibm21n01.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P21/ibm21n02.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P21/ibm21n03.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P22/ibm22n01.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P22/ibm22n02.xml [not validating:] not-wf [validating:] invalid
+ibm/not-wf/P22/ibm22n03.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P23/ibm23n01.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P23/ibm23n02.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P23/ibm23n03.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P23/ibm23n04.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P23/ibm23n05.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P23/ibm23n06.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P24/ibm24n01.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P24/ibm24n02.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P24/ibm24n03.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P24/ibm24n04.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P24/ibm24n05.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P24/ibm24n06.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P24/ibm24n07.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P24/ibm24n08.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P24/ibm24n09.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P25/ibm25n01.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P25/ibm25n02.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P26/ibm26n01.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P27/ibm27n01.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P28/ibm28n01.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P28/ibm28n02.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P28/ibm28n03.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P28/ibm28n04.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P28/ibm28n05.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P28/ibm28n06.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P28/ibm28n07.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P28/ibm28n08.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/p28a/ibm28an01.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P29/ibm29n01.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P29/ibm29n02.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P29/ibm29n03.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P29/ibm29n04.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P29/ibm29n05.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P29/ibm29n06.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P29/ibm29n07.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P30/ibm30n01.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P31/ibm31n01.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P32/ibm32n01.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P32/ibm32n02.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P32/ibm32n03.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P32/ibm32n04.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P32/ibm32n05.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P32/ibm32n06.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P32/ibm32n07.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P32/ibm32n08.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P32/ibm32n09.xml [not validating:] not-wf [validating:] invalid
+ibm/not-wf/P39/ibm39n01.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P39/ibm39n02.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P39/ibm39n03.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P39/ibm39n04.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P39/ibm39n05.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P39/ibm39n06.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P40/ibm40n01.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P40/ibm40n02.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P40/ibm40n03.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P40/ibm40n04.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P40/ibm40n05.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P41/ibm41n01.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P41/ibm41n02.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P41/ibm41n03.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P41/ibm41n04.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P41/ibm41n05.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P41/ibm41n06.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P41/ibm41n07.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P41/ibm41n08.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P41/ibm41n09.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P41/ibm41n10.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P41/ibm41n11.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P41/ibm41n12.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P41/ibm41n13.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P41/ibm41n14.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P42/ibm42n01.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P42/ibm42n02.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P42/ibm42n03.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P42/ibm42n04.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P42/ibm42n05.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P43/ibm43n01.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P43/ibm43n02.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P43/ibm43n04.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P43/ibm43n05.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P44/ibm44n01.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P44/ibm44n02.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P44/ibm44n03.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P44/ibm44n04.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P45/ibm45n01.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P45/ibm45n02.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P45/ibm45n03.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P45/ibm45n04.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P45/ibm45n05.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P45/ibm45n06.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P45/ibm45n07.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P45/ibm45n08.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P45/ibm45n09.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P46/ibm46n01.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P46/ibm46n02.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P46/ibm46n03.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P46/ibm46n04.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P46/ibm46n05.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P47/ibm47n01.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P47/ibm47n02.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P47/ibm47n03.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P47/ibm47n04.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P47/ibm47n05.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P47/ibm47n06.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P48/ibm48n01.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P48/ibm48n02.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P48/ibm48n03.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P48/ibm48n04.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P48/ibm48n05.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P48/ibm48n06.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P48/ibm48n07.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P49/ibm49n01.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P49/ibm49n02.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P49/ibm49n03.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P49/ibm49n04.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P49/ibm49n05.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P49/ibm49n06.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P50/ibm50n01.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P50/ibm50n02.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P50/ibm50n03.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P50/ibm50n04.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P50/ibm50n05.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P50/ibm50n06.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P50/ibm50n07.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P51/ibm51n01.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P51/ibm51n02.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P51/ibm51n03.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P51/ibm51n04.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P51/ibm51n05.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P51/ibm51n06.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P51/ibm51n07.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P52/ibm52n01.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P52/ibm52n02.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P52/ibm52n03.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P52/ibm52n04.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P52/ibm52n05.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P52/ibm52n06.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P53/ibm53n01.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P53/ibm53n02.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P53/ibm53n03.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P53/ibm53n04.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P53/ibm53n05.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P53/ibm53n06.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P53/ibm53n07.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P53/ibm53n08.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P54/ibm54n01.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P54/ibm54n02.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P55/ibm55n01.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P55/ibm55n02.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P55/ibm55n03.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P56/ibm56n01.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P56/ibm56n02.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P56/ibm56n03.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P56/ibm56n04.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P56/ibm56n05.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P56/ibm56n06.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P56/ibm56n07.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P57/ibm57n01.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P58/ibm58n01.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P58/ibm58n02.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P58/ibm58n03.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P58/ibm58n04.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P58/ibm58n05.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P58/ibm58n06.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P58/ibm58n07.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P58/ibm58n08.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P59/ibm59n01.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P59/ibm59n02.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P59/ibm59n03.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P59/ibm59n04.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P59/ibm59n05.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P59/ibm59n06.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P60/ibm60n01.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P60/ibm60n02.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P60/ibm60n03.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P60/ibm60n04.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P60/ibm60n05.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P60/ibm60n06.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P60/ibm60n07.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P60/ibm60n08.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P61/ibm61n01.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P62/ibm62n01.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P62/ibm62n02.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P62/ibm62n03.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P62/ibm62n04.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P62/ibm62n05.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P62/ibm62n06.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P62/ibm62n07.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P62/ibm62n08.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P63/ibm63n01.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P63/ibm63n02.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P63/ibm63n03.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P63/ibm63n04.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P63/ibm63n05.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P63/ibm63n06.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P63/ibm63n07.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P64/ibm64n01.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P64/ibm64n02.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P64/ibm64n03.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P65/ibm65n01.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P65/ibm65n02.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P66/ibm66n01.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P66/ibm66n02.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P66/ibm66n03.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P66/ibm66n04.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P66/ibm66n05.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P66/ibm66n06.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P66/ibm66n07.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P66/ibm66n08.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P66/ibm66n09.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P66/ibm66n10.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P66/ibm66n11.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P66/ibm66n12.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P66/ibm66n13.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P66/ibm66n14.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P66/ibm66n15.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P68/ibm68n01.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P68/ibm68n02.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P68/ibm68n03.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P68/ibm68n04.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P68/ibm68n05.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P68/ibm68n06.xml [not validating:] not-wf [validating:] invalid
+ibm/not-wf/P68/ibm68n07.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P68/ibm68n08.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P68/ibm68n09.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P68/ibm68n10.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P69/ibm69n01.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P69/ibm69n02.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P69/ibm69n03.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P69/ibm69n04.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P69/ibm69n06.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P69/ibm69n07.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P71/ibm70n01.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P71/ibm71n01.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P71/ibm71n02.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P71/ibm71n03.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P71/ibm71n04.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P71/ibm71n05.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P71/ibm71n06.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P71/ibm71n07.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P71/ibm71n08.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P72/ibm72n01.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P72/ibm72n02.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P72/ibm72n03.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P72/ibm72n04.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P72/ibm72n05.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P72/ibm72n06.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P72/ibm72n07.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P72/ibm72n08.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P72/ibm72n09.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P73/ibm73n01.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P73/ibm73n03.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P74/ibm74n01.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P75/ibm75n01.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P75/ibm75n02.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P75/ibm75n03.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P75/ibm75n04.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P75/ibm75n05.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P75/ibm75n06.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P75/ibm75n07.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P75/ibm75n08.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P75/ibm75n09.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P75/ibm75n10.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P75/ibm75n11.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P75/ibm75n12.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P75/ibm75n13.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P76/ibm76n01.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P76/ibm76n02.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P76/ibm76n03.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P76/ibm76n04.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P76/ibm76n05.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P76/ibm76n06.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P76/ibm76n07.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P77/ibm77n01.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P77/ibm77n02.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P77/ibm77n03.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P77/ibm77n04.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P78/ibm78n01.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P78/ibm78n02.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P79/ibm79n01.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P79/ibm79n02.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P80/ibm80n01.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P80/ibm80n02.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P80/ibm80n03.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P80/ibm80n04.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P80/ibm80n05.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P80/ibm80n06.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P81/ibm81n01.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P81/ibm81n02.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P81/ibm81n03.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P81/ibm81n04.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P81/ibm81n05.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P81/ibm81n06.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P81/ibm81n07.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P81/ibm81n08.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P81/ibm81n09.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P82/ibm82n01.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P82/ibm82n02.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P82/ibm82n03.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P82/ibm82n04.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P82/ibm82n05.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P82/ibm82n06.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P82/ibm82n07.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P82/ibm82n08.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P83/ibm83n01.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P83/ibm83n02.xml [not validating:] not-wf [validating:] invalid
+ibm/not-wf/P83/ibm83n03.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P83/ibm83n04.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P83/ibm83n05.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P83/ibm83n06.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n01.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n02.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n03.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n04.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n05.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n06.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n07.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n08.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n09.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n10.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n100.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n101.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n102.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n103.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n104.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n105.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n106.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n107.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n108.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n109.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n11.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n110.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n111.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n112.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n113.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n114.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n115.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n116.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n117.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n118.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n119.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n12.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n120.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n121.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n122.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n123.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n124.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n125.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n126.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n127.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n128.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n129.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n13.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n130.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n131.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n132.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n133.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n134.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n135.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n136.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n137.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n138.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n139.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n14.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n140.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n141.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n142.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n143.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n144.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n145.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n146.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n147.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n148.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n149.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n15.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n150.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n151.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n152.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n153.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n154.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n155.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n156.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n157.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n158.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n159.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n16.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n160.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n161.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n162.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n163.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n164.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n165.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n166.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n167.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n168.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n169.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n17.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n170.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n171.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n172.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n173.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n174.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n175.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n176.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n177.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n178.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n179.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n18.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n180.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n181.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n182.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n183.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n184.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n185.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n186.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n187.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n188.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n189.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n19.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n190.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n191.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n192.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n193.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n194.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n195.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n196.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n197.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n198.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n20.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n21.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n22.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n23.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n24.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n25.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n26.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n27.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n28.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n29.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n30.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n31.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n32.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n33.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n34.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n35.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n36.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n37.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n38.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n39.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n40.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n41.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n42.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n43.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n44.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n45.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n46.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n47.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n48.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n49.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n50.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n51.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n52.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n53.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n54.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n55.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n56.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n57.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n58.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n59.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n60.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n61.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n62.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n63.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n64.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n65.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n66.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n67.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n68.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n69.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n70.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n71.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n72.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n73.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n74.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n75.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n76.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n77.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n78.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n79.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n80.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n81.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n82.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n83.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n84.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n85.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n86.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n87.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n88.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n89.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n90.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n91.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n92.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n93.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n94.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n95.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n96.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n97.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n98.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P85/ibm85n99.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P86/ibm86n01.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P86/ibm86n02.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P86/ibm86n03.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P86/ibm86n04.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P87/ibm87n01.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P87/ibm87n02.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P87/ibm87n03.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P87/ibm87n04.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P87/ibm87n05.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P87/ibm87n06.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P87/ibm87n07.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P87/ibm87n08.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P87/ibm87n09.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P87/ibm87n10.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P87/ibm87n11.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P87/ibm87n12.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P87/ibm87n13.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P87/ibm87n14.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P87/ibm87n15.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P87/ibm87n16.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P87/ibm87n17.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P87/ibm87n18.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P87/ibm87n19.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P87/ibm87n20.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P87/ibm87n21.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P87/ibm87n22.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P87/ibm87n23.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P87/ibm87n24.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P87/ibm87n25.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P87/ibm87n26.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P87/ibm87n27.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P87/ibm87n28.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P87/ibm87n29.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P87/ibm87n30.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P87/ibm87n31.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P87/ibm87n32.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P87/ibm87n33.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P87/ibm87n34.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P87/ibm87n35.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P87/ibm87n36.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P87/ibm87n37.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P87/ibm87n38.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P87/ibm87n39.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P87/ibm87n40.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P87/ibm87n41.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P87/ibm87n42.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P87/ibm87n43.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P87/ibm87n44.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P87/ibm87n45.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P87/ibm87n46.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P87/ibm87n47.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P87/ibm87n48.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P87/ibm87n49.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P87/ibm87n50.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P87/ibm87n51.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P87/ibm87n52.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P87/ibm87n53.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P87/ibm87n54.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P87/ibm87n55.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P87/ibm87n56.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P87/ibm87n57.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P87/ibm87n58.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P87/ibm87n59.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P87/ibm87n60.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P87/ibm87n61.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P87/ibm87n62.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P87/ibm87n63.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P87/ibm87n64.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P87/ibm87n66.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P87/ibm87n67.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P87/ibm87n68.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P87/ibm87n69.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P87/ibm87n70.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P87/ibm87n71.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P87/ibm87n72.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P87/ibm87n73.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P87/ibm87n74.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P87/ibm87n75.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P87/ibm87n76.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P87/ibm87n77.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P87/ibm87n78.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P87/ibm87n79.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P87/ibm87n80.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P87/ibm87n81.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P87/ibm87n82.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P87/ibm87n83.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P87/ibm87n84.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P87/ibm87n85.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P88/ibm88n01.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P88/ibm88n02.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P88/ibm88n03.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P88/ibm88n04.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P88/ibm88n05.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P88/ibm88n06.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P88/ibm88n08.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P88/ibm88n09.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P88/ibm88n10.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P88/ibm88n11.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P88/ibm88n12.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P88/ibm88n13.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P88/ibm88n14.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P88/ibm88n15.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P88/ibm88n16.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P89/ibm89n01.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P89/ibm89n02.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P89/ibm89n03.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P89/ibm89n04.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P89/ibm89n05.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P89/ibm89n06.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P89/ibm89n07.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P89/ibm89n08.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P89/ibm89n09.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P89/ibm89n10.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P89/ibm89n11.xml [not validating:] not-wf [validating:] not-wf
+ibm/not-wf/P89/ibm89n12.xml [not validating:] not-wf [validating:] not-wf
+ibm/valid/P01/ibm01v01.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P02/ibm02v01.xml [not validating:] input [validating:] input
+ibm/valid/P03/ibm03v01.xml [not validating:] input [validating:] input
+ibm/valid/P09/ibm09v01.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P09/ibm09v02.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P09/ibm09v03.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P09/ibm09v04.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P09/ibm09v05.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P10/ibm10v01.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P10/ibm10v02.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P10/ibm10v03.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P10/ibm10v04.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P10/ibm10v05.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P10/ibm10v06.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P10/ibm10v07.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P10/ibm10v08.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P11/ibm11v01.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P11/ibm11v02.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P11/ibm11v03.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P11/ibm11v04.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P12/ibm12v01.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P12/ibm12v02.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P12/ibm12v03.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P12/ibm12v04.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P13/ibm13v01.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P14/ibm14v01.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P14/ibm14v02.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P14/ibm14v03.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P15/ibm15v01.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P15/ibm15v02.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P15/ibm15v03.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P15/ibm15v04.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P16/ibm16v01.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P16/ibm16v02.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P16/ibm16v03.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P17/ibm17v01.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P18/ibm18v01.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P19/ibm19v01.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P20/ibm20v01.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P20/ibm20v02.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P21/ibm21v01.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P22/ibm22v01.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P22/ibm22v02.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P22/ibm22v03.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P22/ibm22v04.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P22/ibm22v05.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P22/ibm22v06.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P22/ibm22v07.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P23/ibm23v01.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P23/ibm23v02.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P23/ibm23v03.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P23/ibm23v04.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P23/ibm23v05.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P23/ibm23v06.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P24/ibm24v01.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P24/ibm24v02.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P25/ibm25v01.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P25/ibm25v02.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P25/ibm25v03.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P25/ibm25v04.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P26/ibm26v01.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P27/ibm27v01.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P27/ibm27v02.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P27/ibm27v03.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P28/ibm28v01.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P30/ibm30v01.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P30/ibm30v02.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P31/ibm31v01.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P32/ibm32v01.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P32/ibm32v02.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P32/ibm32v03.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P32/ibm32v04.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P33/ibm33v01.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P34/ibm34v01.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P35/ibm35v01.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P36/ibm36v01.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P37/ibm37v01.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P38/ibm38v01.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P39/ibm39v01.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P40/ibm40v01.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P41/ibm41v01.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P42/ibm42v01.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P43/ibm43v01.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P44/ibm44v01.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P45/ibm45v01.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P47/ibm47v01.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P49/ibm49v01.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P50/ibm50v01.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P51/ibm51v01.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P51/ibm51v02.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P52/ibm52v01.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P54/ibm54v01.xml [not validating:] input [validating:] input
+ibm/valid/P54/ibm54v02.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P54/ibm54v03.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P55/ibm55v01.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P56/ibm56v01.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P56/ibm56v02.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P56/ibm56v03.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P56/ibm56v04.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P56/ibm56v05.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P56/ibm56v06.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P56/ibm56v07.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P56/ibm56v08.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P56/ibm56v09.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P56/ibm56v10.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P57/ibm57v01.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P58/ibm58v01.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P58/ibm58v02.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P59/ibm59v01.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P59/ibm59v02.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P60/ibm60v01.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P60/ibm60v02.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P60/ibm60v03.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P60/ibm60v04.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P61/ibm61v01.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P61/ibm61v02.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P62/ibm62v01.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P62/ibm62v02.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P62/ibm62v03.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P62/ibm62v04.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P62/ibm62v05.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P63/ibm63v01.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P63/ibm63v02.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P63/ibm63v03.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P63/ibm63v04.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P63/ibm63v05.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P64/ibm64v01.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P64/ibm64v02.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P64/ibm64v03.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P65/ibm65v01.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P65/ibm65v02.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P66/ibm66v01.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P67/ibm67v01.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P68/ibm68v01.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P68/ibm68v02.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P69/ibm69v01.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P69/ibm69v02.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P70/ibm70v01.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P78/ibm78v01.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P79/ibm79v01.xml [not validating:] input [validating:] input
+ibm/valid/P82/ibm82v01.xml [not validating:] input/output [validating:] input/output
+ibm/valid/P85/ibm85v01.xml [not validating:] input [validating:] input
+ibm/valid/P86/ibm86v01.xml [not validating:] input [validating:] input
+ibm/valid/P87/ibm87v01.xml [not validating:] input [validating:] input
+ibm/valid/P88/ibm88v01.xml [not validating:] input [validating:] input
+ibm/valid/P89/ibm89v01.xml [not validating:] input [validating:] input
+eduni/namespaces/1.0/001.xml [not validating:] input [validating:] input
+eduni/namespaces/1.0/002.xml [not validating:] input [validating:] input
+eduni/namespaces/1.0/003.xml [not validating:] input [validating:] input
+eduni/namespaces/1.0/007.xml [not validating:] input [validating:] input
+eduni/namespaces/1.0/008.xml [not validating:] input [validating:] input
+eduni/namespaces/1.0/009.xml [not validating:] not-wf [validating:] not-wf
+eduni/namespaces/1.0/010.xml [not validating:] not-wf [validating:] not-wf
+eduni/namespaces/1.0/011.xml [not validating:] not-wf [validating:] not-wf
+eduni/namespaces/1.0/012.xml [not validating:] not-wf [validating:] not-wf
+eduni/namespaces/1.0/013.xml [not validating:] not-wf [validating:] invalid
+eduni/namespaces/1.0/014.xml [not validating:] not-wf [validating:] invalid
+eduni/namespaces/1.0/015.xml [not validating:] not-wf [validating:] invalid
+eduni/namespaces/1.0/016.xml [not validating:] not-wf [validating:] invalid
+eduni/namespaces/1.0/017.xml [not validating:] input [validating:] invalid
+eduni/namespaces/1.0/018.xml [not validating:] input [validating:] invalid
+eduni/namespaces/1.0/019.xml [not validating:] input [validating:] invalid
+eduni/namespaces/1.0/020.xml [not validating:] input [validating:] invalid
+eduni/namespaces/1.0/021.xml [not validating:] input [validating:] invalid
+eduni/namespaces/1.0/022.xml [not validating:] input [validating:] invalid
+eduni/namespaces/1.0/023.xml [not validating:] not-wf [validating:] invalid
+eduni/namespaces/1.0/024.xml [not validating:] input [validating:] invalid
+eduni/namespaces/1.0/025.xml [not validating:] not-wf [validating:] invalid
+eduni/namespaces/1.0/026.xml [not validating:] not-wf [validating:] invalid
+eduni/namespaces/1.0/027.xml [not validating:] input [validating:] invalid
+eduni/namespaces/1.0/028.xml [not validating:] input [validating:] invalid
+eduni/namespaces/1.0/029.xml [not validating:] not-wf [validating:] invalid
+eduni/namespaces/1.0/030.xml [not validating:] not-wf [validating:] invalid
+eduni/namespaces/1.0/031.xml [not validating:] not-wf [validating:] invalid
+eduni/namespaces/1.0/032.xml [not validating:] not-wf [validating:] invalid
+eduni/namespaces/1.0/033.xml [not validating:] not-wf [validating:] invalid
+eduni/namespaces/1.0/034.xml [not validating:] input [validating:] invalid
+eduni/namespaces/1.0/035.xml [not validating:] not-wf [validating:] invalid
+eduni/namespaces/1.0/036.xml [not validating:] not-wf [validating:] invalid
+eduni/namespaces/1.0/037.xml [not validating:] input [validating:] invalid
+eduni/namespaces/1.0/038.xml [not validating:] input [validating:] invalid
+eduni/namespaces/1.0/039.xml [not validating:] input [validating:] invalid
+eduni/namespaces/1.0/040.xml [not validating:] input [validating:] invalid
+eduni/namespaces/1.0/041.xml [not validating:] input [validating:] invalid
+eduni/namespaces/1.0/042.xml [not validating:] not-wf [validating:] not-wf
+eduni/namespaces/1.0/043.xml [not validating:] not-wf [validating:] not-wf
+eduni/namespaces/1.0/044.xml [not validating:] not-wf [validating:] not-wf
+eduni/namespaces/1.0/045.xml [not validating:] input [validating:] invalid
+eduni/namespaces/1.0/046.xml [not validating:] input [validating:] invalid
+0/1829 tests failed; 333 tests were skipped
\ No newline at end of file
Added: branches/grin-neu/thirdparty/cxml/XMLS-SYMBOLS.diff
===================================================================
--- branches/grin-neu/thirdparty/cxml/XMLS-SYMBOLS.diff 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/cxml/XMLS-SYMBOLS.diff 2006-12-01 10:39:49 UTC (rev 2094)
@@ -0,0 +1,98 @@
+* looking for david(a)knowledgetools.de--cxml/cxml--devel--1.0--patch-309 to compare with
+* comparing to david(a)knowledgetools.de--cxml/cxml--devel--1.0--patch-309
+M xml/xmls-compat.lisp
+
+* modified files
+
+--- orig/xml/xmls-compat.lisp
++++ mod/xml/xmls-compat.lisp
+@@ -12,7 +12,8 @@
+ (defpackage cxml-xmls
+ (:use :cl :runes)
+ (:export #:make-node #:node-name #:node-ns #:node-attrs #:node-children
+- #:make-xmls-builder #:map-node))
++ #:make-xmls-builder #:map-node
++ #:*identifier-case*))
+
+ (in-package :cxml-xmls)
+
+@@ -64,6 +65,10 @@
+
+ ;;;; SAX-Handler (Parser)
+
++(defvar *identifier-case* nil
++ "One of NIL (don't intern names), :PRESERVE, :UPCASE, :DOWNCASE, or :INVERT
++ (intern name into the keyword package after adjusting case).")
++
+ (defclass xmls-builder ()
+ ((element-stack :initform nil :accessor element-stack)
+ (root :initform nil :accessor root)))
+@@ -74,16 +79,46 @@
+ (defmethod sax:end-document ((handler xmls-builder))
+ (root handler))
+
++(defun string-invert-case (str)
++ (map 'string
++ (lambda (c)
++ (cond
++ ((upper-case-p c) (char-downcase c))
++ ((lower-case-p c) (char-upcase c))
++ (t c)))
++ str))
++
++(defun maybe-intern (name)
++ (if *identifier-case*
++ (let ((str (if (stringp name) name (rod-string name))))
++ (intern (ecase *identifier-case*
++ (:preserve str)
++ (:upcase (string-upcase str))
++ (:downcase (string-downcase str))
++ (:invert (string-invert-case str)))
++ :keyword))
++ name))
++
++(defun maybe-stringify (name)
++ (if (symbolp name)
++ (let ((str (symbol-name name)))
++ (ecase *identifier-case*
++ (:preserve str)
++ (:upcase (string-downcase str))
++ (:downcase (string-upcase str))
++ (:invert (string-invert-case str))))
++ name))
++
+ (defmethod sax:start-element
+ ((handler xmls-builder) namespace-uri local-name qname attributes)
+ (declare (ignore namespace-uri))
+ (setf local-name (or local-name qname))
+ (let* ((attributes
+ (mapcar (lambda (attr)
+- (list (sax:attribute-qname attr)
++ (list (maybe-intern (sax:attribute-qname attr))
+ (sax:attribute-value attr)))
+ attributes))
+- (node (make-node :name local-name
++ (node (make-node :name (maybe-intern local-name)
+ :ns (let ((lq (length qname))
+ (ll (length local-name)))
+ (if (eql lq ll)
+@@ -124,7 +159,7 @@
+ (labels ((walk (node)
+ (let* ((attlist
+ (compute-attributes node include-xmlns-attributes))
+- (lname (rod (node-name node)))
++ (lname (rod (maybe-stringify (node-name node))))
+ (ns (rod (node-ns node)))
+ (qname (concatenate 'rod ns (rod ":") lname)))
+ ;; fixme: namespaces
+@@ -141,6 +176,7 @@
+ (remove nil
+ (mapcar (lambda (a)
+ (destructuring-bind (name value) a
++ (setf name (maybe-stringify name))
+ (if (or xmlnsp (not (cxml::xmlns-attr-p (rod name))))
+ (sax:make-attribute :qname (rod name)
+ :value (rod value)
+
+
+
Modified: branches/grin-neu/thirdparty/cxml/catalog.dtd
===================================================================
--- branches/grin-neu/thirdparty/cxml/catalog.dtd 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/cxml/catalog.dtd 2006-12-01 10:39:49 UTC (rev 2094)
@@ -1,4 +1,4 @@
-<!-- $Id: catalog.dtd,v 1.10 2002/10/18 23:54:58 ndw Exp $ -->
+<!-- $Id: catalog.dtd,v 1.1.1.1 2005/03/13 18:02:52 david Exp $ -->
<!ENTITY % pubIdChars "CDATA">
<!ENTITY % publicIdentifier "%pubIdChars;">
Added: branches/grin-neu/thirdparty/cxml/contrib/xhtmlgen.lisp
===================================================================
--- branches/grin-neu/thirdparty/cxml/contrib/xhtmlgen.lisp 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/cxml/contrib/xhtmlgen.lisp 2006-12-01 10:39:49 UTC (rev 2094)
@@ -0,0 +1,352 @@
+;; xhtmlgen.lisp
+;; This version by david(a)lichteblau.com for headcraft (http://headcraft.de/)
+;;
+;; Derived from htmlgen.cl:
+;; copyright (c) 1986-2000 Franz Inc, Berkeley, CA
+;;
+;; This code is free software; you can redistribute it and/or
+;; modify it under the terms of the version 2.1 of
+;; the GNU Lesser General Public License as published by
+;; the Free Software Foundation, as clarified by the AllegroServe
+;; prequel found in license-allegroserve.txt.
+;;
+;; This code is distributed in the hope that it will be useful,
+;; but without any warranty; without even the implied warranty of
+;; merchantability or fitness for a particular purpose. See the GNU
+;; Lesser General Public License for more details.
+;;
+;; Version 2.1 of the GNU Lesser General Public License is in the file
+;; license-lgpl.txt that was distributed with this file.
+;; If it is not present, you can access it from
+;; http://www.gnu.org/copyleft/lesser.txt (until superseded by a newer
+;; version) or write to the Free Software Foundation, Inc., 59 Temple Place,
+;; Suite 330, Boston, MA 02111-1307 USA
+
+(defpackage :xhtml-generator
+ (:use :common-lisp)
+ (:export #:with-html #:write-doctype))
+
+(in-package :xhtml-generator)
+
+;; html generation
+
+(defstruct (html-process (:type list) (:constructor
+ make-html-process (key macro special
+ name-attr
+ )))
+ key ; keyword naming this tag
+ macro ; the macro to define this
+ special ; if true then call this to process the keyword and return
+ ; the macroexpansion
+ name-attr ; attribute symbols which can name this object for subst purposes
+ )
+
+
+(defparameter *html-process-table*
+ (make-hash-table :test #'equal) ; #'eq is accurate but want to avoid rehashes
+ )
+
+(defvar *html-sink*)
+
+(defun write-doctype (sink)
+ (sax:start-dtd sink
+ "html"
+ "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd")
+ (sax:end-dtd sink))
+
+(defmacro with-html (sink &rest forms &environment env)
+ `(let ((*html-sink* ,sink))
+ ,(process-html-forms forms env)))
+
+(defun get-process (form)
+ (let ((ent (gethash form *html-process-table*)))
+ (unless ent
+ (error "unknown html keyword ~s" form))
+ ent))
+
+(defun process-html-forms (forms env)
+ (let (res)
+ (flet ((do-ent (ent args argsp body)
+ ;; ent is an html-process object associated with the
+ ;; html tag we're processing
+ ;; args is the list of values after the tag in the form
+ ;; ((:tag &rest args) ....)
+ ;; argsp is true if this isn't a singleton tag (i.e. it has
+ ;; a body) .. (:tag ...) or ((:tag ...) ...)
+ ;; body is the body if any of the form
+ ;;
+ (let ((special (html-process-special ent)))
+ (push (if special
+ (funcall special ent args argsp body)
+ `(,(html-process-macro ent)
+ ,args
+ ,(process-html-forms body env)))
+ res))))
+ (do* ((xforms forms (cdr xforms))
+ (form (car xforms) (car xforms)))
+ ((null xforms))
+
+ (setq form (macroexpand form env))
+
+ (if (atom form)
+ (typecase form
+ (keyword (do-ent (get-process form) nil nil nil))
+ (string (push `(sax:characters *html-sink* ,form) res))
+ (t (push form res)))
+ (let ((first (car form)))
+ (cond
+ ((keywordp first)
+ ;; (:xxx . body) form
+ (do-ent (get-process (car form)) nil t (cdr form)))
+ ((and (consp first) (keywordp (car first)))
+ ;; ((:xxx args ) . body)
+ (do-ent (get-process (caar form)) (cdr first) t (cdr form)))
+ (t
+ (push form res)))))))
+ `(progn ,@(nreverse res))))
+
+(defun html-body-key-form (string-code args body)
+ (unless (evenp (length args))
+ (error "attribute list ~S isn't even" args))
+ `(let ((.tagname. ,string-code))
+ (sax:start-element *html-sink* nil nil .tagname.
+ (list
+ ,@(loop
+ for (name value) on args by #'cddr
+ collect
+ `(sax:make-attribute
+ :qname ,(etypecase name
+ (symbol (symbol-name name))
+ (string name))
+ :value ,value
+ :specified-p t))))
+ ,@body
+ (sax:end-element *html-sink* nil nil .tagname.)))
+
+(defun emit-without-quoting (str)
+ (let ((s (cxml::chained-handler *html-sink*)))
+ (cxml::maybe-close-tag s)
+ (map nil (lambda (c) (cxml::write-rune (char-code c) s)) str)))
+
+(defun princ-http (val)
+ (warn "use of deprecated :PRINC (use :PRINC-SAFE instead?)")
+ (emit-without-quoting (princ-to-string val)))
+
+(defun prin1-http (val)
+ (warn "use of deprecated :PRIN1 (use :PRIN1-SAFE instead?)")
+ (emit-without-quoting (prin1-to-string val)))
+
+(defun princ-safe-http (val)
+ (sax:characters *html-sink* (princ-to-string val)))
+
+(defun prin1-safe-http (val)
+ (sax:characters *html-sink* (prin1-to-string val)))
+
+
+;; -- defining how html tags are handled. --
+;;
+;; most tags are handled in a standard way and the def-std-html
+;; macro is used to define such tags
+;;
+;; Some tags need special treatment and def-special-html defines
+;; how these are handled. The tags requiring special treatment
+;; are the pseudo tags we added to control operations
+;; in the html generator.
+;;
+;;
+;; tags can be found in three ways:
+;; :br - singleton, no attributes, no body
+;; (:b "foo") - no attributes but with a body
+;; ((:a href="foo") "balh") - attributes and body
+;;
+
+(defmacro def-special-html (kwd fcn)
+ ;; kwd - the tag we're defining behavior for.
+ ;; fcn - function to compute the macroexpansion of a use of this
+ ;; tag. args to fcn are:
+ ;; ent - html-process object holding info on this tag
+ ;; args - list of attribute-values following tag
+ ;; argsp - true if there is a body in this use of the tag
+ ;; body - list of body forms.
+ `(setf (gethash ,kwd *html-process-table*)
+ (make-html-process ,kwd nil ,fcn nil)))
+
+(def-special-html :newline
+ #'(lambda (ent args argsp body)
+ (declare (ignore ent args argsp))
+ (when body
+ (error "can't have a body with :newline -- body is ~s" body))
+ (emit-without-quoting (string #\newline))))
+
+(def-special-html :princ
+ #'(lambda (ent args argsp body)
+ (declare (ignore ent args argsp))
+ `(progn ,@(mapcar #'(lambda (bod)
+ `(princ-http ,bod))
+ body))))
+
+(def-special-html :princ-safe
+ #'(lambda (ent args argsp body)
+ (declare (ignore ent args argsp))
+ `(progn ,@(mapcar #'(lambda (bod)
+ `(princ-safe-http ,bod))
+ body))))
+
+(def-special-html :prin1
+ #'(lambda (ent args argsp body)
+ (declare (ignore ent args argsp))
+ `(progn ,@(mapcar #'(lambda (bod)
+ `(prin1-http ,bod))
+ body))))
+
+(def-special-html :prin1-safe
+ #'(lambda (ent args argsp body)
+ (declare (ignore ent args argsp))
+ `(progn ,@(mapcar #'(lambda (bod)
+ `(prin1-safe-http ,bod))
+ body))))
+
+(def-special-html :comment
+ #'(lambda (ent args argsp body)
+ (declare (ignore ent args argsp body))
+ `(warn ":COMMENT in html macro not supported yet")))
+
+(defmacro def-std-html (kwd name-attrs)
+ (let ((mac-name (intern (format nil "~a-~a" :with-html kwd)))
+ (string-code (string-downcase (string kwd))))
+ `(progn (setf (gethash ,kwd *html-process-table*)
+ (make-html-process ,kwd
+ ',mac-name
+ nil
+ ',name-attrs))
+ (defmacro ,mac-name (args &rest body)
+ (html-body-key-form ,string-code args body)))))
+
+(def-std-html :a nil)
+(def-std-html :abbr nil)
+(def-std-html :acronym nil)
+(def-std-html :address nil)
+(def-std-html :applet nil)
+(def-std-html :area nil)
+
+(def-std-html :b nil)
+(def-std-html :base nil)
+(def-std-html :basefont nil)
+(def-std-html :bdo nil)
+(def-std-html :bgsound nil)
+(def-std-html :big nil)
+(def-std-html :blink nil)
+(def-std-html :blockquote nil)
+(def-std-html :body nil)
+(def-std-html :br nil)
+(def-std-html :button nil)
+
+(def-std-html :caption nil)
+(def-std-html :center nil)
+(def-std-html :cite nil)
+(def-std-html :code nil)
+(def-std-html :col nil)
+(def-std-html :colgroup nil)
+
+(def-std-html :dd nil)
+(def-std-html :del nil)
+(def-std-html :dfn nil)
+(def-std-html :dir nil)
+(def-std-html :div nil)
+(def-std-html :dl nil)
+(def-std-html :dt nil)
+
+(def-std-html :em nil)
+(def-std-html :embed nil)
+
+(def-std-html :fieldset nil)
+(def-std-html :font nil)
+(def-std-html :form :name)
+(def-std-html :frame nil)
+(def-std-html :frameset nil)
+
+(def-std-html :h1 nil)
+(def-std-html :h2 nil)
+(def-std-html :h3 nil)
+(def-std-html :h4 nil)
+(def-std-html :h5 nil)
+(def-std-html :h6 nil)
+(def-std-html :head nil)
+(def-std-html :hr nil)
+(def-std-html :html nil)
+
+(def-std-html :i nil)
+(def-std-html :iframe nil)
+(def-std-html :ilayer nil)
+(def-std-html :img :id)
+(def-std-html :input nil)
+(def-std-html :ins nil)
+(def-std-html :isindex nil)
+
+(def-std-html :kbd nil)
+(def-std-html :keygen nil)
+
+(def-std-html :label nil)
+(def-std-html :layer nil)
+(def-std-html :legend nil)
+(def-std-html :li nil)
+(def-std-html :link nil)
+(def-std-html :listing nil)
+
+(def-std-html :map nil)
+(def-std-html :marquee nil)
+(def-std-html :menu nil)
+(def-std-html :meta nil)
+(def-std-html :multicol nil)
+
+(def-std-html :nobr nil)
+(def-std-html :noembed nil)
+(def-std-html :noframes nil)
+(def-std-html :noscript nil)
+
+(def-std-html :object nil)
+(def-std-html :ol nil)
+(def-std-html :optgroup nil)
+(def-std-html :option nil)
+
+(def-std-html :p nil)
+(def-std-html :param nil)
+(def-std-html :plaintext nil)
+(def-std-html :pre nil)
+
+(def-std-html :q nil)
+
+(def-std-html :s nil)
+(def-std-html :samp nil)
+(def-std-html :script nil)
+(def-std-html :select nil)
+(def-std-html :server nil)
+(def-std-html :small nil)
+(def-std-html :spacer nil)
+(def-std-html :span :id)
+(def-std-html :strike nil)
+(def-std-html :strong nil)
+(def-std-html :style nil)
+(def-std-html :sub nil)
+(def-std-html :sup nil)
+
+(def-std-html :table :name)
+(def-std-html :tbody nil)
+(def-std-html :td nil)
+(def-std-html :textarea nil)
+(def-std-html :tfoot nil)
+(def-std-html :th nil)
+(def-std-html :thead nil)
+(def-std-html :title nil)
+(def-std-html :tr nil)
+(def-std-html :tt nil)
+
+(def-std-html :u nil)
+(def-std-html :ul nil)
+
+(def-std-html :var nil)
+
+(def-std-html :wbr nil)
+
+(def-std-html :xmp nil)
Modified: branches/grin-neu/thirdparty/cxml/cxml.asd
===================================================================
--- branches/grin-neu/thirdparty/cxml/cxml.asd 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/cxml/cxml.asd 2006-12-01 10:39:49 UTC (rev 2094)
@@ -5,10 +5,6 @@
(:use :asdf :cl))
(in-package :cxml-system)
-;; XXX das sollte natuerlich erst beim laden stattfinden
-#+cmu
-(require :gray-streams)
-
(defclass closure-source-file (cl-source-file) ())
#+sbcl
@@ -18,7 +14,7 @@
(let (#+sbcl (*compile-print* nil))
(call-next-method))))
-#-(or rune-is-character rune-is-octet)
+#-(or rune-is-character rune-is-integer)
(progn
(format t "~&;;; Checking for wide character support...")
(force-output)
@@ -28,7 +24,7 @@
:rune-is-character))
(unless (and (< x char-code-limit) (code-char x))
(format t " no, reverting to octet strings.~%")
- (return :rune-is-octet)))
+ (return :rune-is-integer)))
*features*))
#-rune-is-character
@@ -37,67 +33,81 @@
#+rune-is-character
(format t "~&;;; Building cxml with CHARACTER RUNES~%")
-(defsystem runes
+(defsystem :cxml-runes
:default-component-class closure-source-file
:pathname (merge-pathnames
"runes/"
(make-pathname :name nil :type nil :defaults *load-truename*))
+ :serial t
:components
((:file "package")
- (:file dependent
- :pathname
- #+CLISP "dep-clisp"
- #+(AND :CMU (NOT :PTHREAD)) "dep-cmucl"
- #+sbcl "dep-sbcl"
- #+(AND :CMU :PTHREAD) "dep-cmucl-dtc"
- #+(and allegro-version>= (version>= 5.0)) "dep-acl5"
- #+(and allegro-version>= (not (version>= 5.0))) "dep-acl"
- #-(or sbcl CLISP CMU allegro) #.(error "Configure!")
- :depends-on ("package"))
+ (:file "definline")
(:file runes
:pathname
#-rune-is-character "runes"
- #+rune-is-character "characters"
- :depends-on ("package" dependent))
- (:file "syntax" :depends-on ("package" dependent runes))
- (:file "util" :depends-on ("package" dependent))
- (:file "encodings" :depends-on ("package"))
- (:file "encodings-data" :depends-on ("package" "encodings"))
- (:file "xstream"
- :depends-on ("package" dependent "syntax" "encodings-data"))))
+ #+rune-is-character "characters")
+ #+rune-is-integer (:file "utf8")
+ (:file "syntax")
+ (:file "encodings")
+ (:file "encodings-data")
+ (:file "xstream")
+ (:file "ystream")))
-(asdf:defsystem :xml
+(asdf:defsystem :cxml-xml
:default-component-class closure-source-file
:pathname (merge-pathnames
"xml/"
(make-pathname :name nil :type nil :defaults *load-truename*))
:components
((:file "package")
+ (:file "util" :depends-on ("package"))
(:file "sax-handler")
- (:file "characters" :depends-on ("package"))
- (:file "xml-name-rune-p" :depends-on ("package"))
+ (:file "xml-name-rune-p" :depends-on ("package" "util"))
(:file "split-sequence" :depends-on ("package"))
- (:file "xml-parse" :depends-on ("package" "sax-handler" "split-sequence" "xml-name-rune-p" "characters"))
- (:file "characters" :depends-on ("package"))
+ (:file "xml-parse" :depends-on ("package" "util" "sax-handler" "split-sequence" "xml-name-rune-p"))
(:file "unparse" :depends-on ("xml-parse"))
(:file "xmls-compat" :depends-on ("xml-parse"))
(:file "recoder" :depends-on ("xml-parse"))
- (:file "catalog" :depends-on ("xml-parse")))
- :depends-on (:runes :puri))
+ (:file "xmlns-normalizer" :depends-on ("xml-parse"))
+ (:file "space-normalizer" :depends-on ("xml-parse"))
+ (:file "catalog" :depends-on ("xml-parse"))
+ (:file "sax-proxy" :depends-on ("xml-parse")))
+ :depends-on (:cxml-runes :puri :trivial-gray-streams))
-(asdf:defsystem :dom
+(defclass utf8dom-file (closure-source-file) ((of)))
+
+(defmethod output-files ((operation compile-op) (c utf8dom-file))
+ (let* ((normal (car (call-next-method)))
+ (name (concatenate 'string (pathname-name normal) "-utf8"))
+ (of (make-pathname :name name :defaults normal)))
+ (setf (slot-value c 'of) of)
+ (list of)))
+
+(defmethod perform ((o load-op) (c utf8dom-file))
+ (load (slot-value c 'of)))
+
+(defvar *utf8-runes-readtable*)
+
+(defmethod perform ((operation compile-op) (c utf8dom-file))
+ (let ((*features* (cons 'utf8dom-file *features*))
+ (*readtable* *utf8-runes-readtable*))
+ (call-next-method)))
+
+(asdf:defsystem :cxml-dom
:default-component-class closure-source-file
:pathname (merge-pathnames
"dom/"
(make-pathname :name nil :type nil :defaults *load-truename*))
:components
((:file "package")
- (:file "dom-impl" :depends-on ("package"))
- (:file "dom-builder" :depends-on ("dom-impl"))
- (:file "unparse" :depends-on ("package"))
- (:file "simple-dom" :depends-on ("package"))
+ (:file rune-impl :pathname "dom-impl" :depends-on ("package"))
+ (:file rune-builder :pathname "dom-builder" :depends-on (rune-impl))
+ #+rune-is-integer
+ (utf8dom-file utf8-impl :pathname "dom-impl" :depends-on ("package"))
+ #+rune-is-integer
+ (utf8dom-file utf8-builder :pathname "dom-builder" :depends-on (utf8-impl))
(:file "dom-sax" :depends-on ("package")))
- :depends-on (:xml))
+ :depends-on (:cxml-xml))
(asdf:defsystem :cxml-test
:default-component-class closure-source-file
@@ -105,6 +115,6 @@
"test/"
(make-pathname :name nil :type nil :defaults *load-truename*))
:components ((:file "domtest") (:file "xmlconf"))
- :depends-on (:xml :dom))
+ :depends-on (:cxml-xml :cxml-dom))
-(asdf:defsystem :cxml :components () :depends-on (:dom :cxml-test))
+(asdf:defsystem :cxml :components () :depends-on (:cxml-dom :cxml-test))
Added: branches/grin-neu/thirdparty/cxml/doc/bg.png
===================================================================
(Binary files differ)
Property changes on: branches/grin-neu/thirdparty/cxml/doc/bg.png
___________________________________________________________________
Name: svn:mime-type
+ image/png
Added: branches/grin-neu/thirdparty/cxml/doc/cxml.css
===================================================================
--- branches/grin-neu/thirdparty/cxml/doc/cxml.css 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/cxml/doc/cxml.css 2006-12-01 10:39:49 UTC (rev 2094)
@@ -0,0 +1,85 @@
+div.sidebar {
+ float: right;
+ min-width: 15%;
+ padding: 0pt 5pt 5pt 5pt;
+ font-family: verdana, arial;
+}
+
+div.sidebar-title {
+ font-weight: bold;
+ background-color: #9c0000;
+ border: solid #9c0000;
+ border-top-width: 1px;
+ border-bottom-width: 0px;
+ border-left-width: 4px;
+ border-right-width: 0px;
+ margin: 0em 2pt 1px 2em;
+}
+
+div.sidebar-title a {
+ color: #ffffff;
+}
+
+div.sidebar-main {
+ background-color: #eeeeee;
+ border: solid #9c0000;
+ border-top-width: 0px;
+ border-bottom-width: 0px;
+ border-left-width: 4px;
+ border-right-width: 0px;
+ margin: 0em 2pt 1em 2em;
+ padding-top: 2px;
+ padding-left: 2px;
+}
+
+div.sidebar ul.main {
+ padding: 0pt 0pt 0pt 1em;
+ margin: 0 0 1em;
+}
+
+div.sidebar ul.sub {
+ list-style-type: square;
+ padding: 0pt 0pt 0pt 1em;
+ margin: 0 0 1em;
+}
+
+div.sidebar ul.hack {
+ padding: 0 0 0 0;
+ margin: 0 0 1em;
+ list-style-type: none;
+}
+
+body {
+ color: #000000;
+ background-color: #ffffff;
+ margin-right: 0pt;
+ margin-bottom: 10%;
+ margin-left: 40px;
+ padding-left: 30px;
+ font-family: verdana, arial;
+ background-image: url(bg.png);
+ background-position: top left;
+ background-attachment: fixed;
+ background-repeat: no-repeat;
+}
+
+h1,h2,h3 {
+ margin-left: -30px;
+}
+
+pre {
+ background-color: #eeeeee;
+ border: solid 1px #d0d0d0;
+ padding: 1em;
+ margin-right: 10%;
+}
+
+.def {
+ background-color: #ddddff;
+ font-weight: bold;
+}
+
+.nomargin {
+ margin-bottom: 0;
+ margin-top: 0;
+}
Added: branches/grin-neu/thirdparty/cxml/doc/dom.html
===================================================================
--- branches/grin-neu/thirdparty/cxml/doc/dom.html 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/cxml/doc/dom.html 2006-12-01 10:39:49 UTC (rev 2094)
@@ -0,0 +1,209 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+ <head>
+ <title>Closure XML</title>
+ <link rel="stylesheet" type="text/css" href="cxml.css"/>
+ </head>
+ <body>
+ <div class="sidebar">
+ <div class="sidebar-title">
+ <a href="README.html">Closure XML</a>
+ </div>
+ <div class="sidebar-main">
+ <ul class="main">
+ <li>
+ <a href="installation.html">Installing Closure XML</a>
+ <ul class="sub">
+ <li><a href="installation.html#download"><b>Download</b></a></li>
+ <li><a href="installation.html#implementations">Implementation-specific notes</a></li>
+ <li><a href="installation.html#compilation">Compilation</a></li>
+ <li><a href="installation.html#tests">Tests</a></li>
+ </ul>
+ </li>
+ <li>
+ <ul class="hack">
+ <li>
+ <a href="quickstart.html"><b>Quick-Start Example</b></a>
+ </li>
+ </ul>
+ </li>
+ <li>
+ <a href="using.html">SAX parser</a>
+ <ul class="sub">
+ <li><a href="using.html#parser">Parsing and Validating</a></li>
+ <li><a href="using.html#serialization">Serialization</a></li>
+ <li><a href="using.html#misc">Miscellaneous SAX handlers</a></li>
+ <li><a href="using.html#rods">Recoders</a></li>
+ <li><a href="using.html#dtdcache">Caching of DTD Objects</a></li>
+ <li><a href="using.html#catalogs">XML Catalogs</a></li>
+ <li><a href="using.html#sax">SAX Interface</a></li>
+ </ul>
+ </li>
+ <li>
+ <a href="dom.html">DOM implementation</a>
+ <ul class="sub">
+ <li><a href="dom.html#parser">Parsing with the DOM builder</a></li>
+ <li><a href="dom.html#serialization">Serialization</a></li>
+ <li><a href="dom.html#mapping">DOM/Lisp mapping</a></li>
+ </ul>
+ </li>
+ <li>
+ <ul class="hack">
+ <li><a href="xmls-compat.html">XMLS Builder</a></li>
+ </ul>
+ </li>
+ </ul>
+ </div>
+ </div>
+
+ <h1>The DOM implementation</h1>
+ <p>
+ CXML implements the DOM Level 2 Core interfaces. For details
+ on DOM, please refer to the <a
+ href="http://www.w3.org/TR/DOM-Level-2-Core/core.html">specification</a>.
+ </p>
+
+ <a name="parser"/>
+ <h3>Parsing into DOM</h3>
+ <p>
+ To parse an XML document into a DOM tree, use the SAX parser with a
+ DOM builder as the SAX handler. Example:
+ </p>
+ <pre>(cxml:parse-file "test.xml" (cxml-dom:make-dom-builder))</pre>
+ <p>
+ <div class="def">Function CXML-DOM:MAKE-DOM-BUILDER ()</div>
+ Create a SAX handler which builds a DOM document.
+ <p>
+ </p>
+ This functions returns a DOM builder that will work with the default
+ configuration of the SAX parser and is guaranteed to use
+ characters/strings instead of runes/rods, if that makes a
+ difference on the Lisp in question.
+ <p>
+ </p>
+ This is the same as <tt>rune-dom:make-dom-builder</tt> on Lisps
+ with Unicode support, and the same as
+ <tt>utf8-dom:make-dom-builder</tt> otherwise.
+ </p>
+
+ <p>
+ <div class="def">Function RUNE-DOM:MAKE-DOM-BUILDER ()</div>
+ Create a SAX handler which builds a DOM document using runes and rods.
+ </p>
+
+ <p>
+ <div class="def">Function UTF8-DOM:MAKE-DOM-BUILDER ()</div>
+ (Only on Lisps without Unicode support:)
+ Create a SAX handler which builds a DOM document using
+ UTF-8-encoded strings.
+ </p>
+
+ <a name="serialization"/>
+ <h3>Serializing DOM</h3>
+ <p>
+ To serialize a DOM document, use a SAX serialization sink as the
+ argument to <tt>dom:map-document</tt>, which generates SAX events
+ for the DOM tree.
+ </p>
+ <p>
+ Applications dealing with namespaces might want to inject a
+ <a href="using.html#misc">namespace normalizer</a> into the
+ sink chain.
+ </p>
+ <p>
+ <div class="def">Function DOM:MAP-DOCUMENT (handler document &key include-xmlns-attributes include-default-values include-doctype)</div>
+ Traverse a DOM document and call SAX functions as if an XML
+ representation of the document was processed by a SAX parser.
+ </p>
+ <p>Keyword arguments:</p>
+ <ul>
+ <li>
+ <tt>include-xmlns-attributes</tt> -- defaults to
+ <tt>sax:*include-xmlns-attributes*</tt>
+ </li>
+ <li>
+ <tt>include-doctype</tt> -- One of <tt>nil</tt> (no doctype
+ declaration), <tt>:full-internal-subset</tt> (include a doctype
+ declaration and the full internal subset), or
+ <tt>:canonical-notations</tt> (write a doctype declaration
+ with an internal subset including only notations, as required
+ for canonical serialization).
+ </li>
+ <li>
+ <tt>include-default-values</tt> -- include attribute nodes with nil
+ <tt>dom:specified</tt>.
+ </li>
+ <li>
+ <tt>recode</tt> -- (ignored on Lisps with Unicode support.) If
+ true, recode UTF-8 strings to rods. Defaults to true if used
+ with a UTF-8 DOM document. It can be set to false manually to
+ suppress recoding in this case.
+ </li>
+ </ul>
+
+ <a name="mapping"/>
+ <h3>DOM/Lisp mapping</h3>
+ <p>
+ Note that there is no "standard" DOM mapping for Lisp.
+ </p>
+ <p>
+ DOM is <a
+ href="http://www.w3.org/TR/DOM-Level-2-Core/idl-definitions.html">specified
+ in CORBA IDL</a>, but it refrains from using object-oriented IDL
+ features, allowing for a much more natural Lisp implemenation than
+ the the ordinary IDL/Lisp mapping would.
+ Differences between CXML's DOM and the direct IDL/Lisp mapping:
+ </p>
+ <ul>
+ <li>
+ DOM function names are symbols in the <tt>DOM</tt> package (not
+ the <tt>OP</tt> package).
+ </li>
+ <li>
+ DOM functions have proper required arguments, not a huge
+ <tt>&rest</tt> lambda list.
+ </li>
+ <li>
+ Although most IDL interfaces are implemented as CLOS classes by
+ CXML, the Lisp types of DOM objects is not documented and cannot
+ be relied upon. A node's type can be determined using
+ <tt>dom:node-type</tt> instead.
+ </li>
+ <li>
+ <tt>DOMString</tt> is mapped to <tt>rod</tt>, which is either
+ an <tt>(unsigned-byte 16)</tt> array type or a string type.
+ </li>
+ <li>
+ The IDL/Lisp mapping maps CORBA enums to Lisp keywords.
+ Unfortunately, the DOM IDL does not use enums. Instead,
+ both exception types and node types are defined integer
+ constants. CXML chooses to ignore this definition and uses
+ keywords instead.
+ </li>
+ <li>
+ DOM uses StudlyCaps. Lisp programmers don't. We
+ insert <tt>#\-</tt> before every upper case letter preceded by a
+ lower case letter and before every upper case letter which is
+ followed by a lower case letter, but preceded by a capital
+ letter. This algorithms leads to the natural Lisp spelling
+ of DOM function names.
+ </li>
+ <li>
+ Implementation note: DOM's <tt>NodeList</tt> does not
+ necessarily map to a native "sequence" type. (For example,
+ node lists are objects in Java, not arrays.)
+ <tt>NodeList</tt> is specified to reflect changes done after a
+ node list was created, so node lists cannot be Lisp lists.
+ (A node list could be implemented as a CLOS object pointing to
+ said list though.) Instead, CXML currently implements node
+ lists as adjustable vectors. Note that code which relies on
+ this implementation and uses Lisp sequence functions
+ instead of sticking to <tt>dom:item</tt> and <tt>dom:length</tt>
+ is not portable. As a compromise, you can use our
+ extensions <tt>dom:map-node-list</tt> or
+ <tt>dom:do-node-list</tt>, which can be implemented portably.
+ </li>
+ </ul>
+ </body>
+</html>
Added: branches/grin-neu/thirdparty/cxml/doc/installation.html
===================================================================
--- branches/grin-neu/thirdparty/cxml/doc/installation.html 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/cxml/doc/installation.html 2006-12-01 10:39:49 UTC (rev 2094)
@@ -0,0 +1,162 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+ <head>
+ <title>Closure XML</title>
+ <link rel="stylesheet" type="text/css" href="cxml.css"/>
+ </head>
+ <body>
+ <div class="sidebar">
+ <div class="sidebar-title">
+ <a href="README.html">Closure XML</a>
+ </div>
+ <div class="sidebar-main">
+ <ul class="main">
+ <li>
+ <a href="installation.html">Installing Closure XML</a>
+ <ul class="sub">
+ <li><a href="installation.html#download"><b>Download</b></a></li>
+ <li><a href="installation.html#implementations">Implementation-specific notes</a></li>
+ <li><a href="installation.html#compilation">Compilation</a></li>
+ <li><a href="installation.html#tests">Tests</a></li>
+ </ul>
+ </li>
+ <li>
+ <ul class="hack">
+ <li>
+ <a href="quickstart.html"><b>Quick-Start Example</b></a>
+ </li>
+ </ul>
+ </li>
+ <li>
+ <a href="using.html">SAX parser</a>
+ <ul class="sub">
+ <li><a href="using.html#parser">Parsing and Validating</a></li>
+ <li><a href="using.html#serialization">Serialization</a></li>
+ <li><a href="using.html#misc">Miscellaneous SAX handlers</a></li>
+ <li><a href="using.html#rods">Recoders</a></li>
+ <li><a href="using.html#dtdcache">Caching of DTD Objects</a></li>
+ <li><a href="using.html#catalogs">XML Catalogs</a></li>
+ <li><a href="using.html#sax">SAX Interface</a></li>
+ </ul>
+ </li>
+ <li>
+ <a href="dom.html">DOM implementation</a>
+ <ul class="sub">
+ <li><a href="dom.html#parser">Parsing with the DOM builder</a></li>
+ <li><a href="dom.html#serialization">Serialization</a></li>
+ <li><a href="dom.html#mapping">DOM/Lisp mapping</a></li>
+ </ul>
+ </li>
+ <li>
+ <ul class="hack">
+ <li><a href="xmls-compat.html">XMLS Builder</a></li>
+ </ul>
+ </li>
+ </ul>
+ </div>
+ </div>
+ <h1>Installation of Closure XML</h1>
+
+ <a name="download"/>
+ <h2>Download</h2>
+ <ul>
+ <li>
+ <div><a href="http://common-lisp.net/project/cxml/download/">tarballs</a></div>
+ </li>
+ <li>
+ <div>
+ Anoncvs (<a href="http://common-lisp.net/cgi-bin/viewcvs.cgi/cxml/?cvsroot=cxml">browse</a>):
+ <pre>$ export CVSROOT=:pserver:anonymous@common-lisp.net:/project/cxml/cvsroot
+$ cvs login
+Logging in to :pserver:anonymous@common-lisp.net:2401/project/cxml/cvsroot
+CVS password: anonymous
+$ cvs co cxml</pre>
+ </div>
+ </li>
+ </ul>
+
+ <a name="implementations"/>
+ <h2>Implementation-specific notes</h2>
+ <p>
+ CXML should be portable to all Common Lisp implementations
+ supported by <a
+ href="http://common-lisp.net/project/cl-plus-ssl/#trivial-gray-streams">trivial-gray-streams</a>.
+ </p>
+ <ul>
+ <li>
+ The SBCL port uses 16 bit surrogate characters instead of taking
+ advantage of SBCL's full 21 bit character support.
+ </li>
+ </ul>
+
+ <a name="compilation"/>
+ <h2>Compilation</h2>
+ <p>
+ <a href="http://www.cliki.net/asdf">ASDF</a> is used for
+ compilation. The following instructions assume that ASDF has
+ already been loaded.
+ </p>
+
+ <p>
+ <b>Prerequisites.</b>
+ CXML needs the <a href="http://www.cliki.net/Puri">puri</a> library
+ as well as <a href="http://www.common-lisp.net/project/cl-plus-ssl/#trivial-gray-streams">trivial-gray-streams</a>.
+ </p>
+
+ <p>
+ <b>Compiling and loading CXML.</b>
+ Register the .asd file, e.g. by symlinking it:
+ </p>
+ <pre>$ ln -sf `pwd`/cxml.asd /path/to/your/registry/</pre>
+ <p>Then compile CXML using:</p>
+ <pre>* (asdf:operate 'asdf:load-op :cxml)</pre>
+
+ <p>
+ You can then try the <a href="quickstart.html">quick-start example</a>.
+ </p>
+
+ <a name="tests"/>
+ <h2>Tests</h2>
+ <p>Check out the XML and DOM testsuites:</p>
+ <pre>$ export CVSROOT=:pserver:anonymous@dev.w3.org:/sources/public
+$ cvs login # password is "anonymous"
+$ cvs co 2001/XML-Test-Suite/xmlconf
+$ cvs co -D '2005-05-06 23:00' 2001/DOM-Test-Suite
+$ cd 2001/DOM-Test-Suite && ant dom1-dtd dom2-dtd</pre>
+ <p>
+ Omit <tt>-D</tt> to get the latest version, which may not work
+ with cxml yet. The <tt>ant</tt> step is necessary to run the DOM
+ tests.
+ </p>
+ <p>Usage:</p>
+ <pre>* (xmlconf:run-all-tests "/path/to/2001/XML-Test-Suite/xmlconf/")
+* (domtest:run-all-tests "/path/to/2001/DOM-Test-Suite/")
+</pre>
+ <p>
+ To compare your results with known output, refer to the files
+ <tt>XMLCONF</tt> and <tt>DOMTEST</tt> in the cxml distribution.
+ </p>
+
+ <p>
+ <i>fixme</i>: Add an explanation of xml/sax-tests here.
+ </p>
+
+ <p>
+ <b>fixme</b> domtest.lisp does not understand the current
+ testsuite driver anymore. To fix this problem, revert the
+ affected files manually after check-out:
+ </p>
+
+ <pre>$ cd 2001/XML-Test-Suite/xmlconf/
+xmltest$ patch -p0 -R </path/to/cxml/test/xmlconf-base.diff</pre>
+
+ <p>
+ The log message for the changes reads "<i>Removed unnecessary
+ xml:base attribute</i>". If I understand correctly, only
+ DOM 3 parsers provide the baseURI attribute necessary for
+ understanding <tt>xmlconf.xml</tt> now. We don't have that
+ yet.
+ </p>
+ </body>
+</html>
Added: branches/grin-neu/thirdparty/cxml/doc/quickstart.html
===================================================================
--- branches/grin-neu/thirdparty/cxml/doc/quickstart.html 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/cxml/doc/quickstart.html 2006-12-01 10:39:49 UTC (rev 2094)
@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+ <head>
+ <title>Closure XML</title>
+ <link rel="stylesheet" type="text/css" href="cxml.css"/>
+ </head>
+ <body>
+ <div class="sidebar">
+ <div class="sidebar-title">
+ <a href="README.html">Closure XML</a>
+ </div>
+ <div class="sidebar-main">
+ <ul class="main">
+ <li>
+ <a href="installation.html">Installing Closure XML</a>
+ <ul class="sub">
+ <li><a href="installation.html#download"><b>Download</b></a></li>
+ <li><a href="installation.html#implementations">Implementation-specific notes</a></li>
+ <li><a href="installation.html#compilation">Compilation</a></li>
+ <li><a href="installation.html#tests">Tests</a></li>
+ </ul>
+ </li>
+ <li>
+ <ul class="hack">
+ <li>
+ <a href="quickstart.html"><b>Quick-Start Example</b></a>
+ </li>
+ </ul>
+ </li>
+ <li>
+ <a href="using.html">SAX parser</a>
+ <ul class="sub">
+ <li><a href="using.html#parser">Parsing and Validating</a></li>
+ <li><a href="using.html#serialization">Serialization</a></li>
+ <li><a href="using.html#misc">Miscellaneous SAX handlers</a></li>
+ <li><a href="using.html#rods">Recoders</a></li>
+ <li><a href="using.html#dtdcache">Caching of DTD Objects</a></li>
+ <li><a href="using.html#catalogs">XML Catalogs</a></li>
+ <li><a href="using.html#sax">SAX Interface</a></li>
+ </ul>
+ </li>
+ <li>
+ <a href="dom.html">DOM implementation</a>
+ <ul class="sub">
+ <li><a href="dom.html#parser">Parsing with the DOM builder</a></li>
+ <li><a href="dom.html#serialization">Serialization</a></li>
+ <li><a href="dom.html#mapping">DOM/Lisp mapping</a></li>
+ </ul>
+ </li>
+ <li>
+ <ul class="hack">
+ <li><a href="xmls-compat.html">XMLS Builder</a></li>
+ </ul>
+ </li>
+ </ul>
+ </div>
+ </div>
+
+ <h1>Quick-Start Example</h1>
+
+ <p>
+ Make sure to <a href="installation.html#installation">install and load</a> cxml first.
+ </p>
+
+ <p>Create a test file called <tt>example.xml</tt>:</p>
+ <pre>* <b>(with-open-file (s "example.xml" :direction :output)
+ (write-string "<test a='b'><child/></test>" s))</b></pre>
+
+ <p>Parse <tt>example.xml</tt> into a DOM tree (<a href="using.html#parser">read
+ more</a>):</p>
+ <pre>* <b>(cxml:parse-file "example.xml" (cxml-dom:make-dom-builder))</b>
+#<DOM-IMPL::DOCUMENT @ #x72206172>
+;; save result for later:
+* <b>(defparameter *example* *)</b>
+*EXAMPLE*</pre>
+
+ <p>Inspect the DOM tree (<a href="using.html#dom">read more</a>):</p>
+ <pre>* <b>(dom:document-element *example*)</b>
+#<DOM-IMPL::ELEMENT test @ #x722b6ba2>
+* <b>(dom:tag-name (dom:document-element *example*))</b>
+"test"
+* <b>(dom:child-nodes (dom:document-element *example*))</b>
+#(#<DOM-IMPL::ELEMENT child @ #x722b6d8a>)
+* <b>(dom:get-attribute (dom:document-element *example*) "a")</b>
+"b"</pre>
+
+ <p>Serialize the DOM document back into a file (<a
+ href="using.html#serialization">read more</a>):</p>
+ <pre><b>(with-open-file (out "example.out" :direction :output :element-type '(unsigned-byte 8))
+ (dom:map-document (cxml:make-octet-stream-sink out) *example*))</b></pre>
+
+ <p>As an alternative to DOM, parse into xmls-compatible list
+ structure (<a href="xmls-compat.html">read more</a>):</p>
+ <pre>* <b>(cxml:parse-file "example.xml" (cxml-xmls:make-xmls-builder))</b>
+("test" (("a" "b")) ("child" NIL))</pre>
+ </body>
+</html>
Added: branches/grin-neu/thirdparty/cxml/doc/using.html
===================================================================
--- branches/grin-neu/thirdparty/cxml/doc/using.html 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/cxml/doc/using.html 2006-12-01 10:39:49 UTC (rev 2094)
@@ -0,0 +1,635 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+ <head>
+ <title>Closure XML</title>
+ <link rel="stylesheet" type="text/css" href="cxml.css"/>
+ </head>
+ <body>
+ <div class="sidebar">
+ <div class="sidebar-title">
+ <a href="README.html">Closure XML</a>
+ </div>
+ <div class="sidebar-main">
+ <ul class="main">
+ <li>
+ <a href="installation.html">Installing Closure XML</a>
+ <ul class="sub">
+ <li><a href="installation.html#download"><b>Download</b></a></li>
+ <li><a href="installation.html#implementations">Implementation-specific notes</a></li>
+ <li><a href="installation.html#compilation">Compilation</a></li>
+ <li><a href="installation.html#tests">Tests</a></li>
+ </ul>
+ </li>
+ <li>
+ <ul class="hack">
+ <li>
+ <a href="quickstart.html"><b>Quick-Start Example</b></a>
+ </li>
+ </ul>
+ </li>
+ <li>
+ <a href="using.html">SAX parser</a>
+ <ul class="sub">
+ <li><a href="using.html#parser">Parsing and Validating</a></li>
+ <li><a href="using.html#serialization">Serialization</a></li>
+ <li><a href="using.html#misc">Miscellaneous SAX handlers</a></li>
+ <li><a href="using.html#rods">Recoders</a></li>
+ <li><a href="using.html#dtdcache">Caching of DTD Objects</a></li>
+ <li><a href="using.html#catalogs">XML Catalogs</a></li>
+ <li><a href="using.html#sax">SAX Interface</a></li>
+ </ul>
+ </li>
+ <li>
+ <a href="dom.html">DOM implementation</a>
+ <ul class="sub">
+ <li><a href="dom.html#parser">Parsing with the DOM builder</a></li>
+ <li><a href="dom.html#serialization">Serialization</a></li>
+ <li><a href="dom.html#mapping">DOM/Lisp mapping</a></li>
+ </ul>
+ </li>
+ <li>
+ <ul class="hack">
+ <li><a href="xmls-compat.html">XMLS Builder</a></li>
+ </ul>
+ </li>
+ </ul>
+ </div>
+ </div>
+ <h1>Using the SAX parser</h1>
+
+ <a name="parser"/>
+ <h3>Parsing and Validating</h3>
+ <p>
+ CXML is implemented as a SAX parser. (Refer to <a
+ href="dom.html#parser">make-dom-builder</a> for information about
+ DOM.)
+ </p>
+ <p>
+ <div class="def">Function CXML:PARSE-FILE (pathname handler &key ...)</div>
+ <div class="def">Function CXML:PARSE-STREAM (stream handler &key ...)</div>
+ <div class="def">Function CXML:PARSE-OCTETS (octets handler &key ...)</div>
+ <div class="def">Function CXML:PARSE-ROD (rod handler &key ...)</div>
+ Parse an XML document.
+ Return values from this function depend on the SAX handler used.<br/>
+ Arguments:
+ </p>
+ <ul>
+ <li><tt>pathname</tt> -- a Common Lisp pathname</li>
+ <li><tt>stream</tt> -- a Common Lisp stream with element-type
+ <tt>(unsigned-byte 8)</tt></li>
+ <li><tt>octets</tt> -- an <tt>(unsigned-byte 8)</tt> array</li>
+ <li><tt>handler</tt> -- a SAX handler</li>
+ </ul>
+ <p>
+ Common keyword arguments:
+ </p>
+ <ul>
+ <li>
+ <tt>validate</tt> -- A boolean. Defaults to
+ <tt>nil</tt>. If true, parse in validating mode, i.e. assert that
+ the document contains a DOCTYPE declaration and conforms to the
+ DTD declared.
+ </li>
+ <li>
+ <tt>dtd</tt> -- unless <tt>nil</tt>, an extid instance
+ specifying the external subset to load. This options overrides
+ the extid specified in the document type declaration, if any.
+ See below for <tt>make-extid</tt>. This option is useful
+ for verification purposes together with the <tt>root</tt>
+ and <tt>disallow-internal-subset</tt> arguments.
+ </li>
+ <li><tt>root</tt> -- the expected root element
+ name, or <tt>nil</tt> (the default).
+ </li>
+ <li>
+ <tt>entity-resolver</tt> -- <tt>nil</tt> or a function of two
+ arguments which is invoked for every entity referenced by the
+ document with the entity's Public ID (a rod) and System ID (an
+ URI object) as arguments. The function may either return
+ nil, CXML will then try to resolve the entity as usual.
+ Alternatively it may return a Common Lisp stream specialized on
+ <tt>(unsigned-byte 8)</tt> which will be used instead. (It may
+ also signal an error, of course, which can be useful to prohibit
+ parsed XML documents from including arbitrary files readable by
+ the parser.)
+ </li>
+ <li>
+ <tt>disallow-internal-subset</tt> -- a boolean. If true, signal
+ an error if the document contains an internal subset.
+ </li>
+ <li>
+ <tt>recode</tt> -- a boolean. (Ignored on Lisps with Unicode
+ support.) Recode rods to UTF-8 strings. Defaults to true.
+ Make sure to use <tt>utf8-dom:make-dom-builder</tt> if this
+ option is enabled and <tt>rune-dom:make-dom-builder</tt>
+ otherwise.
+ </li>
+ </ul>
+ <p>
+ Note: <tt>parse-rod</tt> assumes that the input has already been
+ decoded into Unicode runes and ignores the encoding
+ specified in the XML declaration, if any.
+ </p>
+
+ <p>
+ <div class="def">Function CXML:PARSE-FILE (uri qname handler &key public-id system-id entity-resolver recode)</div>
+ </p>
+ <p>
+ Simulate parsing a document with a document element <tt>qname</tt>
+ having no attributes except for an optional namespace
+ declaration to <tt>uri</tt>. If an external ID is specified
+ (<tt>system-id</tt>, <tt>public-id</tt>), find, parse, and report
+ this DTD as if with <tt>parse-file</tt>, using the specified
+ entity resolver.
+ </p>
+
+ <p>
+ <div class="def">Function CXML:PARSE-DTD-FILE (pathname)</div>
+ <div class="def">Function CXML:PARSE-DTD-STREAM (stream)</div>
+ Parse <a
+ href="http://www.w3.org/TR/2000/REC-xml-20001006#NT-extSubset">declarations</a>
+ from a stand-alone file and return an object representing the DTD,
+ suitable as an argument to <tt>validate</tt>.
+ </p>
+ <ul>
+ <li><tt>pathname</tt> -- a Common Lisp pathname</li>
+ <li><tt>stream</tt> -- a Common Lisp stream with element-type
+ <tt>(unsigned-byte 8)</tt></li>
+ </ul>
+
+ <p>
+ <div class="def">Function CXML:MAKE-EXTID (publicid systemid)</div>
+ Create an object representing the External ID composed
+ of the specified Public ID, a rod or <tt>nil</tt>, and System ID
+ (an URI object).
+ </p>
+
+ <p>
+ <div class="def">Condition class CXML:XML-PARSE-ERROR ()</div>
+ Superclass of all conditions signalled by the CXML parser.
+ </p>
+ <p>
+ <div class="def">Condition class CXML:WELL-FORMEDNESS-VIOLATION (cxml:xml-parse-error)</div>
+ This condition is signalled for all well-formedness violations.
+ (Note that, when parsing document that is not well-formed in validating
+ mode, the parser might encounter validity errors before detecting
+ well-formedness problems, so also be prepared for <tt>validity-error</tt>
+ in that situation.)
+ </p>
+ <p>
+ <div class="def">Condition class CXML:VALIDITY-ERROR (cxml:xml-parse-error)</div>
+ Reports the violation of a validity constraint.
+ </p>
+
+ <a name="serialization"/>
+ <h3>Serialization</h3>
+ <p>
+ Serialization is performed using <tt>sink</tt> objects. A sink
+ is an output stream for runes. There are different kinds of sinks
+ for output to lisp streams, vectors, etc.
+ </p>
+ <p>
+ Technically, sinks are SAX handlers that write XML output for SAX
+ events sent to them. In practise, user code would normally not
+ generate those SAX events manually, and instead use a function
+ like <a href="dom.html#serialization">dom:map-document</a> or <a
+ href="xmls-compat.html">xmls-compat:map-node</a> to serialize an
+ in-memory document.
+ </p>
+ <p>
+ In addition to <tt>map-document</tt>, cxml has a set of
+ convenience macros for serialization (see below for
+ <tt>with-xml-output</tt>, <tt>with-element</tt>, etc).
+ </p>
+
+ <div style="background-color: #ddddff">
+ Portable sinks:<br/>
+ <span class="def">Function CXML:MAKE-OCTET-VECTOR-SINK (&rest keys) => sink</span><br/>
+ <span class="def">Function CXML:MAKE-OCTET-STREAM-SINK (stream &rest keys) => sink</span><br/>
+ <span class="def">Function CXML:MAKE-ROD-SINK (&rest keys) => sink</span><br/>
+ <br/>
+ Only on Lisps with Unicode support:<br/>
+ <span class="def">Function CXML:MAKE-STRING-SINK</span> -- alias for <tt>cxml:make-rod-sink</tt><br/>
+ <span class="def">Function CXML:MAKE-CHARACTER-STREAM-SINK (stream &rest keys) => sink</span><br/>
+ <br/>
+ Only on Lisps <em>without</em> Unicode support:<br/>
+ <span class="def">Function CXML:MAKE-STRING-SINK/UTF8 (&rest keys) => sink</span><br/>
+ <span class="def">Function CXML:MAKE-CHARACTER-STREAM-SINK/UTF8 (stream &rest keys) => sink</span><br/>
+ </div>
+ <p>
+ Return a SAX serialization handle.
+ </p>
+ <ul>
+ <li>
+ The <tt>-octet-</tt> functions write the document encoded into
+ UTF-8.
+ <tt>make-octet-stream-sink</tt> works with Lisp streams of
+ element-type <tt>(unsigned-byte 8)</tt>.
+ <tt>make-octet-vector-sink</tt> returns a vector of
+ <tt>(unsigned-byte 8)</tt>.
+ </li>
+ <li>
+ <tt>make-character-stream-sink</tt> works with character
+ streams. It serializes the document into characters <em>without
+ encoding it into an external format</em>. When using these
+ functions, <em>take care to avoid encoding the result into
+ an incorrect external format</em>. (Note that characters undergo
+ external format conversion when written to a character stream.
+ If the document's XML declaration specifies an encoding, make
+ sure to specify this encoding as the external format if and when
+ writing the serialized document to a character stream. If the
+ document does not specify an encoding, either UTF-8 or UTF-16
+ must be used.) This function is available only on Lisps with
+ unicode support.
+ </li>
+ <li>
+ <tt>make-rod-sink</tt> serializes the document into a vector of
+ runes <em>without encoding it into an external format</em>.
+ (On Lisp with unicode support, the result will be a string;
+ otherwise, a vector of character codes will be returned.)
+ The warnings given for <tt>make-character-stream-sink</tt>
+ apply to this function as well.
+ </li>
+ <li>
+ The <tt>/utf8</tt> functions write the document encoded into
+ characters representing a UTF-8 encoding.
+ When using these functions, <em>take care to avoid encoding the
+ result</em> into an external format for a second time. (Note
+ that characters undergo external format conversion when written
+ to a character stream. Since these functions already perform
+ external format conversion, make sure to specify an external
+ format that does "nothing" if and when writing the serialized document
+ to a character stream. ISO-8859-1 external formats usually
+ achieve the desired effect.)
+ <tt>make-character-stream-sink/utf8</tt> works with character streams.
+ <tt>make-string-sink/utf8</tt> returns a string.
+ These functions are available only on Lisps without unicode support.
+ </li>
+ </ul>
+ <p>Keyword arguments:</p>
+ <ul>
+ <li>
+ <tt>canonical</tt> -- canonical form, one of NIL, T, 1, 2
+ </li>
+ <li>
+ <tt>indentation</tt> -- indentation level. An integer or <tt>nil</tt>.
+ </li>
+ </ul>
+ <p>
+ The following <tt>canonical</tt> values are allowed:
+ </p>
+ <ul>
+ <li>
+ <tt>t</tt> or <tt>1</tt>: <a
+ href="http://www.w3.org/TR/2001/REC-xml-c14n-20010315">Canonical
+ XML</a>
+ </li>
+ <li>
+ <tt>2</tt>: <a
+ href="http://dev.w3.org/cvsweb/~checkout~/2001/XML-Test-Suite/xmlconf/sun/cxml.ht…">Second
+ Canonical Form</a>
+ </li>
+ <li>
+ <tt>NIL</tt>: Use a more readable non-canonical representation.
+ </li>
+ </ul>
+ <p>
+ An internal subset will be included in the result regardless of
+ the <tt>canonical</tt> setting. It is the responsibility of the
+ caller to not report an internal subset for
+ canonical <= 1, or only notations as required for
+ canonical = 2. For example, the
+ <tt>include-doctype</tt> argument to <tt>dom:map-document</tt>
+ should be set to <tt>nil</tt> for the former behaviour and
+ <tt>:canonical-notations</tt> for the latter.
+ </p>
+ <p>
+ With an <tt>indentation</tt> level, pretty-print the XML by
+ inserting additional whitespace. Note that indentation
+ changes the document model and should only be used if whitespace
+ does not matter to the application.
+ </p>
+
+ <p>
+ <div class="def">Macro CXML:WITH-XML-OUTPUT (sink &body body) => sink-specific result</div>
+ <div class="def">Macro CXML:WITH-ELEMENT (qname &body body) => result</div>
+ <div class="def">Function CXML:ATTRIBUTE (name value) => value</div>
+ <div class="def">Function CXML:TEXT (data) => data</div>
+ <div class="def">Function CXML:CDATA (data) => data</div>
+ Convenience syntax for event-based serialization.
+ </p>
+ <p>
+ Example:
+ </p>
+ <pre>(with-xml-output (make-octet-stream-sink stream :indentation 2 :canonical nil)
+ (with-element "foo"
+ (attribute "xyz" "abc")
+ (with-element "bar"
+ (attribute "blub" "bla"))
+ (text "Hi there.")))</pre>
+ <p>
+ Prints this to <tt>stream</tt>:
+ </p>
+ <pre><foo xyz="abc">
+ <bar blub="bla"></bar>
+ Hi there.
+</foo></pre>
+
+ <p>
+ <div class="def">Macro XHTML-GENERATOR:WITH-XHTML (sink &rest forms)</div>
+ <div class="def">Macro XHTML-GENERATOR:WRITE-DOCTYPE (sink)</div>
+ Macro <tt>with-xhtml</tt> is a modified version of
+ Franz' <tt>htmlgen</tt> works as a SAX driver for XHTML.
+ It aims to be a plug-in replacement for the <tt>html</tt> macro.
+ </p>
+ <p>
+ <tt>xhtmlgen</tt> is included as <tt>contrib/xhtmlgen.lisp</tt> in
+ the cxml distribution. Example:
+ </p>
+ <pre>(let ((sink (cxml:make-character-stream-sink *standard-output*)))
+ (sax:start-document sink)
+ (xhtml-generator:write-doctype sink)
+ (xhtml-generator:with-html sink
+ (:html
+ (:head
+ (:title "Titel"))
+ (:body
+ ((:p "style" "font-weight: bold")
+ "Inhalt")
+ (:ul
+ (:li "Eins")
+ (:li "Zwei")
+ (:li "Drei")))))
+ (sax:end-document sink))</pre>
+
+ <a name="misc"/>
+ <h3>Miscellaneous SAX handlers</h3>
+ <p>
+ <div class="def">Function CXML:MAKE-VALIDATOR (dtd root)</div>
+ Create a SAX handler which validates against a DTD instance.
+ The document's root element must be named <tt>root</tt>.
+ Used with <tt>dom:map-document</tt>, this validates a document
+ object as if by re-reading it with a validating parser, except
+ that declarations recorded in the document instance are completely
+ ignored.<br/>
+ Example:
+ </p>
+ <pre>(let ((d (parse-file "~/test.xml" (cxml-dom:make-dom-builder)))
+ (x (parse-dtd-file "~/test.dtd")))
+ (dom:map-document (cxml:make-validator x #"foo") d))</pre>
+
+ <p>
+ <div class="def">Class CXML:SAX-PROXY ()</div>
+ <div class="def">Accessor CXML:PROXY-CHAINED-HANDLER</div>
+ <tt>sax-proxy</tt> is a SAX handler which passes all events it
+ receives on to a user-defined second handler, which defaults
+ to <tt>nil</tt>. Use <tt>sax-proxy</tt> to modify the events a
+ SAX handler receives by defining your own subclass
+ of <tt>sax-proxy</tt>. Setting the chained handler to the target
+ handler, and define methods on your handler class for the events
+ to be modified. All other events will pass through to the chained
+ handler unmodified.
+ </p>
+
+ <p>
+ <div class="def">Accessor CXML:MAKE-NAMESPACE-NORMALIZER (next-handler)</div>
+ </p>
+ <p>
+ Return a SAX handler that performs <a
+ href="http://www.w3.org/TR/2004/REC-DOM-Level-3-Core-20040407/namespaces-algorith…">DOM
+ 3-style namespace normalization</a> on attribute lists in
+ <tt>start-element</tt> events before passing them on the next
+ handler.
+ </p>
+ <p>
+ <div class="def">Function CXML:MAKE-WHITESPACE-NORMALIZER (chained-handler &optional dtd)</div>
+ Return a SAX handler which removes whitespace from elements that
+ have <em>element content</em> and have not been declared to
+ preserve space using an xml:space attribute.
+ </p>
+ <p>Example:</p>
+ <pre>(cxml:parse-file "example.xml"
+ (cxml:make-whitespace-normalizer (cxml-dom:make-dom-builder))
+ :validate t)</pre>
+ <p>Example input:</p>
+ <pre><!DOCTYPE test [
+<!ELEMENT test (foo,bar*)>
+<!ATTLIST test a CDATA #IMPLIED>
+<!ELEMENT foo #PCDATA>
+<!ELEMENT bar (foo?)>
+<!ATTLIST bar xml:space (default|preserve) "default">
+]>
+<test a='b'>
+ <foo> </foo>
+ <bar> </bar>
+ <bar xml:space="preserve"> </bar>
+</test>
+</pre>
+ <p>Example result:</p>
+ <pre><test a="b"><foo> </foo><bar></bar><bar xml:space="preserve"> </bar></test></pre>
+
+ <a name="rods"/>
+ <h3>Recoders</h3>
+ <p>
+ Recoders are a mechanism used by CXML internally on Lisp implementations
+ without Unicode support to recode UTF-16 vectors (rods) of
+ integers (runes) into UTF-8 strings.
+ </p>
+ <p>
+ User code does not usually need to deal with recoders in current
+ versions of CXML.
+ </p>
+ <p>
+ <div class="def">Function CXML:MAKE-RECODER (chained-handler recoder-fn)</div>
+ Return a SAX handler which passes all events on to
+ <tt>chained-handler</tt> after converting all strings and rods
+ using <tt>recoder-fn</tt>, a function of one argument.
+ </p>
+
+ <a name="dtdcache"/>
+ <h3>Caching of DTD Objects</h3>
+ <p>
+ To avoid spending time parsing the same DTD over and over again,
+ CXML can cache DTD objects. The parser consults
+ <tt>cxml:*dtd-cache*</tt> whenever it is looking for an external
+ subset in a document which does not have an internal subset and
+ uses the cached DTD instance if one is present in the cache for
+ the System ID in question.
+ </p>
+ <p>
+ Note that DTDs do not expire from the cache automatically.
+ (Future versions of CXML might introduce automatic checks for
+ outdated DTDs.)
+ </p>
+ <p>
+ <div class="def">Variable CXML:*DTD-CACHE*</div>
+ The DTD cache object consulted by the parser when it needs a DTD.
+ </p>
+ <p>
+ <div class="def">Function CXML:MAKE-DTD-CACHE ()</div>
+ Return a new, empty DTD cache object.
+ </p>
+ <p>
+ <div class="def">Variable CXML:*CACHE-ALL-DTDS*</div>
+ If true, instructs the parser to enter all DTDs that could have
+ been cached into <tt>*dtd-cache*</tt> if they were not cached
+ already. Defaults to <tt>nil</tt>.
+ </p>
+ <p>
+ <div class="def">Reader CXML:GETDTD (uri dtd-cache)</div>
+ Return a cached instance of the DTD at <tt>uri</tt>, if present in
+ the cache, or <tt>nil</tt>.
+ </p>
+ <p>
+ <div class="def">Writer CXML:GETDTD (uri dtd-cache)</div>
+ Enter a new value for <tt>uri</tt> into <tt>dtd-cache</tt>.
+ </p>
+ <p>
+ <div class="def">Function CXML:REMDTD (uri dtd-cache)</div>
+ Ensure that no DTD is recorded for <tt>uri</tt> in the cache and
+ return true if such a DTD was present.
+ </p>
+ <p>
+ <div class="def">Function CXML:CLEAR-DTD-CACHE (dtd-cache)</div>
+ Remove all entries from <tt>dtd-cache</tt>.
+ </p>
+ <p>
+ <em>fixme:</em> thread-safety
+ </p>
+
+ <a name="catalogs"/>
+ <h3>XML Catalogs</h3>
+ <p>
+ External entities (for example, DTDs) are referred to using their
+ Public and System IDs. Usually the System ID, a URI, is used to
+ locate the entity. CXML itself handles only file://-URIs, but
+ many System IDs in practical use are http://-URIs. There are two
+ different mechanims applications can use to allow CXML to locate
+ entities using arbitrary Public ID or System ID:
+ </p>
+ <ul>
+ <li>
+ User-defined entity resolvers can be used to open entities using
+ arbitrary protocols. For example, an entity resolver could
+ handle all System-IDs with the <tt>http</tt> scheme using some
+ HTTP library. Refer to the description of the
+ <tt>entity-resolver</tt> keyword argument to parser functions (see <a
+ href="#parser"><tt>cxml:parse-file</tt></a>) to more
+ information on entity resolvers.
+ </li>
+ <li>
+ XML Catalogs are (local) tables in XML syntax which map External
+ IDs to alternative System IDs. If, say, the xhtml DTD is
+ present in the local file system and the local copy has been
+ registered with the XML catalog, CXML will use the local copy of
+ the DTD instead of trying to open the version available using HTTP.
+ </li>
+ </ul>
+ <p>
+ This section describes XML Catalogs, the second solution. CXML
+ implements <a
+ href="http://www.oasis-open.org/committees/entity/spec.html">Oasis
+ XML Catalogs</a>.
+ </p>
+ <p>
+ <div class="def">Variable CXML:*CATALOG*</div>
+ The XML Catalog object consulted by the parser before trying to
+ open an entity. Initially <tt>nil</tt>.
+ </p>
+ <p>
+ <div class="def">Variable CXML:*PREFER*</div>
+ The default "prefer" mode from the Catalog specification, one
+ of <tt>:public</tt> or <tt>:system</tt>. Defaults
+ to <tt>:public</tt>.
+ </p>
+ <p>
+ <div class="def">Function CXML:MAKE-CATALOG (&optional uris)</div>
+ Return a catalog object for the catalog files specified.
+ </p>
+ <p>
+ <div class="def">Function CXML:RESOLVE-URI (uri catalog)</div>
+ Look up <tt>uri</tt> in <tt>catalog</tt> and return the
+ resulting URI, or <tt>nil</tt> if no match was found.
+ </p>
+ <p>
+ <div class="def">Function CXML:RESOLVE-EXTID (publicid systemid catalog)</div>
+ Look up the External ID (<tt>publicid</tt>, <tt>systemid</tt>)
+ in <tt>catalog</tt> and return the resulting URI, or <tt>nil</tt>
+ if no match was found.
+ </p>
+ <p>
+ Example:
+ </p>
+ <pre>* (setf cxml:*catalog* nil)
+* (cxml:parse-file "test.xhtml" nil)
+=> Error: URI scheme :HTTP not supported
+
+* (setf cxml:*catalog* (cxml:make-catalog))
+* (cxml:parse-file "test.xhtml" nil)
+;; no error!
+NIL</pre>
+ <p>
+ Note that parsed catalog files are cached in the catalog object.
+ Catalog files cached do not expire automatically. To ensure that
+ all catalog files are parsed again, create a new catalog object.
+ </p>
+
+ <a name="sax"/>
+ <h2>SAX Interface</h2>
+ <p>
+ A SAX handler is an arbitrary objects that implements some of the
+ generic functions in the SAX package. Note that no default
+ handler class is necessary, because all generic functions have default
+ methods which do nothing. SAX functions are:
+ <div class="def">Function SAX:START-DOCUMENT (handler)</div>
+ <div class="def">Function SAX:END-DOCUMENT (handler)</div>
+ <br/>
+ <div class="def">Function SAX:START-ELEMENT (handler namespace-uri local-name qname attributes)</div>
+ <div class="def">Function SAX:END-ELEMENT (handler namespace-uri local-name qname)</div>
+ <div class="def">Function SAX:START-PREFIX-MAPPING (handler prefix uri)</div>
+ <div class="def">Function SAX:END-PREFIX-MAPPING (handler prefix)</div>
+ <div class="def">Function SAX:PROCESSING-INSTRUCTION (handler target data)</div>
+ <div class="def">Function SAX:COMMENT (handler data)</div>
+ <div class="def">Function SAX:START-CDATA (handler)</div>
+ <div class="def">Function SAX:END-CDATA (handler)</div>
+ <div class="def">Function SAX:CHARACTERS (handler data)</div>
+ <br/>
+ <div class="def">Function SAX:START-DTD (handler name public-id system-id)</div>
+ <div class="def">Function SAX:END-DTD (handler)</div>
+ <div class="def">Function SAX:START-INTERNAL-SUBSET (handler)</div>
+ <div class="def">Function SAX:END-INTERNAL-SUBSET (handler)</div>
+ <div class="def">Function SAX:UNPARSED-ENTITY-DECLARATION (handler name public-id system-id notation-name)</div>
+ <div class="def">Function SAX:EXTERNAL-ENTITY-DECLARATION (handler kind name public-id system-id)</div>
+ <div class="def">Function SAX:INTERNAL-ENTITY-DECLARATION (handler kind name value)</div>
+ <div class="def">Function SAX:NOTATION-DECLARATION (handler name public-id system-id)</div>
+ <div class="def">Function SAX:ELEMENT-DECLARATION (handler name model)</div>
+ <div class="def">Function SAX:ATTRIBUTE-DECLARATION (handler ename aname type default)</div>
+ <br/>
+ <div class="def">Accessor SAX:ATTRIBUTE-PREFIX (attribute)</div>
+ <div class="def">Accessor SAX:ATTRIBUTE-NAMESPACE-URI (attribute)</div>
+ <div class="def">Accessor SAX:ATTRIBUTE-LOCAL-NAME (attribute)</div>
+ <div class="def">Accessor SAX:ATTRIBUTE-QNAME (attribute)</div>
+ <div class="def">Accessor SAX:ATTRIBUTE-SPECIFIED-P (attribute)</div>
+ <div class="def">Accessor SAX:ATTRIBUTE-VALUE (attribute)</div>
+ <br/>
+ <div class="def">Function SAX:FIND-ATTRIBUTE (qname attributes)</div>
+ <div class="def">Function SAX:FIND-ATTRIBUTE-NS (uri lname attributes)</div>
+ </p>
+ <p>
+ The entity declaration methods are similar to Java SAX
+ definitions, but parameter entities are distinguished from
+ general entities not by a <tt>%</tt> prefix to the name, but by
+ the <tt>kind</tt> argument, either <tt>:parameter</tt> or
+ <tt>:general</tt>.
+ </p>
+ <p>
+ The arguments to <tt>sax:element-declaration</tt> and
+ <tt>sax:attribute-declaration</tt> differ significantly from their
+ Java counterparts.
+ </p>
+ <p>
+ <i>fixme</i>: For more information on these functions refer to the docstrings.
+ </p>
+ </body>
+</html>
Added: branches/grin-neu/thirdparty/cxml/doc/xmls-compat.html
===================================================================
--- branches/grin-neu/thirdparty/cxml/doc/xmls-compat.html 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/cxml/doc/xmls-compat.html 2006-12-01 10:39:49 UTC (rev 2094)
@@ -0,0 +1,133 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+ <head>
+ <title>Closure XML</title>
+ <link rel="stylesheet" type="text/css" href="cxml.css"/>
+ </head>
+ <body>
+ <div class="sidebar">
+ <div class="sidebar-title">
+ <a href="README.html">Closure XML</a>
+ </div>
+ <div class="sidebar-main">
+ <ul class="main">
+ <li>
+ <a href="installation.html">Installing Closure XML</a>
+ <ul class="sub">
+ <li><a href="installation.html#download"><b>Download</b></a></li>
+ <li><a href="installation.html#implementations">Implementation-specific notes</a></li>
+ <li><a href="installation.html#compilation">Compilation</a></li>
+ <li><a href="installation.html#tests">Tests</a></li>
+ </ul>
+ </li>
+ <li>
+ <ul class="hack">
+ <li>
+ <a href="quickstart.html"><b>Quick-Start Example</b></a>
+ </li>
+ </ul>
+ </li>
+ <li>
+ <a href="using.html">SAX parser</a>
+ <ul class="sub">
+ <li><a href="using.html#parser">Parsing and Validating</a></li>
+ <li><a href="using.html#serialization">Serialization</a></li>
+ <li><a href="using.html#misc">Miscellaneous SAX handlers</a></li>
+ <li><a href="using.html#rods">Recoders</a></li>
+ <li><a href="using.html#dtdcache">Caching of DTD Objects</a></li>
+ <li><a href="using.html#catalogs">XML Catalogs</a></li>
+ <li><a href="using.html#sax">SAX Interface</a></li>
+ </ul>
+ </li>
+ <li>
+ <a href="dom.html">DOM implementation</a>
+ <ul class="sub">
+ <li><a href="dom.html#parser">Parsing with the DOM builder</a></li>
+ <li><a href="dom.html#serialization">Serialization</a></li>
+ <li><a href="dom.html#mapping">DOM/Lisp mapping</a></li>
+ </ul>
+ </li>
+ <li>
+ <ul class="hack">
+ <li><a href="xmls-compat.html">XMLS Builder</a></li>
+ </ul>
+ </li>
+ </ul>
+ </div>
+ </div>
+
+ <h1>XMLS Builder</h1>
+ <p>
+ Like other XML parsers written in Lisp, CXML can work with
+ documents represented as list structures. The specific model
+ implemented by cxml is compatible with the <a
+ href="http://common-lisp.net/project/xmls/">xmls parser</a>. Xmls
+ list structures are a simpler and faster alternative to full DOM
+ document trees. They also serve as an example showing how to
+ implement user-defined document models as an independent layer
+ over the the base parser (c.f. <tt>xml/xmls-compat.lisp</tt> in
+ the cxml distribution). However, note that the list structures do
+ not include all information available in DOM documents
+ (notably, things like <tt>dom:parent-node</tt>) and are
+ sometimes more difficult to work with because of that since many
+ DOM functions cannot be implemented on them.
+ </p>
+ <p>
+ <div class="def">Function CXML-XMLS:MAKE-XMLS-BUILDER (&key include-default-values)</div>
+ Create a SAX handler which builds XMLS list structures.
+ If <tt>include-default-values</tt> is true, default values for
+ attributes declared in a DTD are included as attributes in the
+ xmls output. <tt>include-default-values</tt> is true by default
+ and can be set to <tt>nil</tt> to suppress inclusion of default
+ values.
+ </p>
+ <p>
+ Example:
+ </p>
+ <pre>(cxml:parse-file "test.xml" (cxml-xmls:make-xmls-builder))</pre>
+ <p>
+ <div class="def">Function CXML-XMLS:MAP-NODE (handler node &key include-xmlns-attributes)</div>
+ Traverse an XMLS document/node and call SAX functions as if an XML
+ representation of the document were processed by a SAX parser.
+ </p>
+ <p>
+ Use this function to serialize XMLS data. For example, we could
+ define a replacement for <tt>xmls:write-xml</tt> like this:
+ </p>
+ <pre>(defun write-xml (stream node &key indent)
+ (let ((sink (cxml:make-character-stream-sink
+ stream :canonical nil :indentation indent)))
+ (cxml-xmls:map-node sink node)))</pre>
+ <p>
+ <div class="def">Function CXML-XMLS:MAKE-NODE (&key name ns attrs
+ children) => xmls node</div>
+ Build a list node of the form
+ (<em>name</em> ((<em>name</em> <em>value</em>)<em>*</em>) <em>child*</em>).
+ </p>
+ <p>
+ The node list's <tt>car</tt> can also be a cons of local <tt>name</tt>
+ and namespace prefix <tt>ns</tt>.
+ </p>
+ <p>
+ <em>fixme:</em> It is unclear to me how namespaces are meant to
+ work in xmls, since xmls documentation differs from how xmls
+ actually works in current releases. Usually applications need to
+ know both the namespace prefix <em>and</em> the namespace URI. We
+ currently follow the xmls <em>implementation</em> and use the
+ namespace prefix instead of following its <em>documentation</em> which
+ shows the URI. We do not follow xmls in munging xmlns attribute
+ values. Attributes themselves have namespaces and it is not clear
+ to me how that works in xmls.
+ </p>
+ <p>
+ <div class="def">Accessor CXML-XMLS:NODE-NAME (node)</div>
+ <div class="def">Accessor CXML-XMLS:NODE-NS (node)</div>
+ <div class="def">Accessor CXML-XMLS:NODE-ATTRS (node)</div>
+ <div class="def">Accessor CXML-XMLS:NODE-CHILDREN (node)</div>
+ Accessors for xmls node data.
+ </p>
+ <p>
+ </p>
+ </body>
+</html>
Modified: branches/grin-neu/thirdparty/cxml/dom/dom-builder.lisp
===================================================================
--- branches/grin-neu/thirdparty/cxml/dom/dom-builder.lisp 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/cxml/dom/dom-builder.lisp 2006-12-01 10:39:49 UTC (rev 2094)
@@ -1,6 +1,6 @@
;;;; dom-builder.lisp -- DOM-building SAX handler
;;;;
-;;;; This file is part of the CXML parser, released under (L)LGPL.
+;;;; This file is part of the CXML parser, released under Lisp-LGPL.
;;;; See file COPYING for details.
;;;;
;;;; Author: Gilbert Baumann <unk6(a)rz.uni-karlsruhe.de>
@@ -8,26 +8,32 @@
;;;; Author: David Lichteblau <david(a)lichteblau.com>
;;;; Author: knowledgeTools Int. GmbH
-;;; XXX this DOM builder knows too much about the specifics of the DOM
-;;; implementation for my taste. We need a sensible protocol for fast DOM
-;;; building.
+#-cxml-system::utf8dom-file
+(in-package :rune-dom)
-(in-package :dom-impl)
+#+cxml-system::utf8dom-file
+(in-package :utf8-dom)
+
(defclass dom-builder ()
((document :initform nil :accessor document)
- (element-stack :initform '() :accessor element-stack)))
+ (element-stack :initform '() :accessor element-stack)
+ (internal-subset :accessor internal-subset)))
-(defun dom:make-dom-builder ()
+(defun make-dom-builder ()
(make-instance 'dom-builder))
(defun fast-push (new-element vector)
(vector-push-extend new-element vector (max 1 (array-dimension vector 0))))
(defmethod sax:start-document ((handler dom-builder))
- (let ((document (make-instance 'dom-impl::document)))
- (setf (slot-value document 'dom-impl::owner) nil
- (slot-value document 'dom-impl::doc-type) nil)
+ (when (and sax:*namespace-processing*
+ (not (and sax:*include-xmlns-attributes*
+ sax:*use-xmlns-namespace*)))
+ (error "SAX configuration is incompatible with DOM: *namespace-processing* is activated, but *include-xmlns-attributes* or *use-xmlns-namespace* are not"))
+ (let ((document (make-instance 'document)))
+ (setf (slot-value document 'owner) nil
+ (slot-value document 'doc-type) nil)
(setf (document handler) document)
(push document (element-stack handler))))
@@ -43,45 +49,76 @@
(setf (slot-value (document handler) 'entity-resolver) resolver))
(defmethod sax:start-dtd ((handler dom-builder) name publicid systemid)
- (declare (ignore publicid systemid))
(let* ((document (document handler))
- (doctype (make-instance 'dom-impl::document-type
- :name name
- :notations (make-instance 'dom-impl::named-node-map
- :element-type :notation
- :owner document)
- :entities (make-instance 'dom-impl::named-node-map
- :element-type :entity
- :owner document))))
- (setf (slot-value doctype 'dom-impl::owner) document
- (slot-value document 'dom-impl::doc-type) doctype)))
+ (doctype (%create-document-type name publicid systemid)))
+ (setf (slot-value doctype 'owner) document
+ (slot-value (dom:notations doctype) 'owner) document
+ (slot-value (dom:entities doctype) 'owner) document
+ (slot-value document 'doc-type) doctype)))
+(defmethod sax:start-internal-subset ((handler dom-builder))
+ (setf (internal-subset handler) nil))
+
+(defmethod sax:end-internal-subset ((handler dom-builder))
+ (setf (dom::%internal-subset (slot-value (document handler) 'doc-type))
+ (nreverse (internal-subset handler)))
+ (slot-makunbound handler 'internal-subset))
+
+(macrolet ((defhandler (name &rest args)
+ `(defmethod ,name ((handler dom-builder) ,@args)
+ (when (slot-boundp handler 'internal-subset)
+ (push (list ',name ,@args) (internal-subset handler))))))
+ (defhandler sax:unparsed-entity-declaration
+ name public-id system-id notation-name)
+ (defhandler sax:external-entity-declaration
+ kind name public-id system-id)
+ (defhandler sax:internal-entity-declaration
+ kind name value)
+ (defhandler sax:notation-declaration
+ name public-id system-id)
+ (defhandler sax:element-declaration
+ name model)
+ (defhandler sax:attribute-declaration
+ element-name attribute-name type default))
+
(defmethod sax:start-element
((handler dom-builder) namespace-uri local-name qname attributes)
- (declare (ignore namespace-uri local-name))
+ (check-type qname rod) ;catch recoder/builder mismatch
(with-slots (document element-stack) handler
- (let ((element (make-instance 'element
+ (let* ((nsp sax:*namespace-processing*)
+ (element (make-instance 'element
:tag-name qname
- :owner document))
+ :owner document
+ :namespace-uri (when nsp namespace-uri)
+ :local-name (when nsp local-name)
+ :prefix (%rod (when nsp (cxml::split-qname (real-rod qname))))))
(parent (car element-stack))
(anodes '()))
(dolist (attr attributes)
(let ((anode
- (dom:create-attribute document (sax:attribute-qname attr)))
+ (if nsp
+ (dom:create-attribute-ns document
+ (sax:attribute-namespace-uri attr)
+ (sax:attribute-qname attr))
+ (dom:create-attribute document (sax:attribute-qname attr))))
(text
(dom:create-text-node document (sax:attribute-value attr))))
- (setf (slot-value anode 'dom-impl::specified-p)
+ (setf (slot-value anode 'specified-p)
(sax:attribute-specified-p attr))
+ (setf (slot-value anode 'owner-element) element)
(dom:append-child anode text)
(push anode anodes)))
- (setf (slot-value element 'dom-impl::parent) parent)
- (fast-push element (slot-value parent 'dom-impl::children))
- (setf (slot-value element 'dom-impl::attributes)
- (make-instance 'attribute-node-map
- :items anodes
- :element-type :attribute
- :element element
- :owner document))
+ (setf (slot-value element 'parent) parent)
+ (fast-push element (slot-value parent 'children))
+ (let ((map
+ (make-instance 'attribute-node-map
+ :items anodes
+ :element-type :attribute
+ :element element
+ :owner document)))
+ (setf (slot-value element 'attributes) map)
+ (dolist (anode anodes)
+ (setf (slot-value anode 'map) map)))
(push element element-stack))))
(defmethod sax:end-element ((handler dom-builder) namespace-uri local-name qname)
@@ -103,15 +140,15 @@
(dom:append-data last-child data))
(t
(let ((node (dom:create-text-node document data)))
- (setf (slot-value node 'dom-impl::parent) parent)
- (fast-push node (slot-value (car element-stack) 'dom-impl::children))))))))
+ (setf (slot-value node 'parent) parent)
+ (fast-push node (slot-value (car element-stack) 'children))))))))
(defmethod sax:start-cdata ((handler dom-builder))
(with-slots (document element-stack) handler
(let ((node (dom:create-cdata-section document #""))
(parent (car element-stack)))
- (setf (slot-value node 'dom-impl::parent) parent)
- (fast-push node (slot-value parent 'dom-impl::children))
+ (setf (slot-value node 'parent) parent)
+ (fast-push node (slot-value parent 'children))
(push node element-stack))))
(defmethod sax:end-cdata ((handler dom-builder))
@@ -122,15 +159,15 @@
(with-slots (document element-stack) handler
(let ((node (dom:create-processing-instruction document target data))
(parent (car element-stack)))
- (setf (slot-value node 'dom-impl::parent) parent)
- (fast-push node (slot-value (car element-stack) 'dom-impl::children)))))
+ (setf (slot-value node 'parent) parent)
+ (fast-push node (slot-value (car element-stack) 'children)))))
(defmethod sax:comment ((handler dom-builder) data)
(with-slots (document element-stack) handler
(let ((node (dom:create-comment document data))
(parent (car element-stack)))
- (setf (slot-value node 'dom-impl::parent) parent)
- (fast-push node (slot-value (car element-stack) 'dom-impl::children)))))
+ (setf (slot-value node 'parent) parent)
+ (fast-push node (slot-value (car element-stack) 'children)))))
(defmethod sax:unparsed-entity-declaration
((handler dom-builder) name public-id system-id notation-name)
@@ -151,7 +188,7 @@
(defun set-entity (handler name pid sid notation)
(dom:set-named-item (dom:entities (dom:doctype (document handler)))
- (make-instance 'dom-impl::entity
+ (make-instance 'entity
:owner (document handler)
:name name
:public-id pid
@@ -161,7 +198,7 @@
(defmethod sax:notation-declaration
((handler dom-builder) name public-id system-id)
(dom:set-named-item (dom:notations (dom:doctype (document handler)))
- (make-instance 'dom-impl::notation
+ (make-instance 'notation
:owner (document handler)
:name name
:public-id public-id
Modified: branches/grin-neu/thirdparty/cxml/dom/dom-impl.lisp
===================================================================
--- branches/grin-neu/thirdparty/cxml/dom/dom-impl.lisp 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/cxml/dom/dom-impl.lisp 2006-12-01 10:39:49 UTC (rev 2094)
@@ -1,17 +1,31 @@
-;;;; dom-impl.lisp -- Implementation of DOM 1 Core
+;;;; dom-impl.lisp -- Implementation of DOM 1 Core -*- package: rune-dom -*-
;;;;
-;;;; This file is part of the CXML parser, released under (L)LGPL.
+;;;; This file is part of the CXML parser, released under Lisp-LGPL.
;;;; See file COPYING for details.
;;;;
;;;; Author: Gilbert Baumann <unk6(a)rz.uni-karlsruhe.de>
;;;; Author: David Lichteblau <david(a)lichteblau.com>
;;;; Author: knowledgeTools Int. GmbH
-(defpackage :dom-impl
- (:use :cl :runes))
+#-cxml-system::utf8dom-file
+(defpackage :rune-dom
+ (:use :cl :runes)
+ #+rune-is-character (:nicknames :cxml-dom)
+ (:export #:implementation #:make-dom-builder #:create-document))
-(in-package :dom-impl)
+#+cxml-system::utf8dom-file
+(defpackage :utf8-dom
+ (:use :cl :utf8-runes)
+ (:nicknames :cxml-dom)
+ (:export #:implementation #:make-dom-builder #:create-document))
+#-cxml-system::utf8dom-file
+(in-package :rune-dom)
+
+#+cxml-system::utf8dom-file
+(in-package :utf8-dom)
+
+
;; Classes
(define-condition dom-exception (error)
@@ -26,75 +40,107 @@
(dom-exception-string c)
(dom-exception-arguments c)))))
-(defclass node ()
+(defclass node (dom:node)
((parent :initarg :parent :initform nil)
(children :initarg :children :initform (make-node-list))
(owner :initarg :owner :initform nil)
(read-only-p :initform nil :reader read-only-p)
(map :initform nil)))
-(defclass document (node)
+(defmethod dom:prefix ((node node)) nil)
+(defmethod dom:local-name ((node node)) nil)
+(defmethod dom:namespace-uri ((node node)) nil)
+
+(defclass namespace-mixin ()
+ ((prefix :initarg :prefix :reader dom:prefix)
+ (local-name :initarg :local-name :reader dom:local-name)
+ (namespace-uri :initarg :namespace-uri :reader dom:namespace-uri)))
+
+(defmethod (setf dom:prefix) (newval (node namespace-mixin))
+ (assert-writeable node)
+ (when newval
+ (safe-split-qname (concatenate 'rod newval #":foo")
+ (dom:namespace-uri node)))
+ (setf (slot-value node 'prefix) newval))
+
+(defclass document (node dom:document)
((doc-type :initarg :doc-type :reader dom:doctype)
(dtd :initform nil :reader dtd)
(entity-resolver :initform nil)))
-(defclass document-fragment (node)
+(defclass document-fragment (node dom:document-fragment)
())
-(defclass character-data (node)
+(defclass character-data (node dom:character-data)
((value :initarg :data :reader dom:data)))
-(defclass attribute (node)
+(defclass attribute (namespace-mixin node dom:attr)
((name :initarg :name :reader dom:name)
+ (owner-element :initarg :owner-element :reader dom:owner-element)
(specified-p :initarg :specified-p :reader dom:specified)))
+(defmethod (setf dom:prefix) :before (newval (node attribute))
+ (when (rod= (dom:node-name node) #"xmlns")
+ (dom-error :NAMESPACE_ERR "must not change xmlns attribute prefix")))
+
+(defmethod (setf dom:prefix) :after (newval (node attribute))
+ (setf (slot-value node 'name)
+ (concatenate 'rod newval #":" (dom:local-name node))))
+
(defmethod print-object ((object attribute) stream)
(print-unreadable-object (object stream :type t :identity t)
(format stream "~A=~S"
(rod-string (dom:name object))
(rod-string (dom:value object)))))
-(defclass element (node)
+(defclass element (namespace-mixin node dom:element)
((tag-name :initarg :tag-name :reader dom:tag-name)
(attributes :initarg :attributes :reader dom:attributes)))
+(defmethod (setf dom:prefix) :after (newval (node element))
+ (setf (slot-value node 'tag-name)
+ (concatenate 'rod newval #":" (dom:local-name node))))
+
(defmethod print-object ((object element) stream)
(print-unreadable-object (object stream :type t :identity t)
(princ (rod-string (dom:tag-name object)) stream)))
-(defclass text (character-data)
+(defclass text (character-data dom:text)
())
-(defclass comment (character-data)
+(defclass comment (character-data dom:comment)
())
-(defclass cdata-section (text)
+(defclass cdata-section (text dom:cdata-section)
())
-(defclass document-type (node)
+(defclass document-type (node dom:document-type)
((name :initarg :name :reader dom:name)
+ (public-id :initarg :public-id :reader dom:public-id)
+ (system-id :initarg :system-id :reader dom:system-id)
(entities :initarg :entities :reader dom:entities)
- (notations :initarg :notations :reader dom:notations)))
+ (notations :initarg :notations :reader dom:notations)
+ (dom::%internal-subset :accessor dom::%internal-subset)))
-(defclass notation (node)
+(defclass notation (node dom:notation)
((name :initarg :name :reader dom:name)
(public-id :initarg :public-id :reader dom:public-id)
(system-id :initarg :system-id :reader dom:system-id)))
-(defclass entity (node)
+(defclass entity (node dom:entity)
((name :initarg :name :reader dom:name)
(public-id :initarg :public-id :reader dom:public-id)
(system-id :initarg :system-id :reader dom:system-id)
(notation-name :initarg :notation-name :reader dom:notation-name)))
-(defclass entity-reference (node)
+(defclass entity-reference (node dom:entity-reference)
((name :initarg :name :reader dom:name)))
-(defclass processing-instruction (node)
+(defclass processing-instruction (node dom:processing-instruction)
((target :initarg :target :reader dom:target)
(data :initarg :data :reader dom:data)))
-(defclass named-node-map ()
+(defclass named-node-map (dom:named-node-map)
((items :initarg :items :reader dom:items
:initform nil)
(owner :initarg :owner :reader dom:owner-document)
@@ -107,6 +153,28 @@
;;; Implementation
+(defun %rod (x)
+ (etypecase x
+ (null x)
+ (rod x)
+ #+cxml-system::utf8dom-file (runes::rod (cxml::rod-to-utf8-string x))
+ (string (string-rod x))
+ (vector x)))
+
+#-cxml-system::utf8dom-file
+(defun real-rod (x)
+ (%rod x))
+
+#+cxml-system::utf8dom-file
+(defun real-rod (x)
+ (etypecase x
+ (null x)
+ (runes::rod x)
+ (string (cxml::utf8-string-to-rod x))))
+
+(defun valid-name-p (x)
+ (cxml::valid-name-p (real-rod x)))
+
(defun assert-writeable (node)
(when (read-only-p node)
(dom-error :NO_MODIFICATION_ALLOWED_ERR "~S is marked read-only." node)))
@@ -120,6 +188,15 @@
(dom:map-node-list (lambda (,var) ,@body) ,nodelist)
,resultform))
+(defun dom:map-node-map (fn node-map)
+ (with-slots (items) node-map
+ (mapc fn items)))
+
+(defmacro dom:do-node-map ((var node-map &optional resultform) &body body)
+ `(block nil
+ (dom:map-node-map (lambda (,var) ,@body) ,node-map)
+ ,resultform))
+
(defmacro dovector ((var vector &optional resultform) &body body)
`(loop
for ,var across ,vector do (progn ,@body)
@@ -174,8 +251,60 @@
(:NO_MODIFICATION_ALLOWED_ERR 7)
(:NOT_FOUND_ERR 8)
(:NOT_SUPPORTED_ERR 9)
- (:INUSE_ATTRIBUTE_ERR 10)))
+ (:INUSE_ATTRIBUTE_ERR 10)
+ (:INVALID_STATE_ERR 11)
+ (:SYNTAX_ERR 12)
+ (:INVALID_MODIFICATION_ERR 13)
+ (:NAMESPACE_ERR 14)
+ (:INVALID_ACCESS_ERR 15)))
+;; dom-implementation protocol
+
+(defmethod dom:has-feature ((factory (eql 'implementation)) feature version)
+ (and (or (string-equal (rod-string feature) "xml")
+ (string-equal (rod-string feature) "core"))
+ (or (zerop (length version))
+ (string-equal (rod-string version) "1.0")
+ (string-equal (rod-string version) "2.0"))))
+
+(defun %create-document-type (name publicid systemid)
+ (make-instance 'document-type
+ :name name
+ :notations (make-instance 'named-node-map
+ :element-type :notation
+ :owner nil)
+ :entities (make-instance 'named-node-map
+ :element-type :entity
+ :owner nil)
+ :public-id publicid
+ :system-id systemid))
+
+(defmethod dom:create-document-type
+ ((factory (eql 'implementation)) name publicid systemid)
+ (safe-split-qname name #"")
+ (let ((result (%create-document-type name publicid systemid)))
+ (setf (slot-value (dom:entities result) 'read-only-p) t)
+ (setf (slot-value (dom:notations result) 'read-only-p) t)
+ result))
+
+(defmethod dom:create-document
+ ((factory (eql 'implementation)) uri qname doctype)
+ (let ((document (make-instance 'document)))
+ (setf (slot-value document 'owner) nil
+ (slot-value document 'doc-type) doctype)
+ (when doctype
+ (unless (typep doctype 'document-type)
+ (dom-error :WRONG_DOCUMENT_ERR
+ "doctype was created by a different dom implementation"))
+ (when (dom:owner-document doctype)
+ (dom-error :WRONG_DOCUMENT_ERR "doctype already in use"))
+ (setf (slot-value doctype 'owner) document
+ (slot-value (dom:notations doctype) 'owner) document
+ (slot-value (dom:entities doctype) 'owner) document))
+ (when (or uri qname)
+ (dom:append-child document (dom:create-element-ns document uri qname)))
+ document))
+
;; document-fragment protocol
;; document protocol
@@ -188,11 +317,14 @@
(return k)))))
(defmethod dom:create-element ((document document) tag-name)
- (setf tag-name (rod tag-name))
- (unless (cxml::valid-name-p tag-name)
+ (setf tag-name (%rod tag-name))
+ (unless (valid-name-p tag-name)
(dom-error :INVALID_CHARACTER_ERR "not a name: ~A" (rod-string tag-name)))
- (let ((result (make-instance 'element
+ (let ((result (make-instance 'element
:tag-name tag-name
+ :namespace-uri nil
+ :local-name nil
+ :prefix nil
:owner document)))
(setf (slot-value result 'attributes)
(make-instance 'attribute-node-map
@@ -202,32 +334,71 @@
(add-default-attributes result)
result))
+(defun safe-split-qname (qname uri)
+ (unless (valid-name-p qname)
+ (dom-error :INVALID_CHARACTER_ERR "not a name: ~A" (rod-string qname)))
+ (multiple-value-bind (prefix local-name)
+ (handler-case
+ (cxml::split-qname (real-rod qname))
+ (cxml:well-formedness-violation (c)
+ (dom-error :NAMESPACE_ERR "~A" c)))
+ (setf local-name (%rod local-name))
+ (when prefix
+ (setf prefix (%rod prefix))
+ (unless uri
+ (dom-error :NAMESPACE_ERR "prefix specified but no namespace URI"))
+ (when (and (rod= prefix #"xml")
+ (not (rod= uri #"http://www.w3.org/XML/1998/namespace")))
+ (dom-error :NAMESPACE_ERR "invalid uri for prefix `xml'"))
+ (when (and (rod= prefix #"xmlns")
+ (not (rod= uri #"http://www.w3.org/2000/xmlns/")))
+ (dom-error :NAMESPACE_ERR "invalid uri for prefix `xmlns'")))
+ (values prefix local-name)))
+
+(defmethod dom:create-element-ns ((document document) uri qname)
+ (setf qname (%rod qname))
+ (multiple-value-bind (prefix local-name)
+ (safe-split-qname qname uri)
+ (let ((result (make-instance 'element
+ :tag-name qname
+ :namespace-uri uri
+ :local-name local-name
+ :prefix prefix
+ :owner document)))
+ (setf (slot-value result 'attributes)
+ (make-instance 'attribute-node-map
+ :element-type :attribute
+ :owner document
+ :element result))
+ (add-default-attributes result)
+ result)))
+
(defmethod dom:create-document-fragment ((document document))
(make-instance 'document-fragment
:owner document))
(defmethod dom:create-text-node ((document document) data)
- (setf data (rod data))
+ (setf data (%rod data))
(make-instance 'text
:data data
:owner document))
(defmethod dom:create-comment ((document document) data)
- (setf data (rod data))
+ (setf data (%rod data))
(make-instance 'comment
:data data
:owner document))
(defmethod dom:create-cdata-section ((document document) data)
- (setf data (rod data))
+ (setf data (%rod data))
(make-instance 'cdata-section
:data data
:owner document))
(defmethod dom:create-processing-instruction ((document document) target data)
- (setf target (rod target))
- (setf data (rod data))
- (unless (cxml::valid-name-p target)
+ (setf target (%rod target))
+ (setf data (%rod data))
+ (unless (valid-name-p target)
(dom-error :INVALID_CHARACTER_ERR "not a name: ~A" (rod-string target)))
(make-instance 'processing-instruction
:owner document
@@ -235,41 +406,108 @@
:data data))
(defmethod dom:create-attribute ((document document) name)
- (setf name (rod name))
- (unless (cxml::valid-name-p name)
+ (setf name (%rod name))
+ (unless (valid-name-p name)
(dom-error :INVALID_CHARACTER_ERR "not a name: ~A" (rod-string name)))
(make-instance 'attribute
:name name
+ :local-name nil
+ :prefix nil
+ :namespace-uri nil
:specified-p t
+ :owner-element nil
:owner document))
+(defmethod dom:create-attribute-ns ((document document) uri qname)
+ (setf uri (%rod uri))
+ (setf qname (%rod qname))
+ (when (and (rod= qname #"xmlns")
+ (not (rod= uri #"http://www.w3.org/2000/xmlns/")))
+ (dom-error :NAMESPACE_ERR "invalid uri for qname `xmlns'"))
+ (multiple-value-bind (prefix local-name)
+ (safe-split-qname qname uri)
+ (make-instance 'attribute
+ :name qname
+ :namespace-uri uri
+ :local-name local-name
+ :prefix prefix
+ :specified-p t
+ :owner-element nil
+ :owner document)))
+
(defmethod dom:create-entity-reference ((document document) name)
- (setf name (rod name))
- (unless (cxml::valid-name-p name)
+ (setf name (%rod name))
+ (unless (valid-name-p name)
(dom-error :INVALID_CHARACTER_ERR "not a name: ~A" (rod-string name)))
(make-instance 'entity-reference
:name name
:owner document))
(defmethod get-elements-by-tag-name-internal (node tag-name)
- (setf tag-name (rod tag-name))
- (let ((result (make-node-list)))
- (setf tag-name (rod tag-name))
- (let ((wild-p (rod= tag-name '#.(string-rod "*"))))
- (labels ((walk (n)
- (dovector (c (dom:child-nodes n))
- (when (dom:element-p c)
- (when (or wild-p (rod= tag-name (dom:node-name c)))
- (vector-push-extend c result (extension result)))
- (walk c)))))
- (walk node)))
+ (setf tag-name (%rod tag-name))
+ (let ((result (make-node-list))
+ (wild-p (rod= tag-name #"*")))
+ (labels ((walk (n)
+ (dovector (c (dom:child-nodes n))
+ (when (dom:element-p c)
+ (when (or wild-p (rod= tag-name (dom:node-name c)))
+ (vector-push-extend c result (extension result)))
+ (walk c)))))
+ (walk node))
result))
+(defmethod get-elements-by-tag-name-internal-ns (node uri lname)
+ (setf uri (%rod uri))
+ (setf lname (%rod lname))
+ (let ((result (make-node-list))
+ (wild-uri-p (rod= uri #"*"))
+ (wild-lname-p (rod= lname #"*")))
+ (labels ((walk (n)
+ (dovector (c (dom:child-nodes n))
+ (when (dom:element-p c)
+ (when (and (or wild-lname-p (rod= lname (dom:local-name c)))
+ (or wild-uri-p (rod= uri (dom:namespace-uri c))))
+ (vector-push-extend c result (extension result)))
+ (walk c)))))
+ (walk node))
+ result))
+
(defmethod dom:get-elements-by-tag-name ((document document) tag-name)
(get-elements-by-tag-name-internal document tag-name))
+(defmethod dom:get-elements-by-tag-name-ns ((document document) uri lname)
+ (get-elements-by-tag-name-internal-ns document uri lname))
+
+(defmethod dom:get-element-by-id ((document document) id)
+ (block t
+ (unless (dtd document)
+ (return-from t nil))
+ (setf id (%rod id))
+ (labels ((walk (n)
+ (dovector (c (dom:child-nodes n))
+ (when (dom:element-p c)
+ (let ((e (cxml::find-element
+ (real-rod (dom:tag-name c))
+ (dtd document))))
+ (when e
+ (dolist (a (cxml::elmdef-attributes e))
+ (when (eq :ID (cxml::attdef-type a))
+ (let* ((name (%rod (cxml::attdef-name a)))
+ (value (dom:get-attribute c name)))
+ (when (and value (rod= value id))
+ (return-from t c)))))))
+ (walk c)))))
+ (walk document))))
+
+
;;; Node
+(defmethod dom:has-attributes ((element node))
+ nil)
+
+(defmethod dom:is-supported ((node node) feature version)
+ (dom:has-feature 'implementation feature version))
+
(defmethod dom:parent-node ((node node))
(slot-value node 'parent))
@@ -349,9 +587,11 @@
(setf (slot-value new-child 'parent) node)
new-child))
-(defmethod dom:insert-before ((node node) (fragment document-fragment) ref-child)
- (dovector (child (dom:child-nodes fragment))
- (dom:insert-before node child ref-child))
+(defmethod dom:insert-before
+ ((node node) (fragment document-fragment) ref-child)
+ (let ((children (dom:child-nodes fragment)))
+ (cxml::while (plusp (length children))
+ (dom:insert-before node (elt children 0) ref-child)))
fragment)
(defmethod dom:replace-child ((node node) (new-child node) (old-child node))
@@ -393,8 +633,9 @@
(defmethod dom:append-child ((node node) (new-child document-fragment))
(assert-writeable node)
- (dovector (child (dom:child-nodes new-child))
- (dom:append-child node child))
+ (let ((children (dom:child-nodes new-child)))
+ (cxml::while (plusp (length children))
+ (dom:append-child node (elt children 0))))
new-child)
;; was auf node noch implemetiert werden muss:
@@ -407,19 +648,19 @@
;; node-name
(defmethod dom:node-name ((self document))
- '#.(string-rod "#document"))
+ #"#document")
(defmethod dom:node-name ((self document-fragment))
- '#.(string-rod "#document-fragment"))
+ #"#document-fragment")
(defmethod dom:node-name ((self text))
- '#.(string-rod "#text"))
+ #"#text")
(defmethod dom:node-name ((self cdata-section))
- '#.(string-rod "#cdata-section"))
+ #"#cdata-section")
(defmethod dom:node-name ((self comment))
- '#.(string-rod "#comment"))
+ #"#comment")
(defmethod dom:node-name ((self attribute))
(dom:name self))
@@ -541,42 +782,75 @@
;;; NAMED-NODE-MAP
(defmethod dom:get-named-item ((self named-node-map) name)
- (setf name (rod name))
+ (setf name (%rod name))
(with-slots (items) self
(dolist (k items nil)
- (cond ((rod= name (dom:node-name k))
- (return k))))))
+ (when (rod= name (dom:node-name k))
+ (return k)))))
-(defmethod dom:set-named-item ((self named-node-map) arg)
- (assert-writeable self)
- (unless (eq (dom:node-type arg) (slot-value self 'element-type))
+(defmethod dom:get-named-item-ns ((self named-node-map) uri lname)
+ (setf uri (%rod uri))
+ (setf lname (%rod lname))
+ (with-slots (items) self
+ (dolist (k items nil)
+ (when (and (rod= uri (dom:namespace-uri k))
+ (rod= lname (dom:local-name k)))
+ (return k)))))
+
+(defun %set-named-item (map arg test)
+ (assert-writeable map)
+ (unless (eq (dom:node-type arg) (slot-value map 'element-type))
(dom-error :HIERARCHY_REQUEST_ERR
"~S cannot adopt ~S, since it is not of type ~S."
- self arg (slot-value self 'element-type)))
- (unless (eq (dom:owner-document self) (dom:owner-document arg))
+ map arg (slot-value map 'element-type)))
+ (unless (eq (dom:owner-document map) (dom:owner-document arg))
(dom-error :WRONG_DOCUMENT_ERR
"~S cannot adopt ~S, since it was created by a different document."
- self arg))
+ map arg))
(let ((old-map (slot-value arg 'map)))
- (when (and old-map (not (eq old-map self)))
+ (when (and old-map (not (eq old-map map)))
(dom-error :INUSE_ATTRIBUTE_ERR "Attribute node already mapped" arg)))
- (setf (slot-value arg 'map) self)
+ (setf (slot-value arg 'map) map)
+ (with-slots (items) map
+ (dolist (k items (progn (setf items (cons arg items)) nil))
+ (when (funcall test k)
+ (setf items (cons arg (delete k items)))
+ (return k)))))
+
+(defmethod dom:set-named-item ((self named-node-map) arg)
(let ((name (dom:node-name arg)))
- (with-slots (items) self
- (dolist (k items (progn (setf items (cons arg items))nil))
- (cond ((rod= name (dom:node-name k))
- (setf items (cons arg (delete k items)))
- (return k)))))))
+ (%set-named-item self arg (lambda (k) (rod= name (dom:node-name k))))))
+(defmethod dom:set-named-item-ns ((self named-node-map) arg)
+ (let ((uri (dom:namespace-uri arg))
+ (lname (dom:local-name arg)))
+ (%set-named-item self
+ arg
+ (lambda (k)
+ (and (rod= lname (dom:local-name k))
+ (rod= uri (dom:namespace-uri k)))))))
+
(defmethod dom:remove-named-item ((self named-node-map) name)
(assert-writeable self)
- (setf name (rod name))
+ (setf name (%rod name))
(with-slots (items) self
(dolist (k items (dom-error :NOT_FOUND_ERR "~A not found in ~A" name self))
(cond ((rod= name (dom:node-name k))
(setf items (delete k items))
(return k))))))
+(defmethod dom:remove-named-item-ns ((self named-node-map) uri lname)
+ (assert-writeable self)
+ (setf uri (%rod uri))
+ (setf lname (%rod lname))
+ (with-slots (items) self
+ (dolist (k items
+ (dom-error :NOT_FOUND_ERR "~A not found in ~A" lname self))
+ (when (and (rod= lname (dom:local-name k))
+ (rod= uri (dom:namespace-uri k)))
+ (setf items (delete k items))
+ (return k)))))
+
(defmethod dom:length ((self named-node-map))
(with-slots (items) self
(length items)))
@@ -591,7 +865,7 @@
(defmethod (setf dom:data) (newval (self character-data))
(assert-writeable self)
- (setf newval (rod newval))
+ (setf newval (%rod newval))
(setf (slot-value self 'value) newval))
(defmethod dom:length ((node character-data))
@@ -606,7 +880,7 @@
(defmethod dom:append-data ((node character-data) arg)
(assert-writeable node)
- (setq arg (rod arg))
+ (setq arg (%rod arg))
(with-slots (value) node
(setf value (concatenate 'rod value arg)))
(values))
@@ -634,7 +908,7 @@
;; Although we could implement this by calling DELETE-DATA, then INSERT-DATA,
;; we implement this function directly to avoid creating temporary garbage.
(assert-writeable node)
- (setf arg (rod arg))
+ (setf arg (%rod arg))
(with-slots (value) node
(unless (<= 0 offset (length value))
(dom-error :INDEX_SIZE_ERR "offset is invalid"))
@@ -657,7 +931,7 @@
(defmethod dom:insert-data ((node character-data) offset arg)
(assert-writeable node)
- (setf arg (rod arg))
+ (setf arg (%rod arg))
(with-slots (value) node
(unless (<= 0 offset (length value))
(dom-error :INDEX_SIZE_ERR "offset is invalid"))
@@ -694,11 +968,11 @@
(defmethod (setf dom:value) (new-value (node attribute))
(assert-writeable node)
- (let ((rod (rod new-value)))
+ (let ((rod (%rod new-value)))
(with-slots (children owner) node
;; remove children, add new TEXT-NODE child
;; (alas, we must not reuse an old TEXT-NODE)
- (while (plusp (length children))
+ (cxml::while (plusp (length children))
(dom:remove-child node (dom:last-child node)))
(dom:append-child node (dom:create-text-node owner rod))))
new-value)
@@ -714,7 +988,7 @@
(rod-stream-buf stream)))
(defmethod write-attribute-child ((node node) stream)
- (write-rod (dom:node-value node) stream))
+ (put-rod (dom:node-value node) stream))
(defmethod write-attribute-child ((node entity-reference) stream)
(dovector (child (dom:child-nodes node))
@@ -729,7 +1003,7 @@
(buf nil)
(position 0))
-(defun write-rod (rod rod-stream)
+(defun put-rod (rod rod-stream)
(let ((buf (rod-stream-buf rod-stream)))
(when buf
(move rod buf 0 (rod-stream-position rod-stream) (length rod)))
@@ -743,6 +1017,15 @@
;;; ELEMENT
+(defmethod dom:has-attributes ((element element))
+ (plusp (length (dom:items (dom:attributes element)))))
+
+(defmethod dom:has-attribute ((element element) name)
+ (and (dom:get-named-item (dom:attributes element) name) t))
+
+(defmethod dom:has-attribute-ns ((element element) uri lname)
+ (and (dom:get-named-item-ns (dom:attributes element) uri lname) t))
+
(defmethod dom:get-attribute-node ((element element) name)
(dom:get-named-item (dom:attributes element) name))
@@ -750,68 +1033,141 @@
(assert-writeable element)
(dom:set-named-item (dom:attributes element) new-attr))
+(defmethod dom:get-attribute-node-ns ((element element) uri lname)
+ (dom:get-named-item-ns (dom:attributes element) uri lname))
+
+(defmethod dom:set-attribute-node-ns ((element element) (new-attr attribute))
+ (assert-writeable element)
+ (dom:set-named-item-ns (dom:attributes element) new-attr))
+
(defmethod dom:get-attribute ((element element) name)
(let ((a (dom:get-attribute-node element name)))
(if a
(dom:value a)
- #.(string-rod ""))))
+ #"")))
+(defmethod dom:get-attribute-ns ((element element) uri lname)
+ (let ((a (dom:get-attribute-node-ns element uri lname)))
+ (if a
+ (dom:value a)
+ #"")))
+
(defmethod dom:set-attribute ((element element) name value)
(assert-writeable element)
(with-slots (owner) element
(let ((attr (dom:create-attribute owner name)))
+ (setf (slot-value attr 'owner-element) element)
(setf (dom:value attr) value)
(dom:set-attribute-node element attr))
(values)))
+(defmethod dom:set-attribute-ns ((element element) uri lname value)
+ (assert-writeable element)
+ (with-slots (owner) element
+ (let ((attr (dom:create-attribute-ns owner uri lname)))
+ (setf (slot-value attr 'owner-element) element)
+ (setf (dom:value attr) value)
+ (dom:set-attribute-node-ns element attr))
+ (values)))
+
(defmethod dom:remove-attribute ((element element) name)
(assert-writeable element)
(dom:remove-attribute-node element (dom:get-attribute-node element name)))
+(defmethod dom:remove-attribute-ns ((elt element) uri lname)
+ (assert-writeable elt)
+ (dom:remove-attribute-node elt (dom:get-attribute-node-ns elt uri lname)))
+
(defmethod dom:remove-attribute-node ((element element) (old-attr attribute))
(assert-writeable element)
(with-slots (items) (dom:attributes element)
(unless (find old-attr items)
(dom-error :NOT_FOUND_ERR "Attribute not found."))
(setf items (remove old-attr items))
- (maybe-add-default-attribute element (dom:name old-attr))
+ (maybe-add-default-attribute element old-attr)
old-attr))
;; eek, defaulting:
-(defun maybe-add-default-attribute (element name)
- (let* ((dtd (dtd (slot-value element 'owner)))
- (e (cxml::find-element (dom:tag-name element) dtd))
- (a (when e (cxml::find-attribute e name))))
+(defun maybe-add-default-attribute (element old-attr)
+ (let* ((qname (dom:name old-attr))
+ (dtd (dtd (slot-value element 'owner)))
+ (e (when dtd (cxml::find-element
+ (real-rod (dom:tag-name element))
+ dtd)))
+ (a (when e (cxml::find-attribute e (real-rod qname)))))
(when (and a (listp (cxml::attdef-default a)))
- (add-default-attribute element a))))
+ (let ((new (add-default-attribute element a)))
+ (setf (slot-value new 'namespace-uri) (dom:namespace-uri old-attr))
+ (setf (slot-value new 'prefix) (dom:prefix old-attr))
+ (setf (slot-value new 'local-name) (dom:local-name old-attr))))))
(defun add-default-attributes (element)
(let* ((dtd (dtd (slot-value element 'owner)))
- (e (cxml::find-element (dom:tag-name element) dtd)))
+ (e (when dtd (cxml::find-element
+ (real-rod (dom:tag-name element))
+ dtd))))
(when e
(dolist (a (cxml::elmdef-attributes e))
- (when (and a (listp (cxml::attdef-default a)))
- (add-default-attribute element a))))))
+ (when (and a
+ (listp (cxml::attdef-default a))
+ (not (dom:get-attribute-node
+ element
+ (%rod (cxml::attdef-name a)))))
+ (let ((anode (add-default-attribute element a)))
+ (multiple-value-bind (prefix local-name)
+ (handler-case
+ (cxml::split-qname (cxml::attdef-name a))
+ (cxml:well-formedness-violation (c)
+ (dom-error :NAMESPACE_ERR "~A" c)))
+ (when prefix (setf prefix (%rod prefix)))
+ (setf local-name (%rod local-name))
+ ;; das ist fuer importnode07.
+ ;; so richtig ueberzeugend finde ich das ja nicht.
+ (setf (slot-value anode 'prefix) prefix)
+ (setf (slot-value anode 'local-name) local-name))))))))
(defun add-default-attribute (element adef)
(let* ((value (second (cxml::attdef-default adef)))
(owner (slot-value element 'owner))
(anode (dom:create-attribute owner (cxml::attdef-name adef)))
(text (dom:create-text-node owner value)))
- (setf (slot-value anode 'dom-impl::specified-p) nil)
+ (setf (slot-value anode 'specified-p) nil)
+ (setf (slot-value anode 'owner-element) element)
(dom:append-child anode text)
- (push anode (slot-value (dom:attributes element) 'items))))
+ (push anode (slot-value (dom:attributes element) 'items))
+ anode))
-(defmethod dom:remove-named-item :after ((self attribute-node-map) name)
- (maybe-add-default-attribute (slot-value self 'element) name))
+(defmethod dom:remove-named-item ((self attribute-node-map) name)
+ name
+ (let ((k (call-next-method)))
+ (maybe-add-default-attribute (slot-value self 'element) k)
+ k))
+(defmethod dom:remove-named-item-ns ((self attribute-node-map) uri lname)
+ uri lname
+ (let ((k (call-next-method)))
+ (maybe-add-default-attribute (slot-value self 'element) k)
+ k))
+
(defmethod dom:get-elements-by-tag-name ((element element) name)
(assert-writeable element)
(get-elements-by-tag-name-internal element name))
-(defmethod dom:normalize ((element element))
+(defmethod dom:get-elements-by-tag-name-ns ((element element) uri lname)
(assert-writeable element)
+ (get-elements-by-tag-name-internal-ns element uri lname))
+
+(defmethod dom:set-named-item :after ((self attribute-node-map) arg)
+ (setf (slot-value arg 'owner-element)
+ (slot-value self 'element)))
+
+(defmethod dom:set-named-item-ns :after ((self attribute-node-map) arg)
+ (setf (slot-value arg 'owner-element)
+ (slot-value self 'element)))
+
+(defmethod dom:normalize ((node node))
+ (assert-writeable node)
(labels ((walk (n)
(when (eq (dom:node-type n) :element)
(map nil #'walk (dom:items (dom:attributes n))))
@@ -819,7 +1175,7 @@
(i 0)
(previous nil))
;; careful here, we're modifying the array we are iterating over
- (while (< i (length children))
+ (cxml::while (< i (length children))
(let ((child (elt children i)))
(cond
((not (eq (dom:node-type child) :text))
@@ -833,11 +1189,15 @@
(dom:remove-child n child)
;; not (incf i)
)
+ ((zerop (length (dom:data child)))
+ (dom:remove-child n child)
+ ;; not (incf i)
+ )
(t
(setf previous child)
(incf i))))))
(map nil #'walk (dom:child-nodes n))))
- (walk element))
+ (walk node))
(values))
;;; TEXT
@@ -856,7 +1216,23 @@
;;; COMMENT -- nix
;;; CDATA-SECTION -- nix
-;;; DOCUMENT-TYPE -- missing
+;;; DOCUMENT-TYPE
+
+(defmethod dom:internal-subset ((node document-type))
+ ;; FIXME: encoding ist falsch, anderen sink nehmen!
+ (if (and (slot-boundp node 'dom::%internal-subset)
+ ;; die damen und herren von der test suite sind wohl der meinung,
+ ;; dass ein leeres internal subset nicht vorhanden ist und
+ ;; wir daher nil liefern sollen. bittesehr!
+ (dom::%internal-subset node))
+ (let ((sink
+ #+rune-is-character (cxml:make-string-sink)
+ #-rune-is-character (cxml:make-string-sink/utf8)))
+ (dolist (def (dom::%internal-subset node))
+ (apply (car def) sink (cdr def)))
+ (sax:end-document sink))
+ nil))
+
;;; NOTATION -- nix
;;; ENTITY -- nix
@@ -864,16 +1240,18 @@
(defmethod initialize-instance :after ((instance entity-reference) &key)
(let* ((owner (dom:owner-document instance))
- (handler (dom:make-dom-builder))
+ (handler (make-dom-builder))
(resolver (slot-value owner 'entity-resolver)))
- (unless resolver
- (dom-error :NOT_SUPPORTED_ERR "No entity resolver registered."))
- (setf (document handler) owner)
- (push instance (element-stack handler))
- (funcall resolver (dom:name instance) handler))
+ (when resolver
+ (setf (document handler) owner)
+ (push instance (element-stack handler))
+ #+cxml-system::utf8dom-file
+ (setf handler (cxml:make-recoder handler #'cxml:rod-to-utf8-string))
+ (funcall resolver (real-rod (dom:name instance)) handler)))
(labels ((walk (n)
(setf (slot-value n 'read-only-p) t)
(when (dom:element-p n)
+ (setf (slot-value (dom:attributes n) 'read-only-p) t)
(map nil #'walk (dom:items (dom:attributes n))))
(map nil #'walk (dom:child-nodes n))))
(walk instance)))
@@ -882,7 +1260,7 @@
(defmethod (setf dom:data) (newval (self processing-instruction))
(assert-writeable self)
- (setf newval (rod newval))
+ (setf newval (%rod newval))
(setf (slot-value self 'data) newval))
;; das koennte man auch mit einer GF machen
@@ -965,9 +1343,21 @@
(dom:append-child result (dom:import-node document child t))))
result))
+(defmethod dom:import-node ((document document) (node t) deep)
+ (declare (ignore deep))
+ (dom-error :NOT_SUPPORTED_ERR "not implemented"))
+
(defmethod dom:import-node ((document document) (node attribute) deep)
(declare (ignore deep))
- (import-node-internal 'attribute document node t :name (dom:name node)))
+ (import-node-internal 'attribute
+ document node
+ t
+ :specified-p (dom:specified node)
+ :name (dom:name node)
+ :namespace-uri (dom:namespace-uri node)
+ :local-name (dom:local-name node)
+ :prefix (dom:prefix node)
+ :owner-element nil))
(defmethod dom:import-node ((document document) (node document-fragment) deep)
(import-node-internal 'document-fragment document node deep))
@@ -978,27 +1368,31 @@
:owner document))
(result (import-node-internal 'element document node deep
:attributes attributes
+ :namespace-uri (dom:namespace-uri node)
+ :local-name (dom:local-name node)
+ :prefix (dom:prefix node)
:tag-name (dom:tag-name node))))
(setf (slot-value attributes 'element) result)
(dolist (attribute (dom:items (dom:attributes node)))
(when (or (dom:specified attribute) *clone-not-import*)
- (dom:set-attribute result (dom:name attribute) (dom:value attribute))))
+ (let ((attr (dom:import-node document attribute t)))
+ (if (dom:namespace-uri attribute)
+ (dom:set-attribute-node-ns result attr)
+ (dom:set-attribute-node result attr)))))
+ (add-default-attributes result)
result))
(defmethod dom:import-node ((document document) (node entity) deep)
(import-node-internal 'entity document node deep
+ :name (dom:name node)
:public-id (dom:public-id node)
:system-id (dom:system-id node)
:notation-name (dom:notation-name node)))
(defmethod dom:import-node ((document document) (node entity-reference) deep)
(declare (ignore deep))
- #+(or)
(import-node-internal 'entity-reference document node nil
- :name (dom:name node))
- ;; XXX If the document being imported into provides a definition for
- ;; this entity name, its value is assigned.
- (dom-error :NOT_SUPPORTED_ERR "not implemented"))
+ :name (dom:name node)))
(defmethod dom:import-node ((document document) (node notation) deep)
(import-node-internal 'notation document node deep
@@ -1031,13 +1425,49 @@
(let ((*clone-not-import* t))
(dom:import-node (dom:owner-document node) node deep)))
+;; extension:
+(defmethod dom:clone-node ((node document) deep)
+ (let* ((document (make-instance 'document))
+ (original-doctype (dom:doctype node))
+ (doctype
+ (when original-doctype
+ (make-instance 'document-type
+ :owner document
+ :name (dom:name original-doctype)
+ :public-id (dom:public-id original-doctype)
+ :system-id (dom:system-id original-doctype)
+ :notations (make-instance 'named-node-map
+ :element-type :notation
+ :owner document
+ :items (dom:items (dom:notations original-doctype)))
+ :entities (make-instance 'named-node-map
+ :element-type :entity
+ :owner document
+ :items (dom:items
+ (dom:entities original-doctype)))))))
+ (setf (slot-value document 'owner) nil)
+ (setf (slot-value document 'doc-type) doctype)
+ (setf (slot-value document 'dtd) (dtd node))
+ (setf (slot-value document 'entity-resolver)
+ (slot-value node 'entity-resolver))
+ (setf (slot-value (dom:entities doctype) 'read-only-p) t)
+ (setf (slot-value (dom:notations doctype) 'read-only-p) t)
+ (when (and doctype (slot-boundp doctype 'dom::%internal-subset))
+ (setf (dom::%internal-subset doctype)
+ (dom::%internal-subset original-doctype)))
+ (when (and (dom:document-element node) deep)
+ (let* ((*clone-not-import* t)
+ (clone (dom:import-node document (dom:document-element node) t)))
+ (dom:append-child document clone)))
+ document))
+
;;; Erweiterung
-(defun dom:create-document (&optional document-element)
+(defun create-document (&optional document-element)
;; Um ein neues Dokumentenobject zu erzeugen, parsen wir einfach ein
;; Dummydokument.
- (let* ((handler (dom:make-dom-builder))
+ (let* ((handler (make-dom-builder))
(cxml::*ctx* (cxml::make-context :handler handler))
(result
(progn
Modified: branches/grin-neu/thirdparty/cxml/dom/dom-sax.lisp
===================================================================
--- branches/grin-neu/thirdparty/cxml/dom/dom-sax.lisp 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/cxml/dom/dom-sax.lisp 2006-12-01 10:39:49 UTC (rev 2094)
@@ -1,50 +1,70 @@
;;;; dom-sax.lisp -- DOM walker
;;;;
-;;;; This file is part of the CXML parser, released under (L)LGPL.
+;;;; This file is part of the CXML parser, released under Lisp-LGPL.
;;;; See file COPYING for details.
;;;;
;;;; Author: David Lichteblau <david(a)lichteblau.com>
;;;; Copyright (c) 2004 knowledgeTools Int. GmbH
-(in-package :dom-impl)
+(in-package :cxml)
(defun dom:map-document
(handler document
&key (include-xmlns-attributes sax:*include-xmlns-attributes*)
- include-default-values)
+ include-doctype
+ include-default-values
+ (recode (and #+rune-is-integer (typep document 'utf8-dom::node))))
+ (declare (ignorable recode))
+ #+rune-is-integer
+ (when recode
+ (setf handler (make-recoder handler #'utf8-string-to-rod)))
(sax:start-document handler)
- (let ((doctype (dom:doctype document)))
- (when doctype
- (sax:start-dtd handler (dom:name doctype) nil nil)
- ;; need notations for canonical mode 2
- (let* ((ns (dom:notations doctype))
- (a (make-array (dom:length ns))))
- ;; get them
- (dotimes (k (dom:length ns))
- (setf (elt a k) (dom:item ns k)))
- ;; sort them
- (setf a (sort a #'rod< :key #'dom:name))
- (loop for n across a do
- (sax:notation-declaration handler
- (dom:name n)
- (dom:public-id n)
- (dom:system-id n)))
- ;; fixme: entities!
- (sax:end-dtd handler))))
+ (when include-doctype
+ (let ((doctype (dom:doctype document)))
+ (when doctype
+ (sax:start-dtd handler
+ (dom:name doctype)
+ (dom:public-id doctype)
+ (dom:system-id doctype))
+ (ecase include-doctype
+ (:full-internal-subset
+ (when (slot-boundp doctype 'dom::%internal-subset)
+ (sax:start-internal-subset handler)
+ (dolist (def (dom::%internal-subset doctype))
+ (apply (car def) handler (cdr def)))
+ (sax:end-internal-subset handler)))
+ (:canonical-notations
+ ;; need notations for canonical mode 2
+ (let* ((ns (dom:notations doctype))
+ (a (make-array (dom:length ns))))
+ (when (plusp (dom:length ns))
+ (sax:start-internal-subset handler)
+ ;; get them
+ (dotimes (k (dom:length ns))
+ (setf (elt a k) (dom:item ns k)))
+ ;; sort them
+ (setf a (sort a #'rod< :key #'dom:name))
+ (loop for n across a do
+ (sax:notation-declaration handler
+ (dom:name n)
+ (dom:public-id n)
+ (dom:system-id n)))
+ (sax:end-internal-subset handler)))))
+ (sax:end-dtd handler))))
(labels ((walk (node)
(dom:do-node-list (child (dom:child-nodes node))
(ecase (dom:node-type child)
(:element
- ;; fixme: namespaces
(let ((attlist
(compute-attributes child
include-xmlns-attributes
include-default-values))
- (lname (dom:tag-name child))
+ (uri (dom:namespace-uri child))
+ (lname (dom:local-name child))
(qname (dom:tag-name child)))
- (sax:start-element handler nil lname qname attlist)
+ (sax:start-element handler uri lname qname attlist)
(walk child)
- (sax:end-element handler nil lname qname)))
+ (sax:end-element handler uri lname qname)))
(:cdata-section
(sax:start-cdata handler)
(sax:characters handler (dom:data child))
@@ -64,10 +84,12 @@
(let ((results '()))
(dom:do-node-list (a (dom:attributes element))
(when (and (or defaultp (dom:specified a))
- (or xmlnsp (not (cxml::xmlns-attr-p (dom:name a)))))
+ (or xmlnsp (not (cxml::xmlns-attr-p (rod (dom:name a))))))
(push
(sax:make-attribute :qname (dom:name a)
:value (dom:value a)
+ :local-name (dom:local-name a)
+ :namespace-uri (dom:namespace-uri a)
:specified-p (dom:specified a))
results)))
(reverse results)))
Modified: branches/grin-neu/thirdparty/cxml/dom/package.lisp
===================================================================
--- branches/grin-neu/thirdparty/cxml/dom/package.lisp 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/cxml/dom/package.lisp 2006-12-01 10:39:49 UTC (rev 2094)
@@ -1,6 +1,6 @@
;;;; package.lisp -- Paketdefinition
;;;;
-;;;; This file is part of the CXML parser, released under (L)LGPL.
+;;;; This file is part of the CXML parser, released under Lisp-LGPL.
;;;; See file COPYING for details.
(in-package :cl-user)
@@ -8,11 +8,33 @@
(defpackage :dom
(:use)
(:export
-
- ;; lisp-specific extensions
- #:make-dom-builder
+ ;; DOM 2 functions
+ #:owner-element
+ #:import-node
+ #:create-element-ns
+ #:create-attribute-ns
+ #:get-elements-by-tag-name-ns
+ #:get-element-by-id
+ #:get-named-item-ns
+ #:set-named-item-ns
+ #:remove-named-item-ns
+ #:is-supported
+ #:has-attributes
+ #:namespace-uri
+ #:prefix
+ #:local-name
+ #:internal-subset
+ #:create-document-type
+ #:create-document
+ #:get-attribute-ns
+ #:set-attribute-ns
+ #:remove-attribute-ns
+ #:get-attribute-node-ns
+ #:set-attribute-node-ns
+ #:has-attribute
+ #:has-attribute-ns
- ;; methods
+ ;; DOM 1 functions
#:has-feature
#:doctype
#:implementation
@@ -72,16 +94,12 @@
#:system-id
#:notation-name
#:target
- #:import-node
#:code
-
- ;; protocol classes
- #:dom-implementation
+
+ ;; IDL interfaces, exported "inofficially"
+ #:node
+ #:document
#:document-fragment
- #:document
- #:node
- #:node-list
- #:named-node-map
#:character-data
#:attr
#:element
@@ -93,8 +111,14 @@
#:entity
#:entity-reference
#:processing-instruction
+ #:named-node-map
+ ;; no classes:
+;;; #:dom-implementation
+;;; #:node-list
+
;;
#:items
+
;;
#:node-p
#:document-p
@@ -114,5 +138,24 @@
#:map-node-list
#:do-node-list
+ #:map-node-map
+ #:do-node-map
#:create-document
#:map-document))
+
+(defclass dom:node () ())
+(defclass dom:document (dom:node) ())
+(defclass dom:document-fragment (dom:node) ())
+(defclass dom:character-data (dom:node) ())
+(defclass dom:attr (dom:node) ())
+(defclass dom:element (dom:node) ())
+(defclass dom:text (dom:character-data) ())
+(defclass dom:comment (dom:character-data) ())
+(defclass dom:cdata-section (dom:text) ())
+(defclass dom:document-type (dom:node) ())
+(defclass dom:notation (dom:node) ())
+(defclass dom:entity (dom:node) ())
+(defclass dom:entity-reference (dom:node) ())
+(defclass dom:processing-instruction (dom:node) ())
+
+(defclass dom:named-node-map () ())
Modified: branches/grin-neu/thirdparty/cxml/mlisp-patch.diff
===================================================================
--- branches/grin-neu/thirdparty/cxml/mlisp-patch.diff 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/cxml/mlisp-patch.diff 2006-12-01 10:39:49 UTC (rev 2094)
@@ -1,44 +1,5 @@
-* looking for david(a)knowledgetools.de--cxml/cxml--devel--1.0--patch-194 to compare with
-* comparing to david(a)knowledgetools.de--cxml/cxml--devel--1.0--patch-194
-M xml/xml-name-rune-p.lisp
-M xml/xml-parse.lisp
-
-* modified files
-
---- orig/xml/xml-name-rune-p.lisp
-+++ mod/xml/xml-name-rune-p.lisp
-@@ -206,15 +206,15 @@
- (setf (aref r i) 1))))) )
-
- `(progn
-- (DEFSUBST NAME-RUNE-P (RUNE)
-- (SETF RUNE (RUNE-CODE RUNE))
-- (AND (<= 0 RUNE ,*max*)
-- (LOCALLY (DECLARE (OPTIMIZE (SAFETY 0) (SPEED 3)))
-- (= 1 (SBIT ',(predicate-to-bv #'name-rune-p)
-- (THE FIXNUM RUNE))))))
-- (DEFSUBST NAME-START-RUNE-P (RUNE)
-- (SETF RUNE (RUNE-CODE RUNE))
-- (AND (<= 0 RUNE ,*MAX*)
-- (LOCALLY (DECLARE (OPTIMIZE (SAFETY 0) (SPEED 3)))
-- (= 1 (SBIT ',(predicate-to-bv #'name-start-rune-p)
-- (THE FIXNUM RUNE)))))))) ))))
-+ (defsubst name-rune-p (rune)
-+ (setf rune (rune-code rune))
-+ (and (<= 0 rune ,*max*)
-+ (locally (declare (optimize (safety 0) (speed 3)))
-+ (= 1 (sbit ',(predicate-to-bv #'name-rune-p)
-+ (the fixnum rune))))))
-+ (defsubst name-start-rune-p (rune)
-+ (setf rune (rune-code rune))
-+ (and (<= 0 rune ,*max*)
-+ (locally (declare (optimize (safety 0) (speed 3)))
-+ (= 1 (sbit ',(predicate-to-bv #'name-start-rune-p)
-+ (the fixnum rune)))))))) ))))
-
-
---- orig/xml/xml-parse.lisp
-+++ mod/xml/xml-parse.lisp
+--- xml/xml-parse.lisp
++++ xml/xml-parse.lisp
@@ -2497,20 +2497,20 @@
(let ((input-var (gensym))
(collect (gensym))
@@ -74,3 +35,34 @@
+Index: xml/xml-name-rune-p.lisp
+===================================================================
+RCS file: /project/cxml/cvsroot/cxml/xml/xml-name-rune-p.lisp,v
+retrieving revision 1.2
+diff -r1.2 xml-name-rune-p.lisp
+214,225c214,225
+< (DEFINLINE NAME-RUNE-P (RUNE)
+< (SETF RUNE (RUNE-CODE RUNE))
+< (AND (<= 0 RUNE ,*max*)
+< (LOCALLY (DECLARE (OPTIMIZE (SAFETY 0) (SPEED 3)))
+< (= 1 (SBIT ',(predicate-to-bv #'name-rune-p)
+< (THE FIXNUM RUNE))))))
+< (DEFINLINE NAME-START-RUNE-P (RUNE)
+< (SETF RUNE (RUNE-CODE RUNE))
+< (AND (<= 0 RUNE ,*MAX*)
+< (LOCALLY (DECLARE (OPTIMIZE (SAFETY 0) (SPEED 3)))
+< (= 1 (SBIT ',(predicate-to-bv #'name-start-rune-p)
+< (THE FIXNUM RUNE)))))))) ))))
+---
+> (definline name-rune-p (rune)
+> (setf rune (rune-code rune))
+> (and (<= 0 rune ,*max*)
+> (locally (declare (optimize (safety 0) (speed 3)))
+> (= 1 (sbit ',(predicate-to-bv #'name-rune-p)
+> (the fixnum rune))))))
+> (definline name-start-rune-p (rune)
+> (setf rune (rune-code rune))
+> (and (<= 0 rune ,*max*)
+> (locally (declare (optimize (safety 0) (speed 3)))
+> (= 1 (sbit ',(predicate-to-bv #'name-start-rune-p)
+> (the fixnum rune)))))))) ))))
Modified: branches/grin-neu/thirdparty/cxml/runes/characters.lisp
===================================================================
--- branches/grin-neu/thirdparty/cxml/runes/characters.lisp 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/cxml/runes/characters.lisp 2006-12-01 10:39:49 UTC (rev 2094)
@@ -3,7 +3,7 @@
;;;
;;; derived from runes.lisp, (c) copyright 1998,1999 by Gilbert Baumann
;;;
-;;; License: LLGPL (See file COPYING for details).
+;;; License: Lisp-LGPL (See file COPYING for details).
;;;
;;; This code is free software; you can redistribute it and/or modify it
;;; under the terms of the version 2.1 of the GNU Lesser General Public
@@ -24,35 +24,35 @@
(in-package :runes)
-(deftype rune () 'base-char)
-(deftype rod () 'base-string)
-(deftype simple-rod () 'simple-string)
+(deftype rune () #-lispworks 'character #+lispworks 'lw:simple-char)
+(deftype rod () '(vector rune))
+(deftype simple-rod () '(simple-array rune))
-(defsubst rune (rod index)
+(definline rune (rod index)
(char rod index))
(defun (setf rune) (new rod index)
(setf (char rod index) new))
-(defsubst %rune (rod index)
+(definline %rune (rod index)
(aref (the simple-string rod) (the fixnum index)))
-(defsubst (setf %rune) (new rod index)
+(definline (setf %rune) (new rod index)
(setf (aref (the simple-string rod) (the fixnum index)) new))
(defun rod-capitalize (rod)
(string-upcase rod))
-(defsubst code-rune (x) (code-char x))
-(defsubst rune-code (x) (char-code x))
+(definline code-rune (x) (code-char x))
+(definline rune-code (x) (char-code x))
-(defsubst rune= (x y)
+(definline rune= (x y)
(char= x y))
(defun rune-downcase (rune)
(char-downcase rune))
-(defsubst rune-upcase (rune)
+(definline rune-upcase (rune)
(char-upcase rune))
(defun rune-upper-case-letter-p (rune)
@@ -70,13 +70,13 @@
(defun rod-upcase (rod)
(string-upcase rod))
-(defsubst white-space-rune-p (char)
+(definline white-space-rune-p (char)
(or (char= char #\tab)
(char= char #.(code-char 10)) ;Linefeed
(char= char #.(code-char 13)) ;Carriage Return
(char= char #\space)))
-(defsubst digit-rune-p (char &optional (radix 10))
+(definline digit-rune-p (char &optional (radix 10))
(digit-char-p char radix))
(defun rod (x)
@@ -95,13 +95,15 @@
(stringp x))
(defun rod= (x y)
- (string= x y))
+ (if (zerop (length x))
+ (zerop (length y))
+ (and (plusp (length y)) (string= x y))))
(defun rod-equal (x y)
(string-equal x y))
-(defsubst make-rod (size)
- (make-string size))
+(definline make-rod (size)
+ (make-string size :element-type 'rune))
(defun char-rune (char)
char)
Added: branches/grin-neu/thirdparty/cxml/runes/definline.lisp
===================================================================
--- branches/grin-neu/thirdparty/cxml/runes/definline.lisp 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/cxml/runes/definline.lisp 2006-12-01 10:39:49 UTC (rev 2094)
@@ -0,0 +1,63 @@
+;;; -*- Mode: Lisp; Syntax: Common-Lisp; Package: CL-USER; -*-
+;;; ---------------------------------------------------------------------------
+;;; Title: definline
+;;; Created: 1999-05-25 22:32
+;;; Author: Gilbert Baumann <unk6(a)rz.uni-karlsruhe.de>
+;;; License: Lisp-LGPL (See file COPYING for details).
+;;; ---------------------------------------------------------------------------
+;;; (c) copyright 1999 by Gilbert Baumann
+
+;;; This code is free software; you can redistribute it and/or modify it
+;;; under the terms of the version 2.1 of the GNU Lesser General Public
+;;; License as published by the Free Software Foundation, as clarified
+;;; by the "Preamble to the Gnu Lesser General Public License" found in
+;;; the file COPYING.
+;;;
+;;; This code is distributed in the hope that it will be useful,
+;;; but without any warranty; without even the implied warranty of
+;;; merchantability or fitness for a particular purpose. See the GNU
+;;; Lesser General Public License for more details.
+;;;
+;;; Version 2.1 of the GNU Lesser General Public License is in the file
+;;; COPYING that was distributed with this file. If it is not present,
+;;; you can access it from http://www.gnu.org/copyleft/lesser.txt (until
+;;; superseded by a newer version) or write to the Free Software
+;;; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+(in-package :runes)
+
+#-(or allegro openmcl)
+(defmacro definline (name args &body body)
+ `(progn
+ (declaim (inline ,name))
+ (defun ,name ,args .,body)))
+
+#+openmcl
+(defmacro runes::definline (fun args &body body)
+ (if (consp fun)
+ `(defun ,fun ,args
+ ,@body)
+ `(progn
+ (defun ,fun ,args .,body)
+ (define-compiler-macro ,fun (&rest .args.)
+ (cons '(lambda ,args .,body)
+ .args.)))))
+
+#+allegro
+(defmacro definline (fun args &body body)
+ (if (and (consp fun) (eq (car fun) 'setf))
+ (let ((fnam (intern (concatenate 'string "(SETF " (symbol-name (cadr fun)) ")")
+ (symbol-package (cadr fun)))))
+ `(progn
+ (defsetf ,(cadr fun) (&rest ap) (new-value) (list* ',fnam new-value ap))
+ (definline ,fnam ,args .,body)))
+ (labels ((declp (x)
+ (and (consp x) (eq (car x) 'declare))))
+ `(progn
+ (defun ,fun ,args .,body)
+ (define-compiler-macro ,fun (&rest .args.)
+ (cons '(lambda ,args
+ ,@(remove-if-not #'declp body)
+ (block ,fun
+ ,@(remove-if #'declp body)))
+ .args.))))))
Added: branches/grin-neu/thirdparty/cxml/runes/definline.x86f
===================================================================
--- branches/grin-neu/thirdparty/cxml/runes/definline.x86f 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/cxml/runes/definline.x86f 2006-12-01 10:39:49 UTC (rev 2094)
@@ -0,0 +1,30 @@
+FASL FILE output from /usr/home/hans/bknr-svn/thirdparty/cxml/runes/definline.lisp.
+Compiled Thursday, 11/30/06 10:08:49 pm GMT on ibuprofen.huebner.org
+Compiler 1.1, Lisp 19c Release (19C)
+Targeted for Intel x86, FASL version 19C
+���Q&KERNEL%IN-PACKAGE&COMMON-LISPQUOTE&RUNES6R?>#�BINLINEDECLAIMDEFUNPROGNDEFMACROQ&RUNESR DEFINLINE NAME ARGS&BODY BODYLDO-ARG-COUNT-ERROR<Q&CCOMPILED-DEBUG-INFORQR($$-Q&
+EXTENSIONSINSTANCER($$-QSTRUCTURE-OBJECTR($$-Q
+DEBUG-INFOR($$-($$- &DEFMACRO DEFINLINE!&RUNES"QCOMPILED-DEBUG-FUNCTIONRQDEBUG-FUNCTIONR(%$$-&('$$
-(NMACRO
+*NEXTERNAL+
+G1MG2�,+��-$$$DELETED(/NSTANDARD$'$$#1
1$*(+2LISTCOMMON-LISPNNAME��TAILLISPNWHOLE-0C2+p*$# �
L
+T
+
+
+
+3$$.(40$'$$*#
1
5(617*�58;�~�E��e������U�M��$<�����H��$<��1��#��B��������������ЋI���(t��$<t̓���M��$<�����H��$<���A����E�H��$<���I��$<���A��E��E�H��$<���I��$<���A�E����4�(��(�|�(;��(v��|�(�[�ÉP����@��x��@�(��(�=4�(t� ����4�(��(�|�(;��(v��|�(�[�ÉP����@��x��@�(��(�=4�(t� �]����u��E�E��4�(��(�|�(;��(v��|�(�[�ÉP����@��x����@��p��M��H��(�=4�(t� ���}��4�(��(�|�(;��(v��|�(�[�ÉP����@��x����@��p��@�(��(�=4�(t� �ӋM��E��������M��$<�����p�܃��!�=%�)�C��C��C��(�-��k����P��1�
+@�������
+M�
+N�
+N�4�(��(�|�(;��(v��|�(�
+�@�P���(�=4�(t� ������
+
+�
+N�
+N�
+N�
+N�
+N�
+N�
+NQNRELATIVER�alloc_overflow_eax9QNABSOLUTER��QNABSOLUTER��QNABSOLUTER��QNABSOLUTER��QNABSOLUTER��QNRELATIVER�alloc_overflow_ebxXQNABSOLUTER�/QNRELATIVER�alloc_overflow_ebx�QNABSOLUTER��QNRELATIVER�alloc_overflow_ebx�QNABSOLUTER�_QNRELATIVER�alloc_overflow_ebx'QNABSOLUTER��=?G*&(name args &body body)HFUNCTIONJLISTL�*MJ
+M&Top-Level FormN1OP;
+? !0�q0�QN$$QSIMPLE-BYTE-FUNCTIONRQFUNCTIONR(T$$-UQFUNCALLABLE-INSTANCERU(W$$-XQBYTE-FUNCTION-OR-CLOSURERUX(Z$$-[Q
BYTE-FUNCTIONRUX[(]$$-^(_$$-`�a8QDEBUG-SOURCER(c$$ -dNFILE&</usr/home/hans/bknr-svn/thirdparty/cxml/runes/definline.lispf"?6�g"���h$+ni1 jkl�Pl�8?>m@
\ No newline at end of file
Modified: branches/grin-neu/thirdparty/cxml/runes/encodings-data.lisp
===================================================================
--- branches/grin-neu/thirdparty/cxml/runes/encodings-data.lisp 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/cxml/runes/encodings-data.lisp 2006-12-01 10:39:49 UTC (rev 2094)
@@ -1,4 +1,4 @@
-(in-package :encoding)
+(in-package :runes-encoding)
(progn
(add-name :us-ascii "ANSI_X3.4-1968")
Modified: branches/grin-neu/thirdparty/cxml/runes/encodings.lisp
===================================================================
--- branches/grin-neu/thirdparty/cxml/runes/encodings.lisp 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/cxml/runes/encodings.lisp 2006-12-01 10:39:49 UTC (rev 2094)
@@ -1,5 +1,10 @@
-(in-package :encoding)
+(in-package :runes-encoding)
+(define-condition encoding-error (simple-error) ())
+
+(defun xerror (fmt &rest args)
+ (error 'encoding-error :format-control fmt :format-arguments args))
+
;;;; ---------------------------------------------------------------------------
;;;; Encoding names
;;;;
@@ -102,6 +107,39 @@
(defmacro %< (&rest xs) `(fx-pred < ,@xs))
(defmacro %> (&rest xs) `(fx-pred > ,@xs))
+;;; Decoders
+
+;; The decoders share a common signature:
+;;
+;; DECODE input input-start input-end
+;; output output-start output-end
+;; eof-p
+;; -> first-not-written ; first-not-read
+;;
+;; These decode functions should decode as much characters off `input'
+;; into the `output' as possible and return the indexes to the first
+;; not read and first not written element of `input' and `output'
+;; respectively. If there are not enough bytes in `input' to decode a
+;; full character, decoding shold be abandomed; the caller has to
+;; ensure that the remaining bytes of `input' are passed to the
+;; decoder again with more bytes appended.
+;;
+;; `eof-p' now in turn indicates, if the given input sequence, is all
+;; the producer does have and might be used to produce error messages
+;; in case of incomplete codes or decided what to do.
+;;
+;; Decoders are expected to handle the various CR/NL conventions and
+;; canonicalize each end of line into a single NL rune (#xA) in good
+;; old Lisp tradition.
+;;
+
+;; TODO: change this to an encoding class, which then might carry
+;; additional state. Stateless encodings could been represented by
+;; keywords. e.g.
+;;
+;; defmethod DECODE-SEQUENCE ((encoding (eql :utf-8)) ...)
+;;
+
(defmethod decode-sequence ((encoding (eql :utf-16-big-endian))
in in-start in-end out out-start out-end eof?)
;; -> new wptr, new rptr
@@ -115,7 +153,13 @@
(let ((hi (aref in rptr))
(lo (aref in (%+ 1 rptr))))
(setf rptr (%+ 2 rptr))
- (setf (aref out wptr) (logior (ash hi 8) lo))
+ ;; FIXME: Wenn wir hier ein Surrogate sehen, muessen wir das naechste
+ ;; Zeichen abwarten und nachgucken, dass nicht etwa die andere
+ ;; Haelfte fehlt!
+ (let ((x (logior (ash hi 8) lo)))
+ (when (or (eql x #xFFFE) (eql x #xFFFF))
+ (xerror "not a valid code point: #x~X" x))
+ (setf (aref out wptr) x))
(setf wptr (%+ 1 wptr))))
(values wptr rptr)))
@@ -132,7 +176,13 @@
(let ((lo (aref in (%+ 0 rptr)))
(hi (aref in (%+ 1 rptr))))
(setf rptr (%+ 2 rptr))
- (setf (aref out wptr) (logior (ash hi 8) lo))
+ ;; FIXME: Wenn wir hier ein Surrogate sehen, muessen wir das naechste
+ ;; Zeichen abwarten und nachgucken, dass nicht etwa die andere
+ ;; Haelfte fehlt!
+ (let ((x (logior (ash hi 8) lo)))
+ (when (or (eql x #xFFFE) (eql x #xFFFF))
+ (xerror "not a valid code point: #x~X" x))
+ (setf (aref out wptr) x))
(setf wptr (%+ 1 wptr))))
(values wptr rptr)))
@@ -147,14 +197,14 @@
byte0)
(macrolet ((put (x)
`((lambda (x)
- (cond ((or (<= #xD800 x #xDBFF)
- (<= #xDC00 x #xDFFF))
- (error "Encoding UTF-16 in UTF-8? : #x~x." x)))
- '(unless (data-char-p x)
- (error "#x~x is not a data character." x))
- ;;(fresh-line)
- ;;(prin1 x) (princ "-> ")
- (cond ((%> x #xFFFF)
+ (when (or (<= #xD800 x #xDBFF)
+ (<= #xDC00 x #xDFFF))
+ (xerror "surrogate encoded in UTF-8: #x~X." x))
+ (cond ((or (%> x #x10FFFF)
+ (eql x #xFFFE)
+ (eql x #xFFFF))
+ (xerror "not a valid code point: #x~X" x))
+ ((%> x #xFFFF)
(setf (aref out (%+ 0 wptr)) (%+ #xD7C0 (ash x -10))
(aref out (%+ 1 wptr)) (%ior #xDC00 (%and x #x3FF)))
(setf wptr (%+ wptr 2)))
@@ -196,7 +246,7 @@
(setf rptr (%+ rptr 1)))
((%<= #|#b10000000|# byte0 #b10111111)
- (error "Corrupted UTF-8 input (initial byte was #b~8,'0B)" byte0)
+ (xerror "Corrupted UTF-8 input (initial byte was #b~8,'0B)" byte0)
(setf rptr (%+ rptr 1)))
((%<= #|#b11000000|# byte0 #b11011111)
@@ -260,7 +310,7 @@
(return))))
(t
- (error "Corrupted UTF-8 input (initial byte was #b~8,'0B)" byte0)) ) ))
+ (xerror "Corrupted UTF-8 input (initial byte was #b~8,'0B)" byte0)) ) ))
(values wptr rptr)) )
(defmethod encoding-p ((object (eql :utf-16-little-endian))) t)
@@ -343,5 +393,4 @@
(defun find-charset (name)
(or (gethash name *charsets*)
- (error "There is no character set named ~S." name)))
-
+ (xerror "There is no character set named ~S." name)))
Modified: branches/grin-neu/thirdparty/cxml/runes/package.lisp
===================================================================
--- branches/grin-neu/thirdparty/cxml/runes/package.lisp 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/cxml/runes/package.lisp 2006-12-01 10:39:49 UTC (rev 2094)
@@ -10,15 +10,8 @@
(defpackage :runes
(:use :cl)
- (:export #:defsubst
+ (:export #:definline
- ;; util.lisp :
- #:compose
- #:curry
- #:rcurry
- #:until
- #:while
-
;; runes.lisp
#:rune
#:rod
@@ -50,6 +43,7 @@
#:rod<
;; xstream.lisp
+ #:xstream
#:make-xstream
#:make-rod-xstream
#:close-xstream
@@ -66,10 +60,31 @@
#:xstream-plist
#:xstream-encoding
#:set-to-full-speed
- #:xstream-name))
+ #:xstream-name
-(defpackage :encoding
+ ;; ystream.lisp
+ #:ystream
+ #:close-ystream
+ #:write-rune
+ #:write-rod
+ #:ystream-column
+ #:make-octet-vector-ystream
+ #:make-octet-stream-ystream
+ #:make-rod-ystream
+ #+rune-is-character #:make-character-stream-ystream
+ #+rune-is-integer #:make-string-ystream/utf8
+ #+rune-is-integer #:make-character-stream-ystream/utf8
+ #:runes-to-utf8/adjustable-string))
+
+(defpackage :utf8-runes
+ (:use :cl)
+ (:export *utf8-runes-readtable*
+ #:rune #:rod #:simple-rod #:rod-string #:rod= #:make-rod
+ #:string-rod))
+
+(defpackage :runes-encoding
(:use :cl :runes)
(:export
+ #:encoding-error
#:find-encoding
#:decode-sequence))
Modified: branches/grin-neu/thirdparty/cxml/runes/runes.lisp
===================================================================
--- branches/grin-neu/thirdparty/cxml/runes/runes.lisp 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/cxml/runes/runes.lisp 2006-12-01 10:39:49 UTC (rev 2094)
@@ -3,7 +3,7 @@
;;; Title: Unicode strings (called RODs)
;;; Created: 1999-05-25 22:29
;;; Author: Gilbert Baumann <unk6(a)rz.uni-karlsruhe.de>
-;;; License: LLGPL (See file COPYING for details).
+;;; License: Lisp-LGPL (See file COPYING for details).
;;; ---------------------------------------------------------------------------
;;; (c) copyright 1998,1999 by Gilbert Baumann
@@ -42,26 +42,26 @@
(deftype rod () '(array rune (*)))
(deftype simple-rod () '(simple-array rune (*)))
-(defsubst rune (rod index)
+(definline rune (rod index)
(aref rod index))
(defun (setf rune) (new rod index)
(setf (aref rod index) new))
-(defsubst %rune (rod index)
+(definline %rune (rod index)
(aref (the (simple-array (unsigned-byte 16) (*)) rod) (the fixnum index)))
-(defsubst (setf %rune) (new rod index)
+(definline (setf %rune) (new rod index)
(setf (aref (the (simple-array (unsigned-byte 16) (*)) rod) (the fixnum index)) new))
(defun rod-capitalize (rod)
(warn "~S is not implemented." 'rod-capitalize)
rod)
-(defsubst code-rune (x) x)
-(defsubst rune-code (x) x)
+(definline code-rune (x) x)
+(definline rune-code (x) x)
-(defsubst rune= (x y)
+(definline rune= (x y)
(= x y))
(defun rune-downcase (rune)
@@ -70,7 +70,7 @@
((<= #x00c0 rune #x00de) (+ rune #x20))
(t rune)))
-(defsubst rune-upcase (rune)
+(definline rune-upcase (rune)
(cond ((<= #x0061 rune #x007a) (- rune #x20))
((= rune #x00f7) rune)
((<= #x00e0 rune #x00fe) (- rune #x20))
@@ -95,13 +95,13 @@
;; FIXME
(map '(simple-array (unsigned-byte 16) (*)) #'rune-upcase rod))
-(defsubst white-space-rune-p (char)
+(definline white-space-rune-p (char)
(or (= char 9) ;TAB
(= char 10) ;Linefeed
(= char 13) ;Carriage Return
(= char 32))) ;Space
-(defsubst digit-rune-p (char &optional (radix 10))
+(definline digit-rune-p (char &optional (radix 10))
(cond ((<= #.(char-code #\0) char #.(char-code #\9))
(and (< (- char #.(char-code #\0)) radix)
(- char #.(char-code #\0))))
@@ -141,18 +141,23 @@
(unless (rune-equal (rune x i) (rune y i))
(return nil)))))
-(defsubst make-rod (size)
+(definline make-rod (size)
(make-array size :element-type 'rune))
(defun char-rune (char)
(code-rune (char-code char)))
-(defun rune-char (rune &optional (default #\?))
- (if (>= rune char-code-limit)
- default
- (or (code-char rune) default)))
+(defparameter *invalid-rune* nil ;;#\?
+ "Rune to use as a replacement in RUNE-CHAR and ROD-STRING for runes not
+ representable as characters. If NIL, an error is signalled instead.")
-(defun rod-string (rod &optional (default-char #\?))
+(defun rune-char (rune &optional (default *invalid-rune*))
+ (or (if (>= rune char-code-limit)
+ default
+ (or (code-char rune) default))
+ (error "rune cannot be represented as a character: ~A" rune)))
+
+(defun rod-string (rod &optional (default-char *invalid-rune*))
(map 'string (lambda (x) (rune-char x default-char)) rod))
(defun string-rod (string)
Modified: branches/grin-neu/thirdparty/cxml/runes/syntax.lisp
===================================================================
--- branches/grin-neu/thirdparty/cxml/runes/syntax.lisp 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/cxml/runes/syntax.lisp 2006-12-01 10:39:49 UTC (rev 2094)
@@ -3,7 +3,7 @@
;;; Title: Unicode strings (called RODs)
;;; Created: 1999-05-25 22:29
;;; Author: Gilbert Baumann <unk6(a)rz.uni-karlsruhe.de>
-;;; License: LLGPL (See file COPYING for details).
+;;; License: Lisp-LGPL (See file COPYING for details).
;;; ---------------------------------------------------------------------------
;;; (c) copyright 1998,1999 by Gilbert Baumann
Added: branches/grin-neu/thirdparty/cxml/runes/utf8.lisp
===================================================================
--- branches/grin-neu/thirdparty/cxml/runes/utf8.lisp 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/cxml/runes/utf8.lisp 2006-12-01 10:39:49 UTC (rev 2094)
@@ -0,0 +1,36 @@
+;;; copyright (c) 2005 David Lichteblau <david(a)lichteblau.com>
+;;; License: Lisp-LGPL (See file COPYING for details).
+;;;
+;;; Rune emulation for the UTF-8-compatible DOM implementation.
+;;; Used only with 8 bit characters on non-unicode Lisps.
+
+(in-package :utf8-runes)
+
+(deftype rune () 'character)
+(deftype rod () '(vector rune))
+(deftype simple-rod () '(simple-array rune))
+
+(defun rod= (r s)
+ (string= r s))
+
+(defun rod-string (rod &optional default)
+ (declare (ignore default))
+ rod)
+
+(defun string-rod (string)
+ string)
+
+(defun make-rod (size)
+ (make-string size :element-type 'rune))
+
+(defun rune-reader (stream subchar arg)
+ (runes::rune-char (runes::rune-reader stream subchar arg)))
+
+(defun rod-reader (stream subchar arg)
+ (runes::rod-string (runes::rod-reader stream subchar arg)))
+
+(setf cxml-system::*utf8-runes-readtable*
+ (let ((rt (copy-readtable)))
+ (set-dispatch-macro-character #\# #\/ 'rune-reader rt)
+ (set-dispatch-macro-character #\# #\" 'rod-reader rt)
+ rt))
Modified: branches/grin-neu/thirdparty/cxml/runes/xstream.lisp
===================================================================
--- branches/grin-neu/thirdparty/cxml/runes/xstream.lisp 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/cxml/runes/xstream.lisp 2006-12-01 10:39:49 UTC (rev 2094)
@@ -1,11 +1,11 @@
-;;; -*- Mode: Lisp; Syntax: Common-Lisp; Package: runes; readtable: runes; Encoding: utf-8; -*-
+;;; -*- Mode: Lisp; Syntax: Common-Lisp; readtable: runes; Encoding: utf-8; -*-
;;; ---------------------------------------------------------------------------
;;; Title: Fast streams
;;; Created: 1999-07-17
;;; Author: Gilbert Baumann <unk6(a)rz.uni-karlsruhe.de>
-;;; License: LGPL (See file COPYING for details).
+;;; License: Lisp-LGPL (See file COPYING for details).
;;; ---------------------------------------------------------------------------
-;;; copyright 1999 by Gilbert Baumann
+;;; (c) copyright 1999 by Gilbert Baumann
;;; This library is free software; you can redistribute it and/or
;;; modify it under the terms of the GNU Library General Public
@@ -66,9 +66,7 @@
;;
(eval-when (:compile-toplevel :load-toplevel :execute)
- (defparameter *fast* '(optimize (speed 3) (safety 0)))
- ;;(defparameter *fast* '(optimize (speed 2) (safety 3)))
- )
+ (defparameter *fast* '(optimize (speed 3) (safety 0))))
;; Let us first define fast fixnum arithmetric get rid of type
;; checks. (After all we know what we do here).
@@ -217,7 +215,7 @@
nil)
,input))
-(defsubst unread-rune (rune input)
+(definline unread-rune (rune input)
"Unread the last recently read rune; if there wasn't such a rune, you
deserve to lose."
(declare (ignore rune))
@@ -258,9 +256,7 @@
;;; Underflow
-;;(defun read-runes (sequence input))
-
-(defun xstream-underflow (input)
+(defmethod xstream-underflow ((input xstream))
(declare (type xstream input))
;; we are about to fill new data into the buffer, so we need to
;; adjust buffer-start.
@@ -277,10 +273,14 @@
:end2 (xstream-os-left-end input))
;; then we take care that the buffer is large enough to carry at
;; least 100 bytes (a random number)
+ ;;
+ ;; david: was heisst da random? ich nehme an, dass 100 einfach
+ ;; ausreichend sein soll, um die laengste utf-8 bytesequenz oder die
+ ;; beiden utf-16 surrogates zu halten? dann ist 100 ja wohl dicke
+ ;; ausreichend und koennte in make-xstream ordentlich geprueft werden.
+ ;; oder was geht hier vor?
(unless (>= (length (xstream-os-buffer input)) 100)
- (error "You lost")
- ;; todo: enlarge buffer
- ))
+ (error "You lost")))
(setf n
(read-octets (xstream-os-buffer input) (xstream-os-stream input)
m (min (1- (length (xstream-os-buffer input)))
@@ -292,7 +292,7 @@
:eof)
(t
(multiple-value-bind (fnw fnr)
- (encoding:decode-sequence
+ (runes-encoding:decode-sequence
(xstream-encoding input)
(xstream-os-buffer input) 0 n
(xstream-buffer input) 0 (1- (length (xstream-buffer input)))
Added: branches/grin-neu/thirdparty/cxml/runes/ystream.lisp
===================================================================
--- branches/grin-neu/thirdparty/cxml/runes/ystream.lisp 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/cxml/runes/ystream.lisp 2006-12-01 10:39:49 UTC (rev 2094)
@@ -0,0 +1,250 @@
+;;; (c) 2005 David Lichteblau <david(a)lichteblau.com>
+;;; License: Lisp-LGPL (See file COPYING for details).
+;;;
+;;; ystream (for lack of a better name): a rune output "stream"
+
+(in-package :runes)
+
+(defconstant +ystream-bufsize+ 1024)
+
+(defun make-ub8-array (n)
+ (make-array n :element-type '(unsigned-byte 8)))
+
+(defun make-ub16-array (n)
+ (make-array n :element-type '(unsigned-byte 16)))
+
+(defun make-buffer (&key (element-type '(unsigned-byte 8)))
+ (make-array 1
+ :element-type element-type
+ :adjustable t
+ :fill-pointer 0))
+
+(defmacro while (test &body body)
+ `(until (not ,test) ,@body))
+
+(defmacro until (test &body body)
+ `(do () (,test) ,@body))
+
+;;; ystream
+;;; +- utf8-ystream
+;;; | +- octet-vector-ystream
+;;; | \- %stream-ystream
+;;; | +- octet-stream-ystream
+;;; | \- character-stream-ystream/utf8
+;;; | \- string-ystream/utf8
+;;; +- rod-ystream
+;;; \-- character-stream-ystream
+
+(defstruct ystream
+ (column 0 :type integer)
+ (in-ptr 0 :type fixnum)
+ (in-buffer (make-rod +ystream-bufsize+) :type simple-rod))
+
+(defstruct (utf8-ystream
+ (:include ystream)
+ (:conc-name "YSTREAM-"))
+ (out-buffer (make-ub8-array (* 6 +ystream-bufsize+))
+ :type (simple-array (unsigned-byte 8) (*))))
+
+(defstruct (%stream-ystream (:include utf8-ystream) (:conc-name "YSTREAM-"))
+ (os-stream nil))
+
+(definline write-rune (rune ystream)
+ (let ((in (ystream-in-buffer ystream)))
+ (when (eql (ystream-in-ptr ystream) (length in))
+ (flush-ystream ystream)
+ (setf in (ystream-in-buffer ystream)))
+ (setf (elt in (ystream-in-ptr ystream)) rune)
+ (incf (ystream-in-ptr ystream))
+ (setf (ystream-column ystream)
+ (if (eql rune #/U+0010) 0 (1+ (ystream-column ystream))))
+ rune))
+
+(defmethod close-ystream :before ((ystream ystream))
+ (flush-ystream ystream))
+
+
+;;;; UTF8-YSTREAM (abstract)
+
+(defmethod close-ystream ((ystream %stream-ystream))
+ (ystream-os-stream ystream))
+
+(defgeneric ystream-device-write (ystream buf nbytes))
+
+(defmethod flush-ystream ((ystream utf8-ystream))
+ (let ((ptr (ystream-in-ptr ystream)))
+ (when (plusp ptr)
+ (let* ((in (ystream-in-buffer ystream))
+ (out (ystream-out-buffer ystream))
+ (surrogatep (<= #xD800 (rune-code (elt in (1- ptr))) #xDBFF))
+ n)
+ (when surrogatep
+ (decf ptr))
+ (when (plusp ptr)
+ (setf n (runes-to-utf8 out in ptr))
+ (ystream-device-write ystream out n)
+ (cond
+ (surrogatep
+ (setf (elt in 0) (elt in (1- ptr)))
+ (setf (ystream-in-ptr ystream) 1))
+ (t
+ (setf (ystream-in-ptr ystream) 0))))))))
+
+(defun write-rod (rod sink)
+ (loop for rune across rod do (write-rune rune sink)))
+
+(defun fast-push (new-element vector)
+ (vector-push-extend new-element vector (max 1 (array-dimension vector 0))))
+
+(macrolet ((define-utf8-writer (name (byte &rest aux) result &body body)
+ `(defun ,name (out in n)
+ (let ((high-surrogate nil)
+ ,@aux)
+ (labels
+ ((write0 (,byte)
+ ,@body)
+ (write1 (r)
+ (cond
+ ((<= #x00000000 r #x0000007F)
+ (write0 r))
+ ((<= #x00000080 r #x000007FF)
+ (write0 (logior #b11000000 (ldb (byte 5 6) r)))
+ (write0 (logior #b10000000 (ldb (byte 6 0) r))))
+ ((<= #x00000800 r #x0000FFFF)
+ (write0 (logior #b11100000 (ldb (byte 4 12) r)))
+ (write0 (logior #b10000000 (ldb (byte 6 6) r)))
+ (write0 (logior #b10000000 (ldb (byte 6 0) r))))
+ ((<= #x00010000 r #x001FFFFF)
+ (write0 (logior #b11110000 (ldb (byte 3 18) r)))
+ (write0 (logior #b10000000 (ldb (byte 6 12) r)))
+ (write0 (logior #b10000000 (ldb (byte 6 6) r)))
+ (write0 (logior #b10000000 (ldb (byte 6 0) r))))
+ ((<= #x00200000 r #x03FFFFFF)
+ (write0 (logior #b11111000 (ldb (byte 2 24) r)))
+ (write0 (logior #b10000000 (ldb (byte 6 18) r)))
+ (write0 (logior #b10000000 (ldb (byte 6 12) r)))
+ (write0 (logior #b10000000 (ldb (byte 6 6) r)))
+ (write0 (logior #b10000000 (ldb (byte 6 0) r))))
+ ((<= #x04000000 r #x7FFFFFFF)
+ (write0 (logior #b11111100 (ldb (byte 1 30) r)))
+ (write0 (logior #b10000000 (ldb (byte 6 24) r)))
+ (write0 (logior #b10000000 (ldb (byte 6 18) r)))
+ (write0 (logior #b10000000 (ldb (byte 6 12) r)))
+ (write0 (logior #b10000000 (ldb (byte 6 6) r)))
+ (write0 (logior #b10000000 (ldb (byte 6 0) r))))))
+ (write2 (r)
+ (cond
+ ((<= #xD800 r #xDBFF)
+ (setf high-surrogate r))
+ ((<= #xDC00 r #xDFFF)
+ (let ((q (logior (ash (- high-surrogate #xD7C0) 10)
+ (- r #xDC00))))
+ (write1 q))
+ (setf high-surrogate nil))
+ (t
+ (write1 r)))))
+ (dotimes (j n)
+ (write2 (rune-code (elt in j)))))
+ ,result))))
+ (define-utf8-writer runes-to-utf8 (x (i 0))
+ i
+ (setf (elt out i) x)
+ (incf i))
+ (define-utf8-writer runes-to-utf8/adjustable-string (x)
+ nil
+ (fast-push (code-char x) out)))
+
+
+;;;; ROD-YSTREAM
+
+(defstruct (rod-ystream (:include ystream)))
+
+(defmethod flush-ystream ((ystream rod-ystream))
+ (let* ((old (ystream-in-buffer ystream))
+ (new (make-rod (* 2 (length old)))))
+ (replace new old)
+ (setf (ystream-in-buffer ystream) new)))
+
+(defmethod close-ystream ((ystream rod-ystream))
+ (subseq (ystream-in-buffer ystream) 0 (ystream-in-ptr ystream)))
+
+
+;;;; CHARACTER-STREAM-YSTREAM
+
+#+rune-is-character
+(progn
+ (defstruct (character-stream-ystream
+ (:constructor make-character-stream-ystream (target-stream))
+ (:include ystream)
+ (:conc-name "YSTREAM-"))
+ (target-stream nil))
+
+ (defmethod flush-ystream ((ystream character-stream-ystream))
+ (write-string (ystream-in-buffer ystream)
+ (ystream-target-stream ystream)
+ :end (ystream-in-ptr ystream))
+ (setf (ystream-in-ptr ystream) 0))
+
+ (defmethod close-ystream ((ystream character-stream-ystream))
+ (ystream-target-stream ystream)))
+
+
+;;;; OCTET-VECTOR-YSTREAM
+
+(defstruct (octet-vector-ystream
+ (:include utf8-ystream)
+ (:conc-name "YSTREAM-"))
+ (result (make-buffer)))
+
+(defmethod ystream-device-write ((ystream octet-vector-ystream) buf nbytes)
+ (let* ((result (ystream-result ystream))
+ (start (length result))
+ (size (array-dimension result 0)))
+ (while (> (+ start nbytes) size)
+ (setf size (* 2 size)))
+ (adjust-array result size :fill-pointer (+ start nbytes))
+ (replace result buf :start1 start :end2 nbytes)))
+
+(defmethod close-ystream ((ystream octet-vector-ystream))
+ (ystream-result ystream))
+
+
+;;;; OCTET-STREAM-YSTREAM
+
+(defstruct (octet-stream-ystream
+ (:include %stream-ystream)
+ (:constructor make-octet-stream-ystream (os-stream))
+ (:conc-name "YSTREAM-")))
+
+(defmethod ystream-device-write ((ystream octet-stream-ystream) buf nbytes)
+ (write-sequence buf (ystream-os-stream ystream) :end nbytes))
+
+
+;;;; CHARACTER-STREAM-YSTREAM/UTF8
+
+#+rune-is-integer
+(progn
+ (defstruct (character-stream-ystream/utf8
+ (:constructor make-character-stream-ystream/utf8 (os-stream))
+ (:include %stream-ystream)
+ (:conc-name "YSTREAM-")))
+
+ (defmethod ystream-device-write
+ ((ystream character-stream-ystream/utf8) buf nbytes)
+ (declare (type (simple-array (unsigned-byte 8) (*)) buf))
+ (let ((out (ystream-os-stream ystream)))
+ (dotimes (x nbytes)
+ (write-char (code-char (elt buf x)) out)))))
+
+
+;;;; STRING-YSTREAM/UTF8
+
+#+rune-is-integer
+(progn
+ (defstruct (string-ystream/utf8
+ (:include character-stream-ystream/utf8
+ (os-stream (make-string-output-stream)))
+ (:conc-name "YSTREAM-")))
+
+ (defmethod close-ystream ((ystream string-ystream/utf8))
+ (get-output-stream-string (ystream-os-stream ystream))))
Modified: branches/grin-neu/thirdparty/cxml/test/domtest.lisp
===================================================================
--- branches/grin-neu/thirdparty/cxml/test/domtest.lisp 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/cxml/test/domtest.lisp 2006-12-01 10:39:49 UTC (rev 2094)
@@ -126,28 +126,32 @@
(map-child-elements 'list #'identity element))
(defun parse-java-literal (str)
- (unless (stringp str)
- (setf str (runes:rod-string str)))
+ (when (stringp str)
+ (setf str (runes:string-rod str)))
(cond
((zerop (length str)) nil)
- ((equal str "true")
+ ((runes:rod= str #"true")
t)
- ((equal str "false")
+ ((runes:rod= str #"false")
nil)
- ((digit-char-p (char str 0))
- (parse-integer str))
- ((char= (char str 0) #\")
- (runes:rod
- (with-output-to-string (out)
- (with-input-from-string (in str)
- (read-char in)
- (for ((c = (read-char in))
- :until (char= c #\"))
- (if (char= c #\\)
- (ecase (read-char in)
- ;; ...
- (#\n (write-char #\newline out)))
- (write-char c out)))))))
+ ((digit-char-p (runes:rune-char (elt str 0)))
+ (parse-integer (runes:rod-string str)))
+ ((runes:rune= (elt str 0) #.(runes:char-rune #\"))
+ (let ((v (make-array 1 :fill-pointer 0 :adjustable t)))
+ (for* ((i = 1 :then (1+ i))
+ (c = (elt str i))
+ :until (runes:rune= c #.(runes:char-rune #\")))
+ (if (runes:rune= c #.(runes:char-rune #\\))
+ (let ((frob
+ (progn
+ (incf i)
+ (elt str i))))
+ (ecase frob
+ ;; ...
+ (#/n (vector-push-extend #/newline v (length v)))
+ ((#/\\ #/\") (vector-push-extend #/\\ v (length v)))))
+ (vector-push-extend c v (length v))))
+ (make-array (length v) :element-type 'runes:rune :initial-contents v)))
(t
(%intern str))))
@@ -162,15 +166,17 @@
;;;; dom1-interfaces.xml auslesen
-(defvar *methods* '())
-(defvar *fields* '())
+(defparameter *methods* '())
+(defparameter *fields* '())
(declaim (special *directory*))
+(declaim (special *files-directory*))
-(defun read-members ()
- (let* ((pathname (merge-pathnames "patches/dom1-interfaces.xml" *directory*))
- (builder (dom:make-dom-builder))
- (library (dom:document-element (cxml:parse-file pathname builder)))
+(defun read-members (&optional (directory *directory*))
+ (let* ((pathname (merge-pathnames "build/dom2-interfaces.xml" directory))
+ (builder (rune-dom:make-dom-builder))
+ (library (dom:document-element
+ (cxml:parse-file pathname builder :recode nil)))
(methods '())
(fields '()))
(do-child-elements (interface library :name "interface")
@@ -192,20 +198,21 @@
(defun translate-condition (element)
(string-case (tag-name element)
("equals" (translate-equals element))
+ ("notEquals" (translate-not-equals element))
("contentType" (translate-content-type element))
- ("hasFeature" (translate-has-feature element))
("implementationAttribute" (assert-have-implementation-attribute element))
("isNull" (translate-is-null element))
("not" (translate-is-null element))
("notNull" (translate-not-null element))
("or" (translate-or element))
("same" (translate-same element))
+ ("less" (translate-less element))
(t (error "unknown condition: ~A" element))))
(defun equalsp (a b test)
- (when (typep a 'dom-impl::named-node-map)
+ (when (dom:named-node-map-p a)
(setf a (dom:items a)))
- (when (typep b 'dom-impl::named-node-map)
+ (when (dom:named-node-map-p b)
(setf b (dom:items b)))
(if (and (typep a 'sequence) (typep b 'sequence))
(null (set-exclusive-or (coerce a 'list) (coerce b 'list) :test test))
@@ -223,10 +230,17 @@
,(parse-java-literal |expected|)
',(if (parse-java-literal |ignoreCase|) '%equal '%equal))))
+(defun translate-not-equals (element)
+ `(not ,(translate-equals element)))
+
(defun translate-same (element)
(with-attributes (|actual| |expected|) element
`(eql ,(%intern |actual|) ,(parse-java-literal |expected|))))
+(defun translate-less (element)
+ (with-attributes (|actual| |expected|) element
+ `(< ,(%intern |actual|) ,(parse-java-literal |expected|))))
+
(defun translate-or (element)
`(or ,@(map-child-elements 'list #'translate-condition element)))
@@ -317,10 +331,12 @@
("assertTrue" (translate-assert-true element))
("assertFalse" (translate-assert-false element))
("assertURIEquals" (translate-assert-uri-equals element))
+ ("assign" (translate-assign element))
("for-each" (translate-for-each element))
("fail" (translate-fail element))
("hasFeature" (translate-has-feature element))
("if" (translate-if element))
+ ("implementation" (translate-implementation element))
("increment" (translate-unary-assignment '+ element))
("decrement" (translate-unary-assignment '- element))
("length" (translate-length element))
@@ -337,6 +353,10 @@
`(,fn ,(parse-java-literal |op1|)
,(parse-java-literal |op2|)))))
+(defun translate-assign (element)
+ (with-attributes (|var| |value|) element
+ (maybe-setf (%intern |var|) (parse-java-literal |value|))))
+
(defun translate-unary-assignment (fn element)
(with-attributes (|var| |value|) element
(maybe-setf (%intern |var|)
@@ -347,6 +367,10 @@
(maybe-setf (%intern |var|)
`(load-file ,|href| ,(parse-java-literal |willBeModified|)))))
+(defun translate-implementation (elt)
+ (with-attributes (|var|) elt
+ (maybe-setf (%intern |var|) `'rune-dom:implementation)))
+
(defun translate-length (load)
;; XXX Soweit ich sehe unterscheiden die Tests nicht zwischen
;; der Laenge von DOMString und der length()-Methode der uebrigen
@@ -379,11 +403,13 @@
(error "oops")))))
(defun translate-has-feature (element)
- (with-attributes (|var| |feature| |version|) element
- (maybe-setf (%intern |var|)
- `(and (runes:rod-equal ,(parse-java-literal |feature|) #"XML")
- (or (zerop (length ,(parse-java-literal |version|)))
- (runes:rod-equal ,(parse-java-literal |version|) #"1.0"))))))
+ (with-attributes (|obj| |var| |feature| |version|) element
+ (if (nullify |obj|)
+ (translate-member element)
+ (maybe-setf (%intern |var|)
+ `(dom:has-feature 'rune-dom:implementation
+ ,(parse-java-literal |feature|)
+ ,(parse-java-literal |version|))))))
(defun translate-fail (element)
(declare (ignore element))
@@ -433,7 +459,7 @@
(defun translate-assert-size (element)
(with-attributes (|collection| |size|) element
`(let ((collection ,(%intern |collection|)))
- (when (typep collection 'dom-impl::named-node-map)
+ (when (dom:named-node-map-p collection)
(setf collection (dom:items collection)))
(assert (eql (length collection) ,(parse-java-literal |size|))))))
@@ -468,9 +494,9 @@
(return
`(block assert-domexception
(handler-bind
- ((dom-impl::dom-exception
+ ((rune-dom::dom-exception
(lambda (c)
- (when (eq (dom-impl::dom-exception-key c)
+ (when (eq (rune-dom::dom-exception-key c)
,(intern (tag-name c) :keyword))
(return-from assert-domexception)))))
,@(translate-body c)
@@ -481,7 +507,7 @@
,@(map-child-elements
'list
(lambda (exception)
- `(when (eq (dom-impl::dom-exception-key c)
+ `(when (eq (rune-dom::dom-exception-key c)
,(intern (runes:rod-string (dom:get-attribute exception "code"))
:keyword))
,@(translate-body exception)
@@ -491,7 +517,7 @@
(defun translate-try (element)
`(block try
(handler-bind
- ((dom-impl::dom-exception
+ ((rune-dom::dom-exception
,(translate-catch
(do-child-elements (c element :name "catch") (return c))
'(return-from try))))
@@ -531,7 +557,7 @@
(defun translate-for-each (element)
(with-attributes (|collection| |member|) element
`(let ((collection ,(%intern |collection|)))
- (when (typep collection 'dom-impl::named-node-map)
+ (when (dom:named-node-map-p collection)
(setf collection (dom:items collection)))
(map nil (lambda (,(%intern |member|)) ,@(translate-body element))
collection))))
@@ -539,8 +565,15 @@
(defun assert-have-implementation-attribute (element)
(let ((attribute (runes:rod-string (dom:get-attribute element "name"))))
(string-case attribute
+ ;; fixme: expandEntityReferences sollten wir auch mal anschalten, wo
+ ;; wir uns schon die muehe machen...
("validating"
(setf cxml::*validate* t))
+ ("namespaceAware"
+ ;; ??? dom 2 ohne namespace-support gibt's doch gar nicht,
+ ;; ausser vielleicht in html-only implementationen, und dann sollen
+ ;; sie halt auf hasFeature "XML" testen.
+ )
(t
(format t "~&implementationAttribute ~A not supported, skipping test~%"
attribute)
@@ -550,9 +583,10 @@
(unless *fields*
(multiple-value-setq (*methods* *fields*) (read-members)))
(catch 'give-up
- (let* ((builder (dom:make-dom-builder))
+ (let* ((builder (rune-dom:make-dom-builder))
(cxml::*validate* nil) ;dom1.dtd is buggy
- (test (dom:document-element (cxml:parse-file pathname builder)))
+ (test (dom:document-element
+ (cxml:parse-file pathname builder :recode nil)))
title
(bindings '())
(code '()))
@@ -569,6 +603,11 @@
(("byte" "short" "int" "long") 0)
(t nil)))
bindings)
+ (let ((value (dom:get-attribute e "value")))
+ (when value
+ (push `(setf ,(%intern (dom:get-attribute e "name"))
+ ,(parse-java-literal value))
+ code)))
(do-child-elements (member e :name "member") e
(push `(setf ,(%intern (dom:get-attribute e "name"))
(append ,(%intern (dom:get-attribute e "name"))
@@ -584,66 +623,104 @@
(t
(push (translate-statement e) code))))
`(lambda ()
- (let (,@bindings)
+ (let ((*files-directory* ,*files-directory*) ;fuer copy&paste:
+ ,@bindings)
(declare (ignorable ,@(mapcar #'car bindings)))
,@(reverse code))))))
(defun load-file (name &optional will-be-modified-p)
(declare (ignore will-be-modified-p))
(setf name (runes:rod-string name))
- (let* ((directory (merge-pathnames "tests/level1/core/files/" *directory*))
- (document
- (cxml:parse-file
- (make-pathname :name name :type "xml" :defaults directory)
- (dom:make-dom-builder))))
- document))
+ (cxml:parse-file
+ (make-pathname :name name :type "xml" :defaults *files-directory*)
+ (rune-dom:make-dom-builder)
+ :recode nil))
(defparameter *bad-tests*
- '("hc_elementnormalize2.xml" "hc_nodereplacechildnewchildexists.xml"))
+ '("hc_elementnormalize2.xml"
+ "hc_nodereplacechildnewchildexists.xml"
+ "characterdatadeletedatanomodificationallowederr.xml"))
+(defun dribble-tests (directory)
+ (let ((base (slot-value (asdf:find-system :cxml) 'asdf::relative-pathname)))
+ (with-open-file (*standard-output*
+ (merge-pathnames "DOMTEST" base)
+ :direction :output
+ :if-exists :supersede)
+ (run-all-tests directory))))
+
(defun run-all-tests (*directory* &optional verbose)
(let* ((cxml::*redefinition-warning* nil)
- (test-directory (merge-pathnames "tests/level1/core/" *directory*))
- (all-tests (merge-pathnames "alltests.xml" test-directory))
- (builder (dom:make-dom-builder))
- (suite (dom:document-element (cxml:parse-file all-tests builder)))
(n 0)
(i 0)
(ntried 0)
(nfailed 0))
- (do-child-elements (member suite)
- (unless
- (member (runes:rod-string (dom:get-attribute member "href"))
- *bad-tests*
- :test 'equal)
- (incf n)))
- (do-child-elements (member suite)
- (let ((href (runes:rod-string (dom:get-attribute member "href"))))
- (unless (member href *bad-tests* :test 'equal)
- (format t "~&~D/~D ~A~%" i n href)
- (let ((lisp (slurp-test (merge-pathnames href test-directory))))
- (when verbose
- (print lisp))
- (when lisp
- (incf ntried)
- (with-simple-restart (skip-test "Skip this test")
- (handler-case
- (let ((cxml::*validate* nil))
- (funcall (compile nil lisp)))
- (serious-condition (c)
- (incf nfailed)
- (warn "test failed: ~A" c))))))
- (incf i))))
+ (flet ((parse (test-directory)
+ (let* ((all-tests (merge-pathnames "alltests.xml" test-directory))
+ (builder (rune-dom:make-dom-builder))
+ (suite (dom:document-element
+ (cxml:parse-file all-tests builder :recode nil)))
+ (*files-directory*
+ (merge-pathnames "files/" test-directory)))
+ (do-child-elements (member suite)
+ (unless
+ (or (equal (dom:tag-name member) "metadata")
+ (member (runes:rod-string
+ (dom:get-attribute member "href"))
+ *bad-tests*
+ :test 'equal))
+ (incf n)))
+ suite))
+ (run (test-directory suite)
+ (print test-directory)
+ (let ((*files-directory*
+ (merge-pathnames "files/" test-directory)))
+ (do-child-elements (member suite)
+ (let ((href (runes:rod-string
+ (dom:get-attribute member "href"))))
+ (unless (or (runes:rod= (dom:tag-name member) #"metadata")
+ (member href *bad-tests* :test 'equal))
+ (format t "~&~D/~D ~A~%" i n href)
+ (let ((lisp (slurp-test
+ (merge-pathnames href test-directory))))
+ (when verbose
+ (print lisp))
+ (when lisp
+ (incf ntried)
+ (with-simple-restart (skip-test "Skip this test")
+ (handler-case
+ (let ((cxml::*validate* nil))
+ (funcall (compile nil lisp)))
+ (serious-condition (c)
+ (incf nfailed)
+ (format t "~&TEST FAILED: ~A~&" c))))))
+ (incf i)))))))
+ (let* ((d1 (merge-pathnames "tests/level1/core/" *directory*))
+ (d2 (merge-pathnames "tests/level2/core/" *directory*))
+ (suite1 (parse d1))
+ (suite2 (parse d2)))
+ (run d1 suite1)
+ (run d2 suite2)))
(format t "~&~D/~D tests failed; ~D test~:P were skipped"
nfailed ntried (- n ntried))))
-(defun run-test (*directory* href)
- (let* ((test-directory (merge-pathnames "tests/level1/core/" *directory*))
- (lisp (slurp-test (merge-pathnames href test-directory)))
+(defun run-test (*directory* level href)
+ (let* ((test-directory
+ (ecase level
+ (1 (merge-pathnames "tests/level1/core/" *directory*))
+ (2 (merge-pathnames "tests/level2/core/" *directory*))))
+ (*files-directory* (merge-pathnames "files/" test-directory))
+ (lisp (slurp-test (merge-pathnames href test-directory)))
(cxml::*validate* nil))
(print lisp)
+ (fresh-line)
(when lisp
(funcall (compile nil lisp)))))
#+(or)
-(run-all-tests "~/src/2001/DOM-Test-Suite/")
+(domtest::run-all-tests "/home/david/2001/DOM-Test-Suite/")
+
+#+(or)
+(domtest::run-test "/home/david/2001/DOM-Test-Suite/"
+ 1
+ "attrcreatedocumentfragment.xml")
Added: branches/grin-neu/thirdparty/cxml/test/utf8domtest.diff
===================================================================
--- branches/grin-neu/thirdparty/cxml/test/utf8domtest.diff 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/cxml/test/utf8domtest.diff 2006-12-01 10:39:49 UTC (rev 2094)
@@ -0,0 +1,102 @@
+Index: test/domtest.lisp
+===================================================================
+RCS file: /project/cxml/cvsroot/cxml/test/domtest.lisp,v
+retrieving revision 1.13
+diff -u -r1.13 domtest.lisp
+--- test/domtest.lisp 27 Dec 2005 00:21:37 -0000 1.13
++++ test/domtest.lisp 27 Dec 2005 00:46:00 -0000
+@@ -137,21 +137,22 @@
+ ((digit-char-p (runes:rune-char (elt str 0)))
+ (parse-integer (runes:rod-string str)))
+ ((runes:rune= (elt str 0) #.(runes:char-rune #\"))
+- (let ((v (make-array 1 :fill-pointer 0 :adjustable t)))
+- (for* ((i = 1 :then (1+ i))
+- (c = (elt str i))
+- :until (runes:rune= c #.(runes:char-rune #\")))
+- (if (runes:rune= c #.(runes:char-rune #\\))
+- (let ((frob
+- (progn
+- (incf i)
+- (elt str i))))
+- (ecase frob
+- ;; ...
+- (#/n (vector-push-extend #/newline v (length v)))
+- ((#/\\ #/\") (vector-push-extend #/\\ v (length v)))))
+- (vector-push-extend c v (length v))))
+- (coerce v 'runes::simple-rod)))
++ (utf8-dom::%rod
++ (let ((v (make-array 1 :fill-pointer 0 :adjustable t)))
++ (for* ((i = 1 :then (1+ i))
++ (c = (elt str i))
++ :until (runes:rune= c #.(runes:char-rune #\")))
++ (if (runes:rune= c #.(runes:char-rune #\\))
++ (let ((frob
++ (progn
++ (incf i)
++ (elt str i))))
++ (ecase frob
++ ;; ...
++ (#/n (vector-push-extend #/newline v (length v)))
++ ((#/\\ #/\") (vector-push-extend #/\\ v (length v)))))
++ (vector-push-extend c v (length v))))
++ (coerce v 'runes::simple-rod))))
+ (t
+ (%intern str))))
+
+@@ -368,7 +369,7 @@
+
+ (defun translate-implementation (elt)
+ (with-attributes (|var|) elt
+- (maybe-setf (%intern |var|) `'rune-dom:implementation)))
++ (maybe-setf (%intern |var|) `'utf8-dom:implementation)))
+
+ (defun translate-length (load)
+ ;; XXX Soweit ich sehe unterscheiden die Tests nicht zwischen
+@@ -406,7 +407,7 @@
+ (if (nullify |obj|)
+ (translate-member element)
+ (maybe-setf (%intern |var|)
+- `(dom:has-feature 'rune-dom:implementation
++ `(dom:has-feature 'utf8-dom:implementation
+ ,(parse-java-literal |feature|)
+ ,(parse-java-literal |version|))))))
+
+@@ -493,9 +494,9 @@
+ (return
+ `(block assert-domexception
+ (handler-bind
+- ((rune-dom::dom-exception
++ ((utf8-dom::dom-exception
+ (lambda (c)
+- (when (eq (rune-dom::dom-exception-key c)
++ (when (eq (utf8-dom::dom-exception-key c)
+ ,(intern (tag-name c) :keyword))
+ (return-from assert-domexception)))))
+ ,@(translate-body c)
+@@ -506,7 +507,7 @@
+ ,@(map-child-elements
+ 'list
+ (lambda (exception)
+- `(when (eq (rune-dom::dom-exception-key c)
++ `(when (eq (utf8-dom::dom-exception-key c)
+ ,(intern (runes:rod-string (dom:get-attribute exception "code"))
+ :keyword))
+ ,@(translate-body exception)
+@@ -516,7 +517,7 @@
+ (defun translate-try (element)
+ `(block try
+ (handler-bind
+- ((rune-dom::dom-exception
++ ((utf8-dom::dom-exception
+ ,(translate-catch
+ (do-child-elements (c element :name "catch") (return c))
+ '(return-from try))))
+@@ -631,7 +632,7 @@
+ (setf name (runes:rod-string name))
+ (cxml:parse-file
+ (make-pathname :name name :type "xml" :defaults *files-directory*)
+- (rune-dom:make-dom-builder)))
++ (cxml:make-recoder (utf8-dom:make-dom-builder) 'cxml:rod-to-utf8-string)))
+
+ (defparameter *bad-tests*
+ '("hc_elementnormalize2.xml"
Modified: branches/grin-neu/thirdparty/cxml/test/xmlconf.lisp
===================================================================
--- branches/grin-neu/thirdparty/cxml/test/xmlconf.lisp 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/cxml/test/xmlconf.lisp 2006-12-01 10:39:49 UTC (rev 2094)
@@ -18,7 +18,8 @@
((not (and (let ((version (get-attribute test "RECOMMENDATION")))
(cond
((or (equal version "") ;XXX
- (equal version "XML1.0"))
+ (equal version "XML1.0")
+ (equal version "NS1.0"))
(cond
((equal (get-attribute test "NAMESPACE") "no")
(format t "~A: test applies to parsers without namespace support, skipping~%"
@@ -36,6 +37,7 @@
nil)
((equal (get-attribute test "TYPE") "valid") :valid)
((equal (get-attribute test "TYPE") "invalid") :invalid)
+ ((equal (get-attribute test "TYPE") "not-wf") :not-wf)
(t nil)))
(defun test-pathnames (directory test)
@@ -52,9 +54,10 @@
(merge-pathnames output sub-directory)))))
(defun serialize-document (document)
- (map 'vector #'char-code
- (with-output-to-string (s)
- (cxml:unparse-document document s :canonical 2))))
+ (dom:map-document (cxml:make-octet-vector-sink :canonical 2)
+ document
+ :include-doctype :canonical-notations
+ :include-default-values t))
(defun file-contents (pathname)
(with-open-file (s pathname :element-type '(unsigned-byte 8))
@@ -63,10 +66,19 @@
(read-sequence result s )
result)))
+(defun dribble-tests (directory)
+ (let ((base (slot-value (asdf:find-system :cxml) 'asdf::relative-pathname)))
+ (with-open-file (*standard-output*
+ (merge-pathnames "XMLCONF" base)
+ :direction :output
+ :external-format :iso-8859-1
+ :if-exists :supersede)
+ (run-all-tests directory))))
+
(defun run-all-tests (directory)
(let* ((pathname (merge-pathnames "xmlconf.xml" directory))
- (builder (dom:make-dom-builder))
- (xmlconf (cxml:parse-file pathname builder))
+ (builder (rune-dom:make-dom-builder))
+ (xmlconf (cxml:parse-file pathname builder :recode nil))
(ntried 0)
(nfailed 0)
(nskipped 0)
@@ -75,14 +87,21 @@
(puri:*strict-parse* nil))
(dom:do-node-list (test (dom:get-elements-by-tag-name xmlconf "TEST"))
(let ((description
- (rod-string (dom:data (dom:item (dom:child-nodes test) 0))))
+ (apply #'concatenate
+ 'string
+ (map 'list
+ (lambda (child)
+ (if (dom:text-node-p child)
+ (rod-string (dom:data child))
+ ""))
+ (dom:child-nodes test))))
(class (test-class test)))
(cond
(class
(incf ntried)
(multiple-value-bind (pathname output)
(test-pathnames directory test)
- (princ pathname)
+ (princ (enough-namestring pathname directory))
(unless (probe-file pathname)
(error "file not found: ~A" pathname))
(with-simple-restart (skip-test "Skip this test")
@@ -95,7 +114,7 @@
nfailed ntried nskipped)))
(defmethod run-test :around (class pathname output description &rest args)
- class pathname output args
+ (declare (ignore class pathname output args))
(handler-case
(call-next-method)
(serious-condition (c)
@@ -106,7 +125,8 @@
(declare (ignore description))
(let ((document (apply #'cxml:parse-file
pathname
- (dom:make-dom-builder)
+ (rune-dom:make-dom-builder)
+ :recode nil
args)))
(cond
((null output)
@@ -143,17 +163,47 @@
(handler-case
(progn
(format t " [validating:]")
- (cxml:parse-file pathname (dom:make-dom-builder) :validate t)
+ (cxml:parse-file pathname
+ (rune-dom:make-dom-builder)
+ :recode nil
+ :validate t)
(error "validity error not detected")
nil)
(cxml:validity-error ()
(format t " invalid")
t))))
-#+(or)
-(xmlconf::run-all-tests "/mnt/debian/space/xmlconf/")
+(defmethod run-test
+ ((class (eql :not-wf)) pathname output description &rest args)
+ (assert (null args))
+ (handler-case
+ (progn
+ (format t " [not validating:]")
+ (cxml:parse-file pathname
+ (rune-dom:make-dom-builder)
+ :recode nil
+ :validate nil)
+ (error "well-formedness violation not detected")
+ nil)
+ (cxml:well-formedness-violation ()
+ (format t " not-wf")
+ t))
+ (handler-case
+ (progn
+ (format t " [validating:]")
+ (cxml:parse-file pathname
+ (rune-dom:make-dom-builder)
+ :recode nil
+ :validate t)
+ (error "well-formedness violation not detected")
+ nil)
+ (cxml:well-formedness-violation ()
+ (format t " not-wf")
+ t)
+ (cxml:validity-error ()
+ ;; das erlauben wir mal auch, denn valide => wf
+ (format t " invalid")
+ t)))
#+(or)
-(progn
- (#+allegro mp:with-timeout #+allegro (60) #-allegro progn
- ))
+(xmlconf::run-all-tests "/home/david/2001/XML-Test-Suite/xmlconf/")
Modified: branches/grin-neu/thirdparty/cxml/xml/catalog.lisp
===================================================================
--- branches/grin-neu/thirdparty/cxml/xml/catalog.lisp 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/cxml/xml/catalog.lisp 2006-12-01 10:39:49 UTC (rev 2094)
@@ -1,6 +1,6 @@
;;;; catalogs.lisp -- XML Catalogs -*- Mode: Lisp; readtable: runes -*-
;;;;
-;;;; This file is part of the CXML parser, released under (L)LGPL.
+;;;; This file is part of the CXML parser, released under Lisp-LGPL.
;;;; See file COPYING for details.
;;;;
;;;; Developed 2004 for headcraft - http://headcraft.de/
@@ -222,8 +222,8 @@
(defun parse-catalog-file (uri)
(handler-case
(parse-catalog-file/strict uri)
- (file-error () nil)
- (parser-error () nil)))
+ ((or file-error xml-parse-error) (c)
+ (warn "ignoring catalog error: ~A" c))))
(defparameter *catalog-dtd*
(let* ((cxml
@@ -248,9 +248,8 @@
:element-type '(unsigned-byte 8)
:direction :input))
(parse-stream s
- (make-recoder (make-instance 'catalog-parser :uri uri)
- #'rod-to-utf8-string)
- :validate t
+ (make-instance 'catalog-parser :uri uri)
+ :validate nil
:dtd (make-extid nil dtd-sysid)
:root #"catalog"
:entity-resolver #'entity-resolver)))))
@@ -284,7 +283,11 @@
(setf lname (or lname qname))
;; we can dispatch on lnames only because we validate against the DTD,
;; which disallows other namespaces.
- (push (string-or (get-attribute/lname "prefer" attrs) (prefer handler))
+ (push (let ((new (get-attribute/lname "prefer" attrs)))
+ (cond
+ ((equal new "public") :public)
+ ((equal new "system") :system)
+ ((null new) (prefer handler))))
(prefer-stack handler))
(push (string-or (get-attribute/lname "base" attrs) (base handler))
(base-stack handler))
Modified: branches/grin-neu/thirdparty/cxml/xml/package.lisp
===================================================================
--- branches/grin-neu/thirdparty/cxml/xml/package.lisp 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/cxml/xml/package.lisp 2006-12-01 10:39:49 UTC (rev 2094)
@@ -1,20 +1,12 @@
;;;; package.lisp -- Paketdefinition
;;;;
-;;;; This file is part of the CXML parser, released under (L)LGPL.
+;;;; This file is part of the CXML parser, released under Lisp-LGPL.
;;;; See file COPYING for details.
(in-package :cl-user)
(defpackage :cxml
- (:use :cl :runes :encoding)
- (:import-from #+sbcl :sb-gray
- #+allegro :excl
- #+cmu :ext
- #+clisp :gray
- #-(or sbcl allegro cmu clisp) ...
- #:fundamental-binary-input-stream
- #-clisp #:stream-read-sequence
- stream-read-byte)
+ (:use :cl :runes :runes-encoding :trivial-gray-streams)
(:export
;; xstreams
#:make-xstream
@@ -42,25 +34,36 @@
#:parse-file
#:parse-stream
- ;; XXX encoding is mis-handled by parse-string, don't export it
- ;; #:parse-string
+ #:parse-rod
#:parse-octets
+ #:parse-empty-document
- #:make-character-stream-sink
#:make-octet-vector-sink
#:make-octet-stream-sink
- #:unparse-document
- #:unparse-document-to-octets
+ #:make-rod-sink
+ #|
+ #+rune-is-character #:make-string-sink
+ #+rune-is-character #:make-character-stream-sink
+ #-rune-is-character #:make-string-sink/utf8
+ #-rune-is-character #:make-character-stream-sink/utf8
+ |#
+
+ #:make-string-sink
+ #:make-character-stream-sink
+
#:with-xml-output
#:with-element
#:attribute
#:cdata
#:text
+ #:xml-parse-error
+ #:well-formedness-violation
+ #:validity-error
+
#:parse-dtd-file
#:parse-dtd-stream
- #:validity-error
#:make-validator
#:*cache-all-dtds*
@@ -77,4 +80,10 @@
#:resolve-uri
#:resolve-extid
- #:make-recoder))
+ #:make-recoder
+ #:sax-proxy
+ #:proxy-chained-handler
+ #:make-namespace-normalizer
+ #:make-whitespace-normalizer
+ #:rod-to-utf8-string
+ #:utf8-string-to-rod))
Modified: branches/grin-neu/thirdparty/cxml/xml/recoder.lisp
===================================================================
--- branches/grin-neu/thirdparty/cxml/xml/recoder.lisp 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/cxml/xml/recoder.lisp 2006-12-01 10:39:49 UTC (rev 2094)
@@ -1,6 +1,6 @@
;;;; recoder.lisp -- SAX handler for string conversion
;;;;
-;;;; This file is part of the CXML parser, released under (L)LGPL.
+;;;; This file is part of the CXML parser, released under Lisp-LGPL.
;;;; See file COPYING for details.
;;;;
;;;; Developed 2004 for headcraft - http://headcraft.de/
@@ -12,7 +12,7 @@
((recoder :initarg :recoder :accessor recoder)
(chained-handler :initarg :chained-handler :accessor chained-handler)))
-(defun make-recoder (chained-handler &optional (recoder-fn #'rod-string))
+(defun make-recoder (chained-handler recoder-fn)
(make-instance 'recoder
:recoder recoder-fn
:chained-handler chained-handler))
@@ -74,6 +74,9 @@
(%string public-id)
(%string system-id))
+ (defwrapper sax:start-internal-subset ())
+ (defwrapper sax:end-internal-subset ())
+
(defwrapper sax:end-dtd ())
(defwrapper sax:unparsed-entity-declaration
@@ -115,4 +118,8 @@
(defwrapper sax:entity-resolver
(resolver)
- resolver))
+ resolver)
+
+ (defwrapper sax::dtd
+ (dtd)
+ dtd))
Modified: branches/grin-neu/thirdparty/cxml/xml/sax-handler.lisp
===================================================================
--- branches/grin-neu/thirdparty/cxml/xml/sax-handler.lisp 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/cxml/xml/sax-handler.lisp 2006-12-01 10:39:49 UTC (rev 2094)
@@ -6,8 +6,8 @@
;;; Author: David Lichteblau (DTD-related changes)
;;; License: BSD
;;; ---------------------------------------------------------------------------
-;;; copyright 2003 by Henrik Motakef
-;;; copyright 2004 knowledgeTools Int. GmbH
+;;; (c) copyright 2003 by Henrik Motakef
+;;; (c) copyright 2004 knowledgeTools Int. GmbH
;;; Redistribution and use in source and binary forms, with or without
;;; modification, are permitted provided that the following conditions are
@@ -53,6 +53,8 @@
#:*use-xmlns-namespace*
#:make-attribute
+ #:find-attribute
+ #:find-attribute-ns
#:attribute-namespace-uri
#:attribute-local-name
#:attribute-qname
@@ -72,6 +74,8 @@
#:end-cdata
#:start-dtd
#:end-dtd
+ #:start-internal-subset
+ #:end-internal-subset
#:unparsed-entity-declaration
#:external-entity-declaration
#:internal-entity-declaration
@@ -92,7 +96,7 @@
related options.")
;; The http://xml.org/sax/features/namespace-prefixes property.
-(defvar *include-xmlns-attributes* nil
+(defvar *include-xmlns-attributes* t
"If non-nil, namespace declarations are reported as normal
attributes.
@@ -102,7 +106,7 @@
See also `*use-xmlns-namespace*', and `start-element' for a detailed
description of the consequences of setting this variable.")
-(defvar *use-xmlns-namespace* nil
+(defvar *use-xmlns-namespace* t
"If this variable is nil (the default), attributes with a name like
'xmlns:x' are not considered to be in a namespace, following the
'Namespaces in XML' specification.
@@ -135,6 +139,23 @@
value
specified-p)
+(defun %rod= (x y)
+ ;; allow rods *and* strings *and* null
+ (cond
+ ((zerop (length x)) (zerop (length y)))
+ ((zerop (length y)) nil)
+ ((stringp x) (string= x y))
+ (t (runes:rod= x y))))
+
+(defun find-attribute (qname attrs)
+ (find qname attrs :key #'attribute-qname :test #'%rod=))
+
+(defun find-attribute-ns (uri lname attrs)
+ (find-if (lambda (attr)
+ (and (%rod= uri (sax:attribute-namespace-uri attr))
+ (%rod= lname (sax:attribute-local-name attr))))
+ attrs))
+
(defgeneric start-document (handler)
(:documentation "Called at the beginning of the parsing process,
before any element, processing instruction or comment is reported.
@@ -160,7 +181,7 @@
local-name properties, the same rules as for the element name
apply. Additionally, namespace-declaring attributes (those whose name
is \"xmlns\" or starts with \"xmlns:\") are only included if
-*namespace-prefixes* is non-nil.")
+*include-xmlns-attributes* is non-nil.")
(:method ((handler t) namespace-uri local-name qname attributes)
(declare (ignore namespace-uri local-name qname attributes))
nil))
@@ -254,6 +275,16 @@
(:documentation "Called at the end of parsing a DTD.")
(:method ((handler t)) nil))
+(defgeneric start-internal-subset (handler)
+ (:documentation "Reports that an internal subset is present. Called before
+any definition from the internal subset is reported.")
+ (:method ((handler t)) nil))
+
+(defgeneric end-internal-subset (handler)
+ (:documentation "Called after processing of the internal subset has
+finished, if present.")
+ (:method ((handler t)) nil))
+
(defgeneric unparsed-entity-declaration
(handler name public-id system-id notation-name)
(:documentation
@@ -313,7 +344,11 @@
(:documentation
"Called between sax:end-dtd and sax:end-document to register an entity
resolver, a function of two arguments: An entity name and SAX handler.
- When called, the resolver function will parse the named entities data.")
+ When called, the resolver function will parse the named entity's data.")
(:method ((handler t) resolver)
(declare (ignore resolver))
nil))
+
+;; internal for now
+(defgeneric dtd (handler dtd)
+ (:method ((handler t) dtd) (declare (ignore dtd)) nil))
Added: branches/grin-neu/thirdparty/cxml/xml/sax-proxy.lisp
===================================================================
--- branches/grin-neu/thirdparty/cxml/xml/sax-proxy.lisp 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/cxml/xml/sax-proxy.lisp 2006-12-01 10:39:49 UTC (rev 2094)
@@ -0,0 +1,41 @@
+;;;; sax-proxy.lisp
+;;;;
+;;;; This file is part of the CXML parser, released under Lisp-LGPL.
+;;;; See file COPYING for details.
+;;;;
+;;;; Copyright (c) 2004 David Lichteblau
+;;;; Author: David Lichteblau
+
+(in-package :cxml)
+
+(defclass sax-proxy ()
+ ((chained-handler :initform nil
+ :initarg :chained-handler
+ :accessor proxy-chained-handler)))
+
+(macrolet ((define-proxy-method (name (&rest args))
+ `(defmethod ,name ((handler sax-proxy) ,@args)
+ (,name (proxy-chained-handler handler) ,@args))))
+ (define-proxy-method sax:start-document ())
+ (define-proxy-method sax:start-element (uri lname qname attributes))
+ (define-proxy-method sax:start-prefix-mapping (prefix uri))
+ (define-proxy-method sax:characters (data))
+ (define-proxy-method sax:processing-instruction (target data))
+ (define-proxy-method sax:end-prefix-mapping (prefix))
+ (define-proxy-method sax:end-element (namespace-uri local-name qname))
+ (define-proxy-method sax:end-document ())
+ (define-proxy-method sax:comment (data))
+ (define-proxy-method sax:start-cdata ())
+ (define-proxy-method sax:end-cdata ())
+ (define-proxy-method sax:start-dtd (name public-id system-id))
+ (define-proxy-method sax:end-dtd ())
+ (define-proxy-method sax:start-internal-subset ())
+ (define-proxy-method sax:end-internal-subset ())
+ (define-proxy-method sax:unparsed-entity-declaration (name pub sys not))
+ (define-proxy-method sax:external-entity-declaration (kind name pub sys))
+ (define-proxy-method sax:internal-entity-declaration (kind name value))
+ (define-proxy-method sax:notation-declaration (name public-id system-id))
+ (define-proxy-method sax:element-declaration (name model))
+ (define-proxy-method sax:attribute-declaration (elt attr type default))
+ (define-proxy-method sax:entity-resolver (resolver))
+ (define-proxy-method sax::dtd (dtd)))
Modified: branches/grin-neu/thirdparty/cxml/xml/sax-tests/tests.lisp
===================================================================
--- branches/grin-neu/thirdparty/cxml/xml/sax-tests/tests.lisp 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/cxml/xml/sax-tests/tests.lisp 2006-12-01 10:39:49 UTC (rev 2094)
@@ -1,7 +1,7 @@
(in-package :sax-tests)
(defun first-start-element-event (string)
- (let ((events (xml::parse-string string (make-instance 'event-collecting-handler))))
+ (let ((events (cxml:parse-rod string (make-instance 'event-collecting-handler))))
(find :start-element events :key #'car)))
@@ -17,7 +17,7 @@
(deftest attribute-uniqueness-1
(handler-case
- (xml::parse-string "<x xmlns:a='http://example.com' xmlns:b='http://example.com' a:a='1' b:a='1'/>")
+ (cxml:parse-rod "<x xmlns:a='http://example.com' xmlns:b='http://example.com' a:a='1' b:a='1'/>")
(error () t)
(:no-error (&rest junk)
(declare (ignore junk))
@@ -26,7 +26,7 @@
(deftest attribute-uniqueness-2
(handler-case
- (xml::parse-string "<x xmlns:a='http://example.com' xmlns='http://example.com' a:a='1' a='1'/>")
+ (cxml:parse-rod "<x xmlns:a='http://example.com' xmlns='http://example.com' a:a='1' a='1'/>")
(error () nil)
(:no-error (&rest junk)
(declare (ignore junk))
@@ -36,7 +36,7 @@
(deftest attribute-uniqueness-3
(let ((sax:*namespace-processing* nil))
(handler-case
- (xml::parse-string "<x xmlns:a='http://example.com' xmlns:b='http://example.com' a:a='1' b:a='1'/>")
+ (cxml:parse-rod "<x xmlns:a='http://example.com' xmlns:b='http://example.com' a:a='1' b:a='1'/>")
(error () nil)
(:no-error (&rest junk)
(declare (ignore junk))
@@ -46,7 +46,7 @@
;;; Namespace undeclaring
(deftest undeclare-default-namespace-1
- (let* ((evts (xml::parse-string "<x xmlns='http://example.com'><y xmlns='' a='1'/></x>"
+ (let* ((evts (cxml:parse-rod "<x xmlns='http://example.com'><y xmlns='' a='1'/></x>"
(make-instance 'event-collecting-handler)))
(start-elt-events (remove :start-element evts :test (complement #'eql) :key #'car))
(evt1 (first start-elt-events))
@@ -59,7 +59,7 @@
(deftest undeclare-other-namespace
(handler-case
- (xml::parse-string "<x:x xmlns:x='http://example.com'><x:y xmlns:x='' a='1'/></x:x>")
+ (cxml:parse-rod "<x:x xmlns:x='http://example.com'><x:y xmlns:x='' a='1'/></x:x>")
(error () t)
(:no-error (&rest junk)
(declare (ignore junk))
@@ -71,7 +71,7 @@
(deftest pi-names-are-ncnames-when-namespace-processing-1
(handler-case
- (xml::parse-string "<?a:b c?><x/>")
+ (cxml:parse-rod "<?a:b c?><x/>")
(error () t)
(:no-error (&rest junk)
(declare (ignore junk))
@@ -81,7 +81,7 @@
(deftest pi-names-are-ncnames-when-namespace-processing-2
(let ((sax:*namespace-processing* nil))
(handler-case
- (xml::parse-string "<?a:b c?><x/>")
+ (cxml:parse-rod "<?a:b c?><x/>")
(error () nil)
(:no-error (&rest junk)
(declare (ignore junk))
@@ -90,7 +90,7 @@
(deftest entity-names-are-ncnames-when-namespace-processing-1
(handler-case
- (xml::parse-string "<!DOCTYPE x [ <!ENTITY y:z 'foo'> ]><x>&y:z;</x>")
+ (cxml:parse-rod "<!DOCTYPE x [ <!ENTITY y:z 'foo'> ]><x>&y:z;</x>")
(error () t)
(:no-error (&rest junk)
(declare (ignore junk))
@@ -99,7 +99,7 @@
(deftest entity-names-are-ncnames-when-namespace-processing-2
(handler-case
- (xml::parse-string "<!DOCTYPE x [ <!ENTITY y:z 'foo'> ]><x/>")
+ (cxml:parse-rod "<!DOCTYPE x [ <!ENTITY y:z 'foo'> ]><x/>")
(error () t)
(:no-error (&rest junk)
(declare (ignore junk))
@@ -109,7 +109,7 @@
(deftest entity-names-are-ncnames-when-namespace-processing-3
(let ((sax:*namespace-processing* nil))
(handler-case
- (xml::parse-string "<!DOCTYPE x [ <!ENTITY y:z 'foo'> ]><x>&y:z;</x>")
+ (cxml:parse-rod "<!DOCTYPE x [ <!ENTITY y:z 'foo'> ]><x>&y:z;</x>")
(error () nil)
(:no-error (&rest junk)
(declare (ignore junk))
@@ -119,7 +119,7 @@
(deftest entity-names-are-ncnames-when-namespace-processing-4
(let ((sax:*namespace-processing* nil))
(handler-case
- (xml::parse-string "<!DOCTYPE x [ <!ENTITY y:z 'foo'> ]><x/>")
+ (cxml:parse-rod "<!DOCTYPE x [ <!ENTITY y:z 'foo'> ]><x/>")
(error () nil)
(:no-error (&rest junk)
(declare (ignore junk))
@@ -259,7 +259,7 @@
(deftest redefine-xml-namespace-1
(handler-case
- (xml::parse-string "<x xmlns:xml='http://www.w3.org/XML/1998/namespace'/>")
+ (cxml:parse-rod "<x xmlns:xml='http://www.w3.org/XML/1998/namespace'/>")
(error () nil)
(:no-error (&rest junk)
(declare (ignore junk))
@@ -268,7 +268,7 @@
(deftest redefine-xml-namespace-2
(handler-case
- (xml::parse-string "<x xmlns:xml='http://example.com/wrong-uri'/>")
+ (cxml:parse-rod "<x xmlns:xml='http://example.com/wrong-uri'/>")
(error () t)
(:no-error (&rest junk)
(declare (ignore junk))
@@ -277,7 +277,7 @@
(deftest redefine-xml-namespace-3
(handler-case
- (xml::parse-string "<x xmlns:wrong='http://www.w3.org/XML/1998/namespace'/>")
+ (cxml:parse-rod "<x xmlns:wrong='http://www.w3.org/XML/1998/namespace'/>")
(error () t)
(:no-error (&rest junk)
(declare (ignore junk))
@@ -286,7 +286,7 @@
(deftest redefine-xml-namespace-4
(handler-case
- (xml::parse-string "<x xmlns:wrong='http://www.w3.org/XML/1998/namespace'/>")
+ (cxml:parse-rod "<x xmlns:wrong='http://www.w3.org/XML/1998/namespace'/>")
(error () t)
(:no-error (&rest junk)
(declare (ignore junk))
@@ -295,7 +295,7 @@
(deftest redefine-xmlns-namespace-1
(handler-case
- (xml::parse-string "<x xmlns:xmlns='http://www.w3.org/2000/xmlns/'/>")
+ (cxml:parse-rod "<x xmlns:xmlns='http://www.w3.org/2000/xmlns/'/>")
(error () t)
(:no-error (&rest junk)
(declare (ignore junk))
@@ -304,7 +304,7 @@
(deftest redefine-xmlns-namespace-2
(handler-case
- (xml::parse-string "<x xmlns:xmlns='http://example.com/wrong-ns'/>")
+ (cxml:parse-rod "<x xmlns:xmlns='http://example.com/wrong-ns'/>")
(error () t)
(:no-error (&rest junk)
(declare (ignore junk))
@@ -313,7 +313,7 @@
(deftest redefine-xmlns-namespace-3
(handler-case
- (xml::parse-string "<x xmlns:wrong='http://www.w3.org/2000/xmlns/'/>")
+ (cxml:parse-rod "<x xmlns:wrong='http://www.w3.org/2000/xmlns/'/>")
(error () t)
(:no-error (&rest junk)
(declare (ignore junk))
@@ -322,11 +322,9 @@
(deftest redefine-xmlns-namespace-4
(handler-case
- (xml::parse-string "<x xmlns='http://www.w3.org/2000/xmlns/'/>")
+ (cxml:parse-rod "<x xmlns='http://www.w3.org/2000/xmlns/'/>")
(error () t)
(:no-error (&rest junk)
(declare (ignore junk))
nil))
t)
-
-
Added: branches/grin-neu/thirdparty/cxml/xml/space-normalizer.lisp
===================================================================
--- branches/grin-neu/thirdparty/cxml/xml/space-normalizer.lisp 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/cxml/xml/space-normalizer.lisp 2006-12-01 10:39:49 UTC (rev 2094)
@@ -0,0 +1,62 @@
+;;;; space-normalizer.lisp -- whitespace removal
+;;;;
+;;;; This file is part of the CXML parser, released under Lisp-LGPL.
+;;;; See file COPYING for details.
+;;;;
+;;;; Copyright (c) 2005 David Lichteblau
+
+(in-package :cxml)
+
+(defclass whitespace-normalizer (sax-proxy)
+ ((attributes :initform '(t) :accessor xml-space-attributes)
+ (models :initform nil :accessor xml-space-models)
+ (dtd :initarg :dtd :accessor xml-space-dtd)))
+
+(defun make-whitespace-normalizer (chained-handler &optional dtd)
+ (make-instance 'whitespace-normalizer
+ :dtd dtd
+ :chained-handler chained-handler))
+
+(defmethod sax::dtd ((handler whitespace-normalizer) dtd)
+ (unless (xml-space-dtd handler)
+ (setf (xml-space-dtd handler) dtd)))
+
+(defmethod sax:start-element
+ ((handler whitespace-normalizer) uri lname qname attrs)
+ (declare (ignore uri lname))
+ (let ((dtd (xml-space-dtd handler)))
+ (when dtd
+ (let ((xml-space
+ (sax:find-attribute (if (stringp qname) "xml:space" #"xml:space")
+ attrs)))
+ (push (if xml-space
+ (rod= (rod (sax:attribute-value xml-space)) #"default")
+ (car (xml-space-attributes handler)))
+ (xml-space-attributes handler)))
+ (let* ((e (cxml::find-element (rod qname) dtd))
+ (cspec (when e (cxml::elmdef-content e))))
+ (push (and (consp cspec)
+ (not (and (eq (car cspec) '*)
+ (let ((subspec (second cspec)))
+ (and (eq (car subspec) 'or)
+ (eq (cadr subspec) :PCDATA))))))
+ (xml-space-models handler)))))
+ (call-next-method))
+
+(defmethod sax:characters ((handler whitespace-normalizer) data)
+ (cond
+ ((and (xml-space-dtd handler)
+ (car (xml-space-attributes handler))
+ (car (xml-space-models handler)))
+ (unless (every #'white-space-rune-p (rod data))
+ (warn "non-whitespace character data in element content")
+ (call-next-method)))
+ (t
+ (call-next-method))))
+
+(defmethod sax:end-element ((handler whitespace-normalizer) uri lname qname)
+ (declare (ignore uri lname qname))
+ (when (xml-space-dtd handler)
+ (pop (xml-space-attributes handler))
+ (pop (xml-space-models handler)))
+ (call-next-method))
Modified: branches/grin-neu/thirdparty/cxml/xml/unparse.lisp
===================================================================
--- branches/grin-neu/thirdparty/cxml/xml/unparse.lisp 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/cxml/xml/unparse.lisp 2006-12-01 10:39:49 UTC (rev 2094)
@@ -5,11 +5,11 @@
;;; Created: 1999-09-09
;;; Author: Gilbert Baumann <unk6(a)rz.uni-karlsruhe.de>
;;; Author: David Lichteblau <david(a)lichteblau.com>
-;;; License: LGPL (See file COPYING for details).
+;;; License: Lisp-LGPL (See file COPYING for details).
;;; ---------------------------------------------------------------------------
-;;; copyright 1999 by Gilbert Baumann
-;;; copyright 2004 by knowledgeTools Int. GmbH
-;;; copyright 2004 by David Lichteblau (for headcraft.de)
+;;; (c) copyright 1999 by Gilbert Baumann
+;;; (c) copyright 2004 by knowledgeTools Int. GmbH
+;;; (c) copyright 2004 by David Lichteblau (for headcraft.de)
;;; This library is free software; you can redistribute it and/or
;;; modify it under the terms of the GNU Library General Public
@@ -67,12 +67,11 @@
;; -- James Clark (jjc(a)jclark.com)
-;;;; SINK: a rune output "stream"
+;;;; SINK: an xml output sink
(defclass sink ()
- ((high-surrogate :initform nil)
- (column :initform 0 :accessor column)
- (width :initform nil :initarg :width :accessor width)
+ ((ystream :initarg :ystream :accessor sink-ystream)
+ (width :initform 79 :initarg :width :accessor width)
(canonical :initform t :initarg :canonical :accessor canonical)
(indentation :initform nil :initarg :indentation :accessor indentation)
(current-indentation :initform 0 :accessor current-indentation)
@@ -90,77 +89,49 @@
(when (and (canonical instance) (indentation instance))
(error "Cannot indent XML in canonical mode")))
-;; WRITE-OCTET als generisch zu machen ist vielleicht nicht die schnellste
-;; Loesung, aber die einfachste.
-(defgeneric write-octet (octet sink))
-
(defun make-buffer (&key (element-type '(unsigned-byte 8)))
(make-array 1
:element-type element-type
:adjustable t
:fill-pointer 0))
-(defmethod write-octet :after (octet sink)
- (with-slots (column) sink
- (setf column (if (eql octet 10) 0 (1+ column)))))
+;; total haesslich, aber die ystreams will ich im moment eigentlich nicht
+;; dokumentieren
+(macrolet ((define-maker (make-sink make-ystream &rest args)
+ `(defun ,make-sink (,@args &rest initargs)
+ (apply #'make-instance
+ 'sink
+ :ystream (,make-ystream ,@args)
+ initargs))))
+ (define-maker make-octet-vector-sink make-octet-vector-ystream)
+ (define-maker make-octet-stream-sink make-octet-stream-ystream stream)
+ (define-maker make-rod-sink make-rod-ystream)
+ #+rune-is-character
+ (define-maker make-character-stream-sink make-character-stream-ystream stream)
-;; vector (octet) sinks
+ #-rune-is-character
+ (define-maker make-string-sink make-string-ystream/utf8)
-(defclass vector-sink (sink)
- ((target-vector :initform (make-buffer))))
+ #-rune-is-character
+ (define-maker make-character-stream-sink
+ make-character-stream-ystream/utf8
+ stream))
-(defun make-octet-vector-sink (&rest initargs)
- (apply #'make-instance 'vector-sink initargs))
+#+rune-is-character
+(defun make-string-sink (&rest args) (apply #'make-rod-sink args))
-(defmethod write-octet (octet (sink vector-sink))
- (let ((target-vector (slot-value sink 'target-vector)))
- (vector-push-extend octet target-vector (length target-vector))))
-(defmethod sax:end-document ((sink vector-sink))
- (slot-value sink 'target-vector))
+(defmethod sax:end-document ((sink sink))
+ (close-ystream (sink-ystream sink)))
-;; character stream sinks
-
-(defclass character-stream-sink (sink)
- ((target-stream :initarg :target-stream)))
-
-(defun make-character-stream-sink (character-stream &rest initargs)
- (apply #'make-instance 'character-stream-sink
- :target-stream character-stream
- initargs))
-
-(defmethod write-octet (octet (sink character-stream-sink))
- (write-char (code-char octet) (slot-value sink 'target-stream)))
-
-(defmethod sax:end-document ((sink character-stream-sink))
- (slot-value sink 'target-stream))
-
-
-;; octet stream sinks
-
-(defclass octet-stream-sink (sink)
- ((target-stream :initarg :target-stream)))
-
-(defun make-octet-stream-sink (octet-stream &rest initargs)
- (apply #'make-instance 'octet-stream-sink
- :target-stream octet-stream
- initargs))
-
-(defmethod write-octet (octet (sink octet-stream-sink))
- (write-byte octet (slot-value sink 'target-stream)))
-
-(defmethod sax:end-document ((sink octet-stream-sink))
- (slot-value sink 'target-stream))
-
-
;;;; doctype and notations
(defmethod sax:start-document ((sink sink))
(unless (canonical sink)
- (write-rod #"<?xml version=\"1.0\" encoding=\"UTF-8\"?>" sink)
- (write-rune #/U+000A sink)))
+ (%write-rod #"<?xml version=\"1.0\" encoding=\"UTF-8\"?>" sink)
+ (%write-rune #/U+000A sink)))
(defmethod sax:start-dtd ((sink sink) name public-id system-id)
(setf (name-for-dtd sink) name)
@@ -170,58 +141,201 @@
(defun ensure-doctype (sink &optional public-id system-id)
(unless (have-doctype sink)
(setf (have-doctype sink) t)
- (write-rod #"<!DOCTYPE " sink)
- (write-rod (name-for-dtd sink) sink)
+ (%write-rod #"<!DOCTYPE " sink)
+ (%write-rod (name-for-dtd sink) sink)
(cond
(public-id
- (write-rod #" PUBLIC \"" sink)
+ (%write-rod #" PUBLIC \"" sink)
(unparse-string public-id sink)
- (write-rod #"\" \"" sink)
+ (%write-rod #"\" \"" sink)
(unparse-string system-id sink)
- (write-rod #"\"" sink))
+ (%write-rod #"\"" sink))
(system-id
- (write-rod #" SYSTEM \"" sink)
+ (%write-rod #" SYSTEM \"" sink)
(unparse-string public-id sink)
- (write-rod #"\"" sink)))))
+ (%write-rod #"\"" sink)))))
+(defmethod sax:start-internal-subset ((sink sink))
+ (ensure-doctype sink)
+ (%write-rod #" [" sink)
+ (%write-rune #/U+000A sink))
+
+(defmethod sax:end-internal-subset ((sink sink))
+ (ensure-doctype sink)
+ (%write-rod #"]" sink))
+
(defmethod sax:notation-declaration ((sink sink) name public-id system-id)
- (when (and (canonical sink) (>= (canonical sink) 2))
- (let ((prev (previous-notation sink)))
- (cond
- (prev
- (unless (rod< prev name)
- (error "misordered notations; cannot unparse canonically")))
- (t
- (ensure-doctype sink)
- (write-rod #" [" sink)
- (write-rune #/U+000A sink)))
- (setf (previous-notation sink) name))
- (write-rod #"<!NOTATION " sink)
- (write-rod name sink)
+ (let ((prev (previous-notation sink)))
+ (when (and (and (canonical sink) (>= (canonical sink) 2))
+ prev
+ (not (rod< prev name)))
+ (error "misordered notations; cannot unparse canonically"))
+ (setf (previous-notation sink) name))
+ (%write-rod #"<!NOTATION " sink)
+ (%write-rod name sink)
+ (cond
+ ((zerop (length public-id))
+ (%write-rod #" SYSTEM '" sink)
+ (%write-rod system-id sink)
+ (%write-rune #/' sink))
+ ((zerop (length system-id))
+ (%write-rod #" PUBLIC '" sink)
+ (%write-rod public-id sink)
+ (%write-rune #/' sink))
+ (t
+ (%write-rod #" PUBLIC '" sink)
+ (%write-rod public-id sink)
+ (%write-rod #"' '" sink)
+ (%write-rod system-id sink)
+ (%write-rune #/' sink)))
+ (%write-rune #/> sink)
+ (%write-rune #/U+000A sink))
+
+(defmethod sax:unparsed-entity-declaration
+ ((sink sink) name public-id system-id notation-name)
+ (unless (and (canonical sink) (< (canonical sink) 3))
+ (%write-rod #"<!ENTITY " sink)
+ (%write-rod name sink)
(cond
((zerop (length public-id))
- (write-rod #" SYSTEM '" sink)
- (write-rod system-id sink)
- (write-rune #/' sink))
+ (%write-rod #" SYSTEM '" sink)
+ (%write-rod system-id sink)
+ (%write-rune #/' sink))
((zerop (length system-id))
- (write-rod #" PUBLIC '" sink)
- (write-rod public-id sink)
- (write-rune #/' sink))
+ (%write-rod #" PUBLIC '" sink)
+ (%write-rod public-id sink)
+ (%write-rune #/' sink))
(t
- (write-rod #" PUBLIC '" sink)
- (write-rod public-id sink)
- (write-rod #"' '" sink)
- (write-rod system-id sink)
- (write-rune #/' sink)))
- (write-rune #/> sink)
- (write-rune #/U+000A sink)))
+ (%write-rod #" PUBLIC '" sink)
+ (%write-rod public-id sink)
+ (%write-rod #"' '" sink)
+ (%write-rod system-id sink)
+ (%write-rune #/' sink)))
+ (%write-rod #" NDATA " sink)
+ (%write-rod notation-name sink)
+ (%write-rune #/> sink)
+ (%write-rune #/U+000A sink)))
+(defmethod sax:external-entity-declaration
+ ((sink sink) kind name public-id system-id)
+ (when (canonical sink)
+ (error "cannot serialize parsed entities in canonical mode"))
+ (%write-rod #"<!ENTITY " sink)
+ (when (eq kind :parameter)
+ (%write-rod #" % " sink))
+ (%write-rod name sink)
+ (cond
+ ((zerop (length public-id))
+ (%write-rod #" SYSTEM '" sink)
+ (%write-rod system-id sink)
+ (%write-rune #/' sink))
+ ((zerop (length system-id))
+ (%write-rod #" PUBLIC '" sink)
+ (%write-rod public-id sink)
+ (%write-rune #/' sink))
+ (t
+ (%write-rod #" PUBLIC '" sink)
+ (%write-rod public-id sink)
+ (%write-rod #"' '" sink)
+ (%write-rod system-id sink)
+ (%write-rune #/' sink)))
+ (%write-rune #/> sink)
+ (%write-rune #/U+000A sink))
+
+(defmethod sax:internal-entity-declaration ((sink sink) kind name value)
+ (when (canonical sink)
+ (error "cannot serialize parsed entities in canonical mode"))
+ (%write-rod #"<!ENTITY " sink)
+ (when (eq kind :parameter)
+ (%write-rod #" % " sink))
+ (%write-rod name sink)
+ (%write-rune #/U+0020 sink)
+ (%write-rune #/\" sink)
+ (unparse-string value sink)
+ (%write-rune #/\" sink)
+ (%write-rune #/> sink)
+ (%write-rune #/U+000A sink))
+
+(defmethod sax:element-declaration ((sink sink) name model)
+ (when (canonical sink)
+ (error "cannot serialize element type declarations in canonical mode"))
+ (%write-rod #"<!ELEMENT " sink)
+ (%write-rod name sink)
+ (%write-rune #/U+0020 sink)
+ (labels ((walk (m)
+ (cond
+ ((eq m :EMPTY)
+ (%write-rod "EMPTY" sink))
+ ((eq m :PCDATA)
+ (%write-rod "#PCDATA" sink))
+ ((atom m)
+ (unparse-string m sink))
+ (t
+ (ecase (car m)
+ (and
+ (%write-rune #/\( sink)
+ (loop for (n . rest) on (cdr m) do
+ (walk n)
+ (when rest
+ (%write-rune #\, sink)))
+ (%write-rune #/\) sink))
+ (or
+ (%write-rune #/\( sink)
+ (loop for (n . rest) on (cdr m) do
+ (walk n)
+ (when rest
+ (%write-rune #\| sink)))
+ (%write-rune #/\) sink))
+ (*
+ (walk (second m))
+ (%write-rod #/* sink))
+ (+
+ (walk (second m))
+ (%write-rod #/+ sink))
+ (?
+ (walk (second m))
+ (%write-rod #/? sink)))))))
+ (walk model))
+ (%write-rune #/> sink)
+ (%write-rune #/U+000A sink))
+
+(defmethod sax:attribute-declaration ((sink sink) ename aname type default)
+ (when (canonical sink)
+ (error "cannot serialize attribute type declarations in canonical mode"))
+ (%write-rod #"<!ATTLIST " sink)
+ (%write-rod ename sink)
+ (%write-rune #/U+0020 sink)
+ (%write-rod aname sink)
+ (%write-rune #/U+0020 sink)
+ (cond
+ ((atom type)
+ (%write-rod (rod (string-upcase (symbol-name type))) sink))
+ (t
+ (when (eq :NOTATION (car type))
+ (%write-rod #"NOTATION " sink))
+ (%write-rune #/\( sink)
+ (loop for (n . rest) on (cdr type) do
+ (%write-rod n sink)
+ (when rest
+ (%write-rune #\| sink)))
+ (%write-rune #/\) sink)))
+ (cond
+ ((atom default)
+ (%write-rune #/# sink)
+ (%write-rod (rod (string-upcase (symbol-name default))) sink))
+ (t
+ (when (eq :FIXED (car default))
+ (%write-rod #"#FIXED " sink))
+ (%write-rune #/\" sink)
+ (unparse-string (second default) sink)
+ (%write-rune #/\" sink)))
+ (%write-rune #/> sink)
+ (%write-rune #/U+000A sink))
+
(defmethod sax:end-dtd ((sink sink))
(when (have-doctype sink)
- (when (previous-notation sink)
- (write-rod #"]" sink))
- (write-rod #">" sink)
- (write-rune #/U+000A sink)))
+ (%write-rod #">" sink)
+ (%write-rune #/U+000A sink)))
;;;; elements
@@ -232,15 +346,15 @@
(have-gt nil))
(defun sink-fresh-line (sink)
- (unless (zerop (column sink))
- (write-rune-0 10 sink)
+ (unless (zerop (ystream-column (sink-ystream sink)))
+ (%write-rune #/U+000A sink) ;newline
(indent sink)))
(defun maybe-close-tag (sink)
(let ((tag (car (stack sink))))
(when (and (tag-p tag) (not (tag-have-gt tag)))
(setf (tag-have-gt tag) t)
- (write-rune #/> sink))))
+ (%write-rune #/> sink))))
(defmethod sax:start-element
((sink sink) namespace-uri local-name qname attributes)
@@ -252,16 +366,16 @@
(when (indentation sink)
(sink-fresh-line sink)
(start-indentation-block sink))
- (write-rune #/< sink)
- (write-rod qname sink)
+ (%write-rune #/< sink)
+ (%write-rod qname sink)
(let ((atts (sort (copy-list attributes) #'rod< :key #'sax:attribute-qname)))
(dolist (a atts)
- (write-rune #/space sink)
- (write-rod (sax:attribute-qname a) sink)
- (write-rune #/= sink)
- (write-rune #/\" sink)
- (map nil (lambda (c) (unparse-datachar c sink)) (sax:attribute-value a))
- (write-rune #/\" sink)))
+ (%write-rune #/space sink)
+ (%write-rod (sax:attribute-qname a) sink)
+ (%write-rune #/= sink)
+ (%write-rune #/\" sink)
+ (unparse-string (sax:attribute-value a) sink)
+ (%write-rune #/\" sink)))
(when (canonical sink)
(maybe-close-tag sink)))
@@ -280,21 +394,21 @@
(sink-fresh-line sink)))
(cond
((tag-have-gt tag)
- (write-rod '#.(string-rod "</") sink)
- (write-rod qname sink)
- (write-rod '#.(string-rod ">") sink))
+ (%write-rod '#.(string-rod "</") sink)
+ (%write-rod qname sink)
+ (%write-rod '#.(string-rod ">") sink))
(t
- (write-rod #"/>" sink)))))
+ (%write-rod #"/>" sink)))))
(defmethod sax:processing-instruction ((sink sink) target data)
(maybe-close-tag sink)
(unless (rod-equal target '#.(string-rod "xml"))
- (write-rod '#.(string-rod "<?") sink)
- (write-rod target sink)
- (write-rune #/space sink)
- (write-rod data sink)
- (write-rod '#.(string-rod "?>") sink)
- (write-rune #/U+000A sink)))
+ (%write-rod '#.(string-rod "<?") sink)
+ (%write-rod target sink)
+ (when data
+ (%write-rune #/space sink)
+ (%write-rod data sink))
+ (%write-rod '#.(string-rod "?>") sink)))
(defmethod sax:start-cdata ((sink sink))
(maybe-close-tag sink)
@@ -308,17 +422,17 @@
(not (search #"]]" data)))
(when (indentation sink)
(sink-fresh-line sink))
- (write-rod #"<![CDATA[" sink)
+ (%write-rod #"<![CDATA[" sink)
;; XXX signal error if body is unprintable?
- (map nil (lambda (c) (write-rune c sink)) data)
- (write-rod #"]]>" sink))
+ (map nil (lambda (c) (%write-rune c sink)) data)
+ (%write-rod #"]]>" sink))
(t
(if (indentation sink)
(unparse-indented-text data sink)
- (map nil (if (canonical sink)
- (lambda (c) (unparse-datachar c sink))
- (lambda (c) (unparse-datachar-readable c sink)))
- data)))))
+ (let ((y (sink-ystream sink)))
+ (if (canonical sink)
+ (loop for c across data do (unparse-datachar c y))
+ (loop for c across data do (unparse-datachar-readable c y))))))))
(defmethod sax:end-cdata ((sink sink))
(unless (eq (pop (stack sink)) :cdata)
@@ -326,7 +440,7 @@
(defun indent (sink)
(dotimes (x (current-indentation sink))
- (write-rune-0 32 sink)))
+ (%write-rune #/U+0020 sink))) ; space
(defun start-indentation-block (sink)
(incf (current-indentation sink) (indentation sink)))
@@ -348,92 +462,49 @@
(let* ((w (or (position-if #'whitespacep data :start (1+ pos)) n))
(next (or (position-if-not #'whitespacep data :start w) n)))
(when need-whitespace-p
- (if (or (not (width sink))
- (< (+ (column sink) w (- pos)) (width sink)))
- (write-rune-0 32 sink)
+ (if (< (+ (ystream-column (sink-ystream sink)) w (- pos))
+ (width sink))
+ (%write-rune #/U+0020 sink)
(sink-fresh-line sink)))
(loop
+ with y = (sink-ystream sink)
for i from pos below w do
- (unparse-datachar-readable (elt data i) sink))
+ (unparse-datachar-readable (elt data i) y))
(setf need-whitespace-p (< w n))
(setf pos next))))
(t
- (write-rune-0 32 sink))))))
+ (%write-rune #/U+0020 sink))))))
(defun unparse-string (str sink)
- (map nil (lambda (c) (unparse-datachar c sink)) str))
+ (let ((y (sink-ystream sink)))
+ (loop for rune across str do (unparse-datachar rune y))))
-(defun unparse-datachar (c sink)
- (cond ((rune= c #/&) (write-rod '#.(string-rod "&") sink))
- ((rune= c #/<) (write-rod '#.(string-rod "<") sink))
- ((rune= c #/>) (write-rod '#.(string-rod ">") sink))
- ((rune= c #/\") (write-rod '#.(string-rod """) sink))
- ((rune= c #/U+0009) (write-rod '#.(string-rod "	") sink))
- ((rune= c #/U+000A) (write-rod '#.(string-rod " ") sink))
- ((rune= c #/U+000D) (write-rod '#.(string-rod " ") sink))
+(defun unparse-datachar (c ystream)
+ (cond ((rune= c #/&) (write-rod '#.(string-rod "&") ystream))
+ ((rune= c #/<) (write-rod '#.(string-rod "<") ystream))
+ ((rune= c #/>) (write-rod '#.(string-rod ">") ystream))
+ ((rune= c #/\") (write-rod '#.(string-rod """) ystream))
+ ((rune= c #/U+0009) (write-rod '#.(string-rod "	") ystream))
+ ((rune= c #/U+000A) (write-rod '#.(string-rod " ") ystream))
+ ((rune= c #/U+000D) (write-rod '#.(string-rod " ") ystream))
(t
- (write-rune c sink))))
+ (write-rune c ystream))))
-(defun unparse-datachar-readable (c sink)
- (cond ((rune= c #/&) (write-rod '#.(string-rod "&") sink))
- ((rune= c #/<) (write-rod '#.(string-rod "<") sink))
- ((rune= c #/>) (write-rod '#.(string-rod ">") sink))
- ((rune= c #/\") (write-rod '#.(string-rod """) sink))
+(defun unparse-datachar-readable (c ystream)
+ (cond ((rune= c #/&) (write-rod '#.(string-rod "&") ystream))
+ ((rune= c #/<) (write-rod '#.(string-rod "<") ystream))
+ ((rune= c #/>) (write-rod '#.(string-rod ">") ystream))
+ ((rune= c #/\") (write-rod '#.(string-rod """) ystream))
(t
- (write-rune c sink))))
+ (write-rune c ystream))))
+(defun %write-rune (c sink)
+ (write-rune c (sink-ystream sink)))
-;;;; UTF-8 output for SINKs
+(defun %write-rod (r sink)
+ (write-rod r (sink-ystream sink)))
-(defun write-rod (rod sink)
- (map nil (lambda (c) (write-rune c sink)) rod))
-(defun write-rune (rune sink)
- (let ((code (rune-code rune)))
- (with-slots (high-surrogate) sink
- (cond
- ((<= #xD800 code #xDBFF)
- (setf high-surrogate code))
- ((<= #xDC00 code #xDFFF)
- (let ((q (logior (ash (- high-surrogate #xD7C0) 10)
- (- code #xDC00))))
- (write-rune-0 q sink))
- (setf high-surrogate nil))
- (t
- (write-rune-0 code sink))))))
-
-(defun write-rune-0 (code sink)
- (labels ((wr (x)
- (write-octet x sink)))
- (cond ((<= #x00000000 code #x0000007F)
- (wr code))
- ((<= #x00000080 code #x000007FF)
- (wr (logior #b11000000 (ldb (byte 5 6) code)))
- (wr (logior #b10000000 (ldb (byte 6 0) code))))
- ((<= #x00000800 code #x0000FFFF)
- (wr (logior #b11100000 (ldb (byte 4 12) code)))
- (wr (logior #b10000000 (ldb (byte 6 6) code)))
- (wr (logior #b10000000 (ldb (byte 6 0) code))))
- ((<= #x00010000 code #x001FFFFF)
- (wr (logior #b11110000 (ldb (byte 3 18) code)))
- (wr (logior #b10000000 (ldb (byte 6 12) code)))
- (wr (logior #b10000000 (ldb (byte 6 6) code)))
- (wr (logior #b10000000 (ldb (byte 6 0) code))))
- ((<= #x00200000 code #x03FFFFFF)
- (wr (logior #b11111000 (ldb (byte 2 24) code)))
- (wr (logior #b10000000 (ldb (byte 6 18) code)))
- (wr (logior #b10000000 (ldb (byte 6 12) code)))
- (wr (logior #b10000000 (ldb (byte 6 6) code)))
- (wr (logior #b10000000 (ldb (byte 6 0) code))))
- ((<= #x04000000 code #x7FFFFFFF)
- (wr (logior #b11111100 (ldb (byte 1 30) code)))
- (wr (logior #b10000000 (ldb (byte 6 24) code)))
- (wr (logior #b10000000 (ldb (byte 6 18) code)))
- (wr (logior #b10000000 (ldb (byte 6 12) code)))
- (wr (logior #b10000000 (ldb (byte 6 6) code)))
- (wr (logior #b10000000 (ldb (byte 6 0) code)))))))
-
-
;;;; convenience functions for DOMless XML serialization
(defvar *current-element*)
@@ -450,14 +521,6 @@
(sax:end-document *sink*)))
(defmacro with-element (qname &body body)
- ;; XXX Statt qname soll man in zukunft auch mal (lname prefix) angeben
- ;; koennen. Hat aber Zeit bis DOM 2.
- #+(or)
- ;; XXX we want to be able to produce computed element names, so the
- ;; following code has been disabled.
- (when (listp qname)
- (destructuring-bind (n) qname
- (setf qname n)))
`(invoke-with-element (lambda () ,@body) ,qname))
(defun maybe-emit-start-tag ()
@@ -494,13 +557,14 @@
data)
(defun rod-to-utf8-string (rod)
- (with-output-to-string (s)
- (write-rod rod (cxml:make-character-stream-sink s))))
+ (let ((out (make-buffer :element-type 'character)))
+ (runes-to-utf8/adjustable-string out rod (length rod))
+ out))
(defun utf8-string-to-rod (str)
(let* ((bytes (map '(vector (unsigned-byte 8)) #'char-code str))
(buffer (make-array (length bytes) :element-type '(unsigned-byte 16)))
(n (decode-sequence :utf-8 bytes 0 (length bytes) buffer 0 0 nil))
- (result (make-array n :element-type 'rod)))
+ (result (make-array n :element-type 'rune)))
(map-into result #'code-rune buffer)
result))
Added: branches/grin-neu/thirdparty/cxml/xml/util.lisp
===================================================================
--- branches/grin-neu/thirdparty/cxml/xml/util.lisp 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/cxml/xml/util.lisp 2006-12-01 10:39:49 UTC (rev 2094)
@@ -0,0 +1,73 @@
+;;; -*- Mode: Lisp; Syntax: Common-Lisp; Package: RUNES; -*-
+;;; ---------------------------------------------------------------------------
+;;; Title: Some common utilities for the Closure browser
+;;; Created: 1997-12-27
+;;; Author: Gilbert Baumann <unk6(a)rz.uni-karlsruhe.de>
+;;; License: Lisp-LGPL (See file COPYING for details).
+;;; ---------------------------------------------------------------------------
+;;; (c) copyright 1997-1999 by Gilbert Baumann
+
+;;; This code is free software; you can redistribute it and/or modify it
+;;; under the terms of the version 2.1 of the GNU Lesser General Public
+;;; License as published by the Free Software Foundation, as clarified
+;;; by the "Preamble to the Gnu Lesser General Public License" found in
+;;; the file COPYING.
+;;;
+;;; This code is distributed in the hope that it will be useful,
+;;; but without any warranty; without even the implied warranty of
+;;; merchantability or fitness for a particular purpose. See the GNU
+;;; Lesser General Public License for more details.
+;;;
+;;; Version 2.1 of the GNU Lesser General Public License is in the file
+;;; COPYING that was distributed with this file. If it is not present,
+;;; you can access it from http://www.gnu.org/copyleft/lesser.txt (until
+;;; superseded by a newer version) or write to the Free Software
+;;; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+;; Changes
+;;
+;; When Who What
+;; ----------------------------------------------------------------------------
+;; 1999-08-24 GB = fixed MULTIPLE-VALUE-OR it now takes any number of
+;; subforms
+;;
+
+(in-package :cxml)
+
+;;; --------------------------------------------------------------------------------
+;;; Meta functions
+
+(defun curry (fun &rest args)
+ #'(lambda (&rest more)
+ (apply fun (append args more))))
+
+(defun rcurry (fun &rest args)
+ #'(lambda (&rest more)
+ (apply fun (append more args))))
+
+(defun compose (f g)
+ #'(lambda (&rest args)
+ (funcall f (apply g args))))
+
+;;; --------------------------------------------------------------------------------
+;;; while and until
+
+(defmacro while (test &body body)
+ `(until (not ,test) ,@body))
+
+(defmacro until (test &body body)
+ `(do () (,test) ,@body))
+
+;; prime numbers
+
+(defun primep (n)
+ "Returns true, iff `n' is prime."
+ (and (> n 2)
+ (do ((i 2 (+ i 1)))
+ ((> (* i i) n) t)
+ (cond ((zerop (mod n i)) (return nil))))))
+
+(defun nearest-greater-prime (n)
+ "Returns the smallest prime number no less than `n'."
+ (cond ((primep n) n)
+ ((nearest-greater-prime (+ n 1)))))
Modified: branches/grin-neu/thirdparty/cxml/xml/xml-name-rune-p.lisp
===================================================================
--- branches/grin-neu/thirdparty/cxml/xml/xml-name-rune-p.lisp 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/cxml/xml/xml-name-rune-p.lisp 2006-12-01 10:39:49 UTC (rev 2094)
@@ -1,6 +1,6 @@
;;;; xml-name-rune-p -- character class definitions
;;;;
-;;;; This file is part of the CXML parser, released under (L)LGPL.
+;;;; This file is part of the CXML parser, released under Lisp-LGPL.
;;;; See file COPYING for details.
;;;;
;;;; Author: Gilbert Baumann <unk6(a)rz.uni-karlsruhe.de>
@@ -11,9 +11,115 @@
(compile
nil
'(lambda ()
- (let ((*max* #xD800))
+ (let ((+max+ #xD800)
+ (base-char-ranges
+ #((#x0041 #x005A) (#x0061 #x007A) (#x00C0 #x00D6) (#x00D8 #x00F6)
+ (#x00F8 #x00FF) (#x0100 #x0131) (#x0134 #x013E) (#x0141 #x0148)
+ (#x014A #x017E) (#x0180 #x01C3) (#x01CD #x01F0) (#x01F4 #x01F5)
+ (#x01FA #x0217) (#x0250 #x02A8) (#x02BB #x02C1) (#x0386 #x0386)
+ (#x0388 #x038A) (#x038C #x038C) (#x038E #x03A1) (#x03A3 #x03CE)
+ (#x03D0 #x03D6) (#x03DA #x03DA) (#x03DC #x03DC) (#x03DE #x03DE)
+ (#x03E0 #x03E0) (#x03E2 #x03F3) (#x0401 #x040C) (#x040E #x044F)
+ (#x0451 #x045C) (#x045E #x0481) (#x0490 #x04C4) (#x04C7 #x04C8)
+ (#x04CB #x04CC) (#x04D0 #x04EB) (#x04EE #x04F5) (#x04F8 #x04F9)
+ (#x0531 #x0556) (#x0559 #x0559) (#x0561 #x0586) (#x05D0 #x05EA)
+ (#x05F0 #x05F2) (#x0621 #x063A) (#x0641 #x064A) (#x0671 #x06B7)
+ (#x06BA #x06BE) (#x06C0 #x06CE) (#x06D0 #x06D3) (#x06D5 #x06D5)
+ (#x06E5 #x06E6) (#x0905 #x0939) (#x093D #x093D) (#x0958 #x0961)
+ (#x0985 #x098C) (#x098F #x0990) (#x0993 #x09A8) (#x09AA #x09B0)
+ (#x09B2 #x09B2) (#x09B6 #x09B9) (#x09DC #x09DD) (#x09DF #x09E1)
+ (#x09F0 #x09F1) (#x0A05 #x0A0A) (#x0A0F #x0A10) (#x0A13 #x0A28)
+ (#x0A2A #x0A30) (#x0A32 #x0A33) (#x0A35 #x0A36) (#x0A38 #x0A39)
+ (#x0A59 #x0A5C) (#x0A5E #x0A5E) (#x0A72 #x0A74) (#x0A85 #x0A8B)
+ (#x0A8D #x0A8D) (#x0A8F #x0A91) (#x0A93 #x0AA8) (#x0AAA #x0AB0)
+ (#x0AB2 #x0AB3) (#x0AB5 #x0AB9) (#x0ABD #x0ABD) (#x0AE0 #x0AE0)
+ (#x0B05 #x0B0C) (#x0B0F #x0B10) (#x0B13 #x0B28) (#x0B2A #x0B30)
+ (#x0B32 #x0B33) (#x0B36 #x0B39) (#x0B3D #x0B3D) (#x0B5C #x0B5D)
+ (#x0B5F #x0B61) (#x0B85 #x0B8A) (#x0B8E #x0B90) (#x0B92 #x0B95)
+ (#x0B99 #x0B9A) (#x0B9C #x0B9C) (#x0B9E #x0B9F) (#x0BA3 #x0BA4)
+ (#x0BA8 #x0BAA) (#x0BAE #x0BB5) (#x0BB7 #x0BB9) (#x0C05 #x0C0C)
+ (#x0C0E #x0C10) (#x0C12 #x0C28) (#x0C2A #x0C33) (#x0C35 #x0C39)
+ (#x0C60 #x0C61) (#x0C85 #x0C8C) (#x0C8E #x0C90) (#x0C92 #x0CA8)
+ (#x0CAA #x0CB3) (#x0CB5 #x0CB9) (#x0CDE #x0CDE) (#x0CE0 #x0CE1)
+ (#x0D05 #x0D0C) (#x0D0E #x0D10) (#x0D12 #x0D28) (#x0D2A #x0D39)
+ (#x0D60 #x0D61) (#x0E01 #x0E2E) (#x0E30 #x0E30) (#x0E32 #x0E33)
+ (#x0E40 #x0E45) (#x0E81 #x0E82) (#x0E84 #x0E84) (#x0E87 #x0E88)
+ (#x0E8A #x0E8A) (#x0E8D #x0E8D) (#x0E94 #x0E97) (#x0E99 #x0E9F)
+ (#x0EA1 #x0EA3) (#x0EA5 #x0EA5) (#x0EA7 #x0EA7) (#x0EAA #x0EAB)
+ (#x0EAD #x0EAE) (#x0EB0 #x0EB0) (#x0EB2 #x0EB3) (#x0EBD #x0EBD)
+ (#x0EC0 #x0EC4) (#x0F40 #x0F47) (#x0F49 #x0F69) (#x10A0 #x10C5)
+ (#x10D0 #x10F6) (#x1100 #x1100) (#x1102 #x1103) (#x1105 #x1107)
+ (#x1109 #x1109) (#x110B #x110C) (#x110E #x1112) (#x113C #x113C)
+ (#x113E #x113E) (#x1140 #x1140) (#x114C #x114C) (#x114E #x114E)
+ (#x1150 #x1150) (#x1154 #x1155) (#x1159 #x1159) (#x115F #x1161)
+ (#x1163 #x1163) (#x1165 #x1165) (#x1167 #x1167) (#x1169 #x1169)
+ (#x116D #x116E) (#x1172 #x1173) (#x1175 #x1175) (#x119E #x119E)
+ (#x11A8 #x11A8) (#x11AB #x11AB) (#x11AE #x11AF) (#x11B7 #x11B8)
+ (#x11BA #x11BA) (#x11BC #x11C2) (#x11EB #x11EB) (#x11F0 #x11F0)
+ (#x11F9 #x11F9) (#x1E00 #x1E9B) (#x1EA0 #x1EF9) (#x1F00 #x1F15)
+ (#x1F18 #x1F1D) (#x1F20 #x1F45) (#x1F48 #x1F4D) (#x1F50 #x1F57)
+ (#x1F59 #x1F59) (#x1F5B #x1F5B) (#x1F5D #x1F5D) (#x1F5F #x1F7D)
+ (#x1F80 #x1FB4) (#x1FB6 #x1FBC) (#x1FBE #x1FBE) (#x1FC2 #x1FC4)
+ (#x1FC6 #x1FCC) (#x1FD0 #x1FD3) (#x1FD6 #x1FDB) (#x1FE0 #x1FEC)
+ (#x1FF2 #x1FF4) (#x1FF6 #x1FFC) (#x2126 #x2126) (#x212A #x212B)
+ (#x212E #x212E) (#x2180 #x2182) (#x3041 #x3094) (#x30A1 #x30FA)
+ (#x3105 #x312C) (#xAC00 #xD7A3)))
+ (ideographic-ranges #((#x3007 #x3007) (#x3021 #x3029)(#x4E00 #x9FA5)))
+ (combining-char-ranges
+ #((#x0300 #x0345) (#x0360 #x0361) (#x0483 #x0486) (#x0591 #x05A1)
+ (#x05A3 #x05B9) (#x05BB #x05BD) (#x05BF #x05BF) (#x05C1 #x05C2)
+ (#x05C4 #x05C4) (#x064B #x0652) (#x0670 #x0670) (#x06D6 #x06DC)
+ (#x06DD #x06DF) (#x06E0 #x06E4) (#x06E7 #x06E8) (#x06EA #x06ED)
+ (#x0901 #x0903) (#x093C #x093C) (#x093E #x094C) (#x094D #x094D)
+ (#x0951 #x0954) (#x0962 #x0963) (#x0981 #x0983) (#x09BC #x09BC)
+ (#x09BE #x09BE) (#x09BF #x09BF) (#x09C0 #x09C4) (#x09C7 #x09C8)
+ (#x09CB #x09CD) (#x09D7 #x09D7) (#x09E2 #x09E3) (#x0A02 #x0A02)
+ (#x0A3C #x0A3C) (#x0A3E #x0A3E) (#x0A3F #x0A3F) (#x0A40 #x0A42)
+ (#x0A47 #x0A48) (#x0A4B #x0A4D) (#x0A70 #x0A71) (#x0A81 #x0A83)
+ (#x0ABC #x0ABC) (#x0ABE #x0AC5) (#x0AC7 #x0AC9) (#x0ACB #x0ACD)
+ (#x0B01 #x0B03) (#x0B3C #x0B3C) (#x0B3E #x0B43) (#x0B47 #x0B48)
+ (#x0B4B #x0B4D) (#x0B56 #x0B57) (#x0B82 #x0B83) (#x0BBE #x0BC2)
+ (#x0BC6 #x0BC8) (#x0BCA #x0BCD) (#x0BD7 #x0BD7) (#x0C01 #x0C03)
+ (#x0C3E #x0C44) (#x0C46 #x0C48) (#x0C4A #x0C4D) (#x0C55 #x0C56)
+ (#x0C82 #x0C83) (#x0CBE #x0CC4) (#x0CC6 #x0CC8) (#x0CCA #x0CCD)
+ (#x0CD5 #x0CD6) (#x0D02 #x0D03) (#x0D3E #x0D43) (#x0D46 #x0D48)
+ (#x0D4A #x0D4D) (#x0D57 #x0D57) (#x0E31 #x0E31) (#x0E34 #x0E3A)
+ (#x0E47 #x0E4E) (#x0EB1 #x0EB1) (#x0EB4 #x0EB9) (#x0EBB #x0EBC)
+ (#x0EC8 #x0ECD) (#x0F18 #x0F19) (#x0F35 #x0F35) (#x0F37 #x0F37)
+ (#x0F39 #x0F39) (#x0F3E #x0F3E) (#x0F3F #x0F3F) (#x0F71 #x0F84)
+ (#x0F86 #x0F8B) (#x0F90 #x0F95) (#x0F97 #x0F97) (#x0F99 #x0FAD)
+ (#x0FB1 #x0FB7) (#x0FB9 #x0FB9) (#x20D0 #x20DC) (#x20E1 #x20E1)
+ (#x302A #x302F) (#x3099 #x3099) (#x309A #x309A))
+ )
+ (digit-ranges
+ #((#x0030 #x0039) (#x0660 #x0669) (#x06F0 #x06F9) (#x0966 #x096F)
+ (#x09E6 #x09EF) (#x0A66 #x0A6F) (#x0AE6 #x0AEF) (#x0B66 #x0B6F)
+ (#x0BE7 #x0BEF) (#x0C66 #x0C6F) (#x0CE6 #x0CEF) (#x0D66 #x0D6F)
+ (#x0E50 #x0E59) (#x0ED0 #x0ED9) (#x0F20 #x0F29)))
+ (extender-ranges
+ #((#x00B7 #x00B7) (#x02D0 #x02D0) (#x02D1 #x02D1) (#x0387 #x0387)
+ (#x0640 #x0640) (#x0E46 #x0E46) (#x0EC6 #x0EC6) (#x3005 #x3005)
+ (#x3031 #x3035) (#x309D #x309E) (#x30FC #x30FE))))
(labels
- ((name-start-rune-p (rune)
+ ((rune-in-range-p (code range-vector)
+ (declare (type simple-vector range-vector))
+ ;;we were always dealing with a sorted vector... bin search it
+
+ (let ((start 0)
+ (end (length range-vector)))
+ (while (< start end)
+ (let ((mid-index (+ start (floor (- end start) 2))))
+ (destructuring-bind (mid-item-low mid-item-high)
+ (aref range-vector mid-index)
+ (cond
+ ((< mid-item-high code)
+ (setf start (1+ mid-index)))
+ ((< code mid-item-low)
+ (setf end mid-index))
+ (t
+ (return t))))))))
+
+ (name-start-rune-p (rune)
(or (letter-rune-p rune)
(= #.(char-code #\_) rune)
(= #.(char-code #\:) rune)))
@@ -33,193 +139,47 @@
(ideographic-rune-p rune)))
(digit-rune-p* (rune)
- (or (<= 48 rune 57)
- (<= 1632 rune 1641)
- (<= 1776 rune 1785)
- (<= 2406 rune 2415)
- (<= 2534 rune 2543)
- (<= 2662 rune 2671)
- (<= 2790 rune 2799)
- (<= 2918 rune 2927)
- (<= 3047 rune 3055)
- (<= 3174 rune 3183)
- (<= 3302 rune 3311)
- (<= 3430 rune 3439)
- (<= 3664 rune 3673)
- (<= 3792 rune 3801)
- (<= 3872 rune 3881)))
+ (rune-in-range-p rune digit-ranges))
(combining-rune-p (rune)
- (or (<= 768 rune 837)
- (<= 864 rune 865)
- (<= 1155 rune 1158)
- (<= 1425 rune 1441)
- (<= 1443 rune 1465)
- (<= 1467 rune 1469)
- (= 1471 rune)
- (<= 1473 rune 1474)
- (= 1476 rune)
- (<= 1611 rune 1618)
- (= 1648 rune)
- (<= 1750 rune 1756)
- (<= 1757 rune 1759)
- (<= 1760 rune 1764)
- (<= 1767 rune 1768)
- (<= 1770 rune 1773)
- (<= 2305 rune 2307)
- (= 2364 rune)
- (<= 2366 rune 2380)
- (= 2381 rune)
- (<= 2385 rune 2388)
- (<= 2402 rune 2403)
- (<= 2433 rune 2435)
- (= 2492 rune)
- (= 2494 rune)
- (= 2495 rune)
- (<= 2496 rune 2500)
- (<= 2503 rune 2504)
- (<= 2507 rune 2509)
- (= 2519 rune)
- (<= 2530 rune 2531)
- (= 2562 rune)
- (= 2620 rune)
- (= 2622 rune)
- (= 2623 rune)
- (<= 2624 rune 2626)
- (<= 2631 rune 2632)
- (<= 2635 rune 2637)
- (<= 2672 rune 2673)
- (<= 2689 rune 2691)
- (= 2748 rune)
- (<= 2750 rune 2757)
- (<= 2759 rune 2761)
- (<= 2763 rune 2765)
- (<= 2817 rune 2819)
- (= 2876 rune)
- (<= 2878 rune 2883)
- (<= 2887 rune 2888)
- (<= 2891 rune 2893)
- (<= 2902 rune 2903)
- (<= 2946 rune 2947)
- (<= 3006 rune 3010)
- (<= 3014 rune 3016)
- (<= 3018 rune 3021)
- (= 3031 rune)
- (<= 3073 rune 3075)
- (<= 3134 rune 3140)
- (<= 3142 rune 3144)
- (<= 3146 rune 3149)
- (<= 3157 rune 3158)
- (<= 3202 rune 3203)
- (<= 3262 rune 3268)
- (<= 3270 rune 3272)
- (<= 3274 rune 3277)
- (<= 3285 rune 3286)
- (<= 3330 rune 3331)
- (<= 3390 rune 3395)
- (<= 3398 rune 3400)
- (<= 3402 rune 3405)
- (= 3415 rune)
- (= 3633 rune)
- (<= 3636 rune 3642)
- (<= 3655 rune 3662)
- (= 3761 rune)
- (<= 3764 rune 3769)
- (<= 3771 rune 3772)
- (<= 3784 rune 3789)
- (<= 3864 rune 3865)
- (= 3893 rune)
- (= 3895 rune)
- (= 3897 rune)
- (= 3902 rune)
- (= 3903 rune)
- (<= 3953 rune 3972)
- (<= 3974 rune 3979)
- (<= 3984 rune 3989)
- (= 3991 rune)
- (<= 3993 rune 4013)
- (<= 4017 rune 4023)
- (= 4025 rune)
- (<= 8400 rune 8412)
- (= 8417 rune)
- (<= 12330 rune 12335)
- (= 12441 rune)
- (= 12442 rune)))
+ (rune-in-range-p rune combining-char-ranges))
(extender-rune-p (rune)
- (or
- (= 183 rune)
- (= 720 rune)
- (= 721 rune)
- (= 903 rune)
- (= 1600 rune)
- (= 3654 rune)
- (= 3782 rune)
- (= 12293 rune)
- (<= 12337 rune 12341)
- (<= 12445 rune 12446)
- (<= 12540 rune 12542)))
+ (rune-in-range-p rune extender-ranges))
(base-rune-p (rune)
- (or
- (<= 65 rune 90) (<= 97 rune 122) (<= 192 rune 214) (<= 216 rune 246) (<= 248 rune 255) (<= 256 rune 305)
- (<= 308 rune 318) (<= 321 rune 328) (<= 330 rune 382) (<= 384 rune 451) (<= 461 rune 496) (<= 500 rune 501)
- (<= 506 rune 535) (<= 592 rune 680) (<= 699 rune 705) (= 902 rune) (<= 904 rune 906) (= 908 rune)
- (<= 910 rune 929) (<= 931 rune 974) (<= 976 rune 982) (= 986 rune) (= 988 rune) (= 990 rune) (= 992 rune)
- (<= 994 rune 1011) (<= 1025 rune 1036) (<= 1038 rune 1103) (<= 1105 rune 1116) (<= 1118 rune 1153)
- (<= 1168 rune 1220) (<= 1223 rune 1224) (<= 1227 rune 1228) (<= 1232 rune 1259) (<= 1262 rune 1269)
- (<= 1272 rune 1273) (<= 1329 rune 1366) (= 1369 rune) (<= 1377 rune 1414) (<= 1488 rune 1514)
- (<= 1520 rune 1522) (<= 1569 rune 1594) (<= 1601 rune 1610) (<= 1649 rune 1719) (<= 1722 rune 1726)
- (<= 1728 rune 1742) (<= 1744 rune 1747) (= 1749 rune) (<= 1765 rune 1766) (<= 2309 rune 2361) (= 2365 rune)
- (<= 2392 rune 2401) (<= 2437 rune 2444) (<= 2447 rune 2448) (<= 2451 rune 2472) (<= 2474 rune 2480)
- (= 2482 rune) (<= 2486 rune 2489) (<= 2524 rune 2525) (<= 2527 rune 2529) (<= 2544 rune 2545)
- (<= 2565 rune 2570) (<= 2575 rune 2576) (<= 2579 rune 2600) (<= 2602 rune 2608) (<= 2610 rune 2611)
- (<= 2613 rune 2614) (<= 2616 rune 2617) (<= 2649 rune 2652) (= 2654 rune) (<= 2674 rune 2676)
- (<= 2693 rune 2699) (= 2701 rune) (<= 2703 rune 2705) (<= 2707 rune 2728) (<= 2730 rune 2736)
- (<= 2738 rune 2739) (<= 2741 rune 2745) (= 2749 rune) (= 2784 rune) (<= 2821 rune 2828) (<= 2831 rune 2832)
- (<= 2835 rune 2856) (<= 2858 rune 2864) (<= 2866 rune 2867) (<= 2870 rune 2873) (= 2877 rune)
- (<= 2908 rune 2909) (<= 2911 rune 2913) (<= 2949 rune 2954) (<= 2958 rune 2960) (<= 2962 rune 2965)
- (<= 2969 rune 2970) (= 2972 rune) (<= 2974 rune 2975) (<= 2979 rune 2980) (<= 2984 rune 2986)
- (<= 2990 rune 2997) (<= 2999 rune 3001) (<= 3077 rune 3084) (<= 3086 rune 3088) (<= 3090 rune 3112)
- (<= 3114 rune 3123) (<= 3125 rune 3129) (<= 3168 rune 3169) (<= 3205 rune 3212) (<= 3214 rune 3216)
- (<= 3218 rune 3240) (<= 3242 rune 3251) (<= 3253 rune 3257) (= 3294 rune) (<= 3296 rune 3297)
- (<= 3333 rune 3340) (<= 3342 rune 3344) (<= 3346 rune 3368) (<= 3370 rune 3385) (<= 3424 rune 3425)
- (<= 3585 rune 3630) (= 3632 rune) (<= 3634 rune 3635) (<= 3648 rune 3653) (<= 3713 rune 3714) (= 3716 rune)
- (<= 3719 rune 3720) (= 3722 rune) (= 3725 rune) (<= 3732 rune 3735) (<= 3737 rune 3743) (<= 3745 rune 3747)
- (= 3749 rune) (= 3751 rune) (<= 3754 rune 3755) (<= 3757 rune 3758) (= 3760 rune) (<= 3762 rune 3763) (= 3773 rune)
- (<= 3776 rune 3780) (<= 3904 rune 3911) (<= 3913 rune 3945) (<= 4256 rune 4293) (<= 4304 rune 4342)
- (= 4352 rune) (<= 4354 rune 4355) (<= 4357 rune 4359) (= 4361 rune) (<= 4363 rune 4364) (<= 4366 rune 4370)
- (= 4412 rune) (= 4414 rune) (= 4416 rune) (= 4428 rune) (= 4430 rune) (= 4432 rune) (<= 4436 rune 4437) (= 4441 rune)
- (<= 4447 rune 4449) (= 4451 rune) (= 4453 rune) (= 4455 rune) (= 4457 rune) (<= 4461 rune 4462) (<= 4466 rune 4467)
- (= 4469 rune) (= 4510 rune) (= 4520 rune) (= 4523 rune) (<= 4526 rune 4527) (<= 4535 rune 4536) (= 4538 rune)
- (<= 4540 rune 4546) (= 4587 rune) (= 4592 rune) (= 4601 rune) (<= 7680 rune 7835) (<= 7840 rune 7929)
- (<= 7936 rune 7957) (<= 7960 rune 7965) (<= 7968 rune 8005) (<= 8008 rune 8013) (<= 8016 rune 8023)
- (= 8025 rune) (= 8027 rune) (= 8029 rune) (<= 8031 rune 8061) (<= 8064 rune 8116) (<= 8118 rune 8124) (= 8126 rune)
- (<= 8130 rune 8132) (<= 8134 rune 8140) (<= 8144 rune 8147) (<= 8150 rune 8155) (<= 8160 rune 8172)
- (<= 8178 rune 8180) (<= 8182 rune 8188) (= 8486 rune) (<= 8490 rune 8491) (= 8494 rune) (<= 8576 rune 8578)
- (<= 12353 rune 12436) (<= 12449 rune 12538) (<= 12549 rune 12588) (<= 44032 rune 55203)))
+ (rune-in-range-p rune base-char-ranges))
(ideographic-rune-p (rune)
- (or (<= 19968 rune 40869) (= 12295 rune) (<= 12321 rune 12329)))
+ (rune-in-range-p rune ideographic-ranges))
(predicate-to-bv (p)
- (let ((r (make-array *max* :element-type 'bit :initial-element 0)))
- (dotimes (i #x10000 r)
+ (let ((r (make-array +max+ :element-type 'bit :initial-element 0)))
+ (dotimes (i +max+ r)
(when (funcall p i)
(setf (aref r i) 1))))) )
`(progn
- (DEFSUBST NAME-RUNE-P (RUNE)
- (SETF RUNE (RUNE-CODE RUNE))
- (AND (<= 0 RUNE ,*max*)
- (LOCALLY (DECLARE (OPTIMIZE (SAFETY 0) (SPEED 3)))
- (= 1 (SBIT ',(predicate-to-bv #'name-rune-p)
- (THE FIXNUM RUNE))))))
- (DEFSUBST NAME-START-RUNE-P (RUNE)
- (SETF RUNE (RUNE-CODE RUNE))
- (AND (<= 0 RUNE ,*MAX*)
- (LOCALLY (DECLARE (OPTIMIZE (SAFETY 0) (SPEED 3)))
- (= 1 (SBIT ',(predicate-to-bv #'name-start-rune-p)
- (THE FIXNUM RUNE)))))))) ))))
+ (DEFINLINE NAME-RUNE-P (RUNE)
+ (SETF RUNE (RUNE-CODE RUNE))
+ (LOCALLY (DECLARE (OPTIMIZE (SAFETY 0) (SPEED 3))
+ (type fixnum rune))
+ (AND (<= 0 RUNE ,+max+)
+ (= 1 (SBIT ',(predicate-to-bv #'name-rune-p)
+ RUNE)))))
+ (DEFINLINE NAME-START-RUNE-P (RUNE)
+ (SETF RUNE (RUNE-CODE RUNE))
+ (LOCALLY (DECLARE (OPTIMIZE (SAFETY 0) (SPEED 3))
+ (type fixnum rune))
+ (AND (<= 0 RUNE ,+MAX+)
+ (= 1 (SBIT ',(predicate-to-bv #'name-start-rune-p)
+ RUNE)))))
+ (definline valid-name-p (rod)
+ (and (plusp (length rod))
+ (name-start-rune-p (elt rod 0))
+ (every #'name-rune-p rod)))
+ (definline valid-nmtoken-p (rod)
+ (and (plusp (length rod))
+ (every #'name-rune-p rod)))))))))
Modified: branches/grin-neu/thirdparty/cxml/xml/xml-parse.lisp
===================================================================
--- branches/grin-neu/thirdparty/cxml/xml/xml-parse.lisp 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/cxml/xml/xml-parse.lisp 2006-12-01 10:39:49 UTC (rev 2094)
@@ -5,12 +5,13 @@
;;; Author: Gilbert Baumann <unk6(a)rz.uni-karlsruhe.de>
;;; Author: Henrik Motakef <hmot(a)henrik-motakef.de>
;;; Author: David Lichteblau <david(a)lichteblau.com>
-;;; License: LGPL (See file COPYING for details).
+;;; License: Lisp-LGPL (See file COPYING for details).
;;; ---------------------------------------------------------------------------
-;;; copyright 1999 by Gilbert Baumann
-;;; copyright 2003 by Henrik Motakef
-;;; copyright 2004 knowledgeTools Int. GmbH
-;;; copyright 2004 David Lichteblau
+;;; (c) copyright 1999 by Gilbert Baumann
+;;; (c) copyright 2003 by Henrik Motakef
+;;; (c) copyright 2004 knowledgeTools Int. GmbH
+;;; (c) copyright 2004 David Lichteblau
+;;; (c) copyright 2005 David Lichteblau
;;; This library is free software; you can redistribute it and/or
;;; modify it under the terms of the GNU Library General Public
@@ -23,8 +24,8 @@
;;; Library General Public License for more details.
;;;
;;; You should have received a copy of the GNU Library General Public
-;;; License along with this library; if not, write to the
-;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;;; License along with this library; if not, write to the
+;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
;;; Boston, MA 02111-1307 USA.
;;; Streams
@@ -62,7 +63,7 @@
;; slot of zstreams instead).
;; Common
-;; :xml-pi (<target> . <content>) ;processing-instruction starting with "<?xml"
+;; :xml-decl (<target> . <content>) ;processing-instruction starting with "<?xml"
;; :pi (<target> . <content>) ;processing-instruction
;; :stag (<name> . <atts>) ;start tag
;; :etag (<name> . <atts>) ;end tag
@@ -77,13 +78,13 @@
;; *data-behaviour* = :DTD
;;
-;; :name <interned-rod>
+;; :nmtoken <interned-rod>
;; :#required
;; :#implied
;; :#fixed
;; :#pcdata
;; :s
-;; :\[ :\] :\( :\) :|\ :\> :\" :\' :\, :\? :\* :\+
+;; :\[ :\] :\( :\) :|\ :\> :\" :\' :\, :\? :\* :\+
;; *data-behaviour* = :DOC
;;
@@ -91,29 +92,8 @@
;; :cdata <rod>
-
-
-;;; NOTES
-;;
-;; Stream buffers as well as RODs are supposed to be encoded in
-;; UTF-16.
-
-;; where does the time go?
-;; DATA-RUNE-P
-;; CANON-NOT-CDATA-ATTVAL
-;; READ-ATTVAL (MUFFLE)
-;; CLOSy DOM
-;; UTF-8 decoder (13%)
-;; READ-ATTVAL (10%)
-;;
-
;;; TODO
;;
-;; o Improve error messages:
-;; - line and column number counters
-;; - better texts
-;; - better handling of errors (no crash'n burn behaviour)
-;;
;; o provide for a faster DOM
;;
;; o morph zstream into a context object and thus also get rid of
@@ -132,58 +112,24 @@
;;
;; o max depth together with circle detection
;; (or proof, that our circle detection is enough).
+;; [gemeint ist zstream-push--david]
;;
-;; o element definitions (with att definitions in the elements)
-;; [das haben wir doch, oder?]
-;;
-;; o store entities in the DTD
-;;
;; o better extensibility wrt character representation, one may want to
;; have
-;; - UTF-8 in standard CL strings
-;; - UCS-2 in RODs
-;; - UTF-16 in RODs
;; - UCS-4 in vectoren
-;; [habe ich eigentlich nicht vor--david]
;;
;; o xstreams auslagern, documententieren und dann auch in SGML und
;; CSS parser verwenden. (halt alles was zeichen liest).
;; [ausgelagert sind sie; dokumentiert "so la la"; die Reintegration
;; in Closure ist ein ganz anderes Thema]
;;
-;; o merge node representation with SGML module
-;; [???]
-;;
-;; o line/column number recording
-;;
-;; o better error messages
-;;
;; o recording of source locations for nodes.
;;
-;; o make the *scratch-pad* hack safe
-;;
;; o based on the DTD and xml:space attribute implement HTML white
;; space rules.
;;
;; o on a parser option, do not expand external entities.
-;;
-;; o does the user need the distinction between "" and " " ?
-;; That is literal and 'quoted' white space.
-;; [verstehe ich nicht --david]
-;;
-;; o on an option merge CDATA section;
-;;
-;; o data in parse tree? extra nodes like in SGML?!
-;;
-;; o what to store in the node-gi field? Some name object or the
-;; string used?
-;;
-;; Test that fail:
-;;
-;; not-wf/sa/128 is false a alarm
-;;
-
;;;; Validity constraints:
;;;; (00) Root Element Type like (03), c.f. MAKE-ROOT-MODEL
;;;; (01) Proper Declaration/PE Nesting P/MARKUP-DECL
@@ -231,34 +177,46 @@
;;; parser context
-(defvar *ctx*)
+(defvar *ctx* nil)
-;; forward declaration for DEFVAR
-(declaim (special *default-namespace-bindings*))
-
(defstruct (context (:conc-name nil))
handler
- (namespace-bindings *default-namespace-bindings*)
(dtd nil)
model-stack
(referenced-notations '())
(id-table (%make-rod-hash-table))
+ ;; FIXME: Wofuer ist name-hashtable da? Will man das wissen?
+ (name-hashtable (make-rod-hashtable :size 2000))
(standalone-p nil)
(entity-resolver nil)
- (disallow-internal-subset nil))
+ (disallow-internal-subset nil)
+ main-zstream)
-(defvar *expand-pe-p*)
+(defvar *expand-pe-p* nil)
+(defparameter *namespace-bindings*
+ '((#"" . nil)
+ (#"xmlns" . #"http://www.w3.org/2000/xmlns/")
+ (#"xml" . #"http://www.w3.org/XML/1998/namespace")))
+
;;;; ---------------------------------------------------------------------------
;;;; xstreams
;;;;
-(defstruct (stream-name (:type list))
+(defstruct (stream-name
+ (:print-function print-stream-name))
entity-name
entity-kind
uri)
+(defun print-stream-name (object stream depth)
+ (declare (ignore depth))
+ (format stream "[~A ~S ~A]"
+ (rod-string (stream-name-entity-name object))
+ (stream-name-entity-kind object)
+ (stream-name-uri object)))
+
(deftype read-element () 'rune)
(defun call-with-open-xstream (fn stream)
@@ -279,39 +237,6 @@
(defmacro with-open-xfile ((stream &rest open-args) &body body)
`(call-with-open-xfile (lambda (,stream) .,body) .,open-args))
-;;; Decoders
-
-;; The decoders share a common signature:
-;;
-;; DECODE input input-start input-end
-;; output output-start output-end
-;; eof-p
-;; -> first-not-written ; first-not-read
-;;
-;; These decode functions should decode as much characters off `input'
-;; into the `output' as possible and return the indexes to the first
-;; not read and first not written element of `input' and `output'
-;; respectively. If there are not enough bytes in `input' to decode a
-;; full character, decoding shold be abandomed; the caller has to
-;; ensure that the remaining bytes of `input' are passed to the
-;; decoder again with more bytes appended.
-;;
-;; `eof-p' now in turn indicates, if the given input sequence, is all
-;; the producer does have and might be used to produce error messages
-;; in case of incomplete codes or decided what to do.
-;;
-;; Decoders are expected to handle the various CR/NL conventions and
-;; canonicalize each end of line into a single NL rune (#xA) in good
-;; old Lisp tradition.
-;;
-
-;; TODO: change this to an encoding class, which then might carry
-;; additional state. Stateless encodings could been represented by
-;; keywords. e.g.
-;;
-;; defmethod DECODE-SEQUENCE ((encoding (eql :utf-8)) ...)
-;;
-
;;;; -------------------------------------------------------------------
;;;; Rechnen mit Runen
;;;;
@@ -319,9 +244,9 @@
;; Let us first define fast fixnum arithmetric get rid of type
;; checks. (After all we know what we do here).
-(defmacro fx-op (op &rest xs)
+(defmacro fx-op (op &rest xs)
`(the fixnum (,op ,@(mapcar (lambda (x) `(the fixnum ,x)) xs))))
-(defmacro fx-pred (op &rest xs)
+(defmacro fx-pred (op &rest xs)
`(,op ,@(mapcar (lambda (x) `(the fixnum ,x)) xs)))
(defmacro %+ (&rest xs) `(fx-op + ,@xs))
@@ -342,9 +267,9 @@
;;; XXX Geschwindigkeit dieser Definitionen untersuchen!
-(defmacro rune-op (op &rest xs)
+(defmacro rune-op (op &rest xs)
`(code-rune (,op ,@(mapcar (lambda (x) `(rune-code ,x)) xs))))
-(defmacro rune-pred (op &rest xs)
+(defmacro rune-pred (op &rest xs)
`(,op ,@(mapcar (lambda (x) `(rune-code ,x)) xs)))
(defmacro %rune+ (&rest xs) `(rune-op + ,@xs))
@@ -370,7 +295,7 @@
;;; make-rod-hashtable
;;; rod-hash-get hashtable rod &optional start end -> value ; successp
;;; (setf (rod-hash-get hashtable rod &optional start end) new-value
-;;;
+;;;
(defstruct (rod-hashtable (:constructor make-rod-hashtable/low))
size ;size of table
@@ -378,7 +303,7 @@
)
(defun make-rod-hashtable (&key (size 200))
- (setf size (runes::nearest-greater-prime size))
+ (setf size (nearest-greater-prime size))
(make-rod-hashtable/low
:size size
:table (make-array size :initial-element nil)))
@@ -392,13 +317,13 @@
(1- (expt 2 +fixnum-bits+))
"Pessimistic approximation of the largest bit-mask, still being a fixnum."))
-(defsubst stir (a b)
+(definline stir (a b)
(%and +fixnum-mask+
(%xor (%ior (%ash (%and a #.(ash +fixnum-mask+ -5)) 5)
(%ash a #.(- 5 +fixnum-bits+)))
b)))
-(defsubst rod-hash (rod start end)
+(definline rod-hash (rod start end)
"Compute a hash code out of a rod."
(let ((res (%- end start)))
(do ((i start (%+ i 1)))
@@ -407,7 +332,7 @@
(setf res (stir res (rune-code (%rune rod i)))))
res))
-(defsubst rod=* (x y &key (start1 0) (end1 (length x))
+(definline rod=* (x y &key (start1 0) (end1 (length x))
(start2 0) (end2 (length y)))
(and (%= (%- end1 start1) (%- end2 start2))
(do ((i start1 (%+ i 1))
@@ -417,7 +342,7 @@
(unless (rune= (%rune x i) (%rune y j))
(return nil)))))
-(defsubst rod=** (x y start1 end1 start2 end2)
+(definline rod=** (x y start1 end1 start2 end2)
(and (%= (%- end1 start1) (%- end2 start2))
(do ((i start1 (%+ i 1))
(j start2 (%+ j 1)))
@@ -500,14 +425,12 @@
(defun (setf rod-hash-get) (new-value hashtable rod &optional (start 0) (end (length rod)))
(rod-hash-set new-value hashtable rod start end))
-(defparameter *name-hashtable* (make-rod-hashtable :size 2000))
-
(defun intern-name (rod &optional (start 0) (end (length rod)))
- (multiple-value-bind (value successp key) (rod-hash-get *name-hashtable* rod start end)
+ (multiple-value-bind (value successp key) (rod-hash-get (name-hashtable *ctx*) rod start end)
(declare (ignore value))
(if successp
key
- (nth-value 1 (rod-hash-set t *name-hashtable* rod start end)))))
+ (nth-value 1 (rod-hash-set t (name-hashtable *ctx*) rod start end)))))
;;;; ---------------------------------------------------------------------------
;;;;
@@ -554,8 +477,8 @@
(,i 0)
(,b ,scratch))
(declare (type fixnum ,n ,i))
- (macrolet
- ((,collect (x)
+ (macrolet
+ ((,collect (x)
`((lambda (x)
(locally
(declare #.*fast*)
@@ -575,7 +498,7 @@
`(let ((,rod (make-rod ,i)))
(while (not (%= ,i 0))
(setf ,i (%- ,i 1))
- (setf (%rune ,rod ,i)
+ (setf (%rune ,rod ,i)
(aref (the (simple-array rune (*)) ,b) ,i)))
,rod))
(:raw
@@ -590,8 +513,8 @@
`(let ((,n (length ,scratch))
(,i 0))
(declare (type fixnum ,n ,i))
- (macrolet
- ((,collect (x)
+ (macrolet
+ ((,collect (x)
`((lambda (x)
(locally
(declare #.*fast*)
@@ -611,7 +534,7 @@
`(let ((,rod (make-rod ,i)))
(while (%> ,i 0)
(setf ,i (%- ,i 1))
- (setf (%rune ,rod ,i)
+ (setf (%rune ,rod ,i)
(aref (the (simple-array rune (*)) ,scratch) ,i)))
,rod))
(:raw
@@ -670,16 +593,72 @@
;;;; DTD
;;;;
-(define-condition parser-error (simple-error) ())
-(define-condition validity-error (parser-error) ())
+(define-condition xml-parse-error (simple-error) ())
+(define-condition well-formedness-violation (xml-parse-error) ())
+(define-condition validity-error (xml-parse-error) ())
-(defun validity-error (x &rest args)
- (error 'validity-error
- :format-control "Validity constraint violated: ~@?"
- :format-arguments (list x args)))
+;; We make some effort to signal end of file as a special condition, but we
+;; don't actually try very hard. Not sure whether we should. Right now I
+;; would prefer not to document this class.
+(define-condition end-of-xstream (well-formedness-violation) ())
+(defun describe-xstream (x s)
+ (format s " Line ~D, column ~D in ~A~%"
+ (xstream-line-number x)
+ (xstream-column-number x)
+ (let ((name (xstream-name x)))
+ (cond
+ ((null name)
+ "<anonymous stream>")
+ ((eq :main (stream-name-entity-kind name))
+ (stream-name-uri name))
+ (t
+ name)))))
+
+(defun %error (class stream message)
+ (let* ((zmain (if *ctx* (main-zstream *ctx*) nil))
+ (zstream (if (zstream-p stream) stream zmain))
+ (xstream (if (xstream-p stream) stream nil))
+ (s (make-string-output-stream)))
+ (write-line message s)
+ (when xstream
+ (write-line "Location:" s)
+ (describe-xstream xstream s))
+ (when zstream
+ (let ((stack
+ (remove xstream (remove :stop (zstream-input-stack zstream)))))
+ (when stack
+ (write-line "Context:" s)
+ (dolist (x stack)
+ (describe-xstream x s)))))
+ (when (and zmain (not (eq zstream zmain)))
+ (let ((stack
+ (remove xstream (remove :stop (zstream-input-stack zmain)))))
+ (when stack
+ (write-line "Context in main document:" s)
+ (dolist (x stack)
+ (describe-xstream x s)))))
+ (error class
+ :format-control "~A"
+ :format-arguments (list (get-output-stream-string s)))))
+
+(defun validity-error (fmt &rest args)
+ (%error 'validity-error
+ nil
+ (format nil "Document not valid: ~?" fmt args)))
+
+(defun wf-error (stream fmt &rest args)
+ (%error 'well-formedness-violation
+ stream
+ (format nil "Document not well-formed: ~?" fmt args)))
+
+(defun eox (stream &optional x &rest args)
+ (%error 'end-of-xstream
+ stream
+ (format nil "End of file~@[: ~?~]" x args)))
+
(defvar *validate* t)
-(defvar *markup-declaration-external-p* nil)
+(defvar *external-subset-p* nil)
(defun validate-start-element (ctx name)
(when *validate*
@@ -718,6 +697,8 @@
(elmdef (elmdef-external-p def))
(attdef (attdef-external-p def)))))
+;; attribute validation, defaulting, and normalization -- except for for
+;; uniqueness checks, which are done after namespaces have been declared
(defun process-attributes (ctx name attlist)
(let ((e (find-element name (dtd ctx))))
(cond
@@ -733,20 +714,26 @@
(t
(when (standalone-check-necessary-p ad)
(validity-error "(02) Standalone Document Declaration: missing attribute value"))
- (push (build-attribute (attdef-name ad)
- (cadr (attdef-default ad))
- nil)
+ (push (sax:make-attribute :qname (attdef-name ad)
+ :value (cadr (attdef-default ad))
+ :specified-p nil)
attlist)))))
- (dolist (a attlist) ;normalize non-CDATA values
+ (dolist (a attlist) ;normalize non-CDATA values
(let* ((qname (sax:attribute-qname a))
(adef (find-attribute e qname)))
- (when (and adef (not (eq (attdef-type adef) :CDATA)))
- (let ((canon (canon-not-cdata-attval (sax:attribute-value a))))
- (when (and (standalone-check-necessary-p adef)
- (not (rod= (sax:attribute-value a) canon)))
- (validity-error "(02) Standalone Document Declaration: attribute value not normalized"))
- (setf (sax:attribute-value a) canon)))))
- (when *validate* ;maybe validate attribute values
+ (when adef
+ (when (and *validate*
+ sax:*namespace-processing*
+ (eq (attdef-type adef) :ID)
+ (find #/: (sax:attribute-value a)))
+ (validity-error "colon in ID attribute"))
+ (unless (eq (attdef-type adef) :CDATA)
+ (let ((canon (canon-not-cdata-attval (sax:attribute-value a))))
+ (when (and (standalone-check-necessary-p adef)
+ (not (rod= (sax:attribute-value a) canon)))
+ (validity-error "(02) Standalone Document Declaration: attribute value not normalized"))
+ (setf (sax:attribute-value a) canon))))))
+ (when *validate* ;maybe validate attribute values
(dolist (a attlist)
(validate-attribute ctx e a))))
((and *validate* attlist)
@@ -768,7 +755,7 @@
(defun validate-attribute* (ctx adef value)
(let ((type (attdef-type adef))
- (default (attdef-default adef)))
+ (default (attdef-default adef)))
(when (and (listp default)
(eq (car default) :FIXED)
(not (rod= value (cadr default))))
@@ -828,14 +815,15 @@
(defstruct (internal-entdef
(:include entdef)
(:constructor make-internal-entdef (value))
- (:conc-name #:ENTDEF-))
+ (:conc-name #:entdef-))
(value (error "missing argument") :type rod)
- (expansion nil))
+ (expansion nil)
+ (external-subset-p *external-subset-p*))
(defstruct (external-entdef
(:include entdef)
(:constructor make-external-entdef (extid ndata))
- (:conc-name #:ENTDEF-))
+ (:conc-name #:entdef-))
(extid (error "missing argument") :type extid)
(ndata nil :type (or rod null)))
@@ -875,8 +863,10 @@
(defun absolute-uri (sysid source-stream)
(let ((base-sysid (zstream-base-sysid source-stream)))
- (assert (not (null base-sysid)))
- (puri:merge-uris sysid base-sysid)))
+ ;; XXX is the IF correct?
+ (if base-sysid
+ (puri:merge-uris sysid base-sysid)
+ sysid)))
(defstruct (extid (:constructor make-extid (public system)))
(public nil :type (or rod null))
@@ -890,6 +880,8 @@
(defun define-entity (source-stream name kind def)
(setf name (intern-name name))
+ (when (and sax:*namespace-processing* (find #/: name))
+ (wf-error source-stream "colon in entity name"))
(let ((table
(ecase kind
(:general (dtd-gentities (dtd *ctx*)))
@@ -901,9 +893,11 @@
(setf (entdef-extid def)
(absolute-extid source-stream (entdef-extid def))))
(setf (gethash name table)
- (cons *markup-declaration-external-p* def)))))
+ (cons *external-subset-p* def)))))
(defun get-entity-definition (entity-name kind dtd)
+ (unless dtd
+ (wf-error nil "entity not defined: ~A" (rod-string entity-name)))
(destructuring-bind (extp &rest def)
(gethash entity-name
(ecase kind
@@ -915,22 +909,32 @@
(rod-string entity-name)))
def))
-(defun entity->xstream (entity-name kind &optional zstream)
+(defun entity->xstream (zstream entity-name kind &optional internalp)
;; `zstream' is for error messages
(let ((def (get-entity-definition entity-name kind (dtd *ctx*))))
(unless def
- (if zstream
- (perror zstream "Entity '~A' is not defined." (rod-string entity-name))
- (error "Entity '~A' is not defined." (rod-string entity-name))))
+ (wf-error zstream "Entity '~A' is not defined." (rod-string entity-name)))
(let (r)
(etypecase def
(internal-entdef
+ (when (and (standalone-p *ctx*)
+ (entdef-external-subset-p def))
+ (wf-error
+ zstream
+ "entity declared in external subset, but document is standalone"))
(setf r (make-rod-xstream (entdef-value def)))
(setf (xstream-name r)
(make-stream-name :entity-name entity-name
:entity-kind kind
:uri nil)))
(external-entdef
+ (when internalp
+ (wf-error zstream
+ "entity not internal: ~A" (rod-string entity-name)))
+ (when (entdef-ndata def)
+ (wf-error zstream
+ "reference to unparsed entity: ~A"
+ (rod-string entity-name)))
(setf r (xstream-open-extid (extid-using-catalog (entdef-extid def))))
(setf (stream-name-entity-name (xstream-name r)) entity-name
(stream-name-entity-kind (xstream-name r)) kind)))
@@ -939,7 +943,7 @@
(defun checked-get-entdef (name type)
(let ((def (get-entity-definition name type (dtd *ctx*))))
(unless def
- (error "Entity '~A' is not defined." (rod-string name)))
+ (wf-error nil "Entity '~A' is not defined." (rod-string name)))
def))
(defun xstream-open-extid (extid)
@@ -955,9 +959,9 @@
:name (make-stream-name :uri sysid)
:initial-speed 1)))
-(defun call-with-entity-expansion-as-stream (zstream cont name kind)
- ;; `zstream' is for error messages -- we need something better!
- (let ((in (entity->xstream name kind zstream)))
+(defun call-with-entity-expansion-as-stream (zstream cont name kind internalp)
+ ;; `zstream' is for error messages
+ (let ((in (entity->xstream zstream name kind internalp)))
(unwind-protect
(funcall cont in)
(close-xstream in))))
@@ -984,7 +988,7 @@
; (:ENUMERATION <name>*)
default ;default value of attribute:
; :REQUIRED, :IMPLIED, (:FIXED content) or (:DEFAULT content)
- (external-p *markup-declaration-external-p*)
+ (external-p *external-subset-p*)
)
(defstruct elmdef
@@ -993,7 +997,7 @@
content ;content model [*]
attributes ;list of defined attributes
compiled-cspec ;cons of validation function for contentspec
- (external-p *markup-declaration-external-p*)
+ (external-p *external-subset-p*)
)
;; [*] in XML it is possible to define attributes before the element
@@ -1067,10 +1071,10 @@
(rod-string element-name)))))))
(sax:element-declaration (handler *ctx*) element-name content-model)
(setf (elmdef-content e) content-model)
- (setf (elmdef-external-p e) *markup-declaration-external-p*)
+ (setf (elmdef-external-p e) *external-subset-p*)
e))))
-(defvar *redefinition-warning* t)
+(defvar *redefinition-warning* nil)
(defun define-attribute (dtd element name type default)
(let ((adef (make-attdef :element element
@@ -1143,7 +1147,7 @@
(defun peek-token (input)
(cond ((zstream-token-category input)
- (values
+ (values
(zstream-token-category input)
(zstream-token-semantic input)))
(t
@@ -1199,15 +1203,15 @@
((rune= #/\+ c) :\+)
((name-rune-p c)
(unread-rune c input)
- (values :name (read-name-token input)))
+ (values :nmtoken (read-name-token input)))
((rune= #/# c)
(let ((q (read-name-token input)))
- (cond ((equalp q '#.(string-rod "REQUIRED")) :|#REQUIRED|)
- ((equalp q '#.(string-rod "IMPLIED")) :|#IMPLIED|)
- ((equalp q '#.(string-rod "FIXED")) :|#FIXED|)
- ((equalp q '#.(string-rod "PCDATA")) :|#PCDATA|)
+ (cond ((rod= q '#.(string-rod "REQUIRED")) :|#REQUIRED|)
+ ((rod= q '#.(string-rod "IMPLIED")) :|#IMPLIED|)
+ ((rod= q '#.(string-rod "FIXED")) :|#FIXED|)
+ ((rod= q '#.(string-rod "PCDATA")) :|#PCDATA|)
(t
- (error "Unknown token: ~S." q)))))
+ (wf-error zinput "Unknown token: ~S." q)))))
((or (rune= c #/U+0020)
(rune= c #/U+0009)
(rune= c #/U+000D)
@@ -1220,28 +1224,34 @@
(t
(values :%))))
(t
- (error "Unexpected character ~S." c))))
+ (wf-error zinput "Unexpected character ~S." c))))
(:DOC
- (cond
+ (cond
((rune= c #/&)
- (multiple-value-bind (kind data) (read-entity-ref input)
- (cond ((eq kind :NAMED)
- (values :ENTITY-REF data) )
- ((eq kind :NUMERIC)
+ (multiple-value-bind (kind data) (read-entity-like input)
+ (cond ((eq kind :ENTITY-REFERENCE)
+ (values :ENTITY-REF data))
+ ((eq kind :CHARACTER-REFERENCE)
(values :CDATA
(with-rune-collector (collect)
(%put-unicode-char data collect)))))))
(t
(unread-rune c input)
- (values :CDATA (read-cdata input))) ))))))))
+ (values :CDATA (read-cdata input)))))))))))
+(definline check-rune (input actual expected)
+ (unless (eql actual expected)
+ (wf-error input "expected #/~A but found #/~A"
+ (rune-char expected)
+ (rune-char actual))))
+
(defun read-pe-reference (zinput)
(let* ((input (car (zstream-input-stack zinput)))
(nam (read-name-token input)))
- (assert (rune= #/\; (read-rune input)))
+ (check-rune input #/\; (read-rune input))
(cond (*expand-pe-p*
;; no external entities here!
- (let ((i2 (entity->xstream nam :parameter)))
+ (let ((i2 (entity->xstream zinput nam :parameter)))
(zstream-push i2 zinput))
(values :S nil) ;space before inserted PE expansion.
)
@@ -1251,36 +1261,45 @@
(defun read-token-after-|<| (zinput input)
(let ((d (read-rune input)))
(cond ((eq d :eof)
- (error "EOF after '<'"))
+ (eox input "EOF after '<'"))
((rune= #/! d)
(read-token-after-|<!| input))
((rune= #/? d)
(multiple-value-bind (target content) (read-pi input)
(cond ((rod= target '#.(string-rod "xml"))
- (values :xml-pi (cons target content)))
+ (values :xml-decl (cons target content)))
((rod-equal target '#.(string-rod "XML"))
- (error "You lost -- no XML processing instructions."))
+ (wf-error zinput
+ "You lost -- no XML processing instructions."))
((and sax:*namespace-processing* (position #/: target))
- (error "Processing instruction target ~S is not a valid NcName."
- (mu target)))
+ (wf-error zinput
+ "Processing instruction target ~S is not a ~
+ valid NcName."
+ (mu target)))
(t
(values :PI (cons target content))))))
+ ((eq *data-behaviour* :DTD)
+ (unread-rune d input)
+ (unless (or (rune= #// d) (name-start-rune-p d))
+ (wf-error zinput "Expected '!' or '?' after '<' in DTD."))
+ (values :seen-< nil))
((rune= #// d)
(let ((c (peek-rune input)))
(cond ((name-start-rune-p c)
(read-tag-2 zinput input :etag))
(t
- (error "Expecting name start rune after \"</\".")))))
+ (wf-error zinput
+ "Expecting name start rune after \"</\".")))))
((name-start-rune-p d)
(unread-rune d input)
(read-tag-2 zinput input :stag))
(t
- (error "Expected '!' or '?' after '<' in DTD.")))))
+ (wf-error zinput "Expected '!' or '?' after '<' in DTD.")))))
(defun read-token-after-|<!| (input)
(let ((d (read-rune input)))
(cond ((eq d :eof)
- (error "EOF after \"<!\"."))
+ (eox input "EOF after \"<!\"."))
((name-start-rune-p d)
(unread-rune d input)
(let ((name (read-name-token input)))
@@ -1290,7 +1309,7 @@
((rod= name '#.(string-rod "NOTATION")) :|<!NOTATION|)
((rod= name '#.(string-rod "DOCTYPE")) :|<!DOCTYPE|)
(t
- (error "`<!~A' unknown." (rod-string name))))))
+ (wf-error input"`<!~A' unknown." (rod-string name))))))
((rune= #/\[ d)
(values :|<![| nil))
((rune= #/- d)
@@ -1300,10 +1319,15 @@
:COMMENT
(read-comment-content input)))
(t
- (error "Bad character ~S after \"<!-\"" d))))
+ (wf-error input"Bad character ~S after \"<!-\"" d))))
(t
- (error "Bad character ~S after \"<!\"" d)))))
+ (wf-error input "Bad character ~S after \"<!\"" d)))))
+(definline read-S? (input)
+ (while (member (peek-rune input) '(#/U+0020 #/U+0009 #/U+000A #/U+000D)
+ :test #'eql)
+ (consume-rune input)))
+
(defun read-attribute-list (zinput input imagine-space-p)
(cond ((or imagine-space-p
(let ((c (peek-rune input)))
@@ -1320,30 +1344,25 @@
(t
nil)))
-(defun read-entity-ref (input)
+(defun read-entity-like (input)
"Read an entity reference off the xstream `input'. Returns two values:
- either :NAMED <interned-rod> in case of a named entity
- or :NUMERIC <integer> in case of numeric entities.
+ either :ENTITY-REFERENCE <interned-rod> in case of a named entity
+ or :CHARACTER-REFERENCE <integer> in case of character references.
The initial #\\& is considered to be consumed already."
(let ((c (peek-rune input)))
(cond ((eq c :eof)
- (error "EOF after '&'"))
+ (eox input "EOF after '&'"))
((rune= c #/#)
- (values :NUMERIC (read-numeric-entity input)))
+ (values :CHARACTER-REFERENCE (read-character-reference input)))
(t
(unless (name-start-rune-p (peek-rune input))
- (error "Expecting name after &."))
+ (wf-error input "Expecting name after &."))
(let ((name (read-name-token input)))
(setf c (read-rune input))
(unless (rune= c #/\;)
- (perror input "Expected \";\"."))
- (values :NAMED name))))))
+ (wf-error input "Expected \";\"."))
+ (values :ENTITY-REFERENCE name))))))
-(defsubst read-S? (input)
- (while (member (peek-rune input) '(#/U+0020 #/U+0009 #/U+000A #/U+000D)
- :test #'eq)
- (consume-rune input)))
-
(defun read-tag-2 (zinput input kind)
(let ((name (read-name-token input))
(atts nil))
@@ -1353,23 +1372,23 @@
(do ((q atts (cdr q)))
((null q))
(cond ((find (caar q) (cdr q) :key #'car)
- (error "Attribute ~S has two definitions in element ~S."
- (rod-string (caar q))
- (rod-string name)))))
+ (wf-error zinput "Attribute ~S has two definitions in element ~S."
+ (rod-string (caar q))
+ (rod-string name)))))
(cond ((eq (peek-rune input) #/>)
(consume-rune input)
(values kind (cons name atts)))
((eq (peek-rune input) #//)
(consume-rune input)
- (assert (rune= #/> (read-rune input)))
+ (check-rune input #/> (read-rune input))
(values :ztag (cons name atts)))
(t
- (error "syntax error in read-tag-2.")) )))
+ (wf-error zinput "syntax error in read-tag-2.")) )))
(defun read-attribute (zinput input)
(unless (name-start-rune-p (peek-rune input))
- (error "Expected name."))
+ (wf-error zinput "Expected name."))
;; arg thanks to the post mortem nature of name space declarations,
;; we could only process the attribute values post mortem.
(let ((name (read-name-token input)))
@@ -1381,7 +1400,7 @@
(rune= c #/U+000D))))
(consume-rune input))
(unless (eq (read-rune input) #/=)
- (perror zinput "Expected \"=\"."))
+ (wf-error zinput "Expected \"=\"."))
(while (let ((c (peek-rune input)))
(and (not (eq c :eof))
(or (rune= c #/U+0020)
@@ -1389,9 +1408,7 @@
(rune= c #/U+000A)
(rune= c #/U+000D))))
(consume-rune input))
- (cons name (read-att-value-2 input))
- ;;(cons name (read-att-value zinput input :ATT t))
- ))
+ (cons name (read-att-value-2 input))))
(defun canon-not-cdata-attval (value)
;; | If the declared value is not CDATA, then the XML processor must
@@ -1413,17 +1430,20 @@
(collect c))))
value))))
-(defsubst data-rune-p (rune)
+(definline data-rune-p (rune)
;; any Unicode character, excluding the surrogate blocks, FFFE, and FFFF.
+ ;;
+ ;; FIXME: das halte ich fuer verkehrt. Surrogates als Unicode-Zeichen
+ ;; sind verboten. Das liegt hier aber nicht vor, denn wir arbeiten
+ ;; ja tatsaechlich mit UTF-16. Verboten ist es nur, wenn wir ein
+ ;; solches Zeichen beim Dekodieren finden, das wird aber eben
+ ;; in encodings.lisp bereits geprueft. --david
(let ((c (rune-code rune)))
(or (= c #x9) (= c #xA) (= c #xD)
(<= #x20 c #xD7FF)
(<= #xE000 c #xFFFD)
- ;;
(<= #xD800 c #xDBFF)
- (<= #xDC00 c #xDFFF)
- ;;
- )))
+ (<= #xDC00 c #xDFFF))))
(defun read-att-value (zinput input mode &optional canon-space-p (delim nil))
(with-rune-collector-2 (collect)
@@ -1434,25 +1454,28 @@
(cond ((eql delim c)
(return))
((eq c :eof)
- (error "EOF"))
+ (eox input "EOF"))
((rune= c #/&)
(setf c (peek-rune input))
- (cond ((rune= c #/#)
- (let ((c (read-numeric-entity input)))
+ (cond ((eql c :eof)
+ (eox input))
+ ((rune= c #/#)
+ (let ((c (read-character-reference input)))
(%put-unicode-char c collect)))
(t
(unless (name-start-rune-p (peek-rune input))
- (error "Expecting name after &."))
+ (wf-error zinput "Expecting name after &."))
(let ((name (read-name-token input)))
(setf c (read-rune input))
- (assert (rune= c #/\;))
+ (check-rune input c #/\;)
(ecase mode
(:ATT
- (recurse-on-entity
+ (recurse-on-entity
zinput name :general
(lambda (zinput)
(muffle (car (zstream-input-stack zinput))
- :eof))))
+ :eof))
+ t))
(:ENT
;; bypass, but never the less we
;; need to check for legal
@@ -1463,72 +1486,85 @@
(map nil (lambda (x) (collect x)) name)
(collect #/\; )))))))
((and (eq mode :ENT) (rune= c #/%))
- (unless (name-start-rune-p (peek-rune input))
- (error "Expecting name after %."))
+ (let ((d (peek-rune input)))
+ (when (eq d :eof)
+ (eox input))
+ (unless (name-start-rune-p d)
+ (wf-error zinput "Expecting name after %.")))
(let ((name (read-name-token input)))
(setf c (read-rune input))
- (assert (rune= c #/\;))
+ (check-rune input c #/\;)
(cond (*expand-pe-p*
- (recurse-on-entity
+ (recurse-on-entity
zinput name :parameter
(lambda (zinput)
(muffle (car (zstream-input-stack zinput))
:eof))))
(t
- (error "No PE here.")))))
+ (wf-error zinput "No PE here.")))))
((and (eq mode :ATT) (rune= c #/<))
- ;; xxx fix error message
- (cerror "Eat them in spite of this."
- "For no apparent reason #\/< is forbidden in attribute values. ~
- You lost -- next time choose SEXPR syntax.")
- (collect c))
+ (wf-error zinput "unexpected #\/<"))
((and canon-space-p (space-rune-p c))
(collect #/space))
((not (data-rune-p c))
- (error "illegal char: ~S." c))
+ (wf-error zinput "illegal char: ~S." c))
(t
(collect c)))))))
(declare (dynamic-extent #'muffle))
(muffle input (or delim
(let ((delim (read-rune input)))
- (assert (member delim '(#/\" #/\')))
+ (unless (member delim '(#/\" #/\') :test #'eql)
+ (wf-error zinput "invalid attribute delimiter"))
delim))))))
-(defun read-numeric-entity (input)
- ;; xxx eof handling
+(defun read-character-reference (input)
;; The #/& is already read
(let ((res
(let ((c (read-rune input)))
- (assert (rune= c #/#))
+ (check-rune input c #/#)
(setq c (read-rune input))
- (cond ((rune= c #/x)
+ (cond ((eql c :eof)
+ (eox input))
+ ((eql c #/x)
;; hexadecimal
(setq c (read-rune input))
- (assert (digit-rune-p c 16))
+ (when (eql c :eof)
+ (eox input))
+ (unless (digit-rune-p c 16)
+ (wf-error input "garbage in character reference"))
(prog1
(parse-integer
(with-output-to-string (sink)
(write-char (rune-char c) sink)
- (while (digit-rune-p (setq c (read-rune input)) 16)
+ (while (progn
+ (setq c (read-rune input))
+ (when (eql c :eof)
+ (eox input))
+ (digit-rune-p c 16))
(write-char (rune-char c) sink)))
:radix 16)
- (assert (rune= c #/\;)))
- )
+ (check-rune input c #/\;)))
((rune<= #/0 c #/9)
;; decimal
(prog1
(parse-integer
(with-output-to-string (sink)
(write-char (rune-char c) sink)
- (while (rune<= #/0 (setq c (read-rune input)) #/9)
+ (while (progn
+ (setq c (read-rune input))
+ (when (eql c :eof)
+ (eox input))
+ (rune<= #/0 c #/9))
(write-char (rune-char c) sink)))
:radix 10)
- (assert (rune= c #/\;))) )
+ (check-rune input c #/\;)))
(t
- (error "Bad char in numeric character entity.") )))))
+ (wf-error input "Bad char in numeric character entity."))))))
(unless (code-data-char-p res)
- (error "expansion of numeric character reference (#x~X) is no data char."
- res))
+ (wf-error
+ input
+ "expansion of numeric character reference (#x~X) is no data char."
+ res))
res))
(defun read-pi (input)
@@ -1536,71 +1572,86 @@
(let (name)
(let ((c (peek-rune input)))
(unless (name-start-rune-p c)
- (error "Expecting name after '<?'"))
+ (wf-error input "Expecting name after '<?'"))
(setf name (read-name-token input)))
- (values name
- (read-pi-content input))))
+ (cond
+ ((member (peek-rune input) '(#/U+0020 #/U+0009 #/U+000A #/U+000D)
+ :test #'eql)
+ (values name (read-pi-content input)))
+ (t
+ (unless (and (eql (read-rune input) #/?)
+ (eql (read-rune input) #/>))
+ (wf-error input "malformed processing instruction"))
+ (values name "")))))
-(defun read-pi-content (input &aux d)
+(defun read-pi-content (input)
(read-S? input)
+ (let (d)
+ (with-rune-collector (collect)
+ (block nil
+ (tagbody
+ state-1
+ (setf d (read-rune input))
+ (when (eq d :eof)
+ (eox input))
+ (unless (data-rune-p d)
+ (wf-error input "Illegal char: ~S." d))
+ (when (rune= d #/?) (go state-2))
+ (collect d)
+ (go state-1)
+ state-2 ;; #/? seen
+ (setf d (read-rune input))
+ (when (eq d :eof)
+ (eox input))
+ (unless (data-rune-p d)
+ (wf-error input "Illegal char: ~S." d))
+ (when (rune= d #/>) (return))
+ (when (rune= d #/?)
+ (collect #/?)
+ (go state-2))
+ (collect #/?)
+ (collect d)
+ (go state-1))))))
+
+(defun read-comment-content (input &aux d)
(with-rune-collector (collect)
(block nil
(tagbody
state-1
- (setf d (read-rune input))
- (unless (data-rune-p d)
- (error "Illegal char: ~S." d))
- (when (rune= d #/?) (go state-2))
- (collect d)
- (go state-1)
- state-2 ;; #/? seen
- (setf d (read-rune input))
- (unless (data-rune-p d)
- (error "Illegal char: ~S." d))
- (when (rune= d #/>) (return))
- (when (rune= d #/?)
- (collect #/?)
- (go state-2))
- (collect #/?)
- (collect d)
- (go state-1)))))
+ (setf d (read-rune input))
+ (when (eq d :eof)
+ (eox input))
+ (unless (data-rune-p d)
+ (wf-error input "Illegal char: ~S." d))
+ (when (rune= d #/-) (go state-2))
+ (collect d)
+ (go state-1)
+ state-2 ;; #/- seen
+ (setf d (read-rune input))
+ (when (eq d :eof)
+ (eox input))
+ (unless (data-rune-p d)
+ (wf-error input "Illegal char: ~S." d))
+ (when (rune= d #/-) (go state-3))
+ (collect #/-)
+ (collect d)
+ (go state-1)
+ state-3 ;; #/- #/- seen
+ (setf d (read-rune input))
+ (when (eq d :eof)
+ (eox input))
+ (unless (data-rune-p d)
+ (wf-error input "Illegal char: ~S." d))
+ (when (rune= d #/>) (return))
+ (wf-error input "'--' not allowed in a comment")
+ (when (rune= d #/-)
+ (collect #/-)
+ (go state-3))
+ (collect #/-)
+ (collect #/-)
+ (collect d)
+ (go state-1)))))
-(defun read-comment-content (input &aux d)
- (let ((warnedp nil))
- (with-rune-collector (collect)
- (block nil
- (tagbody
- state-1
- (setf d (read-rune input))
- (unless (data-rune-p d)
- (error "Illegal char: ~S." d))
- (when (rune= d #/-) (go state-2))
- (collect d)
- (go state-1)
- state-2 ;; #/- seen
- (setf d (read-rune input))
- (unless (data-rune-p d)
- (error "Illegal char: ~S." d))
- (when (rune= d #/-) (go state-3))
- (collect #/-)
- (collect d)
- (go state-1)
- state-3 ;; #/- #/- seen
- (setf d (read-rune input))
- (unless (data-rune-p d)
- (error "Illegal char: ~S." d))
- (when (rune= d #/>) (return))
- (unless warnedp
- (warn "WFC: no '--' in comments please.")
- (setf warnedp t))
- (when (rune= d #/-)
- (collect #/-)
- (go state-3))
- (collect #/-)
- (collect #/-)
- (collect d)
- (go state-1))))))
-
(defun read-cdata-sect (input &aux d)
;; <![CDATA[ is already read
;; read anything up to ]]>
@@ -1609,23 +1660,29 @@
(tagbody
state-1
(setf d (read-rune input))
+ (when (eq d :eof)
+ (eox input))
(unless (data-rune-p d)
- (error "Illegal char: ~S." d))
+ (wf-error input "Illegal char: ~S." d))
(when (rune= d #/\]) (go state-2))
(collect d)
(go state-1)
state-2 ;; #/] seen
(setf d (read-rune input))
+ (when (eq d :eof)
+ (eox input))
(unless (data-rune-p d)
- (error "Illegal char: ~S." d))
+ (wf-error input "Illegal char: ~S." d))
(when (rune= d #/\]) (go state-3))
(collect #/\])
(collect d)
(go state-1)
state-3 ;; #/\] #/\] seen
(setf d (read-rune input))
+ (when (eq d :eof)
+ (eox input))
(unless (data-rune-p d)
- (error "Illegal char: ~S." d))
+ (wf-error input "Illegal char: ~S." d))
(when (rune= d #/>)
(return))
(when (rune= d #/\])
@@ -1636,61 +1693,6 @@
(collect d)
(go state-1)))))
-#+(or) ;; FIXME: There is another definition below that looks more reasonable.
-(defun read-cdata (input initial-char &aux d)
- (cond ((not (data-rune-p initial-char))
- (error "Illegal char: ~S." initial-char)))
- (with-rune-collector (collect)
- (block nil
- (tagbody
- (cond ((rune= initial-char #/\])
- (go state-2))
- (t
- (collect initial-char)))
- state-1
- (setf d (peek-rune input))
- (when (or (eq d :eof) (rune= d #/<) (rune= d #/&))
- (return))
- (read-rune input)
- (unless (data-rune-p d)
- (error "Illegal char: ~S." d))
- (when (rune= d #/\]) (go state-2))
- (collect d)
- (go state-1)
-
- state-2 ;; #/\] seen
- (setf d (peek-rune input))
- (when (or (eq d :eof) (rune= d #/<) (rune= d #/&))
- (collect #/\])
- (return))
- (read-rune input)
- (unless (data-rune-p d)
- (error "Illegal char: ~S." d))
- (when (rune= d #/\]) (go state-3))
- (collect #/\])
- (collect d)
- (go state-1)
-
- state-3 ;; #/\] #/\] seen
- (setf d (peek-rune input))
- (when (or (eq d :eof) (rune= d #/<) (rune= d #/&))
- (collect #/\])
- (collect #/\])
- (return))
- (read-rune input)
- (unless (data-rune-p d)
- (error "Illegal char: ~S." d))
- (when (rune= d #/>)
- (error "For no apparent reason ']]>' in not allowed in a CharData token -- you lost."))
- (when (rune= d #/\])
- (collect #/\])
- (go state-3))
- (collect #/\])
- (collect #/\])
- (collect d)
- (go state-1)))))
-
-
;; some character categories
(defun space-rune-p (rune)
@@ -1720,7 +1722,7 @@
(defun expect (input category)
(multiple-value-bind (cat sem) (read-token input)
(unless (eq cat category)
- (error "Expected ~S saw ~S [~S]" category cat sem))
+ (wf-error input "Expected ~S saw ~S [~S]" category cat sem))
(values cat sem)))
(defun consume-token (input)
@@ -1741,15 +1743,21 @@
(while (eq (peek-token input) :S)
(consume-token input)))
+(defun p/nmtoken (input)
+ (nth-value 1 (expect input :nmtoken)))
+
(defun p/name (input)
- (nth-value 1 (expect input :name)))
+ (let ((result (p/nmtoken input)))
+ (unless (name-start-rune-p (elt result 0))
+ (wf-error input "Expected name."))
+ result))
(defun p/attlist-decl (input)
;; [52] AttlistDecl ::= '<!ATTLIST' S Name (S AttDef)* S? '>'
(let (elm-name)
(expect input :|<!ATTLIST|)
(p/S input)
- (setf elm-name (p/name input))
+ (setf elm-name (p/nmtoken input))
(loop
(let ((tok (read-token input)))
(case tok
@@ -1764,13 +1772,14 @@
(:>
(return))
(otherwise
- (error "Expected either another AttDef or end of \"<!ATTLIST\". -- saw ~S."
- tok)) )) )))
+ (wf-error input
+ "Expected either another AttDef or end of \"<!ATTLIST\". -- saw ~S."
+ tok)))))))
(defun p/attdef (input)
;; [53] AttDef ::= Name S AttType S DefaultDecl
(let (name type default)
- (setf name (p/name input))
+ (setf name (p/nmtoken input))
(p/S input)
(setf type (p/att-type input))
(p/S input)
@@ -1812,48 +1821,48 @@
;; /* VC: Notation Attributes */
;; [59] Enumeration ::= '(' S? Nmtoken (S? '|' S? Nmtoken)* S? ')' /* VC: Enumeration */
(multiple-value-bind (cat sem) (read-token input)
- (cond ((eq cat :name)
- (cond ((equalp sem '#.(string-rod "CDATA")) :CDATA)
- ((equalp sem '#.(string-rod "ID")) :ID)
- ((equalp sem '#.(string-rod "IDREF")) :IDREFS)
- ((equalp sem '#.(string-rod "IDREFS")) :IDREFS)
- ((equalp sem '#.(string-rod "ENTITY")) :ENTITY)
- ((equalp sem '#.(string-rod "ENTITIES")) :ENTITIES)
- ((equalp sem '#.(string-rod "NMTOKEN")) :NMTOKEN)
- ((equalp sem '#.(string-rod "NMTOKENS")) :NMTOKENS)
- ((equalp sem '#.(string-rod "NOTATION"))
+ (cond ((eq cat :nmtoken)
+ (cond ((rod= sem '#.(string-rod "CDATA")) :CDATA)
+ ((rod= sem '#.(string-rod "ID")) :ID)
+ ((rod= sem '#.(string-rod "IDREF")) :IDREFS)
+ ((rod= sem '#.(string-rod "IDREFS")) :IDREFS)
+ ((rod= sem '#.(string-rod "ENTITY")) :ENTITY)
+ ((rod= sem '#.(string-rod "ENTITIES")) :ENTITIES)
+ ((rod= sem '#.(string-rod "NMTOKEN")) :NMTOKEN)
+ ((rod= sem '#.(string-rod "NMTOKENS")) :NMTOKENS)
+ ((rod= sem '#.(string-rod "NOTATION"))
(let (names)
(p/S input)
(expect input :\()
- (setf names (p/list input #'p/name :\| ))
+ (setf names (p/list input #'p/nmtoken :\| ))
(expect input :\))
(when *validate*
(setf (referenced-notations *ctx*)
(append names (referenced-notations *ctx*))))
(cons :NOTATION names)))
(t
- (error "In p/att-type: ~S ~S." cat sem))))
+ (wf-error input "In p/att-type: ~S ~S." cat sem))))
((eq cat :\()
;; XXX Die Nmtoken-Syntax pruefen wir derzeit nur beim Validieren.
(let (names)
;;(expect input :\()
- (setf names (p/list input #'p/name :\| ))
+ (setf names (p/list input #'p/nmtoken :\| ))
(expect input :\))
(cons :ENUMERATION names)))
(t
- (error "In p/att-type: ~S ~S." cat sem)) )))
+ (wf-error input "In p/att-type: ~S ~S." cat sem)) )))
(defun p/default-decl (input)
;; [60] DefaultDecl ::= '#REQUIRED' | '#IMPLIED'
;; | (('#FIXED' S)? AttValue) /* VC: Required Attribute */
- ;;
+ ;;
;; /* VC: Attribute Default Legal */
;; /* WFC: No < in Attribute Values */
;; /* VC: Fixed Attribute Default */
(multiple-value-bind (cat sem) (peek-token input)
- (cond ((eq cat :|#REQUIRED|)
+ (cond ((eq cat :|#REQUIRED|)
(consume-token input) :REQUIRED)
- ((eq cat :|#IMPLIED|)
+ ((eq cat :|#IMPLIED|)
(consume-token input) :IMPLIED)
((eq cat :|#FIXED|)
(consume-token input)
@@ -1862,7 +1871,7 @@
((or (eq cat :\') (eq cat :\"))
(list :DEFAULT (p/att-value input)))
(t
- (error "p/default-decl: ~S ~S." cat sem)) )))
+ (wf-error input "p/default-decl: ~S ~S." cat sem)) )))
;;;;
;; [70] EntityDecl ::= GEDecl | PEDecl
@@ -1914,25 +1923,25 @@
(multiple-value-bind (cat sem) (peek-token input)
(cond ((member cat '(:\" :\'))
(make-internal-entdef (p/entity-value input)))
- ((and (eq cat :name)
- (or (equalp sem '#.(string-rod "SYSTEM"))
- (equalp sem '#.(string-rod "PUBLIC"))))
+ ((and (eq cat :nmtoken)
+ (or (rod= sem '#.(string-rod "SYSTEM"))
+ (rod= sem '#.(string-rod "PUBLIC"))))
(let (extid ndata)
(setf extid (p/external-id input nil))
(when (eq kind :general) ;NDATA allowed at all?
(cond ((eq (peek-token input) :S)
(p/S? input)
- (when (and (eq (peek-token input) :name)
- (equalp (nth-value 1 (peek-token input))
+ (when (and (eq (peek-token input) :nmtoken)
+ (rod= (nth-value 1 (peek-token input))
'#.(string-rod "NDATA")))
(consume-token input)
(p/S input)
- (setf ndata (p/name input))
+ (setf ndata (p/nmtoken input))
(when *validate*
(push ndata (referenced-notations *ctx*)))))))
(make-external-entdef extid ndata)))
(t
- (error "p/entity-def: ~S / ~S." cat sem)) )))
+ (wf-error input "p/entity-def: ~S / ~S." cat sem)) )))
(defun p/entity-value (input)
(let ((delim (if (eq (read-token input) :\") #/\" #/\')))
@@ -1953,10 +1962,10 @@
(defun p/external-id (input &optional (public-only-ok-p nil))
;; xxx public-only-ok-p
(multiple-value-bind (cat sem) (read-token input)
- (cond ((and (eq cat :name) (equalp sem '#.(string-rod "SYSTEM")))
+ (cond ((and (eq cat :nmtoken) (rod= sem '#.(string-rod "SYSTEM")))
(p/S input)
(make-extid nil (p/system-literal input)))
- ((and (eq cat :name) (equalp sem '#.(string-rod "PUBLIC")))
+ ((and (eq cat :nmtoken) (rod= sem '#.(string-rod "PUBLIC")))
(let (pub sys)
(p/S input)
(setf pub (p/pubid-literal input))
@@ -1966,10 +1975,10 @@
(setf sys (p/system-literal input))))
(when (and (not public-only-ok-p)
(null sys))
- (error "System identifier needed for this PUBLIC external identifier."))
+ (wf-error input "System identifier needed for this PUBLIC external identifier."))
(make-extid pub sys)))
(t
- (error "Expected external-id: ~S / ~S." cat sem)))))
+ (wf-error input "Expected external-id: ~S / ~S." cat sem)))))
;; [11] SystemLiteral ::= ('"' [^"]* '"') | ("'" [^']* "'")
@@ -1985,13 +1994,13 @@
(loop
(let ((c (read-rune (car (zstream-input-stack input)))))
(cond ((eq c :eof)
- (error "EOF in system literal."))
+ (eox input "EOF in system literal."))
((rune= c delim)
(return))
(t
(collect c))))))))
(t
- (error "Expect either \" or \'.")))))
+ (wf-error input "Expect either \" or \'.")))))
;; it is important to cache the orginal URI rod, since the re-serialized
;; uri-string can be different from the one parsed originally.
@@ -2007,7 +2016,7 @@
;; :FILE and NIL anway.
(when (eql (search "file://" str) 0)
(setf str (subseq str (length "file://"))))
- (puri:parse-uri str))
+ (puri:parse-uri (coerce str 'simple-string)))
(defun p/system-literal (input)
(let* ((rod (p/id input))
@@ -2018,7 +2027,7 @@
(defun p/pubid-literal (input)
(let ((result (p/id input)))
(unless (every #'pubid-char-p result)
- (error "Illegal pubid: ~S." (rod-string result)))
+ (wf-error input "Illegal pubid: ~S." (rod-string result)))
result))
@@ -2028,11 +2037,11 @@
(let (name content)
(expect input :|<!ELEMENT|)
(p/S input)
- (setf name (p/name input))
+ (setf name (p/nmtoken input))
(p/S input)
(setf content (normalize-mixed-cspec (p/cspec input)))
(unless (legal-content-model-p content *validate*)
- (error "Malformed or invalid content model: ~S." (mu content)))
+ (wf-error input "Malformed or invalid content model: ~S." (mu content)))
(p/S? input)
(expect input :\>)
(when *validate*
@@ -2071,9 +2080,9 @@
;;; to indicate whether the end tag is valid.
;;;
;;; Function B will be called with the character data rod as its argument, it
-;;; returns a boolean indicating whether this text element is allowed.
+;;; returns a boolean indicating whether this text node is allowed.
;;;
-;;; That is, if one of the functions ever returns NIL, the element is
+;;; That is, if one of the functions ever returns NIL, the node is
;;; rejected as invalid.
(defun cmodel-done (actual-value)
@@ -2171,27 +2180,29 @@
((and (walk (car x))
(walk (cdr x)))))))
(walk cspec))))
-
+
;; wir fahren besser, wenn wir machen:
-;; cspec ::= 'EMPTY' | 'ANY' | '#PCDATA'
+;; cspec ::= 'EMPTY' | 'ANY' | '#PCDATA'
;; | Name
;; | cs
;; cs ::= '(' S? cspec ( S? '|' S? cspec)* S? ')' ('?' | '*' | '+')?
-;; und eine post mortem analyse
+;; und eine post factum analyse
-(defun p/cspec (input)
+(defun p/cspec (input &optional recursivep)
(let ((term
(let ((names nil) op-cat op res stream)
(multiple-value-bind (cat sem) (peek-token input)
- (cond ((eq cat :name)
- (consume-token input)
+ (cond ((eq cat :nmtoken)
+ (consume-token input)
(cond ((rod= sem '#.(string-rod "EMPTY"))
:EMPTY)
((rod= sem '#.(string-rod "ANY"))
:ANY)
- (t
- sem)))
+ ((not recursivep)
+ (wf-error input "invalid content spec"))
+ (t
+ sem)))
((eq cat :\#PCDATA)
(consume-token input)
:PCDATA)
@@ -2199,7 +2210,7 @@
(setf stream (car (zstream-input-stack input)))
(consume-token input)
(p/S? input)
- (setq names (list (p/cspec input)))
+ (setq names (list (p/cspec input t)))
(p/S? input)
(cond ((member (peek-token input) '(:\| :\,))
(setf op-cat (peek-token input))
@@ -2207,7 +2218,7 @@
(while (eq (peek-token input) op-cat)
(consume-token input)
(p/S? input)
- (push (p/cspec input) names)
+ (push (p/cspec input t) names)
(p/S? input))
(setf res (cons op (reverse names))))
(t
@@ -2219,7 +2230,7 @@
(validity-error "(06) Proper Group/PE Nesting")))
res)
(t
- (error "p/cspec - ~s / ~s" cat sem)))))))
+ (wf-error input "p/cspec - ~s / ~s" cat sem)))))))
(cond ((eq (peek-token input) :?) (consume-token input) (list '? term))
((eq (peek-token input) :+) (consume-token input) (list '+ term))
((eq (peek-token input) :*) (consume-token input) (list '* term))
@@ -2245,14 +2256,14 @@
(trivialp (cadr cspec)))))
:PCDATA
cspec)))
-
+
;; [52] AttlistDecl ::= '<!ATTLIST' S Name AttDef* S? '>'
-
+
;; [52] AttlistDecl ::= '<!ATTLIST' S Name AttDefs S? '>'
;; [52] AttlistDecl ::= '<!ATTLIST' S Name S? '>'
;; [53] AttDefs ::= S Name S AttType S DefaultDecl AttDefs
-;; [53] AttDefs ::=
+;; [53] AttDefs ::=
(defun p/notation-decl (input)
(let (name id)
@@ -2269,6 +2280,8 @@
(normalize-public-id (extid-public id))
nil)
(uri-rod (extid-system id)))
+ (when (and sax:*namespace-processing* (find #/: name))
+ (wf-error input "colon in notation name"))
(when *validate*
(define-notation (dtd *ctx*) name id))
(list :notation-decl name id)))
@@ -2299,14 +2312,14 @@
(let ((stream (car (zstream-input-stack input))))
(p/S? input)
(multiple-value-bind (cat sem) (read-token input)
- (cond ((and (eq cat :name)
+ (cond ((and (eq cat :nmtoken)
(rod= sem '#.(string-rod "INCLUDE")))
(p/include-sect input stream))
- ((and (eq cat :name)
+ ((and (eq cat :nmtoken)
(rod= sem '#.(string-rod "IGNORE")))
(p/ignore-sect input stream))
(t
- (error "Expected INCLUDE or IGNORE after \"<![\"."))))))
+ (wf-error input "Expected INCLUDE or IGNORE after \"<![\"."))))))
(defun p/cond-expect (input cat initial-stream)
(expect input cat)
@@ -2331,12 +2344,12 @@
(let ((input (car (zstream-input-stack input))))
(let ((level 0))
(do ((c1 (read-rune input) (read-rune input))
- (c2 0 c1)
- (c3 0 c2))
+ (c2 #/U+0000 c1)
+ (c3 #/U+0000 c2))
((= level -1))
(declare (type fixnum level))
(cond ((eq c1 :eof)
- (error "EOF in <![IGNORE ... >")))
+ (eox input "EOF in <![IGNORE ... >")))
(cond ((and (rune= c3 #/<) (rune= c2 #/!) (rune= c1 #/\[))
(incf level)))
(cond ((and (rune= c3 #/\]) (rune= c2 #/\]) (rune= c1 #/>))
@@ -2353,7 +2366,7 @@
(:eof (return))
((:|<!ELEMENT| :|<!ATTLIST| :|<!ENTITY| :|<!NOTATION| :PI :COMMENT)
(let ((*expand-pe-p* t)
- (*markup-declaration-external-p* t))
+ (*external-subset-p* t))
(p/markup-decl input)))
((:PE-REFERENCE)
(let ((name (nth-value 1 (read-token input))))
@@ -2365,7 +2378,7 @@
(internal-entdef
(p/ext-subset-decl input)))
(unless (eq :eof (peek-token input))
- (error "Trailing garbage."))))))
+ (wf-error input "Trailing garbage."))))))
(otherwise (return)))) )
(defun p/markup-decl (input)
@@ -2379,19 +2392,21 @@
(defun p/markup-decl-unsafe (input)
;; markupdecl ::= elementdecl | AttlistDecl /* VC: Proper Declaration/PE Nesting */
- ;; | EntityDecl | NotationDecl
+ ;; | EntityDecl | NotationDecl
;; | PI | Comment /* WFC: PEs in Internal Subset */
- (case (peek-token input)
- (:|<!ELEMENT| (p/element-decl input))
- (:|<!ATTLIST| (p/attlist-decl input))
- (:|<!ENTITY| (p/entity-decl input))
- (:|<!NOTATION| (p/notation-decl input))
- (:PI
- (let ((sem (nth-value 1 (read-token input))))
- (sax:processing-instruction (handler *ctx*) (car sem) (cdr sem))))
- (:COMMENT (consume-token input))
- (otherwise
- (error "p/markup-decl ~S" (peek-token input)))))
+ (let ((token (peek-token input))
+ (*expand-pe-p* (and *expand-pe-p* *external-subset-p*)))
+ (case token
+ (:|<!ELEMENT| (p/element-decl input))
+ (:|<!ATTLIST| (p/attlist-decl input))
+ (:|<!ENTITY| (p/entity-decl input))
+ (:|<!NOTATION| (p/notation-decl input))
+ (:PI
+ (let ((sem (nth-value 1 (read-token input))))
+ (sax:processing-instruction (handler *ctx*) (car sem) (cdr sem))))
+ (:COMMENT (consume-token input))
+ (otherwise
+ (wf-error input "p/markup-decl ~S" (peek-token input))))))
(defun setup-encoding (input xml-header)
(when (xml-header-encoding xml-header)
@@ -2408,14 +2423,14 @@
(set-to-full-speed xstream))))
(defun p/ext-subset (input)
- (cond ((eq (peek-token input) :xml-pi)
- (let ((hd (parse-xml-pi (cdr (nth-value 1 (peek-token input))) nil)))
+ (cond ((eq (peek-token input) :xml-decl)
+ (let ((hd (parse-text-decl (cdr (nth-value 1 (peek-token input))))))
(setup-encoding input hd))
(consume-token input)))
(set-full-speed input)
(p/ext-subset-decl input)
(unless (eq (peek-token input) :eof)
- (error "Trailing garbage - ~S." (peek-token input))))
+ (wf-error input "Trailing garbage - ~S." (peek-token input))))
(defvar *catalog* nil)
@@ -2436,7 +2451,7 @@
name extid)
(expect input :|<!DOCTYPE|)
(p/S input)
- (setq name (p/name input))
+ (setq name (p/nmtoken input))
(when *validate*
(setf (model-stack *ctx*) (list (make-root-model name))))
(when (eq (peek-token input) :S)
@@ -2453,9 +2468,10 @@
(and extid (uri-rod (extid-system extid))))
(when (eq (peek-token input) :\[ )
(when (disallow-internal-subset *ctx*)
- (error "document includes an internal subset"))
+ (wf-error input "document includes an internal subset"))
(ensure-dtd)
(consume-token input)
+ (sax:start-internal-subset (handler *ctx*))
(while (progn (p/S? input)
(not (eq (peek-token input) :\] )))
(if (eq (peek-token input) :PE-REFERENCE)
@@ -2468,10 +2484,11 @@
(internal-entdef
(p/ext-subset-decl input)))
(unless (eq :eof (peek-token input))
- (error "Trailing garbage.")))))
+ (wf-error input "Trailing garbage.")))))
(let ((*expand-pe-p* t))
(p/markup-decl input))))
(consume-token input)
+ (sax:end-internal-subset (handler *ctx*))
(p/S? input))
(expect input :>)
(when extid
@@ -2501,7 +2518,8 @@
(let ((dtd (dtd *ctx*)))
(sax:entity-resolver
(handler *ctx*)
- (lambda (name handler) (resolve-entity name handler dtd))))
+ (lambda (name handler) (resolve-entity name handler dtd)))
+ (sax::dtd (handler *ctx*) dtd))
(list :DOCTYPE name extid))))
(defun report-cached-dtd (dtd)
@@ -2528,17 +2546,29 @@
(:COMMENT
(sax:comment (handler *ctx*) (nth-value 1 (peek-token input))))
(:PI
- (sax:processing-instruction
+ (sax:processing-instruction
(handler *ctx*)
(car (nth-value 1 (peek-token input)))
(cdr (nth-value 1 (peek-token input))))))
(consume-token input)))
-
+
(defun p/document
(input handler
- &key validate dtd root entity-resolver disallow-internal-subset)
+ &key validate dtd root entity-resolver disallow-internal-subset
+ (recode t))
+ ;; check types of user-supplied arguments for better error messages:
+ (check-type validate boolean)
+ (check-type recode boolean)
+ (check-type dtd (or null extid))
+ (check-type root (or null rod))
+ (check-type entity-resolver (or null function symbol))
+ (check-type disallow-internal-subset boolean)
+ #+rune-is-integer
+ (when recode
+ (setf handler (make-recoder handler #'rod-to-utf8-string)))
(let ((*ctx*
(make-context :handler handler
+ :main-zstream input
:entity-resolver entity-resolver
:disallow-internal-subset disallow-internal-subset))
(*validate* validate))
@@ -2551,8 +2581,8 @@
;; we will use the attribute-value parser for the xml decl.
(let ((*data-behaviour* :DTD))
;; optional XMLDecl?
- (cond ((eq (peek-token input) :xml-pi)
- (let ((hd (parse-xml-pi (cdr (nth-value 1 (peek-token input))) t)))
+ (cond ((eq (peek-token input) :xml-decl)
+ (let ((hd (parse-xml-decl (cdr (nth-value 1 (peek-token input))))))
(setf (standalone-p *ctx*) (eq (xml-header-standalone-p hd) :yes))
(setup-encoding input hd))
(read-token input)))
@@ -2580,87 +2610,75 @@
(setf (model-stack *ctx*) (list (make-root-model root))))
;; element
(let ((*data-behaviour* :DOC))
+ (when (eq (peek-token input) :seen-<)
+ (multiple-value-bind (c s)
+ (read-token-after-|<| input (car (zstream-input-stack input)))
+ (setf (zstream-token-category input) c
+ (zstream-token-semantic input) s)))
(p/element input))
;; optional Misc*
(p/misc*-2 input)
(unless (eq (peek-token input) :eof)
- (error "Garbage at end of document."))
+ (wf-error input "Garbage at end of document."))
(when *validate*
(maphash (lambda (k v)
(unless v
(validity-error "(11) IDREF: ~S not defined" (rod-string k))))
(id-table *ctx*))
-
- (dolist (name (referenced-notations *ctx*))
+
+ (dolist (name (referenced-notations *ctx*))
(unless (find-notation name (dtd *ctx*))
- (validity-error "(23) Notation Declared: ~S" (rod-string name)))))
+ (validity-error "(23) Notation Declared: ~S" (rod-string name)))))
(sax:end-document handler))))
(defun p/element (input)
- (if sax:*namespace-processing*
- (p/element-ns input)
- (p/element-no-ns input)))
-
-(defun p/element-no-ns (input)
- ;; [39] element ::= EmptyElemTag | STag content ETag
- (error "sorry, bitrot")
- #+(or)
(multiple-value-bind (cat sem) (read-token input)
- (cond ((eq cat :ztag)
- (sax:start-element (handler *ctx*) nil nil (car sem) (build-attribute-list-no-ns (cdr sem)))
- (sax:end-element (handler *ctx*) nil nil (car sem)))
-
- ((eq cat :stag)
- (sax:start-element (handler *ctx*) nil nil (car sem) (build-attribute-list-no-ns (cdr sem)))
- (p/content input)
- (multiple-value-bind (cat2 sem2) (read-token input)
- (unless (and (eq cat2 :etag)
- (eq (car sem2) (car sem)))
- (perror input "Bad nesting. ~S / ~S" (mu sem) (mu (cons cat2 sem2)))))
- (sax:end-element (handler *ctx*) nil nil (car sem)))
-
- (t
- (error "Expecting element.")))))
-
-
-(defun p/element-ns (input)
- (destructuring-bind (cat (name &rest attrs))
- (multiple-value-list (read-token input))
- (validate-start-element *ctx* name)
- (let ((ns-decls (declare-namespaces name attrs)))
- (multiple-value-bind (ns-uri prefix local-name) (decode-qname name)
- (declare (ignore prefix))
- (let* ((raw-attlist (build-attribute-list-ns attrs))
- (attlist
- (remove-if-not (lambda (a)
- (or sax:*include-xmlns-attributes*
- (not (xmlns-attr-p (sax:attribute-qname a)))))
- (process-attributes *ctx* name raw-attlist))))
- (cond ((eq cat :ztag)
- (sax:start-element (handler *ctx*) ns-uri local-name name attlist)
- (sax:end-element (handler *ctx*) ns-uri local-name name))
+ (case cat
+ ((:stag :ztag))
+ (:eof (eox input))
+ (t (wf-error input "element expected")))
+ (destructuring-bind (&optional name &rest raw-attrs) sem
+ (validate-start-element *ctx* name)
+ (let* ((attrs
+ (process-attributes *ctx* name (build-attribute-list raw-attrs)))
+ (*namespace-bindings* *namespace-bindings*)
+ new-namespaces)
+ (when sax:*namespace-processing*
+ (setf new-namespaces (declare-namespaces attrs))
+ (mapc #'set-attribute-namespace attrs))
+ (multiple-value-bind (uri prefix local-name)
+ (if sax:*namespace-processing*
+ (decode-qname name)
+ (values nil nil nil))
+ (declare (ignore prefix))
+ (check-attribute-uniqueness attrs)
+ (unless (or sax:*include-xmlns-attributes*
+ (null sax:*namespace-processing*))
+ (setf attrs
+ (remove-if (compose #'xmlns-attr-p #'sax:attribute-qname)
+ attrs)))
+ (cond
+ ((eq cat :ztag)
+ (sax:start-element (handler *ctx*) uri local-name name attrs)
+ (sax:end-element (handler *ctx*) uri local-name name))
- ((eq cat :stag)
- (sax:start-element (handler *ctx*) ns-uri local-name name attlist)
- (p/content input)
- (multiple-value-bind (cat2 sem2) (read-token input)
- (unless (and (eq cat2 :etag)
- (eq (car sem2) name))
- (perror input "Bad nesting. ~S / ~S" (mu name) (mu (cons cat2 sem2)))))
- (sax:end-element (handler *ctx*) ns-uri local-name name))
+ ((eq cat :stag)
+ (sax:start-element (handler *ctx*) uri local-name name attrs)
+ (p/content input)
+ (multiple-value-bind (cat2 sem2) (read-token input)
+ (unless (and (eq cat2 :etag)
+ (eq (car sem2) name))
+ (wf-error input "Bad nesting. ~S / ~S"
+ (mu name)
+ (mu (cons cat2 sem2))))
+ (when (cdr sem2)
+ (wf-error input "no attributes allowed in end tag")))
+ (sax:end-element (handler *ctx*) uri local-name name))
- (t
- (error "Expecting element, got ~S." cat)))))
- (undeclare-namespaces ns-decls))
- (validate-end-element *ctx* name)))
-
-(defun perror (stream format-string &rest format-args)
- (when (zstream-p stream)
- (setf stream (car (zstream-input-stack stream))))
- (error "Parse error at line ~D column ~D: ~A"
- (xstream-line-number stream)
- (xstream-column-number stream)
- (apply #'format nil format-string format-args)))
+ (t
+ (wf-error input "Expecting element, got ~S." cat))))
+ (undeclare-namespaces new-namespaces))
+ (validate-end-element *ctx* name))))
(defun p/content (input)
;; [43] content ::= (element | CharData | Reference | CDSect | PI | Comment)*
@@ -2671,13 +2689,15 @@
(p/content input))
((:CDATA)
(consume-token input)
+ (when (search #"]]>" sem)
+ (wf-error input "']]>' not allowed in CharData"))
(validate-characters *ctx* sem)
(sax:characters (handler *ctx*) sem)
(p/content input))
((:ENTITY-REF)
(let ((name sem))
(consume-token input)
- (append ;; nil #+(OR)
+ (append
(recurse-on-entity input name :general
(lambda (input)
(prog1
@@ -2685,11 +2705,12 @@
(internal-entdef (p/content input))
(external-entdef (p/ext-parsed-ent input)))
(unless (eq (peek-token input) :eof)
- (error "Trailing garbage. - ~S" (peek-token input))))))
+ (wf-error input "Trailing garbage. - ~S"
+ (peek-token input))))))
(p/content input))))
((:<!\[)
(consume-token input)
- (cons
+ (cons
(let ((input (car (zstream-input-stack input))))
(unless (and (rune= #/C (read-rune input))
(rune= #/D (read-rune input))
@@ -2697,7 +2718,7 @@
(rune= #/T (read-rune input))
(rune= #/A (read-rune input))
(rune= #/\[ (read-rune input)))
- (error "After '<![', 'CDATA[' is expected."))
+ (wf-error input "After '<![', 'CDATA[' is expected."))
(validate-characters *ctx* #"hack") ;anything other than whitespace
(sax:start-cdata (handler *ctx*))
(sax:characters (handler *ctx*) (read-cdata-sect input))
@@ -2724,42 +2745,39 @@
(defun p/ext-parsed-ent (input)
;; [78] extParsedEnt ::= '<?xml' VersionInfo? EncodingDecl S? '?>' content
- (when (eq (peek-token input) :xml-pi)
- (let ((hd (parse-xml-pi (cdr (nth-value 1 (peek-token input))) nil)))
+ (when (eq (peek-token input) :xml-decl)
+ (let ((hd (parse-text-decl (cdr (nth-value 1 (peek-token input))))))
(setup-encoding input hd))
- (consume-token input) )
+ (consume-token input))
(set-full-speed input)
(p/content input))
-(defun parse-xml-pi (content sd-ok-p)
- ;; --> xml-header
- ;;(make-xml-header))
+(defun parse-xml-decl (content)
(let* ((res (make-xml-header))
(i (make-rod-xstream content))
- (atts (read-attribute-list 'foo i t))) ;xxx on 'foo
+ (z (make-zstream :input-stack (list i)))
+ (atts (read-attribute-list z i t)))
(unless (eq (peek-rune i) :eof)
- (error "Garbage at end of XML PI."))
+ (wf-error i "Garbage at end of XMLDecl."))
;; versioninfo muss da sein
- ;; dann ? encodingdecl
+ ;; dann ? encodingdecl
;; dann ? sddecl
;; dann ende
- (when (and (not (eq (caar atts) (intern-name '#.(string-rod "version"))))
- sd-ok-p)
- (error "XML PI needs version."))
- (when (eq (caar atts) (intern-name '#.(string-rod "version")))
- (unless (and (>= (length (cdar atts)) 1)
- (every (lambda (x)
- (or (rune<= #/a x #/z)
- (rune<= #/A x #/Z)
- (rune<= #/0 x #/9)
- (rune= x #/_)
- (rune= x #/.)
- (rune= x #/:)
- (rune= x #/-)))
- (cdar atts)))
- (error "Bad XML version number: ~S." (rod-string (cdar atts))))
- (setf (xml-header-version res) (rod-string (cdar atts)))
- (pop atts))
+ (unless (eq (caar atts) (intern-name '#.(string-rod "version")))
+ (wf-error i "XMLDecl needs version."))
+ (unless (and (>= (length (cdar atts)) 1)
+ (every (lambda (x)
+ (or (rune<= #/a x #/z)
+ (rune<= #/A x #/Z)
+ (rune<= #/0 x #/9)
+ (rune= x #/_)
+ (rune= x #/.)
+ (rune= x #/:)
+ (rune= x #/-)))
+ (cdar atts)))
+ (wf-error i"Bad XML version number: ~S." (rod-string (cdar atts))))
+ (setf (xml-header-version res) (rod-string (cdar atts)))
+ (pop atts)
(when (eq (caar atts) (intern-name '#.(string-rod "encoding")))
(unless (and (>= (length (cdar atts)) 1)
(every (lambda (x)
@@ -2772,30 +2790,72 @@
(cdar atts))
((lambda (x)
(or (rune<= #/a x #/z)
- (rune<= #/A x #/Z)
- (rune<= #/0 x #/9)))
+ (rune<= #/A x #/Z)))
(aref (cdar atts) 0)))
- (error "Bad XML encoding name: ~S." (rod-string (cdar atts))))
+ (wf-error i "Bad XML encoding name: ~S." (rod-string (cdar atts))))
(setf (xml-header-encoding res) (rod-string (cdar atts)))
(pop atts))
- (when (and sd-ok-p (eq (caar atts) (intern-name '#.(string-rod "standalone"))))
+ (when (eq (caar atts) (intern-name '#.(string-rod "standalone")))
(unless (or (rod= (cdar atts) '#.(string-rod "yes"))
(rod= (cdar atts) '#.(string-rod "no")))
- (error "Hypersensitivity pitfall: ~
- XML PI's 'standalone' attribute must be exactly \"yes\" or \"no\" and not ~S."
+ (wf-error i "XMLDecl's 'standalone' attribute must be exactly \"yes\" or \"no\" and not ~S."
(rod-string (cdar atts))))
- (setf (xml-header-standalone-p res)
- (if (rod-equal '#.(string-rod "yes") (cdar atts))
- :yes
- :no))
+ (setf (xml-header-standalone-p res)
+ (if (rod-equal '#.(string-rod "yes") (cdar atts))
+ :yes
+ :no))
(pop atts))
(when atts
- (error "XML designers decided to disallow future extensions to the set ~
- of allowed XML PI's attributes -- you might have lost big on ~S (~S)"
- (rod-string content) sd-ok-p
- ))
+ (wf-error i "Garbage in XMLDecl: ~A" (rod-string content)))
res))
+(defun parse-text-decl (content)
+ (let* ((res (make-xml-header))
+ (i (make-rod-xstream content))
+ (z (make-zstream :input-stack (list i)))
+ (atts (read-attribute-list z i t)))
+ (unless (eq (peek-rune i) :eof)
+ (wf-error i "Garbage at end of TextDecl"))
+ ;; versioninfo optional
+ ;; encodingdecl muss da sein
+ ;; dann ende
+ (when (eq (caar atts) (intern-name '#.(string-rod "version")))
+ (unless (and (>= (length (cdar atts)) 1)
+ (every (lambda (x)
+ (or (rune<= #/a x #/z)
+ (rune<= #/A x #/Z)
+ (rune<= #/0 x #/9)
+ (rune= x #/_)
+ (rune= x #/.)
+ (rune= x #/:)
+ (rune= x #/-)))
+ (cdar atts)))
+ (wf-error i "Bad XML version number: ~S." (rod-string (cdar atts))))
+ (setf (xml-header-version res) (rod-string (cdar atts)))
+ (pop atts))
+ (unless (eq (caar atts) (intern-name '#.(string-rod "encoding")))
+ (wf-error i "TextDecl needs encoding."))
+ (unless (and (>= (length (cdar atts)) 1)
+ (every (lambda (x)
+ (or (rune<= #/a x #/z)
+ (rune<= #/A x #/Z)
+ (rune<= #/0 x #/9)
+ (rune= x #/_)
+ (rune= x #/.)
+ (rune= x #/-)))
+ (cdar atts))
+ ((lambda (x)
+ (or (rune<= #/a x #/z)
+ (rune<= #/A x #/Z)
+ (rune<= #/0 x #/9)))
+ (aref (cdar atts) 0)))
+ (wf-error i "Bad XML encoding name: ~S." (rod-string (cdar atts))))
+ (setf (xml-header-encoding res) (rod-string (cdar atts)))
+ (pop atts)
+ (when atts
+ (wf-error i "Garbage in TextDecl: ~A" (rod-string content)))
+ res))
+
;;;; ---------------------------------------------------------------------------
;;;; mu
;;;;
@@ -2838,7 +2898,7 @@
(dolist (pair pairs)
(if first
(setf first nil)
- (write-char #\& s))
+ (write-char #\& s))
(write-string (escape (car pair)) s)
(write-char #\= s)
(write-string (escape (cdr pair)) s))))))
@@ -2875,7 +2935,7 @@
(make-uri :path path)
(make-uri :scheme :file
:host (concatenate 'string
- (specific-or (pathname-host pathname))
+ (string-or (host-namestring pathname))
"+"
(specific-or (pathname-device pathname)))
:path path))))
@@ -2892,14 +2952,13 @@
(let ((scheme (puri:uri-scheme uri))
(path (puri:uri-parsed-path uri)))
(unless (member scheme '(nil :file))
- (error 'parser-error
+ (error 'xml-parse-error
:format-control "URI scheme ~S not supported"
:format-arguments (list scheme)))
(if (eq (car path) :relative)
(multiple-value-bind (name type)
(parse-name.type (car (last path)))
- (make-pathname :host ""
- :directory (butlast path)
+ (make-pathname :directory (butlast path)
:name name
:type type))
(multiple-value-bind (name type)
@@ -2907,17 +2966,21 @@
(destructuring-bind (host device)
(split-sequence-if (lambda (x) (eql x #\+))
(or (puri:uri-host uri) "+"))
- (make-pathname :host host
+ (make-pathname :host (string-or host)
:device (string-or device)
:directory (cons :absolute (butlast (cdr path)))
:name name
:type type))))))
(defun parse-xstream (xstream handler &rest args)
- (let ((zstream (make-zstream :input-stack (list xstream))))
- (peek-rune xstream)
- (with-scratch-pads ()
- (apply #'p/document zstream handler args))))
+ (let ((*ctx* nil))
+ (handler-case
+ (let ((zstream (make-zstream :input-stack (list xstream))))
+ (peek-rune xstream)
+ (with-scratch-pads ()
+ (apply #'p/document zstream handler args)))
+ (runes-encoding:encoding-error (c)
+ (wf-error xstream "~A" c)))))
(defun parse-file (filename handler &rest args)
(with-open-xfile (input filename)
@@ -2925,7 +2988,7 @@
(make-stream-name
:entity-name "main document"
:entity-kind :main
- :uri (pathname-to-uri filename)))
+ :uri (pathname-to-uri (merge-pathnames filename))))
(apply #'parse-xstream input handler args)))
(defun resolve-synonym-stream (stream)
@@ -2934,13 +2997,16 @@
stream)
(defun safe-stream-sysid (stream)
- (if (typep (resolve-synonym-stream stream) 'file-stream)
- (pathname-to-uri (pathname stream))
+ (if (and (typep (resolve-synonym-stream stream) 'file-stream)
+ ;; ignore-errors, because sb-bsd-sockets creates instances of
+ ;; FILE-STREAMs that aren't
+ (ignore-errors (pathname stream)))
+ (pathname-to-uri (merge-pathnames (pathname stream)))
nil))
(defun parse-stream (stream handler &rest args)
(let ((xstream
- (make-xstream
+ (make-xstream
stream
:name (make-stream-name
:entity-name "main document"
@@ -2949,11 +3015,69 @@
:initial-speed 1)))
(apply #'parse-xstream xstream handler args)))
-(defun parse-dtd-file (filename)
+(defun parse-empty-document
+ (uri qname handler &key public-id system-id entity-resolver (recode t))
+ (check-type uri (or null rod))
+ (check-type qname (or null rod))
+ (check-type public-id (or null rod))
+ (check-type system-id (or null puri:uri))
+ (check-type entity-resolver (or null function symbol))
+ (check-type recode boolean)
+ #+rune-is-integer
+ (when recode
+ (setf handler (make-recoder handler #'rod-to-utf8-string)))
+ (let ((*ctx*
+ (make-context :handler handler :entity-resolver entity-resolver))
+ (*validate* nil)
+ (extid
+ (when (or public-id system-id)
+ (extid-using-catalog (make-extid public-id system-id)))))
+ (sax:start-document handler)
+ (when extid
+ (sax:start-dtd handler
+ qname
+ (and public-id)
+ (and system-id (uri-rod system-id)))
+ (setf (dtd *ctx*) (getdtd (extid-system extid) *dtd-cache*))
+ (unless (dtd *ctx*)
+ (with-scratch-pads ()
+ (let ((*data-behaviour* :DTD))
+ (let* ((xi2 (xstream-open-extid extid))
+ (zi2 (make-zstream :input-stack (list xi2))))
+ (ensure-dtd)
+ (p/ext-subset zi2)))))
+ (sax:end-dtd handler)
+ (let ((dtd (dtd *ctx*)))
+ (sax:entity-resolver handler (lambda (n h) (resolve-entity n h dtd)))
+ (sax::dtd handler dtd)))
+ (ensure-dtd)
+ (when (or uri qname)
+ (let* ((attrs
+ (when uri
+ (list (sax:make-attribute :qname #"xmlns"
+ :value (rod uri)
+ :specified-p t))))
+ (*namespace-bindings* *namespace-bindings*)
+ new-namespaces)
+ (when sax:*namespace-processing*
+ (setf new-namespaces (declare-namespaces attrs))
+ (mapc #'set-attribute-namespace attrs))
+ (multiple-value-bind (uri prefix local-name)
+ (if sax:*namespace-processing* (decode-qname qname) nil)
+ (declare (ignore prefix))
+ (unless (or sax:*include-xmlns-attributes*
+ (null sax:*namespace-processing*))
+ (setf attrs nil))
+ (sax:start-element (handler *ctx*) uri local-name qname attrs)
+ (sax:end-element (handler *ctx*) uri local-name qname))
+ (undeclare-namespaces new-namespaces)))
+ (sax:end-document handler)))
+
+(defun parse-dtd-file (filename &optional handler)
(with-open-file (s filename :element-type '(unsigned-byte 8))
- (parse-dtd-stream s)))
+ (parse-dtd-stream s handler)))
-(defun parse-dtd-stream (stream)
+(defun parse-dtd-stream (stream &optional handler)
(let ((input (make-xstream stream)))
(setf (xstream-name input)
(make-stream-name
@@ -2961,7 +3085,7 @@
:entity-kind :main
:uri (safe-stream-sysid stream)))
(let ((zstream (make-zstream :input-stack (list input)))
- (*ctx* (make-context :handler nil))
+ (*ctx* (make-context :handler handler))
(*validate* t)
(*data-behaviour* :DTD))
(with-scratch-pads ()
@@ -2970,18 +3094,20 @@
(p/ext-subset zstream)
(dtd *ctx*)))))
-(defun parse-string (string handler)
- ;; XXX this function mis-handles encoding
- (with-scratch-pads ()
- (let* ((x (string->xstream string))
- (z (make-zstream :input-stack (list x))))
- (p/document z handler))))
+(defun parse-rod (string handler &rest args)
+ (let ((xstream (string->xstream string)))
+ (setf (xstream-name xstream)
+ (make-stream-name
+ :entity-name "main document"
+ :entity-kind :main
+ :uri nil))
+ (apply #'parse-xstream xstream handler args)))
(defun string->xstream (string)
- ;; XXX encoding is mis-handled by this kind of stream
(make-rod-xstream (string-rod string)))
-(defclass octet-input-stream (fundamental-binary-input-stream)
+(defclass octet-input-stream
+ (trivial-gray-stream-mixin fundamental-binary-input-stream)
((octets :initarg :octets)
(pos :initform 0)))
@@ -2997,8 +3123,8 @@
(elt octets pos)
(incf pos)))))
-(defmethod stream-read-sequence ((stream octet-input-stream) sequence
- &optional (start 0) (end (length sequence)))
+(defmethod stream-read-sequence
+ ((stream octet-input-stream) sequence start end &key &allow-other-keys)
(with-slots (octets pos) stream
(let* ((length (min (- end start) (- (length octets) pos)))
(end1 (+ start length))
@@ -3015,20 +3141,6 @@
;;;;
-#+allegro
-(defmacro sp (&body body)
- `(progn
- (prof:with-profiling (:type :space) .,body)
- (prof:show-flat-profile)))
-
-#+allegro
-(defmacro tm (&body body)
- `(progn
- (prof:with-profiling (:type :time) .,body)
- (prof:show-flat-profile)))
-
-;;;;
-
(defun zstream-push (new-xstream zstream)
(cond ((find-if (lambda (x)
(and (xstream-p x)
@@ -3037,14 +3149,12 @@
(eql (stream-name-entity-kind (xstream-name x))
(stream-name-entity-kind (xstream-name new-xstream)))))
(zstream-input-stack zstream))
- (error "Infinite recursion.")))
+ (wf-error zstream "Infinite recursion.")))
(push new-xstream (zstream-input-stack zstream))
zstream)
-(defun recurse-on-entity (zstream name kind continuation)
+(defun recurse-on-entity (zstream name kind continuation &optional internalp)
(assert (not (zstream-token-category zstream)))
- ;;(sleep .2)
- ;;(warn "~S / ~S[~S]." (zstream-input-stack zstream) (mu name) kind)
(call-with-entity-expansion-as-stream
zstream
(lambda (new-xstream)
@@ -3058,115 +3168,10 @@
(assert (eq (pop (zstream-input-stack zstream)) :stop))
(setf (zstream-token-category zstream) nil)
'(consume-token zstream)) )
- name kind))
+ name
+ kind
+ internalp))
-;;;;
-
-#|
-
-(defparameter *test-files*
- '(;;"jclark:xmltest;not-wf;*;*.xml"
- "jclark:xmltest;valid;*;*.xml"
- ;;"jclark:xmltest;invalid;*.xml"
- ))
-
-(defun run-all-tests (&optional (test-files *test-files*))
- (let ((failed nil))
- (dolist (k test-files)
- (dolist (j (sort (directory k) #'string< :key #'pathname-name))
- (unless (test-file j)
- (push j failed))))
- (fresh-line)
- (cond (failed
- (write-string "**** Test failed on")
- (dolist (k failed)
- (format t "~%**** ~S." k))
- nil)
- (t
- (write-string "**** Test passed!")
- t))))
-
-(defun test-file (filename)
- (let ((out-filename (merge-pathnames "out/" filename)))
- (if (probe-file out-filename)
- (positive-test-file filename out-filename)
- (negative-test-file filename))))
-
-(defun positive-test-file (filename out-filename)
- (multiple-value-bind (nodes condition)
- (ignore-errors (parse-file filename))
- (cond (condition
- (warn "**** Error in ~S: ~A." filename condition)
- nil)
- (t
- (let (res equal?)
- (setf res (with-output-to-string (sink)
- (unparse-document nodes sink)))
- (setf equal?
- (with-open-file (in out-filename :direction :input :element-type 'character)
- (do ((i 0 (+ i 1))
- (c (read-char in nil nil) (read-char in nil nil)))
- ((or (eq c nil) (= i (length res)))
- (and (eq c nil) (= i (length res))))
- (unless (eql c (char res i))
- (return nil)))))
- (cond ((not equal?)
- (format t "~&**** Test failed on ~S." filename)
- (fresh-line)
- (format t "** me: ~A" res)
- (fresh-line)
- (format t "** he: " res)
- (finish-output)
- (with-open-file (in out-filename :direction :input :element-type 'character)
- (do ((c (read-char in nil nil) (read-char in nil nil)))
- ((eq c nil))
- (write-char c)))
- nil)
- (t
- t)))))))
-
-(defun negative-test-file (filename)
- (multiple-value-bind (nodes condition)
- (ignore-errors (parse-file filename))
- (declare (ignore nodes))
- (cond (condition
- t)
- (t
- (warn "**** negative test failed on ~S." filename)))))
-
-|#
-
-;;;;
-
-#+(or) ;was ist das?
-(progn
-
- (defmethod dom:create-processing-instruction ((document null) target data)
- (declare (ignorable document target data))
- nil)
-
- (defmethod dom:append-child ((node null) child)
- (declare (ignorable node child))
- nil)
-
- (defmethod dom:create-element ((document null) name)
- (declare (ignorable document name))
- nil)
-
- (defmethod dom:set-attribute ((document null) name value)
- (declare (ignorable document name value))
- nil)
-
- (defmethod dom:create-text-node ((document null) data)
- (declare (ignorable document data))
- nil)
-
- (defmethod dom:create-cdata-section ((document null) data)
- (declare (ignorable document data))
- nil)
- )
-
-
#||
(defmacro read-data-until* ((predicate input res res-start res-end) &body body)
;; fast variant -- for now disabled for no apparent reason
@@ -3218,17 +3223,14 @@
(t
we continue
(sf rptr (%+ rptr 1))) ))
- ,@body ))
+ ,@body ))
||#
-;(defun read-data-until (predicate input continuation)
-; )
-
(defmacro read-data-until* ((predicate input res res-start res-end) &body body)
- "Read data from `input' until `predicate' applied to the read char
+ "Read data from `input' until `predicate' applied to the read char
turns true. Then execute `body' with `res', `res-start', `res-end'
bound to denote a subsequence (of RUNEs) containing the read portion.
- The rune upon which `predicate' turned true is neither consumed from
+ The rune upon which `predicate' turned true is neither consumed from
the stream, nor included in `res'.
Keep the predicate short, this it may be included more than once into
@@ -3238,11 +3240,11 @@
(collect (gensym))
(c (gensym)))
`(LET ((,input-var ,input))
- (MULTIPLE-VALUE-BIND (,res ,res-start ,res-end)
+ (MULTIPLE-VALUE-BIND (,res ,res-start ,res-end)
(WITH-RUNE-COLLECTOR/RAW (,collect)
(LOOP
(LET ((,c (PEEK-RUNE ,input-var)))
- (COND ((EQ ,c :EOF)
+ (COND ((EQ ,c :EOF)
;; xxx error message
(RETURN))
((FUNCALL ,predicate ,c)
@@ -3252,11 +3254,11 @@
(CONSUME-RUNE ,input-var))))))
(LOCALLY
,@body)))))
-
+
(defun read-name-token (input)
(read-data-until* ((lambda (rune)
(declare (type rune rune))
- (not (name-rune-p rune)))
+ (not (name-rune-p rune)))
input
r rs re)
(intern-name r rs re)))
@@ -3264,6 +3266,11 @@
(defun read-cdata (input)
(read-data-until* ((lambda (rune)
(declare (type rune rune))
+ (when (and (%rune< rune #/U+0020)
+ (not (or (%rune= rune #/U+0009)
+ (%rune= rune #/U+000a)
+ (%rune= rune #/U+000d))))
+ (wf-error input "code point invalid: ~A" rune))
(or (%rune= rune #/<) (%rune= rune #/&)))
input
source start end)
@@ -3286,9 +3293,9 @@
(defun internal-entity-expansion (name)
(let ((def (get-entity-definition name :general (dtd *ctx*))))
(unless def
- (error "Entity '~A' is not defined." (rod-string name)))
+ (wf-error nil "Entity '~A' is not defined." (rod-string name)))
(unless (typep def 'internal-entdef)
- (error "Entity '~A' is not an internal entity." name))
+ (wf-error nil "Entity '~A' is not an internal entity." name))
(or (entdef-expansion def)
(setf (entdef-expansion def) (find-internal-entity-expansion name)))))
@@ -3303,33 +3310,31 @@
(return))
((rune= c #/&)
(setf c (peek-rune input))
- (cond ((rune= c #/#)
- (let ((c (read-numeric-entity input)))
+ (cond ((eql c :eof)
+ (eox input))
+ ((rune= c #/#)
+ (let ((c (read-character-reference input)))
(%put-unicode-char c collect)))
(t
- (unless (name-start-rune-p (peek-rune input))
- (error "Expecting name after &."))
+ (unless (name-start-rune-p c)
+ (wf-error zinput "Expecting name after &."))
(let ((name (read-name-token input)))
(setf c (read-rune input))
- (assert (rune= c #/\;))
- (recurse-on-entity
+ (check-rune input c #/\;)
+ (recurse-on-entity
zinput name :general
(lambda (zinput)
(muffle (car (zstream-input-stack zinput)))))))))
- ((and (rune= c #/<))
- ;; xxx fix error message
- (cerror "Eat them in spite of this."
- "For no apparent reason #\/< is forbidden in attribute values. ~
- You lost -- next time choose SEXPR syntax.")
- (collect c))
+ ((rune= c #/<)
+ (wf-error zinput "unexpected #\/<"))
((space-rune-p c)
(collect #/space))
((not (data-rune-p c))
- (error "illegal char: ~S." c))
+ (wf-error zinput "illegal char: ~S." c))
(t
(collect c)))))))
(declare (dynamic-extent #'muffle))
- (recurse-on-entity
+ (recurse-on-entity
zinput name :general
(lambda (zinput)
(muffle (car (zstream-input-stack zinput))))) ))))
@@ -3349,27 +3354,33 @@
(internal-entdef (p/content input))
(external-entdef (p/ext-parsed-ent input)))
(unless (eq (peek-token input) :eof)
- (error "Trailing garbage. - ~S" (peek-token input))))))))
+ (wf-error input "Trailing garbage. - ~S"
+ (peek-token input))))))))
nil)))
(defun read-att-value-2 (input)
(let ((delim (read-rune input)))
+ (when (eql delim :eof)
+ (eox input))
(unless (member delim '(#/\" #/\') :test #'eql)
- (error "Bad attribute value delimiter ~S, must be either #\\\" or #\\\'."
- (if (< delim char-code-limit) (code-char delim) delim)))
+ (wf-error input
+ "Bad attribute value delimiter ~S, must be either #\\\" or #\\\'."
+ (rune-char delim)))
(with-rune-collector-4 (collect)
(loop
(let ((c (read-rune input)))
(cond ((eq c :eof)
- (error "EOF"))
+ (eox input "EOF"))
((rune= c delim)
(return))
+ ((rune= c #/<)
+ (wf-error input "'<' not allowed in attribute values"))
((rune= #/& c)
- (multiple-value-bind (kind sem) (read-entity-ref input)
+ (multiple-value-bind (kind sem) (read-entity-like input)
(ecase kind
- (:NUMERIC
+ (:CHARACTER-REFERENCE
(%put-unicode-char sem collect))
- (:NAMED
+ (:ENTITY-REFERENCE
(let* ((exp (internal-entity-expansion sem))
(n (length exp)))
(declare (type (simple-array rune (*)) exp))
@@ -3385,16 +3396,12 @@
;;; Namespace stuff
-(defvar *default-namespace-bindings*
- '((#"" . nil)
- (#"xmlns" . #"http://www.w3.org/2000/xmlns/")
- (#"xml" . #"http://www.w3.org/XML/1998/namespace")))
-
;; We already know that name is part of a valid XML name, so all we
;; have to check is that the first rune is a name-start-rune and that
;; there is not colon in it.
(defun nc-name-p (name)
- (and (name-start-rune-p (rune name 0))
+ (and (plusp (length name))
+ (name-start-rune-p (rune name 0))
(notany #'(lambda (rune) (rune= #/: rune)) name)))
(defun split-qname (qname)
@@ -3403,11 +3410,14 @@
(if pos
(let ((prefix (subseq qname 0 pos))
(local-name (subseq qname (1+ pos))))
+ (when (zerop pos)
+ (wf-error nil "empty namespace prefix"))
(if (nc-name-p local-name)
(values prefix local-name)
- (error "~S is not a valid NcName." local-name)))
+ (wf-error nil "~S is not a valid NcName."
+ (rod-string local-name))))
(values () qname))))
-
+
(defun decode-qname (qname)
"decode-qname name => namespace-uri, prefix, local-name"
(declare (type runes:simple-rod qname))
@@ -3415,12 +3425,12 @@
(let ((uri (find-namespace-binding prefix)))
(if uri
(values uri prefix local-name)
- (values nil nil nil)))))
+ (values nil nil qname)))))
(defun find-namespace-binding (prefix)
- (cdr (or (assoc (or prefix #"") (namespace-bindings *ctx*) :test #'rod=)
- (error "Undeclared namespace prefix: ~A" (rod-string prefix)))))
+ (cdr (or (assoc (or prefix #"") *namespace-bindings* :test #'rod=)
+ (wf-error nil "Undeclared namespace prefix: ~A" (rod-string prefix)))))
;; FIXME: Should probably be refactored by adding :start and :end to rod=/rod-equal
(defun rod-starts-with (prefix rod)
@@ -3437,142 +3447,112 @@
(subseq attrname 6)
nil))
-(defun find-namespace-declarations (element attr-alist)
- (let ((result
- (mapcar #'(lambda (attr)
- (cons (attrname->prefix (car attr)) (cdr attr)))
- (remove-if-not #'xmlns-attr-p attr-alist :key #'car))))
- ;; Argh! PROCESS-ATTRIBUTES needs to know the attributes' namespaces
- ;; already. But namespace declarations can be done using default values
- ;; in the DTD. So we need to handle defaulting of attribute values twice,
- ;; once for xmlns attributes, then for all others. (I really hope I'm
- ;; wrong on this one, but I don't see how.)
- (let ((e (find-element element (dtd *ctx*))))
- (when e
- (dolist (ad (elmdef-attributes e)) ;handle default values
- (let* ((name (attdef-name ad))
- (prefix (attrname->prefix name)))
- (when (and (xmlns-attr-p name)
- (not (member prefix result :key #'car :test #'rod=))
- (listp (attdef-default ad)) ;:DEFAULT or :FIXED
- )
- (push (cons prefix (cadr (attdef-default ad))) result))))))
- result))
+(defun find-namespace-declarations (attributes)
+ (loop
+ for attribute in attributes
+ for qname = (sax:attribute-qname attribute)
+ when (xmlns-attr-p qname)
+ collect (cons (attrname->prefix qname) (sax:attribute-value attribute))))
-(defun declare-namespaces (element attr-alist)
- (let ((ns-decls (find-namespace-declarations element attr-alist)))
- (dolist (ns-decl ns-decls )
+(defun declare-namespaces (attributes)
+ (let ((ns-decls (find-namespace-declarations attributes)))
+ (dolist (ns-decl ns-decls)
;; check some namespace validity constraints
- ;; FIXME: Would be nice to add "this is insane, go ahead" restarts
(let ((prefix (car ns-decl))
- (uri (if (rod= #"" (cdr ns-decl))
- nil
- (cdr ns-decl))))
+ (uri (cdr ns-decl)))
(cond
((and (rod= prefix #"xml")
(not (rod= uri #"http://www.w3.org/XML/1998/namespace")))
- (error "Attempt to rebind the prefix \"xml\" to ~S." (mu uri)))
+ (wf-error nil
+ "Attempt to rebind the prefix \"xml\" to ~S." (mu uri)))
((and (rod= uri #"http://www.w3.org/XML/1998/namespace")
(not (rod= prefix #"xml")))
- (error "The namespace URI \"http://www.w3.org/XML/1998/namespace\" ~
- may not be bound to the prefix ~S, only \"xml\" is legal."
- (mu prefix)))
+ (wf-error nil
+ "The namespace ~
+ URI \"http://www.w3.org/XML/1998/namespace\" may not ~
+ be bound to the prefix ~S, only \"xml\" is legal."
+ (mu prefix)))
((and (rod= prefix #"xmlns")
(rod= uri #"http://www.w3.org/2000/xmlns/"))
- (error "Attempt to bind the prefix \"xmlns\" to its predefined ~
- URI \"http://www.w3.org/2000/xmlns/\", which is ~
- forbidden for no good reason."))
+ (wf-error nil
+ "Attempt to bind the prefix \"xmlns\" to its predefined ~
+ URI \"http://www.w3.org/2000/xmlns/\", which is ~
+ forbidden for no good reason."))
((rod= prefix #"xmlns")
- (error "Attempt to bind the prefix \"xmlns\" to the URI ~S, ~
- but it may not be declared." (mu uri)))
+ (wf-error nil
+ "Attempt to bind the prefix \"xmlns\" to the URI ~S, ~
+ but it may not be declared." (mu uri)))
((rod= uri #"http://www.w3.org/2000/xmlns/")
- (error "The namespace URI \"http://www.w3.org/2000/xmlns/\" may ~
- not be bound to prefix ~S (or any other)." (mu prefix)))
+ (wf-error nil
+ "The namespace URI \"http://www.w3.org/2000/xmlns/\" may ~
+ not be bound to prefix ~S (or any other)." (mu prefix)))
((and (rod= uri #"") prefix)
- (error "Only the default namespace (the one without a prefix) may ~
- be bound to an empty namespace URI, thus undeclaring it."))
+ (wf-error nil
+ "Only the default namespace (the one without a prefix) ~
+ may be bound to an empty namespace URI, thus ~
+ undeclaring it."))
(t
- (push (cons prefix uri) (namespace-bindings *ctx*))
- (sax:start-prefix-mapping (handler *ctx*) (car ns-decl) (cdr ns-decl))))))
+ (push (cons prefix (if (rod= #"" uri) nil uri))
+ *namespace-bindings*)
+ (sax:start-prefix-mapping (handler *ctx*)
+ (car ns-decl)
+ (cdr ns-decl))))))
ns-decls))
(defun undeclare-namespaces (ns-decls)
(dolist (ns-decl ns-decls)
- (setf (namespace-bindings *ctx*) (delete ns-decl (namespace-bindings *ctx*)))
(sax:end-prefix-mapping (handler *ctx*) (car ns-decl))))
-(defun build-attribute-list-no-ns (attr-alist)
- (mapcar #'(lambda (pair)
- (sax:make-attribute :qname (car pair)
- :value (cdr pair)
- :specified-p t))
- attr-alist))
-
-;; FIXME: Use a non-braindead way to enforce attribute uniqueness
-(defun build-attribute-list-ns (attr-alist)
+(defun build-attribute-list (attr-alist)
+ ;; fixme: if there is a reason this function reverses attribute order,
+ ;; it should be documented.
(let (attributes)
(dolist (pair attr-alist)
- (push (build-attribute (car pair) (cdr pair) t) attributes))
-
- ;; 5.3 Uniqueness of Attributes
- ;; In XML documents conforming to [the xmlns] specification, no
- ;; tag may contain two attributes which:
- ;; 1. have identical names, or
- ;; 2. have qualified names with the same local part and with
- ;; prefixes which have been bound to namespace names that are
- ;; identical.
- ;;
- ;; 1. is checked by read-tag-2, so we only deal with 2 here
- (do ((sublist attributes (cdr sublist)))
- ((null sublist) attributes)
- (let ((attr-1 (car sublist)))
+ (push (sax:make-attribute :qname (car pair)
+ :value (cdr pair)
+ :specified-p t)
+ attributes))
+ attributes))
+
+(defun check-attribute-uniqueness (attributes)
+ ;; 5.3 Uniqueness of Attributes
+ ;; In XML documents conforming to [the xmlns] specification, no
+ ;; tag may contain two attributes which:
+ ;; 1. have identical names, or
+ ;; 2. have qualified names with the same local part and with
+ ;; prefixes which have been bound to namespace names that are
+ ;; identical.
+ ;;
+ ;; 1. is checked by read-tag-2, so we only deal with 2 here
+ (loop for (attr-1 . rest) on attributes do
(when (and (sax:attribute-namespace-uri attr-1)
- (find-if #'(lambda (attr-2)
- (and (rod= (sax:attribute-namespace-uri attr-1)
- (sax:attribute-namespace-uri attr-2))
- (rod= (sax:attribute-local-name attr-1)
- (sax:attribute-local-name attr-2))))
- (cdr sublist)))
- (error "Multiple definitions of attribute ~S in namespace ~S."
- (mu (sax:attribute-local-name attr-1))
- (mu (sax:attribute-namespace-uri attr-1))))))))
-
-(defun build-attribute (name value specified-p)
- (multiple-value-bind (prefix local-name) (split-qname name)
- (declare (ignorable local-name))
- (if (or (not prefix) ;; default namespace doesn't apply to attributes
- (and (rod= #"xmlns" prefix) (not sax:*use-xmlns-namespace*)))
- (sax:make-attribute :qname name
- :value value
- :specified-p specified-p)
- (multiple-value-bind (uri prefix local-name)
- (decode-qname name)
- (declare (ignore prefix))
- (sax:make-attribute :qname name
- :value value
- :namespace-uri uri
- :local-name local-name
- :specified-p specified-p)))))
-
-;;; Faster constructors
+ (find-if (lambda (attr-2)
+ (and (rod= (sax:attribute-namespace-uri attr-1)
+ (sax:attribute-namespace-uri attr-2))
+ (rod= (sax:attribute-local-name attr-1)
+ (sax:attribute-local-name attr-2))))
+ rest))
+ (wf-error nil
+ "Multiple definitions of attribute ~S in namespace ~S."
+ (mu (sax:attribute-local-name attr-1))
+ (mu (sax:attribute-namespace-uri attr-1))))))
-;; Since using the general DOM interface to construct the parsed trees
-;; may turn out to be quite expensive (That depends on the underlying
-;; DOM implementation). A particular DOM implementation may choose to
-;; implement an XML:FAST-CONSTRUCTORS method:
+(defun set-attribute-namespace (attribute)
+ (let ((qname (sax:attribute-qname attribute)))
+ (if (and sax:*use-xmlns-namespace* (rod= qname #"xmlns"))
+ (setf (sax:attribute-namespace-uri attribute)
+ #"http://www.w3.org/2000/xmlns/")
+ (multiple-value-bind (prefix local-name) (split-qname qname)
+ (declare (ignorable local-name))
+ (when (and prefix ;; default namespace doesn't apply to attributes
+ (or (not (rod= #"xmlns" prefix))
+ sax:*use-xmlns-namespace*))
+ (multiple-value-bind (uri prefix local-name)
+ (decode-qname qname)
+ (declare (ignore prefix))
+ (setf (sax:attribute-namespace-uri attribute) uri)
+ (setf (sax:attribute-local-name attribute) local-name)))))))
-;; XML:FAST-CONSTRUCTORS document [method]
-;;
-;; Return an alist of constructors suitable for the document `document'.
-;;
-;; (:MAKE-TEXT document parent data)
-;; (:MAKE-PROCESSING-INSTRUCTION document parent target content)
-;; (:MAKE-NODE document parent attributes content)
-;; [`attributes' now in turn is an alist]
-;; (:MAKE-CDATA document parent data)
-;; (:MAKE-COMMENT document parent data)
-;;
-
;;;;;;;;;;;;;;;;;
;; System Identifier Protocol
@@ -3596,18 +3576,8 @@
;; `base' yielding an absolute system identifier suitable for
;; OPEN-SYS-ID.
-;; xstream Controller Protocol
-;;
-;;
-
-#||
-(defun xml-parse (system-id &key document standalone-p)
- )
-||#
-
;;;;;;;;;;;;;;;;;
-
;;; SAX validation handler
(defclass validator ()
Added: branches/grin-neu/thirdparty/cxml/xml/xmlns-normalizer.lisp
===================================================================
--- branches/grin-neu/thirdparty/cxml/xml/xmlns-normalizer.lisp 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/cxml/xml/xmlns-normalizer.lisp 2006-12-01 10:39:49 UTC (rev 2094)
@@ -0,0 +1,133 @@
+;;;; xmlns-normalizer.lisp -- DOM 3-style namespace normalization
+;;;;
+;;;; This file is part of the CXML parser, released under Lisp-LGPL.
+;;;; See file COPYING for details.
+;;;;
+;;;; Copyright (c) 2005 David Lichteblau
+
+;;;; Hier eine Variante des reichlich furchtbaren Algorithmus zur
+;;;; Namespace-Normalisierung aus DOM 3 Core.[1]
+;;;;
+;;;; Gebraucht wir die Sache, weil Element- und Attributknoten in DOM
+;;;; zwar ein Prefix-Attribut speichern, massgeblich fuer ihren Namespace
+;;;; aber nur die URI sein soll. Und eine Anpassung der zugehoerigen
+;;;; xmlns-Attribute findet bei Veraenderungen im DOM-Baum nicht statt,
+;;;; bzw. wird dem Nutzer ueberlassen.
+;;;;
+;;;; Daher muss letztlich spaetestens beim Serialisieren eine
+;;;; Namespace-Deklaration fuer die angegebene URI nachgetragen und das
+;;;; Praefix ggf. umbenannt werden, damit am Ende doch etwas
+;;;; Namespace-konformes heraus kommt.
+;;;;
+;;;; Und das nennen sie dann Namespace-Support.
+;;;;
+;;;; [1] http://www.w3.org/TR/2004/REC-DOM-Level-3-Core-20040407/namespaces-algorith…
+
+(in-package :cxml)
+
+(defclass namespace-normalizer (sax-proxy)
+ ((xmlns-stack :initarg :xmlns-stack :accessor xmlns-stack)))
+
+(defvar *xmlns-namespace* #"http://www.w3.org/2000/xmlns/")
+
+(defun make-namespace-normalizer (chained-handler)
+ (make-instance 'namespace-normalizer
+ :xmlns-stack (list (mapcar (lambda (cons)
+ (make-xmlns-attribute (car cons) (cdr cons)))
+ *namespace-bindings*))
+ :chained-handler chained-handler))
+
+(defun normalizer-find-prefix (handler prefix)
+ (when (zerop (length prefix))
+ (setf prefix #"xmlns"))
+ (block t
+ (dolist (bindings (xmlns-stack handler))
+ (dolist (attribute bindings)
+ (when (rod= (sax:attribute-local-name attribute) prefix)
+ (return-from t attribute))))))
+
+(defun normalizer-find-uri (handler uri)
+ (block t
+ (dolist (bindings (xmlns-stack handler))
+ (dolist (attribute bindings)
+ (when (and (rod= (sax:attribute-value attribute) uri)
+ ;; default-namespace interessiert uns nicht
+ (not (rod= (sax:attribute-qname attribute) #"xmlns")))
+ (return-from t attribute))))))
+
+(defun make-xmlns-attribute (prefix uri)
+ (if (and (plusp (length prefix)) (not (equal prefix #"xmlns")))
+ (sax:make-attribute
+ :qname (concatenate 'rod #"xmlns:" prefix)
+ :namespace-uri *xmlns-namespace*
+ :local-name prefix
+ :value uri)
+ (sax:make-attribute
+ :qname #"xmlns"
+ :namespace-uri *xmlns-namespace*
+ :local-name #"xmlns"
+ :value uri)))
+
+(defun rename-attribute (a new-prefix)
+ (setf (sax:attribute-qname a)
+ (concatenate 'rod new-prefix #":" (sax:attribute-local-name a))))
+
+(defmethod sax:start-element
+ ((handler namespace-normalizer) uri lname qname attrs)
+ (declare (ignore qname))
+ (when (null uri)
+ (setf uri #""))
+ (let ((normal-attrs '()))
+ (push nil (xmlns-stack handler))
+ (dolist (a attrs)
+ (if (rod= *xmlns-namespace* (sax:attribute-namespace-uri a))
+ (push a (car (xmlns-stack handler)))
+ (push a normal-attrs)))
+ (flet ((push-namespace (prefix uri)
+ (let ((new (make-xmlns-attribute prefix uri)))
+ (push new (car (xmlns-stack handler)))
+ (push new attrs))))
+ (multiple-value-bind (prefix local-name) (split-qname qname)
+ (setf lname local-name)
+ (let ((binding (normalizer-find-prefix handler prefix)))
+ (cond
+ ((null binding)
+ (unless (and (null prefix) (zerop (length uri)))
+ (push-namespace prefix uri)))
+ ((rod= (sax:attribute-value binding) uri))
+ ((member binding (car (xmlns-stack handler)))
+ (setf (sax:attribute-value binding) uri))
+ (t
+ (push-namespace prefix uri)))))
+ (dolist (a normal-attrs)
+ (let ((u (sax:attribute-namespace-uri a)))
+ (when u
+ (let* ((prefix (split-qname (sax:attribute-qname a)))
+ (prefix-binding
+ (when prefix
+ (normalizer-find-prefix handler prefix))))
+ (when (or (null prefix-binding)
+ (not (rod= (sax:attribute-value prefix-binding) u)))
+ (let ((uri-binding (normalizer-find-uri handler u)))
+ (cond
+ (uri-binding
+ (rename-attribute
+ a
+ (sax:attribute-local-name uri-binding)))
+ ((and prefix (null prefix-binding))
+ (push-namespace prefix u))
+ (t
+ (loop
+ for i from 1
+ for prefix = (rod (format nil "NS~D" i))
+ unless (normalizer-find-prefix handler prefix)
+ do
+ (push-namespace prefix u)
+ (rename-attribute a prefix)
+ (return))))))))))))
+ (sax:start-element (proxy-chained-handler handler) uri lname qname attrs))
+
+(defmethod sax:end-element ((handler namespace-normalizer) uri lname qname)
+ (declare (ignore qname))
+ (pop (xmlns-stack handler))
+ (sax:end-element (proxy-chained-handler handler) (or uri #"") lname qname))
Modified: branches/grin-neu/thirdparty/cxml/xml/xmls-compat.lisp
===================================================================
--- branches/grin-neu/thirdparty/cxml/xml/xmls-compat.lisp 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/cxml/xml/xmls-compat.lisp 2006-12-01 10:39:49 UTC (rev 2094)
@@ -1,19 +1,18 @@
;;;; xml-compat.lisp -- XMLS-compatible data structures
;;;;
-;;;; This file is part of the CXML parser, released under (L)LGPL.
+;;;; This file is part of the CXML parser, released under Lisp-LGPL.
;;;; See file COPYING for details.
;;;;
;;;; Developed 2004 for headcraft - http://headcraft.de/
;;;; Copyright: David Lichteblau
;;;; XXX Der namespace-Support in xmls kommt mir zweifelhaft vor.
-;;;; Wir immitieren das soweit es gebraucht wurde bisher.
+;;;; Wir imitieren das soweit es gebraucht wurde bisher.
(defpackage cxml-xmls
(:use :cl :runes)
(:export #:make-node #:node-name #:node-ns #:node-attrs #:node-children
- #:make-xmls-builder #:map-node
- #:*identifier-case*))
+ #:make-xmls-builder #:map-node))
(in-package :cxml-xmls)
@@ -65,60 +64,32 @@
;;;; SAX-Handler (Parser)
-(defvar *identifier-case* nil
- "One of NIL (don't intern names), :PRESERVE, :UPCASE, :DOWNCASE, or :INVERT
- (intern name into the keyword package after adjusting case).")
-
(defclass xmls-builder ()
((element-stack :initform nil :accessor element-stack)
- (root :initform nil :accessor root)))
+ (root :initform nil :accessor root)
+ (include-default-values :initform t
+ :initarg :include-default-values
+ :accessor include-default-values)))
-(defun make-xmls-builder ()
- (make-instance 'xmls-builder))
+(defun make-xmls-builder (&key (include-default-values t))
+ (make-instance 'xmls-builder :include-default-values include-default-values))
(defmethod sax:end-document ((handler xmls-builder))
(root handler))
-(defun string-invert-case (str)
- (map 'string
- (lambda (c)
- (cond
- ((upper-case-p c) (char-downcase c))
- ((lower-case-p c) (char-upcase c))
- (t c)))
- str))
-
-(defun maybe-intern (name)
- (if *identifier-case*
- (let ((str (if (stringp name) name (rod-string name))))
- (intern (ecase *identifier-case*
- (:preserve str)
- (:upcase (string-upcase str))
- (:downcase (string-downcase str))
- (:invert (string-invert-case str)))
- :keyword))
- name))
-
-(defun maybe-stringify (name)
- (if (symbolp name)
- (let ((str (symbol-name name)))
- (ecase *identifier-case*
- (:preserve str)
- (:upcase (string-downcase str))
- (:downcase (string-upcase str))
- (:invert (string-invert-case str))))
- name))
-
(defmethod sax:start-element
((handler xmls-builder) namespace-uri local-name qname attributes)
(declare (ignore namespace-uri))
(setf local-name (or local-name qname))
(let* ((attributes
- (mapcar (lambda (attr)
- (list (maybe-intern (sax:attribute-qname attr))
- (sax:attribute-value attr)))
- attributes))
- (node (make-node :name (maybe-intern local-name)
+ (loop
+ for attr in attributes
+ when (or (sax:attribute-specified-p attr)
+ (include-default-values handler))
+ collect
+ (list (sax:attribute-qname attr)
+ (sax:attribute-value attr))))
+ (node (make-node :name local-name
:ns (let ((lq (length qname))
(ll (length local-name)))
(if (eql lq ll)
@@ -163,10 +134,13 @@
(labels ((walk (node)
(let* ((attlist
(compute-attributes node include-xmlns-attributes))
- (lname (rod (maybe-stringify (node-name node))))
- (ns (rod (node-ns node)))
- (qname (concatenate 'rod ns (rod ":") lname)))
- ;; fixme: namespaces
+ (lname (rod (node-name node)))
+ (qname (if (node-ns node)
+ (concatenate 'rod
+ (rod (node-ns node))
+ (rod ":")
+ lname)
+ lname)))
(sax:start-element handler nil lname qname attlist)
(dolist (child (node-children node))
(typecase child
@@ -180,7 +154,6 @@
(remove nil
(mapcar (lambda (a)
(destructuring-bind (name value) a
- (setf name (maybe-stringify name))
(if (or xmlnsp (not (cxml::xmlns-attr-p (rod name))))
(sax:make-attribute :qname (rod name)
:value (rod value)
Modified: branches/grin-neu/thirdparty/emacs/slime/swank-loader.x86f
===================================================================
--- branches/grin-neu/thirdparty/emacs/slime/swank-loader.x86f 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/emacs/slime/swank-loader.x86f 2006-12-01 10:39:49 UTC (rev 2094)
@@ -1,22 +1,20 @@
FASL FILE output from /usr/home/hans/bknr-svn/thirdparty/emacs/slime/swank-loader.lisp.
-Compiled Wednesday, 11/15/06 07:15:22 am GMT on ibuprofen.huebner.org
+Compiled Thursday, 11/30/06 10:50:00 pm GMT on ibuprofen.huebner.org
Compiler 1.1, Lisp 19c Release (19C)
Targeted for Intel x86, FASL version 19C
-���Q&KERNEL%DEFPACKAGE&SWANK-LOADER&COMMON-LISPQUOTEQUOTEQUOTEQUOTEQUOTE&COMMON-LISPQUOTEQUOTEQUOTEQUOTE6RQ%IN-PACKAGEQUOTE&SWANK-LOADER6R?>#�B&lispNNAMENTYPE
MAKE-PATHNAME<*COMPILE-FILE-PATHNAME*MERGE-PATHNAMES<*LOAD-PATHNAME**DEFAULT-PATHNAME-DEFAULTS*Q&CCOMPILED-DEBUG-INFORQR($$-Q&
-EXTENSIONSINSTANCER($$-QSTRUCTURE-OBJECTR($$- Q
-DEBUG-INFOR ("$$-#($$$-%&DEFUN MAKE-SWANK-PATHNAME&&SWANK-LOADER'QCOMPILED-DEBUG-FUNCTIONR QDEBUG-FUNCTIONR (*$$-+(,$$
--Q&SWANK-LOADERR.MAKE-SWANK-PATHNAMENEXTERNAL+G2MG3�G4��1+&2$+$3NSTANDARD$'$$#�1
5$5-&NOPTIONAL+NAME�7+58$+94$'$$5#�1
:$A-/+NAMECTYPECOMMON-LISP�;+EA*<$$
OPTIONAL-ARGS$(>4$'$$A#�1
?(@1AB;
-�~�E��e���t��u�U�}���
-M�U��E�܃���}�5�E�C����k����P��
!�A�=�tH=�(t���%��u��`�
)�A�=�t#=�(t���ԋ-�x����t���
-N�
-N�
-QNABSOLUTER��QNABSOLUTER��QNABSOLUTER��QNABSOLUTER�rQNABSOLUTER�]QNABSOLUTER�QQNABSOLUTER�HQNABSOLUTER�:=?K/&(name &optional (type "lisp"))LFUNCTION &OPTIONALOPATHNAMEQ�/RJ?>S#B&nregexST&swank-source-path-parserU&swank-source-file-cacheV&swank-cmuclWXAPPEND</<.*SYSDEP-PATHNAMES*CONS%&DEFPARAMETER *SYSDEP-PATHNAMES*\'-&Top-Level Form]N TOP-LEVEL+_+P{ W`$+a4$'$$#x1
b(c1de;~�E��e��(�4�(��(�|�(;��(v��|�(�[�ÉP��@�(��(�=4�(t� ��u��u�܃���=���k����P��u�������}��u�V��܃����k����P��u�}��4�(��(�|�(;��(v��|�(�[�ÉP��@�(��(�=4�(t� �ˁ��(t>�_�v��$<u>��=�(�c����E�@�
!�A���(�M��E��������%�
-!���
-��QNABSOLUTER�lQNABSOLUTER�OQNRELATIVER�alloc_overflow_ebx�QNABSOLUTER��QNABSOLUTER��QNABSOLUTER��QNABSOLUTER�QNRELATIVER�alloc_overflow_ebxE=?n]&()oM�/R&BReturn a pathname with name component NAME in the Slime directory.qPROCLAIM<SPECIALZt#]1uv;? !"�q#$�q0�w]$$QSIMPLE-BYTE-FUNCTIONRQFUNCTIONR(z$$-{QFUNCALLABLE-INSTANCER{(}$$-~QBYTE-FUNCTION-OR-CLOSURER{~(�$$-�Q
BYTE-FUNCTIONR{~�(�$$-�(�$$-���8p8LSET-DEFVAR-SOURCE-LOCATION<ZQFILE-SOURCE-LOCATIONR QFORM-NUMBERSR (�$$-�(�$$-�$&@/usr/home/hans/bknr-svn/thirdparty/emacs/slime/swank-loader.lisp�1�r<s.*IMPLEMENTATION-FEATURES*�NALLEGRON LISPWORKSNSBCLNOPENMCLNCMUNCLISPNCCLNCORMANN ARMEDBEARNGCLNECL����$�1�s.
*OS-FEATURES*�NMACOSXNLINUXNWINDOWSN MSWINDOWSNWIN32NSOLARISNDARWINNSUNOSNUNIX ���$�1�#]1��; !"�q#$�q%&� '(�q#)�q*+� +,�q0��]$$���8?>�$]BLISP-IMPLEMENTATION-VERSION<
-SUBSTITUTE<%&DEFUN LISP-VERSION-STRING�'-.LISP-VERSION-STRING0+G0M�+;�$+�4$'$$$X1
�$"-�+�+"�$+�4$'$$"$]1
�(�1��;]~�E��e���u6�ԃ��1ɉj����P���-��/���u��`���
-MQNABSOLUTER�GQNABSOLUTER�)=?��oMSIMPLE-BASE-STRING��J?>�#&B�&&No implementation feature found in ~a.��&No os feature found in ~a.�.*ARCHITECTURE-FEATURES*&$No architecture feature found in ~a.��<&TDon't know how to get Lisp ~
- implementation version.�&~(~@{~a~^-~}~)�FORMAT<
-*FEATURES*FIND<WARN<&unknown�%&DEFUN UNIQUE-DIRECTORY-NAME�'-.UNIQUE-DIRECTORY-NAME0+G6M�+���$+�4$'$$#�1
�$&-�+VALUE��+f&)�,�+�&+�3�$+�4$'$$&#�1
�#�-FLET.FIRST-OF��+F�FEATURES���+C��F ��$+�+�$'$#�#1
�#M-�.
-MAYBE-WARN��+ARGS��FSTRINGcVALUEC�+4�M
N" <
�$$$REST-ARG$(�+�$'$#M#1
�(�1��;&~�E��e������
�A�=����͋ԃ� �؉J����E���j����P�������4�(��(�|�(;��(v��|�(�[�ÉP��@�(��(�=4�(t� �ŋ̃� �q��Q��A����E�%�q�E�
�A�=���͋ԃ� �؉J����E�V�����P�������4�(��(�|�(;��(v��|�(�[�ÉP��@�(��(�=4�(t� �ŋ̃� �q��Q��A����E����E�!�X�����T�ŋ̃� �A����E������!�P�����*�4�(��(�|�(;��(v��|�(�[�ÉP��@�(��(�=4�(t� �ŋ̃� �q�%�Q��A����E����E�ԃ��)1ɉj����P��ŋ̃� �Q�-�Q��(�A����E�����(�=1�u�E��E�E�E�E�5��u��`��(��$<�<�Ë��(�[�]�V��v��$<�!�u��9�x������e���]�=��k����P��]�u����(u���(u���(�e��m�����}��(���]��A�x���(���U���R�E���$<���ˋ���(9�t�q��I��$<t��
+���Q&KERNEL%DEFPACKAGE&SWANK-LOADER&COMMON-LISPQUOTEQUOTEQUOTEQUOTEQUOTE&CLQUOTEQUOTEQUOTE&
+LOAD-SWANK&*SOURCE-DIRECTORY*&*FASL-DIRECTORY*QUOTE6RQ%IN-PACKAGEQUOTE&SWANK-LOADER6RPROCLAIM<SPECIALQ&SWANK-LOADERR*SOURCE-DIRECTORY*BOUNDP<
MAKE-PATHNAME<NNAMENDEFAULTS*LOAD-PATHNAME*SETF
DOCUMENTATION<&+The directory where to look for the source.VARIABLELSET-DEFVAR-SOURCE-LOCATION<Q&CFILE-SOURCE-LOCATIONRQR( $$-!Q&
+EXTENSIONS"INSTANCER!($$$-%QSTRUCTURE-OBJECTR!%('$$-(QFORM-NUMBERSR!%((*$$-+(,$$--$&@/usr/home/hans/bknr-svn/thirdparty/emacs/slime/swank-loader.lisp.1/*SYSDEP-FILES*1&nregex23&swank-source-path-parser4&swank-source-file-cache5&swank-cmucl6700-$.18*DEFAULT-PATHNAME-DEFAULTS*Q
+DEBUG-INFOR!%((;$$-<&Top-Level Form=1>?;C !�q"#��$%090&'�`�(�(�)*+,�q-./�q /�q?//�/�-//�q0�/���@=$$QSIMPLE-BYTE-FUNCTIONR!QFUNCTIONR!(C$$-DQFUNCALLABLE-INSTANCER!D(F$$-GQBYTE-FUNCTION-OR-CLOSURER!DG(I$$-JQ
BYTE-FUNCTIONR!DGJ(L$$-M(N$$-O�P8<*IMPLEMENTATION-FEATURES*RNALLEGRON LISPWORKSNSBCLNOPENMCLNCMUNCLISPNCCLNCORMANN
+CORMANLISPN ARMEDBEARNGCLNECLNSCL
`Q<Q-$.1a
*OS-FEATURES*cNMACOSXNLINUXNWINDOWSN MSWINDOWSNWIN32NSOLARISNDARWINNSUNOSNHPUXNUNIX
+nbb-$.1o*ARCHITECTURE-FEATURES*q<=1rs; !�q"#�$%&�q '�q()�$*+�q ,�q0�t=$$O�u8?>v#)BBLISP-IMPLEMENTATION-VERSION<
SUBSTITUTE-IF<& /xQ&SYSTEMRy%SP-FIND-CHARACTER<QCOMPILED-DEBUG-INFOR!%(<(|$$-}&DEFUN LISP-VERSION-STRING~&SWANK-LOADERQCOMPILED-DEBUG-FUNCTIONR!%(QDEBUG-FUNCTIONR!%((�$$-�(�$$
-�LISP-VERSION-STRINGNEXTERNAL+G0M�+��$+�NSTANDARD$'$$#1
�$&��+�+&�$+��$'$$
�$[�~�+
+G1MG2��+~��$+��$'$$~#1
�#��~+X�+@� 1'�$+��$'$#�#"1
�(�1��;)~�E��e������ԃ��1ɉj����P���_�=���u��`�����~$�E��e������ڀ����]�e���Ë1���M�A��]�!��k����P��]��=�(t6�
�9�v?���
�D�ద%���ЋM��E���������(���(��
+M�
+M�
+&N�
QNABSOLUTER��QNABSOLUTER��QNABSOLUTER��QNABSOLUTER��QNABSOLUTER�LQNABSOLUTER�FQNABSOLUTER�-=?�~&(x)�FUNCTION�ORNULL BASE-CHAR���`�����&()��SIMPLE-BASE-STRING����J?>�#&BQ&&No implementation feature found in ~a.�b&No os feature found in ~a.�p&$No architecture feature found in ~a.��<&TDon't know how to get Lisp ~
+ implementation version.�&~(~@{~a~^-~}~)�FORMAT<
+*FEATURES*FIND<WARN<&unknown�}&DEFUN UNIQUE-DIRECTORY-NAME��UNIQUE-DIRECTORY-NAME�+G6M�+���$+��$'$$#�1
�$&��+VALUE��+f&)�,�+�&+�3�$+��$'$$&#�1
�#��FLETFIRST-OF��+F�FEATURES���+C��F ��$+�+�$'$#�#1
�#M��
+MAYBE-WARN��+ARGS��FSTRINGcVALUEC�+4�M
N" <
�$$$REST-ARG$(�+�$'$#M#1
�(�1��;&~�E��e������
�A�=����͋ԃ� �؉J����E���j����P�������4�(��(�|�(;��(v��|�(�[�ÉP��@�(��(�=4�(t� �ŋ̃� �q��Q��A����E�%�q�E�
�A�=���͋ԃ� �؉J����E�V�����P�������4�(��(�|�(;��(v��|�(�[�ÉP��@�(��(�=4�(t� �ŋ̃� �q��Q��A����E����E�!�X�����T�ŋ̃� �A����E������!�P�����*�4�(��(�|�(;��(v��|�(�[�ÉP��@�(��(�=4�(t� �ŋ̃� �q�%�Q��A����E����E�ԃ��)1ɉj����P��ŋ̃� �Q�-�Q��(�A����E�����(�=1�u�E��E�E�E�E�5��u��`��(��$<�<�Ë��(�[�]�V��v��$<�!�u��9�x������e���]�=��k����P��]�u����(u���(u���(�e��m�����}��(���]��A�x���(���U���R�E���$<���ˋ���(9�t�q��I��$<t��
N��)��]�Nj�)�S��{��s���k����P��]��E�e��m���E����
M�
N�
@@ -29,38 +27,80 @@
���
�
�
-�QNABSOLUTER��QNABSOLUTER�_QNABSOLUTER�QNABSOLUTER��QNABSOLUTER��QNABSOLUTER��QNABSOLUTER��QNABSOLUTER�sQNABSOLUTER�WQNABSOLUTER�DQNABSOLUTER�5QNRELATIVER�alloc_overflow_ebx�QNABSOLUTER��QNABSOLUTER��QNABSOLUTER��QNABSOLUTER��QNABSOLUTER�}QNRELATIVER�alloc_overflow_ebxFQNABSOLUTER�QNABSOLUTER�QNABSOLUTER��QNABSOLUTER��QNABSOLUTER��QNRELATIVER�alloc_overflow_ebx�QNABSOLUTER�XQNABSOLUTER�KQNABSOLUTER�(=? �oMORBASE-STRINGNULL
��Jr<s�NPOWERPCNPPCNX86NX86-64NI686NPC386NIAPX386NSPARC��<��$�1���&�Return a name that can be used as a directory name that is
+�QNABSOLUTER��QNABSOLUTER�_QNABSOLUTER�QNABSOLUTER��QNABSOLUTER��QNABSOLUTER��QNABSOLUTER��QNABSOLUTER�sQNABSOLUTER�WQNABSOLUTER�DQNABSOLUTER�5QNRELATIVER�alloc_overflow_ebx�QNABSOLUTER��QNABSOLUTER��QNABSOLUTER��QNABSOLUTER��QNABSOLUTER�}QNRELATIVER�alloc_overflow_ebxFQNABSOLUTER�QNABSOLUTER�QNABSOLUTER��QNABSOLUTER��QNABSOLUTER��QNRELATIVER�alloc_overflow_ebx�QNABSOLUTER�XQNABSOLUTER�KQNABSOLUTER�(=?�����BASE-STRING������J?>�#�BFILE-WRITE-DATE<}&DEFUN FILE-NEWER-P��FILE-NEWER-P�+G0MG1�G2���+{�$ +$��$'$$#�1
�$)��+NEW-FILECOLD-FILEc�+4)
+$ +�$'$$)#�1
(1;�~�E��e���uu�U�}��܃��U���k����P��U�܃��U����k����P����U������(u��(�M��E��������'�(�ꐐ��
+MQNRELATIVERQ&X86 GENERIC->R�lQNABSOLUTER�SQNABSOLUTER�3=?�&(new-file old-file)�
MEMBER��J?>#�B& ChangeLogMERGE-PATHNAMES<NIF-DOES-NOT-EXISTOPEN<READ<NABORTCLOSE<}&DEFUN SLIME-VERSION-STRING�SLIME-VERSION-STRING�+G10M+�[$
++�$'$$#x1
$&�+S��+i&0"�$*RX $
++!�$'$$&#}1
"#4��
G1$NCLEANUP+S��&+&�4"'$
++(+)$'$#4#�1
*(+1,-;
+�~�E��e����R��x�����B�܃�����k����P��܃��=��(�!��k����P��U̹'�(�4�(��(�|�(;��(v��|�(���@�H���(�=4�(t� �EЋ��(�E����(�
��(��(�E��MĉUȉe��Mԋ��(��i�A��Eԉ��(�}��(���܃��Ű%��k����P����(t��$<�*�B�<���R �Eй�(�H��U���(����(�ŋ̃�`�]ЋủA����E����U�M��E���������(뭉U�]��M�E��MċUȉ��(�
��(��(�]����(9�t!�B� �t
�J��H��B���9�u���(�ŋ̃�`�]ЋủA����E�W��E�]��M�����(u��(�e��m���C��܃��=)���-��k����P���ɐ�����
+M�
+�
+�QNABSOLUTER�^QNABSOLUTER�VQNRELATIVERQUNWINDR�0QNABSOLUTER� QNABSOLUTER��QNABSOLUTER�1QNABSOLUTER�
QNRELATIVER�alloc_overflow_eax�QNABSOLUTER�mQNABSOLUTER�bQNABSOLUTER�HQNABSOLUTER�BQNABSOLUTER�(=?<�����=>�?J?>@#
B<�<APPEND<NRELATIVE&.slimeB&faslCN DIRECTORY<USER-HOMEDIR-PATHNAME<<}&DEFUN DEFAULT-FASL-DIRECTORYF�DEFAULT-FASL-DIRECTORY�+G0MH+��I$+J�$'$$#1
K$&�G+L+?&
+
+i� M$+N�$'$$&#
1
O(P1QR;
~�E��e������ԃ��1ɉj����P����(�R��(�]�ԃ��1ɉj����P��]��4�(��(�=|�(;=��(v��=|�(��ljP��@�(��(�=4�(t� ����Ӌ��n����P���=!�5%�E��4�(��(�|�(;��(v��|�(�[�ÉP����@��x����@��p��M��H��(�=4�(t� ���܃��)�-��k����P��U�ԃ��11ɉj����P����U�5��u��`�ԃ��1ɉj����P���4�(��(�|�(;��(v��|�(�[�ÉP��@�(��(�=4�(t� �J��������
+MQNRELATIVER�alloc_overflow_ebx�QNABSOLUTER��QNABSOLUTER��QNABSOLUTER�uQNABSOLUTER�XQNABSOLUTER�RQNRELATIVER�alloc_overflow_ebx
QNABSOLUTER��QNABSOLUTER��QNABSOLUTER��QNABSOLUTER��QNRELATIVER�alloc_overflow_edi�QNABSOLUTER�XQNABSOLUTER�-=?aG��PATHNAMEc�GdJ?>e#�BCOMPILE-FILE-PATHNAME<
PATHNAME-NAME<
PATHNAME-TYPE<NTYPE<<}&DEFUN BINARY-PATHNAMEi�BINARY-PATHNAME�+G0MG1�G2��k+�l$+$m�$'$$#�1
n$-�j+.BINARY-DIRECTORY�CFP���SOURCE-PATHNAMECo+*
+- +p$+q�$'$$-#�1
r(s1tu; �~�E��e������U�}�܃��U���k����P���u�܃����k����P��u�U��܃����k����P��܃���}��5!�C��%��k����P��}�)��u��`��
+MQNABSOLUTER��QNABSOLUTER��QNABSOLUTER��QNABSOLUTER��QNABSOLUTER�zQNABSOLUTER�XQNABSOLUTER�7=?}j&"(source-pathname binary-directory)~�
b�j�J?>�#DB*ERROR-OUTPUT*&B~%~<;; ~@;Error while loading: ~A~% Condition: ~A~%Aborting.~:>~%��<DIRECTORY-NAMESTRING<G<EQUAL<BERRORQ&
+CONDITIONSR �*HANDLER-CLUSTERS*DELETE-FILE<ABORT<�}&DEFUN HANDLE-LOADTIME-ERROR��HANDLE-LOADTIME-ERROR�+G24MG25�G26���+��$
+$��$'$$#01
�$-��+*BINARY-PATHNAMEc CONDITIONCOMMON-LISPC�+}-� �
+
+ ) L B �$
+��$'$$-#51
�#����+G27M�+� ' �$
$DELETED(��$'$##?1
�#��+�+� �$
�(��$'$##D1
�(�1��;D~�E��e���� �U�}���X�������U��}��4�(��(�5|�(;5��(v��5|�(�v�ƉP����@��x��@�(��(�=4�(t� �e���Ӌ=�]���k����P��܃��U����k����P��U�ԃ��!1ɉj����P��܃����k����P����܃��U�%��k����P����(�����(�Eċ��(�
��(��(�EȉM̉UЉe��Mԋ��(��i�A��4�(��(�|�(;��(v��|�(���@�H���(�=4�(t� �E��)�4�(��(�
|�(;
��(v��
|�(�I�A���B�A��(�=4�(t� �E��A�4�(��(�|�(;��(v��|�(�@��(�=4�(t� �-�P��H���4�(��(�|�(;��(v��|�(�[�ÉP��@�(��(�=4�(t� �
1�A�=��g�4�(��(�|�(;��(v��|�(�R��(�=4�(t� �Z��B�1�
��(�C����
��(�A��Y��S��܃��U��5��k����P�㛋��(�B��J��H��B������(�E�1ɉH��T�e��EȋM̋UЉ��(�
��(��(�]ċ��(9�t!�B� �t
�J��H��B���9�u���(�E�1ɉH��ԃ��91ɉj����P��=�
+@~�E��e��@��u!�@�1�1���������
+M�
+�
+N�
+MQNRELATIVERQUNWINDR�&QNABSOLUTER��QNABSOLUTER��QNABSOLUTER�EQNABSOLUTER�QNRELATIVER�alloc_overflow_edx�QNABSOLUTER��QNRELATIVER�alloc_overflow_ebx�QNABSOLUTER�fQNRELATIVER�alloc_overflow_eaxEQNRELATIVER�alloc_overflow_ecx�QNABSOLUTER��QNRELATIVER�alloc_overflow_eax�QNABSOLUTER�xQNABSOLUTER�!QNABSOLUTER�QNABSOLUTER��QNABSOLUTER��QNABSOLUTER��QNABSOLUTER��QNRELATIVER�alloc_overflow_esijQNABSOLUTER�/=?��&(conditions::temp)�����������&(condition binary-pathname)��
����JNPOWERPCNPPCNX86NX86-64NAMD64NI686NI586NI486NPC386NIAPX386NSPARC64NSPARCNHPPA64NHPPA�p<p-$.1�����&�Return a name that can be used as a directory name that is
unique to a Lisp implementation, Lisp implementation version,
-operating system, and hardware architecture.s.*SWANK-PATHNAME*/<&swank#]1 ;' !�q"#�$%&�q?'(0�q?)*+�q ,�q-.�/�0�!]$$��"8?>##�BFILE-WRITE-DATE<%&DEFUN FILE-NEWER-P$'-.FILE-NEWER-P0+G0MG1�G2��&+{'$
-+$(4$'$$#�1
)$)-%+NEW-FILECOLD-FILEc*+4)
-+$
-+,4$'$$)#�1
-(.1/0;�~�E��e���uu�U�}��܃��U���k����P��U�܃��U����k����P����U������(u��(�M��E��������'�(�ꐐ��
-MQNRELATIVERQ&X86 2 GENERIC->R�lQNABSOLUTER�SQNABSOLUTER�3=?6%&(new-file old-file)7M8MEMBER:;�%<J?>=#�BCOMPILE-FILE-PATHNAME<�<NRELATIVE&.slime?&fasl@
PATHNAME-NAME<
PATHNAME-TYPE<N DIRECTORY<USER-HOMEDIR-PATHNAME<<%&DEFUN BINARY-PATHNAMEE'-.BINARY-PATHNAME0+
-G0MG1�G+�sH$+I4$'$$#�1
J$*-F+CFP�SOURCE-PATHNAMECK+:*
-
-�:
L$+M4$'$$*#�1
N(O1PQ;�~�E��e����i�U�܃��U���k����P��U�ԃ��1ɉj����P���=�5!�E��4�(��(� |�(;��(v��|�(�[�ÉP����@��x����@��p����@��M��H��@�(��(�=4�(t� �]��܃��U�%��k����P��U�܃��U�)��k����P��܃��-�}��51�M�K��
5�K�C�9��k����P��U��ԃ��=1ɉj����P����U��A��u��`�
-MQNABSOLUTER��QNABSOLUTER�jQNABSOLUTER�MQNABSOLUTER�AQNABSOLUTER�5QNABSOLUTER�,QNABSOLUTER�QNABSOLUTER��QNRELATIVER�alloc_overflow_ebx�QNABSOLUTER�qQNABSOLUTER�kQNABSOLUTER�eQNABSOLUTER�QQNABSOLUTER�4=?`F&(source-pathname)aMbPc�FdJ?>e#` BPARSE-UNKNOWN-TYPE-SPECIFIER<NOTE-UNDEFINED-REFERENCE<L*ABORTED-COMPILATION-UNITS*L*IN-COMPILATION-UNIT**UNDEFINED-WARNINGS**COMPILER-ERROR-COUNT**COMPILER-WARNING-COUNT**COMPILER-NOTE-COUNT*BPARSE-UNKNOWN-TYPEQ&
-CONDITIONSR n*HANDLER-CLUSTERS*F<ENSURE-DIRECTORIES-EXIST<NOUTPUT-FILENPRINTNVERBOSECOMPILE-FILE<LOAD<
-PROBE-FILE<%<
PRINT-SUMMARY<%&&DEFUN COMPILE-FILES-IF-NEEDED-SERIALLYx'-. COMPILE-FILES-IF-NEEDED-SERIALLY0+G51CG52cz+$(��{$+|4$'$$$#8 1
}$b-x0+G53MG54�~+���$+�4$'$#�#= 1
�#�-x+ CLISPC�+��$+�4$'$#�#B 1
�#�-�
G40y�NCLEANUP+�+%�
-�F�$+�+�$'$#�#B 1
�#
--y+FILES��+��
-��'� �
-'RR�r�$+�+�$'$#
-#G 1
�#�-�
G0y�+@BINARY-PATHNAME�FILES�NEEDS-RECOMPILECSOURCE-PATHNAMEc�+���
-!� C #
-
]
�$+�+�$'$#�#Q 1
�#�-�
G31y��+�+��)2�$+�+�$'$#�#[ 1
�(
�1��;` ~�E��e��M�U��E��� �ŋ́��U��Q�A����E����ЋM��E�������ᐐ����~6�E��e������U�܃��U���k����P��=���u��`�@�=�(u��(�e��m����P�����O�����P��Ƌ
!�A�=��)=�(���'�(�4�(��(�|�(;��(v��|�(���@�H���(�=4�(t� �E���(�%�
��(�C����
��(�A��Y��S�1ҋ)�
��(�C����
��(�A��Y��S�1ҋ-�
��(�C����
��(�A��Y��S�1ҋ1�
��(�C����
��(�A��Y��S��'�(�!�
��(�C����
��(�A��Y��S�1ҋ�
��(�C����
��(�A��Y��S��4�(��(�|�(;��(v��|�(�@��(�=4�(t� �
9�H��
5�H���4�(��(�|�(;��(v��|�(�[�ÉP��@�(��(�=4�(t� �
=�A�=��C�4�(��(�|�(;��(v��|�(�R��(�=4�(t� �Z��B�=�
��(�C����
��(�A��Y��S����(�E����(�
��(��(�E��M��U��e��M����(��i�A��E����(�ŋ́��U�A����E�=��E�E���(�H����(����(�ŋ́��U��A����E�w������(�B��J��H��B������(���(�B��J��H��B������(���(�B��J��H��B������(���(�B��J��H��B������(���(�B��J��H��B������(���(�B��J��H��B������(���(�B��J��H��B������(�E�e��m���'�(�4�(��(�|�(;��(v��|�(���@�H���(�=4�(t� �E����(�E����(�
��(��(�E��M��U��e��MЋ��(��i�AQ�EЉ��(�ŋ́��U�A����E��;�E�E���(�H����(����(�͋ԁ��E��J����E�L����������U�]��M�E��M��U����(�
��(��(�]����(9�t!�B� �t
�J��H��B���9�u���(�͋ԁ��E��J����E���n����E�]��M���U�]��M�E��M��U����(�
��(��(�]����(9�t!�B� �t
�J��H��B���9�u���(�ŋ́��U��A����E�?�&�E�]��M���E��(�U��r�E��@��E��܃��U��A��k����P��Uܺ�(�
=�A�=���4�(��(�|�(;��(v��|�(�[��(�=4�(t� �S��C�=�
��(�B����
��(�A��Q��Z��}��(���܃��U܋E��k����P��܃��U��=I�u܋M�C��C��(�Q�C��C�'�(�U��k����P���E�'�(�܃��U܋=Q�'�(�Y��k����P�㛋��(�B��J��H��B������(�E��@�E��M���$<����=�(�r�����(�e��m���܃��U܋]��k����P����(uA�'�(=�(������܃��U��}܋a��k����P����(�����������(뽋R���x����tK�܃��e��k����P���(�e��m���
+operating system, and hardware architecture.��&0Returns true if NEW-FILE is newer than OLD-FILE.�?&^Return a string identifying the SLIME version.
+Return nil if nothing appropriate is available.�Gdj�&FReturn the pathname where SOURCE-PATHNAME's binary should be compiled.���<=1��;D !�"#$�q?%&0�q?'()�q?*+,�q?-./�q?//0�q?///�q?//0�q0��=$$O��8?>�#BPARSE-UNKNOWN-TYPE-SPECIFIER<hNOTE-UNDEFINED-REFERENCE<L*ABORTED-COMPILATION-UNITS*L*IN-COMPILATION-UNIT**UNDEFINED-WARNINGS**COMPILER-ERROR-COUNT**COMPILER-WARNING-COUNT**COMPILER-NOTE-COUNT*BPARSE-UNKNOWN-TYPE�j<BSERIOUS-CONDITIONENSURE-DIRECTORIES-EXIST<NOUTPUT-FILENPRINTNVERBOSECOMPILE-FILE<LOAD<
+PROBE-FILE<�<�<�
PRINT-SUMMARY<}&&DEFUN COMPILE-FILES-IF-NEEDED-SERIALLY�� COMPILE-FILES-IF-NEEDED-SERIALLY�+G31CG32cG33��+'.���$+$��$'$$'#�1
�$k���+G34MG35��+��`�$+��$'$#�#�1
�#���+ CLISPC�+��$+��$'$#�#�1
�#����+G36MG37��+���
+�$+��$'$#�#�1
�#���+TEMP
+CONDITIONS��+��$+��$'$#�#�1
�#��
G20��%++'�
+��
+$++$'$##�1
#P��+FASL-DIRECTORY�FILES�+��P��'� �
+'RR��$++$'$#P#�1
#6��
G0�+QBINARY-PATHNAME�FASL-DIRECTORYCFILES�NEEDS-RECOMPILE�SOURCE-PATHNAMEc+��6
+$�eC # '
+
+
+L f
$++$'$#6#1
#���
G11�%++��)>$++$'$#�#1
(1;~ �E��e��M�U��}�E�����ŋ́��U��Q�U�Q�A����E�����ЋM��E�������ᐐ���~<�E��e����V�U�܃��U���k����P��=���u��`��~T�E��e��X�@����
+�P��C�1�1���@�=�(u��(�e��m����P������
+�����P��Ƌ
!�A�=���
+=�(���'�(�4�(��(�|�(;��(v��|�(���@�H���(�=4�(t� �E���(�%�
��(�C����
��(�A��Y��S�1ҋ)�
��(�C����
��(�A��Y��S�1ҋ-�
��(�C����
��(�A��Y��S�1ҋ1�
��(�C����
��(�A��Y��S��'�(�!�
��(�C����
��(�A��Y��S�1ҋ�
��(�C����
��(�A��Y��S��4�(��(�|�(;��(v��|�(�@��(�=4�(t� �
9�H��
5�H���4�(��(�|�(;��(v��|�(�[�ÉP��@�(��(�=4�(t� �
=�A�=����4�(��(�|�(;��(v��|�(�R��(�=4�(t� �Z��B�=�
��(�C����
��(�A��Y��S����(�E����(�
��(��(�E��M��U��e��M����(��i�A1�E����(�ŋ́��U�Q�U�A����E����E�E���(�H����(����(�ŋ́��U��A����E���K����(�B��J��H��B������(���(�B��J��H��B������(���(�B��J��H��B������(���(�B��J��H��B������(���(�B��J��H��B������(���(�B��J��H��B������(���(�B��J��H��B������(�E�e��m���'�(�4�(��(�|�(;��(v��|�(���@�H���(�=4�(t� �E����(�E����(�
��(��(�E��M��U��e��M̋��(��i�A��Ẻ��(�ŋ́��U�Q�U�A����E�t�;�E�E���(�H����(����(�͋ԁ��E��J����E�������������U�]��M�E��M��U����(�
��(��(�]����(9�t!�B� �t
�J��H��B���9�u���(�͋ԁ��E��J����E�#�b����E�]��M���U�]��M�E��M��U����(�
��(��(�]����(9�t!�B� �t
�J��H��B���9�u���(�ŋ́��U��A����E���}�E�]��M���E��(�U܋M܋�$<����=�(���E܋@��E��܃��U��}�A��k����P��U���(�4�(��(�|�(;��(v��|�(���@�H���(�=4�(t� �E����(�E����(�
��(��(�E��M��U��e��M����(��i�A��4�(��(�|�(;��(v��|�(���@�H���(�=4�(t� �E؋E�4�(��(�
|�(;
��(v��
|�(�I�A���B�A��(�=4�(t� �E؉A�E��A�4�(��(�|�(;��(v��|�(�@��(�=4�(t� �I�P��H���4�(��(�|�(;��(v��|�(�[�ÉP��@�(��(�=4�(t� �
=�A�=����4�(��(�|�(;��(v��|�(�R��(�=4�(t� �Z��B�=�
��(�C����
��(�A��Y��S��}��(���E�'�(�܃��U��M��k����P��܃��U��=Q�u��U�C��C��(�Y�C��C�'�(�]��k����P��܃��U��=Y�'�(�a��k����P�㛋��(�B��J��H��B������(�E�1ɉH��E܋@�E������܃��U��e��k����P����(uA�'�(=�(�����܃��U��}��i��k����P����(������<�����(뽸�(�e��m���e��E��M��U����(�
��(��(�]����(9�t!�B� �t
�J��H��B���9�u���(�E��P��܃��}��m��k����P��q�
+@�R���x����tW�܃��u��k����P���(�e��m����������
�
M�
+M�
�
N�
N�
+N�
N�
-N�
-QNABSOLUTER� QNABSOLUTER� QNABSOLUTER��QNABSOLUTER��QNABSOLUTER�)QNABSOLUTER�QNABSOLUTER��QNABSOLUTER��QNABSOLUTER��QNABSOLUTER��QNABSOLUTER��QNABSOLUTER�~QNRELATIVER�alloc_overflow_ebxWQNABSOLUTER�#QNABSOLUTER�QNRELATIVERQUNWINDR��QNABSOLUTER��QNRELATIVERQUNWINDR�bQNABSOLUTER�OQNABSOLUTER��QNABSOLUTER��QNABSOLUTER�~QNRELATIVER�alloc_overflow_eaxQNABSOLUTER�QNABSOLUTER��QNABSOLUTER��QNABSOLUTER�RQNRELATIVER�alloc_overflow_edx+QNABSOLUTER��QNRELATIVER�alloc_overflow_ebx�QNABSOLUTER��QNABSOLUTER��QNRELATIVER�alloc_overflow_eaxuQNABSOLUTER�4QNABSOLUTER�QNABSOLUTER��QNABSOLUTER��QNABSOLUTER��QNABSOLUTER��QNRELATIVER�alloc_overflow_eaxPQNABSOLUTER�QNABSOLUTER�QNRELATIVERQ 2 GENERIC-+R��QNABSOLUTER��QNABSOLUTER��QNABSOLUTER��QNABSOLUTER��QNABSOLUTER�H=?�x& (lisp::c)�Mb9%UNDEFINED%���h����y&(files)�Mb��y�J?>�#�BD<&.swank�<<NIF-DOES-NOT-EXISTu<%&DEFUN LOAD-USER-INIT-FILE�'-.LOAD-USER-INIT-FILE0+G0M�+��$+�4$'$$#�1
�$&-�+�+&5�$+�4$'$$&#�1
�(�1��;�~�E��e������ԃ��1ɉj����P��U�܃���=�5�!�C��%��k����P����܃��U�)��k����P��=-��(�1��u��`�
-MQNABSOLUTER��QNABSOLUTER��QNABSOLUTER��QNABSOLUTER�bQNABSOLUTER�YQNABSOLUTER�SQNABSOLUTER�MQNABSOLUTER�GQNABSOLUTER�-=?��oM����J�<�$ �1�%<&0Returns true if NEW-FILE is newer than OLD-FILE.�Fd&FReturn the pathname where SOURCE-PATHNAME's binary should be compiled.�y�&zCompile each file in FILES if the source is newer than
-its corresponding binary, or the file preceding it was
-recompiled.�y</<&
swank-backend�ZINTERN<STRING<NWARN-UNIMPLEMENTED-INTERFACESN
SWANK-BACKEND FUNCTIONP<��&9Load the user init file, return NIL if it does not exist.#]1;V !"�q?#$%�q?&'(�q?)*+�q,??-.��/�?/剋�q///�/�`/���q?///�q0�?���]$$�� 8QEXPORTQUOTE.LOAD-USER-INIT-FILE6R?>
#�B*LOAD-TRUENAME*& site-initNDEFAULTS<�u<%&DEFUN LOAD-SITE-INIT-FILE'-.LOAD-SITE-INIT-FILE0+G0M+s$+4$'$$#�1
$"-++"L
-$+4$'$$"#�1
(1;�~�E��e���un�
�A�=�tc�܃���=�5�
!�K��
%�K�C�)��k����P��=-��(�1��u��`��
+QNABSOLUTER��QNABSOLUTER��QNABSOLUTER��QNABSOLUTER��QNABSOLUTER��
+QNABSOLUTER��
+QNABSOLUTER�g
+QNABSOLUTER�\
+QNABSOLUTER�?
+QNABSOLUTER�/
+QNABSOLUTER�
+QNABSOLUTER�
+QNABSOLUTER�� QNABSOLUTER�� QNRELATIVER�alloc_overflow_edx� QNABSOLUTER�a QNRELATIVER�alloc_overflow_ebx4 QNABSOLUTER� QNRELATIVER�alloc_overflow_eax�QNRELATIVER�alloc_overflow_ecx�QNABSOLUTER�eQNRELATIVER�alloc_overflow_eax8QNABSOLUTER�QNRELATIVER�alloc_overflow_eax�QNABSOLUTER�rQNRELATIVERQUNWINDR�2QNABSOLUTER�QNRELATIVERQUNWINDR��QNABSOLUTER��QNABSOLUTER�,QNABSOLUTER��QNABSOLUTER��QNRELATIVER�alloc_overflow_eaxgQNABSOLUTER�QQNABSOLUTER�QNABSOLUTER��QNABSOLUTER��QNRELATIVER�alloc_overflow_edxqQNABSOLUTER�=QNRELATIVER�alloc_overflow_ebxQNABSOLUTER��QNABSOLUTER��QNRELATIVER�alloc_overflow_eax�QNABSOLUTER�zQNABSOLUTER�WQNABSOLUTER�1QNABSOLUTER�QNABSOLUTER��QNABSOLUTER��QNRELATIVER�alloc_overflow_eax�QNABSOLUTER�RQNABSOLUTER�GQNRELATIVERQ GENERIC-+R�?QNABSOLUTER�&QNRELATIVERQUNWINDR�QNABSOLUTER��QNABSOLUTER��QNABSOLUTER��QNABSOLUTER�Q=?Z����[��Z\�Z�& (lisp::c)]��"%UNDEFINED%_`�pZa�Z�&(files fasl-directory)b�
�c��dJ?>e#�BE<&.swankeh&lispf<<�<}&DEFUN LOAD-USER-INIT-FILEg�LOAD-USER-INIT-FILE�+G0Mi+�j$+k�$'$$#�1
l$&�h+m+&5n$+o�$'$$&#�1
p(q1rs;�~�E��e������ԃ��1ɉj����P��U�܃���=�5�!�C��%��k����P����܃��U�)��k����P��=-��(�1��u��`�
+MQNABSOLUTER��QNABSOLUTER��QNABSOLUTER��QNABSOLUTER�bQNABSOLUTER�YQNABSOLUTER�SQNABSOLUTER�MQNABSOLUTER�GQNABSOLUTER�-=?}h��~�hJ?>�#�B& site-init�hf<�<}&DEFUN LOAD-SITE-INIT-FILE��LOAD-SITE-INIT-FILE�+
+G0MG1��+k�$+��$'$$#�1
�$&��+ DIRECTORYCOMMON-LISPC�+&?�$+��$'$$&#�1
�(�1��;
+�~�E��e���ue�U�܃���=�5��C��!�C�E�C�%��k����P��=)��(�-��u��`���
+MQNABSOLUTER�wQNABSOLUTER�lQNABSOLUTER�WQNABSOLUTER�HQNABSOLUTER�?QNABSOLUTER�9QNABSOLUTER�3QNABSOLUTER�-=?��&(directory)�������J?>�#B0&swank��@<&
swank-backend�hf<CONS}&DEFUN SWANK-SOURCE-FILES��SWANK-SOURCE-FILES�+G12MG13��+���$+��$'$$#1
�$*��+SOURCE-DIRECTORYC�+d*�\? Q
+�$+��$'$$*#1
�(�1��;~�E��e������U���(�4�(��(�|�(;��(v��|�(�[�ÉP��@�(��(�=4�(t� ��u��u��P�����l�܃��=���k����P��u��4�(��(�|�(;��(v��|�(�@��(�=4�(t� �
�H��P�ΉE���M܋E��x��܃��!�5%�)�C��-�C�E�C�1��k����P���4�(��(�|�(;��(v��|�(�[�ÉP��@�(��(�=4�(t� �ˁ}��(t<�E܉X�E��@�E��U���$<u>��=�(�:����E�P�M��E��������E܋
5�
+!N����
M�
-NQNABSOLUTER��QNABSOLUTER�uQNABSOLUTER�`QNABSOLUTER�TQNABSOLUTER�KQNABSOLUTER�EQNABSOLUTER�?QNABSOLUTER�9QNABSOLUTER�$=?&o��'J'<�<#]1();? !0�q"�`�#�q0�*]$$��+8QDEBUG-SOURCER (-$$ -.NFILE�"&��0"
-=�1$+@\��k��
�
~Lu\Qo21 345�)5�5�5��5̣5�Q5�05� 5��5̿5̮5�v5�e5�B?>6@
\ No newline at end of file
+�
+�QNABSOLUTER��QNRELATIVER�alloc_overflow_ebx|QNABSOLUTER�GQNABSOLUTER�8QNABSOLUTER�/QNABSOLUTER�)QNABSOLUTER�#QNABSOLUTER��QNRELATIVER�alloc_overflow_eax�QNABSOLUTER��QNABSOLUTER��QNABSOLUTER��QNRELATIVER�alloc_overflow_ebxQ=?��&(source-directory)�������J?>�#"BNSOURCE-DIRECTORYNFASL-DIRECTORYNALLOW-OTHER-KEYS�<�<&$swank::*swank-wire-protocol-version*�READ-FROM-STRING<<SET<NWARN-UNIMPLEMENTED-INTERFACESSTRING<N
SWANK-BACKENDINTERN<%COERCE-TO-FUNCTION<�<h<NRUN-AFTER-INIT-HOOKNSWANK*FASL-DIRECTORY*}&DEFUN LOAD-SWANK��
+LOAD-SWANK�+G18M�+W�$+��$'$$W#1
�$`��NOPTIONAL+
N-CONTEXT-2�� N-COUNT-3��+|`F
+
�$+��$'$$`#1
�#+��+rFASL-DIRECTORY�FASL-DIRECTORY-DEFAULTING-TEMPcG0CG1�SOURCE-DIRECTORY� SOURCE-DIRECTORY-DEFAULTING-TEMP��+��+.
..>>??>>>>>>>>>>
+>
+> ..
.
..... >. .>�$�$
+SUPPLIED-P$�$�$(��$'$#+#1
�(�1��;"~�E��7�]�)ˋ�ك�vWV�|$��)�����^_�ˉU܃�t�}�t�u���e��эD��E����ظ�(��(��(�E��(�E��(�E��(�E��(�E��(�������+�ËM��؋4���ËM��؋;u8�E�'�(������}Ё}��(u�}��E�}��(u�E�M��؋�
+#;t;t�ÉE�뺉u���E�'�(�u���
+"�}��(���
�A�=����E�}��(���}��}��܃��U�!��k����P��܃��}��%��k����P��܃��)�-��k����P��U��ԃ��11ɉj����P����܃��U��5��k����P��܃��9�=��k����P��܃��=A�E��k����P��܃��I��k����P��ԃ�1ɉj����P��܃��U�M��k����P��ԃ��Q1ɉj����P��܃��U�=��k����P��܃��=Y�E��k����P��܃��I��k����P���1��u��`�]�x����t�O����E��4����
+N�
+QNABSOLUTER��QNABSOLUTER��QNABSOLUTER��QNABSOLUTER��QNABSOLUTER��QNABSOLUTER��QNABSOLUTER��QNABSOLUTER�lQNABSOLUTER�<QNABSOLUTER�"QNABSOLUTER�QNABSOLUTER�QNABSOLUTER��QNABSOLUTER��QNABSOLUTER��QNABSOLUTER��QNABSOLUTER��QNABSOLUTER��QNABSOLUTER�lQNABSOLUTER�:QNABSOLUTER� QNABSOLUTER�QNABSOLUTER��=?��&N(&key (source-directory *source-directory*) (fasl-directory *fasl-directory*))��&KEY�����*����J�d&yCompile each file in FILES if the source is newer than
+its corresponding binary, or the file preceding it was
+recompiled.�h&9Load the user init file, return NIL if it does not exist.�����<��<�G<�<&0The directory where fasl files should be placed.�<�-$.1��<=1;H? !"�q?#$%�q?&'0�q?()0�q*+�q,-��.�/�////�q///�q?//0�q0�=$$O�8�<<=1; �q0�=$$O� 8QDEBUG-SOURCER!%(($$ -NFILE."�J�"���$+��a�k��E��f���U?�� 1 ����̪̍�s���̟�u�R�-���̛�s�??>@
\ No newline at end of file
Modified: branches/grin-neu/thirdparty/kmrcl-1.72/byte-stream.lisp
===================================================================
--- branches/grin-neu/thirdparty/kmrcl-1.72/byte-stream.lisp 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/kmrcl-1.72/byte-stream.lisp 2006-12-01 10:39:49 UTC (rev 2094)
@@ -7,7 +7,7 @@
;;;; Programmer: Kevin M. Rosenberg
;;;; Date Started: June 2003
;;;;
-;;;; $Id: byte-stream.lisp,v 1.1 2004/06/23 08:27:12 hans Exp $
+;;;; $Id$
;;;;
;;;; Works for CMUCL, SBCL, and AllergoCL only
;;;;
Modified: branches/grin-neu/thirdparty/kmrcl-1.72/kmrcl.asd
===================================================================
--- branches/grin-neu/thirdparty/kmrcl-1.72/kmrcl.asd 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/kmrcl-1.72/kmrcl.asd 2006-12-01 10:39:49 UTC (rev 2094)
@@ -7,7 +7,7 @@
;;;; Programmer: Kevin M. Rosenberg
;;;; Date Started: Apr 2000
;;;;
-;;;; $Id: kmrcl.asd,v 1.1 2004/06/23 08:27:12 hans Exp $
+;;;; $Id$
;;;;
;;;; This file, part of KMRCL, is Copyright (c) 2002 by Kevin M. Rosenberg
;;;;
@@ -33,13 +33,13 @@
:components
((:file "package")
(:file "ifstar" :depends-on ("package"))
- (:file "byte-stream" :depends-on ("package"))
+ #+(or) (:file "byte-stream" :depends-on ("package"))
(:file "macros" :depends-on ("package"))
(:file "functions" :depends-on ("macros"))
(:file "lists" :depends-on ("macros"))
(:file "seqs" :depends-on ("macros"))
(:file "impl" :depends-on ("macros"))
- (:file "io" :depends-on ("macros" "impl"))
+ #+(or) (:file "io" :depends-on ("macros" "impl"))
(:file "console" :depends-on ("macros"))
(:file "strings" :depends-on ("macros" "seqs"))
(:file "strmatch" :depends-on ("strings"))
Added: branches/grin-neu/thirdparty/net-telent-date/INSTALL.asdf
===================================================================
--- branches/grin-neu/thirdparty/net-telent-date/INSTALL.asdf 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/net-telent-date/INSTALL.asdf 2006-12-01 10:39:49 UTC (rev 2094)
@@ -0,0 +1,13 @@
+1. Make a symlink in "$HOME/lisp/systems/"[*] pointing to the .asd file
+2. Start your asdf-enabled lisp
+2a. Ensure that "$HOME/lisp/systems/"[*] is in asdf:*central-registry*
+3. At the lisp prompt, type '(asdf:operate 'asdf:load-op "net-telent-date")'. This
+ will compile and load the system into your running lisp.
+
+[*] This path ("$HOME/lisp/systems/") is only a suggestion; the important
+thing is that asdf know where to find the .asd file. asdf uses the
+contents of the variable ASDF:*CENTRAL-REGISTRY* to find its system
+definitions.
+
+These instructions were automatically generated by cCLan software. Use
+at your own peril.
Added: branches/grin-neu/thirdparty/net-telent-date/README
===================================================================
--- branches/grin-neu/thirdparty/net-telent-date/README 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/net-telent-date/README 2006-12-01 10:39:49 UTC (rev 2094)
@@ -0,0 +1,13 @@
+Most of the code in this package is parse-time.lisp, which was
+originally written by Jim Healy in June 1987, and has been lifted
+wholesale from CMUCL.
+
+The rest of it is a few useful functions for printing dates in
+standard(sic) formats. See documentation strings for
+universal-time-to-http-date, universal-time-to-rfc2822-date, dayname,
+monthname.
+
+Thanks to Kevin Rosenberg for bouncing ideas off, for the initial
+universal-time-to-rfc2822-date implementation, and for Debian
+packaging
+
Added: branches/grin-neu/thirdparty/net-telent-date/date.lisp
===================================================================
--- branches/grin-neu/thirdparty/net-telent-date/date.lisp 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/net-telent-date/date.lisp 2006-12-01 10:39:49 UTC (rev 2094)
@@ -0,0 +1,133 @@
+(in-package :net.telent.date)
+
+(defvar *daynames*
+ '((0 . "Monday")
+ (1 . "Tuesday")
+ (2 . "Wednesday")
+ (3 . "Thursday")
+ (4 . "Friday")
+ (5 . "Saturday")
+ (6 . "Sunday")))
+
+(defun dayname (stream arg colon-p at-p &optional width (mincol 0) (colinc 1) (minpad 0) (padchar #\Space))
+ "Print the day of the week (0=Sunday) corresponding to ARG on STREAM. This is intended for embedding in a FORMAT directive: WIDTH governs the number of characters of text printed, MINCOL, COLINC, MINPAD, PADCHAR work as for ~A"
+ (let ((daystring (cdr (assoc (mod arg 7) *daynames*))))
+ (if (not daystring) (return-from dayname nil))
+ (let ((truncate (if width (min width (length daystring)) nil)))
+ (format stream
+ (if at-p "~V,V,V,V@A" "~V,V,V,VA")
+ mincol colinc minpad padchar
+ (subseq daystring 0 truncate)))))
+
+(defvar *monthnames*
+ '((1 . "January")
+ (2 . "February")
+ (3 . "March")
+ (4 . "April")
+ (5 . "May")
+ (6 . "June")
+ (7 . "July")
+ (8 . "August")
+ (9 . "September")
+ (10 . "October")
+ (11 . "November")
+ (12 . "December")))
+
+(defun monthname (stream arg colon-p at-p &optional width (mincol 0) (colinc 1) (minpad 0) (padchar #\Space))
+ "Print the name of the month (1=January) corresponding to ARG on STREAM. This is intended for embedding in a FORMAT directive: WIDTH governs the number of characters of text printed, MINCOL, COLINC, MINPAD, PADCHAR work as for ~A"
+ (let ((monthstring (cdr (assoc arg *monthnames*))))
+ (if (not monthstring) (return-from monthname nil))
+ (let ((truncate (if width (min width (length monthstring)) nil)))
+ (format stream
+ (if at-p "~V,V,V,V@A" "~V,V,V,VA")
+ mincol colinc minpad padchar
+ (subseq monthstring 0 truncate)))))
+
+;;; the second of these functions is an attempt to fix the wrong
+;;; problem (emacs likes to indent it strangely) with the first. The
+;;; real problem with the first is, as c.l.l will rush to tell you,
+;;; that it introduces anaphora - and lots of them. I don't really
+;;; advise the use of either in user code, and they're only exported
+;;; for historical reasons
+
+(defmacro with-date (utime zone &body body)
+ "UTIME is a universal-time, ZONE is a number of hours offset from UTC, or NIL to use local time. Execute BODY in an environment where SECOND MINUTE HOUR DAY-OF-MONTH MONTH YEAR DAY-OF-WEEK DAYLIGHT-P ZONE are bound to the decoded components of the universal time"
+ `(multiple-value-bind
+ (second minute hour day-of-month month year day-of-week daylight-p zone)
+ (decode-universal-time ,utime ,@(if zone (list zone)))
+ (declare (ignorable second minute hour day-of-month month year day-of-week daylight-p zone))
+ ,@body))
+
+(defmacro with-decoding ((utime &optional zone) &body body)
+ "UTIME is a universal-time, ZONE is a number of hours offset from UTC, or NIL to use local time. Execute BODY in an environment where SECOND MINUTE HOUR DAY-OF-MONTH MONTH YEAR DAY-OF-WEEK DAYLIGHT-P ZONE are bound to the decoded components of the universal time"
+ `(multiple-value-bind
+ (second minute hour day-of-month month year day-of-week daylight-p zone)
+ (decode-universal-time ,utime ,@(if zone (list zone)))
+ (declare (ignorable second minute hour day-of-month month year day-of-week daylight-p zone))
+ ,@body))
+
+(defun universal-time-to-http-date (utime)
+ "Decode the universal time UTIME and return a date suitable for use in HTTP 1.0 applications (RFC-822, but GMT)"
+ (declare (optimize (speed 3)))
+ (with-date
+ utime 0
+ (format nil
+ (formatter "~3/net.telent.date:dayname/, ~2,'0D ~3/net.telent.date:monthname/ ~D ~2,'0D:~2,'0D:~2,'0D GMT")
+ day-of-week day-of-month month year hour minute second)))
+
+;;; follow the decode-universal-time rules for handling a time-zone parameter.
+;;; CL timezones increase westward; RFC timezone specifications increase
+;;; _eastward_. I love standards
+(defun universal-time-to-rfc2822-date (utime &optional time-zone)
+ "Decode the universal time UTIME and return an RFC-2822-format string. TIME-ZONE is a CL time zone. If not supplied, it defaults to the current time zone adjusted for daylight saving time. If TIME-ZONE is supplied, daylight saving time information is ignored."
+ (declare (optimize (speed 3)))
+ (with-decoding (utime time-zone)
+ (let ((daylight-zone (if daylight-p (1- zone) zone)))
+ (multiple-value-bind (z-h z-m) (truncate (abs daylight-zone))
+ (format nil
+ (formatter "~3/net.telent.date:dayname/, ~2,'0D ~3/net.telent.date:monthname/ ~D ~2,'0D:~2,'0D:~2,'0D ~A~2,'0D~2,'0D")
+ day-of-week day-of-month month year hour minute second
+ (if (minusp daylight-zone) #\+ #\-)
+ z-h (floor (* 60 z-m)))))))
+#|
+
+Timezones are _so_ easy to get wrong that I strongly advise always using UTC
+for anything that a machine might someday want to parse. When testing
+changes to universal-time-to-rfc2822-date, make sure to cover
+
+1) Explicit timezone, in summer and in winter
+
+2) Local time, in summer and in winter
+2a) In a zone west of Greenwich (e.g. any US zone)
+:; TZ=US/Eastern date -R --date='23 Aug 2003 12:00:00 GMT'
+Sat, 23 Aug 2003 08:00:00 -0400
+:; TZ=US/Eastern date -R --date='05 Jan 2003 12:00:00 GMT'
+Sun, 05 Jan 2003 07:00:00 -0500
+
+2b) In a zone east of Greenwich (e.g. Europe/Paris)
+:; TZ=Europe/Paris date -R --date='23 Aug 2003 12:00:00 GMT'
+Sat, 23 Aug 2003 14:00:00 +0200
+:; TZ=Europe/Paris date -R --date='05 Jan 2003 12:00:00 GMT'
+Sun, 05 Jan 2003 13:00:00 +0100
+
+2c) In Canada/Newfoundland or other non-integer zone
+:; TZ=Canada/Newfoundland date -R --date='23 Aug 2003 12:00:00 GMT'
+Sat, 23 Aug 2003 09:30:00 -0230
+:; TZ=Canada/Newfoundland date -R --date='05 Jan 2003 12:00:00 GMT'
+Sun, 05 Jan 2003 08:30:00 -0330
+
+Note signs on the timezones, and that the offset for a half-hour is
+xx30 not xx50. The universal times in question are
+
+3250756800 is 05 Jan 2003, probably not DST
+3270628800 is 23 Aug 2003 (daylight savings in effect most places)
+
+You probably need to change the TZ environment variable and restart your
+Lisp to do most of the tests in (2).
+
+|#
+
+
+;;; for backward compatibility (with araneida, mostly)
+(setf (symbol-function 'universal-time-to-rfc-date)
+ #'universal-time-to-http-date)
Added: branches/grin-neu/thirdparty/net-telent-date/defpackage.lisp
===================================================================
--- branches/grin-neu/thirdparty/net-telent-date/defpackage.lisp 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/net-telent-date/defpackage.lisp 2006-12-01 10:39:49 UTC (rev 2094)
@@ -0,0 +1,11 @@
+(defpackage :net.telent.date
+ (:nicknames :date)
+ (:use #:CL)
+ (:export dayname monthname
+ with-date ; deprecated
+ with-decoding ; use this instead
+ second minute hour day-of-month month year day-of-week
+ daylight-p zone universal-time-to-rfc-date
+ universal-time-to-http-date
+ universal-time-to-rfc2822-date parse-time))
+
Added: branches/grin-neu/thirdparty/net-telent-date/maintainer-Makefile
===================================================================
--- branches/grin-neu/thirdparty/net-telent-date/maintainer-Makefile 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/net-telent-date/maintainer-Makefile 2006-12-01 10:39:49 UTC (rev 2094)
@@ -0,0 +1,20 @@
+all:
+ @echo "The makefile is here for my use, not yours. Use the defsystem, Luke"
+
+LISP=sbcl --noprogramer --no-userinit # --no-sysinit
+#LISP=lisp -batch
+PACKAGE=net-telent-date
+test:
+ @echo You will need two things for the tests to succeed.
+ @echo '(1) Internet access '
+ @echo '(2) echo services on localhost'
+ @echo The echo services are often disabled for security reasons, so
+ @echo dont forget to put them back when finished.
+ echo '(mk:load-system (quote $(PACKAGE))) (rt:do-tests)' | $(LISP)
+
+clean:
+ -rm *.*f *.fasl a.out *.so *.err
+
+deb:
+ CVSROOT=`cat CVS/Root` cvs-buildpackage -F -uc -us -rfakeroot -M $(PACKAGE)
+
Added: branches/grin-neu/thirdparty/net-telent-date/make-makefile.lisp
===================================================================
--- branches/grin-neu/thirdparty/net-telent-date/make-makefile.lisp 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/net-telent-date/make-makefile.lisp 2006-12-01 10:39:49 UTC (rev 2094)
@@ -0,0 +1,51 @@
+(in-package :cl-user)
+
+;;; given a system definition, create a "Makefile" that copies all the
+;;; source files in it into a given directory
+
+(defun print-source-file-name (component stream)
+ (case (make::component-type component)
+ ((:file)
+ (format stream "~A "
+ (enough-namestring
+ (translate-logical-pathname
+ (pathname
+ (make::component-full-pathname component :source))))))
+ ((:module :defsystem)
+ (loop for c in (make::component-components component)
+ do (print-source-file-name c stream)))
+ (t (format t "Doing nothing for ~A ~%" component))))
+
+(defun make-makefile (system output-file)
+ "List files in SYSTEM, in the order that they need to be processed"
+ (with-open-file (o output-file :direction :output
+ :if-exists :rename)
+ (format o "# Automatically generated, edit make-makefile.lisp instead
+
+FILES=")
+ (let* ((system-definition (make::find-system system))
+ (*default-pathname-defaults*
+ (translate-logical-pathname (make::component-source-root-dir system-definition))))
+ (print-source-file-name system-definition o))
+ (format o "
+
+all:
+ @echo That did nothing: now look at the defsystem
+
+release: debian/changelog
+ head -1 debian/changelog |cut -d' ' -f2 | tr -d '()' > release
+
+
+install:
+ install -d $(DESTDIR)/usr/share/common-lisp/repositories/~A
+ tar cf - $(FILES) ~A.system | (cd $(DESTDIR)/usr/share/common-lisp/repositories/~A && tar xvpf -)
+
+
+clean:
+ -rm a.out *~~ diffs *.*f ~%"
+ (string-downcase (symbol-name system))
+ (string-downcase (symbol-name system))
+ (string-downcase (symbol-name system)))))
+
+
+
Added: branches/grin-neu/thirdparty/net-telent-date/net-telent-date.asd
===================================================================
--- branches/grin-neu/thirdparty/net-telent-date/net-telent-date.asd 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/net-telent-date/net-telent-date.asd 2006-12-01 10:39:49 UTC (rev 2094)
@@ -0,0 +1,10 @@
+;;; -*- Lisp -*-
+
+(defpackage :net-telent-date-system (:use #:cl #:asdf))
+(in-package :net-telent-date-system)
+
+(defsystem net-telent-date
+ :version "0.41"
+ :components ((:file "defpackage")
+ (:file "date" :depends-on ("defpackage"))
+ (:file "parse-time" :depends-on ("defpackage"))))
Added: branches/grin-neu/thirdparty/net-telent-date/net-telent-date.system
===================================================================
--- branches/grin-neu/thirdparty/net-telent-date/net-telent-date.system 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/net-telent-date/net-telent-date.system 2006-12-01 10:39:49 UTC (rev 2094)
@@ -0,0 +1,9 @@
+;;; -*- Lisp -*-
+
+(in-package :cl-user)
+
+(make:defsystem net-telent-date
+ :source-pathname #p"cl-library:net-telent-date;"
+ :components ((:file "defpackage")
+ (:file "date" :depends-on ("defpackage"))
+ (:file "parse-time" :depends-on ("defpackage"))))
Added: branches/grin-neu/thirdparty/net-telent-date/parse-time.lisp
===================================================================
--- branches/grin-neu/thirdparty/net-telent-date/parse-time.lisp 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/net-telent-date/parse-time.lisp 2006-12-01 10:39:49 UTC (rev 2094)
@@ -0,0 +1,638 @@
+(in-package :net.telent.date)
+
+;;; **********************************************************************
+;;; This code was written as part of the CMU Common Lisp project at
+;;; Carnegie Mellon University, and has been placed in the public domain.
+;;;
+
+;;; It was subsequently borrowed and modified slightly by Daniel
+;;; Barlow <dan(a)telent.net> to become part of the net-telent-date
+;;; package. Daniel, Tue May 22 05:45:27 BST 2001
+
+;;; **********************************************************************
+
+;;; Parsing routines for time and date strings. PARSE-TIME returns the
+;;; universal time integer for the time and/or date given in the string.
+
+;;; Written by Jim Healy, June 1987.
+
+;;; **********************************************************************
+
+(defvar whitespace-chars '(#\space #\tab #\newline #\, #\' #\`))
+(defvar time-dividers '(#\: #\.))
+(defvar date-dividers '(#\\ #\/ #\-))
+
+(defvar *error-on-mismatch* nil
+ "If t, an error will be signalled if parse-time is unable
+ to determine the time/date format of the string.")
+
+;;; Set up hash tables for month, weekday, zone, and special strings.
+;;; Provides quick, easy access to associated information for these items.
+
+;;; Hashlist takes an association list and hashes each pair into the
+;;; specified tables using the car of the pair as the key and the cdr as
+;;; the data object.
+
+(defmacro hashlist (list table)
+ `(dolist (item ,list)
+ (setf (gethash (car item) ,table) (cdr item))))
+
+(defparameter weekday-table-size 23)
+(defparameter month-table-size 31)
+(defparameter zone-table-size 11)
+(defparameter special-table-size 11)
+
+(defvar *weekday-strings* (make-hash-table :test #'equal
+ :size weekday-table-size))
+
+(defvar *month-strings* (make-hash-table :test #'equal
+ :size month-table-size))
+
+(defvar *zone-strings* (make-hash-table :test #'equal
+ :size zone-table-size))
+
+(defvar *special-strings* (make-hash-table :test #'equal
+ :size special-table-size))
+
+;;; Load-time creation of the hash tables.
+
+(hashlist '(("monday" . 0) ("mon" . 0)
+ ("tuesday" . 1) ("tues" . 1) ("tue" . 1)
+ ("wednesday" . 2) ("wednes" . 2) ("wed" . 2)
+ ("thursday" . 3) ("thurs" . 3) ("thu" . 3)
+ ("friday" . 4) ("fri" . 4)
+ ("saturday" . 5) ("sat" . 5)
+ ("sunday" . 6) ("sun" . 6))
+ *weekday-strings*)
+
+(hashlist '(("january" . 1) ("jan" . 1)
+ ("february" . 2) ("feb" . 2)
+ ("march" . 3) ("mar" . 3)
+ ("april" . 4) ("apr" . 4)
+ ("may" . 5) ("june" . 6)
+ ("jun" . 6) ("july" . 7)
+ ("jul" . 7) ("august" . 8)
+ ("aug" . 8) ("september" . 9)
+ ("sept" . 9) ("sep" . 9)
+ ("october" . 10) ("oct" . 10)
+ ("november" . 11) ("nov" . 11)
+ ("december" . 12) ("dec" . 12))
+ *month-strings*)
+
+(hashlist '(("gmt" . 0) ("est" . 5)
+ ("edt" . 4) ("cst" . 6)
+ ("cdt" . 5) ("mst" . 7)
+ ("mdt" . 6) ("pst" . 8)
+ ("pdt" . 7))
+ *zone-strings*)
+
+(hashlist '(("yesterday" . yesterday) ("today" . today)
+ ("tomorrow" . tomorrow) ("now" . now))
+ *special-strings*)
+
+;;; Time/date format patterns are specified as lists of symbols repre-
+;;; senting the elements. Optional elements can be specified by
+;;; enclosing them in parentheses. Note that the order in which the
+;;; patterns are specified below determines the order of search.
+
+;;; Choices of pattern symbols are: second, minute, hour, day, month,
+;;; year, time-divider, date-divider, am-pm, zone, izone, weekday,
+;;; noon-midn, and any special symbol.
+
+(defparameter *default-date-time-patterns*
+ '(
+ ;; Date formats.
+ ((weekday) month (date-divider) day (date-divider) year (noon-midn))
+ ((weekday) day (date-divider) month (date-divider) year (noon-midn))
+ ((weekday) month (date-divider) day (noon-midn))
+ (year (date-divider) month (date-divider) day (noon-midn))
+ (month (date-divider) year (noon-midn))
+ (year (date-divider) month (noon-midn))
+
+ ((noon-midn) (weekday) month (date-divider) day (date-divider) year)
+ ((noon-midn) (weekday) day (date-divider) month (date-divider) year)
+ ((noon-midn) (weekday) month (date-divider) day)
+ ((noon-midn) year (date-divider) month (date-divider) day)
+ ((noon-midn) month (date-divider) year)
+ ((noon-midn) year (date-divider) month)
+
+ ;; Time formats.
+ (hour (time-divider) (minute) (time-divider) (secondp) (am-pm)
+ (date-divider) (zone))
+ (noon-midn)
+ (hour (noon-midn))
+
+ ;; Time/date combined formats.
+ ((weekday) month (date-divider) day (date-divider) year
+ hour (time-divider) (minute) (time-divider) (secondp)
+ (am-pm) (date-divider) (zone))
+ ((weekday) day (date-divider) month (date-divider) year
+ hour (time-divider) (minute) (time-divider) (secondp)
+ (am-pm) (date-divider) (zone))
+ ((weekday) month (date-divider) day
+ hour (time-divider) (minute) (time-divider) (secondp)
+ (am-pm) (date-divider) (zone))
+ (year (date-divider) month (date-divider) day
+ hour (time-divider) (minute) (time-divider) (secondp)
+ (am-pm) (date-divider) (zone))
+ (month (date-divider) year
+ hour (time-divider) (minute) (time-divider) (secondp)
+ (am-pm) (date-divider) (zone))
+ (year (date-divider) month
+ hour (time-divider) (minute) (time-divider) (secondp)
+ (am-pm) (date-divider) (zone))
+
+ (hour (time-divider) (minute) (time-divider) (secondp) (am-pm)
+ (date-divider) (zone) (weekday) month (date-divider)
+ day (date-divider) year)
+ (hour (time-divider) (minute) (time-divider) (secondp) (am-pm)
+ (date-divider) (zone) (weekday) day (date-divider)
+ month (date-divider) year)
+ (hour (time-divider) (minute) (time-divider) (secondp) (am-pm)
+ (date-divider) (zone) (weekday) month (date-divider)
+ day)
+ (hour (time-divider) (minute) (time-divider) (secondp) (am-pm)
+ (date-divider) (zone) year (date-divider) month
+ (date-divider) day)
+ (hour (time-divider) (minute) (time-divider) (secondp) (am-pm)
+ (date-divider) (zone) month (date-divider) year)
+ (hour (time-divider) (minute) (time-divider) (secondp) (am-pm)
+ (date-divider) (zone) year (date-divider) month)
+
+ ;; Weird, non-standard formats.
+ (weekday month day hour (time-divider) minute (time-divider)
+ secondp (am-pm)
+ (zone) year)
+ ((weekday) day (date-divider) month (date-divider) year hour
+ (time-divider) minute (time-divider) (secondp) (am-pm)
+ (date-divider) (zone))
+ ((weekday) month (date-divider) day (date-divider) year hour
+ (time-divider) minute (time-divider) (secondp) (am-pm)
+ (date-divider) (zone))
+
+ ;; Special-string formats.
+ (now (yesterday))
+ ((yesterday) now)
+ (now (today))
+ ((today) now)
+ (now (tomorrow))
+ ((tomorrow) now)
+ (yesterday (noon-midn))
+ ((noon-midn) yesterday)
+ (today (noon-midn))
+ ((noon-midn) today)
+ (tomorrow (noon-midn))
+ ((noon-midn) tomorrow)
+))
+
+;;; HTTP header style date/time patterns: RFC1123/RFC822, RFC850, ANSI-C.
+(defparameter *http-date-time-patterns*
+ '(
+ ;; RFC1123/RFC822 and RFC850.
+ ((weekday) day (date-divider) month (date-divider) year
+ hour time-divider minute (time-divider) (secondp) izone)
+ ((weekday) day (date-divider) month (date-divider) year
+ hour time-divider minute (time-divider) (secondp) (zone))
+
+ ;; ANSI-C.
+ ((weekday) month day
+ hour time-divider minute (time-divider) (secondp) year)))
+
+
+;;; The decoded-time structure holds the time/date values which are
+;;; eventually passed to 'encode-universal-time' after parsing.
+
+;;; Note: Currently nothing is done with the day of the week. It might
+;;; be appropriate to add a function to see if it matches the date.
+
+(defstruct decoded-time
+ (second 0 :type integer) ; Value between 0 and 59.
+ (minute 0 :type integer) ; Value between 0 and 59.
+ (hour 0 :type integer) ; Value between 0 and 23.
+ (day 1 :type integer) ; Value between 1 and 31.
+ (month 1 :type integer) ; Value between 1 and 12.
+ (year 1900 :type integer) ; Value above 1899 or between 0 and 99.
+ (zone 0 :type rational) ; Value between -24 and 24 inclusive.
+ (dotw 0 :type integer)) ; Value between 0 and 6.
+
+;;; Make-default-time returns a decoded-time structure with the default
+;;; time values already set. The default time is currently 00:00 on
+;;; the current day, current month, current year, and current time-zone.
+
+(defun make-default-time (def-sec def-min def-hour def-day
+ def-mon def-year def-zone def-dotw)
+ (let ((default-time (make-decoded-time)))
+ (multiple-value-bind (sec min hour day mon year dotw dst zone)
+ (get-decoded-time)
+ (declare (ignore dst))
+ (if def-sec
+ (if (eq def-sec :current)
+ (setf (decoded-time-second default-time) sec)
+ (setf (decoded-time-second default-time) def-sec))
+ (setf (decoded-time-second default-time) 0))
+ (if def-min
+ (if (eq def-min :current)
+ (setf (decoded-time-minute default-time) min)
+ (setf (decoded-time-minute default-time) def-min))
+ (setf (decoded-time-minute default-time) 0))
+ (if def-hour
+ (if (eq def-hour :current)
+ (setf (decoded-time-hour default-time) hour)
+ (setf (decoded-time-hour default-time) def-hour))
+ (setf (decoded-time-hour default-time) 0))
+ (if def-day
+ (if (eq def-day :current)
+ (setf (decoded-time-day default-time) day)
+ (setf (decoded-time-day default-time) def-day))
+ (setf (decoded-time-day default-time) day))
+ (if def-mon
+ (if (eq def-mon :current)
+ (setf (decoded-time-month default-time) mon)
+ (setf (decoded-time-month default-time) def-mon))
+ (setf (decoded-time-month default-time) mon))
+ (if def-year
+ (if (eq def-year :current)
+ (setf (decoded-time-year default-time) year)
+ (setf (decoded-time-year default-time) def-year))
+ (setf (decoded-time-year default-time) year))
+ (if def-zone
+ (if (eq def-zone :current)
+ (setf (decoded-time-zone default-time) zone)
+ (setf (decoded-time-zone default-time) def-zone))
+ (setf (decoded-time-zone default-time) zone))
+ (if def-dotw
+ (if (eq def-dotw :current)
+ (setf (decoded-time-dotw default-time) dotw)
+ (setf (decoded-time-dotw default-time) def-dotw))
+ (setf (decoded-time-dotw default-time) dotw))
+ default-time)))
+
+;;; Converts the values in the decoded-time structure to universal time
+;;; by calling encode-universal-time.
+;;; If zone is in numerical form, tweeks it appropriately.
+
+(defun convert-to-unitime (parsed-values)
+ (let ((zone (decoded-time-zone parsed-values)))
+ (encode-universal-time (decoded-time-second parsed-values)
+ (decoded-time-minute parsed-values)
+ (decoded-time-hour parsed-values)
+ (decoded-time-day parsed-values)
+ (decoded-time-month parsed-values)
+ (decoded-time-year parsed-values)
+ (if (or (> zone 24) (< zone -24))
+ (let ((new-zone (/ zone 100)))
+ (cond ((minusp new-zone) (- new-zone))
+ ((plusp new-zone) (- 24 new-zone))
+ ;; must be zero (GMT)
+ (t new-zone)))
+ zone))))
+
+;;; Sets the current values for the time and/or date parts of the
+;;; decoded time structure.
+
+(defun set-current-value (values-structure &key (time nil) (date nil)
+ (zone nil))
+ (multiple-value-bind (sec min hour day mon year dotw dst tz)
+ (get-decoded-time)
+ (declare (ignore dst))
+ (when time
+ (setf (decoded-time-second values-structure) sec)
+ (setf (decoded-time-minute values-structure) min)
+ (setf (decoded-time-hour values-structure) hour))
+ (when date
+ (setf (decoded-time-day values-structure) day)
+ (setf (decoded-time-month values-structure) mon)
+ (setf (decoded-time-year values-structure) year)
+ (setf (decoded-time-dotw values-structure) dotw))
+ (when zone
+ (setf (decoded-time-zone values-structure) tz))))
+
+;;; Special function definitions. To define a special substring, add
+;;; a dotted pair consisting of the substring and a symbol in the
+;;; *special-strings* hashlist statement above. Then define a function
+;;; here which takes one argument- the decoded time structure- and
+;;; sets the values of the structure to whatever is necessary. Also,
+;;; add a some patterns to the patterns list using whatever combinations
+;;; of special and pre-existing symbols desired.
+
+(defun yesterday (parsed-values)
+ (set-current-value parsed-values :date t :zone t)
+ (setf (decoded-time-day parsed-values)
+ (1- (decoded-time-day parsed-values))))
+
+(defun today (parsed-values)
+ (set-current-value parsed-values :date t :zone t))
+
+(defun tomorrow (parsed-values)
+ (set-current-value parsed-values :date t :zone t)
+ (setf (decoded-time-day parsed-values)
+ (1+ (decoded-time-day parsed-values))))
+
+(defun now (parsed-values)
+ (set-current-value parsed-values :time t))
+
+;;; Predicates for symbols. Each symbol has a corresponding function
+;;; defined here which is applied to a part of the datum to see if
+;;; it matches the qualifications.
+
+(defun am-pm (string)
+ (and (simple-string-p string)
+ (cond ((string= string "am") 'am)
+ ((string= string "pm") 'pm)
+ (t nil))))
+
+(defun noon-midn (string)
+ (and (simple-string-p string)
+ (cond ((string= string "noon") 'noon)
+ ((string= string "midnight") 'midn)
+ (t nil))))
+
+(defun weekday (string)
+ (and (simple-string-p string) (gethash string *weekday-strings*)))
+
+(defun month (thing)
+ (or (and (simple-string-p thing) (gethash thing *month-strings*))
+ (and (integerp thing) (<= 1 thing 12))))
+
+(defun zone (thing)
+ (or (and (simple-string-p thing) (gethash thing *zone-strings*))
+ (if (integerp thing)
+ (let ((zone (/ thing 100)))
+ (and (integerp zone) (<= -24 zone 24))))))
+
+;;; Internet numerical time zone, e.g. RFC1123, in hours and minutes.
+(defun izone (thing)
+ (if (integerp thing)
+ (multiple-value-bind (hours mins)
+ (truncate thing 100)
+ (and (<= -24 hours 24) (<= -59 mins 59)))))
+
+(defun special-string-p (string)
+ (and (simple-string-p string) (gethash string *special-strings*)))
+
+(defun secondp (number)
+ (and (integerp number) (<= 0 number 59)))
+
+(defun minute (number)
+ (and (integerp number) (<= 0 number 59)))
+
+(defun hour (number)
+ (and (integerp number) (<= 0 number 23)))
+
+(defun day (number)
+ (and (integerp number) (<= 1 number 31)))
+
+(defun year (number)
+ (and (integerp number)
+ (or (<= 0 number 99)
+ (<= 1900 number))))
+
+(defun time-divider (character)
+ (and (characterp character)
+ (member character time-dividers :test #'char=)))
+
+(defun date-divider (character)
+ (and (characterp character)
+ (member character date-dividers :test #'char=)))
+
+;;; Match-substring takes a string argument and tries to match it with
+;;; the strings in one of the four hash tables: *weekday-strings*, *month-
+;;; strings*, *zone-strings*, *special-strings*. It returns a specific
+;;; keyword and/or the object it finds in the hash table. If no match
+;;; is made then it immediately signals an error.
+
+(defun match-substring (substring)
+ (let ((substring (nstring-downcase substring)))
+ (or (let ((test-value (month substring)))
+ (if test-value (cons 'month test-value)))
+ (let ((test-value (weekday substring)))
+ (if test-value (cons 'weekday test-value)))
+ (let ((test-value (am-pm substring)))
+ (if test-value (cons 'am-pm test-value)))
+ (let ((test-value (noon-midn substring)))
+ (if test-value (cons 'noon-midn test-value)))
+ (let ((test-value (zone substring)))
+ (if test-value (cons 'zone test-value)))
+ (let ((test-value (special-string-p substring)))
+ (if test-value (cons 'special test-value)))
+ (if *error-on-mismatch*
+ (error "\"~A\" is not a recognized word or abbreviation."
+ substring)
+ (return-from match-substring nil)))))
+
+;;; Decompose-string takes the time/date string and decomposes it into a
+;;; list of alphabetic substrings, numbers, and special divider characters.
+;;; It matches whatever strings it can and replaces them with a dotted pair
+;;; containing a symbol and value.
+
+(defun decompose-string (string &key (start 0) (end (length string)) (radix 10))
+ (do ((string-index start)
+ (next-negative nil)
+ (parts-list nil))
+ ((eq string-index end) (nreverse parts-list))
+ (let ((next-char (char string string-index))
+ (prev-char (if (= string-index start)
+ nil
+ (char string (1- string-index)))))
+ (cond ((alpha-char-p next-char)
+ ;; Alphabetic character - scan to the end of the substring.
+ (do ((scan-index (1+ string-index) (1+ scan-index)))
+ ((or (eq scan-index end)
+ (not (alpha-char-p (char string scan-index))))
+ (let ((match-symbol (match-substring
+ (subseq string string-index scan-index))))
+ (if match-symbol
+ (push match-symbol parts-list)
+ (return-from decompose-string nil)))
+ (setf string-index scan-index))))
+ ((digit-char-p next-char radix)
+ ;; Numeric digit - convert digit-string to a decimal value.
+ (do ((scan-index string-index (1+ scan-index))
+ (numeric-value 0 (+ (* numeric-value radix)
+ (digit-char-p (char string scan-index) radix))))
+ ((or (eq scan-index end)
+ (not (digit-char-p (char string scan-index) radix)))
+ ;; If next-negative is t, set the numeric value to it's
+ ;; opposite and reset next-negative to nil.
+ (when next-negative
+ (setf next-negative nil)
+ (setf numeric-value (- numeric-value)))
+ (push numeric-value parts-list)
+ (setf string-index scan-index))))
+ ((and (or (char= next-char #\-)
+ (char= next-char #\+))
+ (or (not prev-char)
+ (member prev-char whitespace-chars :test #'char=)))
+ ;; If we see a minus or plus sign before a number, but
+ ;; not after one, it is not a date divider, but an offset
+ ;; from GMT, so set next-negative to t if minus and
+ ;; continue.
+ (and (char= next-char #\-)
+ (setf next-negative t))
+ (incf string-index))
+ ((member next-char time-dividers :test #'char=)
+ ;; Time-divider - add it to the parts-list with symbol.
+ (push (cons 'time-divider next-char) parts-list)
+ (incf string-index))
+ ((member next-char date-dividers :test #'char=)
+ ;; Date-divider - add it to the parts-list with symbol.
+ (push (cons 'date-divider next-char) parts-list)
+ (incf string-index))
+ ((member next-char whitespace-chars :test #'char=)
+ ;; Whitespace character - ignore it completely.
+ (incf string-index))
+ ((char= next-char #\()
+ ;; Parenthesized string - scan to the end and ignore it.
+ (do ((scan-index string-index (1+ scan-index)))
+ ((or (eq scan-index end)
+ (char= (char string scan-index) #\)))
+ (setf string-index (1+ scan-index)))))
+ (t
+ ;; Unrecognized character - barf voraciously.
+ (if *error-on-mismatch*
+ (error
+ 'simple-error
+ :format-control "Can't parse time/date string.~%>>> ~A~
+ ~%~VT^-- Bogus character encountered here."
+ :format-arguments (list string (+ string-index 4)))
+ (return-from decompose-string nil)))))))
+
+;;; Match-pattern-element tries to match a pattern element with a datum
+;;; element and returns the symbol associated with the datum element if
+;;; successful. Otherwise nil is returned.
+
+(defun match-pattern-element (pattern-element datum-element)
+ (cond ((listp datum-element)
+ (let ((datum-type (if (eq (car datum-element) 'special)
+ (cdr datum-element)
+ (car datum-element))))
+ (if (eq datum-type pattern-element) datum-element)))
+ ((funcall pattern-element datum-element)
+ (cons pattern-element datum-element))
+ (t nil)))
+
+;;; Match-pattern matches a pattern against a datum, returning the
+;;; pattern if successful and nil otherwise.
+
+(defun match-pattern (pattern datum datum-length)
+ (if (>= (length pattern) datum-length)
+ (let ((form-list nil))
+ (do ((pattern pattern (cdr pattern))
+ (datum datum (cdr datum)))
+ ((or (null pattern) (null datum))
+ (cond ((and (null pattern) (null datum))
+ (nreverse form-list))
+ ((null pattern) nil)
+ ((null datum) (dolist (element pattern
+ (nreverse form-list))
+ (if (not (listp element))
+ (return nil))))))
+ (let* ((pattern-element (car pattern))
+ (datum-element (car datum))
+ (optional (listp pattern-element))
+ (matching (match-pattern-element (if optional
+ (car pattern-element)
+ pattern-element)
+ datum-element)))
+ (cond (matching (let ((form-type (car matching)))
+ (unless (or (eq form-type 'time-divider)
+ (eq form-type 'date-divider))
+ (push matching form-list))))
+ (optional (push datum-element datum))
+ (t (return-from match-pattern nil))))))))
+
+;;; Deal-with-noon-midn sets the decoded-time values to either noon
+;;; or midnight depending on the argument form-value. Form-value
+;;; can be either 'noon or 'midn.
+
+(defun deal-with-noon-midn (form-value parsed-values)
+ (cond ((eq form-value 'noon)
+ (setf (decoded-time-hour parsed-values) 12))
+ ((eq form-value 'midn)
+ (setf (decoded-time-hour parsed-values) 0))
+ (t (error "Unrecognized symbol: ~A" form-value)))
+ (setf (decoded-time-minute parsed-values) 0)
+ (setf (decoded-time-second parsed-values) 0))
+
+;;; Deal-with-am-pm sets the decoded-time values to be in the am
+;;; or pm depending on the argument form-value. Form-value can
+;;; be either 'am or 'pm.
+
+(defun deal-with-am-pm (form-value parsed-values)
+ (let ((hour (decoded-time-hour parsed-values)))
+ (cond ((eq form-value 'am)
+ (cond ((eq hour 12)
+ (setf (decoded-time-hour parsed-values) 0))
+ ((not (<= 0 hour 12))
+ (if *error-on-mismatch*
+ (error "~D is not an AM hour, dummy." hour)))))
+ ((eq form-value 'pm)
+ (if (<= 0 hour 11)
+ (setf (decoded-time-hour parsed-values)
+ (mod (+ hour 12) 24))))
+ (t (error "~A isn't AM/PM - this shouldn't happen." form-value)))))
+
+;;; Internet numerical time zone, e.g. RFC1123, in hours and minutes.
+(defun deal-with-izone (form-value parsed-values)
+ (multiple-value-bind (hours mins)
+ (truncate form-value 100)
+ (setf (decoded-time-zone parsed-values) (- (+ hours (/ mins 60))))))
+
+;;; Set-time-values uses the association list of symbols and values
+;;; to set the time in the decoded-time structure.
+
+(defun set-time-values (string-form parsed-values)
+ (dolist (form-part string-form t)
+ (let ((form-type (car form-part))
+ (form-value (cdr form-part)))
+ (case form-type
+ (secondp (setf (decoded-time-second parsed-values) form-value))
+ (minute (setf (decoded-time-minute parsed-values) form-value))
+ (hour (setf (decoded-time-hour parsed-values) form-value))
+ (day (setf (decoded-time-day parsed-values) form-value))
+ (month (setf (decoded-time-month parsed-values) form-value))
+ (year (setf (decoded-time-year parsed-values) form-value))
+ (zone (setf (decoded-time-zone parsed-values) form-value))
+ (izone (deal-with-izone form-value parsed-values))
+ (weekday (setf (decoded-time-dotw parsed-values) form-value))
+ (am-pm (deal-with-am-pm form-value parsed-values))
+ (noon-midn (deal-with-noon-midn form-value parsed-values))
+ (special (funcall form-value parsed-values))
+ (t (error "Unrecognized symbol in form list: ~A." form-type))))))
+
+(defun parse-time (time-string &key (start 0) (end (length time-string))
+ (error-on-mismatch nil)
+ (patterns *default-date-time-patterns*)
+ (default-seconds nil) (default-minutes nil)
+ (default-hours nil) (default-day nil)
+ (default-month nil) (default-year nil)
+ (default-zone nil) (default-weekday nil))
+ "Tries very hard to make sense out of the argument time-string and
+ returns a single integer representing the universal time if
+ successful. If not, it returns nil. If the :error-on-mismatch
+ keyword is true, parse-time will signal an error instead of
+ returning nil. Default values for each part of the time/date
+ can be specified by the appropriate :default- keyword. These
+ keywords can be given a numeric value or the keyword :current
+ to set them to the current value. The default-default values
+ are 00:00:00 on the current date, current time-zone."
+ (setq *error-on-mismatch* error-on-mismatch)
+ (let* ((string-parts (decompose-string time-string :start start :end end))
+ (parts-length (length string-parts))
+ (string-form (dolist (pattern patterns)
+ (let ((match-result (match-pattern pattern
+ string-parts
+ parts-length)))
+ (if match-result (return match-result))))))
+ (if string-form
+ (let ((parsed-values (make-default-time default-seconds default-minutes
+ default-hours default-day
+ default-month default-year
+ default-zone default-weekday)))
+ (set-time-values string-form parsed-values)
+ (convert-to-unitime parsed-values))
+ (if *error-on-mismatch*
+ (error "\"~A\" is not a recognized time/date format." time-string)
+ nil))))
+
+
Added: branches/grin-neu/thirdparty/net-telent-date/tests.lisp
===================================================================
--- branches/grin-neu/thirdparty/net-telent-date/tests.lisp 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/net-telent-date/tests.lisp 2006-12-01 10:39:49 UTC (rev 2094)
@@ -0,0 +1,19 @@
+(eval-when (:compile-toplevel :load-toplevel :execute)
+ (defpackage #:net.telent.date.test (:use #:net.telent.date #:rt)))
+
+;;; This is not presently supposed to work out of the box. When we've
+;;; figured out something approximating a standard test architecture
+;;; for cclan, we'll revisit it
+
+(in-package :net.telent.date.test)
+
+(deftest print-date
+ (with-date 3200663765 0
+ (format nil
+ (formatter "~3/net.telent.date:dayname/, ~2,'0D ~3/net.telent.date:monthname/ ~D ~2,'0D:~2,'0D:~2,'0D")
+ day-of-week day-of-month month year hour minute second))
+ "Mon, 04 Jun 2001 17:16:05")
+
+(deftest parse-date
+ (date:parse-time "Mon, 04 Jun 2001 17:16:05")
+ 3200663765)
Modified: branches/grin-neu/thirdparty/net.post-office/net.post-office.asd
===================================================================
--- branches/grin-neu/thirdparty/net.post-office/net.post-office.asd 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/net.post-office/net.post-office.asd 2006-12-01 10:39:49 UTC (rev 2094)
@@ -7,7 +7,7 @@
(defsystem net.post-office
:components ((:file "packages")
(:file "smtp" :depends-on ("packages"))
- (:file "imap" :depends-on ("packages")))
+ #+(or) (:file "imap" :depends-on ("packages")))
#-allegro :depends-on #-allegro (acl-compat)
:perform (load-op :after (op net.post-office)
(pushnew :net.post-office cl:*features*)))
Modified: branches/grin-neu/thirdparty/net.post-office/packages.lisp
===================================================================
--- branches/grin-neu/thirdparty/net.post-office/packages.lisp 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/net.post-office/packages.lisp 2006-12-01 10:39:49 UTC (rev 2094)
@@ -1,6 +1,6 @@
(defpackage :net.post-office
- (:use #:lisp #+allegro #:excl #-allegro #:acl-compat.excl)
+ (:use #:common-lisp #+allegro #:excl #-allegro #:acl-compat.excl)
(:export
;; smtp
#:send-letter
Modified: branches/grin-neu/thirdparty/portableaserve/acl-compat/sbcl/acl-excl.lisp
===================================================================
--- branches/grin-neu/thirdparty/portableaserve/acl-compat/sbcl/acl-excl.lisp 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/portableaserve/acl-compat/sbcl/acl-excl.lisp 2006-12-01 10:39:49 UTC (rev 2094)
@@ -11,12 +11,11 @@
stream)
(defun filesys-type (file-or-directory-name)
- (if (eq :directory (sb-unix:unix-file-kind
- (namestring file-or-directory-name)))
- :directory
- (if (probe-file file-or-directory-name)
- :file
- nil)))
+ (let ((mode (sb-posix:stat-mode (sb-posix:stat file-or-directory-name))))
+ (cond
+ ((sb-posix:s-isreg mode) :file)
+ ((sb-posix:s-isdir mode) :directory)
+ (t nil))))
(defmacro atomically (&body forms)
`(acl-mp:without-scheduling ,@forms))
@@ -25,5 +24,9 @@
(declare (ignore signal pid))
(error "unix-signal not implemented in acl-excl-sbcl.lisp"))
-(defmacro without-package-locks (&body forms)
- `(progn ,@forms))
+(defun filesys-inode (path)
+ (sb-posix:stat-ino (sb-posix:lstat path)))
+
+(defun cl-internal-real-time ()
+ (round (/ (get-internal-real-time) internal-time-units-per-second)))
+
Modified: branches/grin-neu/thirdparty/portableaserve/acl-compat/sbcl/acl-mp.lisp
===================================================================
--- branches/grin-neu/thirdparty/portableaserve/acl-compat/sbcl/acl-mp.lisp 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/portableaserve/acl-compat/sbcl/acl-mp.lisp 2006-12-01 10:39:49 UTC (rev 2094)
@@ -8,65 +8,6 @@
(in-package :acl-compat.mp)
-#-sb-thread
-(progn
-
-(defparameter *current-process* nil)
-
-(defparameter *all-processes* nil)
-
-(macrolet ((def (name args)
- `(defun ,name ,args
- (declare (ignore ,@(remove-if
- (lambda (x)
- (member x '(&optional &rest &key &allow-other-keys &aux)))
- (mapcar (lambda (x) (if (consp x) (car x) x))
- args))))
- (error "~A: Calling a multiprocessing function on a single-threaded sbcl build"
- ',name))))
- (def process-interrupt (process function))
- (defun process-name (process) ; *x
- (declare (ignore process))
- "the only process")
- (def process-wait-function (process))
- (def process-whostate (process))
- (def process-wait (process)) ; *x
- (def process-allow-schedule ()) ; *x
- (def process-property-list (process)) ; *x
- (def (setf process-property-list) (new-value process))
- (def process-run-reasons (process)) ; *x
- (def (setf process-run-reasons) (new-value process))
- (def process-revoke-run-reason (process object)) ; *x
- (def process-add-run-reason (process object)) ; *x
- (def process-run-function (name-or-options preset-function
- &rest preset-arguments)) ; *x
- (def process-preset (process preset-function &rest arguments)) ; *x
- (def process-initial-bindings (process))
- (def (setf process-initial-bindings) (bindings process))
- (def make-process (&key (name "Anonymous") reset-action run-reasons
- arrest-reasons (priority 0) quantum resume-hook
- suspend-hook initial-bindings run-immediately)) ; *x
- (def process-kill (process)) ; *x
- (def make-process-lock (&key name))) ; *x
-
-(defmacro with-process-lock ((lock &key norecursive timeout whostate) &body forms)
- (declare (ignore lock norecursive timeout whostate))
- `(progn ,@forms)) ; *x
-
-(defmacro without-scheduling (&body forms)
- `(progn ,@forms)) ; *
-) ; #-sb-thread
-
-;;; Same implementation for multi- and uni-thread
-(defmacro with-timeout ((seconds &body timeout-forms) &body body)
- (let ((c (gensym "TIMEOUT-")))
- `(handler-case
- (sb-ext:with-timeout ,seconds (progn ,@body))
- (sb-ext:timeout (,c) (declare (ignore ,c)) ,@timeout-forms))))
-
-
-#+sb-thread
-(progn
(defstruct (process
(:constructor %make-process)
(:predicate processp))
@@ -76,26 +17,161 @@
function ; function wot will be run
arguments ; arguments to the function
id ; pid of unix thread or nil
- %queue ; lock for process structure mutators
+ %lock ; lock for process structure mutators
run-reasons ; primitive mailbox for IPC
- %block-queue ; queue for condition-wait
+ %queue ; queue for condition-wait
initial-bindings ; special variable bindings
- property-list
- )
+ property-list)
-(defvar *current-process*
+(defparameter *current-process*
+ #-sb-thread
+ (%make-process)
+ #+sb-thread
;; We don't fill in the process id, so the process compiling this
;; (the REPL, in most cases) can't be killed by accident. (loop for
;; p in (all-processes) do (kill-process p)), anyone?
(%make-process :name "initial process" :function nil))
-(defvar *all-processes* (list *current-process*))
+(defparameter *all-processes-lock*
+ (sb-thread:make-mutex :name "all processes lock"))
-(defvar *conditional-store-queue* (sb-thread:make-waitqueue))
+(defparameter *all-processes*
+ (list *current-process*))
+#-sb-thread
+(defun make-process (&key (name "Anonymous") reset-action run-reasons
+ arrest-reasons (priority 0) quantum resume-hook
+ suspend-hook initial-bindings run-immediately)
+ (declare (ignore reset-action arrest-reasons priority quantum resume-hook
+ suspend-hook run-immediately))
+ (%make-process :name "the only process"
+ :run-reasons run-reasons
+ :initial-bindings initial-bindings))
+
+#+sb-thread
+(defun make-process (&key (name "Anonymous") reset-action run-reasons
+ arrest-reasons (priority 0) quantum resume-hook
+ suspend-hook initial-bindings run-immediately)
+ (declare (ignore reset-action arrest-reasons priority quantum resume-hook
+ suspend-hook run-immediately))
+ (let ((p (%make-process
+ :name name
+ :run-reasons run-reasons
+ :initial-bindings initial-bindings
+ :%lock (sb-thread:make-mutex
+ :name (format nil "Internal lock for ~A" name))
+ :%queue (sb-thread:make-waitqueue
+ :name (format nil "Blocking queue for ~A" name)))))
+ (sb-thread:with-mutex (*all-processes-lock*)
+ (push p *all-processes*))
+ p))
+
+(defmacro defun/sb-thread (name args &body body)
+ #-sb-thread (declare (ignore body))
+ `(defun ,name ,args
+ #-sb-thread
+ (declare (ignore ,@(remove-if
+ (lambda (x)
+ (member x '(&optional &rest &key &allow-other-keys
+ &aux)))
+ (mapcar (lambda (x) (if (consp x) (car x) x))
+ args))))
+ #-sb-thread
+ (error
+ "~A: Calling a multiprocessing function on a single-threaded sbcl build"
+ ',name)
+ #+sb-thread
+ ,@body))
+
+(defun/sb-thread process-interrupt (process function)
+ (sb-thread:interrupt-thread (process-id process) function))
+
+;; TODO: why no such function was in +sb-thread part?
+(defun/sb-thread process-wait-function (process)
+ (declare (ignore process)))
+
+(defun/sb-thread process-wait (reason predicate &rest arguments)
+ (declare (type function predicate))
+ (let ((old-state (process-whostate *current-process*)))
+ (unwind-protect
+ (progn
+ (setf old-state (process-whostate *current-process*)
+ (process-whostate *current-process*) reason)
+ (loop
+ (let ((it (apply predicate arguments)))
+ (when it (return it)))
+ (process-allow-schedule)))
+ (setf (process-whostate *current-process*) old-state))))
+
+(defun/sb-thread process-allow-schedule (&optional process)
+ (declare (ignore process))
+ (sleep .01))
+
+(defun/sb-thread process-revoke-run-reason (process object)
+ (sb-thread:with-recursive-lock ((process-%lock process))
+ (prog1
+ (setf (process-run-reasons process)
+ (delete object (process-run-reasons process)))
+ (when (and (process-id process) (not (process-run-reasons process)))
+ (disable-process process)))))
+
+(defun/sb-thread process-add-run-reason (process object)
+ (sb-thread:with-recursive-lock ((process-%lock process))
+ (prog1
+ (push object (process-run-reasons process))
+ (if (process-id process)
+ (enable-process process)
+ (restart-process process)))))
+
+(defun/sb-thread process-run-function (name-or-options preset-function
+ &rest preset-arguments)
+ (let* ((make-process-args (etypecase name-or-options
+ (list name-or-options)
+ (string (list :name name-or-options))))
+ (process (apply #'make-process make-process-args)))
+ (apply #'process-preset process preset-function preset-arguments)
+ (setf (process-run-reasons process) :enable)
+ (restart-process process)
+ process))
+
+(defun/sb-thread process-preset (process function &rest arguments)
+ (setf (process-function process) function
+ (process-arguments process) arguments)
+ (when (process-id process) (restart-process process)))
+
+(defun/sb-thread process-kill (process)
+ (when (process-id process)
+ (sb-thread:destroy-thread (process-id process))
+ (setf (process-id process) nil))
+ (sb-thread:with-mutex (*all-processes-lock*)
+ (setf *all-processes* (delete process *all-processes*))))
+
+#+sb-thread
+(defun make-process-lock (&key name)
+ (sb-thread:make-mutex :name name))
+#-sb-thread
+(defun make-process-lock (&key name)
+ (declare (ignore name))
+ nil)
+
+(defun/sb-thread process-lock (lock &optional lock-value whostate timeout)
+ (declare (ignore whostate timeout))
+ (sb-thread:get-mutex lock lock-value))
+
+(defun/sb-thread process-unlock (lock &optional lock-value)
+ (declare (ignore lock-value))
+ (sb-thread:release-mutex lock))
+
+#-sb-thread
+(defmacro with-process-lock ((lock &key norecursive timeout whostate)
+ &body forms)
+ (declare (ignore lock norecursive timeout whostate))
+ `(progn ,@forms))
+
+#+sb-thread
(defmacro with-process-lock ((place &key timeout whostate norecursive)
&body body)
- (declare (ignore norecursive))
+ (declare (ignore norecursive timeout))
(let ((old-whostate (gensym "OLD-WHOSTATE")))
`(sb-thread:with-recursive-lock (,place)
(let (,old-whostate)
@@ -108,25 +184,30 @@
(setf (process-whostate *current-process*) ,old-whostate))))))
-(defun make-process (&key (name "Anonymous") reset-action run-reasons
- arrest-reasons (priority 0) quantum resume-hook
- suspend-hook initial-bindings run-immediately)
- (declare (ignore reset-action arrest-reasons priority quantum resume-hook
- suspend-hook run-immediately))
- (let ((p (%make-process :name name
- :run-reasons run-reasons
- :initial-bindings initial-bindings
- :%queue (sb-thread:make-mutex :name (format nil "Internal lock for ~A" name))
- :%block-queue (sb-thread:make-waitqueue :name (format nil "Blocking queue for ~A" name)))))
- (push p *all-processes*)
- p))
+#-sb-thread
+(defmacro without-scheduling (&body forms)
+ `(progn ,@forms)) ; *
-(defun restart-process (process)
+;;; FIXME but, of course, we can't. Fix whoever wants to use it,
+;;; instead
+#+sb-thread
+(defmacro without-scheduling (&body body)
+ `(progn ,@body))
+
+;;; Same implementation for multi- and uni-thread
+(defmacro with-timeout ((seconds &body timeout-forms) &body body)
+ (let ((c (gensym "TIMEOUT-")))
+ `(handler-case
+ (sb-ext::with-timeout ,seconds (progn ,@body))
+ (sb-ext::timeout (,c) (declare (ignore ,c)) ,@timeout-forms))))
+
+(defun/sb-thread restart-process (process)
(labels ((boing ()
(let ((*current-process* process)
(bindings (process-initial-bindings process))
(function (process-function process))
(arguments (process-arguments process)))
+ (declare (type function function))
(if bindings
(progv
(mapcar #'car bindings)
@@ -135,76 +216,25 @@
bindings)
(apply function arguments))
(apply function arguments)))))
- (when (process-id process) (sb-thread:destroy-thread process))
+ (when (process-id process)
+ (sb-thread:terminate-thread (process-id process)))
;; XXX handle run-reasons in some way? Should a process continue
;; running if all run reasons are taken away before
;; restart-process is called? (process-revoke-run-reason handles
;; this, so let's say (setf (process-run-reasons process) nil) is
;; not guaranteed to do the Right Thing.)
- (when (setf (process-id process) (sb-thread:make-thread #'boing))
+ (when (setf (process-id process)
+ (sb-thread:make-thread #'boing :name (process-name process)))
process)))
-(defun process-preset (process function &rest arguments)
- "Set function of process and restart it if it was already running"
- (setf (process-function process) function
- (process-arguments process) arguments)
- (when (process-id process) (restart-process process)))
-
-(defun process-run-function (name-or-options preset-function
- &rest preset-arguments)
- (let* ((make-process-args (etypecase name-or-options
- (list name-or-options)
- (string (list :name name-or-options))))
- (process (apply #'make-process make-process-args)))
- (apply #'process-preset process preset-function preset-arguments)
- (when (process-run-reasons process) (restart-process process))
- process))
-
-(defun process-kill (process)
- (when (process-id process)
- (sb-thread:destroy-thread (process-id process))
- (setf (process-id process) nil))
- (setf *all-processes* (delete process *all-processes*)))
-
(defun current-process ()
*current-process*)
(defun all-processes ()
- *all-processes*)
+ (copy-list *all-processes*))
-(defun process-wait (reason predicate &rest arguments)
- (let ((old-state (process-whostate *current-process*)))
- (unwind-protect
- (progn
- (setf old-state (process-whostate *current-process*)
- (process-whostate *current-process*) reason)
- (loop
- (let ((it (apply predicate arguments)))
- (when it (return it)))
- (process-allow-schedule)))
- (setf (process-whostate *current-process*) old-state))))
-
-(defun process-allow-schedule ()
- (sleep .01))
-
-(defun process-revoke-run-reason (process object)
- (sb-thread:with-recursive-lock ((process-%queue process))
- (prog1
- (setf (process-run-reasons process)
- (delete object (process-run-reasons process)))
- (when (and (process-id process) (not (process-run-reasons process)))
- (disable-process process)))))
-
-(defun process-add-run-reason (process object)
- (sb-thread:with-recursive-lock ((process-%queue process))
- (prog1
- (push object (process-run-reasons process))
- (if (process-id process)
- (enable-process process)
- (restart-process process)))))
-
-
-(defun process-wait-with-timeout (reason timeout predicate)
+(defun/sb-thread process-wait-with-timeout (reason timeout predicate)
+ (declare (type function predicate))
(let ((old-state (process-whostate *current-process*))
(end-time (+ (get-universal-time) timeout)))
(unwind-protect
@@ -218,53 +248,47 @@
(sleep .01)))
(setf (process-whostate *current-process*) old-state))))
-(defun process-interrupt (process function)
- (declare (ignore process function))
- (error "Sorry Dave, I'm afraid I can't do that"))
-
-(defun disable-process (process)
+(defun/sb-thread disable-process (process)
;; TODO: set process-whostate
;; Can't figure out how to safely block a thread from a different one
;; and handle all the locking nastiness. So punt for now.
- (if (eql (sb-thread:current-thread-id) (process-id process))
+ (if (eq sb-thread:*current-thread* (process-id process))
;; Keep waiting until we have a reason to run. GC and other
;; things can break a wait prematurely. Don't know if this is
;; expected or not.
(do ()
((process-run-reasons process) nil)
- (sb-thread:condition-wait (process-%block-queue process)
- (process-%queue process)))
+ (sb-thread:with-recursive-lock ((process-%lock process))
+ (sb-thread:condition-wait (process-%queue process)
+ (process-%lock process))))
(error "Can't safely disable-process from another thread")))
-(defun enable-process (process)
+(defun/sb-thread enable-process (process)
;; TODO: set process-whostate
- (sb-thread:condition-notify (process-%block-queue process)))
+ (sb-thread:with-recursive-lock ((process-%lock process))
+ (sb-thread:condition-notify (process-%queue process))))
-;;; FIXME but, of course, we can't. Fix whoever wants to use it,
-;;; instead
-(defmacro without-scheduling (&body body)
- `(progn ,@body))
+;;; TODO: integrate with McCLIM / system-wide queue for such things
+#+sb-thread
+(defvar *atomic-spinlock* (sb-thread::make-spinlock))
-;;; TODO: integrate with McCLIM / system-wide queue for such things
+#-sb-thread
(defmacro atomic-incf (place)
- `(sb-thread::with-spinlock (*conditional-store-queue*)
- (incf ,place)))
+ `(incf ,place))
+#+sb-thread
+(defmacro atomic-incf (place)
+ `(sb-thread::with-spinlock (*atomic-spinlock*)
+ (incf ,place)))
+
+#-sb-thread
(defmacro atomic-decf (place)
- `(sb-thread::with-spinlock (*conditional-store-queue*)
- (decf ,place)))
+ `(decf ,place))
-(defun make-process-lock (&key name)
- (sb-thread:make-mutex :name name))
+#+sb-thread
+(defmacro atomic-decf (place)
+ `(sb-thread::with-spinlock (*atomic-spinlock*)
+ (decf ,place)))
-(defun process-active-p (thread-id)
- "If a native thread exists, it is always active"
- (and
- (member thread-id
- (let ((offset (* 4 sb-vm::thread-pid-slot)))
- (sb-thread::mapcar-threads
- #'(lambda (sap) (sb-sys:sap-ref-32 sap offset))))
- :test 'eql)
- t))
-
-) ; #+sb-thread
+(defun process-active-p (process)
+ (sb-thread:thread-alive-p (process-id process)))
Modified: branches/grin-neu/thirdparty/portableaserve/acl-compat/sbcl/acl-socket.lisp
===================================================================
--- branches/grin-neu/thirdparty/portableaserve/acl-compat/sbcl/acl-socket.lisp 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/portableaserve/acl-compat/sbcl/acl-socket.lisp 2006-12-01 10:39:49 UTC (rev 2094)
@@ -22,10 +22,18 @@
:reader stream-type
:initform (error "No value supplied for stream-type"))))
+(defclass datagram-socket (server-socket)
+ ())
+
+
(defmethod print-object ((socket server-socket) stream)
(print-unreadable-object (socket stream :type t :identity nil)
(format stream "listening on port ~d" (port socket))))
+(defmethod print-object ((socket datagram-socket) stream)
+ (print-unreadable-object (socket stream :type t :identity nil)
+ (format stream "datagram socket listening on port ~d" (port socket))))
+
(defgeneric accept-connection (socket &key wait))
(defmethod accept-connection ((server-socket server-socket)
&key (wait t))
@@ -45,7 +53,37 @@
stream))
nil))
-(defun make-socket (&key (remote-host "localhost")
+(defmethod receive-from ((socket datagram-socket) size &key buffer extract)
+ (multiple-value-bind (rbuf len address port)
+ (socket-receive (socket socket) buffer size)
+ (declare (ignore port))
+ (let ((buf
+ (if (not extract)
+ rbuf
+ (subseq rbuf 0 len)))) ;; FIXME: am I right?
+ (when buffer
+ (replace buffer buf :end2 len))
+ (values
+ (if buffer buffer buf)
+ len
+ address))))
+
+(defmethod send-to ((socket datagram-socket) buffer size &key remote-host remote-port)
+ (let* ((rhost (typecase remote-host
+ (string (lookup-hostname remote-host))
+ (otherwise remote-host)))
+ (s (socket socket))
+ (stream (progn
+ (socket-connect s rhost remote-port)
+ (socket-make-stream s :input t :output t :buffering :none))))
+ (write-sequence buffer stream)
+ size))
+
+
+
+(defun make-socket (&key
+ (type :stream)
+ (remote-host "localhost")
local-port
remote-port
(connect :active)
@@ -66,8 +104,22 @@
(:text 'base-char)
(:binary 'signed-byte)
(:bivalent 'unsigned-byte)))
- (socket (make-instance 'inet-socket :type :stream :protocol :tcp)))
+ (socket
+ (if (eq type :datagram)
+ (progn
+ (setf connect :passive-udp)
+ (make-instance 'inet-socket :type :datagram :protocol :udp))
+ (make-instance 'inet-socket :type :stream :protocol :tcp))))
(ecase connect
+ (:passive-udp
+ (setf (sockopt-reuse-address socket) reuse-address)
+ (if local-port
+ (socket-bind socket #(0 0 0 0) local-port))
+ (make-instance 'datagram-socket
+ :port (nth-value 1 (socket-name socket))
+ :socket socket
+ :element-type element-type
+ :stream-type format))
(:passive
(setf (sockopt-reuse-address socket) reuse-address)
(if local-port
@@ -111,7 +163,16 @@
(values a b c d)
(format nil "~d.~d.~d.~d" a b c d))))
-(declaim (ftype (function (simple-vector)
+(defun ipaddr-to-vector (ipaddr)
+ "Convert from 32-bit integer to a vector of octets."
+ (declare (type (unsigned-byte 32) ipaddr))
+ (let ((a (logand #xff (ash ipaddr -24)))
+ (b (logand #xff (ash ipaddr -16)))
+ (c (logand #xff (ash ipaddr -8)))
+ (d (logand #xff ipaddr)))
+ (make-array 4 :initial-contents (list a b c d))))
+
+(declaim (ftype (function (vector)
(values (unsigned-byte 32)))
vector-to-ipaddr))
(defun vector-to-ipaddr (sensible-ipaddr)
@@ -148,7 +209,7 @@
(defun ipaddr-to-hostname (ipaddr &key ignore-cache)
(when ignore-cache
(warn ":IGNORE-CACHE keyword in IPADDR-TO-HOSTNAME not supported."))
- (host-ent-name (get-host-by-address (make-inet-address ipaddr))))
+ (host-ent-name (get-host-by-address (ipaddr-to-vector ipaddr))))
(defun lookup-hostname (host &key ignore-cache)
(when ignore-cache
Modified: branches/grin-neu/thirdparty/portableaserve/aserve/main.cl
===================================================================
--- branches/grin-neu/thirdparty/portableaserve/aserve/main.cl 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/portableaserve/aserve/main.cl 2006-12-01 10:39:49 UTC (rev 2094)
@@ -221,7 +221,7 @@
(defun getpid () (sb-posix:getpid))
(defun setuid (uid) (sb-posix:setuid uid))
(defun setgid (gid) (sb-posix:setgid gid))
- (defun unix-fork () (sb-unix:unix-fork)))
+ (defun unix-fork () (sb-posix:fork)))
Added: branches/grin-neu/thirdparty/puri/LICENSE
===================================================================
--- branches/grin-neu/thirdparty/puri/LICENSE 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/puri/LICENSE 2006-12-01 10:39:49 UTC (rev 2094)
@@ -0,0 +1,574 @@
+Copyright (c) 1999-2001 Franz, Inc.
+Copyright (c) 2003 Kevin Rosenberg
+All rights reserved.
+
+PURI is licensed under the terms of the Lisp Lesser GNU Public
+License, known as the LLGPL. The LLGPL consists of a preamble (see
+below) and the Lessor GNU Public License 2.1 (LGPL-2.1). Where these
+conflict, the preamble takes precedence. PURI is referenced in the
+preamble as the "LIBRARY."
+
+PURI is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.
+
+
+
+Preamble to the Gnu Lesser General Public License
+-------------------------------------------------
+Copyright (c) 2000 Franz Incorporated, Berkeley, CA 94704
+
+The concept of the GNU Lesser General Public License version 2.1
+("LGPL") has been adopted to govern the use and distribution of
+above-mentioned application. However, the LGPL uses terminology that
+is more appropriate for a program written in C than one written in
+Lisp. Nevertheless, the LGPL can still be applied to a Lisp program if
+certain clarifications are made. This document details those
+clarifications. Accordingly, the license for the open-source Lisp
+applications consists of this document plus the LGPL. Wherever there
+is a conflict between this document and the LGPL, this document takes
+precedence over the LGPL.
+
+A "Library" in Lisp is a collection of Lisp functions, data and
+foreign modules. The form of the Library can be Lisp source code (for
+processing by an interpreter) or object code (usually the result of
+compilation of source code or built with some other
+mechanisms). Foreign modules are object code in a form that can be
+linked into a Lisp executable. When we speak of functions we do so in
+the most general way to include, in addition, methods and unnamed
+functions. Lisp "data" is also a general term that includes the data
+structures resulting from defining Lisp classes. A Lisp application
+may include the same set of Lisp objects as does a Library, but this
+does not mean that the application is necessarily a "work based on the
+Library" it contains.
+
+The Library consists of everything in the distribution file set before
+any modifications are made to the files. If any of the functions or
+classes in the Library are redefined in other files, then those
+redefinitions ARE considered a work based on the Library. If
+additional methods are added to generic functions in the Library,
+those additional methods are NOT considered a work based on the
+Library. If Library classes are subclassed, these subclasses are NOT
+considered a work based on the Library. If the Library is modified to
+explicitly call other functions that are neither part of Lisp itself
+nor an available add-on module to Lisp, then the functions called by
+the modified Library ARE considered a work based on the Library. The
+goal is to ensure that the Library will compile and run without
+getting undefined function errors.
+
+It is permitted to add proprietary source code to the Library, but it
+must be done in a way such that the Library will still run without
+that proprietary code present. Section 5 of the LGPL distinguishes
+between the case of a library being dynamically linked at runtime and
+one being statically linked at build time. Section 5 of the LGPL
+states that the former results in an executable that is a "work that
+uses the Library." Section 5 of the LGPL states that the latter
+results in one that is a "derivative of the Library", which is
+therefore covered by the LGPL. Since Lisp only offers one choice,
+which is to link the Library into an executable at build time, we
+declare that, for the purpose applying the LGPL to the Library, an
+executable that results from linking a "work that uses the Library"
+with the Library is considered a "work that uses the Library" and is
+therefore NOT covered by the LGPL.
+
+Because of this declaration, section 6 of LGPL is not applicable to
+the Library. However, in connection with each distribution of this
+executable, you must also deliver, in accordance with the terms and
+conditions of the LGPL, the source code of Library (or your derivative
+thereof) that is incorporated into this executable.
+
+
+
+ GNU LESSER GENERAL PUBLIC LICENSE
+ Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL. It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+ This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it. You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations
+below.
+
+ When we speak of free software, we are referring to freedom of use,
+not price. Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+ To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights. These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+ For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you. You must make sure that they, too, receive or can get the source
+code. If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it. And you must show them these terms so they know their rights.
+
+ We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+ To protect each distributor, we want to make it very clear that
+there is no warranty for the free library. Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+^L
+ Finally, software patents pose a constant threat to the existence of
+any free program. We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder. Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+ Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License. This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License. We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+ When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library. The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom. The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+ We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License. It also provides other free software developers Less
+of an advantage over competing non-free programs. These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries. However, the Lesser license provides advantages in certain
+special circumstances.
+
+ For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it
+becomes a de-facto standard. To achieve this, non-free programs must
+be allowed to use the library. A more frequent case is that a free
+library does the same job as widely used non-free libraries. In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+ In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software. For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+ Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+ The precise terms and conditions for copying, distribution and
+modification follow. Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library". The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+^L
+ GNU LESSER GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+ A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+ The "Library", below, refers to any such software library or work
+which has been distributed under these terms. A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language. (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+ "Source code" for a work means the preferred form of the work for
+making modifications to it. For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control
+compilation and installation of the library.
+
+ Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it). Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+ 1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+ You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+ 2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) The modified work must itself be a software library.
+
+ b) You must cause the files modified to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ c) You must cause the whole of the work to be licensed at no
+ charge to all third parties under the terms of this License.
+
+ d) If a facility in the modified Library refers to a function or a
+ table of data to be supplied by an application program that uses
+ the facility, other than as an argument passed when the facility
+ is invoked, then you must make a good faith effort to ensure that,
+ in the event an application does not supply such function or
+ table, the facility still operates, and performs whatever part of
+ its purpose remains meaningful.
+
+ (For example, a function in a library to compute square roots has
+ a purpose that is entirely well-defined independent of the
+ application. Therefore, Subsection 2d requires that any
+ application-supplied function or table used by this function must
+ be optional: if the application does not supply it, the square
+ root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library. To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License. (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.) Do not make any other change in
+these notices.
+^L
+ Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+ This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+ 4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+ If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library". Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+ However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library". The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+ When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library. The
+threshold for this to be true is not precisely defined by law.
+
+ If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work. (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+ Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+^L
+ 6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+ You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License. You must supply a copy of this License. If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License. Also, you must do one
+of these things:
+
+ a) Accompany the work with the complete corresponding
+ machine-readable source code for the Library including whatever
+ changes were used in the work (which must be distributed under
+ Sections 1 and 2 above); and, if the work is an executable linked
+ with the Library, with the complete machine-readable "work that
+ uses the Library", as object code and/or source code, so that the
+ user can modify the Library and then relink to produce a modified
+ executable containing the modified Library. (It is understood
+ that the user who changes the contents of definitions files in the
+ Library will not necessarily be able to recompile the application
+ to use the modified definitions.)
+
+ b) Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (1) uses at run time a
+ copy of the library already present on the user's computer system,
+ rather than copying library functions into the executable, and (2)
+ will operate properly with a modified version of the library, if
+ the user installs one, as long as the modified version is
+ interface-compatible with the version that the work was made with.
+
+ c) Accompany the work with a written offer, valid for at least
+ three years, to give the same user the materials specified in
+ Subsection 6a, above, for a charge no more than the cost of
+ performing this distribution.
+
+ d) If distribution of the work is made by offering access to copy
+ from a designated place, offer equivalent access to copy the above
+ specified materials from the same place.
+
+ e) Verify that the user has already received a copy of these
+ materials or that you have already sent this user a copy.
+
+ For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it. However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+ It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system. Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+^L
+ 7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+ a) Accompany the combined library with a copy of the same work
+ based on the Library, uncombined with any other library
+ facilities. This must be distributed under the terms of the
+ Sections above.
+
+ b) Give prominent notice with the combined library of the fact
+ that part of it is a work based on the Library, and explaining
+ where to find the accompanying uncombined form of the same work.
+
+ 8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License. Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License. However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+ 9. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Library or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+ 10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+^L
+ 11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all. For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply, and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License
+may add an explicit geographical distribution limitation excluding those
+countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation. If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+^L
+ 14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission. For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this. Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+ NO WARRANTY
+
+ 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+^L
+ How to Apply These Terms to Your New Libraries
+
+ If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change. You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms
+of the ordinary General Public License).
+
+ To apply these terms, attach the following notices to the library.
+It is safest to attach them to the start of each source file to most
+effectively convey the exclusion of warranty; and each file should
+have at least the "copyright" line and a pointer to where the full
+notice is found.
+
+
+ <one line to give the library's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
Added: branches/grin-neu/thirdparty/puri/README
===================================================================
--- branches/grin-neu/thirdparty/puri/README 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/puri/README 2006-12-01 10:39:49 UTC (rev 2094)
@@ -0,0 +1,46 @@
+PURI - Portable URI Library
+===========================
+
+AUTHORS
+-------
+Franz, Inc <http://www.franz.com>
+Kevin Rosenberg <kevin(a)rosenberg.net>
+
+
+DOWNLOAD
+--------
+Puri home: http://files.b9.com/puri/
+Portable tester home: http://files.b9.com/tester/
+
+
+SUPPORTED PLATFORMS
+-------------------
+ AllegroCL, CLISP, CMUCL, Lispworks, OpenMCL, SBCL
+
+
+OVERVIEW
+--------
+This is portable Universal Resource Identifier library for Common Lisp
+programs. It parses URI according to the RFC 2396 specification. It's
+is based on Franz, Inc's opensource URI package and has been ported to
+work other CL implementations. It is licensed under the LLGPL which
+is included in this distribution.
+
+A regression suite is included which uses Franz's open-source tester
+library. I've ported that library for use on other CL
+implementations. Puri completes 126/126 regression tests successfully.
+
+Franz's unmodified documentation file is included in the file
+uri.html.
+
+
+DIFFERENCES BETWEEN PURI and NET.URI
+------------------------------------
+
+* Puri uses the package 'puri while NET.URI uses the package 'net.uri
+
+* To signal an error parsing a URI, Puri uses the condition
+ :uri-parse-error while NET.URI uses the condition :parse-error. This
+ divergence occurs because Franz's parse-error condition uses
+ :format-control and :format-arguments slots which are not in the ANSI
+ specification for the parse-error condition.
Added: branches/grin-neu/thirdparty/puri/puri.asd
===================================================================
--- branches/grin-neu/thirdparty/puri/puri.asd 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/puri/puri.asd 2006-12-01 10:39:49 UTC (rev 2094)
@@ -0,0 +1,33 @@
+;;;; -*- Mode: LISP; Syntax: ANSI-Common-Lisp; Base: 10 -*-
+;;;; Programmer: Kevin Rosenberg
+
+
+(in-package #:cl-user)
+(defpackage #:puri-system (:use #:cl #:asdf))
+(in-package #:puri-system)
+
+
+(defsystem puri
+ :name "cl-puri"
+ :maintainer "Kevin M. Rosenberg <kmr(a)debian.org>"
+ :licence "GNU Lesser General Public License"
+ :description "Portable Universal Resource Indentifier Library"
+ :components
+ ((:file "src")))
+
+(defmethod perform ((o test-op) (c (eql (find-system 'puri))))
+ (oos 'load-op 'puri-tests)
+ (oos 'test-op 'puri-tests))
+
+(defsystem puri-tests
+ :depends-on (:puri :ptester)
+ :components
+ ((:file "tests")))
+
+(defmethod perform ((o test-op) (c (eql (find-system 'puri-tests))))
+ (or (funcall (intern (symbol-name '#:do-tests)
+ (find-package :puri-tests)))
+ (error "test-op failed")))
+
+(defmethod operation-done-p ((o test-op) (c (eql (find-system 'puri-tests))))
+ (values nil))
Added: branches/grin-neu/thirdparty/puri/src.lisp
===================================================================
--- branches/grin-neu/thirdparty/puri/src.lisp 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/puri/src.lisp 2006-12-01 10:39:49 UTC (rev 2094)
@@ -0,0 +1,1419 @@
+;; -*- mode: common-lisp; package: puri -*-
+;; Support for URIs
+;; For general URI information see RFC2396.
+;;
+;; copyright (c) 1999-2002 Franz Inc, Berkeley, CA - All rights reserved.
+;; copyright (c) 2002-2005 Franz Inc, Oakland, CA - All rights reserved.
+;; copyright (c) 2003-2006 Kevin Rosenberg (porting changes)
+;;
+;; This code is free software; you can redistribute it and/or
+;; modify it under the terms of the version 2.1 of
+;; the GNU Lesser General Public License as published by
+;; the Free Software Foundation, as clarified by the
+;; preamble found here:
+;; http://opensource.franz.com/preamble.html
+;;
+;; Versions ported from Franz's opensource release
+;; uri.cl,v 2.3.6.4.2.1 2001/08/09 17:42:39 layer
+;; uri.cl,v 2.9.84.1 2005/08/11 18:38:52 layer
+
+;; This code is distributed in the hope that it will be useful,
+;; but without any warranty; without even the implied warranty of
+;; merchantability or fitness for a particular purpose. See the GNU
+;; Lesser General Public License for more details.
+;;
+;; $Id: src.lisp 11030 2006-08-15 00:57:31Z kevin $
+
+(defpackage #:puri
+ (:use #:cl)
+ #-allegro (:nicknames #:net.uri)
+ (:export
+ #:uri ; the type and a function
+ #:uri-p
+ #:copy-uri
+
+ #:uri-scheme ; and slots
+ #:uri-host #:uri-port
+ #:uri-path
+ #:uri-query
+ #:uri-fragment
+ #:uri-plist
+ #:uri-authority ; pseudo-slot accessor
+
+ #:urn ; class
+ #:urn-nid ; pseudo-slot accessor
+ #:urn-nss ; pseudo-slot accessor
+
+ #:*strict-parse*
+ #:parse-uri
+ #:merge-uris
+ #:enough-uri
+ #:uri-parsed-path
+ #:render-uri
+
+ #:make-uri-space ; interning...
+ #:uri-space
+ #:uri=
+ #:intern-uri
+ #:unintern-uri
+ #:do-all-uris
+
+ #:uri-parse-error ;; Added by KMR
+ ))
+
+(in-package #:puri)
+
+(eval-when (:compile-toplevel) (declaim (optimize (speed 3))))
+
+
+#-allegro
+(defun parse-body (forms &optional env)
+ "Parses a body, returns (VALUES docstring declarations forms)"
+ (declare (ignore env))
+ ;; fixme -- need to add parsing of multiple declarations
+ (let (docstring declarations)
+ (when (stringp (car forms))
+ (setq docstring (car forms))
+ (setq forms (cdr forms)))
+ (when (and (listp (car forms))
+ (symbolp (caar forms))
+ (string-equal (symbol-name '#:declare)
+ (symbol-name (caar forms))))
+ (setq declarations (car forms))
+ (setq forms (cdr forms)))
+ (values docstring declarations forms)))
+
+
+(defun shrink-vector (str size)
+ #+allegro
+ (excl::.primcall 'sys::shrink-svector str size)
+ #+sbcl
+ (setq str (sb-kernel:shrink-vector str size))
+ #+cmu
+ (lisp::shrink-vector str size)
+ #+lispworks
+ (system::shrink-vector$vector str size)
+ #+scl
+ (common-lisp::shrink-vector str size)
+ #-(or allegro cmu lispworks sbcl scl)
+ (setq str (subseq str 0 size))
+ str)
+
+
+;; KMR: Added new condition to handle cross-implementation variances
+;; in the parse-error condition many implementations define
+
+(define-condition uri-parse-error (parse-error)
+ ((fmt-control :initarg :fmt-control :accessor fmt-control)
+ (fmt-arguments :initarg :fmt-arguments :accessor fmt-arguments ))
+ (:report (lambda (c stream)
+ (format stream "Parse error:")
+ (apply #'format stream (fmt-control c) (fmt-arguments c)))))
+
+(defun .parse-error (fmt &rest args)
+ (error 'uri-parse-error :fmt-control fmt :fmt-arguments args))
+
+#-allegro
+(defun internal-reader-error (stream fmt &rest args)
+ (apply #'format stream fmt args))
+
+#-allegro (defvar *current-case-mode* :case-insensitive-upper)
+#+allegro (eval-when (:compile-toplevel :load-toplevel :execute)
+ (import '(excl:*current-case-mode*
+ excl:delimited-string-to-list
+ excl::parse-body
+ excl::internal-reader-error
+ excl:if*)))
+
+#-allegro
+(defmethod position-char (char (string string) start max)
+ (declare (optimize (speed 3) (safety 0) (space 0))
+ (fixnum start max) (string string))
+ (do* ((i start (1+ i)))
+ ((= i max) nil)
+ (declare (fixnum i))
+ (when (char= char (char string i)) (return i))))
+
+#-allegro
+(defun delimited-string-to-list (string &optional (separator #\space)
+ skip-terminal)
+ (declare (optimize (speed 3) (safety 0) (space 0)
+ (compilation-speed 0))
+ (type string string)
+ (type character separator))
+ (do* ((len (length string))
+ (output '())
+ (pos 0)
+ (end (position-char separator string pos len)
+ (position-char separator string pos len)))
+ ((null end)
+ (if (< pos len)
+ (push (subseq string pos) output)
+ (when (and (plusp len) (not skip-terminal))
+ (push "" output)))
+ (nreverse output))
+ (declare (type fixnum pos len)
+ (type (or null fixnum) end))
+ (push (subseq string pos end) output)
+ (setq pos (1+ end))))
+
+#-allegro
+(eval-when (:compile-toplevel :load-toplevel :execute)
+ (defvar if*-keyword-list '("then" "thenret" "else" "elseif"))
+
+ (defmacro if* (&rest args)
+ (do ((xx (reverse args) (cdr xx))
+ (state :init)
+ (elseseen nil)
+ (totalcol nil)
+ (lookat nil nil)
+ (col nil))
+ ((null xx)
+ (cond ((eq state :compl)
+ `(cond ,@totalcol))
+ (t (error "if*: illegal form ~s" args))))
+ (cond ((and (symbolp (car xx))
+ (member (symbol-name (car xx))
+ if*-keyword-list
+ :test #'string-equal))
+ (setq lookat (symbol-name (car xx)))))
+
+ (cond ((eq state :init)
+ (cond (lookat (cond ((string-equal lookat "thenret")
+ (setq col nil
+ state :then))
+ (t (error
+ "if*: bad keyword ~a" lookat))))
+ (t (setq state :col
+ col nil)
+ (push (car xx) col))))
+ ((eq state :col)
+ (cond (lookat
+ (cond ((string-equal lookat "else")
+ (cond (elseseen
+ (error
+ "if*: multiples elses")))
+ (setq elseseen t)
+ (setq state :init)
+ (push `(t ,@col) totalcol))
+ ((string-equal lookat "then")
+ (setq state :then))
+ (t (error "if*: bad keyword ~s"
+ lookat))))
+ (t (push (car xx) col))))
+ ((eq state :then)
+ (cond (lookat
+ (error
+ "if*: keyword ~s at the wrong place " (car xx)))
+ (t (setq state :compl)
+ (push `(,(car xx) ,@col) totalcol))))
+ ((eq state :compl)
+ (cond ((not (string-equal lookat "elseif"))
+ (error "if*: missing elseif clause ")))
+ (setq state :init))))))
+
+
+(defclass uri ()
+ (
+;;;; external:
+ (scheme :initarg :scheme :initform nil :accessor uri-scheme)
+ (host :initarg :host :initform nil :accessor uri-host)
+ (port :initarg :port :initform nil :accessor uri-port)
+ (path :initarg :path :initform nil :accessor uri-path)
+ (query :initarg :query :initform nil :accessor uri-query)
+ (fragment :initarg :fragment :initform nil :accessor uri-fragment)
+ (plist :initarg :plist :initform nil :accessor uri-plist)
+
+;;;; internal:
+ (escaped
+ ;; used to prevent unnessary work, looking for chars to escape and
+ ;; unescape.
+ :initarg :escaped :initform nil :accessor uri-escaped)
+ (string
+ ;; the cached printable representation of the URI. It *might* be
+ ;; different than the original string, though, because the user might
+ ;; have escaped non-reserved chars--they won't be escaped when the URI
+ ;; is printed.
+ :initarg :string :initform nil :accessor uri-string)
+ (parsed-path
+ ;; the cached parsed representation of the URI path.
+ :initarg :parsed-path
+ :initform nil
+ :accessor .uri-parsed-path)
+ (hashcode
+ ;; cached sxhash, so we don't have to compute it more than once.
+ :initarg :hashcode :initform nil :accessor uri-hashcode)))
+
+(defclass urn (uri)
+ ((nid :initarg :nid :initform nil :accessor urn-nid)
+ (nss :initarg :nss :initform nil :accessor urn-nss)))
+
+(eval-when (:compile-toplevel :execute)
+ (defmacro clear-caching-on-slot-change (name)
+ `(defmethod (setf ,name) :around (new-value (self uri))
+ (declare (ignore new-value))
+ (prog1 (call-next-method)
+ (setf (uri-string self) nil)
+ ,@(when (eq name 'uri-path) `((setf (.uri-parsed-path self) nil)))
+ (setf (uri-hashcode self) nil))))
+ )
+
+(clear-caching-on-slot-change uri-scheme)
+(clear-caching-on-slot-change uri-host)
+(clear-caching-on-slot-change uri-port)
+(clear-caching-on-slot-change uri-path)
+(clear-caching-on-slot-change uri-query)
+(clear-caching-on-slot-change uri-fragment)
+
+
+(defmethod make-load-form ((self uri) &optional env)
+ (declare (ignore env))
+ `(make-instance ',(class-name (class-of self))
+ :scheme ,(uri-scheme self)
+ :host ,(uri-host self)
+ :port ,(uri-port self)
+ :path ',(uri-path self)
+ :query ,(uri-query self)
+ :fragment ,(uri-fragment self)
+ :plist ',(uri-plist self)
+ :string ,(uri-string self)
+ :parsed-path ',(.uri-parsed-path self)))
+
+(defmethod uri-p ((thing uri)) t)
+(defmethod uri-p ((thing t)) nil)
+
+(defun copy-uri (uri
+ &key place
+ (scheme (when uri (uri-scheme uri)))
+ (host (when uri (uri-host uri)))
+ (port (when uri (uri-port uri)))
+ (path (when uri (uri-path uri)))
+ (parsed-path
+ (when uri (copy-list (.uri-parsed-path uri))))
+ (query (when uri (uri-query uri)))
+ (fragment (when uri (uri-fragment uri)))
+ (plist (when uri (copy-list (uri-plist uri))))
+ (class (when uri (class-of uri)))
+ &aux (escaped (when uri (uri-escaped uri))))
+ (if* place
+ then (setf (uri-scheme place) scheme)
+ (setf (uri-host place) host)
+ (setf (uri-port place) port)
+ (setf (uri-path place) path)
+ (setf (.uri-parsed-path place) parsed-path)
+ (setf (uri-query place) query)
+ (setf (uri-fragment place) fragment)
+ (setf (uri-plist place) plist)
+ (setf (uri-escaped place) escaped)
+ (setf (uri-string place) nil)
+ (setf (uri-hashcode place) nil)
+ place
+ elseif (eq 'uri class)
+ then ;; allow the compiler to optimize the call to make-instance:
+ (make-instance 'uri
+ :scheme scheme :host host :port port :path path
+ :parsed-path parsed-path
+ :query query :fragment fragment :plist plist
+ :escaped escaped :string nil :hashcode nil)
+ else (make-instance class
+ :scheme scheme :host host :port port :path path
+ :parsed-path parsed-path
+ :query query :fragment fragment :plist plist
+ :escaped escaped :string nil :hashcode nil)))
+
+(defmethod uri-parsed-path ((uri uri))
+ (when (uri-path uri)
+ (when (null (.uri-parsed-path uri))
+ (setf (.uri-parsed-path uri)
+ (parse-path (uri-path uri) (uri-escaped uri))))
+ (.uri-parsed-path uri)))
+
+(defmethod (setf uri-parsed-path) (path-list (uri uri))
+ (assert (and (consp path-list)
+ (or (member (car path-list) '(:absolute :relative)
+ :test #'eq))))
+ (setf (uri-path uri) (render-parsed-path path-list t))
+ (setf (.uri-parsed-path uri) path-list)
+ path-list)
+
+(defun uri-authority (uri)
+ (when (uri-host uri)
+ (let ((*print-pretty* nil))
+ (format nil "~a~@[:~a~]" (uri-host uri) (uri-port uri)))))
+
+(defun uri-nid (uri)
+ (if* (equalp "urn" (uri-scheme uri))
+ then (uri-host uri)
+ else (error "URI is not a URN: ~s." uri)))
+
+(defun uri-nss (uri)
+ (if* (equalp "urn" (uri-scheme uri))
+ then (uri-path uri)
+ else (error "URI is not a URN: ~s." uri)))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Parsing
+
+(defparameter *excluded-characters*
+ '(;; `delims' (except #\%, because it's handled specially):
+ #\< #\> #\" #\space #\#
+ ;; `unwise':
+ #\{ #\} #\| #\\ #\^ #\[ #\] #\`))
+
+(defun reserved-char-vector (chars &key except)
+ (do* ((a (make-array 127 :element-type 'bit :initial-element 0))
+ (chars chars (cdr chars))
+ (c (car chars) (car chars)))
+ ((null chars) a)
+ (if* (and except (member c except :test #'char=))
+ thenret
+ else (setf (sbit a (char-int c)) 1))))
+
+(defparameter *reserved-characters*
+ (reserved-char-vector
+ (append *excluded-characters*
+ '(#\; #\/ #\? #\: #\@ #\& #\= #\+ #\$ #\, #\%))))
+(defparameter *reserved-authority-characters*
+ (reserved-char-vector
+ (append *excluded-characters* '(#\; #\/ #\? #\: #\@))))
+(defparameter *reserved-path-characters*
+ (reserved-char-vector
+ (append *excluded-characters*
+ '(#\;
+;;;;The rfc says this should be here, but it doesn't make sense.
+ ;; #\=
+ #\/ #\?))))
+
+(defparameter *reserved-fragment-characters*
+ (reserved-char-vector (remove #\# *excluded-characters*)))
+
+(eval-when (:compile-toplevel :execute)
+(defun gen-char-range-list (start end)
+ (do* ((res '())
+ (endcode (1+ (char-int end)))
+ (chcode (char-int start)
+ (1+ chcode))
+ (hyphen nil))
+ ((= chcode endcode)
+ ;; - has to be first, otherwise it signifies a range!
+ (if* hyphen
+ then (setq res (nreverse res))
+ (push #\- res)
+ res
+ else (nreverse res)))
+ (if* (= #.(char-int #\-) chcode)
+ then (setq hyphen t)
+ else (push (code-char chcode) res))))
+)
+
+(defparameter *valid-nid-characters*
+ (reserved-char-vector
+ '#.(nconc (gen-char-range-list #\a #\z)
+ (gen-char-range-list #\A #\Z)
+ (gen-char-range-list #\0 #\9)
+ '(#\- #\. #\+))))
+(defparameter *reserved-nss-characters*
+ (reserved-char-vector
+ (append *excluded-characters* '(#\& #\~ #\/ #\?))))
+
+(defparameter *illegal-characters*
+ (reserved-char-vector (remove #\# *excluded-characters*)))
+(defparameter *strict-illegal-query-characters*
+ (reserved-char-vector (append '(#\?) (remove #\# *excluded-characters*))))
+(defparameter *illegal-query-characters*
+ (reserved-char-vector
+ *excluded-characters* :except '(#\^ #\| #\#)))
+
+
+(defun parse-uri (thing &key (class 'uri) &aux escape)
+ (when (uri-p thing) (return-from parse-uri thing))
+
+ (setq escape (escape-p thing))
+ (multiple-value-bind (scheme host port path query fragment)
+ (parse-uri-string thing)
+ (when scheme
+ (setq scheme
+ (intern (funcall
+ (case *current-case-mode*
+ ((:case-insensitive-upper :case-sensitive-upper)
+ #'string-upcase)
+ ((:case-insensitive-lower :case-sensitive-lower)
+ #'string-downcase))
+ (decode-escaped-encoding scheme escape))
+ (find-package :keyword))))
+
+ (when (and scheme (eq :urn scheme))
+ (return-from parse-uri
+ (make-instance 'urn :scheme scheme :nid host :nss path)))
+
+ (when host (setq host (decode-escaped-encoding host escape)))
+ (when port
+ (setq port (read-from-string port))
+ (when (not (numberp port)) (error "port is not a number: ~s." port))
+ (when (not (plusp port))
+ (error "port is not a positive integer: ~d." port))
+ (when (eql port (case scheme
+ (:http 80)
+ (:https 443)
+ (:ftp 21)
+ (:telnet 23)))
+ (setq port nil)))
+ (when (or (string= "" path)
+ (and ;; we canonicalize away a reference to just /:
+ scheme
+ (member scheme '(:http :https :ftp) :test #'eq)
+ (string= "/" path)))
+ (setq path nil))
+ (when path
+ (setq path
+ (decode-escaped-encoding path escape *reserved-path-characters*)))
+ (when query (setq query (decode-escaped-encoding query escape)))
+ (when fragment
+ (setq fragment
+ (decode-escaped-encoding fragment escape
+ *reserved-fragment-characters*)))
+ (if* (eq 'uri class)
+ then ;; allow the compiler to optimize the make-instance call:
+ (make-instance 'uri
+ :scheme scheme
+ :host host
+ :port port
+ :path path
+ :query query
+ :fragment fragment
+ :escaped escape)
+ else ;; do it the slow way:
+ (make-instance class
+ :scheme scheme
+ :host host
+ :port port
+ :path path
+ :query query
+ :fragment fragment
+ :escaped escape))))
+
+(defmethod uri ((thing uri))
+ thing)
+
+(defmethod uri ((thing string))
+ (parse-uri thing))
+
+(defmethod uri ((thing t))
+ (error "Cannot coerce ~s to a uri." thing))
+
+(defvar *strict-parse* t)
+
+(defun parse-uri-string (string &aux (illegal-chars *illegal-characters*))
+ (declare (optimize (speed 3)))
+ ;; Speed is important, so use a specialized state machine instead of
+ ;; regular expressions for parsing the URI string. The regexp we are
+ ;; simulating:
+ ;; ^(([^:/?#]+):)?
+ ;; (//([^/?#]*))?
+ ;; ([^?#]*)
+ ;; (\?([^#]*))?
+ ;; (#(.*))?
+ (let* ((state 0)
+ (start 0)
+ (end (length string))
+ (tokval nil)
+ (scheme nil)
+ (host nil)
+ (port nil)
+ (path-components '())
+ (query nil)
+ (fragment nil)
+ ;; namespace identifier, for urn parsing only:
+ (nid nil))
+ (declare (fixnum state start end))
+ (flet ((read-token (kind &optional legal-chars)
+ (setq tokval nil)
+ (if* (>= start end)
+ then :end
+ else (let ((sindex start)
+ (res nil)
+ c)
+ (declare (fixnum sindex))
+ (setq res
+ (loop
+ (when (>= start end) (return nil))
+ (setq c (char string start))
+ (let ((ci (char-int c)))
+ (if* legal-chars
+ then (if* (and (eq :colon kind) (eq c #\:))
+ then (return :colon)
+ elseif (= 0 (sbit legal-chars ci))
+ then (.parse-error
+ "~
+URI ~s contains illegal character ~s at position ~d."
+ string c start))
+ elseif (and (< ci 128)
+ *strict-parse*
+ (= 1 (sbit illegal-chars ci)))
+ then (.parse-error "~
+URI ~s contains illegal character ~s at position ~d."
+ string c start)))
+ (case kind
+ (:path (case c
+ (#\? (return :question))
+ (#\# (return :hash))))
+ (:query (case c (#\# (return :hash))))
+ (:rest)
+ (t (case c
+ (#\: (return :colon))
+ (#\? (return :question))
+ (#\# (return :hash))
+ (#\/ (return :slash)))))
+ (incf start)))
+ (if* (> start sindex)
+ then ;; we found some chars
+ ;; before we stopped the parse
+ (setq tokval (subseq string sindex start))
+ :string
+ else ;; immediately stopped at a special char
+ (incf start)
+ res))))
+ (failure (&optional why)
+ (.parse-error "illegal URI: ~s [~d]~@[: ~a~]"
+ string state why))
+ (impossible ()
+ (.parse-error "impossible state: ~d [~s]" state string)))
+ (loop
+ (case state
+ (0 ;; starting to parse
+ (ecase (read-token t)
+ (:colon (failure))
+ (:question (setq state 7))
+ (:hash (setq state 8))
+ (:slash (setq state 3))
+ (:string (setq state 1))
+ (:end (setq state 9))))
+ (1 ;; seen <token><special char>
+ (let ((token tokval))
+ (ecase (read-token t)
+ (:colon (setq scheme token)
+ (if* (equalp "urn" scheme)
+ then (setq state 15)
+ else (setq state 2)))
+ (:question (push token path-components)
+ (setq state 7))
+ (:hash (push token path-components)
+ (setq state 8))
+ (:slash (push token path-components)
+ (push "/" path-components)
+ (setq state 6))
+ (:string (failure))
+ (:end (push token path-components)
+ (setq state 9)))))
+ (2 ;; seen <scheme>:
+ (ecase (read-token t)
+ (:colon (failure))
+ (:question (setq state 7))
+ (:hash (setq state 8))
+ (:slash (setq state 3))
+ (:string (setq state 10))
+ (:end (setq state 9))))
+ (10 ;; seen <scheme>:<token>
+ (let ((token tokval))
+ (ecase (read-token t)
+ (:colon (failure))
+ (:question (push token path-components)
+ (setq state 7))
+ (:hash (push token path-components)
+ (setq state 8))
+ (:slash (push token path-components)
+ (setq state 6))
+ (:string (failure))
+ (:end (push token path-components)
+ (setq state 9)))))
+ (3 ;; seen / or <scheme>:/
+ (ecase (read-token t)
+ (:colon (failure))
+ (:question (push "/" path-components)
+ (setq state 7))
+ (:hash (push "/" path-components)
+ (setq state 8))
+ (:slash (setq state 4))
+ (:string (push "/" path-components)
+ (push tokval path-components)
+ (setq state 6))
+ (:end (push "/" path-components)
+ (setq state 9))))
+ (4 ;; seen [<scheme>:]//
+ (ecase (read-token t)
+ (:colon (failure))
+ (:question (failure))
+ (:hash (failure))
+ (:slash
+ (if* (and (equalp "file" scheme)
+ (null host))
+ then ;; file:///...
+ (push "/" path-components)
+ (setq state 6)
+ else (failure)))
+ (:string (setq host tokval)
+ (setq state 11))
+ (:end (failure))))
+ (11 ;; seen [<scheme>:]//<host>
+ (ecase (read-token t)
+ (:colon (setq state 5))
+ (:question (setq state 7))
+ (:hash (setq state 8))
+ (:slash (push "/" path-components)
+ (setq state 6))
+ (:string (impossible))
+ (:end (setq state 9))))
+ (5 ;; seen [<scheme>:]//<host>:
+ (ecase (read-token t)
+ (:colon (failure))
+ (:question (failure))
+ (:hash (failure))
+ (:slash (push "/" path-components)
+ (setq state 6))
+ (:string (setq port tokval)
+ (setq state 12))
+ (:end (failure))))
+ (12 ;; seen [<scheme>:]//<host>:[<port>]
+ (ecase (read-token t)
+ (:colon (failure))
+ (:question (setq state 7))
+ (:hash (setq state 8))
+ (:slash (push "/" path-components)
+ (setq state 6))
+ (:string (impossible))
+ (:end (setq state 9))))
+ (6 ;; seen /
+ (ecase (read-token :path)
+ (:question (setq state 7))
+ (:hash (setq state 8))
+ (:string (push tokval path-components)
+ (setq state 13))
+ (:end (setq state 9))))
+ (13 ;; seen path
+ (ecase (read-token :path)
+ (:question (setq state 7))
+ (:hash (setq state 8))
+ (:string (impossible))
+ (:end (setq state 9))))
+ (7 ;; seen ?
+ (setq illegal-chars
+ (if* *strict-parse*
+ then *strict-illegal-query-characters*
+ else *illegal-query-characters*))
+ (ecase (prog1 (read-token :query)
+ (setq illegal-chars *illegal-characters*))
+ (:hash (setq state 8))
+ (:string (setq query tokval)
+ (setq state 14))
+ (:end (setq state 9))))
+ (14 ;; query
+ (ecase (read-token :query)
+ (:hash (setq state 8))
+ (:string (impossible))
+ (:end (setq state 9))))
+ (8 ;; seen #
+ (ecase (read-token :rest)
+ (:string (setq fragment tokval)
+ (setq state 9))
+ (:end (setq state 9))))
+ (9 ;; done
+ (return
+ (values
+ scheme host port
+ (apply #'concatenate 'string (nreverse path-components))
+ query fragment)))
+ ;; URN parsing:
+ (15 ;; seen urn:, read nid now
+ (case (read-token :colon *valid-nid-characters*)
+ (:string (setq nid tokval)
+ (setq state 16))
+ (t (failure "missing namespace identifier"))))
+ (16 ;; seen urn:<nid>
+ (case (read-token t)
+ (:colon (setq state 17))
+ (t (failure "missing namespace specific string"))))
+ (17 ;; seen urn:<nid>:, rest is nss
+ (return (values scheme
+ nid
+ nil
+ (progn
+ (setq illegal-chars *reserved-nss-characters*)
+ (read-token :rest)
+ tokval))))
+ (t (.parse-error
+ "internal error in parse engine, wrong state: ~s." state)))))))
+
+(defun escape-p (string)
+ (declare (optimize (speed 3)))
+ (do* ((i 0 (1+ i))
+ (max (the fixnum (length string))))
+ ((= i max) nil)
+ (declare (fixnum i max))
+ (when (char= #\% (char string i))
+ (return t))))
+
+(defun parse-path (path-string escape)
+ (do* ((xpath-list (delimited-string-to-list path-string #\/))
+ (path-list
+ (progn
+ (if* (string= "" (car xpath-list))
+ then (setf (car xpath-list) :absolute)
+ else (push :relative xpath-list))
+ xpath-list))
+ (pl (cdr path-list) (cdr pl))
+ segments)
+ ((null pl) path-list)
+
+ (if* (cdr (setq segments
+ (if* (string= "" (car pl))
+ then '("")
+ else (delimited-string-to-list (car pl) #\;))))
+ then ;; there is a param
+ (setf (car pl)
+ (mapcar #'(lambda (s)
+ (decode-escaped-encoding s escape
+ ;; decode all %xx:
+ nil))
+ segments))
+ else ;; no param
+ (setf (car pl)
+ (decode-escaped-encoding (car segments) escape
+ ;; decode all %xx:
+ nil)))))
+
+(defun decode-escaped-encoding (string escape
+ &optional (reserved-chars
+ *reserved-characters*))
+ ;; Return a string with the real characters.
+ (when (null escape) (return-from decode-escaped-encoding string))
+ (do* ((i 0 (1+ i))
+ (max (length string))
+ (new-string (copy-seq string))
+ (new-i 0 (1+ new-i))
+ ch ch2 chc chc2)
+ ((= i max)
+ (shrink-vector new-string new-i))
+ (if* (char= #\% (setq ch (char string i)))
+ then (when (> (+ i 3) max)
+ (.parse-error
+ "Unsyntactic escaped encoding in ~s." string))
+ (setq ch (char string (incf i)))
+ (setq ch2 (char string (incf i)))
+ (when (not (and (setq chc (digit-char-p ch 16))
+ (setq chc2 (digit-char-p ch2 16))))
+ (.parse-error
+ "Non-hexidecimal digits after %: %c%c." ch ch2))
+ (let ((ci (+ (* 16 chc) chc2)))
+ (if* (or (null reserved-chars)
+ (> ci 127) ; bug11527
+ (= 0 (sbit reserved-chars ci)))
+ then ;; ok as is
+ (setf (char new-string new-i)
+ (code-char ci))
+ else (setf (char new-string new-i) #\%)
+ (setf (char new-string (incf new-i)) ch)
+ (setf (char new-string (incf new-i)) ch2)))
+ else (setf (char new-string new-i) ch))))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;;; Printing
+
+(defun render-uri (uri stream
+ &aux (escape (uri-escaped uri))
+ (*print-pretty* nil))
+ (when (null (uri-string uri))
+ (setf (uri-string uri)
+ (let ((scheme (uri-scheme uri))
+ (host (uri-host uri))
+ (port (uri-port uri))
+ (path (uri-path uri))
+ (query (uri-query uri))
+ (fragment (uri-fragment uri)))
+ (concatenate 'string
+ (when scheme
+ (encode-escaped-encoding
+ (string-downcase ;; for upper case lisps
+ (symbol-name scheme))
+ *reserved-characters* escape))
+ (when scheme ":")
+ (when (or host (eq :file scheme)) "//")
+ (when host
+ (encode-escaped-encoding
+ host *reserved-authority-characters* escape))
+ (when port ":")
+ (when port
+ #-allegro (format nil "~D" port)
+ #+allegro (with-output-to-string (s)
+ (excl::maybe-print-fast s port))
+ )
+ (when path
+ (encode-escaped-encoding path
+ nil
+ ;;*reserved-path-characters*
+ escape))
+ (when query "?")
+ (when query (encode-escaped-encoding query nil escape))
+ (when fragment "#")
+ (when fragment (encode-escaped-encoding fragment nil escape))))))
+ (if* stream
+ then (format stream "~a" (uri-string uri))
+ else (uri-string uri)))
+
+(defun render-parsed-path (path-list escape)
+ (do* ((res '())
+ (first (car path-list))
+ (pl (cdr path-list) (cdr pl))
+ (pe (car pl) (car pl)))
+ ((null pl)
+ (when res (apply #'concatenate 'string (nreverse res))))
+ (when (or (null first)
+ (prog1 (eq :absolute first)
+ (setq first nil)))
+ (push "/" res))
+ (if* (atom pe)
+ then (push
+ (encode-escaped-encoding pe *reserved-path-characters* escape)
+ res)
+ else ;; contains params
+ (push (encode-escaped-encoding
+ (car pe) *reserved-path-characters* escape)
+ res)
+ (dolist (item (cdr pe))
+ (push ";" res)
+ (push (encode-escaped-encoding
+ item *reserved-path-characters* escape)
+ res)))))
+
+(defun render-urn (urn stream
+ &aux (*print-pretty* nil))
+ (when (null (uri-string urn))
+ (setf (uri-string urn)
+ (let ((nid (urn-nid urn))
+ (nss (urn-nss urn)))
+ (concatenate 'string "urn:" nid ":" nss))))
+ (if* stream
+ then (format stream "~a" (uri-string urn))
+ else (uri-string urn)))
+
+(defparameter *escaped-encoding*
+ (vector #\0 #\1 #\2 #\3 #\4 #\5 #\6 #\7 #\8 #\9 #\a #\b #\c #\d #\e #\f))
+
+(defun encode-escaped-encoding (string reserved-chars escape)
+ (when (null escape) (return-from encode-escaped-encoding string))
+ ;; Make a string as big as it possibly needs to be (3 times the original
+ ;; size), and truncate it at the end.
+ (do* ((max (length string))
+ (new-max (* 3 max)) ;; worst case new size
+ (new-string (make-string new-max))
+ (i 0 (1+ i))
+ (new-i -1)
+ c ci)
+ ((= i max)
+ (shrink-vector new-string (incf new-i)))
+ (setq ci (char-int (setq c (char string i))))
+ (if* (or (null reserved-chars)
+ (> ci 127)
+ (= 0 (sbit reserved-chars ci)))
+ then ;; ok as is
+ (incf new-i)
+ (setf (char new-string new-i) c)
+ else ;; need to escape it
+ (multiple-value-bind (q r) (truncate ci 16)
+ (setf (char new-string (incf new-i)) #\%)
+ (setf (char new-string (incf new-i)) (elt *escaped-encoding* q))
+ (setf (char new-string (incf new-i))
+ (elt *escaped-encoding* r))))))
+
+(defmethod print-object ((uri uri) stream)
+ (if* *print-escape*
+ then (format stream "#<~a ~a>" 'uri (render-uri uri nil))
+ else (render-uri uri stream)))
+
+(defmethod print-object ((urn urn) stream)
+ (if* *print-escape*
+ then (format stream "#<~a ~a>" 'uri (render-urn urn nil))
+ else (render-urn urn stream)))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; merging and unmerging
+
+(defmethod merge-uris ((uri string) (base string) &optional place)
+ (merge-uris (parse-uri uri) (parse-uri base) place))
+
+(defmethod merge-uris ((uri uri) (base string) &optional place)
+ (merge-uris uri (parse-uri base) place))
+
+(defmethod merge-uris ((uri string) (base uri) &optional place)
+ (merge-uris (parse-uri uri) base place))
+
+
+(defmethod merge-uris ((uri uri) (base uri) &optional place)
+ ;; See ../doc/rfc2396.txt for info on the algorithm we use to merge
+ ;; URIs.
+ ;;
+ (tagbody
+;;;; step 2
+ (when (and (null (uri-parsed-path uri))
+ (null (uri-scheme uri))
+ (null (uri-host uri))
+ (null (uri-port uri))
+ (null (uri-query uri)))
+ (return-from merge-uris
+ (let ((new (copy-uri base :place place)))
+ (when (uri-query uri)
+ (setf (uri-query new) (uri-query uri)))
+ (when (uri-fragment uri)
+ (setf (uri-fragment new) (uri-fragment uri)))
+ new)))
+
+ (setq uri (copy-uri uri :place place))
+
+;;;; step 3
+ (when (uri-scheme uri)
+ (return-from merge-uris uri))
+ (setf (uri-scheme uri) (uri-scheme base))
+
+;;;; step 4
+ (when (uri-host uri) (go :done))
+ (setf (uri-host uri) (uri-host base))
+ (setf (uri-port uri) (uri-port base))
+
+;;;; step 5
+ (let ((p (uri-parsed-path uri)))
+
+ ;; bug13133:
+ ;; The following form causes our implementation to be at odds with
+ ;; RFC 2396, however this is apparently what was intended by the
+ ;; authors of the RFC. Specifically, (merge-uris "?y" "/foo")
+ ;; should return #<uri /foo?y> instead of #<uri ?y>, according to
+ ;; this:
+;;; http://www.apache.org/~fielding/uri/rev-2002/issues.html#003-relative-query
+ (when (null p)
+ (setf (uri-path uri) (uri-path base))
+ (go :done))
+
+ (when (and p (eq :absolute (car p)))
+ (when (equal '(:absolute "") p)
+ ;; Canonicalize the way parsing does:
+ (setf (uri-path uri) nil))
+ (go :done)))
+
+;;;; step 6
+ (let* ((base-path
+ (or (uri-parsed-path base)
+ ;; needed because we canonicalize away a path of just `/':
+ '(:absolute "")))
+ (path (uri-parsed-path uri))
+ new-path-list)
+ (when (not (eq :absolute (car base-path)))
+ (error "Cannot merge ~a and ~a, since latter is not absolute."
+ uri base))
+
+ ;; steps 6a and 6b:
+ (setq new-path-list
+ (append (butlast base-path)
+ (if* path then (cdr path) else '(""))))
+
+ ;; steps 6c and 6d:
+ (let ((last (last new-path-list)))
+ (if* (atom (car last))
+ then (when (string= "." (car last))
+ (setf (car last) ""))
+ else (when (string= "." (caar last))
+ (setf (caar last) ""))))
+ (setq new-path-list
+ (delete "." new-path-list :test #'(lambda (a b)
+ (if* (atom b)
+ then (string= a b)
+ else nil))))
+
+ ;; steps 6e and 6f:
+ (let ((npl (cdr new-path-list))
+ index tmp fix-tail)
+ (setq fix-tail
+ (string= ".." (let ((l (car (last npl))))
+ (if* (atom l)
+ then l
+ else (car l)))))
+ (loop
+ (setq index
+ (position ".." npl
+ :test #'(lambda (a b)
+ (string= a
+ (if* (atom b)
+ then b
+ else (car b))))))
+ (when (null index) (return))
+ (when (= 0 index)
+ ;; The RFC says, in 6g, "that the implementation may handle
+ ;; this error by retaining these components in the resolved
+ ;; path, by removing them from the resolved path, or by
+ ;; avoiding traversal of the reference." The examples in C.2
+ ;; imply that we should do the first thing (retain them), so
+ ;; that's what we'll do.
+ (return))
+ (if* (= 1 index)
+ then (setq npl (cddr npl))
+ else (setq tmp npl)
+ (dotimes (x (- index 2)) (setq tmp (cdr tmp)))
+ (setf (cdr tmp) (cdddr tmp))))
+ (setf (cdr new-path-list) npl)
+ (when fix-tail (setq new-path-list (nconc new-path-list '("")))))
+
+ ;; step 6g:
+ ;; don't complain if new-path-list starts with `..'. See comment
+ ;; above about this step.
+
+ ;; step 6h:
+ (when (or (equal '(:absolute "") new-path-list)
+ (equal '(:absolute) new-path-list))
+ (setq new-path-list nil))
+ (setf (uri-path uri)
+ (render-parsed-path new-path-list
+ ;; don't know, so have to assume:
+ t)))
+
+;;;; step 7
+ :done
+ (return-from merge-uris uri)))
+
+(defmethod enough-uri ((uri string) (base string) &optional place)
+ (enough-uri (parse-uri uri) (parse-uri base) place))
+
+(defmethod enough-uri ((uri uri) (base string) &optional place)
+ (enough-uri uri (parse-uri base) place))
+
+(defmethod enough-uri ((uri string) (base uri) &optional place)
+ (enough-uri (parse-uri uri) base place))
+
+(defmethod enough-uri ((uri uri) (base uri) &optional place)
+ (let ((new-scheme nil)
+ (new-host nil)
+ (new-port nil)
+ (new-parsed-path nil))
+
+ (when (or (and (uri-scheme uri)
+ (not (equalp (uri-scheme uri) (uri-scheme base))))
+ (and (uri-host uri)
+ (not (equalp (uri-host uri) (uri-host base))))
+ (not (equalp (uri-port uri) (uri-port base))))
+ (return-from enough-uri uri))
+
+ (when (null (uri-host uri))
+ (setq new-host (uri-host base)))
+ (when (null (uri-port uri))
+ (setq new-port (uri-port base)))
+
+ (when (null (uri-scheme uri))
+ (setq new-scheme (uri-scheme base)))
+
+ ;; Now, for the hard one, path.
+ ;; We essentially do here what enough-namestring does.
+ (do* ((base-path (uri-parsed-path base))
+ (path (uri-parsed-path uri))
+ (bp base-path (cdr bp))
+ (p path (cdr p)))
+ ((or (null bp) (null p))
+ ;; If p is nil, that means we have something like
+ ;; (enough-uri "/foo/bar" "/foo/bar/baz.htm"), so
+ ;; new-parsed-path will be nil.
+ (when (null bp)
+ (setq new-parsed-path (copy-list p))
+ (when (not (symbolp (car new-parsed-path)))
+ (push :relative new-parsed-path))))
+ (if* (equal (car bp) (car p))
+ thenret ;; skip it
+ else (setq new-parsed-path (copy-list p))
+ (when (not (symbolp (car new-parsed-path)))
+ (push :relative new-parsed-path))
+ (return)))
+
+ (let ((new-path
+ (when new-parsed-path
+ (render-parsed-path new-parsed-path
+ ;; don't know, so have to assume:
+ t)))
+ (new-query (uri-query uri))
+ (new-fragment (uri-fragment uri))
+ (new-plist (copy-list (uri-plist uri))))
+ (if* (and (null new-scheme)
+ (null new-host)
+ (null new-port)
+ (null new-path)
+ (null new-parsed-path)
+ (null new-query)
+ (null new-fragment))
+ then ;; can't have a completely empty uri!
+ (copy-uri nil
+ :class (class-of uri)
+ :place place
+ :path "/"
+ :plist new-plist)
+ else (copy-uri nil
+ :class (class-of uri)
+ :place place
+ :scheme new-scheme
+ :host new-host
+ :port new-port
+ :path new-path
+ :parsed-path new-parsed-path
+ :query new-query
+ :fragment new-fragment
+ :plist new-plist)))))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; support for interning URIs
+
+(defun make-uri-space (&rest keys &key (size 777) &allow-other-keys)
+ #+allegro
+ (apply #'make-hash-table :size size
+ :hash-function 'uri-hash
+ :test 'uri= :values nil keys)
+ #-allegro
+ (apply #'make-hash-table :size size keys))
+
+(defun gethash-uri (uri table)
+ #+allegro (gethash uri table)
+ #-allegro
+ (let* ((hash (uri-hash uri))
+ (existing (gethash hash table)))
+ (dolist (u existing)
+ (when (uri= u uri)
+ (return-from gethash-uri (values u t))))
+ (values nil nil)))
+
+(defun puthash-uri (uri table)
+ #+allegro (excl:puthash-key uri table)
+ #-allegro
+ (let ((existing (gethash (uri-hash uri) table)))
+ (dolist (u existing)
+ (when (uri= u uri)
+ (return-from puthash-uri u)))
+ (setf (gethash (uri-hash uri) table)
+ (cons uri existing))
+ uri))
+
+
+(defun uri-hash (uri)
+ (if* (uri-hashcode uri)
+ thenret
+ else (setf (uri-hashcode uri)
+ (sxhash
+ #+allegro
+ (render-uri uri nil)
+ #-allegro
+ (string-downcase
+ (render-uri uri nil))))))
+
+(defvar *uris* (make-uri-space))
+
+(defun uri-space () *uris*)
+
+(defun (setf uri-space) (new-val)
+ (setq *uris* new-val))
+
+;; bootstrapping (uri= changed from function to method):
+(when (fboundp 'uri=) (fmakunbound 'uri=))
+
+(defgeneric uri= (uri1 uri2))
+(defmethod uri= ((uri1 uri) (uri2 uri))
+ (when (not (eq (uri-scheme uri1) (uri-scheme uri2)))
+ (return-from uri= nil))
+ ;; RFC2396 says: a URL with an explicit ":port", where the port is
+ ;; the default for the scheme, is the equivalent to one where the
+ ;; port is elided. Hmmmm. This means that this function has to be
+ ;; scheme dependent. Grrrr.
+ (let ((default-port (case (uri-scheme uri1)
+ (:http 80)
+ (:https 443)
+ (:ftp 21)
+ (:telnet 23))))
+ (and (equalp (uri-host uri1) (uri-host uri2))
+ (eql (or (uri-port uri1) default-port)
+ (or (uri-port uri2) default-port))
+ (string= (uri-path uri1) (uri-path uri2))
+ (string= (uri-query uri1) (uri-query uri2))
+ (string= (uri-fragment uri1) (uri-fragment uri2)))))
+
+(defmethod uri= ((urn1 urn) (urn2 urn))
+ (when (not (eq (uri-scheme urn1) (uri-scheme urn2)))
+ (return-from uri= nil))
+ (and (equalp (urn-nid urn1) (urn-nid urn2))
+ (urn-nss-equal (urn-nss urn1) (urn-nss urn2))))
+
+(defun urn-nss-equal (nss1 nss2 &aux len)
+ ;; Return t iff the nss values are the same.
+ ;; %2c and %2C are equivalent.
+ (when (or (null nss1) (null nss2)
+ (not (= (setq len (length nss1))
+ (length nss2))))
+ (return-from urn-nss-equal nil))
+ (do* ((i 0 (1+ i))
+ (state :char)
+ c1 c2)
+ ((= i len) t)
+ (setq c1 (char nss1 i))
+ (setq c2 (char nss2 i))
+ (ecase state
+ (:char
+ (if* (and (char= #\% c1) (char= #\% c2))
+ then (setq state :percent+1)
+ elseif (char/= c1 c2)
+ then (return nil)))
+ (:percent+1
+ (when (char-not-equal c1 c2) (return nil))
+ (setq state :percent+2))
+ (:percent+2
+ (when (char-not-equal c1 c2) (return nil))
+ (setq state :char)))))
+
+(defmethod intern-uri ((xuri uri) &optional (uri-space *uris*))
+ (let ((uri (gethash-uri xuri uri-space)))
+ (if* uri
+ thenret
+ else (puthash-uri xuri uri-space))))
+
+(defmethod intern-uri ((uri string) &optional (uri-space *uris*))
+ (intern-uri (parse-uri uri) uri-space))
+
+(defun unintern-uri (uri &optional (uri-space *uris*))
+ (if* (eq t uri)
+ then (clrhash uri-space)
+ elseif (uri-p uri)
+ then (remhash uri uri-space)
+ else (error "bad uri: ~s." uri)))
+
+(defmacro do-all-uris ((var &optional uri-space result-form)
+ &rest forms
+ &environment env)
+ "do-all-uris (var [[uri-space] result-form])
+ {declaration}* {tag | statement}*
+Executes the forms once for each uri with var bound to the current uri"
+ (let ((f (gensym))
+ (g-ignore (gensym))
+ (g-uri-space (gensym))
+ (body (third (parse-body forms env))))
+ `(let ((,g-uri-space (or ,uri-space *uris*)))
+ (prog nil
+ (flet ((,f (,var &optional ,g-ignore)
+ (declare (ignore-if-unused ,var ,g-ignore))
+ (tagbody ,@body)))
+ (maphash #',f ,g-uri-space))
+ (return ,result-form)))))
+
+(defun sharp-u (stream chr arg)
+ (declare (ignore chr arg))
+ (let ((arg (read stream nil nil t)))
+ (if *read-suppress*
+ nil
+ (if* (stringp arg)
+ then (parse-uri arg)
+ else
+
+ (internal-reader-error
+ stream
+ "#u takes a string or list argument: ~s" arg)))))
+
+
+#+allegro
+excl::
+#+allegro
+(locally (declare (special std-lisp-readtable))
+ (let ((*readtable* std-lisp-readtable))
+ (set-dispatch-macro-character #\# #\u #'puri::sharp-u)))
+#-allegro
+(set-dispatch-macro-character #\# #\u #'puri::sharp-u)
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(provide :uri)
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; timings
+;; (don't run under emacs with M-x fi:common-lisp)
+
+#+allegro
+(eval-when (:compile-toplevel :load-toplevel :execute)
+ (import 'excl::gc))
+
+#-allegro
+(defun gc (&rest options)
+ (declare (ignore options))
+ #+sbcl (sb-ext::gc)
+ #+cmu (ext::gc)
+ )
+
+(defun time-uri-module ()
+ (declare (optimize (speed 3) (safety 0) (debug 0)))
+ (let ((uri "http://www.franz.com/a/b;x;y;z/c/foo?bar=baz&xxx#foo")
+ (uri2 "http://www.franz.com/a/b;x;y;z/c/%2ffoo?bar=baz&xxx#foo"))
+ (gc t) (gc :tenure) (gc :tenure) (gc :tenure)
+ (format t "~&;;; starting timing testing 1...~%")
+ (time (dotimes (i 100000) (parse-uri uri)))
+
+ (gc t) (gc :tenure) (gc :tenure) (gc :tenure)
+ (format t "~&;;; starting timing testing 2...~%")
+ (let ((uri (parse-uri uri)))
+ (time (dotimes (i 100000)
+ ;; forces no caching of the printed representation:
+ (setf (uri-string uri) nil)
+ (format nil "~a" uri))))
+
+ (gc t) (gc :tenure) (gc :tenure) (gc :tenure)
+ (format t "~&;;; starting timing testing 3...~%")
+ (time
+ (progn
+ (dotimes (i 100000) (parse-uri uri2))
+ (let ((uri (parse-uri uri)))
+ (dotimes (i 100000)
+ ;; forces no caching of the printed representation:
+ (setf (uri-string uri) nil)
+ (format nil "~a" uri)))))))
+
+;;******** reference output (ultra, modified 5.0.1):
+;;; starting timing testing 1...
+; cpu time (non-gc) 13,710 msec user, 0 msec system
+; cpu time (gc) 600 msec user, 10 msec system
+; cpu time (total) 14,310 msec user, 10 msec system
+; real time 14,465 msec
+; space allocation:
+; 1,804,261 cons cells, 7 symbols, 41,628,832 other bytes, 0 static bytes
+;;; starting timing testing 2...
+; cpu time (non-gc) 27,500 msec user, 0 msec system
+; cpu time (gc) 280 msec user, 20 msec system
+; cpu time (total) 27,780 msec user, 20 msec system
+; real time 27,897 msec
+; space allocation:
+; 1,900,463 cons cells, 0 symbols, 17,693,712 other bytes, 0 static bytes
+;;; starting timing testing 3...
+; cpu time (non-gc) 52,290 msec user, 10 msec system
+; cpu time (gc) 1,290 msec user, 30 msec system
+; cpu time (total) 53,580 msec user, 40 msec system
+; real time 54,062 msec
+; space allocation:
+; 7,800,205 cons cells, 0 symbols, 81,697,496 other bytes, 0 static bytes
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; after improving decode-escaped-encoding/encode-escaped-encoding:
+
+;;; starting timing testing 1...
+; cpu time (non-gc) 14,520 msec user, 0 msec system
+; cpu time (gc) 400 msec user, 0 msec system
+; cpu time (total) 14,920 msec user, 0 msec system
+; real time 15,082 msec
+; space allocation:
+; 1,800,270 cons cells, 0 symbols, 41,600,160 other bytes, 0 static bytes
+;;; starting timing testing 2...
+; cpu time (non-gc) 27,490 msec user, 10 msec system
+; cpu time (gc) 300 msec user, 0 msec system
+; cpu time (total) 27,790 msec user, 10 msec system
+; real time 28,025 msec
+; space allocation:
+; 1,900,436 cons cells, 0 symbols, 17,693,712 other bytes, 0 static bytes
+;;; starting timing testing 3...
+; cpu time (non-gc) 47,900 msec user, 20 msec system
+; cpu time (gc) 920 msec user, 10 msec system
+; cpu time (total) 48,820 msec user, 30 msec system
+; real time 49,188 msec
+; space allocation:
+; 3,700,215 cons cells, 0 symbols, 81,707,144 other bytes, 0 static bytes
Added: branches/grin-neu/thirdparty/puri/tests.lisp
===================================================================
--- branches/grin-neu/thirdparty/puri/tests.lisp 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/puri/tests.lisp 2006-12-01 10:39:49 UTC (rev 2094)
@@ -0,0 +1,419 @@
+;;;; -*- Mode: LISP; Syntax: ANSI-Common-Lisp; Base: 10 -*-
+;; copyright (c) 1999-2001 Franz Inc, Berkeley, CA - All rights reserved.
+;; copyright (c) 2003 Kevin Rosenberg (significant fixes for using
+;; tester package)
+;;
+;; The software, data and information contained herein are proprietary
+;; to, and comprise valuable trade secrets of, Franz, Inc. They are
+;; given in confidence by Franz, Inc. pursuant to a written license
+;; agreement, and may be stored and used only in accordance with the terms
+;; of such license.
+;;
+;; Restricted Rights Legend
+;; ------------------------
+;; Use, duplication, and disclosure of the software, data and information
+;; contained herein by any agency, department or entity of the U.S.
+;; Government are subject to restrictions of Restricted Rights for
+;; Commercial Software developed at private expense as specified in
+;; DOD FAR Supplement 52.227-7013 (c) (1) (ii), as applicable.
+;;
+;; Original version from ACL 6.1:
+;; t-uri.cl,v 1.3.6.3.2.1 2001/08/09 17:42:43 layer
+;;
+;; $Id: tests.lisp 11031 2006-08-15 00:59:34Z kevin $
+
+
+(defpackage #:puri-tests (:use #:puri #:cl #:ptester))
+(in-package #:puri-tests)
+
+(unintern-uri t)
+
+(defmacro gen-test-forms ()
+ (let ((res '())
+ (base-uri "http://a/b/c/d;p?q"))
+
+ (dolist (x `(;; (relative-uri result base-uri compare-function)
+;;;; RFC Appendix C.1 (normal examples)
+ ("g:h" "g:h" ,base-uri)
+ ("g" "http://a/b/c/g" ,base-uri)
+ ("./g" "http://a/b/c/g" ,base-uri)
+ ("g/" "http://a/b/c/g/" ,base-uri)
+ ("/g" "http://a/g" ,base-uri)
+ ("//g" "http://g" ,base-uri)
+ ;; Following was changed from appendix C of RFC 2396
+ ;; http://www.apache.org/~fielding/uri/rev-2002/issues.html#003-relative-query
+ #-ignore ("?y" "http://a/b/c/d;p?y" ,base-uri)
+ #+ignore ("?y" "http://a/b/c/?y" ,base-uri)
+ ("g?y" "http://a/b/c/g?y" ,base-uri)
+ ("#s" "http://a/b/c/d;p?q#s" ,base-uri)
+ ("g#s" "http://a/b/c/g#s" ,base-uri)
+ ("g?y#s" "http://a/b/c/g?y#s" ,base-uri)
+ (";x" "http://a/b/c/;x" ,base-uri)
+ ("g;x" "http://a/b/c/g;x" ,base-uri)
+ ("g;x?y#s" "http://a/b/c/g;x?y#s" ,base-uri)
+ ("." "http://a/b/c/" ,base-uri)
+ ("./" "http://a/b/c/" ,base-uri)
+ (".." "http://a/b/" ,base-uri)
+ ("../" "http://a/b/" ,base-uri)
+ ("../g" "http://a/b/g" ,base-uri)
+ ("../.." "http://a/" ,base-uri)
+ ("../../" "http://a/" ,base-uri)
+ ("../../g" "http://a/g" ,base-uri)
+;;;; RFC Appendix C.2 (abnormal examples)
+ ("" "http://a/b/c/d;p?q" ,base-uri)
+ ("../../../g" "http://a/../g" ,base-uri)
+ ("../../../../g" "http://a/../../g" ,base-uri)
+ ("/./g" "http://a/./g" ,base-uri)
+ ("/../g" "http://a/../g" ,base-uri)
+ ("g." "http://a/b/c/g." ,base-uri)
+ (".g" "http://a/b/c/.g" ,base-uri)
+ ("g.." "http://a/b/c/g.." ,base-uri)
+ ("..g" "http://a/b/c/..g" ,base-uri)
+ ("./../g" "http://a/b/g" ,base-uri)
+ ("./g/." "http://a/b/c/g/" ,base-uri)
+ ("g/./h" "http://a/b/c/g/h" ,base-uri)
+ ("g/../h" "http://a/b/c/h" ,base-uri)
+ ("g;x=1/./y" "http://a/b/c/g;x=1/y" ,base-uri)
+ ("g;x=1/../y" "http://a/b/c/y" ,base-uri)
+ ("g?y/./x" "http://a/b/c/g?y/./x" ,base-uri)
+ ("g?y/../x" "http://a/b/c/g?y/../x" ,base-uri)
+ ("g#s/./x" "http://a/b/c/g#s/./x" ,base-uri)
+ ("g#s/../x" "http://a/b/c/g#s/../x" ,base-uri)
+ ("http:g" "http:g" ,base-uri)
+
+ ("foo/bar/baz.htm#foo"
+ "http://a/b/foo/bar/baz.htm#foo"
+ "http://a/b/c.htm")
+ ("foo/bar/baz.htm#foo"
+ "http://a/b/foo/bar/baz.htm#foo"
+ "http://a/b/")
+ ("foo/bar/baz.htm#foo"
+ "http://a/foo/bar/baz.htm#foo"
+ "http://a/b")
+ ("foo/bar;x;y/bam.htm"
+ "http://a/b/c/foo/bar;x;y/bam.htm"
+ "http://a/b/c/")))
+ (push `(test (intern-uri ,(second x))
+ (intern-uri (merge-uris (intern-uri ,(first x))
+ (intern-uri ,(third x))))
+ :test 'uri=)
+ res))
+
+;;;; intern tests
+ (dolist (x '(;; default port and specifying the default port are
+ ;; supposed to compare the same:
+ ("http://www.franz.com:80" "http://www.franz.com")
+ ("http://www.franz.com:80" "http://www.franz.com" eq)
+ ;; make sure they're `eq':
+ ("http://www.franz.com:80" "http://www.franz.com" eq)
+ ("http://www.franz.com" "http://www.franz.com" eq)
+ ("http://www.franz.com/foo" "http://www.franz.com/foo" eq)
+ ("http://www.franz.com/foo?bar"
+ "http://www.franz.com/foo?bar" eq)
+ ("http://www.franz.com/foo?bar#baz"
+ "http://www.franz.com/foo?bar#baz" eq)
+ ("http://WWW.FRANZ.COM" "http://www.franz.com" eq)
+ ("http://www.FRANZ.com" "http://www.franz.com" eq)
+ ("http://www.franz.com" "http://www.franz.com/" eq)
+ (;; %72 is "r", %2f is "/", %3b is ";"
+ "http://www.franz.com/ba%72%2f%3b;x;y;z/baz/"
+ "http://www.franz.com/bar%2f%3b;x;y;z/baz/" eq)))
+ (push `(test (intern-uri ,(second x))
+ (intern-uri ,(first x))
+ :test ',(if (third x)
+ (third x)
+ 'uri=))
+ res))
+
+;;;; parsing and equivalence tests
+ (push `(test
+ (parse-uri "http://foo+bar?baz=b%26lob+bof")
+ (parse-uri (parse-uri "http://foo+bar?baz=b%26lob+bof"))
+ :test 'uri=)
+ res)
+ (push '(test
+ (parse-uri "http://www.foo.com")
+ (parse-uri (parse-uri "http://www.foo.com?")) ; allow ? at end
+ :test 'uri=)
+ res)
+ (push `(test
+ "baz=b%26lob+bof"
+ (uri-query (parse-uri "http://foo+bar?baz=b%26lob+bof"))
+ :test 'string=)
+ res)
+ (push `(test
+ "baz=b%26lob+bof%3d"
+ (uri-query (parse-uri "http://foo+bar?baz=b%26lob+bof%3d"))
+ :test 'string=)
+ res)
+ (push
+ `(test (parse-uri "xxx?%41") (parse-uri "xxx?A") :test 'uri=)
+ res)
+ (push
+ `(test "A" (uri-query (parse-uri "xxx?%41")) :test 'string=)
+ res)
+
+ (push `(test-error (parse-uri " ")
+ :condition-type 'uri-parse-error)
+ res)
+ (push `(test-error (parse-uri "foo ")
+ :condition-type 'uri-parse-error)
+ res)
+ (push `(test-error (parse-uri " foo ")
+ :condition-type 'uri-parse-error)
+ res)
+ (push `(test-error (parse-uri "<foo")
+ :condition-type 'uri-parse-error)
+ res)
+ (push `(test-error (parse-uri "foo>")
+ :condition-type 'uri-parse-error)
+ res)
+ (push `(test-error (parse-uri "<foo>")
+ :condition-type 'uri-parse-error)
+ res)
+ (push `(test-error (parse-uri "%")
+ :condition-type 'uri-parse-error)
+ res)
+ (push `(test-error (parse-uri "foo%xyr")
+ :condition-type 'uri-parse-error)
+ res)
+ (push `(test-error (parse-uri "\"foo\"")
+ :condition-type 'uri-parse-error)
+ res)
+ (push `(test "%20" (format nil "~a" (parse-uri "%20"))
+ :test 'string=)
+ res)
+ (push `(test "&" (format nil "~a" (parse-uri "%26"))
+ :test 'string=)
+ res)
+ (push
+ `(test "foo%23bar" (format nil "~a" (parse-uri "foo%23bar"))
+ :test 'string=)
+ res)
+ (push
+ `(test "foo%23bar#foobar"
+ (format nil "~a" (parse-uri "foo%23bar#foobar"))
+ :test 'string=)
+ res)
+ (push
+ `(test "foo%23bar#foobar#baz"
+ (format nil "~a" (parse-uri "foo%23bar#foobar#baz"))
+ :test 'string=)
+ res)
+ (push
+ `(test "foo%23bar#foobar#baz"
+ (format nil "~a" (parse-uri "foo%23bar#foobar%23baz"))
+ :test 'string=)
+ res)
+ (push
+ `(test "foo%23bar#foobar/baz"
+ (format nil "~a" (parse-uri "foo%23bar#foobar%2fbaz"))
+ :test 'string=)
+ res)
+ (push `(test-error (parse-uri "foobar??")
+ :condition-type 'uri-parse-error)
+ res)
+ (push `(test-error (parse-uri "foobar?foo?")
+ :condition-type 'uri-parse-error)
+ res)
+ (push `(test "foobar?%3f"
+ (format nil "~a" (parse-uri "foobar?%3f"))
+ :test 'string=)
+ res)
+ (push `(test
+ "http://foo/bAr;3/baz?baf=3"
+ (format nil "~a" (parse-uri "http://foo/b%41r;3/baz?baf=3"))
+ :test 'string=)
+ res)
+ (push `(test
+ '(:absolute ("/bAr" "3") "baz")
+ (uri-parsed-path (parse-uri "http://foo/%2fb%41r;3/baz?baf=3"))
+ :test 'equal)
+ res)
+ (push `(test
+ "/%2fbAr;3/baz"
+ (let ((u (parse-uri "http://foo/%2fb%41r;3/baz?baf=3")))
+ (setf (uri-parsed-path u) '(:absolute ("/bAr" "3") "baz"))
+ (uri-path u))
+ :test 'string=)
+ res)
+ (push `(test
+ "http://www.verada.com:8010/kapow?name=foo%3Dbar%25"
+ (format nil "~a"
+ (parse-uri
+ "http://www.verada.com:8010/kapow?name=foo%3Dbar%25"))
+ :test 'string=)
+ res)
+ (push `(test
+ "ftp://parcftp.xerox.com/pub/pcl/mop/"
+ (format nil "~a"
+ (parse-uri "ftp://parcftp.xerox.com:/pub/pcl/mop/"))
+ :test 'string=)
+ res)
+
+;;;; enough-uri tests
+ (dolist (x `(("http://www.franz.com/foo/bar/baz.htm"
+ "http://www.franz.com/foo/bar/"
+ "baz.htm")
+ ("http://www.franz.com/foo/bar/baz.htm"
+ "http://www.franz.com/foo/bar"
+ "baz.htm")
+ ("http://www.franz.com:80/foo/bar/baz.htm"
+ "http://www.franz.com:80/foo/bar"
+ "baz.htm")
+ ("http:/foo/bar/baz.htm" "http:/foo/bar" "baz.htm")
+ ("http:/foo/bar/baz.htm" "http:/foo/bar/" "baz.htm")
+ ("/foo/bar/baz.htm" "/foo/bar" "baz.htm")
+ ("/foo/bar/baz.htm" "/foo/bar/" "baz.htm")
+ ("/foo/bar/baz.htm#foo" "/foo/bar/" "baz.htm#foo")
+ ("/foo/bar/baz.htm?bar#foo" "/foo/bar/" "baz.htm?bar#foo")
+
+ ("http://www.dnai.com/~layer/foo.htm"
+ "http://www.known.net"
+ "http://www.dnai.com/~layer/foo.htm")
+ ("http://www.dnai.com/~layer/foo.htm"
+ "http://www.dnai.com:8000/~layer/"
+ "http://www.dnai.com/~layer/foo.htm")
+ ("http://www.dnai.com:8000/~layer/foo.htm"
+ "http://www.dnai.com/~layer/"
+ "http://www.dnai.com:8000/~layer/foo.htm")
+ ("http://www.franz.com"
+ "http://www.franz.com"
+ "/")))
+ (push `(test (parse-uri ,(third x))
+ (enough-uri (parse-uri ,(first x))
+ (parse-uri ,(second x)))
+ :test 'uri=)
+ res))
+
+;;;; urn tests, ideas of which are from rfc2141
+ (let ((urn "urn:com:foo-the-bar"))
+ (push `(test "com" (urn-nid (parse-uri ,urn))
+ :test #'string=)
+ res)
+ (push `(test "foo-the-bar" (urn-nss (parse-uri ,urn))
+ :test #'string=)
+ res))
+ (push `(test-error (parse-uri "urn:")
+ :condition-type 'uri-parse-error)
+ res)
+ (push `(test-error (parse-uri "urn:foo")
+ :condition-type 'uri-parse-error)
+ res)
+ (push `(test-error (parse-uri "urn:foo$")
+ :condition-type 'uri-parse-error)
+ res)
+ (push `(test-error (parse-uri "urn:foo_")
+ :condition-type 'uri-parse-error)
+ res)
+ (push `(test-error (parse-uri "urn:foo:foo&bar")
+ :condition-type 'uri-parse-error)
+ res)
+ (push `(test (parse-uri "URN:foo:a123,456")
+ (parse-uri "urn:foo:a123,456")
+ :test #'uri=)
+ res)
+ (push `(test (parse-uri "URN:foo:a123,456")
+ (parse-uri "urn:FOO:a123,456")
+ :test #'uri=)
+ res)
+ (push `(test (parse-uri "urn:foo:a123,456")
+ (parse-uri "urn:FOO:a123,456")
+ :test #'uri=)
+ res)
+ (push `(test (parse-uri "URN:FOO:a123%2c456")
+ (parse-uri "urn:foo:a123%2C456")
+ :test #'uri=)
+ res)
+ (push `(test
+ nil
+ (uri= (parse-uri "urn:foo:A123,456")
+ (parse-uri "urn:FOO:a123,456")))
+ res)
+ (push `(test
+ nil
+ (uri= (parse-uri "urn:foo:A123,456")
+ (parse-uri "urn:foo:a123,456")))
+ res)
+ (push `(test
+ nil
+ (uri= (parse-uri "urn:foo:A123,456")
+ (parse-uri "URN:foo:a123,456")))
+ res)
+ (push `(test
+ nil
+ (uri= (parse-uri "urn:foo:a123%2C456")
+ (parse-uri "urn:FOO:a123,456")))
+ res)
+ (push `(test
+ nil
+ (uri= (parse-uri "urn:foo:a123%2C456")
+ (parse-uri "urn:foo:a123,456")))
+ res)
+ (push `(test
+ nil
+ (uri= (parse-uri "URN:FOO:a123%2c456")
+ (parse-uri "urn:foo:a123,456")))
+ res)
+ (push `(test
+ nil
+ (uri= (parse-uri "urn:FOO:a123%2c456")
+ (parse-uri "urn:foo:a123,456")))
+ res)
+ (push `(test
+ nil
+ (uri= (parse-uri "urn:foo:a123%2c456")
+ (parse-uri "urn:foo:a123,456")))
+ res)
+
+ (push `(test t
+ (uri= (parse-uri "foo") (parse-uri "foo#")))
+ res)
+
+ (push
+ '(let ((puri::*strict-parse* nil))
+ (test-no-error
+ (puri:parse-uri
+ "http://foo.com/bar?a=zip|zop")))
+ res)
+ (push
+ '(test-error
+ (puri:parse-uri "http://foo.com/bar?a=zip|zop")
+ :condition-type 'uri-parse-error)
+ res)
+
+ (push
+ '(let ((puri::*strict-parse* nil))
+ (test-no-error
+ (puri:parse-uri
+ "http://arc3.msn.com/ADSAdClient31.dll?GetAd?PG=NBCSBU?SC=D2?AN=1.0586041")))
+ res)
+ (push
+ '(test-error
+ (puri:parse-uri
+ "http://arc3.msn.com/ADSAdClient31.dll?GetAd?PG=NBCSBU?SC=D2?AN=1.0586041")
+ :condition-type 'uri-parse-error)
+ res)
+
+ (push
+ '(let ((puri::*strict-parse* nil))
+ (test-no-error
+ (puri:parse-uri
+ "http://scbc.booksonline.com/cgi-bin/ndCGI.exe/Develop/pagClubHome.hrfTIOLI_…")))
+ res)
+ (push
+ '(test-error
+ (puri:parse-uri
+ "http://scbc.booksonline.com/cgi-bin/ndCGI.exe/Develop/pagClubHome.hrfTIOLI_…")
+ :condition-type 'uri-parse-error)
+ res)
+
+ `(progn ,@(nreverse res))))
+
+(defun do-tests ()
+ (let ((*break-on-test-failures* t))
+ (with-tests (:name "puri")
+ (gen-test-forms)))
+ t)
+
+
Added: branches/grin-neu/thirdparty/puri/uri.html
===================================================================
--- branches/grin-neu/thirdparty/puri/uri.html 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/puri/uri.html 2006-12-01 10:39:49 UTC (rev 2094)
@@ -0,0 +1,406 @@
+<html>
+
+<head>
+<title>URI support in Allegro CL</title>
+</head>
+
+<body>
+
+<h1>URI support in Allegro CL</h1>
+
+<p>This document contains the following sections:</p>
+<p><a href="#uri-intro-1">1.0 Introduction</a><br>
+<a href="#uri-api-1">2.0 The URI API definition</a><br>
+<a href="#parsing-decoding-1">3.0 Parsing, escape decoding/encoding and the path</a><br>
+<a href="#interning-uris-1">4.0 Interning URIs</a><br>
+<a href="#acl-implementation-1">5.0 Allegro CL implementation notes</a><br>
+<a href="#examples-1">6.0 Examples</a><br>
+</p>
+
+<p>This version of the Allegro CL URI support documentation is for distribution with the
+Open Source version of the URI code. Links to Allegro CL documentation other than
+URI-specific files have been supressed. To see Allegro CL documentation, see <a
+href="http://www.franz.com/support/documentation/">http://www.franz.com/support/documentation/</a>,
+which is the Allegro CL documentation page of the franz inc. website. Links to Allegro CL
+documentation can be found on that page. </p>
+
+<hr>
+
+<hr>
+
+<h2><a name="uri-intro-1">1.0 Introduction</a></h2>
+
+<p><em>URI</em> stands for <em>Universal Resource Identifier</em>. For a description of
+URIs, see RFC2396, which can be found in several places, including the IETF web site (<a
+href="http://www.ietf.org/rfc/rfc2396.txt">http://www.ietf.org/rfc/rfc2396.txt</a>) and
+the UCI/ICS web site (<a href="http://www.ics.uci.edu/pub/ietf/uri/rfc2396.txt">http://www.ics.uci.edu/pub/ietf/uri/rfc2396.txt</a>).
+We prefer the UCI/ICS one as it has more examples. </p>
+
+<p>URIs are a superset in functionality and syntax to URLs (Universal Resource Locators)
+and URNs (Universal Resource Names). That is, RFC2396 updates and merges RFC1738 and
+RFC1808 into a single syntax, called the URI. It does exclude some portions of RFC1738
+that define specific syntax of individual URL schemes. </p>
+
+<p>In URL slang, the <em>scheme</em> is usually called the `protocol', but it is called
+scheme in RFC1738. A URL `host' corresponds to the URI `authority.' The URL slang
+`bookmark' or `anchor' is `fragment' in URI lingo. </p>
+
+<p>The URI facility was available as a patch to Allegro CL 5.0.1 and is included with
+release 6.0. the URI facility might not be in an Allegro CL image. Evaluate <code>(require
+:uri)</code> to ensure the facility is loaded (that form returns <code>nil</code> if the
+URI module is already loaded). </p>
+
+<p>Broadly, the URI facility creates a Lisp object that represents a URI, and provides
+setters and accessors to fields in the URI object. The URI object can also be interned,
+much like symbols in CL are. This document describes the facility and the related
+operators. </p>
+
+<p>Aside from the obvious slots which are called out in the RFC, URIs also have a property
+list. With interning, this is another similarity between URIs and CL symbols. </p>
+
+<hr>
+
+<hr>
+
+<h2><a name="uri-api-1">2.0 The URI API definition</a></h2>
+
+<p>Symbols naming objects (functions, variables, etc.) in the <em>uri</em> module are
+exported from the <code>net.uri</code> package. </p>
+
+<p>URIs are represented by CLOS objects. Their slots are: </p>
+
+<pre>
+scheme
+host
+port
+path
+query
+fragment
+plist
+</pre>
+
+<p>The <code>host</code> and <code>port</code> slots together correspond to the <code>authority</code>
+(see RFC2396). There is an accessor-like function, <a href="operators/uri-authority.htm"><b>uri-authority</b></a>,
+that can be used to extract the authority from a URI. See the RFC2396 specifications
+pointed to at the beginning of the <a href="#uri-intro-1">1.0 Introduction</a> for details
+of all the slots except <code>plist</code>. The <code>plist</code> slot contains a
+standard Common Lisp property list. </p>
+
+<p>All symbols are external in the <code>net.uri</code> package, unless otherwise noted.
+Brief descriptions are given in this document, with complete descriptions in the
+individual pages.
+
+<ul>
+ <li><a href="classes/uri.htm"><code>uri</code></a>: the class of URI objects. </li>
+ <li><a href="classes/urn.htm"><code>urn</code></a>: the class of URN objects. </li>
+ <li><a href="operators/uri-p.htm"><b>uri-p</b></a> <p><b>Arguments: </b><i>object</i></p>
+ <p>Returns true if <i>object</i> is an instance of class <a href="classes/uri.htm"><code>uri</code></a>.
+ </p>
+ </li>
+ <li><a href="operators/copy-uri.htm"><b>copy-uri</b></a> <p><b>Arguments: </b><i>uri </i>&key
+ <i>place scheme host port path query fragment plist </i></p>
+ <p>Copies the specified URI object. See the description page for information on the
+ keyword arguments. </p>
+ </li>
+ <li><a href="operators/uri-scheme.htm"><b>uri-scheme</b></a><br>
+ <a href="operators/uri-host.htm"><b>uri-host</b></a><br>
+ <a href="operators/uri-port.htm"><b>uri-port</b></a><br>
+ <a href="operators/uri-path.htm"><b>uri-path</b></a><br>
+ <a href="operators/uri-query.htm"><b>uri-query</b></a><br>
+ <a href="operators/uri-fragment.htm"><b>uri-fragment</b></a><br>
+ <a href="operators/uri-plist.htm"><b>uri-plist</b></a><br>
+ <p><b>Arguments: </b><i>uri-object </i></p>
+ <p>These accessors return the value of the associated slots of the <i>uri-object</i> </p>
+ </li>
+ <li><a href="operators/uri-authority.htm"><b>uri-authority</b></a> <p><b>Arguments: </b><i>uri-object
+ </i></p>
+ <p>Returns the authority of <i>uri-object</i>. The authority combines the host and port. </p>
+ </li>
+ <li><a href="operators/render-uri.htm"><b>render-uri</b></a> <p><b>Arguments: </b><i>uri
+ stream </i></p>
+ <p>Print to <i>stream</i> the printed representation of <i>uri</i>. </p>
+ </li>
+ <li><a href="operators/parse-uri.htm"><b>parse-uri</b></a> <p><b>Arguments: </b><i>string </i>&key
+ (<i>class</i> 'uri)<i> </i></p>
+ <p>Parse <i>string</i> into a URI object. </p>
+ </li>
+ <li><a href="operators/merge-uris.htm"><b>merge-uris</b></a> <p><b>Arguments: </b><i>uri
+ base-uri </i>&optional <i>place </i></p>
+ <p>Return an absolute URI, based on <i>uri</i>, which can be relative, and <i>base-uri</i>
+ which must be absolute. </p>
+ </li>
+ <li><a href="operators/enough-uri.htm"><b>enough-uri</b></a> <p><b>Arguments: </b><i>uri
+ base </i></p>
+ <p>Converts <i>uri</i> into a relative URI using <i>base</i> as the base URI. </p>
+ </li>
+ <li><a href="operators/uri-parsed-path.htm"><b>uri-parsed-path</b></a> <p><b>Arguments: </b><i>uri
+ </i></p>
+ <p>Return the parsed representation of the path. </p>
+ </li>
+ <li><a href="operators/uri.htm"><b>uri</b></a> <p><b>Arguments: </b><i>object </i></p>
+ <p>Defined methods: if argument is a uri object, return it; create a uri object if
+ possible and return it, or error if not possible. </p>
+ </li>
+</ul>
+
+<hr>
+
+<hr>
+
+<h2><a name="parsing-decoding-1">3.0 Parsing, escape decoding/encoding and the path</a></h2>
+
+<p>The method <a href="operators/uri-path.htm"><b>uri-path</b></a> returns the path
+portion of the URI, in string form. The method <a href="operators/uri-parsed-path.htm"><b>uri-parsed-path</b></a>
+returns the path portion of the URI, in list form. This list form is discussed below,
+after a discussion of decoding/encoding. </p>
+
+<p>RFC2396 lays out a method for inserting into URIs <em>reserved characters</em>. You do
+this by escaping the character. An <em>escaped</em> character is defined like this: </p>
+
+<pre>
+escaped = "%" hex hex
+
+hex = digit | "A" | "B" | "C" | "D" | "E" | "F" | "a" | "b" | "c" | "d" | "e" | "f"
+</pre>
+
+<p>In addition, the RFC defines excluded characters: </p>
+
+<pre>
+"<" | ">" | "#" | "%" | <"> | "{" | "}" | "|" | "\" | "^" | "[" | "]" | "`"
+</pre>
+
+<p>The set of reserved characters are: </p>
+
+<pre>
+";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | ","
+</pre>
+
+<p>with the following exceptions:
+
+<ul>
+ <li>within the authority component, the characters ";", ":",
+ "@", "?", and "/" are reserved. </li>
+ <li>within a path segment, the characters "/", ";", "=", and
+ "?" are reserved. </li>
+ <li>within a query component, the characters ";", "/", "?",
+ ":", "@", "&", "=", "+",
+ ",", and "$" are reserved. </li>
+</ul>
+
+<p>From the RFC, there are two important rules about escaping and unescaping (encoding and
+decoding):
+
+<ul>
+ <li>decoding should only happen when the URI is parsed into component parts;</li>
+ <li>encoding can only occur when a URI is made from component parts (ie, rendered for
+ printing). </li>
+</ul>
+
+<p>The implication of this is that to decode the URI, it must be in a parsed state. That
+is, you can't convert <font face="Courier New">%2f</font> (the escaped form of
+"/") until the path has been parsed into its component parts. Another important
+desire is for the application viewing the component parts to see the decoded values of the
+components. For example, consider: </p>
+
+<pre>
+http://www.franz.com/calculator/3%2f2
+</pre>
+
+<p>This might be the implementation of a calculator, and how someone would execute 3/2.
+Clearly, the application that implements this would want to see path components of
+"calculator" and "3/2". "3%2f2" would not be useful to the
+calculator application. </p>
+
+<p>For the reasons given above, a parsed version of the path is available and has the
+following form: </p>
+
+<pre>
+([:absolute | :relative] component1 [component2...])
+</pre>
+
+<p>where components are: </p>
+
+<pre>
+element | (element param1 [param2 ...])
+</pre>
+
+<p>and <em>element</em> is a path element, and the param's are path element parameters.
+For example, the result of </p>
+
+<pre>
+(uri-parsed-path (parse-uri "foo;10/bar:x;y;z/baz.htm"))
+</pre>
+
+<p>is </p>
+
+<pre>
+(:relative ("foo" "10") ("bar:x" "y" "z") "baz.htm")
+</pre>
+
+<p>There is a certain amount of canonicalization that occurs when parsing:
+
+<ul>
+ <li>A path of <code>(:absolute)</code> or <code>(:absolute "")</code> is
+ equivalent to a <code>nil</code> path. That is, <code>http://a/</code> is parsed with a <code>nil</code>
+ path and printed as <code>http://a</code>. </li>
+ <li>Escaped characters that are not reserved are not escaped upon printing. For example, <code>"foob%61r"</code>
+ is parsed into <code>"foobar"</code> and appears as <code>"foobar"</code>
+ when the URI is printed. </li>
+</ul>
+
+<hr>
+
+<hr>
+
+<h2><a name="interning-uris-1">4.0 Interning URIs</a></h2>
+
+<p>This section describes how to intern URIs. Interning is not mandatory. URIs can be used
+perfectly well without interning them. </p>
+
+<p>Interned URIs in Allegro are like symbols. That is, a string representing a URI, when
+parsed and interned, will always yield an <strong>eq</strong> object. For example: </p>
+
+<pre>
+(eq (intern-uri "http://www.franz.com")
+ (intern-uri "http://www.franz.com"))
+</pre>
+
+<p>is always true. (Two strings with identical contents may or may not be <strong>eq</strong>
+in Common Lisp, note.) </p>
+
+<p>The functions associated with interning are:
+
+<ul>
+ <li><a href="operators/make-uri-space.htm"><b>make-uri-space</b></a> <p><b>Arguments: </b>&key
+ <i>size </i></p>
+ <p>Make a new hash-table object to contain interned URIs. </p>
+ </li>
+ <li><a href="operators/uri-space.htm"><b>uri-space</b></a> <p><b>Arguments: </b></p>
+ <p>Return the object into which URIs are currently being interned. </p>
+ </li>
+ <li><a href="operators/uri_eq.htm"><b>uri=</b></a> <p><b>Arguments: </b><i>uri1 uri2 </i></p>
+ <p>Returns true if <i>uri1</i> and <i>uri2</i> are equivalent. </p>
+ </li>
+ <li><a href="operators/intern-uri.htm"><b>intern-uri</b></a> <p><b>Arguments: </b><i>uri-name
+ </i>&optional <i>uri-space </i></p>
+ <p>Intern the uri object specified in the uri-space specified. Methods exist for strings
+ and uri objects. </p>
+ </li>
+ <li><a href="operators/unintern-uri.htm"><b>unintern-uri</b></a> <p><b>Arguments: </b><i>uri
+ </i>&optional <i>uri-space </i></p>
+ <p>Unintern the uri object specified or all uri objects (in <i>uri-space</i> if specified)
+ if <i>uri</i> is <code>t</code>. </p>
+ </li>
+ <li><a href="operators/do-all-uris.htm"><b>do-all-uris</b></a> <p><b>Arguments: </b><i>(var </i>&optional
+ <i>uri-space result) </i>&body <i>body </i></p>
+ <p>Bind <i>var</i> to all currently defined uris (in <i>uri-space</i> if specified) and
+ evaluate <i>body</i>. </p>
+ </li>
+</ul>
+
+<hr>
+
+<hr>
+
+<h2><a name="acl-implementation-1">5.0 Allegro CL implementation notes</a></h2>
+
+<ol>
+ <li>The following are true: <br>
+ <code>(uri= (parse-uri "http://www.franz.com/")</code> <br>
+ <code>(parse-uri "http://www.franz.com"))</code> <br>
+ <code>(eq (intern-uri "http://www.franz.com/")</code> <br>
+ <code>(intern-uri "http://www.franz.com"))</code><br>
+ </li>
+ <li>The following is true: <br>
+ <code>(eq (intern-uri "http://www.franz.com:80/foo/bar.htm")</code> <br>
+ <code>(intern-uri "http://www.franz.com/foo/bar.htm"))</code><br>
+ (I.e. specifying the default port is the same as specifying no port at all. This is
+ specific in RFC2396.) </li>
+ <li>The <em>scheme</em> and <em>authority</em> are case-insensitive. In Allegro CL, the
+ scheme is a keyword that appears in the normal case for the Lisp in which you are
+ executing. </li>
+ <li><code>#u"..."</code> is shorthand for <code>(parse-uri "...")</code>
+ but if an existing <code>#u</code> dispatch macro definition exists, it will not be
+ overridden. </li>
+ <li>The interaction between setting the scheme, host, port, path, query, and fragment slots
+ of URI objects, in conjunction with interning URIs will have very bad and unpredictable
+ results. </li>
+ <li>The printable representation of URIs is cached, for efficiency. This caching is undone
+ when the above slots are changed. That is, when you create a URI the printed
+ representation is cached. When you change one of the above mentioned slots, the printed
+ representation is cleared and calculated when the URI is next printed. For example: </li>
+</ol>
+
+<pre>
+user(10): (setq u #u"http://foo.bar.com/foo/bar")
+#<uri http://foo.bar.com/foo/bar>
+user(11): (setf (net.uri:uri-host u) "foo.com")
+"foo.com"
+user(12): u
+#<uri http://foo.com/foo/bar>
+user(13):
+</pre>
+
+<p>This allows URIs behavior to follow the principle of least surprise. </p>
+
+<hr>
+
+<hr>
+
+<h2><a name="examples-1">6.0 Examples</a></h2>
+
+<pre>
+uri(10): (use-package :net.uri)
+t
+uri(11): (parse-uri "foo")
+#<uri foo>
+uri(12): #u"foo"
+#<uri foo>
+uri(13): (setq base (intern-uri "http://www.franz.com/foo/bar/"))
+#<uri http://www.franz.com/foo/bar/>
+uri(14): (merge-uris (parse-uri "foo.htm") base)
+#<uri http://www.franz.com/foo/bar/foo.htm>
+uri(15): (merge-uris (parse-uri "?foo") base)
+#<uri http://www.franz.com/foo/bar/?foo>
+uri(16): (setq base (intern-uri "http://www.franz.com/foo/bar/baz.htm"))
+#<uri http://www.franz.com/foo/bar/baz.htm>
+uri(17): (merge-uris (parse-uri "foo.htm") base)
+#<uri http://www.franz.com/foo/bar/foo.htm>
+uri(18): (merge-uris #u"?foo" base)
+#<uri http://www.franz.com/foo/bar/?foo>
+uri(19): (describe #u"http://www.franz.com")
+#<uri http://www.franz.com> is an instance of #<standard-class net.uri:uri>:
+ The following slots have :instance allocation:
+ scheme :http
+ host "www.franz.com"
+ port nil
+ path nil
+ query nil
+ fragment nil
+ plist nil
+ escaped nil
+ string "http://www.franz.com"
+ parsed-path nil
+ hashcode nil
+uri(20): (describe #u"http://www.franz.com/")
+#<uri http://www.franz.com> is an instance of #<standard-class net.uri:uri>:
+ The following slots have :instance allocation:
+ scheme :http
+ host "www.franz.com"
+ port nil
+ path nil
+ query nil
+ fragment nil
+ plist nil
+ escaped nil
+ string "http://www.franz.com"
+ parsed-path nil
+ hashcode nil
+uri(21): #u"foobar#baz%23xxx"
+#<uri foobar#baz#xxx>
+</pre>
+
+<p><small>Copyright (c) 1998-2001, Franz Inc. Berkeley, CA., USA. All rights reserved.
+Created 2001.8.16.</small></p>
+</body>
+</html>
Added: branches/grin-neu/thirdparty/trivial-gray-streams/COPYING
===================================================================
--- branches/grin-neu/thirdparty/trivial-gray-streams/COPYING 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/trivial-gray-streams/COPYING 2006-12-01 10:39:49 UTC (rev 2094)
@@ -0,0 +1,21 @@
+ Copyright (c) 2005 David Lichteblau
+
+ Permission is hereby granted, free of charge, to any person
+ obtaining a copy of this software and associated documentation files
+ (the "Software"), to deal in the Software without restriction,
+ including without limitation the rights to use, copy, modify, merge,
+ publish, distribute, sublicense, and/or sell copies of the Software,
+ and to permit persons to whom the Software is furnished to do so,
+ subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be
+ included in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ SOFTWARE.
Added: branches/grin-neu/thirdparty/trivial-gray-streams/CVS/Entries
===================================================================
--- branches/grin-neu/thirdparty/trivial-gray-streams/CVS/Entries 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/trivial-gray-streams/CVS/Entries 2006-12-01 10:39:49 UTC (rev 2094)
@@ -0,0 +1,7 @@
+/COPYING/1.1/Sun Dec 4 23:41:05 2005//
+/Makefile/1.1.1.1/Wed Nov 9 22:11:00 2005//
+/README/1.3/Thu Sep 14 17:45:36 2006//
+/mixin.lisp/1.5/Thu Sep 14 17:45:36 2006//
+/package.lisp/1.4/Thu Sep 14 17:45:36 2006//
+/trivial-gray-streams.asd/1.1.1.1/Wed Nov 9 22:11:00 2005//
+D
Added: branches/grin-neu/thirdparty/trivial-gray-streams/CVS/Repository
===================================================================
--- branches/grin-neu/thirdparty/trivial-gray-streams/CVS/Repository 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/trivial-gray-streams/CVS/Repository 2006-12-01 10:39:49 UTC (rev 2094)
@@ -0,0 +1 @@
+trivial-gray-streams
Added: branches/grin-neu/thirdparty/trivial-gray-streams/CVS/Root
===================================================================
--- branches/grin-neu/thirdparty/trivial-gray-streams/CVS/Root 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/trivial-gray-streams/CVS/Root 2006-12-01 10:39:49 UTC (rev 2094)
@@ -0,0 +1 @@
+:pserver:anonymous@common-lisp.net:/project/cl-plus-ssl/cvsroot
Added: branches/grin-neu/thirdparty/trivial-gray-streams/CVS/Template
===================================================================
Added: branches/grin-neu/thirdparty/trivial-gray-streams/Makefile
===================================================================
--- branches/grin-neu/thirdparty/trivial-gray-streams/Makefile 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/trivial-gray-streams/Makefile 2006-12-01 10:39:49 UTC (rev 2094)
@@ -0,0 +1,3 @@
+.PHONY: clean
+clean:
+ rm -f *.fasl *.x86f *.fas *.ufsl *.lib *.pfsl
Property changes on: branches/grin-neu/thirdparty/trivial-gray-streams/Makefile
___________________________________________________________________
Name: svn:eol-style
+ native
Added: branches/grin-neu/thirdparty/trivial-gray-streams/README
===================================================================
--- branches/grin-neu/thirdparty/trivial-gray-streams/README 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/trivial-gray-streams/README 2006-12-01 10:39:49 UTC (rev 2094)
@@ -0,0 +1,37 @@
+trivial-gray-streams
+====================
+
+This system provides an extremely thin compatibility layer for gray
+streams. It is nearly *too* trivial for a complete package, except that
+I have copy&pasted this code into enough projects now that I decided to
+factor it out once again now, and then *never* have to touch it again.
+
+
+How to use it
+=============
+
+1. Use the package TRIVIAL-GRAY-STREAMS instead of whatever
+ implementation-specific package you would have to use otherwise to
+ get at gray stream symbols.
+2. For STREAM-READ-SEQUENCE and STREAM-WRITE-SEQUENCE, notice that we
+ use two required arguments and allow additional keyword arguments.
+ So the lambda list when defining a method on either function should look
+ like this:
+ (stream sequence start end &key)
+3. In order for (2) to work on all Lisps, make sure to subclass all your
+ stream classes from TRIVIAL-GRAY-STREAM-MIXIN if you intend to define
+ methods on those two generic functions.
+
+
+Extensions
+==========
+
+Generic function STREAM-READ-SEQUENCE (stream sequence start end &key)
+Generic function STREAM-WRITE-SEQUENCE (stream sequence start end &key)
+
+ See above.
+
+Generic function STREAM-FILE-POSITION (stream) => file position
+Generic function (SETF STREAM-FILE-POSITION) (position-spec stream) => successp
+
+ Will only be called by LispWorks and CLISP.
Added: branches/grin-neu/thirdparty/trivial-gray-streams/mixin.lisp
===================================================================
--- branches/grin-neu/thirdparty/trivial-gray-streams/mixin.lisp 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/trivial-gray-streams/mixin.lisp 2006-12-01 10:39:49 UTC (rev 2094)
@@ -0,0 +1,117 @@
+(in-package :trivial-gray-streams)
+
+(defclass trivial-gray-stream-mixin () ())
+
+(defgeneric stream-read-sequence
+ (stream sequence start end &key &allow-other-keys))
+(defgeneric stream-write-sequence
+ (stream sequence start end &key &allow-other-keys))
+
+(defgeneric stream-file-position (stream))
+(defgeneric (setf stream-file-position) (newval stream))
+
+(defmethod stream-write-string
+ ((stream trivial-gray-stream-mixin) seq &optional start end)
+ (stream-write-sequence stream seq (or start 0) (or end (length seq))))
+
+;; Implementations should provide this default method, I believe, but
+;; at least sbcl and allegro don't.
+(defmethod stream-terpri ((stream trivial-gray-stream-mixin))
+ (write-char #\newline stream))
+
+(defmethod stream-file-position ((stream trivial-gray-stream-mixin))
+ nil)
+
+(defmethod (setf stream-file-position)
+ (newval (stream trivial-gray-stream-mixin))
+ (declare (ignore newval))
+ nil)
+
+#+allegro
+(progn
+ (defmethod excl:stream-read-sequence
+ ((s trivial-gray-stream-mixin) seq &optional start end)
+ (stream-read-sequence s seq (or start 0) (or end (length seq))))
+ (defmethod stream:stream-write-sequence
+ ((s trivial-gray-stream-mixin) seq &optional start end)
+ (stream-write-sequence s seq (or start 0) (or end (length seq)))))
+
+#+cmu
+(progn
+ (defmethod ext:stream-read-sequence
+ ((s trivial-gray-stream-mixin) seq &optional start end)
+ (stream-read-sequence s seq (or start 0) (or end (length seq))))
+ (defmethod ext:stream-write-sequence
+ ((s trivial-gray-stream-mixin) seq &optional start end)
+ (stream-write-sequence s seq (or start 0) (or end (length seq)))))
+
+#+lispworks
+(progn
+ (defmethod stream:stream-read-sequence
+ ((s trivial-gray-stream-mixin) seq start end)
+ (stream-read-sequence s seq start end))
+ (defmethod stream:stream-write-sequence
+ ((s trivial-gray-stream-mixin) seq start end)
+ (stream-write-sequence s seq start end))
+
+ (defmethod stream:stream-file-position ((stream trivial-gray-stream-mixin))
+ (stream-file-position stream))
+ (defmethod (setf stream:stream-file-position)
+ (newval (stream trivial-gray-stream-mixin))
+ (setf (stream-file-position stream) newval)))
+
+#+openmcl
+(progn
+ (defmethod ccl:stream-read-vector
+ ((s trivial-gray-stream-mixin) seq start end)
+ (stream-read-sequence s seq start end))
+ (defmethod ccl:stream-write-vector
+ ((s trivial-gray-stream-mixin) seq start end)
+ (stream-write-sequence s seq start end)))
+
+#+clisp
+(progn
+ (defmethod gray:stream-read-byte-sequence
+ ((s trivial-gray-stream-mixin)
+ seq
+ &optional start end no-hang interactive)
+ (when no-hang
+ (error "this stream does not support the NO-HANG argument"))
+ (when interactive
+ (error "this stream does not support the INTERACTIVE argument"))
+ (stream-read-sequence s seq start end))
+
+ (defmethod gray:stream-write-byte-sequence
+ ((s trivial-gray-stream-mixin)
+ seq
+ &optional start end no-hang interactive)
+ (when no-hang
+ (error "this stream does not support the NO-HANG argument"))
+ (when interactive
+ (error "this stream does not support the INTERACTIVE argument"))
+ (stream-write-sequence s seq start end))
+
+ (defmethod gray:stream-read-char-sequence
+ ((s trivial-gray-stream-mixin) seq &optional start end)
+ (stream-read-sequence s seq start end))
+
+ (defmethod gray:stream-write-char-sequence
+ ((s trivial-gray-stream-mixin) seq &optional start end)
+ (stream-write-sequence s seq start end))
+
+ (defmethod gray:stream-position ((stream trivial-gray-stream-mixin) position)
+ (if position
+ (setf (stream-file-position stream) position)
+ (stream-file-position stream))))
+
+#+sbcl
+(progn
+ (defmethod sb-gray:stream-read-sequence
+ ((s trivial-gray-stream-mixin) seq &optional start end)
+ (stream-read-sequence s seq (or start 0) (or end (length seq))))
+ (defmethod sb-gray:stream-write-sequence
+ ((s trivial-gray-stream-mixin) seq &optional start end)
+ (stream-write-sequence s seq (or start 0) (or end (length seq))))
+ ;; SBCL extension:
+ (defmethod sb-gray:stream-line-length ((stream trivial-gray-stream-mixin))
+ 80))
Added: branches/grin-neu/thirdparty/trivial-gray-streams/package.lisp
===================================================================
--- branches/grin-neu/thirdparty/trivial-gray-streams/package.lisp 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/trivial-gray-streams/package.lisp 2006-12-01 10:39:49 UTC (rev 2094)
@@ -0,0 +1,44 @@
+(in-package :trivial-gray-streams-system)
+
+#+cmu
+(eval-when (:compile-toplevel :load-toplevel :execute)
+ (require :gray-streams))
+
+#+allegro
+(eval-when (:compile-toplevel :load-toplevel :execute)
+ (unless (fboundp 'stream:stream-write-string)
+ (require "streamc.fasl")))
+
+(macrolet
+ ((frob ()
+ (let
+ ((common-symbols
+ '(#:fundamental-stream #:fundamental-input-stream
+ #:fundamental-output-stream #:fundamental-character-stream
+ #:fundamental-binary-stream #:fundamental-character-input-stream
+ #:fundamental-character-output-stream
+ #:fundamental-binary-input-stream
+ #:fundamental-binary-output-stream #:stream-read-char
+ #:stream-unread-char #:stream-read-char-no-hang
+ #:stream-peek-char #:stream-listen #:stream-read-line
+ #:stream-clear-input #:stream-write-char #:stream-line-column
+ #:stream-start-line-p #:stream-write-string #:stream-terpri
+ #:stream-fresh-line #:stream-finish-output #:stream-force-output
+ #:stream-clear-output #:stream-advance-to-column
+ #:stream-read-byte #:stream-write-byte)))
+ `(defpackage :trivial-gray-streams
+ (:use :cl)
+ (:import-from #+sbcl :sb-gray
+ #+allegro :excl
+ #+cmu :ext
+ #+clisp :gray
+ #+openmcl :ccl
+ #+lispworks :stream
+ #-(or sbcl allegro cmu clisp openmcl lispworks) ...
+ ,@common-symbols)
+ (:export #:trivial-gray-stream-mixin
+ #:stream-read-sequence
+ #:stream-write-sequence
+ #:stream-file-position
+ ,@common-symbols)))))
+ (frob))
Added: branches/grin-neu/thirdparty/trivial-gray-streams/trivial-gray-streams.asd
===================================================================
--- branches/grin-neu/thirdparty/trivial-gray-streams/trivial-gray-streams.asd 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/trivial-gray-streams/trivial-gray-streams.asd 2006-12-01 10:39:49 UTC (rev 2094)
@@ -0,0 +1,9 @@
+;;; -*- mode: lisp -*-
+
+(defpackage :trivial-gray-streams-system
+(:use :cl :asdf))
+(in-package :trivial-gray-streams-system)
+
+(defsystem :trivial-gray-streams
+ :serial t
+ :components ((:file "package") (:file "mixin")))
Modified: branches/grin-neu/thirdparty/uffi/src/corman/getenv-ccl.lisp
===================================================================
--- branches/grin-neu/thirdparty/uffi/src/corman/getenv-ccl.lisp 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/uffi/src/corman/getenv-ccl.lisp 2006-12-01 10:39:49 UTC (rev 2094)
@@ -7,13 +7,8 @@
;;;; Programmer: "Joe Marshall" <prunesquallor(a)attbi.com>
;;;; Date Started: Feb 2002
;;;;
-`;;;; $Id: getenv-ccl.lisp,v 1.1 2004/06/23 08:27:10 hans Exp $
+;;;; $Id$
;;;;
-;;;; This file, part of UFFI, is Copyright (c) 2002 by Kevin M. Rosenberg
-;;;;
-;;;; UFFI users are granted the rights to distribute and use this software
-;;;; as governed by the terms of the Lisp Lesser GNU Public License
-;;;; (http://opensource.franz.com/preamble.html) also known as the LLGPL.
;;;; *************************************************************************
(in-package :cl-user)
Modified: branches/grin-neu/thirdparty/uffi/tests/package.lisp
===================================================================
--- branches/grin-neu/thirdparty/uffi/tests/package.lisp 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/thirdparty/uffi/tests/package.lisp 2006-12-01 10:39:49 UTC (rev 2094)
@@ -7,7 +7,9 @@
;;;; Author: Kevin M. Rosenberg
;;;; Date Started: Apr 2003
;;;;
-;;;; $Id: package.lisp,v 1.1 2004/06/23 08:27:10 hans Exp $
+;;;; This file, part of UFFI, is Copyright (c) 2003-2005 by Kevin M. Rosenberg
+;;;;
+;;;; $Id$
;;;; *************************************************************************
(defpackage #:uffi-tests
Modified: branches/grin-neu/tools/make-core.lisp
===================================================================
--- branches/grin-neu/tools/make-core.lisp 2006-12-01 10:37:34 UTC (rev 2093)
+++ branches/grin-neu/tools/make-core.lisp 2006-12-01 10:39:49 UTC (rev 2094)
@@ -1,6 +1,8 @@
(in-package :cl-user)
+#+cmu
(setf ext:*gc-verbose* nil)
+#+cmu
(setf ext:*bytes-consed-between-gcs* (* 12000000 3)) ;3x default
(setf *compile-print* nil)
1
0
Author: hhubner
Date: 2006-12-01 05:37:34 -0500 (Fri, 01 Dec 2006)
New Revision: 2093
Added:
branches/grin-neu/
Log:
Add branch for GRiN development, moving to SBCL
Copied: branches/grin-neu (from rev 2092, trunk)
1
0
Author: hhubner
Date: 2006-11-30 11:32:54 -0500 (Thu, 30 Nov 2006)
New Revision: 2092
Added:
trunk/thirdparty/emacs/slime/doc/slime-small.eps
trunk/thirdparty/emacs/slime/doc/slime-small.pdf
trunk/thirdparty/emacs/slime/sbcl-pprint-patch.lisp
trunk/thirdparty/emacs/slime/swank-loader.x86f
trunk/thirdparty/emacs/slime/swank-version.el
Modified:
trunk/thirdparty/emacs/slime/ChangeLog
trunk/thirdparty/emacs/slime/PROBLEMS
trunk/thirdparty/emacs/slime/README
trunk/thirdparty/emacs/slime/doc/Makefile
trunk/thirdparty/emacs/slime/doc/slime.texi
trunk/thirdparty/emacs/slime/doc/texinfo-tabulate.awk
trunk/thirdparty/emacs/slime/hyperspec.el
trunk/thirdparty/emacs/slime/mkdist.sh
trunk/thirdparty/emacs/slime/nregex.lisp
trunk/thirdparty/emacs/slime/present.lisp
trunk/thirdparty/emacs/slime/slime.el
trunk/thirdparty/emacs/slime/swank-abcl.lisp
trunk/thirdparty/emacs/slime/swank-allegro.lisp
trunk/thirdparty/emacs/slime/swank-backend.lisp
trunk/thirdparty/emacs/slime/swank-clisp.lisp
trunk/thirdparty/emacs/slime/swank-cmucl.lisp
trunk/thirdparty/emacs/slime/swank-corman.lisp
trunk/thirdparty/emacs/slime/swank-ecl.lisp
trunk/thirdparty/emacs/slime/swank-gray.lisp
trunk/thirdparty/emacs/slime/swank-lispworks.lisp
trunk/thirdparty/emacs/slime/swank-loader.lisp
trunk/thirdparty/emacs/slime/swank-openmcl.lisp
trunk/thirdparty/emacs/slime/swank-sbcl.lisp
trunk/thirdparty/emacs/slime/swank-scl.lisp
trunk/thirdparty/emacs/slime/swank-source-file-cache.lisp
trunk/thirdparty/emacs/slime/swank-source-path-parser.lisp
trunk/thirdparty/emacs/slime/swank.asd
trunk/thirdparty/emacs/slime/swank.lisp
trunk/thirdparty/emacs/slime/test-all.sh
trunk/thirdparty/emacs/slime/test.sh
Log:
Update slime
Modified: trunk/thirdparty/emacs/slime/ChangeLog
===================================================================
--- trunk/thirdparty/emacs/slime/ChangeLog 2006-11-30 14:00:03 UTC (rev 2091)
+++ trunk/thirdparty/emacs/slime/ChangeLog 2006-11-30 16:32:54 UTC (rev 2092)
@@ -1,5 +1,3092 @@
+2006-11-26 Juho Snellman <jsnell(a)iki.fi>
+
+ * swank-source-file-cache.lisp (buffer-first-change): Check
+ whether a file exists before trying load it into the source cache.
+
+2006-11-26 Juho Snellman <jsnell(a)iki.fi>
+
+ Restore the way M-n and M-p used to work in the REPL. (cherry-picked
+ from a patch with other changes, sent by Attila Lendvai).
+
+ * slime.el (slime-repl-previous-input-starting-with-current-input)
+ (slime-repl-next-input-starting-with-current-input): New functions,
+ work like the old slime-repl-previous-input / next-input.
+ (slime-repl-matching-input-regexp): Restore old version.
+ (slime-repl-mode-map): Bind s-r-p-i-s-w-c-i and s-r-n-i-s-w-c-i
+ to M-p and M-n respectively. slime-repl-previous-input and
+ slime-repl-next-input are still accessible with C-up / C-down.
+
+2006-11-25 Helmut Eller <heller(a)common-lisp.net>
+
+ * slime.el (slime-repl-read-break): Use a :emacs-interrupt message
+ instead of a RPC to swank:simple-break. Suggested by Taylor R
+ Campbell.
+
+2006-11-24 Helmut Eller <heller(a)common-lisp.net>
+
+ * slime.el (slime-search-buffer-package): Prettify the package
+ name if it is written as string or keyword.
+
+2006-11-23 Helmut Eller <heller(a)common-lisp.net>
+
+ * slime.el (slime-in-expression-p): Use `read' and `eq' to test
+ the first element of the list. Previuosly, the pattern (foo)
+ wrongly matched (foobar) because we used (looking-at <symbol>).
+
+ * swank-cmucl.lisp (setf-definitions): Also include defs which
+ were created with (defun (setf NAME) ...). Previously we only
+ found definitions created with defsetf or define-setf-expander.
+
+2006-11-22 Helmut Eller <heller(a)common-lisp.net>
+
+ * slime.el (slime-edit-definition): Don't hide error messages.
+
+2006-11-21 Helmut Eller <heller(a)common-lisp.net>
+
+ * swank.lisp (*coding-system*): "Coding systems" are now strings
+ instead of keywords.
+
+2006-11-19 Helmut Eller <heller(a)common-lisp.net>
+
+ * slime.el (slime-compile-file): Let the Lisp side choose the
+ coding system.
+ (slime-coding): Deleted.
+
+ * swank.lisp (compile-file-for-emacs): Use guess-external-format.
+ (swank:create-server): no more accepts an :external-format 'enc ,
+ use :coding-system "enc" instead.
+
+ * swank-backend.lisp (find-external-format)
+ (guess-external-format): New.
+ (swank-compile-file): The external-format argument is now a
+ backend specific value returned by find-external-format.
+
+ * swank-cmucl.lisp, swank-sbcl.lisp, swank-clisp,
+ swank-lispworks.lisp, swank-allegro.lisp, swank-corman.lisp,
+ swank-ecl.lisp, swank-scl.lisp, swank-abcl.lisp, swank-openmcl:
+ Update implementations accordingly.
+
+ * swank-source-file-cache.lisp (read-file): Use guess-external-format.
+
+ * swank.lisp (*swank-wire-protocol-version*): Is now initialized
+ by the loader.
+ (wire-protocol-version): Removed, because it contained a reference
+ to swank-loader::*source-directory*.
+
+ * slime.el (slime-set-connection-info): On protocol version
+ mismatch, ask the user how to proceed.
+ (slime-protocol-version): New variable. Initialize it at compile
+ time to detect stale elc files.
+
+ * swank-loader.lisp (load-swank): Set the protocol version.
+
+2006-11-12 Marco Baringer <mb(a)bese.it>
+
+ * slime.el (slime-make-tramp-file-name): Added (require 'tramp)
+ since tramp-make-tramp-file-name is not an autoloaded function.
+
+2006-11-07 Edi Weitz <edi(a)agharta.de>
+
+ * slime.el (slime-fuzzy-completion-time-limit-in-msec): Escaped
+ left parenthesis in doc string.
+
+2006-11-05 Matthias Koeppe <mkoeppe(a)mail.math.uni-magdeburg.de>
+
+ * slime.el (slime-complete-keywords-contextually): Unused
+ variable, removed.
+
+2006-11-05 Helmut Eller <heller(a)common-lisp.net>
+
+ * slime.el (sldb-sexp-highlight-mode): Remove bloat.
+
+2006-11-04 Matthias Koeppe <mkoeppe(a)mail.math.uni-magdeburg.de>
+
+ Support nested presentations in REPL results, when present.lisp is
+ loaded.
+
+ * swank.lisp (make-presentations-result): New, factored out from
+ listener-eval.
+ (listener-eval): Use it here.
+
+ * present.lisp (make-presentations-result): Override it here.
+
+2006-11-03 Marco Baringer <mb(a)bese.it>
+
+ * swank.lisp (all-slots-for-inspector): Added declare ignore for
+ unused argument inspector (openmcl warns about this). Reindented.
+
+2006-11-01 Attila Lendvai <attila.lendvai(a)gmail.com>
+
+ * slime.el (sldb-sexp-highlight-mode): New custom.
+ (slime-handle-repl-shortcut): Trigger slime-lookup-shortcut when
+ the point is anywhere before slime-repl-input-start-mark. IOW,
+ you can press "," anywhere before the prompt.
+ (slime-edit-definition): Handle the case when there are only such
+ entries returned from swank that have errors.
+ (slime-read-from-minibuffer): Allow overriding of the keymap.
+ (slime-repl-previous-matching-input): Similar behaviour like
+ isearch-forward.
+ (slime-repl-next-matching-input): Ditto. In more details: You can
+ freely navigate with slime-repl-previous/next-input with M-p and
+ M-n at any time among the history entries. When M-r is pressed,
+ which invokes slime-repl-previous-matching-input, the the
+ minibuffer is activated to read the regexp to search for and the
+ contents will default to the current repl input. Pressing M-r
+ again will start searching with the last pattern used no matter
+ what the content of the minibuffer is. Subsequent invocations of
+ M-r get the next match, and of course the same applies for M-s,
+ which is slime-repl-previous-matching-input.
+
+ * swank.lisp (fuzzy-completion-set): Fix on clisp.
+ (convert-fuzzy-completion-result): Fix symbol fbound and other
+ annotations.
+ (slot-value-using-class-for-inspector): New.
+ (slot-boundp-using-class-for-inspector): New.
+ (inspect-for-emacs): Use the special slot access methods so that
+ it's possible to customize the inspecting of complex
+ slots (e.g. computed-class at
+ http://common-lisp.net/project/computed-class/)
+ (all-slots-for-inspector): Converted to generic method.
+
+2006-11-01 Marco Baringer <mb(a)bese.it>
+
+ * swank.lisp (*swank-wire-protocol-version*): Use a defvar to
+ declare the existence of tihs variable to the lisp (Reported by:
+ Jonathon McKitrick <jcm(a)FreeBSD-uk.eu.org>).
+
+2006-10-30 Marco Baringer <mb(a)bese.it>
+
+ * swank.lisp (*dont-close*): New variable.
+ (defpackage :swank): Export *dont-close*.
+ (start-server, create-server): Use *dont-close* as the default
+ value of the :dont-close parameter.
+ (connection-info): Send the wire-protocol-version (supplied by the
+ swank-version.el file) to slime when connecting.
+ (wire-protocol-version): New function.
+
+ * slime.el (slime-global-variable-name-regexp): New variable.
+ (slime-global-variable-name-p): Use
+ slime-global-variable-name-regexp.
+ ("swank-version"): Load swank-version.el to get the wire protocol
+ version.
+ (slime-set-connection-info): Check the wire protocol version.
+
+2006-10-30 Helmut Eller <heller(a)common-lisp.net>
+
+ * slime.el (slime-global-variable-name-p): Oops... need to handle
+ very long strings.
+
+2006-10-29 Attila Lendvai <attila.lendvai(a)gmail.com>
+
+ * slime.el (slime-global-variable-name-p): Use defun* instead of
+ defun.
+
+2006-10-29 Helmut Eller <heller(a)common-lisp.net>
+
+ * slime.el (slime-global-variable-name-p): Simplified.
+
+2006-10-28 Matthias Koeppe <mkoeppe(a)mail.math.uni-magdeburg.de>
+
+ Add completion for character names.
+
+ * slime.el (slime-completions-for-character): New.
+ (slime-contextual-completions): Use it here.
+
+ * swank-backend.lisp (character-completion-set): New interface.
+
+ * swank-allegro.lisp (character-completion-set): Implement it.
+
+ * swank.lisp (completions-for-character): New slimefun.
+ (compound-prefix-match/ci/underscores)
+ (longest-completion/underscores, tokenize-completion/underscores)
+ (untokenize-completion/underscores): New functions.
+
+2006-10-28 Ivan Toshkov <ivan(a)toshkov.org>
+
+ * hyperspec.el: Missing Hyperspec links for ~| and ~~
+
+2006-10-27 Ivan Toshkov <ivan(a)toshkov.org>
+
+ * hyperspec.el: Missing Hyperspec links for ~% and ~&
+
+2006-10-27 Nikodemus Siivola <nikodemus(a)random-state.net>
+
+ * swank-sbcl.lisp (make-weak-key-hash-table): Restore support
+ for older SBCLs without weak hash-tables.
+ (make-weak-value-hash-table): Ditto.
+
+2006-10-26 Utz-Uwe Haus <haus+slime(a)mail.math.uni-magdeburg.de>
+
+ * swank-allegro.lisp (sldb-break-at-start): Implement.
+
+2006-10-26 Attila Lendvai <attila.lendvai(a)gmail.com>
+
+ * slime.el (slime-setup-command-hooks): Use make-local-hook.
+ (slime-repl-mode): Ditto.
+ (slime-fuzzy-choices-buffer): Ditto.
+ (sldb-mode): Ditto.
+ (slime-fuzzy-completion-limit): New variable.
+ (slime-fuzzy-completion-time-limit-in-msec): New variable.
+ (slime-fuzzy-next): Fix when at the end of the buffer.
+ (completion-output-symbol-converter): New to handle escaped
+ symbols for those who need to mess around with symbols like
+ layered-function-definers::|CONTEXTL::SLOT-VALUE-USING-LAYER|.
+ When a symbol is escaped then completion is case sensitive.
+ (completion-output-package-converter): New.
+ (mimic-key-bindings): New to easily define bindings by first
+ trying to look up bindings for an operation and only use the
+ provided default bindings if nothing was found in the source
+ keymap. Use it to set up fuzzy bindings. (Hint: if you have keys
+ like previous-line customized, then only load slime after they
+ have been set, and the fuzzy mode will mimic them.)
+ (slime-temp-buffer-quit): Always close the opened window, updated
+ docstring. Also made the fuzzy maps smarter, they now try to look
+ up keys with 'where-is-internal and map the functions on them.
+
+ * swank-sbcl.lisp
+ (make-weak-value-hash-table): New for sbcl.
+ (make-weak-key-hash-table): New for sbcl.
+
+ * swank.lisp (fuzzy-completions and friends): Added :limit and
+ :time-limit-in-msec keyword params. Used vectors instead of lists
+ that nearly doubled its speed (at least on sbcl). Also added some
+ declare optimize and type annotations.
+ (do-symbols*): New, uses a hash-table to visit only non-seen
+ symbols. Replaced various uses of do-symbols where it was
+ appropiate.
+
+2006-10-26 Marco Baringer <mb(a)bese.it>
+
+ * slime.el (slime-global-variable-name-p): Use a custom 'parser'
+ instead of string-match to avoid regexp overflow errors on very
+ long strings.
+
+2006-10-21 Helmut Eller <heller(a)common-lisp.net>
+
+ * swank-lispworks.lisp (initialize-multiprocessing): Don't init
+ MP if it is already running.
+
+ * test.sh: Run Emacs in Screen.
+
+2006-10-20 Helmut Eller <heller(a)common-lisp.net>
+
+ * swank-backend.lisp, swank-cmucl.lisp:
+ (startup-idle-and-top-level-loops): Deleted. Merged into
+ initialize-multiprocessing.
+
+2006-10-20 Attila Lendvai <attila.lendvai(a)gmail.com>
+
+ * slime.el (slime-fuzzy-choices-buffer): Added kill-buffer-hook to
+ the completion buffer to slime-fuzzy-abort, so we get out from the
+ completion mode and key maps when the completion buffer is closed.
+
+2006-10-20 Marco Baringer <mb(a)bese.it>
+
+ * slime.el (slime-target-buffer-fuzzy-completions-map): Fix a bug
+ I introduced when applying levente's patch.
+
+2006-10-20 Martin Simmons <martin(a)lispworks.com>
+
+ * swank-backend.lisp (initialize-multiprocessing): New API to
+ support lisps where initialize-multiprocessing may not return (lispworks).
+
+ * swank.lisp (start-server): initialize-multiprocessing's API has changed.
+
+ * swank-lispworks.lisp (initialize-multiprocessing): Update for new API.
+
+ * swank-cmucl.lisp (initialize-multiprocessing): Update for new API.
+
+ * swank-allegro.lisp (initialize-multiprocessing): Update for new api.
+
+2006-10-20 Levente M�sz�ros <levente.meszaros(a)gmail.com>
+
+ Added "in-place" fuzzy completion GUI. See
+ slime-fuzzy-completions-map and
+ slime-target-buffer-fuzzy-completions-map for details.
+
+ * slime.el (slime-fuzzy-completion-in-place): New variable.
+ (slime-target-buffer-fuzzy-completions-mode): New keymap for
+ in-place fuzzy completions.
+ (slime-fuzzy-target-buffer-completions-mode): New minor mode for
+ in-place fuzzy completions.
+ (slime-fuzzy-current-completion-overlay): New overlay for
+ highlighting currently selected completion.
+ (slime-fuzzy-completions-map): Added new fuzzy completon keys
+ (slime-fuzzy-indent-and-complete-symbol): New function.
+ (slime-fuzzy-complete-symbol): Use new in-place fuzzy completion.
+ (slime-fuzzy-choices-buffer): Support in-place completion editing.
+ (slime-fuzzy-fill-completions-buffer): Highlight completions,
+ don't automatically jump to completion buffer.
+ (slime-fuzzy-enable-target-buffer-completions-mode,
+ slime-fuzzy-disable-target-buffer-completions-mode): New modes for
+ moving in/out of in-place fuzzy completion mode
+ (slime-fuzzy-next, slime-fuzzy-prev): Don't assume point is in the
+ completion buffer.
+ (slime-fuzzy-dehighlight-current-completion,
+ slime-fuzzy-highlight-current-completion): Manage completion
+ selection highlighting.
+ (slime-fuzzy-select-or-update-completions): New function.
+ (slime-fuzzy-process-event-in-completions-buffer): New function.
+ (slime-fuzzy-select-and-process-event-in-target-buffer): New function.
+ (slime-fuzzy-done): Changed to deal with in-place completion.
+
+2006-10-19 Helmut Eller <heller(a)common-lisp.net>
+
+ * swank-backend.lisp (ignored-xref-function-names): Deleted.
+
+ * swank.lisp (guess-package-from-string): Remove special case for
+ "#.". parse-package will handle that just fine.
+ (find-definitions-for-emacs): Don't filter errors out.
+ (sanitize-xrefs): Moved to swank-sbcl. The backend is supposed to
+ return sane values.
+
+ * swank-sbcl.lisp: See above.
+
+ * slime.el (slime-find-buffer-package): Simplify.
+
+2006-10-17 Helmut Eller <heller(a)common-lisp.net>
+
+ * slime.el (slime-accept-process-output): The timeout arg can be
+ nil. Handle that case.
+
+2006-10-17 Attila Lendvai <attila.lendvai(a)gmail.com>
+
+ * slime.el (slime-find-buffer-package): Handle #. forms.
+
+ * swank.lisp (guess-package-from-string): Handle #. forms.
+ (inspect-for-emacs standard-class): Handle non-string
+ :documentation slot contents.
+
+ * swank-sbcl.lisp (inspect-for-emacs weak-pointer ...): Added
+ method.
+
+2006-10-16 Helmut Eller <heller(a)common-lisp.net>
+
+ * slime.el (sldb-activate): Get debug-info from the correct
+ thread. Fixes bug reported by Dan Weinreb <dlw(a)itasoftware.com>.
+ (unwind-to-previous-sldb-level): New test.
+ (slime-init-command): Send a single form.
+ (slime-insert-presentation): Honor slime-repl-enable-presentations.
+ Presentations kill SLDB and the inspector in Emacs 20 (besides
+ being troublesome GC-wise).
+
+ * swank.lisp: Clean up global IO redirection.
+ (setup-stream-indirection): Turn macro into a
+ function and delay initialization after user init files are
+ loaded, so that we do nothing if *globally-redirect-io* is nil.
+ (*after-init-hook*, run-after-init-hook)
+ (init-global-stream-redirection): New.
+
+ (parse-symbol-or-lose): Lose loudly and early (instead of failing
+ silently).
+
+ * swank-loader.lisp: Abort on compile-time or load-time errors.
+ Don't try to load the source-file if COMPILE-FILE's 3rd return
+ value is true (it's true even for warnings).
+ (handle-loadtime-error): New function.
+
+ Run the after-init-hook.
+
+ * swank-cmucl.lisp (inspect-for-emacs): Don't break for
+ simple-strings.
+
+2006-10-11 Matthias Koeppe <mkoeppe(a)mail.math.uni-magdeburg.de>
+
+ * slime.el (slime-presentation-syntax-table): New.
+ (slime-add-presentation-properties): Install it in a syntax-table
+ text property, so that #<...> is balanced in a presentation.
+ (slime-remove-presentation-properties): Remove the text property.
+ (slime-repl-mode): Respect the syntax text properties of
+ presentations in REPL buffers.
+
+2006-10-09 Matthias Koeppe <mkoeppe(a)mail.math.uni-magdeburg.de>
+
+ * swank.lisp (completions-for-keyword): Look up the operator names
+ in the right package. Return nil (rather than signalling an
+ error) when no valid operator name is present.
+
+2006-10-08 Matthias Koeppe <mkoeppe(a)mail.math.uni-magdeburg.de>
+
+ * swank-loader.lisp (lisp-version-string) [allegro]: Distinguish
+ between 32-bit and 64-bit version on the SPARC architecture.
+
+2006-10-03 Marco Baringer <mb(a)bese.it>
+
+ Change license statement to say that all files without an explicit
+ copyright notice are public domain. This change will allow SLIME
+ to moved out of debian's nonfree tree.
+
+ * README: Update license statement.
+
+2006-10-02 Marco Baringer <mb(a)bese.it>
+
+ * slime.el (slime-highlight-compiler-notes): New variable.
+ (slime-compilation-finished): Only highlight notes when
+ slime-highlight-compiler-notes is non-NIL.
+
+2006-09-28 Marco Baringer <mb(a)bese.it>
+
+ * swank-loader.lisp (compile-files-if-needed-serially): Don't
+ ignore compile-time errors but drop into a debugger (it's not a
+ slime debugger but it's certainly better than ignoring the error).
+
+2006-09-27 Marco Baringer <mb(a)bese.it>
+
+ * swank.lisp (*globally-redirect-io*): Change default value to T.
+
+2006-09-25 Juho Snellman <jsnell(a)iki.fi>
+
+ Fix Slime on SBCL 0.9.17.
+
+ * swank-backend.lisp (ignored-xref-function-names): New interface
+
+ * swank.lisp (sanitize-xrefs): Use ignored-xref-function-names
+ instead of having a #+sbcl special case.
+
+ * swank-sbcl.lisp (ignored-xref-function-names): Implement.
+ Filter out SB-C::STEP-VALUES, not just SB-C::STEP-FORM, as done by
+ the old sanitize-xrefs. Don't implement the interface at all if
+ SBCL is sufficiently new (those symbols don't exist any more, and
+ there's nothing in their place to be ignored).
+
+2006-09-21 Marco Baringer <mb(a)bese.it>
+
+ * swank.lisp (find-definitions-for-emacs): Don't return locations
+ whose CAR is :error.
+ (xref): Process whatever is returned by the various xref functions
+ with the new sanitize-xrefs functions.
+ (sanitize-xrefs): Clean up the list of xrefs to remove duplicates.
+ Patch by Dan Weinreb <dlw(a)itasoftware.com>
+
+ * slime.el (slime-goto-first-note-after-compilation): New
+ variable. This controls the behaviour of (next|prev)-note
+ immediatly after a slime-compile-and-load-file.
+ (slime-compilation-just-finished): New variable.
+ (slime-compilation-finished): Update slime-compilation-finished.
+ (slime-next-note, slime-previous-note): Respect
+ slime-compilation-just-finished.
+ (slime-autodoc-use-multiline-p): Specify the type.
+ (slime-repl-grab-old-input): Typo in docstring.
+ (slime-cheat-sheet): Deal with multiple-bindings
+ (slime-cheat-sheet-table): Update as per #lisp's suggestions.
+
+2006-09-20 Marco Baringer <mb(a)bese.it>
+
+ * slime.el (slime-cheat-sheet): New function.
+ (slime-cheat-sheet-table): New variable which specifies what the
+ cheat sheet should list.
+ (slime-read-package-name): Set require to T in the call to
+ completing read, it doesn't make any sense to switch to an
+ inexistent package.
+
+ * doc/slime.texi: Added "Tips and Tricks" chapter (need a better
+ name for this).
+
+ * swank-sbcl.lisp (fallback-source-location): Use abort-request
+ instead of error.
+ (locate-compiler-note): Say, in the error message, what data
+ caused the error.
+
+2006-09-20 Juho Snellman <jsnell(a)iki.fi>
+
+ * swank-sbcl.lisp (call-with-debugger-hook): use INVOKE-STEPPER
+ instead of calling the stepper hook manually
+
+2006-09-19 Juho Snellman <jsnell(a)iki.fi>
+
+ * swank-sbcl.lisp (call-with-debugger-hook): make the stepper
+ also work with a threaded SBCL, by binding a handler for
+ sb-ext:stepper-condition instead of relying on the one that SBCL
+ establishes on the toplevel
+
+2006-09-19 Juho Snellman <jsnell(a)iki.fi>
+
+ Extend the stepper protocol to work nicely with the SBCL stepper.
+
+ If sldb is invoked on a condition that's sldb-stepper-condition-p,
+ the sldb functions sldb-step, sldb-next and sldb-out will invoke
+ the matching backend functions for stepping into the stepped form,
+ to the next form, or out of the current function. Otherwise the
+ functions will behave like sldb-step used to (call active-stepping and
+ select the continue restart).
+
+ * swank-backend.lisp (sldb-stepper-condition-p, sldb-step-into,
+ sldb-step-next, sldb-step-out): New interface functions
+
+ * swank-sbcl.lisp (activate-stepper, condition-extras,
+ sldb-stepper-condition-p, sldb-step-into, sldb-step-next,
+ sldb-step-out): Implemented (conditional on CVS SBCL)
+ (call-with-debugger-hook): bind sb-ext:*stepper-hook* to
+ a function that binds *stack-top-hint* and invokes the debugger
+ (conditional on CVS SBCL)
+
+ * swank.lisp (define-stepper-function): new macro for defining
+ stepper-related functions, since they all follow the same form
+ (sldb-step): redefine with define-stepper-function
+ (sldb-next, sldb-out): new functions
+ (*sldb-stepping-p*): typo in docstring
+
+ * slime.el (sldb-next, sldb-out): New commands
+ (sldb-mode-map): bind sldb-next to "x" and sldb-out to "o"
+
+2006-09-18 Dan Weinreb <dlw(a)itasoftware.com>
+
+ For those cases where SLIME can't complete a user request (like
+ loading an asdf system without asdf or describing an inexistent
+ symbol) instead of signaling an error SWANK should politely inform
+ the user and return normally.
+
+ * swank.lisp (eval-for-emacs): Handle request-abort conditions.
+ (decode-keyword-arg, get-repl-result, parse-symbol-or-lose): Use
+ abort-request instead of error.
+
+ * swank-backend.lisp (request-abort): New condition.
+ (abort-request): Convenience function for signaling request-abort
+ conditions.
+ (operate-on-system): Use abort-request instead of error
+ (:swank-backend): Export the symbols abort-request and
+ request-abort.
+
+ * slime.el (slime-rex): Update docstring.
+ (slime-eval, slime-eval-async): Added new REASON parameter sent
+ along with :abort message.
+
+2006-09-14 Douglas Crosher <dcrosher(a)common-lisp.net>
+
+ * swank-scl (arglist, function-arglist, spawn): update for the SCL.
+
+2006-09-13 Brandon Bergren <bdragon(a)mailsnare.net>
+
+ * slime.el (slime-filename-translations): Fix docstring
+
+2006-09-13 Bob Halley <halley(a)play-bow.us>
+
+ * swank.lisp (format-iso8601-time): Properly handle non integer
+ time zones.
+
+2006-09-13 Taylor R Campbell <campbell(a)mumble.net>
+
+ * slime.el (slime-init-output-buffer): Initial directory and
+ package stacks should be empty.
+ (slime-repl-push-package): Push the current package, as opposed to
+ the new package, and set the new package to whatever the user
+ specified.
+ (slime-repl-pop-package): Set the current package to the top of
+ the package stack, unless it's empty.
+
+2006-09-13 Daniel Koning <dkoning(a)seas.smu.edu>
+
+ * slime.el (slime-repl-disconnect): New repl shortcut.
+
+2006-09-13 Marco Baringer <mb(a)bese.it>
+
+ * slime.el (slime-open-inspector): Added a slime-part-number
+ property to the topline so that you can slime-inspector-copy-down
+ the object being inspected. There are some cases where we have an
+ object in the inspector and we'd like to dump it to the repl but
+ we can't get at it through other means (like in back-traces).
+ (slime-insert-xrefs): Specify which file the item is in (when that
+ information is available).
+
+ * swank.lisp (format-arglist-for-echo-area): Instead of using
+ let+first+rest to destructure a form use destructuring-bind.
+ (lookup-presented-object): Added (declare (special
+ *inspectee-parts*)) to silence openmcl's compiler.
+ (inspect-object): Generate, and send to emacs, an ID for the
+ object being inspected.
+
+2006-09-01 Nikodemus Siivola <nikodemus(a)random-state.net>
+
+ * slime.el (slime-repl-matching-input-regexp): Use the portion
+ between slime-repl-input-mark and point for history search, not
+ the entire input. Patch by Ivan Shvedunov.
+
+ * swank-sbcl.lisp: Declaim SB-C:INSERT-STEP-CONDITIONS 0 for to
+ hide Swank while stepping and avoid endless mutex-acquisition
+ loops.
+
+2006-08-27 Helmut Eller <heller(a)common-lisp.net>
+
+ * swank.lisp (input-available-p, process-available-input): Use
+ READ-CHAR-NO-HANG instead of LISTEN because LISTEN suddenly
+ returns false in SBCL 0.9.?? even if we are called from a
+ fd-handler and the OPEN-STREAM-P returns true.
+
+2006-08-26 Matthias Koeppe <mkoeppe(a)mail.math.uni-magdeburg.de>
+
+ * slime.el (slime-repl-return-behaviour): Fix the defcustom type,
+ so Emacs 21.3 does not signal an error when creating a
+ customization buffer containing this variable.
+
+2006-08-25 Kai Kaminski <kai.kaminski(a)gmx.de>
+
+ * swank.lisp (lookup-presented-object): Fix for OpenMCL 1.0
+ [ppc32], which requires that the :NO-ERROR clause is last in
+ HANDLER-CASE.
+
+2006-08-24 Matthias Koeppe <mkoeppe(a)mail.math.uni-magdeburg.de>
+
+ * slime.el (slime-ensure-presentation-overlay): Provide a
+ help-echo for presentations, showing the mouse bindings.
+ (slime-presentation-around-click): New function.
+ (slime-copy-or-inspect-presentation-at-mouse)
+ (slime-inspect-presentation-at-mouse)
+ (slime-copy-presentation-at-mouse)
+ (slime-describe-presentation-at-mouse)
+ (slime-pretty-print-presentation-at-mouse): New commands.
+ (slime-copy-presentation-at-point): Removed (misnomer).
+ (slime-presentation-map): Bind mouse-2 to
+ slime-copy-or-inspect-presentation-at-mouse, so the right thing is
+ done in REPL buffers and in Inspector and Debugger buffers.
+ (slime-menu-choices-for-presentation): Use the new commands here
+ instead of inline lambdas.
+ (sldb-inspect-in-frame): Use slime-read-object here, so if point
+ is in a presentation in the debugger buffer, inspect it
+ immediately just like slime-inspect does.
+ (slime-inspect-presented-object): Removed.
+ (slime-inspect): Don't expect that "swank:init-inspector" is
+ already part of the form. Accept an optional arg "no-reset".
+ (slime-read-object): Don't add "swank:init-inspector" to the read
+ form; slime-inspect now adds it.
+
+2006-08-21 Matthias Koeppe <mkoeppe(a)mail.math.uni-magdeburg.de>
+
+ Make the values of local variables in debugger frames and values
+ of parts in the inspector accessible as presentations. In
+ particular, this allows to copy #<unreadable> values to the REPL
+ for further investigation. It also provides a context menu for
+ the values, offering to inspect, pretty-print, and describe them.
+
+ Note that the presentations are only valid as long as the
+ corresponding Inspector or Debugger buffer is open.
+
+ * swank.lisp (lookup-presented-object): Handle presentation ids
+ (:frame-var frame index), (:inspected-part part-index).
+ (init-inspector): New optional argument, reset.
+
+ * slime.el (slime-inspector-insert-ispec): Mark up all values of
+ inspected parts as presentations.
+ (sldb-insert-locals): Mark up the values of local variables as
+ presentations.
+ (slime-remove-presentation-properties): Fix for read-only buffers.
+ (slime-copy-presentation-at-point): Make it work when the current
+ buffer is not the REPL buffer.
+ (slime-menu-choices-for-presentation): Describe into a separate
+ buffer, not the REPL. New menu item, pretty-print.
+ (slime-presentation-expression): Handle presentation ids that are
+ not numbers.
+ (slime-inspect-presented-object): Don't reset the inspector if
+ already in the inspector buffer.
+
+2006-08-20 Matthias Koeppe <mkoeppe(a)mail.math.uni-magdeburg.de>
+
+ * swank.lisp (*nil-surrogate*): New.
+ (save-presented-object, lookup-presented-object): Distinguish
+ between a saved NIL and a garbage-collected object that was
+ replaced by NIL in the weak hash table.
+ (compute-enriched-decoded-arglist with-open-file): Add an IGNORE
+ declaration.
+
+2006-08-19 Matthias Koeppe <mkoeppe(a)mail.math.uni-magdeburg.de>
+
+ * slime.el (slime-parse-extended-operator-name/apply): New.
+ (slime-extended-operator-name-parser-alist): Add it to the alist.
+
+ * swank.lisp (compute-enriched-decoded-arglist): Add method for
+ handling APPLY.
+
+2006-08-14 Helmut Eller <heller(a)common-lisp.net>
+
+ * slime.el (slime-accept-process-output): Use brute-force to
+ detect whether accept-process-output can be called with a float as
+ timeout arg.
+
+ * swank-openmcl.lisp: Fix some breakage caused by the new
+ defimplementation.
+
+2006-08-11 Helmut Eller <heller(a)common-lisp.net>
+
+ * swank.lisp (close-connection, swank-error): Include backtraces
+ in our own errors.
+ (simple-serve-requests): Don't try to enter the
+ debugger if the connection is closed.
+
+ * slime.el (disconnect): Test disconnecting.
+
+ * swank-cmucl.lisp (startup-idle-and-top-level-loops): Initialize
+ MP only once.
+
+2006-08-10 Helmut Eller <heller(a)common-lisp.net>
+
+ * swank-allegro.lisp (fspec-definition-locations): Improve
+ handling of (:internal ... n) like fspecs.
+
+ * slime.el (slime-restart-inferior-lisp-aux): Remove the
+ interactive spec.
+
+ * swank-backend.lisp (definterface): Drop that incredibly
+ unportable CLOS stuff. Use plists and plain functions instead.
+ Update backends accordingly.
+
+2006-08-09 Helmut Eller <heller(a)common-lisp.net>
+
+ * slime.el (slime-find-filename-translators): CL:MACHINE-INSTANCE
+ can return nil. Silently accept that case for now.
+
+ * swank.lisp (test-print-arglist): Print a message instead of
+ signalling an error. This should avoid startup problems, in
+ particular with CormanLisp.
+ (setup-stream-indirection): Disable it for now. We should fix it,
+ if there is a need for this functionality or just remove it.
+
+ * swank-backend.lisp (definterface): Bring the old implementation
+ based on NO-APPLICABLE-METHOD back. It avoids lots of redefintion
+ warnings (but it creates more "noise" in backtraces).
+
+ * swank-*.lisp (inspect-for-emacs): Don't use defimplementation
+ for real generics.
+
+2006-07-28 Helmut Eller <heller(a)common-lisp.net>
+
+ * slime.el (slime-thread-quit): Call swank:quit-thread-browser.
+ Reported by Taylor R Campbell.
+
+2006-07-28 Willem Broekema <metawilm(a)gmail.com>
+
+ * swank-allegro.lisp: Profiling functions on Allegro (except for
+ profile-package).
+
+2006-07-24 Matthias Koeppe <mkoeppe(a)mail.math.uni-magdeburg.de>
+
+ Add support for destructuring macro arglists in arglist display,
+ form completion, and keyword completion; in particular for
+ with-open-file.
+
+ * swank.lisp (find-valid-operator-name): New, factored out from
+ arglist-for-echo-area.
+ (arglist-for-echo-area): Use it here.
+ (print-arglist): New, factored out from decoded-arglist-to-string.
+ Handle recursive arglist structures that arise in destructuring
+ macro arglists.
+ (decode-required-arg, encode-required-arg): New, handle
+ destructuring patterns.
+ (decode-keyword-arg, encode-keyword-arg, decode-optional-arg)
+ (encode-optional-arg, decode-arglist, encode-arglist): Use them
+ here to handle destructuring patterns.
+ (print-decoded-arglist-as-template): Change interface, handle
+ destructuring patterns.
+ (decoded-arglist-to-template-string): Use it here.
+ (enrich-decoded-arglist-with-keywords): New, factored out from
+ enrich-decoded-arglist-with-extra-keywords.
+ (enrich-decoded-arglist-with-extra-keywords): Use it here.
+ (compute-enriched-decoded-arglist): New generic function, factored
+ out from arglist-for-insertion, form-completion. Add specialized
+ method for with-open-file.
+ (arglist-for-insertion, form-completion): Use it here.
+ (arglist-ref): New.
+ (completions-for-keyword): Change interface, handle destructuring
+ macro arglists.
+
+ * slime.el (slime-enclosing-operator-names): For nesting levels
+ without operator, record nil.
+ (slime-completions-for-keyword): New argument arg-indices.
+ (slime-contextual-completions): Pass all enclosing operators and
+ arg-indices to slime-completions-for-keyword.
+
+2006-07-16 Matthias Koeppe <mkoeppe(a)mail.math.uni-magdeburg.de>
+
+ * slime.el (slime-edit-definition): Invoke the
+ slime-edit-definition-fall-back-function also in the case where
+ find-definitions-for-emacs returns an error message.
+ (slime-edit-definition-fallback-function): Fix typo (find-tag
+ rather than find-tags).
+
+2006-07-15 Juho Snellman <jsnell(a)iki.fi>
+
+ * swank-sbcl.lisp (preferred-communication-style): Remove use of
+ linux_no_threads_p alien variable (the value has been hardcoded to
+ false for about a year), so that we can also remove it from from SBCL
+ in the future.
+ (*definition-types*): defcondition -> define-condition,
+ to make slime-show-definitions display condition FOO as
+ (DEFINE-CONDITION FOO) instead of (SWANK-BACKEND::DEFCONDITION FOO).
+
+2006-07-15 Matthias Koeppe <mkoeppe(a)mail.math.uni-magdeburg.de>
+
+ * slime.el (slime-shared-lisp-mode-hook): New function, factored
+ out from slime-lisp-mode-hook.
+ (slime-lisp-mode-hook): Use it here.
+ (slime-scheme-mode-hook): New function, use
+ slime-shared-lisp-mode-hook.
+ (slime-setup): If scheme-mode is one of the slime-lisp-modes,
+ install our hook.
+
+2006-07-13 Matthias Koeppe <mkoeppe(a)mail.math.uni-magdeburg.de>
+
+ * swank.lisp (keywords-of-operator): New support function for
+ writing user-defined `extra-keywords' methods.
+
+2006-07-11 Helmut Eller <heller(a)common-lisp.net>
+
+ * swank-allegro.lisp (make-weak-key-hash-table): Use ACL's weak
+ hashtables.
+
+ * swank.asd: Set *source-directory* to the asdf component dir.
+
+2006-07-01 Lu�s Oliveira <loliveira(a)common-lisp.net>
+
+ * swank-sbcl.lisp (locate-compiler-note): Change first branch to
+ handle the changes introduced by the previous patch to
+ swank-compile-string.
+
+2006-06-26 Helmut Eller <heller(a)common-lisp.net>
+
+ * swank-sbcl.lisp (find-definitions): Remove backward
+ compatibility code.
+
+2006-06-26 Lu�s Oliveira <loliveira(a)common-lisp.net>
+
+ * swank-sbcl.lisp (tmpnam, temp-file-name): New functions.
+ (swank-compile-string): Create temporary file with the string and
+ compile-file it instead of compiling an anonymous lambda, as
+ before, in order to better handle eval-when forms.
+
+2006-06-25 Helmut Eller <heller(a)common-lisp.net>
+
+ * swank-source-path-parser.lisp (suppress-sharp-dot): Return a
+ unique symbol to avoid multiple entries for nil at toplevel in the
+ source-map.
+
+ * slime.el (test compile-defun): Add a test for #. reader macro at
+ toplevel.
+ (slime-run-one-test): New command.
+ (sldb-activate): Recreate the sldb buffer if it doesn't
+ exist. (Can happen if someone kills the buffer manually.)
+ (slime-wait-condition): Add a dummy to slime-stack-eval-tags while
+ waiting so that the SLDB enters a recursive edit.
+
+2006-06-18 Matthias Koeppe <mkoeppe(a)mail.math.uni-magdeburg.de>
+
+ * slime.el (slime-echo-arglist): Simplify, just use slime-autodoc.
+
+ * swank.lisp (arglist): Distinguish between provided actual args
+ and required formal args using the new slot provided-args.
+ (form-completion): Likewise.
+ (decoded-arglist-to-string): Use it here to display the argument
+ list (make-instance 'CLASS-NAME ...) rather
+ than (make-instance (quote CLASS-NAME) ...).
+
+ * swank.lisp (extra-keywords change-class): Don't drop the first
+ argument.
+
+ * slime.el (slime-parse-extended-operator-name): Don't move
+ point; fixes infinite loop.
+
+2006-06-17 Matthias Koeppe <mkoeppe(a)mail.math.uni-magdeburg.de>
+
+ * slime.el (slime-parse-extended-operator-name/cerror): Handle
+ cerror and change-class with :make-instance.
+ (slime-extended-operator-name-parser-alist): Handle change-class.
+ (slime-parse-extended-operator-name)
+ (slime-enclosing-operator-names): Fix the case when point is
+ within the operator.
+
+ * swank.lisp (operator-designator-to-form): Handle cerror and
+ change-class with :make-instance.
+
+2006-06-16 Matthias Koeppe <mkoeppe(a)mail.math.uni-magdeburg.de>
+
+ * swank.lisp (operator-designator-to-form): Handle :cerror.
+ (extra-keywords cerror): Make it work.
+
+ * slime.el (slime-parse-extended-operator-name)
+ (slime-parse-extended-operator-name/make-instance)
+ (slime-parse-extended-operator-name/defmethod): New functions,
+ factored out from slime-enclosing-operator-names.
+ (slime-parse-extended-operator-name/cerror): New function.
+ (slime-extended-operator-name-parser-alist): New variable.
+ (slime-enclosing-operator-names): Use them here.
+
+2006-06-14 Matthias Koeppe <mkoeppe(a)mail.math.uni-magdeburg.de>
+
+ * slime.el (slime-goto-definition): If all definitions of a name
+ have the same location, go there directly rather than presenting
+ an xref buffer.
+
+2006-06-11 Douglas Crosher <dcrosher(a)common-lisp.net>
+
+ * swank-scl (ext:stream-write-chars): update for SCL 1.3.
+
+2006-06-09 Alan Ruttenberg <alanr-l(a)mumble.net>
+
+ * swank-abcl: Update to cvs version of abcl and warnings errors
+ when compiling in a buffer will now be properly caught by slime vs
+ current behavior of always saying 0 errors 0 warnings and printing
+ them in the repl instead
+
+2006-05-31 Nathan Bird <nathan(a)acceleration.net>
+
+ * swank.lisp (*sldb-quit-restart*): New variable.
+ (throw-to-toplevel): Use the restart named by *sldb-quit-restart*
+ as opposed to hard coding abort-request.
+
+2006-05-30 Tobias Rittweiler <tcr(a)freebits.de>
+
+ * slime.el (slime-get-temp-buffer-create): New keyword REUSEP
+ which indicates whether an already-existing buffer named like the
+ buffer to be created should be reused, i.e. not killed, then
+ freshly created. Update docstring accordingly.
+ (slime-with-output-to-temp-buffer): Make &optional arg MODE an
+ &key keyword arg. Add REUSEP keyword.
+ (slime-macroexpansion-minor-mode-map): Make remapped `undo' update
+ highlighted edits in the macroexpansion buffer.
+ (slime-eval-macroexpand-in-place): Update highlighted edits when
+ macroexpanding in-place.
+ (slime-eval-macroexpand): Reuse macroexpansion buffer if it exists
+ already to preserve `undo' functionality.
+
+2006-05-30 Tobias Rittweiler <tcr(a)freebits.de>
+
+ * slime.el (slime-use-autodoc-mode): Fix typo in docstring.
+ (slime-use-highlight-edits-mode): New variable, analogous to
+ SLIME-USE-AUTODOC-MODE.
+ (slime-setup, slime-lisp-mode-hook): Make above variable
+ work. Also, activates the HIGHLIGHT-EDITS-MODE in proper way (thus
+ avoiding the nasty "Toggling ... off; better pass an explicit
+ argument." message.)
+
+ * slime.el: Fix typo in comment about communication protocol.
+
+2006-05-27 Alan Ruttenberg <alanr-l(a)mumble.net>
+ * swank-abcl: slot-boundp-using-class slot-value-using-class so you
+ can inspect instances
+
+2006-05-26 Tobias C. Rittweiler <tcr(a)freebits.de>
+
+ * slime.el (slime-eval-macroexpand-inplace): Fix out-of-range
+ error on in-place macroexpand when point is placed at a closing
+ parenthesis. In this case the sexp closed by that paren is
+ expanded.
+ Also make expanding of expressions work that are quoted like, for
+ instance, "'(FOO BAR)" if point is placed at the opening paren.
+
+2006-05-24 Brian Downing <bdowning(a)lavos.net>
+
+ * swank.lisp (recursively-compute-most-completions & friends):
+ Micro-optimize the fuzzy completion engine, improving performace
+ by a factor of about 4 on SBCL. However, it will only work on
+ simple-strings now, and CHAR= is burned in instead of being an
+ option. I don't think this is too much of a limitation. At this
+ point rendering the results on the emacs side takes much longer
+ than finding them for long result lists.
+
+2006-05-24 Alan Ruttenberg <alanr-l(a)mumble.net>
+ * swank-abcl: Add some more mop functions to you can inspect classes,
+ generic functions, methods, slots.
+
+2006-05-16 Marco Baringer <mb(a)bese.it>
+
+ * slime.el (slime-repl-return-behaviour): New variable which
+ controls slime-repl-return's heaviour.
+ (slime-repl-return): Respect slime-repl-return-behaviour.
+
+2006-05-14 Marco Baringer <mb(a)bese.it>
+
+ * slime.el (slime-macroexpansion-minor-mode-map): Rebind 'undo' to
+ set buffer-read-only temporarily to t.
+ (slime-repl-return): Only send repl input if point is past a
+ complete form.
+
+2006-05-12 Matthias Koeppe <mkoeppe(a)mail.math.uni-magdeburg.de>
+
+ * swank.lisp (update-indentation-information): Fix for problem
+ with Allegro CL 8.0: If I type M-x slime-update-indentation,
+ Allegro CL starts growing until it hits a STORAGE-CONDITION or
+ even segfaults.
+
+2006-05-04 Matthias Koeppe <mkoeppe(a)mail.math.uni-magdeburg.de>
+
+ * swank-allegro.lisp (fspec-definition-locations): Handle
+ :top-level-form entries that appear in backtraces.
+
+2006-04-20 Marco Baringer <mb(a)bese.it>
+
+ * swank-openmcl.lisp (toggle-trace): Implemented. Currently only
+ provides 'best effort' support, :labels and :flet are ignored,
+ :defmethod and :call are treated like a normal trace of the
+ operator.
+
+2006-04-20 Helmut Eller <heller(a)common-lisp.net>
+
+ * swank.lisp (*use-dedicated-output-stream*): Make it nil by
+ default to avoid race conditions.
+
+2006-04-19 Christophe Rhodes <csr21(a)cam.ac.uk>
+
+ * doc/Makefile (contributors.texi): use texinfo macros for
+ accented characters.
+
+ * ChangeLog: canonize Gabor Melis' spelling, otherwise he appears
+ twice in the "Hackers of the good Hack table"
+
+ * doc/slime.texi (nyorsko): delete
+ (EDITION): make it say 2.0
+
+2006-04-19 Christophe Rhodes <csr21(a)cam.ac.uk>
+
+ * swank.lisp (decoded-arglist-to-string): if the keyword and the
+ variable are different, print the keyword name with escapes.
+ (encode-keyword-arg): get the keyword and the arg-name the same
+ way round as in lambda lists.
+ (appliable-methods-keywords): use
+ swank-mop:compute-applicable-methods-using-classes and
+ compute-applicable-methods in the AMOP-friendly way, to get EQL
+ specializers right.
+ (class-from-class-name-form, extra-keywords/slots): new.
+ (extra-keywords/make-instance): use new functions. Also get
+ keywords from SHARED-INITIALIZE (after Dan Barlow) and
+ ALLOCATE-INSTANCE.
+ (extra-keywords/change-class): new.
+ (extra-keywords (eql 'change-class)): new. Won't work at present,
+ just as the CERROR case doesn't work.
+
+2006-04-19 Christophe Rhodes <csr21(a)cam.ac.uk>
+
+ * swank-sbcl.lisp (preferred-communication-style): Make it nil
+ under win32, for now.
+
+ * doc/slime.texi: document nil *communication-style*
+
+2006-04-18 Espen Wiborg <espenhw(a)grumblesmurf.org>
+
+ * swank-corman.lisp: Define a class file-stream to let swank.lisp
+ load.
+
+2005-04-17 Andras Simon <andras(a)renyi.hu>
+
+ * swank-abcl.lisp: (accept-connection): New argument: timeout.
+
+2006-04-14 Gerd Flaig <gefla(a)pond.sub.org>
+
+ * slime.el (slime-autodoc): Fix reference to unbound variable.
+
+2006-04-13 Martin Simmons <martin(a)lispworks.com>
+
+ * swank-loader.lisp (load-site-init-file, swank-source-files): Fix
+ pathname construction to take all unspecified components from the
+ directory pathname, in particular the drive letter on Windows.
+
+2006-04-13 Helmut Eller <helmut(a)common-lisp.net>
+
+ * slime.el (slime-find-filename-translators): Use assoc-if instead
+ of assoc-default for XEmacs compatibility.
+ (slime-show-note-counts): Don't show the highlighting bit as it
+ spills of the screen.
+ (slime-highlight-notes): Use with-temp-message.
+ (with-temp-message): Define it for XEmacs.
+ (slime-beginning-of-symbol): Use eq instead of char-equal as
+ char-equal signals an error at the beginning of a buffer.
+
+2006-04-13 Douglas Crosher <dcrosher(a)common-lisp.net>
+
+ * swank-scl (make-socket-io-stream): set the stream to ignore
+ character conversion errors, and to substitute the character #\?.
+ Without this the communication channel is prone to lockup when a
+ conversion error occurs.
+
+ * swank-scl (inspect-for-emacs function): correct the index into the
+ closure environment; it was reading off the end of the closure
+ environment and picking up a corrupting value.
+
+ * swank-scl (mailbox): rework the mailbox implementation to better
+ handle interruption. Use a polling loop rather than condition
+ variables because interrupting a condition variable wait leaves the
+ thread with the condition variable lock held and leads to a deadlock
+ error.
+
+2006-04-12 Robert Macomber <slime(a)rojoma.com>
+
+ * swank-backend.lisp (make-recursive-lock): New interface
+ function.
+ (call-with-recursive-lock-held): New interface function.
+
+ * swank-grey.lisp (class slime-output-stream): Added recursive
+ locking to class and generic functions specialized on it.
+ (clss slime-input-stream): Added recursive locking to class and
+ generic functions specialized on it.
+
+ * swank-sbcl.lisp (make-recursive-lock): Implement the new interface.
+ (call-with-recursive-lock): Implement the new interface.
+
+2006-04-01 Matthew D. Swank <akopa(a)charter.net>
+
+ * slime.el (slime-fontify-string): Use set-text-properties, not
+ propertize, for Emacs 20 compatibility.
+
+2006-03-30 Helmut Eller <heller(a)common-lisp.net>
+
+ * slime.el (slime-init-command): Don't translate filenames since
+ the new scheme doesn't work without a connection.
+ (slime-to-lisp-filename,slime-from-lisp-filename): Remove some
+ redundancy.
+ (slime-macroexpansion-minor-mode): Make it Emacs 20 compatible.
+
+2006-03-29 Matthias Koeppe <mkoeppe(a)mail.math.uni-magdeburg.de>
+
+ * slime.el (slime-repl-mode): Enable autodoc-mode if
+ slime-use-autodoc-mode is true.
+
+2006-03-28 Matthias Koeppe <mkoeppe(a)mail.math.uni-magdeburg.de>
+
+ * swank.lisp (multiple-value-or): New macro.
+
+ * slime.el (slime-recently-visited-buffer): Ignore internal
+ buffers (starting with a space), to avoid selecting the
+ *slime-fontify* buffer. Reported by Andreas Fuchs.
+
+ * slime.el (slime-enclosing-operator-names): Handle forms similar
+ to make-instance (make-condition, error, etc.), to get extra
+ keywords based on the condition class.
+
+ * swank.lisp (operator-designator-to-form): Handle forms similar
+ to make-instance (make-condition, error, etc.)
+ (extra-keywords/make-instance): New function.
+ (extra-keywords): Specialize on operators make-condition, error,
+ signal, warn, cerror. Use multiple-value-or.
+
+2006-03-27 Marco Baringer <mb(a)bese.it>
+
+ * slime.el (slime-make-tramp-file-name): If emcas' tramp has
+ tramp-multi-methods then pass the method parameter to
+ tramp-make-tramp-file-name, otherwise don't.
+ (slime-create-filename-translator): Use
+ slime-make-tramp-file-name.
+
+2006-03-27 Matthias Koeppe <mkoeppe(a)mail.math.uni-magdeburg.de>
+
+ * hyperspec.el (common-lisp-hyperspec-strip-cl-package): New
+ function.
+ (common-lisp-hyperspec): Don't get confused by a cl: or
+ common-lisp: package prefix.
+
+ * slime.el (slime-hyperspec-lookup): Don't get confused by a cl:
+ or common-lisp: package prefix.
+
+2006-03-26 Matthias Koeppe <mkoeppe(a)mail.math.uni-magdeburg.de>
+
+ * slime.el (slime-enclosing-operator-names): Fix for situation
+ when point is at end of buffer, as it happens often in the REPL.
+
+2006-03-25 Matthias Koeppe <mkoeppe(a)mail.math.uni-magdeburg.de>
+
+ * swank.lisp (arglist-for-echo-area): New keyword arg,
+ print-lines.
+ (decoded-arglist-to-string): New function, implement argument
+ highlighting also for &optional and &rest/&body arguments.
+ (arglist-to-string): Use decoded-arglist-to-string.
+ (arglist): New slots aux-args, known-junk, unknown-junk.
+ (nreversef): New macro.
+ (decode-arglist, encode-arglist): Refine to handle more structure
+ in argument lists, including implementation-defined stuff like
+ &parse-body.
+ (format-arglist-for-echo-area): New keyword arg, print-lines.
+ Simplify the code as there is no need to fall back to the unparsed
+ arglist any more.
+
+ * slime.el (slime-fontify-string): Fix for arguments spanning
+ multiple lines.
+ (slime-autodoc-message-dimensions): New.
+ (slime-autodoc-thing-at-point): Use it here to either ask for a
+ one-line or a nicely formatted multi-line arglist.
+ (slime-enclosing-operator-names): Handle linebreaks.
+
+2006-03-24 Mikel Bancroft <mutandiz(a)yahoo.com>
+
+ * swank-allegro.lisp (set-default-directory): Fix for pathnames
+ without a trailing slash.
+
+2006-03-24 Matthias Koeppe <mkoeppe(a)mail.math.uni-magdeburg.de>
+
+ * slime.el (slime-background-activities-enabled-p): Allow
+ "background activities" in sldb-mode.
+ (slime-autodoc-message-ok-p): Allow autodoc in sldb-mode.
+ (sldb-mode-syntax-table): New variable.
+ (sldb-mode): Enable autodoc-mode when slime-use-autodoc-mode is
+ true. Use sldb-mode-syntax-table to make #<...> balance like
+ parentheses. This enables autodoc-mode to match #<unreadable>
+ actual arguments in the backtraces with formal arguments of the
+ function.
+ (slime-beginning-of-symbol, slime-end-of-symbol): Handle
+ es::|caped| symbols.
+ (slime-enclosing-operator-names): Use syntax table to check
+ whether we are at the beginning of a balanced expression.
+
+2006-03-23 Christophe Rhodes <csr21(a)cam.ac.uk>
+
+ * swank.lisp (ed-in-emacs): Allow conses as function names.
+ Ensure that there is a connection to emacs before sending the
+ :ed message.
+
+ * slime.el (slime-edit-definition): read names, not symbols.
+ (slime-ed): handle conses whose car is not a string as function
+ names.
+
+2006-03-23 Matthias Koeppe <mkoeppe(a)mail.math.uni-magdeburg.de>
+
+ * slime.el (slime-qualify-cl-symbol-name): Strip leading colon
+ from package names for qualifying symbols.
+ (slime-call-defun): New command.
+ (slime-keys): Bind it to C-c C-y.
+ (slime-easy-menu): Show it in the menu.
+
+ * slime.el (slime-autodoc-use-multiline-p): New defcustom.
+ (slime-autodoc-message): Use it here. Fix bug that autodoc
+ messages exceeding one line could not be overwritten by later
+ autodoc messages.
+ (slime-autodoc-pre-command-refresh-echo-area): Use message
+ rather than slime-background-message.
+
+ * swank.lisp (casify): Removed.
+ (casify-char, tokenize-symbol-thoroughly): New functions.
+ (parse-symbol): Use tokenize-symbol-thoroughly, so as to handle
+ |escaped symbols|. This fixes arglist display for operators with
+ strange symbol names.
+
+2006-03-23 Douglas Crosher <dcrosher(a)common-lisp.net>
+
+ * swank-backend (accept-connection): add a 'timeout argument to
+ this function.
+
+ * swank-backend (set-stream-timeout): new implementation specific
+ function. Used to set the timeout for stream operations, which
+ can help make the network connection establishment more robust.
+
+ * swank (setup-server): ignore errors from the function 'serve to
+ allow another connection to be made.
+
+ * swank (serve-connection): ensure the listener socket is closed
+ when 'dont-close is false, even if the connection attempt fails.
+
+ * swank (accept-authenticated-connection): ensure the new
+ connection is closed if the connection establishment fails. Set a
+ short stream timeout to prevent denial of survice.
+
+ * swank (open-dedicated-output-stream): ensure the listener socket
+ is closed, even if unable to open the dedicated stream. Implement
+ a timeout while waiting for a connection for the dedicate stream
+ to prevent denial of service.
+
+ * swank (create-connection): ensure the new connection is closed
+ if not successful.
+
+2006-03-22 Matthias Koeppe <mkoeppe(a)mail.math.uni-magdeburg.de>
+
+ * swank.lisp (arglist-for-echo-area): Fix when arg-indices are
+ not given.
+
+ * slime.el (slime-ed): Handle (FILENAME :charpos CHARPOS).
+
+ * swank.lisp (inspect-for-emacs): Specialize on FILE-STREAM and
+ STREAM-ERROR, offering to visit the file at the current stream
+ position as an inspector action. Useful for dealing with reader
+ errors.
+
+2006-03-20 Matthias Koeppe <mkoeppe(a)mail.math.uni-magdeburg.de>
+
+ * slime.el (slime-autodoc-pre-command-refresh-echo-area):
+ Show the last autodoc message again (movement commands clear it);
+ technique to avoid flickering, taken from eldoc.
+ (slime-autodoc-mode): Install it as a pre-command-hook.
+ (slime-autodoc-last-message): New variable.
+ (slime-autodoc-message): New function.
+ (slime-autodoc): Use them here.
+ (slime-autodoc-message-ok-p): OK to overwrite an autodoc message.
+
+ * slime.el (slime-handle-indentation-update): Also update
+ scheme-indent-function if slime-lisp-modes contains scheme-mode.
+
+2006-03-19 Matthias Koeppe <mkoeppe(a)mail.math.uni-magdeburg.de>
+
+ Highlight the formal argument corresponding to the actual
+ argument around point in the echo-area arg-list display.
+ Works most impressively when slime-autodoc-mode is enabled
+ and when one has to deal with extremely long argument lists.
+
+ * slime.el (slime-space): First insert the space, then obtain
+ information.
+ (slime-fontify-string): Also handle argument highlights.
+ (slime-enclosing-operator-names): As a secondary value, return a
+ list of the indices of the arguments to the nested operator.
+ (slime-contextual-completions): Use changed interface of
+ slime-enclosing-operator-names.
+ (slime-function-called-at-point): Removed.
+ (slime-function-called-at-point/line): Removed.
+ (slime-autodoc-thing-at-point): New.
+ (slime-autodoc): Re-implement with slime-enclosing-operator-names
+ instead of slime-function-called-at-point.
+ (slime-echo-arglist): Pass the argument indices to
+ arglist-for-echo-area.
+ (slime-autodoc-message-ok-p): Autodoc is also OK in REPL buffers.
+
+ * swank.lisp (arglist-for-echo-area): New keyword argument
+ arg-indices.
+ (arglist-to-string): New keyword argument highlight.
+ (format-arglist-for-echo-area): Likewise.
+
+2006-03-18 Matthias Koeppe <mkoeppe(a)mail.math.uni-magdeburg.de>
+
+ * slime.el (slime-goto-location-buffer): Avoid calling the
+ expensive function find-file-noselect when we are already in the
+ right buffer.
+
+ * swank.lisp (arglist-for-echo-area): Add keyword argument
+ print-right-margin.
+ (arglist-to-string, format-arglist-for-echo-area): Likewise.
+ * slime.el (slime-autodoc): Use it here to make use of the whole
+ width of the echo area for arglist display.
+
+2006-03-16 G�bor Melis <mega(a)hotpop.com>
+
+ * swank-allegro.lisp (inspect-for-emacs): Fix typo.
+
+2006-03-16 Gary King <gwking(a)metabang.com>
+
+ * swank-loader.lisp (lisp-version-string): Modified swank-loader
+ so that Allegro's alisp and mlisp programs get different
+ locations. Otherwise mlisp complains about alisp's files.
+
+2006-03-16 Marco Baringer <mb(a)bese.it>
+
+ * slime.el (slime-to-lisp-filename): Call expand-file-name before
+ passing the filename to the to-lisp function.
+
+2006-03-14 Matthias Koeppe <mkoeppe(a)mail.math.uni-magdeburg.de>
+
+ * slime.el (slime-system-history): New variable.
+ (slime-read-system-name): Use a separate history list for ASDF
+ system names.
+ (slime-note-counts-message): New variable.
+ (slime-show-note-counts): Store the note counts message for later use.
+ (slime-highlight-notes, slime-list-compiler-notes): Show a
+ progress message, keeping note counts visible.
+ (slime-find-buffer-package): Handle IN-PACKAGE forms that appear
+ in SWIG/Allegro CL wrappers.
+
+ * swank-allegro.lisp (compile-from-temp-file): Suppress Allegro's
+ redefinition warnings; they are pointless when we are compiling
+ via a temporary file.
+ (profile-report): Implement.
+
+2006-03-06 Nathan Bird <nathan(a)acceleration.net>
+
+ * slime.el (slime-create-filename-translator): use the tramp
+ methods for dissecting and building filenames.
+
+2006-03-04 Wojciech Kaczmarek <wojtekk(a)kofeina.net>
+
+ * slime.el (slime-filename-translations): Typo in example.
+ (slime-create-filename-translator): Typo in generated lambdas.
+
+2006-03-03 Marco Baringer <mb(a)bese.it>
+
+ Allow per-host (per machine-instance actually) filename
+ translation functions.
+
+ * slime.el (slime-translate-to-lisp-filename-function): removed.
+ (slime-translate-from-lisp-filename-function): removed.
+ (slime-filename-translations): New variable.
+ (slime-to-lisp-filename): Rewrote to search through available
+ transalations.
+ (slime-from-lisp-filename): idem.
+ (slime-create-filename-translator): New function.
+ (slime-add-filename-translation): New function.
+
+2006-02-27 Matthias Koeppe <mkoeppe(a)mail.math.uni-magdeburg.de>
+
+ * slime.el (slime-eval-macroexpand-inplace): Indent the inserted
+ macroexpansion.
+
+2006-02-27 Marco Baringer <mb(a)bese.it>
+
+ Provide functions for performing macroexpansion inplace, use these
+ functions in the *SLIME macroexpansion* buffer.
+
+ * slime.el (slime-macroexpansion-minor-mode): Attempt to map
+ -inplace functions to the same keys as their regular contureparts
+ in slime-mode-map.
+ (slime-eval-macroexpand-inplace): New function.
+ (slime-macroexpand-1-inplace): New function.
+ (slime-macroexpand-all-inplace): New function.
+ * doc/slime.texi: Document new macroexpansion mode.
+
+2006-02-26 Douglas Crosher <dcrosher(a)common-lisp.net>
+ * swank-scl.lisp: (ext:stream-read-chars): Correct the updating of
+ the buffer index. Fixes slime input stream problems.
+
+2006-02-25 Helmut Eller <heller(a)common-lisp.net>
+
+ * swank-loader.lisp (default-fasl-directory): Previously we return
+ only the directory-namestring which breaks SCL, because it loses
+ the host and device components. Return the complete pathname
+ instead. Patch by Douglas Crosher.
+
+ * slime.el (slime-lisp-host): New variable. Replace all references
+ to "127.0.0.1" with the variable.
+
+2006-02-25 Douglas Crosher <dcrosher(a)common-lisp.net>
+
+ * swank-backend.lisp (operate-on-system): symbol case fix for
+ SCL's lowercase mode.
+
+ * swak.lisp (setup-stream-indirection)
+ (globally-redirect-io-to-connection)
+ (revert-global-io-redirection): symbol case fixes.
+
+ * swank-scl.lisp: (inspect-for-emacs): Fixes for the inspect
+ standard-objects, and inspect array. Plus misc symbol case fixes.
+
+2006-02-22 Matthias Koeppe <mkoeppe(a)mail.math.uni-magdeburg.de>
+
+ * slime.el (slime-repl-send-input): Don't include the final
+ newline in the slime-repl-input-face overlay, thus avoid showing the
+ "Evaluation aborted" message in boldface. Don't set non-existent
+ "rear-nonsticky" overlay property; overlay stickiness is
+ controlled by make-overlay arguments.
+
+2006-02-20 Matthias Koeppe <mkoeppe(a)mail.math.uni-magdeburg.de>
+
+ Use argument list information to complete keywords contextually.
+ Example: (find 1 '(1 2 3) :s <M-TAB> --completes--> :start
+ rather than suggesting all ever-interned keywords starting with ":s".
+
+ * slime.el (slime-complete-keywords-contextually): New
+ customizable variable.
+ (slime-enclosing-operator-names): New optional argument
+ max-levels.
+ (slime-completions-for-keyword): New.
+ (slime-contextual-completions): New.
+ (slime-expand-abbreviations-and-complete): Use it instead of
+ slime-completions.
+
+ * swank.lisp (operator-designator-to-form): New, factored out from
+ arglist-for-echo-area.
+ (arglist-for-echo-area): Use it here.
+ (completions-for-keyword): New.
+ (find-matching-symbols-in-list): New.
+
+2006-02-19 Matthias Koeppe <mkoeppe(a)mail.math.uni-magdeburg.de>
+
+ * slime.el (slime-expand-abbreviations-and-complete): Scroll the
+ completions buffer if the TAB key is pressed another time, like
+ Emacs minibuffer completion does.
+
+2006-02-18 Marco Baringer <mb(a)bese.it>
+
+ * slime.el (slime-macroexpansion-minor-mode): New minor mode for
+ macroexpansion buffer. Exactly like slime-temp-buffer-mode but
+ with slime-macroexpand-again bound to "g".
+ (*slime-eval-macroexpand-expression*): New variable. introduced
+ for slime-macroexpand-again, used by slime-eval-macroexpand as
+ well.
+ (slime-eval-macroexpand): Added optional string argument which
+ defaults to (slime-sexp-at-point-or-error).
+ (slime-macroexpand-again): New function, redoes the last
+ macroexpansion.
+ (slime-sexp-at-point-or-error): New function. Like
+ slime-sexp-at-point but signals an error when slime-sexp-at-point
+ would return nil.
+ * swank-openmcl.lisp (swank-mop:compute-applicable-methods-using-classes):
+ Implement.
+
+2006-02-16 Matthias Koeppe <mkoeppe(a)mail.math.uni-magdeburg.de>
+
+ * sbcl-pprint-patch.lisp: New file, adds the annotations feature
+ to the SBCL pretty printer. This is needed for sending
+ presentations through pretty-printing streams.
+ * present.lisp [sbcl]: Load it here.
+ (slime-stream-p, write-annotation) [sbcl]: Handle pretty-streams.
+
+2006-02-10 Helmut Eller <heller(a)common-lisp.net>
+
+ * swank-allegro.lisp, swank-lispworks.lisp (inspect-for-emacs):
+ Use the backend specific method to inspect standard-objects
+ because {slot-boundp,slot-value}-using-class don't conform to the
+ MOP spec in LW and ACL.
+
+ * swank.lisp (macro-indentation): Don't count '&optional as
+ argument.
+
+ * swank-loader.lisp (default-fasl-directory): Include the SLIME
+ version.
+ (slime-version-string): New.
+
+2006-02-06 Matthias Koeppe <mkoeppe(a)mail.math.uni-magdeburg.de>
+
+ Show enriched arglists for DEFMETHOD in the echo area when the
+ user types SPC after the generic function name.
+
+ * swank.lisp (arglist-to-template-string): Unused, removed.
+ (extra-keywords): Indicate which part of the actual arglist was
+ used to determine the extra keywords. For MAKE-INSTANCE, don't
+ signal an error if the class does not exist.
+ (enrich-decoded-arglist-with-extra-keywords): Indicate which part
+ of the actual arglist was used to determine the extra keywords,
+ and whether any extra keywords were added.
+ (form-completion): Generalize to handle display of enriched formal
+ arglists.
+ (read-incomplete-form-from-string): New, factored out from
+ complete-form. Handle end-of-file.
+ (complete-form): Use it here.
+ (format-arglist-for-echo-area): Use form-completion, so as to
+ show enriched formal arglists for MAKE-INSTANCE and DEFMETHOD
+ calls.
+ (arglist-for-echo-area): Handle MAKE-INSTANCE and DEFMETHOD
+ calls.
+
+ * slime.el (slime-enclosing-operator-names): Represent
+ MAKE-INSTANCE calls by (:make-instance "CLASS-NAME"), handle
+ DEFMETHOD too.
+
+2006-02-05 Matthias Koeppe <mkoeppe(a)mail.math.uni-magdeburg.de>
+
+ * slime.el (slime-complete-form): Indent the inserted template.
+
+2006-02-04 Matthias Koeppe <mkoeppe(a)mail.math.uni-magdeburg.de>
+
+ * slime.el (slime-fontify-string): New.
+ (slime-echo-arglist, slime-arglist, slime-autodoc): Use it here to
+ fontify echo-area arglists.
+
+2006-02-02 Marco Baringer <mb(a)bese.it>
+
+ * swank-openmcl.lisp: Added imports for slot-boundp-using-class,
+ slot-value-using-class and finalize-inheritance.
+
+2006-02-01 Alan Ruttenberg <alanr-l(a)mumble.net>
+
+ * swank-abcl.lisp: define with-compilation-hooks (= funcall for now), so that you can do slime-oos
+
+2006-01-30 Ian Eslick <eslick(a)csail.mit.edu>
+
+ Show slot values for metaclasses that override the default storage
+ locations for objects slots (i.e. where the default slot-boundp
+ returns nil) in the inspector.
+
+ * swank.lisp (inspect-for-emacs standard-object): Use
+ slot-value-using-class and slot-boundp-using-class.
+
+ * swank-backend.lisp: Add slot-value-using-class and
+ slot-boundp-using-class to the swank-mop package.
+
+2006-01-26 Lu�s Oliveira <loliveira(a)common-lisp.net>
+
+ * slime.el (slime-enclosing-operator-names): detect make-instance
+ forms and collect the class-name argument if it exists and is a
+ quoted symbol.
+
+ * swank.lisp (arglist-for-echo-area): handle pairs of of the form
+ ("make-instance" . "<class-name>") by passing them to
+ format-initargs-and-initforms-for-echo-area.
+ (class-initargs-and-iniforms): New function.
+ (format-initargs-and-initforms-for-echo-area): New function.
+
+2006-01-20 M�sz�ros Levente <melevy(a)freemail.hu>
+
+ * swank-sbcl.lisp (restart-frame): Provide an implementation even
+ if it doesn't quite do what it's supposed to do.
+
+2006-01-19 Helmut Eller <heller(a)common-lisp.net>
+
+ Return to the previous loading strategy: load everything when
+ swank-loader is loaded. It's just to convenient to give that up.
+ To customize the fasl directories, the new variable
+ swank-loader:*fasl-directory* can be set before loading
+ swank-loader.
+
+ * swank-loader.lisp (*fasl-directory*, *source-directory*): New
+ variables.
+ (load-swank): Call it during loading.
+
+2006-01-14 Helmut Eller <heller(a)common-lisp.net>
+
+ * slime.el (slime-compile-defun): If point was at the opening
+ paren we wrongly used the preceding toplevel form. Fix it.
+ Reported by Chisheng Huang and Liam M. Healy.
+
+ * swank.lisp (spawn-threads-for-connection): Fix a race condition:
+ Don't accept input before all threads are ready.
+
+ Make the fasl directory customizable: load-swank must now be
+ called explicitly so that we can supply the fasl dir as argument.
+
+ * swank-loader.lisp (load-swank): New entry point.
+
+2006-01-14 Andreas Fuchs <asf(a)boinkor.net>
+
+ * slime.el (slime-selector ?r): Call slime instead of slime-start
+ to pick up the usual defaults.
+
+2005-12-31 Harald Hanche-Olsen <hanche(a)math.ntnu.no>
+
+ * slime.el (slime-open-stream-to-lisp): Inherit the
+ process-coding-system from the current connection.
+
+2005-12-27 Alan Ruttenberg <alanr-l(a)mumble.net>
+
+ * swank-abcl. (backtrace-as-list-ignoring-swank-calls): remove the
+ swank calls from the backtrace to make it easier to use.
+ (frame-locals): Fix a typo that caused entry into the debugger if
+ you tried to look at frame locals. Now you don't error out, but
+ you still don't see frame locals because I don't know how to get
+ them :(
+
+2005-12-27 Helmut Eller <heller(a)common-lisp.net>
+
+ Keep a history of protocol events for better bug reports.
+
+ * swank.lisp (log-event): Record the event in the history buffer.
+ (*event-history*): Buffer for events.
+ (dump-event-history): New function.
+ (close-connection): Escape non-ascii strings and include the event
+ history in the error message.
+
+2005-12-22 Helmut Eller <heller(a)common-lisp.net>
+
+ Make highlighting of modified text a minor mode. Also use
+ after-change-functions instead of rebinding all self-inserting
+ keys.
+
+ * slime.el (slime-highlight-edits-mode): New minor mode.
+ (slime-self-insert-command): Deleted.
+ (slime-before-compile-functions): New hook to decouple edit
+ highlighting from compilation.
+ (slime-highlight-edits-face): Renamed from slime-display-edit-face.
+
+2005-12-20 Marco Baringer <mb(a)bese.it>
+
+ When inspecting classes, methods and generic functions show all
+ the slots in the case that what we're inspecting is a subclass of
+ the standard class and has extra user defined slots.
+
+ * swank.lisp (all-slots-for-inspector): New function.
+ (inspect-for-emacs): Use all-slots-for-inspector.
+
+2005-12-19 Peter Seibel <peter(a)gigamonkeys.com>
+
+ * slime.el (slime-self-insert-command): Got rid of message about
+ setting up face and skipping edit-hilights when in a comment.
+
+2005-12-18 Nikodemus Siivola <nikodemus(a)random-state.net>
+
+ * slime.el (slime-mode-hook): Bind simple characters to
+ slime-self-insert-command only if there was no previous local
+ binding, and the major mode is _not_ slime-repl-mode. This
+ restores keybindings of slime-xref-mode and prevents us from
+ stomping on user bindings. The hilighting also makes no sense in
+ the REPL.
+
+2005-12-16 Nikodemus Siivola <nikodemus(a)random-state.net>
+
+ * slime.el (slime-selector-method: ?r): If no connection offer to
+ start Slime.
+
+ * swank.lisp (to-string): Handle errors from printing objects.
+ Among other things makes the inspector more robust in the face of
+ objects with unbound slots and print-methods that fail to cope.
+
+2005-12-16 William Bland <doctorbill.news(a)gmail.com>
+
+ Added hilighting of tetx which has been edited but not yet
+ compilied.
+
+ * slime.el (slime-display-edit-hilights): New variable.
+ (slime-display-edit-face): New face.
+ (slime-compile-file, slime-compile-defun, slime-compile-region):
+ Remove edits overlay.
+ (slime-remove-edits): New function.
+ (slime-self-insert-command): New function.
+ (slime-mode-hook): Rebind simple characters to
+ slime-self-insert-command.
+
+2005-12-07 Matthias Koeppe <mkoeppe(a)mail.math.uni-magdeburg.de>
+
+ * swank-allegro.lisp (find-definition-in-file)
+ (find-fspec-location, fspec-definition-locations): Allegro CL
+ properly records all definitions made by arbitrary macros whose
+ names start with "def". Use excl::find-source-file and
+ scm:find-definition-in-definition-group (rather than
+ scm:find-definition-in-file) to find them.
+
+ * slime.el (slime-load-file): Change the default to be the buffer
+ file name with extension. This is more convenient for files like
+ .asd files that do not have the default source file extension.
+ (slime-save-some-lisp-buffers, slime-update-modeline-package):
+ Handle all files with major mode in slime-lisp-modes, not just
+ lisp-mode.
+
+2005-12-06 Juho Snellman <jsnell(a)iki.fi>
+
+ * swank-sbcl.lisp (function-source-location,
+ safe-function-source-location): Oops, define these functions also
+ for the >0.9.6 case. Fixes broken sldb-show-source on SBCL 0.9.7.
+
+2005-12-05 Helmut Eller <heller(a)common-lisp.net>
+
+ * slime.el (slime-find-coding-system): Use check-coding-system
+ only if it's actually fbound.
+
+2005-11-22 Marco Monteiro <masmxx(a)gmail.com>
+
+ * slime.el (slime-connect): Use slime-net-coding system if the
+ optional arg coding-system was not supplied.
+
+2005-11-22 Helmut Eller <heller(a)common-lisp.net>
+
+ * slime.el (slime-compile-file): Call 'check-parens before
+ compiling.
+ (slime-compile-file): Call 'check-parens before compiling.
+ (slime-find-coding-system): Return nil if the coding system
+ isn'tvalid instead of singalling an error.
+ (slime-repl-history-file-coding-system): Use
+ slime-find-coding-system to find the default.
+
+ * swank-cmucl.lisp (accept-connection): Remove fd-handlers if the
+ encoding isn't iso-latin-1.
+
+2005-11-21 Helmut Eller <heller(a)common-lisp.net>
+
+ * slime.el (slime-start): Don't set slime-net-coding-system ..
+ (slime-read-port-and-connect): .. read it from the inferior lisp args.
+ (slime-connect): Take the coding-system as third argument.
+ (slime-repl-history-file-coding-system): New user option.
+ (slime-repl-safe-save-merged-history): New function. Use it in
+ hooks so that bad coding systems don't stop us from exiting.
+ (slime-repl-save-history): Include the coding-system which was
+ used to save the buffer.
+ (repl-shoctut change-package): Add alias ,in and ,in-package.
+ (slime-eval-macroexpand): Error out early if there's no sexp at
+ point.
+ (slime-compiler-macroexpand): New command.
+ (slime-inspector-pprint): New command.
+
+ * swank-cmucl.lisp (inspect-for-emacs): Add support for
+ funcallable instances.
+
+ * swank.lisp (pprint-inspector-part, swank-compiler-macroexpand): New.
+
+ * swank-backend.lisp (compiler-macroexpand)
+ (compiler-macroexpand-1): New functions.
+
+2005-11-14 Douglas Crosher <dcrosher(a)common-lisp.net>
+
+ * swank-scl.lisp (accept-connection): handle the :buffering argument.
+
+2005-11-13 Andras Simon <andras(a)renyi.hu>
+
+ * swank-abcl.lisp: (accept-connection): New argument: buffering.
+
+2005-11-13 Andras Simon <andras(a)renyi.hu>
+
+ * swank-abcl.lisp: Steal auto-flush stuff from swank-sbcl.lisp
+
+2005-11-11 Helmut Eller <heller(a)common-lisp.net>
+
+ * swank.lisp (*dedicated-output-stream-buffering*): New variable
+ to customize the buffering scheme. For single-threaded Lisps we
+ disable buffering because lazy programmers forget to call
+ finish-output.
+ (open-dedicated-output-stream): Use it.
+
+ * swank-backend.lisp, swank-allegro.lisp, swank-lispworks.lisp,
+ swank-openmcl.lisp, swank-cmucl.lisp, swank-sbcl.lisp,
+ swank-clisp.lisp, swank-abcl.lisp, swank-corman.lisp,
+ swank-ecl.lisp (accept-connection): New argument: buffering.
+
+ * slime.el (slime-repl-save-history): When the history exceeds
+ slime-repl-history-size remove the old not the new entries.
+ Some renaming:
+ slime-repl-read-history -> slime-repl-load-history,
+ slime-repl-read-history-internal -> slime-repl-read-history.
+ (slime-eval-macroexpand): Call font-lock-fontify-buffer
+ explicitly, because with certain Emacs versions the buffer doesn't
+ get fontified immediately.
+
+2005-11-07 Helmut Eller <heller(a)common-lisp.net>
+
+ * slime.el (slime-eval-macroexpand): Use lisp-mode (and
+ font-lock-mode) when dispaying the expansion. Suggested by Jan
+ Rychter.
+
+ * swank-source-path-parser.lisp (make-source-recording-readtable):
+ Suppress the #. reader-macro.
+
+2005-11-06 Juho Snellman <jsnell(a)iki.fi>
+
+ * swank-sbcl.lisp (find-definitions, make-source-location-specification
+ make-definition-source-location, source-hint-snippet): As of
+ SBCL 0.9.6.25 SB-INTROSPECT has better support for finding
+ source locations. Use as much of it in swank-sbcl as possible.
+ (Original version left reader-conditionalized for older SBCLs).
+
+2005-11-04 Helmut Eller <heller(a)common-lisp.net>
+
+ * swank.lisp (connection-info): Docfix.
+
+ * slime.el (slime-set-connection-info): Generate a new connection
+ name only if the implementation-name and the inferior-lisp-name
+ are different.
+
+2005-10-31 Helmut Eller <heller(a)common-lisp.net>
+
+ * slime.el (slime-start, slime-lookup-lisp-implementation)
+ (slime-set-connection-info): Add a :name property for the
+ implementation and use it to derive the connection-name.
+ (slime-lisp-implementation-name): Renamed from
+ slime-lisp-implementation-type-name.
+
+ * swank.lisp (simple-serve-requests): Add an extra abort restart.
+ (connection-info): Rename :type-name to :name.
+
+2005-10-30 Andras Simon <andras(a)renyi.hu>
+
+ * swank-abcl.lisp (inspect-for-emacs): Track mop changes in ABCL.
+
+2005-10-30 Helmut Eller <heller(a)common-lisp.net>
+
+ * slime.el (slime-eval): Ensure that the connection is open before
+ waiting for input.
+
+ * swank.lisp (simple-serve-requests): Close the connection at the
+ end.
+
+2005-10-23 Harald Hanche-Olsen <hanche(a)math.ntnu.no>
+
+ * slime.el (slime-init-keymaps): Use vectors when defining keys,
+ because e.g. (define-key (string ?\C-c) ...) doesn't work in the
+ emacs-unicode-2 branch.
+
+2005-10-23 Stefan Kamphausen <skampi(a)gmx.net>
+
+ * slime.el (slime-repl-history-size, slime-repl-history-file): Use
+ defcustom to declare the variables.
+
+2005-10-23 G�bor Melis <mega(a)hotpop.com>
+
+ * swank-backend.lisp (install-debugger-globally): new interface
+ function
+
+ * swank.lisp (install-debugger): call install-debugger-globally
+
+ * swank-sbcl.lisp (install-debugger-globally): set
+ sb-ext:*invoke-debugger-hook* too
+
+2005-10-23 Helmut Eller <heller(a)common-lisp.net>
+
+ * swank-sbcl.lisp (make-stream-interactive): Spawn a thread to
+ flush interactive streams in reasonably short intervals.
+ Remove the old backward-compatible threading implementation.
+
+ * swank.lisp (package-string-for-prompt): Respect *print-case*.
+
+2005-10-21 Helmut Eller <heller(a)common-lisp.net>
+
+ * slime.el (slime-start-swank-server): Avoid comint-send-input
+ here as it seems to trigger a bug in ansi-color-for-commit-mode.
+
+2005-10-18 Douglas Crosher <dcrosher(a)common-lisp.net>
+
+ * swank.lisp (canonical-package-nickname): always return the
+ package name as a STRING if found. This restores the printing of
+ package names as strings.
+
+2005-10-17 Marco Baringer <mb(a)bese.it>
+
+ * swank.lisp (eval-in-emacs): Instead of taking a string and
+ attempting to parse it emacs side the function now takes a form
+ and converts it to a string internally. This should allow users of
+ the function to not have to worry about quoting issues and emacs'
+ different printed represenation for, among other things,
+ characters.
+ (process-form-for-emacs): New function. Converts a list into a
+ string for passing to emacs.
+
+ * slime.el (slime-eval-for-lisp): New API. This function now takes
+ a single string, representing the form to evaluate, and uses
+ emacs' read function to convert it into a form before eval'ing it.
+ (slime-dispatch-event): The :eval event now passes a single
+ string (instead of a string and something looking kind of like a
+ form).
+
+2005-10-15 Douglas Crosher <dcrosher(a)common-lisp.net>
+
+ * swank-scl.lisp: Support for Scieneer Common Lisp.
+
+ * swank-backend.lisp (*gray-stream-symbols*) Scieneer Common Lisp
+ implements stream-line-length.
+
+ * swank-loader.lisp: Support for Scieneer Common Lisp:
+ (*sysdep-pathnames*) use swank-scl.
+ (*impl ementation-features*) add :scl.
+ (*os-features*) add :hpux.
+ (*architecture-features*) add :amd64, :i686, :i486, :sparc64, :sparc,
+ :hppa64, and :hppa.
+
+ * swank.lisp: (*canonical-package-nicknames*) use lowercase
+ symbols to name the packages. This supports CL implementations
+ with lowercase default symbol names, such as Scieneer Common Lisp,
+ while still being compatible with ANSI-CL.
+
+2005-10-11 Stefan Kamphausen <skampi(a)gmx.net>
+
+ * slime.el: Persistent REPL history. The history from REPL
+ buffers is now saved to the file ~/.slime-history.eld. The file
+ is read on startup and saved when a REPL buffer gets killed or
+ when Emacs exits. There are also commands to save or read the
+ history file.
+ (slime-repl-save-merged-history, slime-repl-merge-histories)
+ (slime-repl-read-history, slime-repl-save-history): New functions.
+ (slime-repl-history-file, slime-repl-history-size): New vars.
+ (slime-repl-mode): Add hooks to load and save the history.
+
+2005-10-11 Helmut Eller <heller(a)common-lisp.net>
+
+ * slime.el (slime-read-interactive-args): Split the string
+ inferior-lisp-program to get the values for :program and
+ :program-args. Also let slime-lisp-implementations take
+ precedence if non-nil.
+ (slime-lisp-implementations): Renamed from
+ slime-registered-lisp-implementations.
+
+ * swank.lisp (force-user-output): There seems to be a bug in
+ Allegro's two-way-streams. As a workaround we use force-output for
+ the user-io stream. (finish-output *debug-io*) still triggers the
+ bug.
+
+2005-10-10 Svein Ove Aas <svein.ove(a)aas.no>
+
+ * swank-allegro.lisp (find-external-format): Translate :utf-8-unix
+ to :utf8, which Allegro 7.0 understands.
+
+2005-10-09 Helmut Eller <heller(a)common-lisp.net>
+
+ * slime.el (slime, slime-start): Introduce a separate function for
+ the non-interactive case. `slime-start' takes lots of keyword
+ arguments and `slime' is reserved for interactive use.
+ (slime-read-interactive-args): New function.
+ (slime-maybe-start-lisp, slime-inferior-lisp)
+ (slime-start-swank-server): Pass all arguments needed to start
+ the subprocess as a property list. Also store this list in a
+ buffer-local var in the inferior-lisp buffer, so that we can
+ cleanly restart the process.
+ (slime-registered-lisp-implementations): Change the format and
+ document it. M-- M-x slime can now be used select a registered
+ implementation.
+ (slime-symbolic-lisp-name): Deleted. And updated all the functions
+ which passed it along.
+ (slime-set-connection-info): Use the new format.
+ (slime-output-buffer): Don't re-initialize buffer-local variables
+ if the buffer already exists. This saves the history. From Juho
+ Snellman.
+
+ * swank-cmucl.lisp (sis/in): Use finish-output instead of
+ force-output.
+
+ * swank.lisp (connection-info): Include the initial package and
+ a more self-descriptive format.
+
+2005-10-01 Juho Snellman <jsnell(a)iki.fi>
+
+ * swank-backend (*gray-stream-symbols*): Add :STREAM-LINE-LENGTH
+ to *GRAY-STREAM-SYMBOLS* on implementations that support this
+ extension to gray streams. Reported by Matthew D Swank.
+
+2005-09-29 Luke Gorrie <luke(a)synap.se>
+
+ * swank-scheme48: Removed due to excessive whining.
+
+2005-09-28 Helmut Eller <heller(a)common-lisp.net>
+
+ * slime.el (slime-multiprocessing): Deleted. No longer needed.
+ (slime-init-command): Updated accordingly.
+ (slime-current-package): Add a special case for Scheme.
+ (slime-simple-completions, slime-apropos): Quote the package,
+ because in can be a plain symbol in Scheme.
+ (slime-inspector-reinspect): Use a proper defslimefun.
+
+ * swank.lisp (inspector-reinspect): New function.
+ (start-server): Call initialize-multiprocessing before starting
+ the server and startup-idle-and-top-level-loops afterwards.
+ Calling startup-idle-and-top-level-loops here shouldn't be a
+ problem because start-server is only invoked at startup via stdin.
+
+ * swank-scheme48/source-location.scm: New file. For M-.
+ * swank-scheme48/module.scm (list-all-package): New function.
+ * swank-scheme48/interfaces.scm (module-control-interface): Export it.
+ * swank-scheme48/inspector.scm: Add methods for records and hashtables.
+ (swank:arglist-for-echo-area): Implement it. Only works for
+ functions with enough debug-data (ie. only user-defined functions).
+ * swank-scheme48/completion.scm: New file.
+ (swank:simple-completions, swank:apropos-list-for-emacs): Implemented.
+ * swank-scheme48/load.scm, swank-scheme48/defrectypeX.scm: Renamed
+ the file from defrectype*.scm
+ * swank-scheme48/packages.scm (swank-general-rpc): Don't use
+ posix-process because it doesn't work on Windows, and we don't need
+ it for a mulithreaded server.
+
+2005-09-22 Helmut Eller <heller(a)common-lisp.net>
+
+ * swank-backend.lisp (*gray-stream-symbols*): Collect the needed
+ symbols here, so that we don't need to mention them in every
+ backend.
+ (import-from). New function.
+
+ * swank-sbcl.lisp, swank-allegro.lisp, swank-lispworks.lisp,
+ swank-openmcl.lisp, swank-ecl.lisp: Use *gray-stream-symbols* when
+ importing the needed symbols.
+
+ * swank-gray.lisp (stream-fresh-line): Define a method, so that
+ Allegro passes our tests.
+
+2005-09-21 Aleksandar Bakic <a_bakic(a)yahoo.com>
+
+ * swank.lisp (accept-authenticated-connection): Minor fix. Ensure
+ that the decoded message is a string before calling string= on it.
+
+2005-09-21 Helmut Eller <heller(a)common-lisp.net>
+
+ * slime.el (slime-setup-command-hooks): Make
+ after-change-functions a buffer-local variable; it's by default
+ global in XEmacs.
+
+ * swank.lisp (throw-to-toplevel): Invoke the `abort-restart'
+ request instead of throwing to the `slime-toplevel' catch tag.
+ (handle-request): Rename the restart from abort to abort-request.
+ (call-with-connection): Remove the slime-toplevel catch tag
+ because with-connection is used in far to many places which aren't
+ at "toplevel".
+
+ * present.lisp (presentation-start, presentation-end): Use
+ finish-output instead of force-output.
+
+ * swank-gray.lisp, swank-cmucl.lisp: Improve stream efficiency by
+ buffering more output. stream-force-output simply does nothing, if
+ the output buffer was flushed less than 200 millisecons before.
+ stream-finish-output can still be used to really flush the buffer.
+ (slime-output-stream): New slot last-flush-time.
+ (stream-finish-output): New function. Do what stream-force-output
+ did previously.
+ (stream-force-output): Buffer more output.
+
+ * slime.el (slime-process-available-input): Oops, don't start a
+ timer for every event.
+ (slime-write-string): Renamed from slime-output-string.
+ (slime-dispatch-event): Rename :read-output to :write-string.
+ (slime-io-speed-test): New command.
+ (slime-open-stream-to-lisp): Fix parens. The coding system should
+ also be set if presentations are disabled.
+
+ * swank.lisp (make-output-function): Rename :read-output to
+ :write-string.
+ (eval-for-emacs, interactive-eval, eval-region): Use finish-output
+ not force-output.
+
+ * swank-sbcl.lisp, swank-openmcl.lisp, swank-allegro.lisp,
+ swank-lispworks: Import `stream-finish-output'.
+
+ * swank-scheme48/io.scm (empty-swank-output-buffer): Rename
+ :read-output to :write-string.
+
+ * swank-scheme48/load.scm (slime48-start): Fix '() vs. #f bug.
+
+2005-09-19 Luke Gorrie <luke(a)synap.se>
+
+ * nregex.lisp: Released into the public domain by Lawrence E. Freil.
+
+2005-09-19 Helmut Eller <heller(a)common-lisp.net>
+
+ * slime.el (slime48): New command.
+
+2005-09-19 Taylor Campbell <campbell(a)mumble.net>
+
+ * swank-scheme48/: New backend.
+
+2005-09-18 Wolfgang Jenkner <wjenkner(a)inode.at>
+
+ * bridge.el: cl is required at macro expansion time (because of
+ `block'). Reported by Matthew D Swank.
+
+2005-09-18 Matthias Koeppe <mkoeppe(a)mail.math.uni-magdeburg.de>
+
+ * swank.lisp: Move presentation menu protocol here from present.lisp.
+
+2005-09-15 Alan Ruttenberg <alanr-l(a)mumble.net>
+ * slime.el (slime-repl-return) don't copy presentation to input if
+ already in input area.
+
+2005-09-15 Helmut Eller <heller(a)common-lisp.net>
+
+ * swank-clisp.lisp (compute-backtrace): Include only "function
+ frames" in the backtrace. I hope that makes some sense.
+ (sldb-backtrace, function-frame-p): New functions.
+ (*sldb-backtrace*, call-with-debugging-environment, nth-frame):
+ Compute and remember the backtrace when entering the debugger.
+ (arglist): If the function has a function-lambda-expression, fetch
+ the arglist from there.
+ (find-encoding): Use strings instead of 'charset:foo symbols to
+ avoid compile time problems if the charset is not available.
+ Suggested by Vaucher Laurent.
+
+ * swank.lisp (eval-in-emacs): Fix a race condition which occurred
+ with sigio.
+ (*echo-area-prefix*): New variable.
+
+ * slime.el (slime-process-available-input): Simplify it a bit and
+ make it easier to debug read errors.
+ (slime-net-close): Don't kill the buffer if the new optional arg
+ `debug' is true.
+ (slime-run-when-idle): Accept arguments for the function.
+ (slime-init-connection-state): Close over the proc variable. It
+ was lost when the async evaluation returned.
+ (slime-output-buffer, slime-connection-output-buffer): Make
+ slime-output-buffer faster by keeping the buffer in a connection
+ variable.
+ (slime-restart-inferior-lisp-aux, slime-quit-lisp): Disable the
+ process filter to avoid errors in XEmacs.
+
+2005-09-14 Alan Ruttenberg <alanr-l(a)mumble.net>
+
+ * slime.el (slime-menu-choices-for-presentation), (slime-presentation-menu)
+ Fix loss after refactoring. xemacs can't handle lambda forms in
+ the menu spec given to x-popup-menu, only symbols, so save the
+ actions in a hash table keyed by a gensym, give x-popup-menu the
+ gensym and then call the gensym. Haven't checked that it actually
+ works in xemacs because my xemacs is hosed in os x Tiger. Could
+ someone let me know...
+
+ * swank.lisp (inspect-factor-more-action)
+ rename (inspect-show-more-action) Prompt before reading how many
+ more. Would be nicer to prompt in the minibuffer...
+
+2005-09-14 Matthias Koeppe <mkoeppe(a)mail.math.uni-magdeburg.de>
+
+ * slime.el (slime-presentation-expression): Remove handling of
+ cons presentation-ids.
+
+2005-09-13 Alan Ruttenberg <alanr-l(a)mumble.net>
+
+ * slime.el (defcustom slime-ed-use-dedicated-frame ... vs defvar
+
+ (defcustom slime-when-complete-filename-expand: Use
+ comint-replace-by-expanded-filename instead of
+ comint-dynamic-complete-as-filename to complete file names
+
+ * swank.lisp (run-repl-eval-hooks .. finally (return vs no return
+
+ inspector-call-nth-action Allow second value :replace for inspector actions
+
+ (defvar *slime-inspect-contents-limit* default nil. How many elements of
+ a hash table or array to show by default. If table has more than
+ this then offer actions to view more. Set to nil for no limit. Probably should
+ set default to reasonable value - I like 200.
+
+ (inspect-for-emacs ((ht hash-table) inspector)) - banner line is hash table object.
+ Respect *slime-inspect-contents-limit*
+
+ (defmethod inspect-for-emacs ((array array) inspector)
+ Respect *slime-inspect-contents-limit*
+
+ * swank-openmcl.lisp inspector for closures shows closed-over
+ values. To be fixed: inspector-princ needs to be loaded earlier
+ since swank package not available when compiling
+
+2005-09-13 Helmut Eller <heller(a)common-lisp.net>
+
+ * present.lisp (menu-choices-for-presentation-id): Use
+ lookup-presented-object secondary return value instead of
+ *not-present*.
+ (execute-menu-choice-for-presentation-id, presenting-object-1):
+ Remove references to *can-print-presentation*.
+
+ * slime.el (slime-current-output-id): Remove this ugly klugde.
+ (slime-repl-insert-result): New function. Handle the presentations
+ and other special cases cleaner.
+ (slime-repl-insert-prompt): Use it. The `result' arg is now a
+ structured list; update callers accordingly.
+ (slime-repl-return): Make the prefix arg work again.
+ (package-updating): The result of swank::listener-eval changed a
+ bit. Update the test.
+
+ Remove some unnecessary uses of `defun*' and reindent it to 80
+ columns.
+
+ * swank.lisp: Simplify the object <-> presentation-id mapping.
+ (save-presented-object): Remove the optional `id' arg.
+ (lookup-presented-object): Id should be a fixnum not some cons
+ with fuzzy/non-documented meaning. Use the secondary return value
+ to test for absence of the id. Update callers accordingly.
+ (*not-present*): Deleted.
+
+ Remove the repl result special cases, let the general presentation
+ machinery handle it.
+ (*last-repl-result-id*, add-repl-result, *current-id*)
+ (clear-last-repl-result): Deleted.
+ (listener-eval): Don't *current-id* to tag result values.
+
+ (*can-print-presentation*): Deleted. Nobody quite knows whether
+ it's still needed so let just try without it. Updated referrers
+ accordingly.
+
+ (eval-region, run-repl-eval-hooks): Move the eval hook stuff to
+ a separate function.
+
+ * swank-loader.lisp (lisp-version-string)[cmu]: Replace spaces
+ with underscores.
+
+2005-09-12 NIIMI Satoshi <sa2c(a)sa2c.net>
+
+ * swank.lisp, slime.el, swank-clisp.lisp, swank-sbcl.lisp: add
+ EUC-JP as coding system. This patch eliminates the requirement of
+ Mule-UCS to use Japanese characters. (Nice for pre-22 Emacs
+ users.)
+
+2005-09-10 Matthias Koeppe <mkoeppe(a)mail.math.uni-magdeburg.de>
+
+ * slime.el (slime-enable-evaluate-in-emacs): Resurrected.
+ (slime-dispatch-event): Respect slime-enable-evaluate-in-emacs for
+ messages :eval-no-wait and :eval.
+
+2005-09-09 Alan Ruttenberg <alanr-l(a)mumble.net>
+ * slime.el (slime-choose-overlay-region). Don't try to overlay a
+ note if location is nil.
+
+2005-09-08 Alan Ruttenberg <alanr-l(a)mumble.net>
+
+ * bridge.el Fix bug in bridge filter where a bridge message which
+ straddled a packet would be mishandled. Sometimes this would
+ result in spurious bridge message text being inserted with the
+ presentation and the presentation not being sensitive. In other
+ cases there would be an actual error. Introduce bridge-leftovers
+ to save the last, unfinished bit for the next call, and prepend it
+ before processing a chuunk. Also, fix the parentheses so that the
+ unwind protect cleanup forms are actually in the cleanup section.
+ In openmcl, where apparently communication with slime is done in
+ 2k chunks, you can trigger the bug with something like this:
+ (swank::presenting-object 'foo t
+ (dotimes (i 2040) (write-char #\:)))
+
+ * swank-openmcl.lisp (handle-compiler-warning). Don't create a
+ location if the condition doesn't have a filename. If it does,
+ make sure you pass a string rather than a pathname object
+ otherwise you get a net-read error
+
+2005-09-07 Matthias Koeppe <mkoeppe(a)mail.math.uni-magdeburg.de>
+
+ * present.lisp (menu-choices-for-presentation): The
+ Inspect/Describe/Copy items are now provided from the Emacs side.
+ Implement all pathname menu items without having Emacs evaluate a
+ form. Fix for Lisps where ".lisp" is parsed as :name ".lisp".
+
+ * slime.el (slime-menu-choices-for-presentation): New function,
+ return a menu with Inspect/Describe/Copy plus the items that come
+ from the menu protocol.
+ (slime-presentation-menu): Security improvement for the
+ presentation menu protocol: Don't eval arbitrary forms coming from
+ the Lisp. Minor cleanup: Use x-popup-menu in the normal Emacs way,
+ associating a command with each menu item.
+
+2005-09-05 Helmut Eller <heller(a)common-lisp.net>
+
+ * swank-cmucl.lisp (background-message): New function. Forward the
+ call to the front end.
+ (pre-gc-hook, post-gc-hook): Use it.
+ (swank-sym, sending-safe-p): Deleted.
+
+ * swank.lisp (y-or-n-p-in-emacs): Simplify arglist.
+ (evaluate-in-emacs, dispatch-event, send-to-socket-io): Remove
+ evaluate-in-emacs stuff.
+ (to-string): Undo last change. to-string is not to supposed to
+ ignore errors. Bind *print-readably* instead.
+ (background-message): New function.
+ (symbol-external-p): Simplify it a little.
+
+ * slime.el (slime-setup-command-hooks): Add after-change-functions
+ only if presentations are enabled.
+ (slime-dispatch-event, slime-enable-evaluate-in-emacs)
+ (evaluate-in-emacs): Remove evaluate-in-emacs stuff. It was not
+ used and redundant.
+ (slime-save-some-lisp-buffers): Renamed from
+ save-some-lisp-buffers.
+ (slime-choose-overlay-region): Ignore :source-form locations.
+ (slime-choose-overlay-for-sexp): Ignore errors when stepping over
+ forms.
+ (slime-search-method-location, slime-goto-location-position): Move
+ all this regexpery to its own function.
+ (slime-recenter-if-needed, slime-repl-return): Factor some
+ duplicated code into its own function.
+ (slime-presentation-bounds, slime-presentation-around-point)
+ (slime-presentation-around-or-before-point): Minor cleanups.
+
+2005-09-04 Matthias Koeppe <mkoeppe(a)mail.math.uni-magdeburg.de>
+
+ * slime.el (slime-ensure-presentation-overlay): New.
+ (slime-add-presentation-properties): Don't add face, mouse-face,
+ keymap text properties. Call slime-ensure-presentation-overlay to
+ implement them via overlays.
+ (slime-remove-presentation-properties): Don't remove these text
+ properties. Delete the right overlay.
+ (slime-after-change-function): Add overlays for presentations if
+ necessary.
+ (slime-copy-presentation-at-point): Don't add face text property.
+ (slime-repl-grab-old-output): Likewise.
+
+2005-08-31 Marco Baringer <mb(a)bese.it>
+
+ * swank.lisp (to-string): Handle errors during printing of objects.
+
+2005-08-30 Alan Ruttenberg <alanr-l(a)mumble.net>
+ * slime.el (slime-mark-presentation-start/end-handler) modify
+ regexp to recognize negative presentation ids to make
+ presenting-object work with bridge mode.
+
+2005-08-30 Luke Gorrie <luke(a)synap.se>
+
+ * present.lisp: Added public domain dedication (OK'd by Alanr and
+ Matthias on the list).
+
+2005-08-29 Matthias Koeppe <mkoeppe(a)mail.math.uni-magdeburg.de>
+
+ * swank-lispworks.lisp (env-internals:confirm-p): Use new function
+ y-or-n-p-in-emacs rather than eval-in-emacs.
+
+ * swank-cmucl.lisp (eval-in-emacs): Removed.
+ (send-to-emacs): New.
+ (pre-gc-hook, post-gc-hook): Use new protocol message
+ :background-message rather than eval-in-emacs.
+
+ * swank.lisp (dispatch-event, send-to-socket-io): Handle new
+ messages :y-or-n-p, :background-message.
+ (y-or-n-p-in-emacs): New function.
+
+ * slime.el (slime-dispatch-event): Handle new messages :y-or-n-p,
+ :background-message.
+ (slime-y-or-n-p): New.
+
+2005-08-29 Alan Ruttenberg <alanr-l(a)mumble.net>
+
+ * slime.el (sldb-insert-condition) - Add tooltip for long
+ condition string which otherwise falls off the right of the screen
+ * swank.lisp (list-threads) - thread name might be a symbol - pass
+ the symbol name when that happens
+
+2005-08-29 Juho Snellman <jsnell(a)iki.fi>
+
+ * swank-sbcl.lisp (make-weak-key-hash-table): Remove the
+ implementation; SBCL doesn't actually support weak hash-tables.
+
+2005-08-28 Matthias Koeppe <mkoeppe(a)mail.math.uni-magdeburg.de>
+
+ * slime.el (slime-repl-kill-input): New command.
+ (slime-repl-mode-map): Bind it to C-c C-u, like in comint.
+ (slime-repl-easy-menu): Include it in the REPL menu.
+ (slime-repl-mode-hook): Show the SLIME menu in the REPL too.
+
+ * swank-backend.lisp (make-weak-key-hash-table)
+ (make-weak-value-hash-table): New interfaces.
+ * swank-cmucl.lisp (make-weak-key-hash-table): Implement it.
+ * swank-sbcl.lisp (make-weak-key-hash-table): Implement it.
+ * swank-openmcl.lisp (make-weak-key-hash-table)
+ (make-weak-value-hash-table): Implement it.
+
+ * swank.lisp (*object-to-presentation-id*)
+ (*presentation-id-to-object*): Use new functions
+ make-weak-key-hash-table, make-weak-value-hash-table.
+
+ * slime.el (slime-enable-evaluate-in-emacs): New variable.
+ (evaluate-in-emacs): Security improvement: If
+ slime-enable-evaluate-in-emacs is nil (the default), don't
+ evaluate forms sent by the Lisp.
+
+ * swank.lisp (send-to-socket-io): Handle :evaluate-in-emacs.
+
+2005-08-27 Matthias Koeppe <mkoeppe(a)mail.math.uni-magdeburg.de>
+
+ * slime.el (slime-presentation-menu): When an object is no longer
+ recorded, remove text properties from the presentation.
+
+2005-08-15 Alan Ruttenberg <alanr-l(a)mumble.net>
+
+ * swank-openmcl.lisp (condition-source-position)
+ ccl::compiler-warning-stream-position is sometimes nil, so placate
+ this function by making it (or .. 0). Wrong but I don't have
+ enough time now to figure out what the right thing is.
+
+
+2005-08-24 Marco Baringer <mb(a)bese.it>
+
+ * swank.lisp (fuzzy-find-matching-symbols): When completing the
+ string "package:" present a list of all the external symbols in
+ package (completing "package::" lists internal symbols as well).
+ (inspect-for-emacs standard-class): List all the slots in the
+ class (as per standard-object). The previous method of hard coding
+ the slots in the inspector's code made inspecting custom
+ meta-classes useless.
+
+2005-08-24 Christophe Rhodes <csr21(a)cam.ac.uk>
+
+ * swank-sbcl.lisp (method-definitions): present qualifiers (if
+ any).
+
+2005-08-23 Taylor R. Campbell <campbell(a)bloodandcoffee.net>
+
+ * slime.el (slime-goto-location-position): Added a second regexp
+ for the :function-name case which matches "(def... ((function-name
+ ..." (with N opening parens preceding the function name). This is
+ to allow scheme48 style function names and definitions.
+
+2005-08-22 Wolfgang Jenkner <wjenkner(a)inode.at>
+
+ * swank-clisp.lisp (fspec-pathname): Cope with CVS CLISP's
+ (documentation symbol 'sys::file) returning a list. Return either
+ a list of start and end line positions or nil as second value.
+ (fspec-location): Use it. Also, if we have to guess the name of a
+ source file make sure that it actually exists.
+
+ (with-blocked-signals, call-without-interrupts): Don't add
+ :linux to *features* since this changes the return value of
+ unique-directory-name in swank-loader.lisp.
+ Comment out with-blocked-signals.
+
+ Update some comments at the top of the file.
+ State the licence in the same terms as slime.el does.
+
+2005-08-21 Matthias Koeppe <mkoeppe(a)mail.math.uni-magdeburg.de>
+
+ * present.lisp (menu-choices-for-presentation-id): Check against
+ the gensym in *not-present* instead of :non-present.
+
+2005-08-20 Christophe Rhodes <csr21(a)cam.ac.uk>
+
+ * swank-sbcl.lisp (preferred-communication-style): guard against
+ non-Linux non-linkage-table platforms (and assume that they won't
+ have dodgy threads) with #+linux.
+
+2005-08-20 Matthias Koeppe <mkoeppe(a)mail.math.uni-magdeburg.de>
+
+ Enable nested presentations.
+
+ * slime.el (slime-presentation): Remove slots start-p, stop-p.
+ (slime-add-presentation-properties): Use a new text property
+ layout. Also add an overlay to enable nested highlighting.
+ (slime-remove-presentation-properties): New.
+ (slime-presentation-whole-p): Changed interface.
+ (slime-presentations-around-point): New.
+ (slime-same-presentation-p): Removed.
+ (slime-presentation-start-p, slime-presentation-stop-p): New.
+ (slime-presentation-start, slime-presentation-end): Changed to use
+ new text property layout.
+ (slime-presentation-bounds): New.
+ (slime-presentation-around-point): Reimplemented to handle nested
+ presentations.
+ (slime-for-each-presentation-in-region): New.
+ (slime-after-change-function): Use
+ slime-remove-presentation-properties and
+ slime-for-each-presentation-in-region.
+ (slime-copy-presentation-at-point): Complain if no presentation.
+ (slime-repl-insert-prompt): Don't put rear-nonsticky text property.
+ (slime-reify-old-output): Handle nested presentations.
+ (slime-repl-return): Use slime-presentation-around-or-before-point.
+
+ Enable reification of presentations in non-REPL buffers.
+
+ * slime.el (slime-buffer-substring-with-reified-output): New,
+ factored out from slime-repl-current-input.
+ (slime-repl-current-input): Use it here.
+ (slime-last-expression): Use it here.
+
+ (slime-add-presentation-properties): Add text properties
+ modification-hooks et al. to enable self-destruction of incomplete
+ or edited presentations in non-REPL buffers.
+
+2005-08-15 Alan Ruttenberg <alanr-l(a)mumble.net>
+
+ * slime.el (slime-goto-location-position) fix so the :method locator
+ regexp so that it can find eql specializers, (setf foo) methods, and to
+ allow (a single) newline between arguments in the arglist.
+
+ * swank-openmcl.lisp (specializer-name) patch from Gary Byers and
+ Bryan O'Conner to fix complaint about certain classes slipping
+ through the etypecase
+
+2005-08-14 Matthias Koeppe <mkoeppe(a)mail.math.uni-magdeburg.de>
+
+ * slime.el (slime-mark-presentation-end): Really remove the
+ presentation-start entry from the hash table.
+
+ Merge some code from present.lisp, removing code duplication.
+ Minor code clean-up.
+
+ * swank.lisp (*object-to-presentation-id*)
+ (*presentation-id-to-object*, clear-presentation-tables)
+ (*presentation-counter*, lookup-presented-object): Move here from
+ present.lisp.
+ (save-presented-object): Likewise. Assign negative numbers only,
+ so as not to clash with continuation ids.
+
+ * swank.lisp (*repl-results*): Removed.
+
+ * swank.lisp (get-repl-result, clear-repl-results): Use new
+ implementations from present.lisp.
+ (add-repl-result): Likewise, don't take the negative of the id.
+ (*last-repl-result-id*): New variable.
+ (clear-last-repl-result): Use it here.
+
+ * slime.el (slime-repl-insert-prompt): Don't take the negative of
+ the id.
+ (slime-presentation-expression): New, take care to handle
+ arbitrary *read-base* settings.
+ (reify-old-output): Use it here.
+ (slime-read-object): Use it here.
+
+2005-08-12 Matthias Koeppe <mkoeppe(a)mail.math.uni-magdeburg.de>
+
+ * slime.el (substring-no-properties): Fix to handle non-zero start
+ argument correctly.
+
+ Patch to remove use of the slime-repl-old-output text property in
+ favor of the slime-repl-presentation text property, in order to
+ simplify the code.
+
+ * slime.el (slime-presentation-whole-p): Generalize to work with
+ strings too.
+ (slime-presentation-start, slime-presentation-end): Likewise.
+ (slime-presentation-around-point): Likewise.
+ (slime-presentation-around-or-before-point): New.
+
+ * slime.el (reify-old-output): Use slime-repl-presentation
+ property and slime-presentation-around-point function rather than
+ slime-repl-old-output property.
+ (slime-repl-return): Use slime-repl-presentation rather than
+ slime-repl-old-output.
+ (slime-repl-grab-old-output): Use
+ slime-presentation-around-or-before-point.
+ (slime-read-object): Use slime-presentation-around-point.
+
+ * slime.el (toplevel): Don't handle slime-repl-old-output text
+ property.
+ (slime-add-presentation-properties): Likewise.
+ (slime-after-change-function): Likewise.
+
+2005-08-12 Yaroslav Kavenchuk <kavenchuk(a)jenty.by>
+
+ * swank-clisp.lisp (fspec-pathname): Use the documentation
+ function instead of accessing clisp internals.
+
+2005-08-11 Edi Weitz <edi(a)agharta.de>
+
+ * swank.lisp (transpose-lists): Fixed it.
+
+2005-08-10 Alan Ruttenberg <alanr-l(a)mumble.net>
+
+ * slime.el move slime-repl-add-to-input-history to
+ slime-repl-send-input so we can see the presentations we copied to
+ input when we reuse history rather than #.(blah...)
+ [Thanks Matthias! - was very busy and just returned to see your
+ changes merged. Most excellent.]
+
+2005-08-10 Matthias Koeppe <mkoeppe(a)mail.math.uni-magdeburg.de>
+
+ * slime.el (slime-presentation-around-point): Change interface,
+ return presentation as primary return value.
+ (slime-copy-presentation-at-point): Use
+ slime-presentation-around-point. Copying now also works when the
+ first character is clicked and when the REPL buffer is not current.
+ (slime-presentation-menu): Use slime-presentation-around-point.
+
+2005-08-10 Martin Simmons <martin(a)lispworks.com>
+
+ * swank-lispworks.lisp (defadvice compile-file): Return all values
+ from the real compile-file.
+
+2005-08-10 Edi Weitz <edi(a)agharta.de>
+
+ * swank.lisp (transpose-lists): Replaced with much nicer function
+ by Helmut Eller.
+
+2005-08-09 Matthias Koeppe <mkoeppe(a)mail.math.uni-magdeburg.de>
+
+ * slime.el (slime-read-object): Handle ids that are conses.
+ Patch by "Thas" on #lisp.
+
+2005-08-09 Edi Weitz <edi(a)agharta.de>
+
+ * swank.lisp (transpose-lists): Reimplemented without APPLY so we
+ don't have problems with CALL-ARGUMENTS-LIMIT.
+
+2005-08-08 Matthias Koeppe <mkoeppe(a)mail.math.uni-magdeburg.de>
+
+ * slime.el (undo-in-progress): Define for XEmacs compatibility.
+ Reported by Friedrich Dominicus.
+
+2005-08-07 Matthias Koeppe <mkoeppe(a)mail.math.uni-magdeburg.de>
+
+ Fix for the presentations menu. Reported by Aleksandar Bakic.
+
+ * present.lisp (lookup-presented-object): Handle ids that are
+ conses.
+ (execute-menu-choice-for-presentation-id): Use equal for comparing
+ ids, to handle the cons case.
+ (menu-choices-for-presentation): Quote the presentation id, as it
+ can be a cons.
+ * slime.el (slime-presentation-menu, slime-presentation-menu)
+ (slime-inspect-presented-object): Quote the presentation id.
+
+2005-08-06 Matthias Koeppe <mkoeppe(a)mail.math.uni-magdeburg.de>
+
+ * swank.lisp (form-completion): New generic function, factored out
+ from complete-form.
+ (complete-form): Factor out form-completion.
+ (form-completion): Specialize on defmethod forms to insert arglist
+ of generic function.
+
+ * doc/slime.texi (Programming Helpers): Document C-c C-s,
+ slime-complete-form.
+
+2005-08-04 Matthias Koeppe <mkoeppe(a)mail.math.uni-magdeburg.de>
+
+ Improvements to the presentations feature. Parts of presentations
+ can be copied reliably using all available Emacs facilities (not
+ just kill-ring-save), and they are no longer "semi-readonly" (in
+ the sense that keypresses are silently ignored). Whenever a user
+ attempts to edit a presentation, it now simply turns into plain
+ text (which is indicated by changing the face); this can be
+ undone. Presentations are now also supported if
+ *use-dedicated-output-stream* is nil. It is now possible to
+ access the individual values of multiple-value results. For some
+ systems (Allegro CL and upcoming CMUCL snapshots), presentations
+ can be reliably printed through pretty-printing streams.
+
+ * present.lisp (slime-stream-p) [allegro]: Allow printing
+ presentations through pretty printing streams.
+ [cmu]: Allow printing presentations through pretty printing
+ streams, if CMUCL has annotations support and we are using the
+ bridge-less protocol.
+ [sbcl]: Allow printing presentations through indenting streams.
+
+ * present.lisp (write-annotation): New function.
+ (presentation-record): New structure.
+ (presentation-start, presentation-end): New functions, supporting
+ both bridge protocol and bridge-less protocol.
+ (presenting-object-1): Use them here.
+
+ * present.lisp [sbcl, allegro]: Add printer hooks for unreadable
+ objects and pathnames.
+
+ * swank.lisp (*can-print-presentation*): New variable, moved here
+ from present.lisp.
+ * swank.lisp (interactive-eval, listener-eval, backtrace)
+ (swank-compiler, compile-file-for-emacs, load-file)
+ (init-inspector): Bind *can-print-presentation* to an appropriate
+ value.
+ * present.lisp: Remove code duplication with swank.lisp for the
+ functions above.
+
+ * swank.lisp (encode-message): Don't use the pretty printer for
+ printing the message length.
+
+ * slime.el (slime-dispatch-event): New events :presentation-start,
+ :presentation-end for bridge-less presentation markup.
+ * swank.lisp (dispatch-event, send-to-socket-io): Likewise.
+
+ * swank.lisp (listener-eval): Store the whole values-list with
+ add-repl-result.
+ * slime.el (slime-repl-insert-prompt): Accept a list of strings,
+ representing individual values of a multiple-value result. Mark
+ them up as separate presentations.
+ (reify-old-output): Support reifying individual values of a
+ multiple-value result.
+
+ * slime.el (slime-pre-command-hook): Don't call
+ slime-presentation-command-hook.
+ (slime-post-command-hook): Don't call
+ slime-presentation-post-command-hook.
+ (slime-presentation-command-hook): Removed.
+ (slime-presentation-post-command-hook): Removed.
+
+ * slime.el (slime-presentation-whole-p): New.
+ (slime-same-presentation-p): New.
+ (slime-presentation-start, slime-presentation-end): New.
+ (slime-presentation-around-point): New.
+ (slime-after-change-function): New.
+ (slime-setup-command-hooks): Install slime-after-change-function
+ as an after-change-function.
+
+ * slime.el (slime-repl-enable-presentations): Make
+ slime-repl-presentation nonsticky.
+ (slime-mark-presentation-start, slime-mark-presentation-end): New
+ functions.
+ (slime-mark-presentation-start-handler): Renamed from
+ slime-mark-presentation-start.
+ (slime-mark-presentation-end-handler): Renamed from
+ slime-mark-presentation-end.
+ (slime-presentation): New structure.
+ (slime-add-presentation-properties): New function.
+ (slime-insert-presentation): New function.
+
+2005-08-03 Zach Beane <xach(a)gwi.net>
+
+ * swank-sbcl.lisp (swank-compile-string): Restore honoring of
+ *trap-load-time-warnings*.
+
+2005-08-03 Juho Snellman <jsnell(a)iki.fi>
+
+ * swank-sbcl.lisp: Remove SBCL 0.9.1 support.
+ (swank-compile-string): Funcall the compiled function outside
+ with-compilation-hooks to prevent runtime warnings from
+ popping up a *compiler-notes* buffer.
+
+2005-07-29 Marco Baringer <mb(a)bese.it>
+
+ * doc/slime.texi (Other configurables): Document
+ *dedicated-output-stream-port*.
+
+ * swank.lisp (*dedicated-output-stream-port*): New variable.
+ (open-dedicated-output-stream): Open the stream on the port
+ *dedicated-output-stream-port*.
+
+ * slime.el (slime-set-default-directory): Fix typo in doc string.
+
+2005-07-26 Matthias Koeppe <mkoeppe(a)mail.math.uni-magdeburg.de>
+
+ * swank.lisp (inspect-for-emacs): Don't make whitespace
+ surrounding :action buttons part of the highlighted region.
+
+ * slime.el (slime-goto-location-buffer): Put "SLIME Source Form"
+ buffer into Lisp mode.
+
+2005-07-26 Helmut Eller <heller(a)common-lisp.net>
+
+ * swank.lisp (compile-file-for-emacs): Accept optional
+ external-format arg. I frogot to commit this file on 2005-07-05.
+
+ * slime.el (slime-input-complete-p): Skip over strings too.
+
+2005-07-26 Zach Beane <xach(a)xach.com>
+
+ * swank-sbcl.lisp (swank-compile-string): Revert to old string
+ compilation behavior to fix compiler note annotations. Code from
+ Juho Snellman.
+
+2005-07-24 Tom Pierce <tlpierce(a)gmail.com>
+
+ * swank.lisp (format-iso8601-time): New functions. Properly
+ formats a universal-time as an iso8601 string.
+ (inspect-for-emacs integer): Use the new
+ format-iso8601 function when printing an integer as a date.
+
+2005-07-22 Marco Baringer <mb(a)bese.it>
+
+ * swank-openmcl.lisp (frame-catch-tags): Remove some debugging
+ forms which were "polluting" the repl buffer when viewing an sldb
+ buffer.
+ (function-source-location): Make :error messages have the proper
+ form (exactly one string argument). This fix also removes the
+ issues with sending unreadble lists (containing #<...> to emacs).
+
+2005-07-14 Helmut Eller <heller(a)common-lisp.net>
+
+ * swank-allegro.lisp (find-external-format): Fix typo.
+
+2005-07-06 Helmut Eller <heller(a)common-lisp.net>
+
+ * slime.el (slime-send-sigint): Use the symbol SIGINT stead of the
+ signal number. Suggested by Joerg Hoehle.
+ (slime-compile-file): XEmacs needs the buffer as argument to
+ local-variable-p. Reported by Andy Sloane.
+
+2005-07-05 Helmut Eller <heller(a)common-lisp.net>
+
+ The file variable slime-coding can now be used to specify the
+ coding system to use for C-c C-k. E.g., if the file contains
+ -*- slime-coding: utf-8-unix -*- Emacs will tell the Lisp side
+ to call COMPILE-FILE with an external-format argument.
+
+ * slime.el (slime-compile-file): Send the coding system if
+ the buffer local variable `slime-coding' is bound.
+
+ * swank-backend.lisp, swank-sbcl.lisp, swank-clisp.lisp,
+ swank-lispworks.lisp, swank-cmucl, swank-allegro.lisp,
+ swank-abcl.lisp, swank-corman.lisp
+ (swank-compile-file): New optional argument `external-format'.
+
+ * swank-clisp.lisp (getpid): Undo the last change.
+
+ * swank-corman.lisp (spawn, thread-alive-p): More thread tweaking.
+
+2005-07-03 Joerg Hoehle <hoehle(a)users.sourceforge.net>
+
+ * swank-clisp (describe-symbol-for-emacs): Report :setf and :type
+ where appropriate.
+
+2005-07-03 Helmut Eller <heller(a)common-lisp.net>
+
+ * slime.el (next-single-char-property-change)
+ (previous-single-char-property-change) [xemacs]: Only define them
+ if not present.
+ (next-char-property-change, previous-char-property-change): Define
+ if needed.
+
+ * README: Show examples for the filenames instead of the general
+ "/the/path/to/this/directory". Suggested by Brandon J. Van Every.
+
+ * swank-corman.lisp (default-directory): Return a namestring
+ instead of the pathname.
+ (inspect-for-emacs, inspect-structure): Teach the inspector how to
+ deal with structures.
+ (spawn, send, receive): Implement rudimentary threading support.
+ It's now possible to connect with the :spawn communication style
+ and to bring up a listener. Unfortunately, debugging the
+ non-primary threads doesn't work at all. Still no support for
+ interrupt-thread.
+
+ * slime.el (slime-start-swank-server): Send an extra newline
+ before the "(swank:start-server ...". I don't know why, but this
+ seems to fix the problem when starting CLISP/Win32. Interrupting
+ CLISP/W32 is still horribly broken.
+
+ * swank-loader.lisp (compile-files-if-needed-serially) [corman]:
+ force-output after each file.
+
+2005-07-02 Marco Baringer <mb(a)bese.it>
+
+ * slime.el (save-some-lisp-buffers): New Function.
+ (slime-repl-only-save-lisp-buffers): New customizable variable.
+ (slime-repl-compile-and-load): Use save-some-lisp-buffers.
+ (slime-oos): Use save-some-lisp-buffers.
+
+2005-07-01 G�bor Melis <mega(a)hotpop.com>
+
+ * swank-sbcl.lisp (threaded stuff): make SBCL 0.9.2.9+ work while
+ retaining support for 0.9.2
+
+2005-06-28 G�bor Melis <mega(a)hotpop.com>
+
+ * swank-sbcl.lisp (threaded stuff): horrible hack to make threaded
+ SBCL 0.9.2 work. (also, Happy Birthday Christophe!)
+
+2005-06-21 Edi Weitz <edi(a)agharta.de>
+
+ * swank.lisp (find-matching-packages): Also use nicknames.
+
+2005-06-13 Edi Weitz <edi(a)agharta.de>
+
+ * swank.lisp (list-all-systems-in-central-registry): Delete
+ duplicates.
+
+ * swank-lispworks.lisp (unmangle-unfun): If you rename a package
+ you should rename it everywhere...
+
+2005-06-12 Alexey Dejneka <adejneka(a)comail.ru>
+
+ * slime.el (slime-with-xref-buffer): fix "pgk" typo.
+
+2005-06-12 Christophe Rhodes <csr21(a)cam.ac.uk>
+
+ * swank.lisp (ed-in-emacs): allow strings as well as pathnames;
+ don't call emacs for things that the emacs editor doesn't know how
+ to deal with. Return T if we called emacs and NIL if not.
+
+ * slime.el (slime-ed): Change a listp to consp, so that NIL
+ arguments are correctly handled.
+
+2005-06-11 Nikodemus Siivola <nikodemus(a)random-state.net>
+
+ * swank-sbcl.lisp: Patched for SBCL HEAD: utilize the new
+ :source-plist functionality; maintain compatibility with 0.9.1
+ till 0.9.2 is out. Removed cruft left over from previous
+ excercises in supporting both HEAD and latest release.
+
+ * doc/slime.texi: Document Slime as supporting the latest official
+ release of SBCL, as opposed to a specific version number which
+ would need to be updated monthly.
+
+2005-06-10 Helmut Eller <heller(a)common-lisp.net>
+
+ * nregex.lisp (slime-nregex): Rename package to avoid name clashes
+ with other version of this file.
+
+ * swank.lisp (compiled-regex): Use the new package name.
+
+ * slime.el (slime-with-xref-buffer): Gensym package too, to avoid
+ problems when switching to buffers with -*- package: ... -*- file
+ variables. From Antonio Menezes Leitao.
+ (slime-property-bounds): Use the prop argument instead of the
+ hardcoded 'slime-repl-old-output. From Andras Simon.
+
+2005-06-07 Espen Wiborg <espenhw(a)grumblesmurf.org>
+
+ * swank-corman.lisp: Convert to Unix line-endings.
+ (create-socket): Pass through the port argument unmodified,
+ gettting a random port if 0. Requires supporting change in
+ <ccl>/modules/sockets.lisp.
+ (inspect-for-emacs): defimplementation instead of defmethod.
+
+2005-06-06 Espen Wiborg <espenhw(a)grumblesmurf.org>
+
+ * doc/slime.texi, PROBLEMS: Added notes about CCL.
+
+2005-06-03 Helmut Eller <heller(a)common-lisp.net>
+
+ * slime.el (slime-background-activities-enabled-p): Allow
+ background stuff in repl-mode buffers too.
+
+ * swank-cmucl.lisp (sis/misc): Return t for :interactive-p.
+
+2005-06-01 Helmut Eller <heller(a)common-lisp.net>
+
+ * slime.el (slime-load-system, slime-oos): Fix bug related to file
+ locking. Don't bind the variable system-name. system-name is a
+ predefined Emacs variable and is used among other things for lock
+ filenames.
+
+2005-06-01 Joerg Hoehle <hoehle(a)users.sourceforge.net>
+
+ * swank-clisp (getpid): Updates for current CLISP versions. Use
+ defimplementation. Define always (slime needs it).
+
+2005-06-01 Helmut Eller <heller(a)common-lisp.net>
+
+ * slime.el (slime-background-activities-enabled-p): Return nil
+ instead of signalling an error if there is a open but no default
+ connection.
+ (slime-current-connection): New helper function.
+ (slime-connection): Use it.
+ (slime-first-change-hook): Only run when
+ slime-background-activities-enabled-p.
+
+2005-06-01 Joerg Hoehle <hoehle(a)users.sourceforge.net>
+
+ * swank-cmucl.lisp, swank-sbcl.lisp, swank-clisp.lisp
+ (describe-symbol-for-emacs): Distinguish macro and special
+ operators from functions.
+
+ * slime.el (slime-print-apropos): Must keep in sync with above,
+ therefore added :macro and :special-operator properties.
+
+ * swank.lisp (present-symbol-before-p): Make it conform to its
+ specification -- sort first by package and then by symbol name.
+
+ * swank-clisp.lisp (describe-symbol-for-emacs): Report :alien-type
+ when the name is known as foreign type.
+
+2005-06-01 Espen Wiborg <espenhw(a)grumblesmurf.org>
+
+ * swank-loader.lisp: Redefine compile-files-if-needed-serially for
+ Corman Lisp to load everything from source.
+
+2005-05-27 Espen Wiborg <espenhw(a)grumblesmurf.org>
+
+ * swank-corman.lisp: New file, swank for Corman Lisp.
+
+ * swank.lisp (simple-announce-function): force-output after
+ announcing.
+ (symbol-external-p): Be extra paranoid about the symbol's package;
+ find-symbol barfs on a nil package in Corman Lisp.
+
+ * swank-loader.lisp: Add Corman Lisp support.
+
+2005-05-24 Alan Ruttenberg <alanr-l(a)mumble.net>
+
+ * slime.el text-property-default-nonsticky not defined in
+ xemacs. oops.
+
+2005-05-24 Alan Ruttenberg <alanr-l(a)mumble.net>
+
+ * slime.el meta-w now removes properties before insertion if you
+ cut just a portion of the presentation. Added xemacs
+ support. Enabled in xemacs.
+
+2005-05-23 Alan Ruttenberg <alanr-l(a)mumble.net>
+
+ * slime.el slime-presentation-menu - use with-current-buffer, so
+ that menus work even if you are not in the buffer with the
+ presentation.
+
+ * present.lisp More menu items for pathnames. Remember last
+ slime-stream-p value. *can-print-presentation* t during
+ swank-compiler and during presentation menu action.
+
+2005-05-22 Alan Ruttenberg <alanr-l(a)mumble.net>
+
+ * present.lisp. (slime-stream-p) check if a stream is destined for
+ output in a slime listener. (checks *connections* looks into pretty-print
+ streams in openmcl and cmucl)
+ Don't present unless (slime-stream-p stream).
+
+ Variable *enable-presenting-readable-objects* The only readable object
+ which is presented are pathnames (e.g. pathnames printed when loading
+ and *load-verbose* is t). Try the useful menu :)
+ More to come if this doesn't cause problems. (nil this if it does)
+
+ *can-print-presentation* t around compile-string-for-emacs,
+ load-file, interactive-eval.
+
+ In cmucl, use fwrappers to modify behaviour rather than redefinition.
+
+2005-05-22 Alan Ruttenberg <alanr-l(a)mumble.net>
+
+ * present.lisp. mouse-3 now gives a menu for actions on the
+ presentation. See documentation in file for information about how
+ to define menus. Also, disable presentations in inspector. Initial bits
+ of dealing with the possibility of presenting readable objects.
+
+ * slime.el support menu. Xemacs users beware this uses x-popup-menu,
+ which may be fsf specific.
+
+2005-05-20 Alan Ruttenberg <alanr-l(a)mumble.net>
+ * swank.lisp make repl output presentation work even if
+ present.lisp not loaded
+
+2005-05-20 Luke Gorrie <luke(a)synap.se>
+
+ * slime.el (slime-repl-enable-presentations): Default is enabled
+ in GNU Emacs but disabled in XEmacs. Feature is not portable yet.
+ Brutally 80-column'ified alanr's latest changes :-)
+
+2005-05-20 Alan Ruttenberg <alanr-l(a)mumble.net>
+
+ * bridge.el new file. from ilisp cvs distribution to collect
+ in-band messages using process filter mechanisms. One edit which
+ calls bridge-insert with process argument as well as output
+
+ * present.lisp new file. Enough code to do the following:
+ (swank::presenting-object object stream (print "This is really
+ object")). This makes the string "This is really object" behave
+ like old repl input for the object. Sample code for openmcl and
+ cmucl that hooks this into the printing of unreadable objects This
+ should be part of swank.lisp (and lisp specific files) but I am
+ too chicken to merge yet. For now you have to load this file
+ manually.
+
+ * slime.el changes to support above:
+ slime-repl-enable-presentations: customize to enable this stuff.
+ Default value t. Set to nil to turn it off.
+ slime-presentation-start-to-point: map object ids to the (point)
+ where they start to print out. slime-mark-presentation-start,
+ slime-mark-presentation-end. handlers for the bridge messages.
+ slime-open-stream-to-lisp: When enabled start the bridge and
+ define the handlers.
+
2005-05-19 Alan Ruttenberg <alanr-l(a)mumble.net>
+ * slime.el slime-presentation-map
+
+2005-05-20 Luke Gorrie <luke(a)synap.se>
+
+ * swank.lisp (clear-repl-results): Fixed unbalanced parens. Thanks
+ Lawrence Mitchell.
+
+2005-05-19 Alan Ruttenberg <alanr-l(a)mumble.net>
+
* slime.el (slime-presentation-command-hook) new function for
nicer behaviour for presentations.
(slime-pre-command-hook) do slime-presentation-command-hook
@@ -87,6 +3174,7 @@
slime-complete-symbol* and slime-simple-complete-symbol.
2005-05-06 Alan Ruttenberg <alanr-l(a)mumble.net>
+
* swank-openmcl.lisp specializer-name didn't handle
structure-class which caused meta-. of methods specialized on
defstruct arguments to fail.
@@ -7686,3 +10774,8 @@
* Everything: imported slime-0.2 sources.
+;; Local Variables:
+;; coding: latin-1
+;; End:
+
+This file has been placed in the public domain.
Modified: trunk/thirdparty/emacs/slime/PROBLEMS
===================================================================
--- trunk/thirdparty/emacs/slime/PROBLEMS 2006-11-30 14:00:03 UTC (rev 2091)
+++ trunk/thirdparty/emacs/slime/PROBLEMS 2006-11-30 16:32:54 UTC (rev 2092)
@@ -11,6 +11,13 @@
The listen socket is bound on the loopback interface in all Lisps that
support this. This way remote hosts are unable to connect.
+** READ-CHAR-NO-HANG is broken
+
+READ-CHAR-NO-HANG doesn't work properly for slime-input-streams. Due
+to the way we request input from Emacs it's not possible to repeatedly
+poll for input. To get any input you have to call READ-CHAR (or a
+function which calls READ-CHAR).
+
* Backend-specific problems
** CMUCL
@@ -21,8 +28,10 @@
** SBCL
-SBCL versions from 0.8.15 to 0.8.21 should work. Newer SBCL's may or
-may not work. Don't use multithreading with 2.4 kernels.
+The latest released version of SBCL at the time of packaging should
+work. Older or newer SBCLs may or may not work. Do not use
+multithreading with unpatched 2.4 Linux kernels. There are also
+problems with kernel versions 2.6.5 - 2.6.10.
The (v)iew-source command in the debugger can only locate exact source
forms for code compiled at (debug 2) or higher. The default level is
@@ -56,17 +65,31 @@
you may have to start CLISP with "clisp -K full".
Under Windows, interrupting (with C-c C-b) doesn't work. Emacs sends
-a signal 2 (= SIGINT), but the signal is either ignored or CLISP exits
+a SIGINT signal, but the signal is either ignored or CLISP exits
immediately.
-The backtrace doesn't include frames for compiled functions. Changes
-to CLISP's C code are needed to fix this problem.
-Interpreted code is usually easer to debug.
+Function arguments and local variables aren't displayed properly in
+the backtrace. Changes to CLISP's C code are needed to fix this
+problem. Interpreted code is usually easer to debug.
M-. (find-definition) only works if the fasl file is in the same
directory as the source file.
+The arglist doesn't include the proper names only "fake symbols" like
+`arg1'.
+
** Armed Bear Common Lisp
The ABCL support is still new and experimental.
+** Corman Common Lisp
+
+We require version 2.51 or higher, with several patches (available at
+http://www.grumblesmurf.org/lisp/corman-patches).
+
+The only communication style currently supported is NIL.
+
+Interrupting (with C-c C-b) doesn't work.
+
+The tracing, stepping and XREF commands are not implemented along with
+some debugger functionality.
Modified: trunk/thirdparty/emacs/slime/README
===================================================================
--- trunk/thirdparty/emacs/slime/README 2006-11-30 14:00:03 UTC (rev 2091)
+++ trunk/thirdparty/emacs/slime/README 2006-11-30 16:32:54 UTC (rev 2092)
@@ -10,9 +10,10 @@
Quick setup instructions
------------------------
- In Emacs Lisp:
+ Add this to your ~/.emacs file and fill in the appropriate filenames:
- (add-to-list 'load-path "/the/path/to/this/directory")
+ (add-to-list 'load-path "~/hacking/lisp/slime/") ; your SLIME directory
+ (setq inferior-lisp-program "/opt/sbcl/bin/sbcl") ; your Lisp system
(require 'slime)
(slime-setup)
@@ -26,10 +27,8 @@
Licence.
----------------------------------------
- SLIME is free software. The source files are licensed separately for
- maximum compatibility with their host environment, for example
- slime.el is GPL and swank-cmucl.lisp is public domain. See the
- source files for more details.
+ SLIME is free software. All files, unless explicitly stated
+ otherwise, are public domain.
Contact.
----------------------------------------
Modified: trunk/thirdparty/emacs/slime/doc/Makefile
===================================================================
--- trunk/thirdparty/emacs/slime/doc/Makefile 2006-11-30 14:00:03 UTC (rev 2091)
+++ trunk/thirdparty/emacs/slime/doc/Makefile 2006-11-30 16:32:54 UTC (rev 2092)
@@ -1,3 +1,5 @@
+# This file has been placed in the public domain.
+#
# Where to put the info file(s). NB: the GNU Coding Standards (GCS)
# and the Filesystem Hierarchy Standard (FHS) differ on where info
# files belong. The GCS says /usr/local/info; the FHS says
@@ -12,24 +14,29 @@
# Info files generated here.
infofiles=slime.info
-all: slime.ps slime.info slime.pdf
+TEXI = slime.texi contributors.texi
-install: install-info
+all: slime.ps slime.info slime.html slime.pdf
-uninstall: uninstall-info
+slime.dvi: $(TEXI)
+ texi2dvi slime.texi
slime.ps: slime.dvi
dvips -o $@ $<
-slime.dvi: slime.texi contributors.texi
- texi2dvi slime.texi
+slime.info: $(TEXI)
+ makeinfo $<
-slime.pdf: slime.texi contributors.texi
+slime.html: $(TEXI)
+ texi2html $<
+
+slime.pdf: $(TEXI)
texi2pdf $<
-slime.info: slime.texi contributors.texi
- makeinfo $<
+install: install-info
+uninstall: uninstall-info
+
# Create contributors.texi, a texinfo table listing all known
# contributors of code.
#
@@ -48,7 +55,11 @@
sort -nr| \
sed -e 's/^[^A-Z]*//' | \
awk -f texinfo-tabulate.awk | \
- sed -e 's/\o370/@norsko{}/g' \
+ sed -e "s/\o341/@'a/g" | \
+ sed -e "s/\o355/@'{@dotless{i}}/g" | \
+ sed -e "s/\o351/@'e/g" | \
+ sed -e "s/\o361/@~n/g" | \
+ sed -e 's/\o370/@o{}/g' \
> $@
#.INTERMEDIATE: contributors.texi
@@ -94,3 +105,4 @@
rm -f slime.info
rm -f slime.pdf
rm -f slime.ps
+ rm -f slime.html
Added: trunk/thirdparty/emacs/slime/doc/slime-small.eps
===================================================================
--- trunk/thirdparty/emacs/slime/doc/slime-small.eps 2006-11-30 14:00:03 UTC (rev 2091)
+++ trunk/thirdparty/emacs/slime/doc/slime-small.eps 2006-11-30 16:32:54 UTC (rev 2092)
@@ -0,0 +1,995 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%Creator: GIMP PostScript file plugin V 1.17 by Peter Kirchgessner
+%%Title: slime-small.eps
+%%CreationDate: Tue Nov 14 18:44:25 2006
+%%DocumentData: Clean7Bit
+%%LanguageLevel: 2
+%%Pages: 1
+%%BoundingBox: 0 0 252 104
+%%EndComments
+%%BeginProlog
+% Use own dictionary to avoid conflicts
+10 dict begin
+%%EndProlog
+%%Page: 1 1
+% Translate for offset
+0 0 translate
+% Translate to begin of first scanline
+0 103.29540259080517 translate
+251.14960629921259 -103.29540259080517 scale
+% Image geometry
+248 102 8
+% Transformation matrix
+[ 248 0 0 102 0 0 ]
+% Strings to hold RGB-samples per scanline
+/rstr 248 string def
+/gstr 248 string def
+/bstr 248 string def
+{currentfile /ASCII85Decode filter /RunLengthDecode filter rstr readstring pop}
+{currentfile /ASCII85Decode filter /RunLengthDecode filter gstr readstring pop}
+{currentfile /ASCII85Decode filter /RunLengthDecode filter bstr readstring pop}
+true 3
+%%BeginData: 57552 ASCII Bytes
+colorimage
+JcCT,J,~>
+JcCT,J,~>
+JcCT,J,~>
+JcCT,J,~>
+JcCT,J,~>
+JcCT,J,~>
+JcCT,J,~>
+JcCT,J,~>
+JcCT,J,~>
+JcCT,J,~>
+JcCT,J,~>
+JcCT,J,~>
+JcCT,J,~>
+JcCT,J,~>
+JcCT,J,~>
+JcDnQp&=1TJ,~>
+JcDnQp&=1TJ,~>
+JcDnQp&=1TJ,~>
+JcE=]rVd0(rr2loqtg-`p\+IV#PRoeq>:*grpKf:~>
+JcE=]rVd0(rr2loqtg-`p\+IV#PRoeq>:*grpKf:~>
+JcE=]rVd0(rr2loqtg-`p\+IV#PRoeq>:*grpKf:~>
+^&S*2K`;\ar;-0]p@n@Wp@RnBl/gp^gtM_[%,0ImiT04hnFZMQrVl?eJ,~>
+^&S*2K`;\ar;-0]p@n@Wp@RnBl/gp^gtM_[%,0ImiT04hnFZMQrVl?eJ,~>
+^&S*2K`;\ar;-0]p@n@Wp@RnBl/gp^gtM_[%,0ImiT04hnFZMQrVl?eJ,~>
+_#FK8r;$?d!r;cn\,QX2rVZTlrpKdkrquWgqYU6joD]L&q=<e0hVR5Pj58P;ahkZtYGnAsUCF&u
+Xg>RRajSr)m.C/Qo)F4~>
+_#FK8r;$?d!r;cn\,QX2rVZTlrpKdkrquWgqYU6joD]L&q=<e0hVR5Pj58P;ahkZtYGnAsUCF&u
+Xg>RRajSr)m.C/Qo)F4~>
+_#FK8r;$?d!r;cn\,QX2rVZTlrpKdkrquWgqYU6joD]L&q=<e0hVR5Pj58P;ahkZtYGnAsUCF&u
+Xg>RRajSr)m.C/Qo)F4~>
+_>al?q!dM,hr<khq#'=Ts8E&tr;?HlqY^3lr;HTmrp0RjrquQ`naQ,CqYg!b$NBttna#E'me-GU
+p&>['q!?_R[B6U<\@8]>TW+a/a2[rL%+WD>YGn1p]$&prp\j^`J,~>
+_>al?q!dM,hr<khq#'=Ts8E&tr;?HlqY^3lr;HTmrp0RjrquQ`naQ,CqYg!b$NBttna#E'me-GU
+p&>['q!?_R[B6U<\@8]>SYMdk^:j@0%*ZE"VkT`^]$&prp\j^`J,~>
+_>al?q!dM,hr<khq#'=Ts8E&tr;?HlqY^3lr;HTmrp0RjrquQ`naQ,CqYg!b$NBttna#E'me-GU
+p&>['q!?_R[B6U<\@8]>V6mGObffhD%+WSI]!S?7]$&prp\j^`J,~>
+h>[WWrVZQgrV-NkqY^<ko`#?tp?:)F[BI!Uf')i*lMh(eqtTjUnF$;Brp0RM%di]RoCV_Lp\=R\
+qu$Elo)B*rq=<_'da6P&m.UALrs\o'o&\EB_8O^YmeHbTrs\o'mFAPViU?6RSZ0Nnmg%djUU8G5
+p\jaaJ,~>
+h>[WWrVZQgrV-NkqY^<ko`#?tp?:)F[BI!Uf')i*lMh(eqtTjUnF$;Brp0RM%di]RoCV_Lp\=R\
+qu$Elo)B*rq=<_'da6P&m.UALrs\o'o&\EB_8O^YmeHbTrs\o'mFAPNg$@t9Q_M(XlNc+VT=!#1
+p\jaaJ,~>
+h>[WWrVZQgrV-NkqY^<ko`#?tp?:)F[BI!Uf')i*lMh(eqtTjUnF$;Brp0RM%di]RoCV_Lp\=R\
+qu$Elo)B*rq=<_'da6P&m.UALrs\o'o&\EB_8O^YmeHbTrrrDumFAP[rlbJ^Vm=2*bQc%f[*e.4
+rUg,?~>
+i;XMjrVH<]nEfB#j5]4`lgOH>q>C3jq>Us'pZTo*]]&><]WTQDp\jIY$N0Yek2"S6bK.`Erl4rX
+&]r8De_&U3i8`tbmIBiCqYgEerser%mFoFYYH=n8d,t$!pAYX%qXE=XWP-?nW4LRHq>U0h%/ohS
+[aX<je^`UCkMY^W#he/'d]LsbqYp0fJ,~>
+i;XMjrVH<]nEfB#j5]4`lgOH>q>C3jq>Us'pZTo'Ze=ZtZ`DC8p\jIY$N0Yek2"S6bK.`Erl4rX
+&]r8De_&U3i8`tbmIBiCqYgEerser%mFoFYWMcZ'd,t$!pAYX%qXE=XVR4(PUUo%Cq>U0h%/ohS
+[`n%#kND*rlfmd!#jCO?bH'(YqYp0fJ,~>
+i;XMjrVH<]nEfB#j5]4`lgOH>q>C3jq>UWspZTo0_>_X^_6_GNp\jIY$N0Yek2"S6bK.`Erl4rX
+&]r8De_&U3i8`tbmIBiCqYgEerser%mFoFY\[SrTd,t$!pAYX%qXE=XXhr)uZ+ANQq>U0h%/ohS
+[`cFp[C*Zc_S#6C#e.Ieb-TO`qYp0fJ,~>
+ir9kpr:omMj4hu'_7R1c\\?)/fAPl]p%eObqu70'nC=YujOr):jPR)inGDVQ#lOAYeA&,YUT+6j
+rMKRl&ZM@nU8Fur\%T]%dFmOFo_SR^rt#,*mFJYMn*93*d]1LSp\jjd&,YqR];b5Zi8F"CZIeRB
+rqZR'qsDY1lH-<4XLlTm]<(D##dM"dh:&pnpAO[aJ,~>
+ir9kpr:omMj4hu'_7R1c\\?)/fAPl]p%eObqu70'nC=SolKIEplJ&AinGDVQ#lOAYeA&,YT;)+R
+&tu(iSt`*_Z+%Eab0eo%lh(&Qq#:m(qX)k@WpB$<mE;ENkkG&Mrt#"th7KHKlKRR#^9ZAZqu6Ek%
+/]G:VsNL&hr!DRj5K@^#iO\'l-$WrpAO[aJ,~>
+ir9kpr:omMj4hu'_7R1c\\?)/fAPl]p%eObqu70'nC=kd^ULV[^W<b3nGDVQ$iK\\eA&,YXL#19
+Yl1d*YS+4IURn3WX0K.I_ogB[ip675rqQL(rqc$5[(=K"`5g$'bNS^!p\td$o%gpab.kU%a2YF:
+n,*+[rsekmc*tWnTq@sSXfJ=km@FTWVQdYS\`*8\p&BO~>
+jSp5!r:odDfu^e(TW#$4`5KX*VPBrn_U.-&nbE%]rr3Q/q<,T+jM8%%Z,#G4_<:Xnn,E[lpZKc$
+a7&Kap$)PFrpL<S_o0']WM$/ubMVgcrqZR)r:8UMa62!paj&Z!WmpM7q#:p(p>j&hlI!DZ]?TEJ
+]]&S_qYq$(q<,Q6i4G)-M3+3lOR.f0N0'^WmB"n/r:U)?~>
+jSoYfr:odDfu^e(SYE!prk&ZETV&$d_U.-&nbE%]rr3Q/q<,T#lJgaZi8X%._<:Xnn,E[lpZKc"
+^?b+Po^)SC%GA>*Yb%S[Vmjk,nG<.[rt#%ugU4c]kN(^cl.W)cn,)n[&H2=`_5$AZio/kXlE\(]
+pAOjf%K?1d^qT'lg=Os1gtUQLf*L$_h<"%&f(&\2s*t~>
+jSoYfr:odDfu^e(V6RMKrko5ZYH4P+_U.-&nbE%]rr3Q/q<,T1^SmiuTr>`A_<:Xnn,E[lpZKc*
+`luZIou$jQrQG\e`4`=ZUo1]FhsgLAq>V!'o%URl_R6MJYe%o[eF3;0rt,/&jMA1@ZDaXtYeRud
+iV*6Hrso&(kJ5*MVO*gCQ^<u(SF)jQS!TSJa0jLgr:U)?~>
+jo5bfq=3Rs^o=!Gi9omnrSSgZlL"&YYFr&9f&uZ$rr<#tp><.DeZ=^dN2tLtZ/>9Sn,E[jn'nDq
+i76B&ouR3]rm_J2i8E\]lL+,hXhEQ]r;-F*rqPZpWTqU,S"$+djLMq`p\t!g&GtqFVs_s0PE:m'
+dI*aUmeck\%0$%_\AdC<OF21uK7NrKs+:9-!/p]8re^Z,$@I,DJssdGY0lb:p&BO~>
+jo5bfq=3Rs^o<g:g$J(krTPHim-X,NVk(!.f&uZ$rr<#tp><.@kMOqDf\blXZ/>9Sn,E[jn'n>j
+l0%6kp#H,8roXCIl07L4liue!VnLpWr;-F*rqPZpU?psugt^`FlE\(_p\t!g#5dl<V!R7#rn7S5
+k3Sbfmeck\%0$%_\@h(bg="<qeC4EFs4%)#!8./%rn%2"$I[>KeD0-OVpY#3p&BO~>
+jo5bfq=3Rs^o=9Obf[l@rOa8f`5g*>\>6:Ff&uZ$rr<#tp><.![@`qYS"@%3Z/>9Sn,E[jn'nV`
+]X>/OorS5"rj<3E]Y)"t`6-<H\%UVgr;-F*rqPZpZc&u<Q^=/>^V@GAp\t!g&GtqFXNIi=QC!r.
+ZH9&lmeck\%0$%_\AZ%WQ`IKoUS[sjs.fUb!1WhPrgj(a$EL>7UR/+$\'a^Cp&BO~>
+kPl%kr:]F/_5=EomGQ[Fai+.i+Mc+De_oWYdBTXhhspRBs8DWFVsi0;M04ZUeaKEjp&4C[$3'b_
+^rPBFXK8,gRfK>bX:DMI]>2P1dFI(<^;T1/rql^-r:8L?i7YAoK7f#]eaK<anbi7`')q^i^q/UB
+PC(a)n.P/$(f]]Akequ7B0pYrX"i4G(uBk_L(Jr,SXR]EKoqRZ[,s-a:VNerU]aQg"Znbi([J,~>
+kPl%kr:]F/_5=0amHNisjQ$3t+QDJDkNV=!af25XhspRBs8DWFVsEO'f?`(+kNf&#p&4C[$3'b_
+^q]-mhr!8_g]641h[\T'iSrqZk3)!q[`%>'rql^-r:8L?g$%AHeC<+-kNeqonbi7`')q^i^p<7b
+g=+Kug>_D&]]Akequ7B0pYrWol/C@Eb0%rPeCWF0gu%#IqVhG2s4dt8g"4j2jQrnrnbi([J,~>
+kPl%kr:]F/_5=`da1SmeXfMDt+K2EH[CjB!agn@hhspRBs8DWFVp)Q@S@"iY[EPQ'p&4C[$3'b_
+^rO*bT:_SFQN3QTT+7QlVPpW!ZF.9^_o1^4rql^-r:8L?bdX:8USFBO[EPGsnbi7`')q^i^qd^`
+QDgj_QDhR4]]Akequ7B0pYrX!]V_$raiV93URdd=Q_'eBqPO7`s-F([R(a)Tn8Xi.d"nbi([J,~>
+kl21mqXW[jYG^=Ag!..6VONkLO<BaVTrblEdG=!DXM<]cr;Z`ffq\#dXGM(VX4?[6g%>74rsA]!
+iNr"'XGMdfon*7"reV,DOH>ZqS#39qeaKToo_n^f'E7jn`i87FRtGWtJssdGVoS*!rql^.rUo!M
+dG;6kH>.S]Z.\'7g%51>rtPJ-j0lna]9%DS>]54_X1HBne^`@Li;V:,a9oMeX/ii!jIG&urUp2@~>
+kl21mqXW[jYFsS7kiLd]hV?l`g)o,+hr3VXl0I$"^Ynb^s8DTCU[.+#f?`(+kNenro_n:Z$3'\X
+Zg6f3f@SRGe,\)!f)XJ&gAfq6hV[;Tl`Ak5rVZ[/rqbp"U?psreBH.dguRgqa6NO#qu7<-p"cgo
+l/C=Cb0\f!kh2rgoDSRd'`Rmf[_1k`g="-?bgbG*iT0(_kNMd,roa=Bs5F"8#3"t'QJM33p&BO~>
+kl21mqXW[jYHc<g\$2a'S<oN>QQVT\R\-IXZF[os[D1Ylr;Z`ffqZd!T:E9ZT!ce;g%>74rsA]!
+iNpb9T:DFFoqMMYrgXIfQ^=#)Q^j\C[EP`,o_n^f'E7jn`j3ObQ_V:/UR/+$YfH&*rql^.rUo!M
+ah"78Y0!r<Tsr7Fg%51>rtPJ-j0ln=VO+@*`4r(6Su/Wl[C*L?]`,>=XU:r#St;h"fsBN,rUp2@~>
+l2M=oqXE=XUVuHN`3H"tN/*%9rHo`:K8#/DQ);".g$5``lh^VZo[oo,eZ=UMM6#1qU=f,:nG`am
+pY`=FeZ=W(K)0BuF*2bUG^OmfK7er9R`Octe+*A6rtGA)i3^G\]9%DSBRGoQi5E+ap\t'i')_:K
+TC:=3M03<JKqQ]XUWr6(qu7W7puK!)i4G(uBlATlaOT56lL43!_SEt)_na(en,MY[i8)r6i9cK,
+lM:GPs*t~>
+l2M=oqXE=XTtKaUj5AbIf[eR$rR)h;eCE1)gYUoLkj57klh^VZo[oo(kMOn;fAGcWU=f,:nG`am
+pY`=BkMOnfeG@B%cHjndd*g@keC<($guRh$e+*A6rtGA)i3^/]iS)`&ajSo%l+FLbp\t'i')_:K
+TBk[tf?_"Pe_T?ST?Zg$qu7W7puJuul/C@Eb08AjjQGdom-Euj]!f)[]=,0Ili6;Yl0.<nl0Wu"
+lM:GPs*t~>
+l2M=oqXE=XWPl`aX.buKS"?COrMq'>US43EQ(4VM\&>c!lh^VZo[on^[@`trSY!75U=f,:nG`am
+pY`=#[@`ucU\_\;\$W<=Z)aq(USFENQ`\3:e+*A6rtGA)i3^G8VO+@*b,^o,]Yh5<p\t'i')_:K
+T?O^8S@$>KTpi4+XNg21qu79-puK!(]V_$rahOU;XgPg[`;[sb_8jX6_T0^rbl>Tg]XkMY]Z7S&
+lM:GPs*t~>
+lMhLrq<ltJU#+_LZ'C9%I!BpeJqs>^+GGDrH$k-tNg6m"n%.TTrr)KAU@6X6M04ZUeaK6bo_n:Z
+#QFM[][>QDT_b)XJoCQl!b$#!r/(B(#,]f9YL;q<r;RH.n^X?%eZ=UM(a)q9eAZ.\'6g%>7?rtG7p
+aJ\=FRtGWaCk.ehkH;Ybq>U<l.fT8,^8^;6Q%3e)R`Od-_ip@!CNQauDmZliDJX'$Q(l+An*e,M
+I_bURo`'F~>
+lMhLrq<ltJSD*5gi7lo7da6CjeCOWN+P"uidF-Lpg"YHJlal0Prr)KAU?h""f?`(+kNekpo_n:Z
+#QFM[]ZKEsh>5n-eBIif!jg,#r7Cns#2\M/WRC;6r;RH.n^X?!kMOn;\\?GCi98jmg%>7?rtG7p
+aJ%t]gsjQFbL>5+l__M^q>U<l.fT8,^7X`OgXFBrguRh/]7l#@=_+^A?F7(F>Zt61LRbiolg)'+
+DS#K<o`'F~>
+lMhLrq<ltJWQ2ZRTp;+@X0Jh)US%OV+JGR/Y,eCjR?aJRbdum1rr)KAU<L$;S@"iY[EPAto_n:Z
+#QFM[]Zds^Rei?OUV?ZF!li!Mr13e]#+W!(a)]$g*Gr;RH.n^X>W[@`tra2kNTTsr7Eg%>7?rtG7p
+aK`[cQ_V:6_PWU!_RIAFq>U<l(]O6n^:M1^Q)26jQ`\3B_RmL`Yd(C=[JmNDZa$a:]rT5tbfn2@
+]@Z]Qo`'F~>
+li.Xtq<lnDVsVmDRuDlBF+/n$Q("TLX!"((P)bBSJqBZ,i:488p\t-`fV7ibXGM(VX4?[5f_#.2
+rs&>ecA:l@c2,KfRt>Q`91rN.JsuV<rL*qfdI*[[oDSUe'Dh%9W9VKoK5Y"&F,-X?m[qkpr;?R/
+rqPQc\E(GhIVW)"I#tqt_mSLurqudGrqblrS*J+bK7]Q5lAK2SF*;eSL>RB+iSf03H[9p[_/X@p
+DfU)Zc27M4s*t~>
+li.Xtq<lnDT^Cn#gt:*&cI1:qgYCZbh]Ub1g=b*/eC<=5l0>_:p\t-`fV7]phq-3+hrj="f_#.2
+rs&>ec?\g(a)jne$EgsjQEBP=6deD0uZrS.V6k3SPhoDSUe'Dh%9U?psreBFepcIUk7m$uGkr;?R/
+rqPQcYNk-$e'"0$db<[E]X?bnrqudGrqblrOmM/aeC<:7m!_j6@:Wt`G2I%MiSeNdBkV*h_-^HL
+?!q8ia8>l.s*t~>
+li.Xtq<lnDYfF&HQ^ahV\>Z$jQ'\$?SfjJgQC4;9USF9T][XCLp\t-`fV6TtT:E9ZT!ce:f_#.2
+rs&>ecF_-+YkkI.Q_V:5]tMA!UR1nMrKd_YZH9E)oDSUe'Dh%9Z,Ec2UV=^e\=]:saeR5Or;?R/
+rqPQc]t^M3W5ZZsX-fcs_mSLurqudGrqblr[)B)5USF0X`3cMF\@]Gh_r&;IiShVh^q[Rp_7$_Q
+[(!`gjSSrKs*t~>
+m/Ie!qXE4IV<Z=&OFqdrIYWcWX2N*,rm`.9aM50aVOEsH]'dSQk5##To[oo,eZ=UMM6#1qU=f,:
+n,EUjp#:(\iU-L,$-AZgDd6OcJssdYec!PndFH75jS/ZPrtYP.jh&%`^ls4_=^5lsR`Ocj`9R3u
+rVmT1p"Z[sh6r>iB2rJdMm:snWnd:Gqu7Q1lG]=Zad[p7R`OcVDUX#aJV&sWK7ipmKDpH1JUls4
+I,97"J<87ZoDa=~>
+m/Ie!qXE4ITBt[rg=4Kndam%,hrEe[roYEcjPo.UhV?oBiU".jk5##To[oo(kMOn;fAGcWU=f,:
+n,EUjp#9G<g?nb'$09mkbbh5\eD0-_kPaHGk3'LOjS/ZPrtYP.jh%_]inDl)RAJ-WguRgo`9R3u
+rVmT1p"Z[ll/C=C`JhOXf\kuHWnd:Gqu8)@lG\tRjP887guRgS>gmJ+DfC7$EH1aIEH,r:Df4cS
+C>N]ADLg"2oDa=~>
+m/Ie!qXE4IYJdZ8Q_Uh#W1TWNSu]!!rj<lQXf/"dS<oS2VTI6#k5##To[on^[@`trSY!75U=f,:
+n,EUjp#<NtbfBRu$*BPh^;Rt)UR/+\[Jd33ZF.Q_jS/ZPrtYP.jh&4@W0XC$_o0<bQ`\3/`9R3u
+rVmT1p"Z[k\tb[rahc''S"[=8Wnd:Gqu8)@lG^0LXd>fXQ`\3:ZdZe1`lH?uaN4,MaN2EB`l7/Y
+_;<#G`Qd]IoDa=~>
+m/IdtoA@0XlH,`THuEqGM5I?$e`Z5crpLuslK$dOdE'DRea@b2med"^o[oo,eZ=UMM6#1qU=f,:
+n,F7(qso,XGH%U-Pbt7>Q)D`nK5Y[[R`NR_rU9^M"n&Y&\FBCnrtYM*hQG8^[Z5ZH<E<d\OLjAg
+\`EPbrVmT0n^F)ueZ=UM@o6]XM6#1qT[iW3qu73'lc,L\ad[p7R`OcYF6%rPKE[S=Kn]O*re:?)
+#l91+p4J!NP1K4(J,~>
+m/IdtoA@0Qm,[!Rd`fq]fA>EIkNhL$rp(]om-<ftk2bUbkNlp1med"^o[oo(kMOn;fAGcWU=f,:
+n,F7(qsnN5B;D;XL7b&iO.YLgeBH.dguQG\rTjCJ"K/W4nGE.`(&dg^Y0-"fg!RctOic&*iT\"c
+jS8`QrtPD$e"5mghq-2bI^m_Uhrj<ueai\9rttUu`focMgsjj/jQqS/jD]-[F+aI5F8l1;F8p7d
+qJgNKEH-#Od.73e~>
+m/IdtoA@0a`3#K"X1l?USXc:W[DKl(rlcM*`4rmkZE:75[E5l)med"^o[on^[@`trSY!75U=f,:
+n,F7(qsqV9['?sN]W\HKT!b\eUV=L<Q`\!;rQP5Y"j+Tfd.$r1rtYM*hQFu3URA:,_8=?qR&7O7
+\`EPbrVmT0n^F)R[@`tra1o[%SY!75T[iW3qu7N0lc-BOXd>fXQ`\3<\E(]Pai`!0b0'__rQ>/^
+#l;W`p;k=sd-^E(J,~>
+mJf3GpufYlmEM>YF(oQ8M6#%Sma%ntS"+2]Kp9'nn*]K+mGF7PjS&QPrUea:n("LrFc!0Ln"SJ,
+rU0\3rqh:sLXXIiFiM79Q&Y(NRtH<]aQe[mBPM7MQBd`$HZRi\q>U<l(&d^SU@6X6M03<*<+^E9
+[b]?6hY-sIrtP=qa/A4ERtGWa9jVgnTZukucL:Z-rt"tl`guD:RtH<]aQf"3l(a)f.j"dAt?L&_2M
+K`h@/L&V(*!L)+*s*t~>
+mJe4+pufYhmH*0ScH=AWfAG`Rm)YrVR@I?IG(m-?li-5fmFmD,jS&QPrUea:lf[0Wce%(;l_<&(
+rU0\3rqgYOGLOcGA&c>kQ%//]gsjj/jQq=l<`iImLkgbBC15c3q>U<l(&d^SU?h""f?_!VMT!oq
+iTSCdhY-sIrtP=qa.Ve[gsjQFDQD%4h<"$qcL:Z-rt"tl`focMgsjj/jQqV2l>llF"bZhrF8u:;
+Es)G`F8l/[!JAbis*t~>
+mJf3GpufYta0;#+\&lClSY!-paiCa#Tq&9S\@]DsbfRfAa3)0.jS&QPrUea:bdF(5[%3erbbEb^
+rU0\3rqjaS`7)rA]#MRoQ*nQ4Q_U=BXi.TFXfnps^:h4p\%()Kq>U<l(&d^SU<L$;S@$>O_9&jJ
+UUnOLhY-sIrtP=qa0ERbQ_V:6]u@UWR]si4cL:Z-rt"tl`jWgfQ_U=BXi.l`lH0%J"jm:lb5_M=
+aoh[db5VC_!RU6)s*t~>
+mJf3DnC=Jqfs-K\AT)sQX4?XAG&4^3cI7'eG'(<5CNukFWNp\qoDARfrUea:n("LrFc!0Ln"SJ,
+rU'V0re,obna:pXlK*8mYiNT`IY+$0lB,q,H$Rh^G'8(UIdkeaqu7E.m`hKnc(Ti2?VO@+Fc!0L
+n"\M+rVlg3rqGKa\E(GhIVW(Z>]54_aQfYBlh^MY&,PV3Sa+=dK7]Q5lBHGWK`6Z/PQ->js8VtM
+"94(/s8I]QPLf=)J,~>
+mJf3DnC=Jjkht+?^Wb-Xhrj@&AQlWScI6FSAR`5U=_FOdV6XWIoDARfrUea:lf[0Wce%(;l_<&(
+rU'V0rc<(0na::4lK)Z\V<['oe(!16m"8PRB4oY(A7T7bD",[Iqu7E.m`h?jjk\J3XDiQsce%(;
+l_E)'rVlg3rqGKaYNk-$e'".kV9IHEjQrPZlh^MY&,PV3PO.AceC<:7m"T$9ErL+`KE$"6s8Vt;
+"93F`s8I'?K@'2hJ,~>
+mJf3DnC=J]\"T:raM4dHT!c\TZ*LpOcI9MU]XbV[YdCdOZ*M!YoDARfrUea:bdF(5[%3erbbEb^
+rU'V0rlW=,na=B8lK,a^`4r7:W2#]]`4<4d^:r%.]=Y_j_slphqu7E.m`hfQYaV8s`P0+-[%3er
+bbNe]rVlg3rqGKa]t^M3W5ZZe`4r(6Xi.E_lh^MY&,PV3[`#;7USF0X`4W\Iao9Edd/V82s8Vu=
+"96Nds8L.Ad-^E(J,~>
+mf,?IpZ9/nkJWX9D/Xf`X4=@sDfpBeJ+)r[nUQ,NI!U%_GLYK!K)>QIs8DTBU@6X6M04ZUeaK6b
+o_n.Vs+M8Pr;2/#q=B!@_;MqeI"e6<m?D^@JV!@iJ-1CUqpkTD(B40p_klY?RtGWa928l9LSiJe
+S^6d&rr3c4o\-=lh6r>iB2qN,Ck.ehkH)G]q>U<l&,PV3Sa+=dK7]Q5lBHGWK`6Z/PQ->js8VtM
+"94(/s8I]QPLf=)J,~>
+mf,?IpZ9/glf6aKbfnMhhrgeI?"@X0D=@%7nSW4*C1q5)A^oRRE;TY7s8DTBU?h""f?`(+kNekp
+o_n.Vs)T97r;1MTq=A@.\*;l*dad18m=o(cDf>/aDJjB3EVn)ZrtbV1l,0+ZjP88/VJ(+WcIUk7
+m$c8hr;Q^3rUegDam%d;dD_&OT$,U;j6NPVkP>,Trt"tl`focMgsjj/jQqV2lZ2uG"bZhrF8u:;
+Es)G`F8u5\!JAbis*t~>
+mf,?IpZ90"_Q/ru_S<.=T!c;<[(F*6`:*9;n\rH._8!\/][YfVa8>l9s8DTBU<L$;S@"iY[EPAt
+o_n.Vs2lG1r;4UXq=DG0aLnC:X.buda1]%#`l@Pg`Poj;aSYB%rtbV1l,0[BXd>fs`P'"*\=]:s
+aeI,Mr;Q^3rUegDah"78Y0"Mm_nr:9X2;9ZkP>,Trt"tl`jWgfQ_U=BXi.l`lcK.K"jm:lb5_M=
+aoh[db5_I`!RU6)s*t~>
+mf+X3o%0etfs-K\Dg[YXeW=TiH[gYBK`(e%r.KauJqARBJFW;bK`:uN&H27RU@6X6M04ZUeaK6b
+o_n.Vs+M8Qs8Re,rqCiK_;MqeI"e6<m=oh8KS9:$KE?l-f),I_rqPQb`Se@iHtcYO93cCeR`Ock
+`p<L#rtbM#c_'XQVMB5$:IS;tI#tqt`4+e%rqud,qWc%jlH,NJJssdGP]c;Fre1N>s+Q1,s8.KP
+s+Q1,re1B:f(/ik~>
+mf+X3o%0emkht+?bgP5(kCZrJBl.haEr>lWr,QiQEH#jbDt3L?F8l1=&H27RU?h""f?`(+kNekp
+o_n.Vs)T!/s8R.]rqC39\*;l*dad18m<<,ZEcV*VErU1]s3UZC(B4*i\\.1cg="-,;J)cLeD0-O
+T>p3nrr3c2n'@Njk2+\7ZZf6.ajSo%l+FLcq#:3k&,PS1PO.AceC<:7m"T$9ErL+`KE$"6s8Vt;
+"93F`s8I'?K@'2hJ,~>
+mf+X3o%0e`\"T:r^T3a![C*<O^r4:gao)+[r5m(UaN)<h`pr`Cb5VD?&H27RU<L$;S@"iY[EPAt
+o_n.Vs2l/)s8U6arqF:;aLnC:X.buda18k%aiXJZaoBKas6]^`(B4*i\\u.XQ`J6F]"GtrUR/+$
+YK#o)rr3c2n'@fPZCIMq`kK%$b,^o,]Yh5=q#:3k&,PS1[D]26USF0X`4W\Iao9Edd/V82s8Vu=
+"96Nds8L.Ad-^E(J,~>
+mf+U0lc?'jad[p$I#tqtNbs#iJqSgVL&_1,s+Q1,KnP-WK`(h'L&M#_rUea:n("LrFc!0Ln"SJ,
+rTsRaKbosQs+Q1+pO'9_i4G(uM6#1qBR#)]L&_%(!WUaJs"OHGhQOiT]9%DS=%5\^C4;>\jLDnc
+q>UEnq<,SskJWX9D-KS#<bQlB]&:H/htI'Jrt,2+l,0%Vad[p7R`OcYFmF_[Ka!\?Kn]R,qh5.P
+Kn]R+K`RCgo)F4~>
+mf+U0lc>gejP88/db<[EJQl`&E,p%!F8u8]s)W8]F)uC"Er>oXF8c+MrUea:lf[0Wce%(;l_<&(
+rTsRaEu0K/s)W8\pM7(Cl/C@EfAGcW<bH>kF8u,Y!WUODs"OHGhQONTiS)`&P#>DLbL5,(lEIta
+q>UEnq<,Sllf6aKbb&<?Oic&*iT[qWhtI'Jrt,2+l,/\NjP887guRgVA*\17Es73rF*%B]qf;l>
+F*%B\Ergp?o)F4~>
+mf+U0lc?BMXd>fsX-fcsZa.9^a2uL'b5_Las2rLab0%j(ao).\b5M>OrUea:bdF(5[%3erbbEb^
+rTsRaaqrG)s2rL`pVO5W]V_$rSY!75Y.hotb5_@]!WVQas"OHGhQOf/VO+@*_Rd@s`i,3%^V.>C
+q>UEnq<,T'_Q/ru_Sj*u_TJpHVS'aKhtI'Jrt,2+l,0pIXd>fXQ`\3=]'IK;ap$/lb0'baqoT$@
+b0'b`aoTlVo)F4~>
+n,FF-puK!)i4G(uI#tqtcXh3IJqSf2s+ULQL&Zj\s8I]Us+ULQKn]L*&H27RU$pO5M04ZUeaK6b
+o_n.Vs+M8Qs8Re,rq:`C^u2hdI#4oSmqI'!KSBI'K`V5)qu8AKo@Tl-eZ=UM@o5Z`<bQlB]&:K4
+i:m6NrUo'Q_r/.gHtcYO78RH9M6#1qVqUeArVmH.q<,M^lH,NJJssdGP]c;Fre1N>re6()rV_EL
+K*_7)KDU=UKp1*Ys*t~>
+n,FF-puJuul/C@Edb<[E`Dg;_E,p#@s)\5?F8p<&s8I'Cs)\5?F*%<[&H27RU$Ln!f?`(+kNekp
+o_n.Vs)T!/s8R.]rq:*1[cuc)db!C>lW@e=F*%BYErl<fqu8AKo@Tl)kMOn;\UHe?Oic&*iT[t\
+i:m6NrUo'Q]BS;.d`R_N:jfe!fAGcWVqUeArVmH.q<,MSm,ZsOeD0-OL1BOirc86qrc</ZrV^d:
+E<GuUEVo`V!JAbis*t~>
+n,FF-puK!(]V_$rX-fcsbH&1ka2uKHs2tBAb5]W,s8L.Es2tBAb0'\_&H27RU!0p:S@"iY[EPAt
+o_n.Vs2l/)s8U6arq=13aLnC:X.>iibceb$b0'b]aoVP0qu8AKo@Tk_[@`tra1o*p_TJpHVS'dP
+i:m6NrUo'Q_n;k5X3&5i]"c:mSY!75VqUeArVmH.q<,N!`3#B$UR/+$]XmFNrlPDkrlWC^rVak<
+a924YaSYtZ!RU6)s*t~>
+n,FF-p>2t1fs-K\I#tqt^1MM:JqJ`0qh4nGK`6[Zs8I]Us+ULQKn]L*&H24OTC:=3M04ZUeaK9d
+o_n.Vs+M8Qs8Re,rq1W<i7YAoG_rKOmqR0#KSBI'K`V5)qu8AJn'@TndAD\?@8BKa;Ik!0Z.\'6
+g@Y@Dr:/7.n("LrF^n9A78RH9M6#1qT%*?/rVn;FpuT-,i4G(uJssdGP]Z)?K7nl=pO\"ho7;FB
+Isuk,I=CR8K7oH>o)F4~>
+n,FF-p>2t*kht+?db<[EZrCOOE,fo=qf;W5F8g6%s8I'Cs)\5?F*%<[&H24OTBk[tf?`(+kNenr
+o_n.Vs)T!/s8R.]rq1!*f]_8Gd+@1<lW@h>F*%BYErl<fqu8AJn'@Kik2+\7ZZeT0K>,^bi98jm
+g@Y@Dr:/7.lf[0WcaeL::jfe!fAGcWT%*?/rVn;FpuT-$l/C@EeD0-OL19=cEH6&MpMk0Eo5AMa
+D/=%KCM`BWEH?cZo)F4~>
+n,FF-p>2sr\"T:rX-fcs`N6Yga2lBEqoSd7b5TQ+s8L.Es2tBAb0'\_&H24OT?O^8S@"iY[EPE!
+o_n.Vs2l/)s8U6arq4(,bdX:8Z(7Jobcee%b0'b]aoVP0qu8AJn'@cOZCIMq`kJmm^rWdMTsr7E
+g@Y@Dr:/7.bdF(5[)]qo]"c:mSY!75T%*?/rVn;FpuT-,]V_$rUR/+$]Xd4HaN;NKpW1DIo>\bg
+`5BLQ_Sbc]aNDlso)F4~>
+n,FF,p"QG6eZ=UMF,-X?h/I4SH[^Hom""TrK(X_Jq>Q$Nre:CPKn]L*&H)(IS+"n/M04`]g$klm
+p&47Ws+M8Qs8Re,rUkK6n("LrFc!0LmqR0#KSBI'K`V5)qu8AHlc,jfad[p$>Y@sb:h"R(X4?[/
+ddd87qWc%tlH,NJDd5q3787*.KqQ]XU!<$&rVn;FpuAj%i4G(uJssdGPB#B,It)p(iSJq6eTc7[
+FE2B2EHB?NItIULo)F4~>
+n,Fa5p"QG2kMOn;cIUk7fO.rqBl%X'lu)=`E:n3jq/ULsrcA,>F*%<[&H)(IS*T7pf?`+-kj,,"
+p&47Ws)T!/s8R.]rUjm%lf[0Wce%(;lW@h>F*%BYErl<fqu8AHlc,UajP88/VJ&%nI(7MShrj<q
+ddd87qWc%mm,ZsObbf'$:i<>Ye_T?SS^$U"rVmE-puAirl/C@EeD0-OKj`^8D&$l4iSJ;$eRi?%
+@UWWR?X_/mD/oL#o)F4~>
+n,Fa5p"QFh[@`tr\=]:s`iQMZ^r++/m)AJba7[Npq8pb$rlY9@b0'\_&H)(IS'8:4S@"cZ\'Lr*
+p&47Ws2l/)s8U6arUmt'bdF(5[%3erbcnk&b0'b]aoVP0qu8AHlc-0IXd>fs`P&[k^W3^PT!ce4
+ddd87qWc&(`3#B$^;[e#]"Q(pTpi4+Wm0u/rVmE-puAj%]V_$rUR/+$]=6Sp`"g20iSMB&e\/T+
+\[])X[^aPs`5qlDo)F4~>
+n,Fa5p"QG6eZ=UMA93O'dG9@fDK9iAaEGnYHJ*XmjaVi5q1S_HKn]L*&H)"BU[?="Km\uni8L]k
+p&=:W(kn1Rs+Q1*oQm;$eZ=UMM6#1qC3kJbL&_%(!WUaKs"XNJk.J4b^ls4_=[u+a93cCeR`Ocm
+amAm&p>NEti4G(uBiePK<_H\9JssdGUr;QprVn;FpYrU!i4G(uJssdGOD;JJFE;K4Z`\,>Sp-Kc
+Pc_pC_T/`rGCK;:o)F4~>
+n,Fa5p"QG2kMOn;^<Y<dk1O`U>[V#NaCNWGB\@*7j_\pTq/ZH6F*%<[&H)"BTC(are^E11l.N)l
+p&=:W(it?0s)W8[oOt#ckMOn;fAGcW=D2YpF8u,Y!WUOEs"XNJk.Iq`inDl)R9F2aAu3`$guRgr
+amAm&p>NEll/C@Eb*&U2O_1H6eD0-OT#BpjrVn;FpYrTml/C@EeD0-OJQTV)@prcTZ`[K,SnEk6
+L8DPq\%\_FASq1fo)F4~>
+n,Fa5p"QFh[@`traL@e3ZH';S[(!TWaLfdI^Y-E=ji#0Zq8rU8b0'\_&H)"BX2hH5TrXQX][3\6
+p&=:W(s:5*s2rL_oY70F[@`trSY!75YeS6$b5_@]!WVQbs"XNJk.JCBW0XC$_n3Rh]YqR[Q`\33
+amAm&p>NEt]V_$rahl!:_S!h%UR/+$Y/KW%rVn;FpYrTu]V_$rUR/+$\$3Qb]"#5ZZ`^U/T!Z5F
+]X>\rai:`q]YsR2o)F4~>
+n,Fa6p>2t@eZ=UM@pjA5VU=eg_3:+KVj4$IC8Gcc]6/@Fk(*1&Kn]L*&Gtk;WTqTpK7&cli5)VS
+pAXCX(kn1Rs+Q1*oQm8#eZ=UMM6#1qC3kJbL&_%(!WUaKs"aTIi3L8Y]9%DS=%c@_8Qoq\Q,Mje
+^ZYCho%'Vpfs-K\AR&nkBNA5MIZhJ,\%Lhtrr2p5rqGBY`8J7hI"Ig.lAAo;Vj*CN`5KOlmf;eT
+l2^#Gi!/K*H[+r+rq$/?~>
+n,Fa6p>2t<kMOn;\['N3hWF4X[Y0BiTST51=J]5-]45Gek&9tjF*%<[&Gtk;U?psreC*(0l*mkR
+pAXCX(it?0s)W8[oOsubkMOn;fAGcW=D2YpF8u,Y!WUOEs"aTIi3KuZiS)`&P%K)R?_5HigZ.Ur
+^ZYCho%'Vikht+?^ST&uacVt6db<^GYIrulrr2p5rqGBY]BS;.da[(5m!MKmTSA/t]XtcSli$/M
+li$&Pm+H,cmEGS$s*t~>
+n,Fa6p>2sr[@`tra2YT\S?g2ZaLf*uZ+d9/YGJP3]=P\kk/R,lb0'\_&Gtk;Zc&u4UT9cZ]Z%)3
+pAXCX(s:5*s2rL_oY7-E[@`trSY!75YeS6$b5_@]!WVQbs"aTIi3L85VO+@*_S!Xr]YhU`Q)hd0
+^ZYCho%'V[\"T:raMc6.b/2'9W0XBs]tEJ%rr2p5rqGBY_n;k5X.u#``3Q/5Z+[ch`5BIkbQ,fb
+_uR[Q]EZ=!\@q:orq$/?~>
+n,F"!puK'(i4G(uBjP1gLSi>Li;Dj?mJZJ]_8V[aD81>TmXp2lrr3Q+m)Z*iad[p1OLjAdZJbKV
+lMhZas8Re,rUbE1n("LrFc!0LmqR0#KSBI'K`V5)r;SPNo@Tqufs-K\AQW2H>YA+2I#tqt_mA:p
+q!6%omEM>YEF3C,M0ru;BRGoQi5;n[p\t0l&,u=]ZGYV4OF1tuS&ssamJcANjSn*:eH""raT09X
+]*?C5d;e*jrU^&>~>
+n,F"!puK&rl/C@Eb,_hnf&#NPl29lJmJZ>Y[_7E.>ean1mW!:Hrr3Q+m)YjdjP885g>V;+ZJbKV
+lMhZQs8R.]rUactlf[0Wce%(;lW@h>F*%BYErl<fr;SPNo(a)Tqnkht+?^R1k-V.Yq4db<[E]<gGh
+q!6%kmH*0Sc)f%8f@%d'ajSo%l+=:\p\t0l&,u=]ZFfA[g="3pguRhfmJcGPlMg&Ik5aZDj8e6=
+i<JB,aC!lIrU^&>~>
+n,F"!puK'/]V_$rai29/T:E-p]_o\Ja8O3iaMkj"ZbO35m`<NLrr3Q+m)ZHMXd>f`R&7O8ZJbKV
+lMh[Is8U6arUdk!bdF(5[%3erbcnk&b0'b]aoVP0r;SPNo@Tq`\"T:raMYs:`4Wt0X-fcs_R&1o
+q!6&#a0;#+]#DgmSZBoMb,^o,]Y_#6p\t0l&,u=]ZGX>PQ`IiqQ`\3Ma8X!W^](nF[/dN3XT5F#
+V?X06bdQHlrU^&>~>
+mf*jpm*(7Pc(Ti:EGB$*LS:ubr5er`rRLr+*U<(NY'IS+IY.Irs8Vr]`i&+DRtH*M]&:E3iV3?6
+rtC+bo[oo,eZ=UMM6#1qC3kJbL&_()s8N)Mr;SPLn'@TndAD\?@9dDeDd61NGDi`Zi25/to]!Ek
+jM6t.CN"T^X,q^BA9Ws:g#/jap&4mi&,u:[YJ];1OF1b\Jt'm4c2Pfb_#CtFX8o-sRfJ`PO9VB&
+m>BH;r:Br=~>
+mf*jpm*'_Ajk\J7c-*iHf%o9Cr8[k>rTF4Fs6L]XVJ3ThCiK:Ns8Vr]`h;\Zgsjd+iT[kZiV3?6
+rtBJPo[oo(kMOn;fAGcW=D2YpF8u/Zs8N)Gr;SPLn'@Kik2+\7Z_bUdbb]s+d+I:?fr!Emo]!Eb
+lJgOHbKSDghqHN$^<kNjkh2rip&4mi&,u:[YI`uWg="-feD0-Jjo4<@ir7p9hZ2O4g]6+-g'6Bp
+m<[=%r:Br=~>
+mf*jpm**&]YaV8g]>hq$Ssl@Mr2ft'rO)[<*Q6+E[^EZo_oMZRs8Vr]`j!C`Q_UUKVS'pUiV3?6
+rtEQRo[on^[@`trSY!75YeS6$b5_C^s8N)dr;SPLn'@cOZCIMq`l-!+^Vmq/Z(%GrbGNq_o]!Ep
+^SmHs`P8I(a)SsZS$aK_5.\'1i+p&4mi&,u:[YJRrLQ`J6BUR/*jYl:a)W;`[nT)bD\QN3<LQNin_
+a1Ts_r:Br=~>
+mf*jso\XW*i4kqFKmn5cF+oR7r0m\[rN-%2*Qc^^kO,mVFF<TSrr2c[`i&+DRtH*M]&:E3iV3?6
+rtL1co[oo,eZ=UMM6#1qC3kJbL&_2OL&_/Qf)>V)rqYfrV<Z0lK5Y",H&7,k>[VW.VU=h'cg:)O
+VVp.4N-K8gOLhF&OF1bbM6#1qT(a)EH0rr3N.p"ZS*fs-K\AR'/*S#i=_RfJZOOT((:L]2o+JGsp$
+JssdGQdEnQoDa=~>
+mf*jso\X#cl/LOPe^DghcILS$r7h;.rSRY6*TZAHlg1mP@qtN0rr2c[`h;\Zgsjd+iT[kZiV3?6
+rtKPQo[oo(kMOn;fAGcW=D2YpF8u:=F8u7?d/Eu#rqYfrT'YOneBFf.dFZmlV6S=shWF0ocg:)O
+VV11kf[.jjg>T*kg="-ifAGcWT(a)EH0rr3N.p"ZS#kht+?^ST0(gu$reh#5t+f)XD$e,[tsdKe:W
+jQq`M`;K6,J,~>
+mf*gro\[+"]Vq9eTr>6.\"T;gQN3KQTDtc/Xg5FQb.ja`_=7=#rqbs#Yf*Z1UT9cZ]Z.>;p\s=T
+'[$CHfV6TtT:E9ZT!ceH^W4L>s8W&?s8N)drVn\Qq<>f"`3#B$^;\3sSYNp;`jhY2ZH8iem-`K&
+bdX:8Z+m?,VQH__X3.f?T!ce7eFNP:rt#,%goAT-Tpr=.`4i"5T:5bG!1*VNrgWt[rhBIiri6:!
+Q`\3@d,Foos*t~>
+mf*aqqX/WG_W8tMTTY4eK)U/qK)gW(M>rYXS#3I/dH'5?Eng'ZrVGj"Vs;BnK7&cli5)eZp\s=T
+'SZMXfV7ibXGM(VX4?ZRH@gg(s8W%Os8N)MrVn\Qp>NEti4G(uC2\BXUmcmR>]54_aQfS<jQ=OV
+mEM>YEI<kZi.J;HOF2&%TZuktbjPB-rt#)$g8=>hXGM(0;-\$lM1tq]!.Oops)n<g!.b'#reUiJ
+c0C\FbP^u3J,~>
+mf*aqqX/!#\*E)6h:gN3eGdnoe,\%tfDjPFgtpuLk3CWD@,(/HrVGj"T^:apeC*(0l+"+Zp\s=T
+'Qa6FfV7]phq-3+hrj<-BQ/$6s8W%=s8N)GrVn\Qp>NEll/C@EbKSAebhU^lV9IHEjQrJTjQ=OQ
+mH*0Sc-k>)l$'>ig="6rh<"$pbjPB-rt#)$g8=3!hq-2bI\k9<f@BlM!7Uqqs3L\m!7UqsrmqA0
+jm7iQ`Vf?-J,~>
+mf*aqqX2)'ahP'TR[0G:U].=lUB%"dSGnipS>!!h^Wa6tg[G";qWl/*`3#B$X-fcs`jF_!roX4p
+b5LtbU<L$;S@"iY[EPkia3)R)s8C+?rrDHbs"jZJiO-S9VO+@'^TNurQ_V:5^S@-t`3-u<k/aLA
+YaV8sX-fcsWO/OhX1P'oYfEcfmed"`&,l1TVTcH?S@$>O`4i":U&LeeW;`jt[/R*+VZ*@iSHbFb
+`4sd\r:Br=~>
+mJd^qpj[O*\aA4t^TjH#OH>CuM#`>1K)U-<K85DNVSLmPQ+GfBqYBHsVWu9mK7&cli5)e[p\s=T
+'SZMXfV7ibXGM(VX4?ZRH@gg(s8W%Os8N)MrVo=bo%0_rfs-K\Dg@AOR%p.&DeON[]&:N6g"NpF
+jM6t.I#tqtnQ!<]]9%DlR`Oci_Wgprs8W&ifq\#dXGM(0;-\$^H2`3jJcLN(M>iS:Q2[6OWs60&
+oPWI0rU^&>~>
+mJd^qphaVJZ0gc:io&YJg=k3Wf)XD$eGdl:eCN:,hW!bdLUu=4qYBHsT^:apeC*(0l+"+[p\s=T
+'Qa6FfV7]phq-3+hrj<-BQ/$6s8W%=s8N)GrVo=bo%0_kkht+?bgG,&R&f#lbfS;eiT\"^g"Np=
+lJgOHdb<[El9quCiS)`0guRgm_Wgprs8W&ifq[lrhq-2bI\k97dJhSne,\%ufDaJ(g]$"-hZi',
+lWi5drU^&>~>
+mJd^qpr'kP^;mghW1fZHR$aB(a)SH,;]U].;7URms?S>`p;]t3%jqYBHsYJdQ0UT9cZ]Z.><p\s=T
+'[$CHfV6TtT:E9ZT!ceH^W4L>s8W&?s8N)drVo=bo%0_]\"T:r^TO!"V5]fV^<3LDVS'gRg"NpK
+^SmHsX-fcse=4FiVO+?YQ`\3._Wgprs8W&ifqZd!T:E:/^VmmoY5YL$UB%"eSc4uVQ2[-LSd)(4
+gp>etrU^&>~>
+m/IRoK7A0UL=#>Kg!.UL]!;16!2faa+HVV=HujO_LQf!flD_V\p%[glVWu9mK7&cli5)e[p\s=T
+'SZMXfV7ibXGM(VX4?ZRH@gg(s8W%Os8N)MrVo=`mE;6kc(Ti2H&f>hKr2t]Jo>jkZ.\'2bfcd>
+fs-K\JssdG_-N&cad[p1OLjAg\E!A`s8W&ifV7ibXGM(0>]54NNrG.>RK0#[X8][1`;[jWeHXt!
+QZ_N>rq$/?~>
+m/IRoEG]?tGK9+9kiLmaiSaXk!8d_1+PPN"da$4gf%T'Dm%_DXp%[glT^:apeC*(0l+"+[p\s=T
+'Qa6FfV7]phq-3+hrj<-BQ/$6s8W%=s8N)GrVo=`mE;'fjk\J3dFmLBHCj3QeBH:li98jibfcd7
+kht+?eD0-O\4hD=jP885g>V;/\E!A`s8W&ifV7]phq-2bV9IH@g&B_)g]610hu;R7j8S-=k6C2<
+M.>bmrq$/?~>
+m/IRoaMbg%\]`%.\$3!3VP3pZ!1a%T+IJRhX1,@1SsH(S`3R5?p%[glYJdQ0UT9cZ]Z.><p\s=T
+'[$CHfV6TtT:E9ZT!ceH^W4L>s8W&?s8N)drVo=`mE;NMYaV8sY*l&rV6m@kUV="&Tsr7Abfcd*
+\"T:rUR/+$_kXWXXd>f`R&7O6\E!A`s8W&ifV6TtT:E:/`4r(<RJrTQQN3KRT)PSeX8]7#[0F:a
+^UiXmrq$/?~>
+li.EIK7Mg$DMG[ZmHWWfg&0A#dJh30]!eJtHt[A<IZ1/OhPJTcp$'GllH,NJI#tqt_6r:sroX4p
+L&LYrU@6X6M04ZUeaI7!JqSjXs8@ZOrrCXLs$m"_jh7eZ`0GjuNjdd5>E%jhRtGd;VU=h"]==F!
+c(Ti2JssdGS7RiJad[p.NjdcjXPNRJs8W&ifV.caXGM(0Dh=FY[f3l;a8jKaec+J,kPjcGmfg[e
+F+!T/o)F4~>
+li.E8EGjWC>^*F*mHj*%kksTDk5OHAi?$k0d`TeZe(EO>g8!$]p$'Gfm,ZsOdb<[E\@(>jroX4p
+F8ba`U?h""f?`(+kNc5`E-$+#s8@$=rrCFFs$cq^jh7MVj4i&1g#;/[97H6ggsjX#hWF0k]==6q
+jk\J3eD0-OQ;`J'jP884g#;/:XPNRJs8W&ifV.Wohq-2bbgbG*rSdb:!9O4CrojFKrp9XM"hf1j
+C@faAs*t~>
+li.F:aMm#I[(3loa2GX'\,<W6ZMpsKVPBZKX3/;gW10<_`i@DPp$'H!`3#B$X-fcs`jOh#roX4p
+b5LtbU<L$;S@"iY[EPkia3)R)s8C+?rrDHcs$m"_jh8(=X-KNaRA7@AR'af6Q_V'_S?g8/]==]X
+YaV8sUR/+$V5h,FXd>fcRA7@7XPNRJs8W&ifV-NsT:E:/^S@-eU]..iXT5U)[Jmf=_Z%LQbQYtt
+\\[n'o)F4~>
+li7!=$\\/%HZm!"Um/^2i;E$Dmf)Joi8)elOF1bNCOVG]jLD\VnE7]clH,NJI#tqt_RAM"roX4p
+L&LYrU@6X6M04ZUeaI7!JqSjXs8@ZOrrCXLs$ltZgo\u[[Z5ZaQ,Mk5ARFoVXGM(OR`OceV4b6W
+^ls4rP/$)KPAFh!eZ=UMM6#1qT[iW2s8W&heXl6[XGM(<Jssd2h>Z@3l2^5Nmgm:N_4m0YQCDZ,
+]Q\dTqpk9;J,~>
+li7!+$ZblVBk=lTT8'h`g&117llbQVk2G%Bb-T:>g>_D%\)6]<_k-5Ugsjd+iT[k\j7rW9rtKPQ
+o[oo(kMOn;fAGcW=D2YpF8u:=F8u7?d/O&7rUemIb3@m<dF6k1lc3"#lf[0Wcd^b2m$X]CXm4p"
+e'ct0lKXR:;sWW(f?`(+kNeeko)/OfrU\R2lf[0WccjnojQGb+l2L#LmJcD^]!o/6KnbAP=^8UN
+CN'*ro)F4~>
+li7"-$H_qY^q@7XXh;`qqof&^rkoql]!A3#X3/H$W0XBs]slngkJOI@Xd>f`R&7O9[c@/^k5Q.<
+rUea:bdF(5[%3erbcnk&b0'barQ>0?!:Bdc7fDu7Xi\/LRBEEPX2<2WV9H?>S(a)#&XXi.38TY%t;
+QDgaJW5$rJZ)Z$UT:E9ZT!ce8eaiY<s8DQ>T$4U7S@$&+Q`[[,rk/6K!6>)_&&H?.^q7:oS$963
+]Y_\cmIL:-~>
+li6s<2#W&YJE5FsFE)5@ChmdZBqD8fTu#(Ci4G(uBjc";VU=h+cfjE(U?]jiK7K6*kJXplq#9FU
+'SZMXfV7ibXGM(VX4?ZRH@gg(s8W%Os8N)Mrr6C(n'RfrdAD\?KqQ]XTl+Jgh6r>iI#tqt_23g5
+eZ=UMKqQ]X\#XO`i7YAoG_Mg8m@_Yiqu?]on^<lpeZ=UMJssdGn'Ake_3:+KUM4MBY&A<#FEMfU
+H@4h)JqX-So)F4~>
+li6s*2#VE5DWKN]@UNJQ>$4t$=.>q=S%$E(l/C@Eb-B7ChWF0tcfjE(SF#=leC314laaReq#9FU
+'Qa6FfV7]phq-3+hrj<-BQ/$6s8W%=s8N)Grr6C(n'R]mk2+\7e_T?SP[7>0l/C=Cdb<[E\VYt)
+kMOn;e_T?SYH)&5g$%AHd+-t6m@2;dqu?]on^<llkMOn;eD0-Olc-NF[tTQlSl]'nY$PID@Uiut
+BPQXHEH;'*o)F4~>
+li6t,2#YM9`T5ar\[SrOZ*:I+Y+i57WlW?)]V_$rai:i_S?g88cfjE(X2M-,USa<W_TKFMq#9FU
+'[$CHfV6TtT:E9ZT!ceH^W4L>s8W&?s8N)drr6C(n'RuSZCIMqTpi4+^oONY\tb[rX-fcs^km]f
+[@`trTpi4+^8n`HbI=17Z([Vja/I2Kqu?]on^<lM[@`trUR/+$bf[cCaLf*uX0/\*Y-k^J\[oH%
+^VT$NaN=GKo)F4~>
+li6s<2#i8_K_Y2kIsud#H[:"iH-j`V^2IeN^Yl_cHtd>EP/$(g^YmtZ`Se@iI"Ig.lD;5Xq>TOV
+'SZMXfV7ibXGM(VX4?ZRH@gg(s8W%Os8QW\s8W)ol,0@_ad[p&KqQ]XKQ_1:jM6t.GDi`ZheJ;=
+ad[p&KqQ]XT"oMd_r/.gI"7L#kH2M^q>UEkm`hftad[p7R`OcP@;2l`EH?5FcZsikhL'a#It3(>
+JqEcNKSBHWo)F4~>
+li6s*2#hW<Eqo:UD/=!3BkV23B@+h3^0Xs)[HZZ(d`Tb]g>_D'^YmtZ^$4M0da[(5m$YTNq>TOV
+'Qa6FfV7]phq-3+hrj<-BQ/$6s8W%=s8QWVs8W)ol,0+ZjP880e_T?SFCn^QlJgOHd+I:?fP6?2
+jP880e_T?SR_WK>]BS;.daQt2l_VAZq>UEkm`hQojP887guRgM:fsl,?t!PUcY$qGhJ6nCD/O:^
+E,kYnF*%B.o)F4~>
+li6t,+TKU,anYMj`5BI1^q[Y9^<k'7^9t24a1S:9X3&A[QDjet&E)EU`Or(7X.u#``4itKq>TOV
+'[$CHfV6TtT:E9ZT!ceH^W4L>s8W&?s8QWss8W)ol,0^CXd>fpTpi4+[^36X^SmHsZ(%Grb%dEa
+Xd>fpTpi4+VnfsO_n;k5X/;/__R@5Bq>UEkm`i,WXd>fXQ`\34Vm!82\%'#]cb(a)0KhSR.I`5Tad
+a2n%tb0'bOo)F4~>
+li6s<!<<%P#6+S\KS+o=rdlKhJai)WkBqQiBY`Q<OF1bfNjdckYLhI8`8J7hI"Ig.lB]<OqYoXW
+'SZMXfV7ibXGM(VX4?ZRH@gg(s8W%Os8Q*Ms8W)li3UA[]9%DfOLjB?BmjudlH,NJEJ:(1m;TS[
+TnRK8P/$):VU9^0\E(GhIXI6gi5;kXpAP!fm)c3kad[p7R`OcUD0FZ^IXZcsn:?2apAT^DKEM.*
+L&V(*!WUaAs*t~>
+li6s*!<<%>#6+SXEcH)Lrbs4VDt*13kA"YE<jq8Og="-kg#;/:YLhI8]]nD/da[(5m"rUDqYoXW
+'Qa6FfV7]phq-3+hrj<-BQ/$6s8W%=s8Q*Gs8W)li3U&[iS)`.g>V;]=)D<!m,ZsOc.1Y3m;0/k
+h:9cug>_DNVU9'aYj16%e'ct/l+=7YpAP!fm)c!gjP887guRgR>@lQ)Ci+$,n8E:=pAT(2EWc5\
+F8l/[!WUO;s*t~>
+li6t,!<<&@#6+SkaiMQJrl6AX`piE7kJ=mIY/e2PQ`J62RA7@8YLhI8`4Vt6X.u#``4<bLqYoXW
+'[$CHfV6TtT:E9ZT!ceH^W4L>s8W&?s8Q*ds8W)li3U>6VO+?aR&7OGY.D'T`3#B$]:k[ta*G"q
+R\@<kQDhRHVU</e]t^M3W2l;_]Y^u3pAP!fm)cNNXd>fXQ`\39ZFnr/_o0L4nA`NApAW/4aTMI`
+b5VC_!WVQXs*t~>
+li6s<!<<%Ps8N)[re2ebKnY3YK`(_#q1=1VF(X=_Z&EpMM6#1qU!D2o`8J7hI"Ig.lBfKTqW7_k
+L&LYrU@6X6M04ZUeaI7!JqSjXs8@ZOs&IYMs8;H=U[Qa7M04?6`95!TJotereZ=UMEJ:(1T$<s_
+EH?o4dI+ERhL0LDlH,NJFc!0Ln"\J)r;QQYa/A4ERtH<]aQet0II`$cq>,dBKS9@(qh51QKn]P\
+rr2uLo)F4~>
+li6s*!<<%>s8N)Wrc8'lrc9CaF8YoUq/L?3@T;"Di7QE&fAGcWU!D2o]BS;.da[(5m#&dIqW7_k
+F8ba`U?h""f?`(+kNc5`E-$+#s8(a)$=s&IGGs8;H=U[.+#f?_q#j6O-YEb&8;kMOn;c.1Y3RH<8T
+c-Fnsk3T+ZhJ6Snm,ZsOce%(;l_E&%r;QQYa.Ve[gsjj/jQqS/C[uK?q>,.0F*%?[qf;o?F*%A&
+rr2uFo)F4~>
+li6t,!<<&(a)s8N)jrlP5frlQPcb5D.Yq8gS7\Z<r`Tpr<oSY!75U!D2o_n;k5X.u#``4<kPqW7_k
+b5LtbU<L$;S@"iY[EPkia3)R)s8C+?s&JIds8;H=UWg-<S@#/YX2<&d^UpYm[@`tr]:k[tT<OcX
+]""B&ZH:.uhSQh-`3#B$[%3erbbNb[r;QQYa0<LaQ_U=BXi.i]_XbeCq>/52b0'__qoT'Ab0'b,
+rr2uco)F4~>
+n,ELhr;-6gKE2#NL&_/QjSji5PQ$7^s+ULQL&Zj[nTo&VjM6t.EJ:(1mA%_LYf,J3OF2YKaQf/4
+lh]`C'SZMXfV7ibXGM(VX4?ZRH@gg(s8W%Or;T@cm)ksfc(Ti2KqQ]XUN2*7D9q%HNd>>XKqZbb
+KlLLALSiJeHctZ'GFn6MVMB5HTZuktbjG<,qWl/!lH,NJJssdGPf8.JL&V)UL&Zj\s8VtM!rmt.
+r;QcJo)F4~>
+n,EXlr;-50Ec_6ZF8u7?i;RctKDop<s)\5?F8p<%nRu.&lJgOHc.1Y3m@VGHYe0/Yg="L+jQqfE
+lh]`C'Qa6FfV7]phq-3+hrj<-BQ/$6s8W%=r;T@cm)kgbjk\J3e_T?SQ=+lK>KH'fg!Rd`e_T?C
+e]kAEf&#QUD9M0\AXi&KhU^!&h<"$objG<,qWl.om,ZsOeD0-OL;e$*F8l1CF8p<&s8Vt;!rm=_
+r;QcDo)F4~>
+n,EXlr;-62aiaV^b5_JAoDZl4d/M06s2tBAb5]W+n\;BI^SmHs]:k[ta/m>/Yf",NQ`HmJXi.fj
+lh]`C'[$CHfV6TtT:E9ZT!ceH^W4L>s8W&?r;T@cm)l9IYaV8sTpi4+_RIFsZHKhSRBFZDTpi3S
+Tt87RT:E4/Z-2CM]VEWTS=[3`R]si3bjG<,qWl/*`3#B$UR/+$]Z%hbb5VDEb5]W,s8Vu=!rpEc
+r;Qcao)F4~>
+nc'.!r:faIk^J&6q1OHUs8V0ZK`I>9KdHbQs8RfQKn]8LEKTP.RtGX2R`Ocm_U#F'i4G(uJssdG
+R)nXjjo6$KrUea:n("LrFc!0LmqR0#KSBI+rIt4M9)eVI]Xd+=PC@M*TZukXG)CZeZK/fbIVW80
+KqX3??Yk7X`95Tkg@9`?VXN':M04?6`948;kP>)Qlc,jfad[p7R`OcY`ddi=rr3.Us+Q1,s8.KO
+s+Q1)rrCX@s*t~>
+nc&ppr:faIk\Y3Vq>PI8rrD!VEr^jlF!^j-s8R0?F*%(k?\Ie,gsjQtguRgr_U#Etl/C@EeD0-O
+Mob8]jo6$9rUea:lf[0Wce%(;lW@h>F*%B]rH%r;9)eVI]Wg\\g=+<sh<"$IA9r$!VX!0pe'"i;
+e_Sd#XNT)Ij6Oiug@9)pVX*F&f?_q#j6NPVkP>)Qlc,UajP887guRgV`bkQnrr3.Cs)W8]s8-j=
+s)W8ZrrCF:s*t~>
+nc&ppr:faIketH\q>SP:rrDZiaoKffasI)1s8U7Ab0'Iq[^sDZQ_V9iQ`\32_U#F']V_$rUR/+$
+]#a77jo6%;rUea:bdF(5[%3erbcnk&b0'barQ>*=9)eVI]Y;.ZQDhEhR]siB]>qdt`kSI<W5Z`f
+Tph[d`PSL;X2</eg@<1tVTcH?S@#/YX2;<[kP>)Qlc-0IXd>fXQ`\3=`l._rrr3/Es2rLas80q?
+s2rL^rrDHWs*t~>
+nc'-soB+WF^iO[Fl@O\Cs8V0ZK`I>9KdHbQs8RfQKnT/JE09G-RtGX2R`Ock^s/sui4G(uKqQ]X
+R*+gnjSonlo[oo,eZ=UMM6#1qU=b'NL&_2OL&M$DrUo!KdG;6kH@1gci:1T.N.5u(mEM>YEF3$l
+KlLI-F,-X?m]V!!p@Wg>`8J7hI!h$ei5;eUp&+[P`hr%CRtH<]aQf#0J,4lurrn,VKn]R,qh5+O
+Kn]I)!7p`@J,~>
+nc'-soB+WF^gUbfl>^ics8V$VEr^jlF!^j-s8R0?F*%%j?\@_+gsjQtguRgp^s/sll/C@Ee_T?S
+N6:PbjSonlo[oo(kMOn;fAGcWU=aF+F8u:=F8c,2rUo!Kb3@m<dF-b-l0;DaI;NM<mH*0Sc)e"k
+e]k2#cIUk7m&+X\p@W1,]BS;.daHk.l+=1Vp&+[P`h;\Zgsjj/jQqW@D>J>QrrmKDF*%B]qf;i=
+F*%9Z!7:<:J,~>
+nc'-soB+WF^pq"llH%)is8V]iaoKffasI)1s8U7Ab0'Fp[^j>YQ_V9iQ`\31^s/st]V_$rTpi4+
+]ZTX=jSonlo[on^[@`trSY!75U=dN/b5_M?b5M?4rUo!Kah"78Y,dqe][X1"b/Cp%a0;#+]#DY"
+Tt84_\=]:sagnqCp@Z8._n;k5X/hVb]Y^o0p&+[P`im=_Q_U=BXi.ll`;7XUrrpRFb0'baqoT!?
+b0'Y^!:B@WJ,~>
+nc'-kiPqq)a2=clc$k7ts8V0ZK`I>9KdHbQs8RfQL&18gCp<!9PC@G%R`Ocl^rr^oi4G(uKqQ]X
+MU(\gjSoeio[oo,eZ=UMM6#1qU=b(rrr<"P!WRlPs%<4Ze"6$YXGM(MQ,Mk&Dg[UsH#)m!XGM(0
+;-n6L:1/-uVU=h(JaWC0I_`,L`0GjqM6#1qT[`N/qWl/!lH,NJJssdGPfA4LL&V)UL&Zj\s8VtM
+!rmt.r;QcJo)F4~>
+nc'-kiPqjt^:9S9c"q??s8V$VEr^jlF!^j-s8R0?F8G@U>,:HCg=+9qguRgq^rr^gl/C@Ee_T?S
+IEq<ZjSoeio[oo(kMOn;fAGcWU=aG`rr<">!WR6>s%<4Ze"5mghq-3'gZ.V.?#"k-B3FQ`hq-2b
+I]UeqFg96ChWF0pEUN\uCquq6j4i&/fAGcWT[`N/qWl.om,ZsOeD0-OL;n*,F8l1CF8p<&s8Vt;
+!rm=_r;QcDo)F4~>
+nc'-kiPr.7`lc6+c,7TEs8V]iaoKffasI)1s8U7Ab51SWZ,=>TQDhQnQ`\31^rr^o]V_$rTpi4+
+\'FI?jSoeio[on^[@`trSY!75U=dNbrr<#@!WU=@s%<4Ze"4dkT:E9cQ)hdF[)'u+^9GhhT:E:/
+^W!e'^;d[TS?g83^(a)(jm_n`auX-KNgSY!75T[`N/qWl/*`3#B$UR/+$]Z.ndb5VDEb5]W,s8Vu=
+!rpEcr;Qcao)F4~>
+nc'-^a04poi8EeVW-3ZCrVtsXK`I>9KdHbQs8RfNKC@U-F5>6@LN@BcR`Oco`65"GeZ=UMM6#1q
+DU\.Rp&><sr;6?dqYU6jq>V90o[oo,eZ=UMM6#1qU"4elrVc_LL&Qf)s%<.Ra/A4ERtGX5TZul!
+F+3lVHuHjZ]9%DS=&!$r>&8_S`95UOL@kE@JBOYRc(Ti2JssdGW6"<#q<Q%ulH,NJJssdGPfA4L
+L&V)UL&Zj\s8VtM!rmt.r;QcJo)F4~>
+nc'-^a/J(a)jl07NeV.FL`rVtgTEr^jlF!^j-s8R0<EUV\pA(g#$f$;LhguRgt`65"CkMOn;fAGcW
+?ISHBp&><sr;6?dqYU6jq>V90o[oo(kMOn;fAGcWU"4/ZrVc_:F8g7Zs%<.Ra._k\gsjQuh<"$i
+@;P]2C0e=5iS)`&P&IF@T$,U;j6OjiG4b_0DTeR;jk\J3eD0-OU<)Zrq<Q%nm,ZsOeD0-OL;n*,
+F8l1CF8p<&s8Vt;!rm=_r;QcDo)F4~>
+nc'-^a10:/]Y),+XLuKmrVuKgaoKffasI)1s8U7>aR@orYf<u=T!uJ0Q`\35`65"$[@`trSY!75
+X4-V:p&><sr;6?dqYU6jq>V90o[on^[@`trSY!75U"76\rVc`<b5TQ^s%<.Ra0ERbQ_V9gR]siL
+\AS(6_6h:rVO+@*_S*q&_nr:9X2</a_t<m(`QP7$YaV8sUR/+$Z,l8,q<Q&)`3#B$UR/+$]Z.nd
+b5VDEb5]W,s8Vu=!rpEcr;Qcao)F4~>
+nc'9SXPhXI]=Z#7iG<diqYoQ0L&[A9KdHbQrqqE>IaturhU/3UF(T]X[b^G5bKQ^LeZ=UMM6#1q
+E7a^[q>V!)rVQEao'PZ(l0e6@rVuorrb)3,n^X9#eZ=UMM6#1qS'QTTo^qg.K(aiorVlfkjh&%`
+^ls4eKqQ]XKm&"Cq0mFMlH,NJDd5q0:1/-uVU=h8^P_gcr.3Fnn("LrFafLgjL;_]p\F-qVs;Bn
+K7]Q5lBK;<qM"qK"blu1L&_2MK`_:.L&CrNf(/ik~>
+nc'9SWnHRqiSih\fii$+qYoDoF8pmlF!^j-rqpd,Ct6(]g#h/BcG\,`iTTQ_bKQ^HkMOn;fAGcW
+@+Y#Kq>V!)rVQEao'PZ(l0e6@rVuorrb)3,n^X8tkMOn;fAGcWS'PsBo^qfqE;";KrVlfkjh%_]
+inDl+e_T?SG%>Leq/'Sqm,ZsObbf&mFg96ChWF1&^O#\Sr,:/\lf[0WcdLP,lE@e[p\F-qT^:ap
+eC<:7m"WMsqK)Z9"`s]bF8u:;EruA_F8Z%<d.73e~>
+nc'9SZH9MTVP^E'bd+t%qYp*/b5]ifasI)1rqsk._pu;gaKh>-\&ke@UUnmMbKQ^)[@`trSY!75
+Xk31Cq>V!)rVQEao'PZ(l0e6@rVuorrb)3,n^X8U[@`trSY!75S'T%Do^qgsa7dUOrVlfkjh&4@
+W0XBoTpi4+\@]`Vq8BhV`3#B$^;[e"^;d[TS?g8I^W6-Kr5R<^bdF(5[&B:h^V%/=p\F-qZ,Ec2
+USF0X`4X+.qTAg;"j6kfb5_M=ao_Ucb5D8>mIL:-~>
+nc*OK[-uPGOH>aGkFupAn+bmrL&R9iKnT>Up@*O`FJtS`dAD\?@;LIZ`95R;eBafVeZ=UMM6#1q
+ES:!_s8W)trVZNep@@V6hpffb^;J=Un+chXq=jUUo^V+fQg`J+M04ZUeaJ@(GLtL"fm7s@hL4ea
+qu$0FYL217Nd?)7]&<*nH%GnjJ9ZA-dAD\?@8BKj?uq+#dI*XPNVi_RK&3]Ii4G(uH&f>hd&Ypm
+q!?,$lH,NJJssdGPf/(JL&V)UL&Zj\s8VtM!rmt.r;QcJo)F4~>
+nc'9DXR#',g=k<Al]tjkn+ba\F8ggkF&i*Wp@)nN@]5OEk2+\7ZcghPj6OdNeBafRkMOn;fAGcW
+@bLDPs8W)trVZNep@@V6hpffb^;J=Un+chXq=jUUo^V+fQg<hlf?`(+kNdu6A_5Se;qYhuhJ;NO
+qu$0FYKH+gg!S7%iT]W0B5d_FDe<\Lk2+\7ZZeTUZ-LqWk3SV`IJa$BESdn-l/C@EdFmLBafF1f
+q!?+sm,ZsOeD0-OKu@j)F8l1CF8p<&s8Vt;!rm=_r;QcDo)F4~>
+nc'9D^Wa*WQ^<u<_SNXqn+cFqb5Tceb#S>[p@,uP\Yu4BZCIMq`knU<X2<8heBaf3[@`trSY!75
+YM&RHs8W)trVZNep@@V6hpffb^;J=Un+chXq=jUUo^V+fQcuk0S@"iY[EOK:][tfg;q\q$hSS[Q
+qu$0FYK=ANRBETXVS(E^^;g*J`kAb%ZCIMq`kJmq`jhY2ZH8leb5;2:aPO,A]V_$rY*l&raK+(e
+q!?,-`3#B$UR/+$]>VYab5VDEb5]W,s8Vu=!rpEcr;Qcao)F4~>
+nc'9;b4!l]M0t)UdGB"cfBCk=p@j[JJoL1-hpQSFL!f;8VMB5$?uLXcaQfS"h9hk`eZ=UMOLjB?
+F4p-[qYBp[oC)#,hUTfaYbA&-`lG$ifB`%tki(=Mf[S$HJa_-jM04ZUeaI.-BVD/pUMFYIER*V8
+q"!(5n("LrFaT:^i4s2VK)PX-JpVC^h6r>iB2q?'Ck.ehkL-KfO8]+XKB9bOjM6t.F,-X?m\%qq
+p[6;,lH,NJJssdGP.uJ@K`:rSL&Qd[rr)_I"T*k*rVlfr!7p`@J,~>
+nc*F?_!C1@f@&7,k1O9PfBC_'p@j)WE,b8_hpPr4Fis+6hU]uYZ-:_QjQr5-h9hk\kMOn;g>V;]
+A(gGKqYBp[oC)#,hUTfaYb@es]t^>SfB`%tki(=Mf[S$HJa;LVf?`(+kNcc;<hZ7^;kmK!X^KH7
+o(_e.V!I4$f?_n!iT[dUBlO%LE+rRtl/C=C`JdH]bL>5+lc?3`J,TEHETOj1lJgOHcIUk7m%)Ml
+p[6;%m,ZsOeD0-OKthI!F8l.BF8g6%rr)e:s)J8>EcV-Xrr2uFo)F4~>
+nc*F?cciegSZABQZH'5YfBDD<p@lhQa2dYehpT$6\&l[rS=[40`kS:8Xi/)kh9hk=[@`trR&7OG
+YhAUCqYBp[oC)#,hUTfaYbAD=`Q,6qfB`%tki(=Mf[S$HJ]tNoS@"iY[EN9?Y+_Sa;kpS%XgcU9
+o(_e.Us-6=S@#>aVS'sU^rQEPa2#%)\tb[rahbO*_PWU!_U,F?bl.S@aQ:(S^SmHs\=]:sae[;P
+p[6;5`3#B$UR/+$]>)8Yb5VADb5TQ+rr)f<s2bE@aiXM\rr2uco)F4~>
+nc*47am[c\M03lpVU=7AX2DYthr*F?He$BWZ(@3,mG6$aLN?m+F+Tk%lJl]gjO'LdeZ=UTOLjAd
+Ems7=lK@0_f?_FIY+_Mj_scmOi8F"D[FF'`_m?><U7RUANp=`UK5YmhX4?t5=OF+bi:--\TC1+(
+LNA'9aQgZ_I=qOuK77j9kJWX9D-KS>F,-X?m\IV[OT,:[K^6^ElH,NJDh=G!lD2;\p@-Ohn("Lr
+IZhJ,YdAcGK(o!4K(X_Io^r*6$A!`qJ:[ChrVliJo)F4~>
+nc*47_!C1@f?_anhWEL#X2DM_hr*F-C":JEZ(?]lmHN`hf$:UhcICY1m+PXHjO'L`kMOn>g>V;,
+@ajQ-lK@0_f?_FIY+_>^]BehKl07TM[FF'`_m?><U7RU;M!X3XeBH7jhrjb"=NRAUi:--\SF#Cp
+f$;e#jQsB`CN9@QEGT'Llf6aKbb&=KcIUk7m$>EKJc>]LEpLf%m,ZsObgbG/m%2)Xp@-Oblf[0W
+db<^GV6jt*E;0)"E:n0ho^r*$s)/22DK#4DrVliDo)F4~>
+nc*47cciegS[>kuS?g5>X2E2thr*G/^t$]GZ(AVMa1ALFT!u_W\>,Cm`7D3;jO'LA[@`tiR&7O3
+YLD_%lK@0_f?_FIY+_f&_p$'6]Y);*[FF'`_m?><U7RUKQc-"mUV=++T!e:9=0]X#nEnSub-IP/
+\"f:l`6Ga-aSu1[_mmP"X-KNu`4X+"T:E4/_nY?Zrr<#?lc?cXXd>fsUR/+$Xhs;qnC+,U[@`tf
+QDhR:[(u.Np\+=$ouG,Fo_li1`X)"O`qB0+rr;BVs*t~>
+nc)Y-^$jLPM039KLSiJe[@<=qYHkHOCnR8m`:*!Ic*j=$F(&HcF+Tk%lBlY.kg#aedAD\HOLjAb
+CqIj4`P/a]U7J-idI6Jci75rb]=Z>NZ*V*B]]&eWs69m3RtGWa@WdO/pXLeMmB4Okk/aLdad[p$
+JssdGPB25+rr7Y%GB`K&VMB5$:LJ7!VU=gVcgHtqs!`WjdV81#XGM(IOLjAf[,CTIfTP^RXGM=d
+]&:>mFOtothV<G1H@"5rrd"rtG^%>TGi%`Xqu51;s*t~>
+nc)Y-[-Qo4f?^qOf&#QUXI"rNYHkH=>+h:S]BehJjl,%HcEjdccICY1m#,>akg#[ak2+\;g>V;*
+>eA/$`P/a]U77dYb3SH\l0%-eiSinaWjB@;[+YBCs6L$PgsjQF\BidapZF'kmAS+ek/a:`jP88/
+eD0-OKjnn=rr7"VAS1;khU]uYGHoHEhWF0;cgHDas!`!XdT>bthq-3&g>V;.[,CTIfSo.Zhq-<1
+iT[b>@b5APhV;huBP?&Nrb)[PAnB.sBAVqGqu4t5s*t~>
+nc)V,`lti^S[?GHT:E40\tl%*YHkI?ZCmnn_p$'1YbRYY\&QG.\>,Cm`4NS3kg#pFZCIMeR&7O2
+WOp<q`P/a]U8"j)aiqfB]X=l?VP^T7\[/rJ_>DIV`!EK3UV=^f[%3f_[4Ai/\&dXmaK`[cQ_V9i
+Q`\3<\\uSgs2i6mZc]SDT!u_R`jhY2ZH9H!ma(n4.EV)-Y0=;GS@#>aVS'gRi:QTmWQ_cBS?&$S
+]Z-GOf>6A$gq_UX^Y%3<^C.ch]Z[t%hWjb1rpB:VJ,~>
+nc'0HRIA\,M0398F,-X?jR)E^rkh(<i:$+!i75rXToOhJA861.LP`(^`-6OKlH?0lad[p1OLjA^
+?]1/JV6.\_n*]K%h:9cg]<%KcOH?p,d?'OMjOsI]s2bP9K5Y!k<+:!,pT,mRg#90eh7o`Mad[p$
+JssdGQ$.\2s8Rb(H>MNmZ&Ep=<,[AWaQh5lh=Qm0s!`WngMGg$Z&EpMM6#1qUt5&,hO2^G[Z5Zl
+Z.\#UAuBONY,Q33CMTZ=rb;gTBU>]aLpG1^o)&FWs*t~>
+nc)8.O6budf?^q3cIUk7lL!oX]">S_f^%njl0%-dh:^?(^<=gJf%8gB]k;&rlH>shjP885g>V;&
+:Q(I3T;B3Blg4!'l0%0giSWGig'?U#acM\=lKJ0/s5XI@eBFe;MR_!apYRL[kh32lh7oNIjP88/
+eD0-OLLb:Cs8R.ZBj03Ri7QDkMTjT*jQsunh=Q@!s!`$]gKN:oi7QE&fAGcWUt5&,hNQ%FiRuW2
+i98d6<2X!*Y,PR!=]qJnrE'D-LnfcOZHD.squ60dJ,~>
+nc)Y9[*5qLS[?GW\"B1r^W4R@_Sa:4bfn5J]X=l:R[KkYaMt`sT:MR]^pLo8lH?NPXd>f`R&7O.
+S;WW<YI29hbf[l=]!\cCVOs3@Q^=JYaH2S/^UO-Ks/cQnUV=^^_8ipRpR`t2\'2).h7p)1Xd>fs
+UR/+$]t;8*s8U6^^p;1nTpr=._7ub3Xi/Yoh=T(ns#A0ngTo&4Tpr<oSY!75Ut5&,hQY27URA9S
+Tsr3dXJ`D/Y,SY#YcsjrYct=7XhV3W]<]T<o)&FWs*t~>
+nc'0VN6pChNd>MP?uq+#^s1EcrSSpRe^;LNXIG6(H?!kGIYWcWX4>"cJq))3aJeCGRtGX,OLsHM
+n,MYikMY1HdE024XJ(o@M1^8)MlYCsFL1&DZ2C^'RfS.[raGtABP;P_M(>%9lEJOb\AdC<OF22-
+X4?ZQG_(PJs+Q)REO4`APC@:PDh=G!lBHDSq31gX,),dNE5LPFOF2&%TZuktbO"i\Tu,a"OF282
+Z.\U7d)!W:p$_nF#4:BQ_rC@fo)F4~>
+nc'-UK#m38g!S!WZHh%XioTA$kp,ETk2bLYgtC6*c-4M^f%8d9kI7I4D92%aU?psreBH@piT^@-
+s6LTgl07BnjPo.Uh:pZ8eC2juhrj<IX6S^&r87P0!S#?m\-'[kaj9_5/)94PWm0/*^$4M0da-P&
+kNc2]DfYmXF)bu&WTrKse'"T3eD0-OL19BBKDtlpF8+[#\EVu+d`p=ujmAV^m.98,\*;l*da6Y)
+kj.QV[^s'Cli-5TmFnMViq<9@s*t~>
+nc'0VZcp"URBFEJ`j_P0W3E\@rOaAa[Bcp3T9kt>Y.DBTW1TWNT!cJ9^r5@#aK`[cQ_V9qR&7Oq
+bl>Tu_S!IfZE:(#T:2%3S>3$`S"@%3FLf/bU&:P_QN<kqrl5,_b0%*cS1Br.`4=.E\Ac+XQ`IKa
+T!ceF]uJ1os2rF"[_okYQDhd@^S@-t`4WYEq9]-@,0KZ>[E#qWQ`I`lR]si4bO"i\\B2C\Q`IB\
+Tsr7iaN268p!!ER#04rt_rC@fo)F4~>
+nc'0cRtpCUVMftKDeO3IPG,(drOX;ZXJVJKM1^+oFaSdtP,>;-e\H%JMh9@BaJeCGRtGWmI#tu>
+ec3`.`4NIZVONd0M1pJ-Fa&4bMne?DB^aKQN;SP4K)foiFT?^[Hn9lHdI+0[e?m0P]9%DfOLjB?
+CjL\ds8RfLJ9?_9c(Ti2A:Tr`kMg9&nbeUMruZskl#`9Wad[p$J<e(9Xha,ll)U*7ad[p$GDrfW
+e_U5_p!s&`#0kigWQso-o)F4~>
+nc'-bOa-9ThUp<(bfS/]g>1Zai?R:<hV?i:eBuOedaZn&hV[JY\6I:+EQd[hU?psreBH(`g>W%o
+s5Y$WiSi\NgtLH5e^Msmd*gFrip,fBlf[0Xr7Ctu!6tJg!7CJf/C`P=m&8(V[(PY^g="F'iT]W2
+BlJ.ns)\$SA:3e+h:9cae(`pKfii%Yr.G"K*cq2B@Z'O5gsjQsgZ.Us^ut@SV2"?tgsjQpf\krU
+rTX"<ro=:Fkj>1kmJ?DRJ,~>
+nc'0c_RddlS=?C\^WO$WQC=G@rMCg5T:D77S>36u[&]smQCOPP[D]AsaN3T2aK`[cQ_V:;X-]^_
+[K!?GX/;YaS<oP0S=ud[['?[,S#F*RB[!lVS,AfVUB%q)ZiI9%X":$9ZH9W!e?m0,VO+?aR&7OG
+Z,"E&s8U7<`OiS!YaV8saJP6'_UPj)nbgc5ru]D[l++@CXd>fsVNn4![_V(ul,(-PXd>fsZ(%Gp
+[CZ@MosOe$#-bSWZ-Mb5o)F4~>
+nc'0mWH+9hdBSspJp_c`IYEW=rK&7_M2-_2FaSXiM3+1,^X:TgUi1MBOG)'LbGsjLRtGW]Bmc$A
+XT+b,Q&q#_LP(&%Fa8@dLP_+]X2!`#EpqP[M>_f(J:`B,rJ:N7oT1T#dI*ONf!WHS]9%DhP/$(r
+Dg[1ks8RfNJU2A*eZ=UMFb#q%lD8QNp\pBUruZslmWXTVc(Ti2I#tqt_m\Rsn$RH/dAD\?A9a'7
+XLA,?orS.^#GJT^e%=]9rq$/?~>
+nc'0mT4!H@k2>"HeC)^he(*('rRrLKf@JI"cdL7kf@o$;io]FXT3Z'nJ9&m$bG=LcgsjQ8b0o#C
+huDIKgY1?4f$r0rcdC1jf%8X2hr<ptEpMoGfDX,"e'umtrRV&&o\(hPk3SD[f!W0TiS)`.g>_D0
+?>FP%s8R0<DeNVGkMOn;cdU\1m$V9up\ogEruQ7YmU^h6jk\J3db<[E]XHhln#pHlk2+\7^<kNi
+hu2O,hu;C9h;RS@]B&bdoDa=~>
+nc'0mcaUU+ZD!PQUT:Z/W1f`LrKeauS=ZLV[&^.#SX>b8W3WhNX0fS)c,o5;bHo-hQ_V:4b,^m.
+TDt5pQ'[o/Sti6e['$I)T:M@9SuBEEEm1q`SGfJjVPBo[rLEqVoU%/!ZH9;rf!WH/VO+?^QDhR:
+[DL#-s8U7>`kS_$[@`tr[&01l`4rh"p\rP=ru]D\m_$$LYaV8sX-fcs_m\Rsn'&2^ZCIMqaK_5,
+T;2C_oq25M#F_F!b.Ha0rq$/?~>
+nc'*rZ?pShmb,O`RZNG_Jq3]F,(P8sLP_+UR]F$@e`?/&Uq_5+pQC6[nC"9&c(Ti0C1q:.re^Z-
+(k@![H$k-oLP_%QR\m-saOTA/FcG>4Z','I"-o=DT`(nk[e.-]aOSk7gYKK]i4G(uI\tN\]5rFR
+L&_1,re#WFZK/fbM2@86lJlo1Jc#J2rr4'orUY>Wi7YAoG_1dQeaKa"o^on;_Vi%fIWojXM2@8l
+OS+J0K*R76eaKa"pAX[`J,~>
+nc'*rW+fV4m-*KfgtLE3eC49B,1G&kf%8X0gu%)OkN_E1U;(AZpOdP4nC"*!jk\J2bK7lSrn%2"
+(Xpg[dF-Lnf%8U/gtprIjQGg]A<#:+i;D:2gYCT?rSR5*/*,m<RbQZ1^$4M0daI"7m'L5=EHD0[
+F8g/pC8^@Vg=Os0jQtT0B5d\IKDtlmF8b]EAD-2)f[/."hrj=0ht6QO?ao:Yg="?nd+?n&rn@%s
+rmV2)hrj=0htI'@s*t~>
+nc'*rftb&#ag\=EQ^F87USdmg,,V-1T:M@8Q_((V[D0huWP?3epX%(KnC"P]YaV9#`lcH)rga"`
+(o=:9Y,eFpT:MC;Q^jYEXgPpcZ&Qu:TpGYE"-o4>Rf/fXU\(E6XgQ]ggYKK\]V_$rW1:08`4<h-
+b5_LarlDsc`kSI<SXl1N`7D-+`r#e_rr4(_rU[h0bdX:8Z(mk][EPl4o^p_Cah4L;W3Nk;S=H#H
+Qh?mJUBd?][EPl4pAX[`J,~>
+nc'*u\:Aq>T&AebaL\XRR[*`2+-i:`VQ7;CaOT56hQihocf9S/rKDrco\?(sfs-KfIf+R4J:`B,
+M2@7SQ("SN[^sQ-e_o`LZZC,kVru=>rON*LaN2X)eH"Fti%+*MXL%-P`i\FBQ&q*)dI*cSmt?Dp
+s+UK+J:`(7dC-*V[`Ia4I=?hJs-*H^+GKgiIXAK`^lsA%TXs(OZJbHOaEMptdAE(bLOsu&I!>7+
+!."Qk#_8APh=.W*pAX[`J,~>
+nc'*uY&A$fS([,kjPf%RgtV\Z*o#K*hV[;OjQGdofqt?Jcf8q`rI]1;o\>qhkht+CqpHG4eC<%#
+f@em4gtprIiT0.al0R*$@pcL1lfI.)i</-$jQ6@'!9j(>/*tuiXm"ldU[-spg=kEGm%J%[Ec_9\
+F8p8uEbXn&iSWPOjQrUXCiTISKDtljF8krNCT?[Zg=4X.iT]X5i:cr_ASLMnhV-W5eGdkrd.P]b
+dJhQ"e(ipGlEB+=rq$/?~>
+nc'*uho<IFU<UQaXeqe^Q^.E7+-i1ZS=ZUVXgPg[ai('bcf<$drQr^Ro\?Un\"T:dW;N\8VPBo[
+SXl19Q'\#4USb0![CjH"`NZeU^r!=SrMB[tXf\i+[/df1]IUqCZ-):l`kK<jQ'dr/ZH9)Zn&``P
+s2tA``P8k(ZD4"_UTMJ>]#2Vgs3UcF+Nj]Y_mm\#W0X3RR\maIZJbHOhn6A>ZCI5MT;/?cX0M?)
+!3Z=%#c<r`]$de>pAX[`J,~>
+nG`s0KRr(&CnoqRi7ZN!`;7%e`5p$Ie_oNRn&(E2ER0%"p4S/"PD.Q^kH_PW^oNoer/_k_R[TnM
+X1#UXaO/Poi9Kaf`2@ZsK6u$j_sQO`hui0-lL"Q=!7:PW0Z1`C`58R!cc#GDeW'"E`4EP$e]#+I
+p4S/"s+UK+Jr+Q8mG6=Ch<MtfL4P$Xs-*B\*rCJ?JDS\YR[Tn\m`*$(q#&EcF-Z%<^TjZ)P)tc`
+on`[/rf@DNR^VM2]&`YcoDa=~>
+nG`s&Ec9mW>*dk.l0.9jj8.^Uj5f:`kNV9ulb&!^@*`TTp2Y6SK6,B6kH:lNinrPgg)Jf%gtglF
+iSihXk3(smm-NE<TjqMPC!p\*mHXZ7"7,=?mJZ>PaL8PS[kPG'\%K5IB@"<`n(!$Vk2YFZjQF7g
+C\Dgjs8R0?F)cJ7M!aEhkNM9I[WZS0s8R`Lru1cQF)p!si8!,DiU".jk4nkrCLN%ck2P=Uh#?"-
+f_*hrg&B\2gYCcSah$R.rq$/?~>
+nG`sVai<8[ZGFc']XP2KX88\8X0&M0[Cj8mbeq,t\'MnXp;tJWd)tbNkJ>0QW1K?Ar0SFgQ^=/4
+Sti0`Xg5(a)G]Yqq6`3HPV^qeC+b/_9q]E?$h`5hi#!m&F&qoCJ.aN2<A[C"97oC(5:b-J(FVQI8B
+]#+0`b5_Las2rF&\\?+q[C*Ta_7%8$aoDCfr;Ri8`k]"&ZD!VOR\n3S^ZP=hk/+XB`3Q>8S<oP/
+R%*c>!1EhR#aLaO`7)<Yq#9mbJ,~>
+nG`s0KnT*^H#n&*_;ObHkPF*YkN_@#n%cGuC:&,:II;^`rIot*PD0&7n\fXgjOM>dr44>qaN2WV
+e_T0HlL+,e_53cF\As8ONIgDKEJV6G_84'kPc0=NC29cLDYe9*[;^)AF0C>achd@tO-f:ti8EnI
+Y18(!Kn]R,L&Zj[NdPo(dI6POQFPP*K8'@*PPkG%rI]rTRd/SIaN`Q/HID9ZrmQFFEL#tQg!RmU
+]"50>WrTU-\d-0pe`rLFm/$;QJ,~>
+nG`s&F)pp:B45;E\(L'6lh]iGli-5ilaF$Q=L;R[C[Q0<rH!&[K6.(jn\AeIlK@6fr8B-cjQ,Fc
+kNM0rm-O&Y\"B1#\Ar`.I;eFo@!T)l\$s#HKqW]l=BVT(>[@550XY4nI:9*ulcK"sk(JTXlfm[#
+afa04qK$`Xs)\3]Edhb3Gf]4:aG@@XI;s?.s+C7L*rU))D2moGjQ,FdltXu;qu4iYBjZ\_lKIBk
+io/kSp##`,#NOn.m"rsQqXXZ:~>
+nG`sWb/s;>^::DQaNVcE_YUne_SjC7bf@E1YdD!X_X>J@rQ<:_d)uCdn^Fke^U:2Br2(sEXf\h8
+[CX#f`6$6HaKD;B\AuJ(b/Wba\%BGoaN2<-]<SoLYHXt,[']V9+Lel$_s?I]p?''(ahk^'`5o+3
+`qmj#s8U7Ab/qiC\@VX_#emh#b/ha*s3U]D*rX1#]"GtjXf\h=ag]^equ5m#^p^u!^ULMNW2?Gc
+opu/Yrh]q$XgQ*^bj>2ss*t~>
+nGa!1Kn]L#JUW9nEGTluXi^IV+/5QrTVZS?Fa;npNe@4^s8Re,s-*K_rqY&rDmSotjS[pakN_@"
+n*eT=U6Kk;DK3VAL#_KZK9Co_NI5ug]5V`#^N@SAG^=\jh>)FPidH6JI`RTGec,I;SooCU`knis
+e*;SaKn]R,L&Zj\Ob%q)EGi"#G2;SJKSBI+PPbA#qi6GYXPrI0mEp6&k4eiSeV&L#F*Y(Lmcrlk
+i7[eR!8[Y4#NtC@V/kMdrUTu=~>
+nGa!'F*%<TDesR;?Wq*9VSrA@+-iFQSY]W*A7sh;IW>7+s8R.]s+C@OrqXo^?)[)UlMTlqlg4!*
+lg)U#Q%ipS>[PFrG2qn;EIr6+I;3B3]3epV^LG;rB4tu5h.le%0]Hk`P\e3dq9T';o9*TuR(g).
+?IS1ZrH!&[s)\3]F+J7FARJcI?Y&!\JTGo4s+C4K*W(;0CSoeOm-Vl.AENXbs3G_(Bjk_Rg$J(j
+l07F)k5a`Fkm-P@l^2,=o_n@\J,~>
+nGa!Xb0'\X`l#[7[^*9F[_DX[+2G%mV5:Q4]>!4AbK0S's8U6as3UfGrqYTi[)U>.^\k_n_SjC5
+bfn8O^qI(YZaRg!_rL(+aNr!'b/(d/]=,/Z^U_J!^;%G;h8/s)0]KsdcGSSaq<\+Xo?=eT_o9a+
+[F=E^rQ<:_s2tAab0J#D]XP8P[_(A`cH=<0s3UZC*W+$u\@0W"`5g*1]B8kds6[qJ^pphlbfRf<
+]Y(`H[/df;]Ec<lbepsKo_n@\J,~>
+nGa!1Kn]R+KS,<NI<p.[_5dEP'le<6G1,&kk(&$VKT_&hL&_1,L&[A9s#'c2N-]QCWj9IZ_nj9c
+Pa-upCMn*4Fa/4[IHp9^p\L&,PD0!uJq3+II=:5?J*hc;JqE[hq1C6nK7g1Vdus^]s8MnoIX-(P
+FO#7#pOrR#L&_1,s+Q/jKS"`'I,B@&o_Oc*rr2t^qu7]9OcG4<G*nVtE-Hd'r;ZfJKnP#*G]InN
+Pd8-Bi:ZOHcbRB9UR%s&I.7"3o)F4~>
+nGa$(F*%B\EcHQoCM@D&_5:T=?N4@H@Dud*fkTYeDt\4'F8p=]s)W8]KDtm.rRuX4@Afp!\%KA_
+]Tn2+GFhuC?=@>UBPM>Jmsk*.JocQcrdf$,l/c\rjl^LJDf9T6p%J3$/GO4)SoN#-rm:]Eqj_J8
+A&2X"C$kY9s)W8]s)\3]F+\LPDJX(FCMre(a)K6.%l!/(1K*WCV=GK=BRM5O]lD"RZ*s3Ph-Deirn
+AS?gq\%:5blO1bA\%S)`X(,o6qYp'cJ,~>
+nGa$Yb0'b`aiMZk_SEk,_7(a)#R[K!ZL\Ac).ftlgi`qIO#b5]Was2rLad/O&&rU%_A\>Q[PaMYp:
+`5'!u\Xp(4[CEf]^VRePn'(P&ccXVWrm&R(l/fe!jlaSL`l?'>p%J4&/GR<-fZ<@)rpBabqpr[!
+]"tr&_!Um=s2rLas2tAab0\8N`P]OL_Su0Dd)u@f!7:WC*<+7,`5o:#^U1G^_t<m,s6[tN`koF!
+ZF%<aaMRSn$d6T3`500g]#!n4rpp)>~>
+nGa!1Kn]R,KnY]dK7\[@kg'*Ss*bXHJFW8`q1OG#Kp.5jL&_1,L&[A8s"<;nJUZ7pF)eXrE4U+4
+Fa)>]I!pHoJV&K+qYZNUs-&/#L&[?iK_kIrKD>7qqu26ML&V)IKc'iDKs$-\PQ056s8K*PJUcm5
+mXk<6L&Zl+rt'naKnY_EKS4u1pOe.trf`'8rrA8ZruI;cO6MFEGh%1lK)GWJs42mXKS+f(L3Ri]
+E3X7rrbE.@C20K<CMRa'DfE:/bh7GsqYp$bJ,~>
+nGa!'F*%B]F)us0EH#j_kfWg=s(iA6DXm@=q/UQUF+\Q6F8u8]F8pmks"E8\Df"(L@:-IN?b0ZT
+A7a8(C27X'DfB]9qYZ!Fs+>BFF8pl6Er,QNEVT?Mqf;[Ws8Mh8)#nYuU3"\6s3UfGrh+7LD<Pj)
+E;KNSs)\2>&9IkmF+\OTEcH*nEH;$WK6.%l!/(.J*J8oml$$cPeS8uAr;Q`rcuX8KEGoZ:An,7V
+Z!1E2=V@H2=JDQn=^#$8?FjUifkbX(rpg#=~>
+nGa!Xb0'bab0&',aN)<ekhZ0Rs2,N8`UWTAq8peYb0\<2b5_Lab5]ies"Erg`l$HP\@/iR[^ruZ
+]=cY._8=+/`lH0AqY\_>s3Sp8b5]i2ankeRaS>SQqoSi[s8Mi:)#qb$grf$2s6]jdrn>H5`9>/-
+a85bWs2t?@&Bb$qb0\;RaiMQtaN=D[d)u@f!7:TB*RN*Ul,:<Le\T5Gr;Q`rmE3SnaMu-8]t1_^
+Z*LY6YS*\7YbInsYd(L@[CWomfu(l,rpg#=~>
+nGa!1Kn]R,KnY`jKnP-Vq=so@(ANN7qLneFL&_1,s+QYjs+ULQKn]PjrVmSmPD"S[m='KDidKp;
+It3+@JqAW-re1<*s8N^qs8S::PD0%#Kn]R,Kn]R,L&_+*s8VnK#lfU4Y(bGjs472L%'G;;K_^;u
+K`;"*s+UIP"GQl0Kp2Fg#6'=1s8S::rr2t^qZ$SZ#a5"EJV!BDKS9=(!7q+&$&!qlJUi2ti8&bZ
+HN2V.HJ$nsH@(!dIH>tHo7M_qnGe"~>
+nGa!'F*%B]F*!!6F)uC!q=so.(AMlhqJuN4F8u8]s)Wg6s)\5?F*%A6rVmJfK5tu'm;6Y!ibRXl
+D/O:_E;jkWErL.[rt9tas+>BFF8pl6F8u8]F8u8]s8@$=s7p^As)W7UF3oR>d/O%RU2t?qq/Z@R
+rr7'>F8l1BF8p<&KD]cprc</\s+>Clrr@]Js8R]WK)'q8Dt7mgF8c+=d/A"lEcHVJDJX+Hh.ck%
+s4@Eef\'s;BaAHhj_aGWEH;'Js*t~>
+nGa!Xb0'bab0&*2b0%j'q=sp0(APtlqT8[6b5_Las2r^2s2tBAb0'b2rVmK$d)jB#mDQm%ikjfp
+`5Taea8X0[ao9H_rt<]Ys3Sp8b5]i2b5_Lab5_Las8C+?s7seCs2rL>b3dRUmJd+ogrda\q8rNV
+rr:.@b5VDDb5]W,d/;#jrlWC`s3SpfrrCFBs8UFOchYi*`q%3mb5M>?mJY06aiM`H`P]RNh8'$)
+s4(a)Fgf\+%=^^.cnji$TYaN=GNs*t~>
+nG`d+Kn]R,KnY`jre:@OrIl$eKn]P\s8RfQs+UK,PD0$js8Re,s-*E]%-3V+L&Ln$KD>4opk/R!
+!<)\Hs8N^qs8S::PD0%#Kn]R,Kn]R,L&_+*s8VnK#lfU4Y(bGjs472L!3Z<T#lfVYL&_1,s+UIP
+"GQl0Kp2Fg"oj:1s8S;]rrA8Zs8J2brfVqfrVhNLrrCXIKa*]nKS+pOpAKUCoE'X;p&0LBK*D%'
+qu)5&n,In~>
+nG`d!F*%B]F*!!6rcA)=rGrbSF*%A&s8R0?s)\3]K6.'6s8R.]s+C:M%,cbZF8buUEVT<Kpi6:R
+!<)\6s8N^as8R^mK6.'FF*%B]F*%B]F8u2[s8Vn9#leseU3"\6s3UcF!2BI6#leuGF8u8]s)\2>
+"EXTaF+aC3"oiXbs8R`Mrr@]Js8IWRre#63rVgm:rrCFCEs@8;EcH*npAJt1oE'")p&8q0E<Z,X
+qu(SWn,In~>
+nG`dRb0'bab0&*2rlY6?rQ5oUb0'b,s8U7As2tAad)uC2s8U6as3U`E%.higb5M4YaS>POprNHV
+!<)]8s8N_Ys8UHgd)uC8b0'bab0'bab5_F_s8Vo;#li&igrf$2s6]gc!8RRr#li'Ib5_Las2t?@
+"Npbeb0^(/"ol`fs8UIErrCFBs8L@Jrm8d/rVjt<rrDH`ap-57aiMQtpAN&3oE*)+p&<#2a9D@\
+qu+[[n,In~>
+nG`d+Kn]R,KnY`jre:@OrIl$eKn]P\s8RfQs+UK,PD0$js8Re,s-*E]$fmM*L&_1,L&_1,s8@WO
+s7h<Jrt:Oqs-&/#L&[?jL&_1,L&_1,s8@ZOs7q?Ss+Q00L";Iff)G[LY5X+\s+UK,s8RfQL&V)T
+L&Zj\s87QSs+Q1,s-*E]!0d9Zrf[KbPD+_jre:=N!7q%$!0dA8s8MtNs8<"Prr2eK"oj;Vs+Q0q
+s*t~>
+nG`d!F*%B]F*!!6rcA)=rGrbSF*%A&s8R0?s)\3]K6.'6s8R.]s+C:M$fHYYF8u8]F8u8]s8@!=
+s7g[8rt9tas+>BFF8pl6F8u8]F8u8]s8@$=s7p^As)W7UF3oR>d/O%FUAf3>s)\3]s8R0?F8l1B
+F8p<&s86pAs)W8]s+C:M!/(.Jrdt@RK6),6rcA&<!7:Ua!/(5ks8Mt<s8<"?rr2e9"oiZDs)W8M
+s*t~>
+nG`dRb0'bab0&*2rlY6?rQ5oUb0'b,s8U7As2tAad)uC2s8U6as3U`E$hM`fb5_Lab5_Las8C(?
+s7jb:rt<]Ys3Sp8b5]i2b5_Lab5_Las8C+?s7seCs2rL>b3dRUmJd+ch#>G%s2tAas8U7Ab5VDD
+b5]W,s8:"Cs2rLas3U`E!7:TBrm1fJd)sN2rlY3>!:B[+!7:\es8Mu>s8<#Arr2f;"olaFs2rLQ
+s*t~>
+nG`d+Kn]R,KnY`jre:@OrIl$eKn]P\s8RfQs+UK,PD0$js8Re,s-*E]$fmM*L&_1,L&_1,s8@WO
+s7h<Jrt:Oqs-&/#L&[?jL&_1,L&_1,s8@ZOs7q?Ss+Q00L";Iff)G[LY5X+Zs+UK,s8RfNrre&U
+Kn]R)Ka%L1L&_1:rVlk]qZ$PY"TO[>L&_.+rVllKqh5$6rIt:OrIt:O!ep[Sqh54RL&_1,L%#%l~>
+nG`d!F*%B]F*!!6rcA)=rGrbSF*%A&s8R0?s)\3]K6.'6s8R.]s+C:M$fHYYF8u8]F8u8]s8@!=
+s7g[8rt9tas+>BFF8pl6F8u8]F8u8]s8@$=s7p^As)W7UF3oR>d/O%FUAf3<s)\3]s8R0<rrdEC
+F*%BZEs;SbF8u8mrVlkMqZ$PI"TO*qF8u5\rVllEqf;airH&#=rH&#=!d"DAqf;r@F8u8]F79-Z~>
+nG`dRb0'bab0&*2rlY6?rQ5oUb0'b,s8U7As2tAad)uC2s8U6as3U`E$hM`fb5_Lab5_Las8C(?
+s7jb:rt<]Ys3Sp8b5]i2b5_Lab5_Las8C+?s7seCs2rL>b3dRUmJd+ch#>G#s2tAas8U7>rrgLE
+b0'b^ap%gfb5_LgrVllEqZ$QA"TQikb5_I`rVllbqoSocrQ>0?rQ>0?!m:QCqoT*Bb5_Lab4#@\~>
+nG`O$L&V,PK`RD;re:@OrIl$eKn]P\s8RfQs+UK,PD0$js8Re,s-*E]$fmM*L&_1,L&_1,s8@WO
+s7h<Jrt:Oqs-&/#L&[?jL&_1,L&_1,s8@ZOs7q?Qs+Q00L";IcrrB5$Ka.R2s+ULQL&CrRL&Zj\
+s87QSs+Q1,s-*E]!0d9Zrf[KbPD+_jre:=N!7q%$!0dD9rr;qNs8N.Ss8W(P#lfU4s+ULQKn]!q
+J,~>
+nG`NoF8l4>ErgpnrcA)=rGrbSF*%A&s8R0?s)\3]K6.'6s8R.]s+C:M$fHYYF8u8]F8u8]s8@!=
+s7g[8rt9tas+>BFF8pl6F8u8]F8u8]s8@$=s7p^?s)W7UF3oR;rrAemEsDYcs)\5?F8Z%@F8p<&
+s86pAs)W8]s+C:M!/(.Jrdt@RK6),6rcA&<!7:Ua!/(8lrr;q<s8N.As8W(>#leses)\5?F*$gM
+J,~>
+nG`OKb5VG@aoTlhrlY6?rQ5oUb0'b,s8U7As2tAad)uC2s8U6as3U`E$hM`fb5_Lab5_Las8C(?
+s7jb:rt<]Ys3Sp8b5]i2b5_Lab5_Las8C+?s7seAs2rL>b3dRRrrCjRap.mgs2tBAb5D8Bb5]W,
+s8:"Cs2rLas3U`E!7:TBrm1fJd)sN2rlY3>!:B[+!7:_frr;r>s8N/Cs8W)@#li&is2tBAb0'2Q
+J,~>
+nG`O$L&V,PK`RD;re:@OrIka]Kn]P\s8RfQs+UK,PD/u8s+LLRPPtLhjHG:Os8Re,s8RfQrIk7O
+pkAbJ&sN@qPD,3Ss-&.js8Re,s8RfQrIt:Oq1T%QKnZ[`es$%3!3Z<T#60DWL&_1,r;QqSs+Q1,
+s8@WTs+Q1,s-*E]!0d9Zrf[KbPD+_jre:=N!7q%$!0dD9rr;qNs8N.Ss8W(P#lfU4s+ULQKn]!q
+J,~>
+nG`NoF8l4>ErgpnrcA)=rGrJKF*%A&s8R0?s)\3]K6."ks)S5(a)KDkfXi.H)ls8R.]s8R0?rGqu=
+piHK8&qg5aK6)Zds+>B6s8R.]s8R0?rH&#=q/Zc?F*"'sd"D8r!2BI6#6/cEF8u8]r;QqAs)W8]
+s8@!Bs)W8]s+C:M!/(.Jrdt@RK6),6rcA&<!7:Ua!/(8lrr;q<s8N.As8W(>#leses)\5?F*$gM
+J,~>
+nG`OKb5VG@aoTlhrlY6?rQ5WMb0'b,s8U7As2tAad)u=es2kBBd/EtPo?bY&s8U6as8U7ArQ5-?
+pr`X:'%$[Yd)s_Xs3Sp2s8U6as8U7ArQ>0?q8rpAb0&M^mEke2!8RRr#62jGb5_Lar;QrCs2rLa
+s8C(Ds2rLas3U`E!7:TBrm1fJd)sN2rlY3>!:B[+!7:_frr;r>s8N/Cs8W)@#li&is2tBAb0'2Q
+J,~>
+nG`O$L&V,PK`RD;re:@OrIka]Kn]P\s8RfQs+UK,PD/u8s+LLRPPkFfPD+_js+Q1,s+ULOK`M/J
+L&_/cPQ1ZHKp.5js+Q1,s+Q1,s+ULOL&_2KKa.R2Ks$-\PPkF\Y5X+Zs+UK,s8RfNrrn,VKn]R,
+rIkFTKn]R,PPtL]PPY:aPQ-jHPD+_jre:=N!7q%$!0dD9rr;qNs8N.Ss8W(P#lfU4s+ULQKn]!q
+J,~>
+nG`NoF8l4>ErgpnrcA)=rGrJKF*%A&s8R0?s)\3]K6."ks)S5@KDb`VK6),6s)W8]s)\5=Erc78
+F8u7QKE(t(F+\Q6s)W8]s)W8]s)\5=F8u:9EsDYcF/!a&KDb`LUAf3<s)\3]s8R0<rrmKDF*%B]
+rGr/BF*%B]KDkfMKDPTQKE$T(K6),6rcA&<!7:Ua!/(8lrr;q<s8N.As8W(>#leses)\5?F*$gM
+J,~>
+nG`OKb5VG@aoTlhrlY6?rQ5WMb0'b,s8U7As2tAad)u=es2kBBd/<nNd)sN2s2rLas2tB?aoMJ:
+b5_JSd/X-mb0\<2s2rLas2rLas2tB?b5_M;ap.mgb1t/,d/<nDh#>G#s2tAas8U7>rrpRFb0'ba
+rQ5<Db0'bad/EtEd/*bId/VJmd)sN2rlY3>!:B[+!7:_frr;r>s8N/Cs8W)@#li&is2tBAb0'2Q
+J,~>
+nG`O$L&V,PK`RD;re:@OrIka]Kn]P\s8RfQs+UK,PD/u8s+LLRPPkFfPD+_js+Q1,s+ULOK`M/J
+L&_/QPQ(R`Kp.5irs4>Ys+Q1,s+ULOL&V,KKa.R2Ks(I,PPkF\Y5X+Zs+UK,s8RfNrrn,VKn]R,
+rIkFTKn]R,PPtL]PPY:cPQ-jHPD+_jKn]I)!7q%$!0dD9rr;qNs8N.Ss8W(P#QKL3s+ULQL$ntk~>
+nG`NoF8l4>ErgpnrcA)=rGrJKF*%A&s8R0?s)\3]K6."ks)S5@KDb`VK6),6s)W8]s)\5=Erc78
+F8u7?KDtlPF+\Q5rs3]Gs)W8]s)\5=F8l49EsDYcF/&]]KDb`LUAf3<s)\3]s8R0<rrmKDF*%B]
+rGr/BF*%B]KDkfMKDPTSKE$T(K6),6F*%9Z!7:Ua!/(8lrr;q<s8N.As8W(>#QJjds)\5?F70'Y~>
+nG`OKb5VG@aoTlhrlY6?rQ5WMb0'b,s8U7As2tAad)u=es2kBBd/<nNd)sN2s2rLas2tB?aoMJ:
+b5_JAd/O%Hb0\<1rs6dIs2rLas2tB?b5VG;ap.mgb2!$ad/<nDh#>G#s2tAas8U7>rrpRFb0'ba
+rQ5<Db0'bad/EtEd/*bKd/VJmd)sN2b0'Y^!:B[+!7:_frr;r>s8N/Cs8W)@#QMrhs2tBAb3o:[~>
+nG`O$L&V,PK`RD;re:@OrIkLVKn]P\s8RfOrrRn<L&M&OK`V4;r;R+fs+ULQKn]R,L&_+*!<;hJ
+qu6_OPD/o6s+ULQ!/:FPs+UIPrIkCSKn]P\rr3#MPPkFaY5a30s+UFO!/:@N%u(%;L&_1,s+Q1,
+Kn]R,PPtL]PPY:cPQ-jHPD+_jKn]I)!7q%$!0dD9rr;qNs8N.Ss8W(P#QKL3s+ULQL$ntk~>
+nG`NoF8l4>ErgpnrcA)=rGr5DF*%A&s8R0=rrR7oF8c.=Erl;nr;R+Vs)\5?F*%B]F8u2[!<;h8
+qu6_=K6-qis)\5?!-A/>s)\2>rGr,AF*%A&rr3#GKDb`QUAo:Us)\/=!-A)<%s.blF8u8]s)W8]
+F*%B]KDkfMKDPTSKE$T(K6),6F*%9Z!7:Ua!/(8lrr;q<s8N.As8W(>#QJjds)\5?F70'Y~>
+nG`OKb5VG@aoTlhrlY6?rQ5BFb0'b,s8U7?rrU?ib5MA?aoVOhr;R,Ns2tBAb0'bab5_F_!<;i:
+qu6`?d)u7cs2tBA!6Y<@s2t?@rQ59Cb0'b,rr3#dd/<nIh#GO>s2t<?!6Y6>&'Fppb5_Las2rLa
+b0'bad/EtEd/*bKd/VJmd)sN2b0'Y^!:B[+!7:_frr;r>s8N/Cs8W)@#QMrhs2tBAb3o:[~>
+nG`O$L&V,PK`RD;re:@Os+LUUL&Zj\rVlkOrVlqQPD/u8s+LLRPPkFfPQ-@:s+Q1,s+ULOK`h@/
+s+UFOs+U@M!elhlqu?\Ms8N(Qrr<"Prr;qN"TO10s+UIP!S3J4rr]G(Kn]F(!/:@N%u(%;L&_1,
+s+Q1,Kn]R,PPtL]PPY:bPQ-jHPD+_jL&:lMf)::(s+Q[9L&V,NL&_/SL&_2PKa7X3L&Zl,s+Tn@
+J,~>
+nG`NoF8l4>ErgpnrcA)=s)S>CF8p<&rVlk=rVlq?K6."ks)S5@KDb`VKE$#ms)W8]s)\5=Es)G`
+s)\/=s)\);!cs!8qu?\;s8N(?rr<">rr;q<"TNOas)\2>!RQJsrr]"qF*%6Y!-A)<%s.blF8u8]
+s)W8]F*%B]KDkfMKDPTRKE$T(K6),6F8Pt;d/A"es)WhlF8l4<F8u7AF8u:>EsM_dF8p=]s)[W.
+J,~>
+nG`OKb5VG@aoTlhrlY6?s2kKEb5]W,rVll?rVlrAd)u=es2kBBd/<nNd/V8gs2rLas2tB?aoh[d
+s2t<?s2t6=!m8m4qu?]=s8N)Arr<#@rr;r>"TQWes2t?@!U\83rr_'Vb0'V]!6Y6>&'Fppb5_La
+s2rLab0'bad/EtEd/*bJd/VJmd)sN2b5;2=mJY0/s2r^fb5VG>b5_JCb5_M@ap7shb5]Was2sd0
+J,~>
+nG`O$L&V,PK`mV>L&Zl+s8RcUs+UK,L&M#OL&M#QKp.5hs8RcRs-*B\!gEY<rr3C\s8RfQs+UK,
+s+UK,rVunOqu6_OPD/o6s+ULQ!/:FPs+UIPrIkCSKn]P\rr3#MPPkF_Y5a30qu6YMr;R:]s+Q1,
+s+UK,L&Zj\s8S;]rrA8Zrs4hgPQ-i#L&Zl(rrCXKK`_:.PQ$:8s8@ZOrrRoSs8I]Ws+Q1,L&_1,
+mf.e~>
+nG`NoF8l4>Es.-qF8p=\s8R-Cs)\3]F8c+=F8c+?F+\Q4s8R-@s+C7L!e^Morr3CJs8R0?s)\3]
+s)\3]rVun=qu6_=K6-qis)\5?!-A/>s)\2>rGr,AF*%A&rr3#GKDb`OUAo:Uqu6Y;r;R:Ks)W8]
+s)\3]F8p<&s8R`Mrr@]Jrs48WKE$RFF8p=YrrCFEEruA_KDorks8@$=rrR9As8I'Es)W8]F8u8]
+mf.e~>
+nG`OKb5VG@aop)kb5]W`s8U4Es2tAab5M>?b5M>Ab0\<0s8U4Bs3U]D!mptirr3DLs8U7As2tAa
+s2tAarVuo?qu6`?d)u7cs2tBA!6Y<@s2t?@rQ59Cb0'b,rr3#dd/<nGh#GO>qu6Z=r;R;Ms2rLa
+s2tAab5]W,s8UIErrCFBrs7!Od/VJ8b5]W]rrDHbao_Ucd/M2es8C+?rrU(a)Cs8L.Gs2rLab5_La
+mf.e~>
+nG`O$L&V,PK`[J<L&CuNK`qF0s+Q1*rr@cOrrRn<L&M&OK`V4;r;Qh^s+UIP%#+`]L&_1,s+UK,
+s+UFOs+U@M!elhlqu?\Ms8N(Qrr<"Prr;qN"TO10s+UIP!S3J4rr]G(Kn]4"%u(%;L&_1,s+Q1,
+Kn]R,PPtL]PPY:bPQ-jHPD+_jL&:lMf)::(s+Q[9L&V,PKa.R2s8RfQs8I]Ws+Q1,L&_1,mf.e~>
+nG`NoF8l4>Erq!oF8Z(<Es2Mas)W8[rr(a)-=rrR7oF8c.=Erl;nr;QhNs)\2>%!2IKF8u8]s)\3]
+s)\/=s)\);!cs!8qu?\;s8N(?rr<">rr;q<"TNOas)\2>!RQJsrr]"qF*%$S%s.blF8u8]s)W8]
+F*%B]KDkfMKDPTRKE$T(K6),6F8Pt;d/A"es)WhlF8l4>EsDYcs8R0?s8I'Es)W8]F8u8]mf.e~>
+nG`OKb5VG@ao]rib5D;>aoqaes2rL_rrC4?rrU?ib5MA?aoVOhr;QiFs2t?@%*JVMb5_Las2tAa
+s2t<?s2t6=!m8m4qu?]=s8N)Arr<#@rr;r>"TQWes2t?@!U\83rr_'Vb0'DW&'Fppb5_Las2rLa
+b0'bad/EtEd/*bJd/VJmd)sN2b5;2=mJY0/s2r^fb5VG(a)ap.mgs8U7As8L.Gs2rLab5_Lamf.e~>
+nG`O$L&V,PK`[J<L&:lRL&Zl,Kn]L*!/:CO!elhlrVunO!WSA]rrSDaL&V)\L&_1,s8RfQL&Zl,
+L&M&OL&:lOKp.5fs8RfQrr@cPs8RfPs8@WSs+Q1,L&V)Qes$%3"0VZXL%YHVL&Zj\s8RfQKn]P\
+L&_1:rVlk]qYphbs-*JHKn]P\qu6ZIrIk=QKp2Lirr<"P#60DWs+ULQre:CP"blu1s8Rf@s*t~>
+nG`NoF8l4>Erq!oF8Pt@F8p=]F*%<[!-A,=!cs!8rVun=!WRfMrrRiQF8l1JF8u8]s8R0?F8p=]
+F8c.=F8Pt=F+\Q2s8R0?rr@->s8R0>s8@!As)W8]F8l1?d"D8r"/>g:F7oPDF8p<&s8R0?F*%A&
+F8u8mrVlkMqYphRs+C?(F*%A&qu6ZCrGr&?F+aI5rr<">#6/cEs)\5?rcA,>"`s]bs8R0.s*t~>
+nG`OKb5VG@ao]rib5;2Bb5]Wab0'\_!6Y9?!m8m4rVuo?!WUOErrURIb5VDLb5_Las8U7Ab5]Wa
+b5MA?b5;2?b0\<.s8U7ArrC4@s8U7@s8C(Cs2rLab5VDAmEke2"5Nq!b4YcFb5]W,s8U7Ab0'b,
+b5_LgrVllEqYpiJs3Uemb0'b,qu6Z`rQ53Ab0^.1rr<#@#62jGs2tBArlY9@"j6kfs8U70s*t~>
+p]#dES,i?aJ,~>
+p]#dES,i?aJ,~>
+p]#dES,i?aJ,~>
+JcCT,J,~>
+JcCT,J,~>
+JcCT,J,~>
+JcCT,J,~>
+JcCT,J,~>
+JcCT,J,~>
+JcCT,J,~>
+JcCT,J,~>
+JcCT,J,~>
+JcCT,J,~>
+JcCT,J,~>
+JcCT,J,~>
+JcCT,J,~>
+JcCT,J,~>
+JcCT,J,~>
+o`#!5WoMY0s5WDE!6>&<_uB_Wrr2u=p&G&loD\l4<TETKr2KbWh#Dm~>
+o`#!5WoMY0s5WDE!6>&<_uB_Wrr2u=p&G&loD\l4<TETKr2KbWh#Dm~>
+o`#!5WoMY0s5WDE!6>&<_uB_Wrr2u=p&G&loD\l4<TETKr2KbWh#Dm~>
+pAY0R<W2suEp<T)j)XYhs&K$t!TS4irr=)<!!((9s8V-ArrC+=s8T+err`=^s/H(ls8Q*krr[9A
+<TEWL!35qs!-6lpJ,~>
+pAY0R<W2suEp<T)j)XYhs&K$t!TS4irr=)<!!((9s8V-ArrC+=s8T+err`=^s/H(ls8Q*krr[9A
+<TEWL!35qs!-6lpJ,~>
+pAY0R<W2suEp<T)j)XYhs&K$t!TS4irr=)<!!((9s8V-ArrC+=s8T+err`=^s/H(ls8Q*krr[9A
+<TEWL!35qs!-6lpJ,~>
+pAY:r3TL.>j6?REj)XYhs&K$t!TS4grrE,"q#C@okPkR_!<3#uWpfrl`rK->EWF/Rs8Q*krrE+[
+n,EEg!8%7$~>
+pAY:r3TL.>j6?REj)XYhs&K$t!TS4grrE,"q#C@okPkR_!<3#uWpfrl`rK->EWF/Rs8Q*krrE+[
+n,EEg!8%7$~>
+pAY:r3TL.>j6?REj)XYhs&K$t!TS4grrE,"q#C@okPkR_!<3#uWpfrl`rK->EWF/Rs8Q*krrE+[
+n,EEg!8%7$~>
+pAY-nEr>qDEo[2[ElS0?<HA*=(33Dqj5Y1#<HA,>WrN+!<HA-"ElV1#qu?[rrVunts8N@b<E6&>
+*KF."q>WDSWrN+ZElV1?j&I*?<TF,><E5(ZWiD(ZWrN*Z<H@."s,L*>j)R-[<N?(>j8]."<N?)Z
+ElV1?qYpb[!'1'>!36%u%rt[Ms8V+Z<B4(Zs)M+[j8Aogj&H(><TF,><E8)ZElW3#j8AoXWW;ts
+s)J7&<N9&>rr3ML<E7*>s2S,[a8b1?<E8)Qs*t~>
+pAY-nEr>qDEo[2[ElS0?<HA*=(33Dqj5Y1#<HA,>WrN+!<HA-"ElV1#qu?[rrVunts8N@b<E6&>
+*KF."q>WDSWrN+ZElV1?j&I*?<TF,><E5(ZWiD(ZWrN*Z<H@."s,L*>j)R-[<N?(>j8]."<N?)Z
+ElV1?qYpb[!'1'>!36%u%rt[Ms8V+Z<B4(Zs)M+[j8Aogj&H(><TF,><E8)ZElW3#j8AoXWW;ts
+s)J7&<N9&>rr3ML<E7*>s2S,[a8b1?<E8)Qs*t~>
+pAY-nEr>qDEo[2[ElS0?<HA*=(33Dqj5Y1#<HA,>WrN+!<HA-"ElV1#qu?[rrVunts8N@b<E6&>
+*KF."q>WDSWrN+ZElV1?j&I*?<TF,><E5(ZWiD(ZWrN*Z<H@."s,L*>j)R-[<N?(>j8]."<N?)Z
+ElV1?qYpb[!'1'>!36%u%rt[Ms8V+Z<B4(Zs)M+[j8Aogj&H(><TF,><E8)ZElW3#j8AoXWW;ts
+s)J7&<N9&>rr3ML<E7*>s2S,[a8b1?<E8)Qs*t~>
+pAY+mrW";dWrE(!s/H(!!!$">ErT,[<?6+[!!#"ZW`<(!WW6$>EiK*>3<6)Ws8Q*ts8Q(,s)K,[
+3E9&Z*E<*[qYrPUWrN+!!!#"ZW`:&[<TE*[3E6("<<*"Z!<6%!3?;-"NW<'"EcO/?<N?'!WrH'>
+<<1(>!!#"Za8>lS<<*%!!$-+[s&C(>!6=+"3E6&Zs&C(>*HM)X&B@cN3E>,"*B?,#rr<$>*EE%;
+!NH.u<>smt!$)%>*<<,>WW4&"!<;'Z3B8,[*B@+?WqQIC~>
+pAY+mrW";dWrE(!s/H(!!!$">ErT,[<?6+[!!#"ZW`<(!WW6$>EiK*>3<6)Ws8Q*ts8Q(,s)K,[
+3E9&Z*E<*[qYrPUWrN+!!!#"ZW`:&[<TE*[3E6("<<*"Z!<6%!3?;-"NW<'"EcO/?<N?'!WrH'>
+<<1(>!!#"Za8>lS<<*%!!$-+[s&C(>!6=+"3E6&Zs&C(>*HM)X&B@cN3E>,"*B?,#rr<$>*EE%;
+!NH.u<>smt!$)%>*<<,>WW4&"!<;'Z3B8,[*B@+?WqQIC~>
+pAY+mrW";dWrE(!s/H(!!!$">ErT,[<?6+[!!#"ZW`<(!WW6$>EiK*>3<6)Ws8Q*ts8Q(,s)K,[
+3E9&Z*E<*[qYrPUWrN+!!!#"ZW`:&[<TE*[3E6("<<*"Z!<6%!3?;-"NW<'"EcO/?<N?'!WrH'>
+<<1(>!!#"Za8>lS<<*%!!$-+[s&C(>!6=+"3E6&Zs&C(>*HM)X&B@cN3E>,"*B?,#rr<$>*EE%;
+!NH.u<>smt!$)%>*<<,>WW4&"!<;'Z3B8,[*B@+?WqQIC~>
+p&?N%WiB&!irH+ZWW<&!NrQ*Z`rM,[!33%!WrF*[<E9&>ErV."WW9(!*QS*Xs&K$ts&BI,EZL2?
+s/H(Zs&E(qruqHCs8T)!<W<'!s&E)!s)K-?*?F0?*TP0\`rN.><E8&ZNrAtYWW<%u%03EK!6>+"
+<N6%!rrB(rrttfW!-/'[<WC)>a8\/"EZP2[<E7'>N]@*>qYq$*WrN*>*WP."WW6'!EcV*X!NH.u
+<>"7k*TI-[rrB)!*EE->!<5&>rVlp>3QLdlJ,~>
+p&?N%WiB&!irH+ZWW<&!NrQ*Z`rM,[!33%!WrF*[<E9&>ErV."WW9(!*QS*Xs&K$ts&BI,EZL2?
+s/H(Zs&E(qruqHCs8T)!<W<'!s&E)!s)K-?*?F0?*TP0\`rN.><E8&ZNrAtYWW<%u%03EK!6>+"
+<N6%!rrB(rrttfW!-/'[<WC)>a8\/"EZP2[<E7'>N]@*>qYq$*WrN*>*WP."WW6'!EcV*X!NH.u
+<>"7k*TI-[rrB)!*EE->!<5&>rVlp>3QLdlJ,~>
+p&?N%WiB&!irH+ZWW<&!NrQ*Z`rM,[!33%!WrF*[<E9&>ErV."WW9(!*QS*Xs&K$ts&BI,EZL2?
+s/H(Zs&E(qruqHCs8T)!<W<'!s&E)!s)K-?*?F0?*TP0\`rN.><E8&ZNrAtYWW<%u%03EK!6>+"
+<N6%!rrB(rrttfW!-/'[<WC)>a8\/"EZP2[<E7'>N]@*>qYq$*WrN*>*WP."WW6'!EcV*X!NH.u
+<>"7k*TI-[rrB)!*EE->!<5&>rVlp>3QLdlJ,~>
+nc':'WW9(!WW<&!WrK(!WW3$!a8`.>rVumt#QFe(s/H(!!;QTo<W2st<WE(*NZB/#WW<)!<E8nq
+('(B7s/H(ZrrB)!<E9)!<<+%[j8W+Zrr35'!<<(!<N6&srrK,"rr3E-Wi?(!s&E(!!9=(ZWr2l*
+WW;'"!*-$!s/H)!s8>sts8Q(%WW3$!a8,`C!36)!<E9)!!3-%!q>UJq!;uls<=]$/WrE'>rrB)!
+WW<&!Wr;r"j)P-"p&BO~>
+nc':'WW9(!WW<&!WrK(!WW3$!a8`.>rVumt#QFe(s/H(!!;QTo<W2st<WE(*NZB/#WW<)!<E8nq
+('(B7s/H(ZrrB)!<E9)!<<+%[j8W+Zrr35'!<<(!<N6&srrK,"rr3E-Wi?(!s&E(!!9=(ZWr2l*
+WW;'"!*-$!s/H)!s8>sts8Q(%WW3$!a8,`C!36)!<E9)!!3-%!q>UJq!;uls<=]$/WrE'>rrB)!
+WW<&!Wr;r"j)P-"p&BO~>
+nc':'WW9(!WW<&!WrK(!WW3$!a8`.>rVumt#QFe(s/H(!!;QTo<W2st<WE(*NZB/#WW<)!<E8nq
+('(B7s/H(ZrrB)!<E9)!<<+%[j8W+Zrr35'!<<(!<N6&srrK,"rr3E-Wi?(!s&E(!!9=(ZWr2l*
+WW;'"!*-$!s/H)!s8>sts8Q(%WW3$!a8,`C!36)!<E9)!!3-%!q>UJq!;uls<=]$/WrE'>rrB)!
+WW<&!Wr;r"j)P-"p&BO~>
+p\u.P<WE*>3<8([WrK(!rrB)!<?9*[WrL+>WW<"ts&B=(*EE,>3N<)Ss8Q(2s/L+><E9(!j8U-"
+WW<(Z*HM)X(rrWVEiT/>!<<'!WrH(!s8R*[j8Y."<E9%u%`\Ris#F*"!36'ZWrK(!rr3E-WlG+>
+iuO/[!<<'!Wr2l8EZP0[!07'ZWlG+>iuO/#*TQ0?<Q>*>s2S.9rsJh,s8R*[j/N+>!35kp!NH.t
+s8Q(8rrB)!3E?)"ErV."ruG,>a)^4?s2P,>pA]X~>
+p\u.P<WE*>3<8([WrK(!rrB)!<?9*[WrL+>WW<"ts&B=(*EE,>3N<)Ss8Q(2s/L+><E9(!j8U-"
+WW<(Z*HM)X(rrWVEiT/>!<<'!WrH(!s8R*[j8Y."<E9%u%`\Ris#F*"!36'ZWrK(!rr3E-WlG+>
+iuO/[!<<'!Wr2l8EZP0[!07'ZWlG+>iuO/#*TQ0?<Q>*>s2S.9rsJh,s8R*[j/N+>!35kp!NH.t
+s8Q(8rrB)!3E?)"ErV."ruG,>a)^4?s2P,>pA]X~>
+p\u.P<WE*>3<8([WrK(!rrB)!<?9*[WrL+>WW<"ts&B=(*EE,>3N<)Ss8Q(2s/L+><E9(!j8U-"
+WW<(Z*HM)X(rrWVEiT/>!<<'!WrH(!s8R*[j8Y."<E9%u%`\Ris#F*"!36'ZWrK(!rr3E-WlG+>
+iuO/[!<<'!Wr2l8EZP0[!07'ZWlG+>iuO/#*TQ0?<Q>*>s2S.9rsJh,s8R*[j/N+>!35kp!NH.t
+s8Q(8rrB)!3E?)"ErV."ruG,>a)^4?s2P,>pA]X~>
+p\t5nr;Zp?WrI,<!!*&t!!92#<W2t"<N6&ts8Q("s/Q%u!lq;@q#:=orW!*BW`<(!*W?'=Wr;u!
+*TR(t!$2"<%EGIKs8N)!s&E)!s5P.!!!90#<W2pt3W/pYs&K$u"02C$!<3!-!36'!!!"&>WW<)!
+!35tss&BR/WW;)Z<HA+>!!"&>iuS+!!`f8#rVupuqYpp'WrN+Z*<6([rrB(prrM-[rDa3bEcV0[
+WrH(!s,R$Xs/Q%u!EI2>!!+,#pA]X~>
+p\t5nr;Zp?WrI,<!!*&t!!92#<W2t"<N6&ts8Q("s/Q%u!lq;@q#:=orW!*BW`<(!*W?'=Wr;u!
+*TR(t!$2"<%EGIKs8N)!s&E)!s5P.!!!90#<W2pt3W/pYs&K$u"02C$!<3!-!36'!!!"&>WW<)!
+!35tss&BR/WW;)Z<HA+>!!"&>iuS+!!`f8#rVupuqYpp'WrN+Z*<6([rrB(prrM-[rDa3bEcV0[
+WrH(!s,R$Xs/Q%u!EI2>!!+,#pA]X~>
+p\t5nr;Zp?WrI,<!!*&t!!92#<W2t"<N6&ts8Q("s/Q%u!lq;@q#:=orW!*BW`<(!*W?'=Wr;u!
+*TR(t!$2"<%EGIKs8N)!s&E)!s5P.!!!90#<W2pt3W/pYs&K$u"02C$!<3!-!36'!!!"&>WW<)!
+!35tss&BR/WW;)Z<HA+>!!"&>iuS+!!`f8#rVupuqYpp'WrN+Z*<6([rrB(prrM-[rDa3bEcV0[
+WrH(!s,R$Xs/Q%u!EI2>!!+,#pA]X~>
+pAY6TWiF,<rs6ZFa2e2[EiS1!rrpHCa8c1[rVuoXs8N8_WoO-Za8#ZHj/T->s8V->s8T+!j8Z+Z
+WiG[j#KQlEa8c2"j8K#XWWV;]j5^(;s/H;'a8c1[WoO*Y!6>*=!6>*=!QV5>rr^=As2Y$:s5X.Z
+#fluFWiH+!a/]+<s/Q+Zs8N/@WlOr8!?K5Zrrf@Bs8U.6rrC+<<<2(YrtKM6s5W/>s2V/"a8c2"
+WlP/>j/T-Os*t~>
+pAY6TWiF,<rs6ZFa2e2[EiS1!rrpHCa8c1[rVuoXs8N8_WoO-Za8#ZHj/T->s8V->s8T+!j8Z+Z
+WiG[j#KQlEa8c2"j8K#XWWV;]j5^(;s/H;'a8c1[WoO*Y!6>*=!6>*=!QV5>rr^=As2Y$:s5X.Z
+#fluFWiH+!a/]+<s/Q+Zs8N/@WlOr8!?K5Zrrf@Bs8U.6rrC+<<<2(YrtKM6s5W/>s2V/"a8c2"
+WlP/>j/T-Os*t~>
+pAY6TWiF,<rs6ZFa2e2[EiS1!rrpHCa8c1[rVuoXs8N8_WoO-Za8#ZHj/T->s8V->s8T+!j8Z+Z
+WiG[j#KQlEa8c2"j8K#XWWV;]j5^(;s/H;'a8c1[WoO*Y!6>*=!6>*=!QV5>rr^=As2Y$:s5X.Z
+#fluFWiH+!a/]+<s/Q+Zs8N/@WlOr8!?K5Zrrf@Bs8U.6rrC+<<<2(YrtKM6s5W/>s2V/"a8c2"
+WlP/>j/T-Os*t~>
+l2LbaWmUhIWW7VMec1.~>
+l2LbaWmUhIWW7VMec1.~>
+l2LbaWmUhIWW7VMec1.~>
+l2Lc)a3jnf`uTa2ec1.~>
+l2Lc)a3jnf`uTa2ec1.~>
+l2Lc)a3jnf`uTa2ec1.~>
+JcCT,J,~>
+JcCT,J,~>
+JcCT,J,~>
+JcCT,J,~>
+JcCT,J,~>
+JcCT,J,~>
+JcCT,J,~>
+JcCT,J,~>
+JcCT,J,~>
+JcCT,J,~>
+JcCT,J,~>
+JcCT,J,~>
+JcCT,J,~>
+JcCT,J,~>
+JcCT,J,~>
+JcCT,J,~>
+JcCT,J,~>
+JcCT,J,~>
+%%EndData
+showpage
+%%Trailer
+end
+%%EOF
Added: trunk/thirdparty/emacs/slime/doc/slime-small.pdf
===================================================================
(Binary files differ)
Property changes on: trunk/thirdparty/emacs/slime/doc/slime-small.pdf
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Modified: trunk/thirdparty/emacs/slime/doc/slime.texi
===================================================================
--- trunk/thirdparty/emacs/slime/doc/slime.texi 2006-11-30 14:00:03 UTC (rev 2091)
+++ trunk/thirdparty/emacs/slime/doc/slime.texi 2006-11-30 16:32:54 UTC (rev 2092)
@@ -8,9 +8,26 @@
@end direntry
@c %**end of header
+@set EDITION 2.0
+@c @set UPDATED @today{}
+@set UPDATED @code{$Date: 2006/11/22 06:27:38 $}
+@set TITLE SLIME User Manual
+@settitle @value{TITLE}, version @value{EDITION}
+
+@titlepage
+@title @value{TITLE}
+@titlefont{version @value{EDITION}}
+@sp 2
+@image{slime-small}
+@sp 4
+@subtitle Compiled: @value{UPDATED}
+@end titlepage
+
@c Written by Luke Gorrie.
-@c
+@c
@c This file has been placed in the public domain.
+@c
+@c Modified by Jeff Cunningham.
@macro SLIME
@acronym{SLIME}
@@ -28,37 +45,37 @@
@acronym{CVS}
@end macro
-@c O with a slash through it (norwegian)
-@macro norsko
-@iftex
-@tex
-\\o
-@end tex
-@end iftex
-@ifnottex
-o@c this comment prevents a newline!
-@end ifnottex
+@macro kbditem{key, command}
+@item \key\
+@code{\command\}@*
@end macro
-@macro kbditem{key, command}
+@macro kbdanchor{key, command}
+@anchor{\command\}
@item \key\
@code{\command\}@*
@end macro
-@set EDITION 1.2
-@set UPDATED @code{$Date: 2005/04/18 18:58:12 $}
+@macro kbdindex{key, command}
+@item \key\
+@xref{\command\}.
+@end macro
-@titlepage
-@title SLIME User Manual
-@subtitle The Superior Lisp Interaction Mode for Emacs
-@subtitle @value{EDITION}, @value{UPDATED}
-@author
-@end titlepage
+@macro fcnanchor{name}
+@anchor{\name\}
+@item M-x
+@code{\name\}@*
+@end macro
+@macro fcnindex{name}
+@item \name\
+@xref{\name\}.
+@end macro
+
@c @setchapternewpage off
-
@contents
+@c -----------------------
@node Top, Introduction, (dir), (dir)
@ifinfo
@@ -69,104 +86,27 @@
@end ifinfo
@menu
-* Introduction::
+* Introduction::
* Getting started::
-* slime-mode::
+* slime-mode::
* REPL::
* Debugger::
* Extras::
* Customization::
+* Tips and Tricks::
* Credits::
-
-@detailmenu
- --- The Detailed Node Listing ---
-
-Getting started
-
-* Platforms::
-* Downloading::
-* Installation::
-* Running::
-
-Downloading SLIME
-
-* CVS::
-* CVS Incantations::
-
-Downloading from CVS
-
-* CVS Incantations::
-
-@code{slime-mode}
-
-* User-interface conventions::
-* Commands::
-* Semantic indentation::
-* Reader conditionals::
-
-User-interface conventions
-
-* Temporary buffers::
-* Key bindings::
-* inferior-lisp::
-* Multithreading::
-
-Commands
-
-* Compilation::
-* Finding definitions::
-* Lisp Evaluation::
-* Documentation::
-* Programming Helpers::
-* Recovery::
-* Cross-reference::
-* Inspector::
-* Profiling::
-
-REPL: the ``top level''
-
-* REPL commands::
-* Input Navigation::
-* Shortcuts::
-
-SLDB: the SLIME debugger
-
-* Examining frames::
-* Restarts::
-* Frame Navigation::
-* Miscellaneous::
-
-Extras
-
-* slime-selector::
-* slime-autodoc-mode::
-* Multiple connections::
-* Typeout frames::
-
-Customization
-
-* Emacs-side customization::
-* Lisp-side::
-
-Emacs-side
-
-* Hooks::
-
-Lisp-side (Swank)
-
-* Communication style::
-* Other configurables::
-
-@end detailmenu
+* Index to Key Bindings::
+* Index to Functions::
@end menu
+@c -----------------------
@node Introduction, Getting started, Top, Top
@chapter Introduction
@SLIME{} is the ``Superior Lisp Interaction Mode for Emacs.''
@SLIME{} extends Emacs with new support for interactive programming in
-Common Lisp. The features are centred around @code{slime-mode}, an Emacs
+Common Lisp. The features are centered around @code{slime-mode}, an Emacs
minor-mode that complements the standard @code{lisp-mode}. While
@code{lisp-mode} supports editing Lisp source files, @code{slime-mode}
adds support for interacting with a running Common Lisp process for
@@ -187,6 +127,7 @@
well-defined interface and implemented separately for each Lisp
implementation. This makes @SLIME{} readily portable.
+@c -----------------------
@node Getting started, slime-mode, Introduction, Top
@chapter Getting started
@@ -199,6 +140,7 @@
* Running::
@end menu
+@c -----------------------
@node Platforms, Downloading, Getting started, Getting started
@section Supported Platforms
@@ -214,8 +156,7 @@
@item
CMU Common Lisp (@acronym{CMUCL}), 18e or newer
@item
-Steel Bank Common Lisp (@acronym{SBCL}), from version 0.8.15 to 0.8.21
-(newer versions may or may not work)
+Steel Bank Common Lisp (@acronym{SBCL}), latest official release
@item
OpenMCL, version 0.14.3
@item
@@ -226,6 +167,10 @@
@acronym{CLISP}, version 2.33.2 or newer
@item
Armed Bear Common Lisp (@acronym{ABCL})
+@item
+Corman Common Lisp (@acronym{CCL}), version 2.51 or newer with the patches from @url{http://www.grumblesmurf.org/lisp/corman-patches})
+@item
+Scieneer Common Lisp (@acronym{SCL}), version 1.2.7 or newer
@end itemize
Most features work uniformly across implementations, but some are
@@ -233,6 +178,7 @@
compiler-note annotations, @acronym{XREF} support, and fancy debugger
commands (like ``restart frame'').
+@c -----------------------
@node Downloading, Installation, Platforms, Getting started
@section Downloading SLIME
@@ -250,6 +196,7 @@
* CVS Incantations::
@end menu
+@c -----------------------
@node CVS, CVS Incantations, Downloading, Downloading
@subsection Downloading from CVS
@@ -275,6 +222,7 @@
* CVS Incantations::
@end menu
+@c -----------------------
@node CVS Incantations, , CVS, Downloading
@subsection CVS incantations
@@ -306,6 +254,7 @@
cvs diff -rHEAD ChangeLog # or: -rFAIRLY-STABLE
@end example
+@c -----------------------
@node Installation, Running, Downloading, Getting started
@section Installation
@@ -330,6 +279,7 @@
the keymap for Lisp source files that may be confusing and may not
work correctly for a Lisp process started by @SLIME{}.
+@c -----------------------
@node Running, , Installation, Getting started
@section Running SLIME
@@ -341,6 +291,13 @@
At this point @SLIME{} is up and running and you can start exploring.
+You can restart the @code{inferior-lisp} process using the function:
+@table @kbd
+@fcnanchor{slime-restart-inferior-lisp}
+@end table
+
+
+@c -----------------------
@node slime-mode, REPL, Getting started, Top
@chapter @code{slime-mode}
@@ -355,6 +312,7 @@
* Reader conditionals::
@end menu
+@c -----------------------
@node User-interface conventions, Commands, slime-mode, slime-mode
@section User-interface conventions
@@ -364,12 +322,13 @@
@menu
* Temporary buffers::
-* Key bindings::
+* About key bindings::
* inferior-lisp::
* Multithreading::
@end menu
-@node Temporary buffers, Key bindings, User-interface conventions, User-interface conventions
+@c -----------------------
+@node Temporary buffers, About key bindings, User-interface conventions, User-interface conventions
@subsection Temporary buffers
Some @SLIME{} commands create temporary buffers to display their
@@ -394,8 +353,9 @@
@SLIME{} commands available for describing symbols, looking up
function definitions, and so on.
-@node Key bindings, inferior-lisp, Temporary buffers, User-interface conventions
-@subsection Key bindings
+@c -----------------------
+@node About key bindings, inferior-lisp, Temporary buffers, User-interface conventions
+@subsection About key bindings
In general we try to make our key bindings fit with the overall Emacs
style. We also have the following somewhat unusual convention of our
@@ -415,7 +375,16 @@
C-h} will actually list the bindings for all documentation commands.
This feature is just a bit too useful to clobber!
-@node inferior-lisp, Multithreading, Key bindings, User-interface conventions
+You can assign or change default key bindings using the @code{global-set-key}
+function in your @file{~/.emacs} file like this:
+@example
+(global-set-key "\C-cs" 'slime-selector)
+@end example
+@noindent
+which binds @kbd{C-c s} to the function @code{global-set-key}.
+
+@c -----------------------
+@node inferior-lisp, Multithreading, About key bindings, User-interface conventions
@subsection @code{*inferior-lisp*} buffer
@SLIME{} internally uses the @code{inferior-lisp} package to start
@@ -442,6 +411,7 @@
doesn't belong to @SLIME{}, and you should probably lookup our
equivalent.
+@c -----------------------
@node Multithreading, , inferior-lisp, User-interface conventions
@subsection Multithreading
@@ -468,266 +438,465 @@
swank:*default-worker-thread-bindings*).
@end example
+@c -----------------------
@node Commands, Semantic indentation, User-interface conventions, slime-mode
@section Commands
+@acronym{SLIME} commands are divided into the following general
+categories: @strong{Programming, Compilation, Evaluation, Recovery,
+Inspector, and Profiling}, discussed in separate sections below. There
+are also comprehensive indices to commands by function (@pxref{Index
+to Functions}) and by function (@pxref{Index to Key Bindings}).
+
@menu
+* Programming::
* Compilation::
-* Finding definitions::
-* Lisp Evaluation::
-* Documentation::
-* Programming Helpers::
+* Evaluation::
* Recovery::
-* Cross-reference::
* Inspector::
* Profiling::
+* Other::
@end menu
-@node Compilation, Finding definitions, Commands, Commands
-@subsection Compilation commands
+@c -----------------------
+@node Programming, Compilation, , Commands
+@subsection Programming commands
-@SLIME{} has fancy commands for compiling functions, files, and
-packages. The fancy part is that notes and warnings offered by the
-Lisp compiler are intercepted and annotated directly onto the
-corresponding expressions in the Lisp source buffer. (Give it a try to
-see what this means.)
+Programming commands are divided into the following categories:
+@strong{Completion, Documentation, Coss-reference, Finding
+definitions, Macro-expansion, and Disassembly}, discussed in
+separate sections below.
-@table @kbd
+@menu
+* Completion::
+* Closure::
+* Indentation::
+* Documentation::
+* Cross-reference::
+* Finding definitions::
+* Macro-expansion::
+* Disassembly::
+@end menu
-@kbditem{C-c C-k, slime-compile-and-load-file}
-Compile and load the current buffer's source file.
+@c -----------------------
+@node Completion, Closure, , Programming
+@subsubsection Completion commands
-@kbditem{C-c M-k, slime-compile-file}
-Compile (but don't load) the current buffer's source file.
+Completion commands are used to complete a symbol or form based on
+what is already present at point. Classical completion assumes an
+exact prefix and gives choices only where branches may occur. Fuzzy
+completion tries harder.
-@kbditem{C-c C-c, slime-compile-defun}
-Compile the top-level form at point.
+@table @kbd
+@anchor{slime-complete-symbol}
+@itemx M-TAB
+@item C-c C-i
+@item C-M-i
+@code{slime-complete-symbol}@*
+Complete the symbol at point. Note that three styles of completion are
+available in @SLIME{}, and the default differs from normal Emacs
+completion (@pxref{slime-complete-symbol-function}).
+@xref{Emacs-side customization}.
-@end table
+@kbdanchor{C-c C-s, slime-complete-form}
+Looks up and inserts into the current buffer the argument list for the
+function at point, if there is one. More generally, the command
+completes an incomplete form with a template for the missing arguments.
+There is special code for discovering extra keywords of generic
+functions and for handling @code{make-instance} and
+@code{defmethod}. Examples:
-The annotations are indicated as underlining on source forms. The
-compiler message associated with an annotation can be read either by
-placing the mouse over the text or with the selection commands below.
+@example
+(subseq "abc" <C-c C-s>
+ --inserts--> start [end])
+(find 17 <C-c C-s>
+ --inserts--> sequence :from-end from-end :test test
+ :test-not test-not :start start :end end
+ :key key)
+(find 17 '(17 18 19) :test #'= <C-c C-s>
+ --inserts--> :from-end from-end
+ :test-not test-not :start start :end end
+ :key key)
+(defclass foo () ((bar :initarg :bar)))
+(defmethod print-object <C-c C-s>
+ --inserts--> (object stream)
+ body...)
+(defmethod initialize-instance :after ((object foo) &key blub))
+(make-instance 'foo <C-c C-s>
+ --inserts--> :bar bar :blub blub initargs...)
+@end example
-@table @kbd
+@kbdanchor{C-c M-i, slime-fuzzy-complete-symbol}
+Presents a list of likely completions to choose from for an
+abbreviation at point. This is a third completion method and it is
+very different from the more traditional completion to which
+@command{slime-complete-symbol} defaults. It attempts to complete a
+symbol all at once, instead of in pieces. For example, ``mvb'' will
+find ``@code{multiple-value-bind}'' and ``norm-df'' will find
+``@code{least-positive-normalized-double-float}''. This can also be
+selected as the method of completion used for
+@code{slime-complete-symbol}.
-@item M-n
-@itemx M-p
-@code{slime-next-note, slime-previous-note}@*
-These commands move the point between compiler notes and display the new note.
+@fcnanchor{slime-fuzzy-completions-mode}
+@fcnanchor{slime-fuzzy-abort}
+@end table
-@kbditem{C-c M-c, slime-remove-notes}
-Remove all annotations from the buffer.
-@end table
+@c -----------------------
+@node Closure, Indentation, Completion, Programming
+@subsubsection Closure commands
-@node Finding definitions, Lisp Evaluation, Compilation, Commands
-@subsection Finding definitions (``Meta-Point'').
+Closure commands are used to fill in missing parenthesis.
-The familiar @kbd{M-.} command is provided. For generic functions this
-command finds all methods, and with some systems it does other fancy
-things (like tracing structure accessors to their @code{DEFSTRUCT}
-definition).
-
@table @kbd
+@kbdanchor{C-c C-q, slime-close-parens-at-point}
+Closes parentheses at point to complete the top-level-form by inserting ')'
+characters at until @code{beginning-of-defun} and @code{end-of-defun}
+execute without errors, or @code{slime-close-parens-limit} is exceeded.
-@kbditem{M-., slime-edit-definition}
-Go to the definition of the symbol at point.
+@kbdanchor{C-], slime-close-all-sexp}
+Balance parentheses of open s-expressions at point.
+Insert enough right-parentheses to balance unmatched left-parentheses.
+Delete extra left-parentheses. Reformat trailing parentheses
+Lisp-stylishly.
-@item M-,
-@code{slime-pop-find-definition-stack}
-Go back from a definition found with @kbd{M-.}. This gives multi-level
-backtracking when @kbd{M-.} has been used several times.
-
+If @code{REGION} is true, operate on the region. Otherwise operate on
+the top-level sexp before point.
@end table
-@node Lisp Evaluation, Documentation, Finding definitions, Commands
-@subsection Lisp Evaluation
-These commands each evaluate a Lisp expression in a different way. By
-default they show their results in a message, but a prefix argument
-causes the results to be printed in the @REPL{} instead.
+@c -----------------------
+@node Indentation, Documentation, Closure, Programming
+@subsubsection Indentation commands
@table @kbd
+@kbdanchor{C-c M-q, slime-reindent-defun}
+Re-indents the current defun, or refills the current paragraph.
+If point is inside a comment block, the text around point will be
+treated as a paragraph and will be filled with @code{fill-paragraph}.
+Otherwise, it will be treated as Lisp code, and the current defun
+will be reindented. If the current defun has unbalanced parens,
+an attempt will be made to fix it before reindenting.
-@kbditem{C-M-x, slime-eval-defun}
-Evaluate top-level form.
-
-@kbditem{C-x C-e, slime-eval-last-expression}
-Evaluate the expression before point.
-
-@kbditem{C-c C-p, slime-pprint-eval-last-expression}
-Evaluate the expression before point and pretty-print the result.
-
-@kbditem{C-c C-r, slime-eval-region}
-Evaluate the region.
-
-@kbditem{C-c :, slime-interactive-eval}
-Evaluate an expression read from the minibuffer.
-
-@anchor{slime-scratch}
-@item M-x slime-scratch
-Create a @file{*slime-scratch*} buffer. In this
-buffer you can enter Lisp expressions and evaluate them with
-@kbd{C-j}, like in Emacs's @file{*scratch*} buffer.
-
+When given a prefix argument, the text around point will always
+be treated as a paragraph. This is useful for filling docstrings."
@end table
-If `C-M-x' or `C-x C-e' is given a numeric argument, it inserts the
-value into the current buffer at point, rather than displaying it in the
-echo area.
-@node Documentation, Programming Helpers, Lisp Evaluation, Commands
-@subsection Documentation
+@c -----------------------
+@node Documentation, Cross-reference, Indentation, Programming
+@subsubsection Documentation commands
@SLIME{}'s online documentation commands follow the example of Emacs
Lisp. The commands all share the common prefix @kbd{C-c C-d} and allow
-the final key to be modified or unmodified (@xref{Key bindings}.)
+the final key to be modified or unmodified (@pxref{About key bindings}.)
@table @kbd
-@kbditem{C-c C-d d, slime-describe-symbol}
+@kbdanchor{SPC, slime-space}
+The space key inserts a space, but also looks up and displays the
+argument list for the function at point, if there is one.
+
+@kbdanchor{C-c C-d d, slime-describe-symbol}
Describe the symbol at point.
-@kbditem{C-c C-d a, slime-apropos}
-Apropos search. Search Lisp symbol names for a substring match and
-present their documentation strings. By default the external symbols
-of all packages are searched. With a prefix argument you can choose a
+@kbdanchor{C-c C-f, slime-describe-function}
+Describe the function at point.
+
+@kbdanchor{C-c C-d a, slime-apropos}
+Perform an apropos search on Lisp symbol names for a regular expression
+match and display their documentation strings. By default the external
+symbols of all packages are searched. With a prefix argument you can choose a
specific package and whether to include unexported symbols.
-@kbditem{C-c C-d z, slime-apropos-all}
+@kbdanchor{C-c C-d z, slime-apropos-all}
Like @code{slime-apropos} but also includes internal symbols by default.
-@kbditem{C-c C-d p, slime-apropos-package}
+@kbdanchor{C-c C-d p, slime-apropos-package}
Show apropos results of all symbols in a package. This command is for
browsing a package at a high-level. With package-name completion it
also serves as a rudimentary Smalltalk-ish image-browser.
-@kbditem{C-c C-d h, slime-hyperspec-lookup}
+@kbdanchor{C-c C-d h, slime-hyperspec-lookup}
Lookup the symbol at point in the @cite{Common Lisp Hyperspec}. This
uses the familiar @file{hyperspec.el} to show the appropriate section
in a web browser. The Hyperspec is found either on the Web or in
@code{common-lisp-hyperspec-root}, and the browser is selected by
@code{browse-url-browser-function}.
-@kbditem{C-c C-d ~, common-lisp-hyperspec-format}
-Lookup a format character in the @cite{Common Lisp Hyperspec}.
+Note: this is one case where @kbd{C-c C-d h} is @emph{not} the same as
+@kbd{C-c C-d C-h}.
+
+@kbdanchor{C-c C-d ~, common-lisp-hyperspec-format}
+Lookup a @emph{format character} in the @cite{Common Lisp Hyperspec}.
@end table
-@node Programming Helpers, Recovery, Documentation, Commands
-@subsection Programming Helpers
+@c -----------------------
+@node Cross-reference, Finding definitions, Documentation, Programming
+@subsubsection Cross-reference commands
+
+@SLIME{}'s cross-reference commands are based on the support provided
+by the Lisp system, which varies widely between Lisps. For systems
+with no builtin @acronym{XREF} support @SLIME{} queries a portable
+@acronym{XREF} package, which is taken from the @cite{CMU AI
+Repository} and bundled with @SLIME{}.
+
+Each command operates on the symbol at point, or prompts if there is
+none. With a prefix argument they always prompt. You can either enter
+the key bindings as shown here or with the control modified on the
+last key, @xref{About key bindings}.
+
@table @kbd
-@kbditem{M-TAB, slime-complete-symbol}
-Complete the symbol at point. Note that three styles of completion are
-available in @SLIME{}, and the default differs from normal Emacs
-completion. @xref{Emacs-side customization}.
+@kbdanchor{C-c C-w c, slime-who-calls}
+Show function callers.
-@anchor{slime-fuzzy-complete-symbol}
-@kbditem{C-c M-i, slime-fuzzy-complete-symbol}
-Presents a list of likely completions to choose from for an
-abbreviation at point. This is a third completion method and it is
-very different from the more traditional completion to which
-@command{slime-complete-symbol} defaults. It attempts to complete a
-symbol all at once, instead of in pieces. For example, ``mvb'' will
-find ``@code{multiple-value-bind}'' and ``norm-df'' will find
-``@code{least-positive-normalized-double-float}''. This can also be
-selected as the method of completion used for
-@code{slime-complete-symbol}.
+@kbdanchor{C-c C-w r, slime-who-references}
+Show references to global variable.
-@kbditem{SPC, slime-space}
-The space key inserts a space and also looks up and displays the
-argument list for the function at point, if there is one.
+@kbdanchor{C-c C-w b, slime-who-binds}
+Show bindings of a global variable.
-@kbditem{C-c C-s, slime-insert-arglist}
-Looks up and inserts into the current buffer the argument list for the
-function at point, if there is one.
+@kbdanchor{C-c C-w s, slime-who-sets}
+Show assignments to a global variable.
-@kbditem{C-c C-m, slime-macroexpand-1}
+@kbdanchor{C-c C-w m, slime-who-macroexpands}
+Show expansions of a macro.
+
+@fcnanchor{slime-who-specializes}
+Show all known methods specialized on a class.
+
+@fcnanchor{slime-goto-xref}
+Goto the cross-referenced location at point.
+
+@end table
+
+There are also ``List callers/callees'' commands. These operate by
+rummaging through function objects on the heap at a low-level to
+discover the call graph. They are only available with some Lisp
+systems, and are most useful as a fallback when precise @acronym{XREF}
+information is unavailable.
+
+@table @kbd
+@kbdanchor{C-c <, slime-list-callers}
+List callers of a function.
+
+@kbdanchor{C-c >, slime-list-callees}
+List callees of a function.
+
+@fcnanchor{slime-calls-who}
+Show all known functions called by the function SYMBOL.
+@end table
+
+
+
+@c -----------------------
+@node Finding definitions, Macro-expansion, Cross-reference, Programming
+@subsubsection Finding definitions (``Meta-Point'' commands).
+
+The familiar @kbd{M-.} command is provided. For generic functions this
+command finds all methods, and with some systems it does other fancy
+things (like tracing structure accessors to their @code{DEFSTRUCT}
+definition).
+
+@table @kbd
+
+@kbdanchor{M-., slime-edit-definition}
+Go to the definition of the symbol at point.
+
+@anchor{slime-pop-find-definition-stack}
+@item M-,
+@code{slime-pop-find-definition-stack}
+Go back to the point where @kbd{M-.} was invoked. This gives multi-level
+backtracking when @kbd{M-.} has been used several times.
+
+@kbdanchor{C-x 4 ., slime-edit-definition-other-window}
+Like @code{slime-edit-definition} but switchs to the other window to edit the definition in.
+
+@kbdanchor{C-x 5 ., slime-edit-definition-other-frame}
+Like @code{slime-edit-definition} but opens another frame to edit the definition in.
+
+@fcnanchor{slime-edit-definition-with-etags}
+Use an ETAGS table to find definition at point.
+@end table
+
+@c -----------------------
+@node Macro-expansion, Disassembly, Finding definitions, Programming
+@subsubsection Macro-expansion commands
+
+@table @kbd
+@anchor{slime-macroexpand-1}
+@item C-c C-m
+@itemx C-c RET
+@code{slime-macroexpand-1}@*
Macroexpand the expression at point once. If invoked with a prefix
argument, use macroexpand instead of macroexpand-1.
-@kbditem{C-c M-m, slime-macroexpand-all}
+@kbdanchor{C-c M-m, slime-macroexpand-all}
Fully macroexpand the expression at point.
-@kbditem{C-c C-t, slime-toggle-trace-fdefinition}
+@kbdanchor{C-c C-t, slime-toggle-trace-fdefinition}
Toggle tracing of the function at point. If invoked with a prefix
argument, read additional information, like which particular method
should be traced.
-@kbditem{C-c M-d, slime-disassemble-symbol}
-Disassemble the function definition of the symbol at point.
+@fcnanchor{slime-untrace-all}
+Untrace all functions.
@end table
-@node Recovery, Cross-reference, Programming Helpers, Commands
-@subsection Abort/Recovery
+For additional minor-mode commands and discussion,
+@pxref{slime-macroexpansion-minor-mode}.
+
+@c -----------------------
+@node Disassembly, , Macro-expansion, Programming
+@subsubsection Disassembly commands
+
@table @kbd
-@kbditem{C-c C-b, slime-interrupt}
-Interrupt Lisp (send @code{SIGINT}).
+@kbdanchor{C-c M-d, slime-disassemble-symbol}
+Disassemble the function definition of the symbol at point.
+@end table
-@kbditem{C-c ~, slime-sync-package-and-default-directory}
-Synchronize the current package and working directory from Emacs to
-Lisp.
+@c -----------------------
+@c -----------------------
+@node Compilation, Evaluation, Programming, Commands
+@subsection Compilation commands
-@kbditem{C-c M-p, slime-repl-set-package}
-Set the current package of the @acronym{REPL}.
+@SLIME{} has fancy commands for compiling functions, files, and
+packages. The fancy part is that notes and warnings offered by the
+Lisp compiler are intercepted and annotated directly onto the
+corresponding expressions in the Lisp source buffer. (Give it a try to
+see what this means.)
+@table @kbd
+@kbdanchor{C-c C-c, slime-compile-defun}
+Compile the top-level form at point.
+@cindex compiling functions
+
+@kbdanchor{C-c C-y, slime-call-defun}
+Insert a call to the function defined around point into the REPL.
+
+@kbdanchor{C-c C-k, slime-compile-and-load-file}
+Compile and load the current buffer's source file.
+
+@kbdanchor{C-c M-k, slime-compile-file}
+Compile (but don't load) the current buffer's source file.
+
+@kbdanchor{C-c C-l, slime-load-file}
+Load a source file and compile if necessary, without loading into a buffer..
+
+@kbdanchor{C-c C-z, slime-switch-to-output-buffer}
+Select the output buffer, preferably in a different window.
+
+@fcnanchor{slime-compile-region}
+Compile region at point.
+
+@fcnanchor{slime-compiler-macroexpand}
+Display the compiler-macro expansion of sexp at point.
+
+@fcnanchor{slime-compiler-macroexpand-1}
+Display the compiler-macro expansion of sexp at point.
+
+@fcnanchor{slime-compiler-notes-default-action-or-show-details}
+Invoke the action at point, or show details.
+
+@fcnanchor{slime-compiler-notes-default-action-or-show-details/mouse}
+Invoke the action pointed at by the mouse, or show details.
+
+@fcnanchor{slime-compiler-notes-mode}
+
+@fcnanchor{slime-compiler-notes-quit}
+
+@fcnanchor{slime-compiler-notes-show-details}
@end table
-@node Cross-reference, Inspector, Recovery, Commands
-@subsection Cross-reference
+The annotations are indicated as underlining on source forms. The
+compiler message associated with an annotation can be read either by
+placing the mouse over the text or with the selection commands below.
-@SLIME{}'s cross-reference commands are based on the support provided
-by the Lisp system, which varies widely between Lisps. For systems
-with no builtin @acronym{XREF} support @SLIME{} queries a portable
-@acronym{XREF} package, which is taken from the @cite{CMU AI
-Repository} and bundled with @SLIME{}.
+@table @kbd
+@kbdanchor{M-n, slime-next-note}
+Move the point to the next compiler note and displays the note.
-Each command operates on the symbol at point, or prompts if there is
-none. With a prefix argument they always prompt. You can either enter
-the key bindings as shown here or with the control modified on the
-last key, @xref{Key bindings}.
+@kbdanchor{M-p, slime-previous-note}
+Move the point to the previous compiler note and displays the note.
+@kbdanchor{C-c M-c, slime-remove-notes}
+Remove all annotations from the buffer.
+@end table
+
+@c -----------------------
+@node Evaluation, Recovery, Compilation, Commands
+@subsection Evaluation commands
+
+These commands each evaluate a Lisp expression in a different way. By
+default they show their results in a message, but a prefix argument
+causes the results to be printed in the @REPL{} instead.
+
@table @kbd
-@kbditem{C-c C-w c, slime-who-calls}
-Show function callers.
+@kbdanchor{C-M-x, slime-eval-defun}
+Evaluate the current toplevel form.
+Use @code{slime-re-evaluate-defvar} if the from starts with @code{(defvar}.
-@kbditem{C-c C-w r, slime-who-references}
-Show references to global variable.
+@kbdanchor{C-x C-e, slime-eval-last-expression}
+Evaluate the expression before point.
+@end table
-@kbditem{C-c C-w b, slime-who-binds}
-Show bindings of a global variable.
+If @kbd{C-M-x} or @kbd{C-x C-e} is given a numeric argument, it inserts the
+value into the current buffer at point, rather than displaying it in the
+echo area.
-@kbditem{C-c C-w s, slime-who-sets}
-Show assignments to a global variable.
+@table @kbd
+@kbdanchor{C-c C-p, slime-pprint-eval-last-expression}
+Evaluate the expression before point and pretty-print the result.
-@kbditem{C-c C-w m, slime-who-macroexpands}
-Show expansions of a macro.
+@kbdanchor{C-c C-r, slime-eval-region}
+Evaluate the region.
-@item M-x slime-who-specializes
-Show all known methods specialized on a class.
+@kbdanchor{C-x M-e, slime-eval-last-expression-display-output}
+Display output buffer and evaluate the expression preceding point.
+@kbdanchor{C-c :, slime-interactive-eval}
+Evaluate an expression read from the minibuffer.
+
+@kbdanchor{M-x, slime-scratch}
+Create a @file{*slime-scratch*} buffer. In this
+buffer you can enter Lisp expressions and evaluate them with
+@kbd{C-j}, like in Emacs's @file{*scratch*} buffer.
+
+@kbdanchor{C-c E, slime-edit-value}
+Edit the value of a setf-able form in a new buffer @file{*Edit <form>*}.
+The value is inserted into a temporary buffer for editing and then set
+in Lisp when committed with @code{slime-edit-value-commit}.
+
+@kbdanchor{C-c C-u, slime-undefine-function}
+Unbind symbol for function at point.
@end table
-There are also ``List callers/callees'' commands. These operate by
-rummaging through function objects on the heap at a low-level to
-discover the call graph. They are only available with some Lisp
-systems, and are most useful as a fallback when precise @acronym{XREF}
-information is unavailable.
+@c -----------------------
+@node Recovery, Inspector, Evaluation, Commands
+@subsection Abort/Recovery commands
+
@table @kbd
-@kbditem{C-c <, slime-list-callers}
-List callers of a function.
-@kbditem{C-c >, slime-list-callees}
-List callees of a function.
+@kbdanchor{C-c C-b, slime-interrupt}
+Interrupt Lisp (send @code{SIGINT}).
+
+@kbdanchor{C-c ~, slime-sync-package-and-default-directory}
+Synchronize the current package and working directory from Emacs to
+Lisp.
+
+@kbdanchor{C-c M-p, slime-repl-set-package}
+Set the current package of the @acronym{REPL}.
+
@end table
-@node Inspector, Profiling, Cross-reference, Commands
-@subsection Inspector
+@c -----------------------
+@node Inspector, Profiling, Recovery, Commands
+@subsection Inspector commands
The @SLIME{} inspector is a very fancy Emacs-based alternative to the
standard @code{INSPECT} function. The inspector presents objects in
@@ -743,51 +912,70 @@
function in @file{swank-backend.lisp}.
@table @kbd
-@kbditem{C-c I, slime-inspect}
+
+@kbdanchor{C-c I, slime-inspect}
Inspect the value of an expression entered in the minibuffer.
+
@end table
The standard commands available in the inspector are:
@table @kbd
-@kbditem{RET, slime-inspector-operate-on-point}
+@kbdanchor{RET, slime-inspector-operate-on-point}
If point is on a value then recursivly call the inspcetor on that
value. If point is on an action then call that action.
-@kbditem{d, slime-inspector-describe}
+@kbdanchor{d, slime-inspector-describe}
Describe the slot at point.
-@kbditem{l, slime-inspector-pop}
+@kbdanchor{l, slime-inspector-pop}
Go back to the previous object (return from @kbd{RET}).
-@kbditem{n, slime-inspector-next}
+@kbdanchor{n, slime-inspector-next}
The inverse of @kbd{l}. Also bound to @kbd{SPC}.
-@kbditem{q, slime-inspector-quit}
+@kbdanchor{q, slime-inspector-quit}
Dismiss the inspector buffer.
-@kbditem{M-RET, slime-inspector-copy-down} Evaluate the value under
+@kbdanchor{M-RET, slime-inspector-copy-down} Evaluate the value under
point via the REPL (to set `*').
@end table
-@node Profiling, , Inspector, Commands
-@subsection Profiling
+@c -----------------------
+@node Profiling, Other, Inspector, Commands
+@subsection Profiling commands
@table @kbd
-@item M-x slime-toggle-profile-fdefinition
+@fcnanchor{slime-toggle-profile-fdefinition}
Toggle profiling of a function.
-@item M-x slime-profile-package
+@fcnanchor{slime-profile-package}
Profile all functions in a package.
-@item M-x slime-unprofile-all
+@fcnanchor{slime-unprofile-all}
Unprofile all functions.
-@item M-x slime-profile-report
+@fcnanchor{slime-profile-report}
Report profiler data.
-@item M-x slime-profile-reset
+@fcnanchor{slime-profile-reset}
Reset profiler data.
+@fcnanchor{slime-profiled-functions}
+Show list of currently profiled functions.
@end table
+@c -----------------------
+@node Other, , Profiling, Commands
+@subsection Shadowed Commands
+
+@table @kbd
+
+@kbdanchor{C-c C-a, slime-nop}
+This key-binding is shadowed from lisp-inf.
+@kbditem{C-c C-v, slime-nop}
+This key-binding is shadowed from lisp-inf.
+
+@end table
+
+@c -----------------------
@node Semantic indentation, Reader conditionals, Commands, slime-mode
@section Semantic indentation
@@ -820,7 +1008,7 @@
A more subtle issue is that imperfect caching is used for the sake of
performance. @footnote{@emph{Of course} we made sure it was actually too
slow before making the ugly optimization.}
-@c
+
In an ideal world, Lisp would automatically scan every symbol for
indentation changes after each command from Emacs. However, this is too
expensive to do every time. Instead Lisp usually just scans the symbols
@@ -833,6 +1021,7 @@
You can use @kbd{M-x slime-update-indentation} to force all symbols to
be scanned for indentation information.
+@c -----------------------
@node Reader conditionals, , Semantic indentation, slime-mode
@section Reader conditional fontification
@@ -840,6 +1029,7 @@
source buffers and ``grays out'' code that will be skipped for the
current Lisp connection.
+@c -----------------------
@node REPL, Debugger, slime-mode, Top
@chapter REPL: the ``top level''
@@ -866,46 +1056,53 @@
* Shortcuts::
@end menu
+@c -----------------------
@node REPL commands, Input Navigation, REPL, REPL
@section REPL commands
@table @kbd
-@kbditem{RET, slime-repl-return}
+@kbdanchor{RET, slime-repl-return}
Evaluate the current input in Lisp if it is complete. If incomplete,
open a new line and indent. If a prefix argument is given then the
input is evaluated without checking for completeness.
-@kbditem{C-RET, slime-repl-closing-return}
+@kbdanchor{C-RET, slime-repl-closing-return}
Close any unmatched parenthesis and then evaluate the current input in
Lisp. Also bound to @kbd{M-RET}.
-@kbditem{C-j, slime-repl-newline-and-indent}
+@kbdanchor{C-j, slime-repl-newline-and-indent}
Open and indent a new line.
+@c @anchor{slime-interrupt}
@kbditem{C-c C-c, slime-interrupt}
Interrupt the Lisp process with @code{SIGINT}.
-@kbditem{TAB, slime-complete-symbol}
-Complete the symbol at point.
+@kbdanchor{C-c M-g, slime-quit}
+Quit slime.
-@kbditem{C-c C-o, slime-repl-clear-output}
+@kbdanchor{C-c C-o, slime-repl-clear-output}
Remove the output and result of the previous expression from the
buffer.
-@kbditem{C-c C-t, slime-repl-clear-buffer}
+@kbdanchor{C-c C-t, slime-repl-clear-buffer}
Clear the entire buffer, leaving only a prompt.
@end table
+@c -----------------------
@node Input Navigation, Shortcuts, REPL commands, REPL
@section Input navigation
@table @kbd
-@kbditem{C-a, slime-repl-bol}
+@kbdanchor{C-a, slime-repl-bol}
Go to the beginning of the line, but stop at the @REPL{} prompt.
+@anchor{slime-repl-next-input}
+@anchor{slime-repl-next-matching-input}
+@anchor{slime-repl-previous-input}
+@anchor{slime-repl-previous-matching-input}
@item M-n
@itemx M-p
@itemx M-s
@@ -914,11 +1111,15 @@
@code{slime-repl-@{next,previous@}-matching-input}@*
@code{comint}-style input history commands.
+@anchor{slime-repl-next-prompt}
+@anchor{slime-repl-previous-prompt}
@item C-c C-n
@itemx C-c C-p
@code{slime-repl-next-prompt, slime-repl-previous-prompt}@*
Move between the current and previous prompts in the @REPL{} buffer.
+@anchor{slime-repl-beginning-of-defun}
+@anchor{slime-repl-end-of-defun}
@item C-M-a
@itemx C-M-e
@code{slime-repl-beginning-of-defun, slime-repl-end-of-defun}
@@ -928,6 +1129,7 @@
@end table
+@c -----------------------
@comment node-name, next, previous, up
@node Shortcuts, , Input Navigation, REPL
@section Shortcuts
@@ -941,6 +1143,7 @@
currently documented in this manual, but you can use the @code{help}
shortcut to list them interactively.
+@c -----------------------
@node Debugger, Extras, REPL, Top
@chapter SLDB: the SLIME debugger
@@ -960,65 +1163,63 @@
* Miscellaneous::
@end menu
+@c -----------------------
@node Examining frames, Restarts, Debugger, Debugger
@section Examining frames
Commands for examining the stack frame at point.
@table @kbd
-
-@kbditem{t, sldb-toggle-details}
+@kbdanchor{t, sldb-toggle-details}
Toggle display of local variables and @code{CATCH} tags.
-@kbditem{v, sldb-show-source}
+@kbdanchor{v, sldb-show-source}
View the frame's current source expression. The expression is
presented in the Lisp source file's buffer.
-@kbditem{e, sldb-eval-in-frame}
+@kbdanchor{e, sldb-eval-in-frame}
Evaluate an expression in the frame. The expression can refer to the
available local variables in the frame.
-@kbditem{d, sldb-pprint-eval-in-frame}
+@kbdanchor{d, sldb-pprint-eval-in-frame}
Evaluate an expression in the frame and pretty-print the result in a
temporary buffer.
-@kbditem{D, sldb-disassemble}
+@kbdanchor{D, sldb-disassemble}
Disassemble the frame's function. Includes information such as the
instruction pointer within the frame.
-@kbditem{i, sldb-inspect-in-frame}
+@kbdanchor{i, sldb-inspect-in-frame}
Inspect the result of evaluating an expression in the frame.
-
@end table
+@c -----------------------
@node Restarts, Frame Navigation, Examining frames, Debugger
@section Invoking restarts
@table @kbd
-
-@kbditem{a, sldb-abort}
+@kbdanchor{a, sldb-abort}
Invoke the @code{ABORT} restart.
-@kbditem{q, sldb-quit}
+@kbdanchor{q, sldb-quit}
``Quit'' -- @code{THROW} to a tag that the top-level @SLIME{}
request-loop catches.
-@kbditem{c, sldb-continue}
+@kbdanchor{c, sldb-continue}
Invoke the @code{CONTINUE} restart.
@item 0 ... 9
Invoke a restart by number.
-
@end table
Restarts can also be invoked by pressing @kbd{RET} or @kbd{Mouse-2} on
them in the buffer.
+@c -----------------------
@node Frame Navigation, Miscellaneous, Restarts, Debugger
@section Navigating between frames
@table @kbd
-
@item n
@item p
@code{sldb-down, sldb-up}@*
@@ -1031,46 +1232,48 @@
frame and display the details and source code of the next. Sugared
motion makes you see the details and source code for the current frame
only.
-
@end table
+@c -----------------------
@node Miscellaneous, , Frame Navigation, Debugger
@section Miscellaneous Commands
@table @kbd
-
-@kbditem{r, sldb-restart-frame}
+@kbdanchor{r, sldb-restart-frame}
Restart execution of the frame with the same arguments it was
originally called with. (This command is not available in all
implementations.)
-@kbditem{R, sldb-return-from-frame}
+@kbdanchor{R, sldb-return-from-frame}
Return from the frame with a value entered in the minibuffer. (This
command is not available in all implementations.)
-@kbditem{s, sldb-step}
+@kbdanchor{s, sldb-step}
Step to the next expression in the frame. (This command is not
available in all implementations.)
-@kbditem{B, sldb-break-with-default-debugger}
+@kbdanchor{B, sldb-break-with-default-debugger}
Exit @SLDB{} and debug the condition using the Lisp system's default
debugger.
-@kbditem{:, slime-interactive-eval}
+@c @anchor{slime-interactive-eval}
+@kbditem{C-c :, slime-interactive-eval}
Evaluate an expression entered in the minibuffer.
-
@end table
+@c -----------------------
@node Extras, Customization, Debugger, Top
@chapter Extras
@menu
* slime-selector::
* slime-autodoc-mode::
+* slime-macroexpansion-minor-mode::
* Multiple connections::
* Typeout frames::
@end menu
+@c -----------------------
@node slime-selector, slime-autodoc-mode, Extras, Extras
@section @code{slime-selector}
@@ -1093,36 +1296,62 @@
@end table
@code{slime-selector} doesn't have a key binding by default but we
-suggest that you assign it a global one. You can bind @kbd{C-c s} like
-this:
+suggest that you assign it a global one. You can bind it to @kbd{C-c s}
+like this:
@example
(global-set-key "\C-cs" 'slime-selector)
@end example
+@noindent
And then you can switch to the @REPL{} from anywhere with @kbd{C-c s
r}.
The macro @code{def-slime-selector-method} can be used to define new
buffers for @code{slime-selector} to find.
-@node slime-autodoc-mode, Multiple connections, slime-selector, Extras
+@c -----------------------
+@node slime-autodoc-mode, slime-macroexpansion-minor-mode, slime-selector, Extras
@section @code{slime-autodoc-mode}
-@code{slime-autodoc-mode} is an additional minor-mode for
-automatically showing information about symbols near the point. For
-function names the argument list is displayed and for global variables
-we show the value. This is a clone of @code{eldoc-mode} for Emacs
-Lisp.
+@table @kbd
+@kbditem{M-x, slime-autodoc-mode}
+Autodoc mode is an additional minor-mode for automatically showing
+information about symbols near the point. For function names the
+argument list is displayed, and for global variables, the value.
+This is a clone of @code{eldoc-mode} for Emacs Lisp.
+@end table
-The mode can be enabled in the @code{slime-setup} call of your
+The mode can be enabled by default in the @code{slime-setup} call of your
@code{~/.emacs}:
-
@example
(slime-setup :autodoc t)
@end example
-@node Multiple connections, Typeout frames, slime-autodoc-mode, Extras
+@c -----------------------
+@node slime-macroexpansion-minor-mode, Multiple connections, slime-autodoc-mode, Extras
+@section slime-macroexpansion-minor-mode
+
+Within a slime macroexpansion buffer some extra commands are provided
+(these commands are always available but are only bound to keys in a
+macroexpansion buffer).
+
+@table @kbd
+@kbdanchor{C-c C-m, slime-macroexpand-1-inplace}
+Just like slime-macroexpand-1 but the original form is replaced with the expansion.
+
+@c @anchor{slime-macroexpand-1-inplace}
+@kbditem{g, slime-macroexpand-1-inplace}
+The last macroexpansion is performed again, the current contents of
+the macroexpansion buffer are replaced with the new expansion.
+
+@kbdanchor{q, slime-temp-buffer-quit}
+Close the expansion buffer.
+
+@end table
+
+@c -----------------------
+@node Multiple connections, Typeout frames, slime-macroexpansion-minor-mode, Extras
@section Multiple connections
@SLIME{} is able to connect to multiple Lisp processes at the same
@@ -1147,8 +1376,16 @@
the ``connection list'' buffer:
@table @kbd
-@kbditem{C-c C-x c, slime-list-connections}
+@kbdanchor{C-c C-x c, slime-list-connections}
Pop up a buffer listing the established connections.
+
+@kbdanchor{C-c C-x t, slime-list-threads}
+Pop up a buffer listing the current threads.
+
+@fcnanchor{slime-abort-connection}
+Abort the current connection.
+
+@fcnanchor{slime-restart-connection-at-point}
@end table
The buffer displayed by @code{slime-list-connections} gives a one-line
@@ -1160,22 +1397,30 @@
The commands available in the connection-list buffer are:
@table @kbd
-
-@kbditem{RET, slime-goto-connection}
+@kbdanchor{RET, slime-goto-connection}
Pop to the @acronym{REPL} buffer of the connection at point.
-@kbditem{d, slime-connection-list-make-default}
+@kbdanchor{d, slime-connection-list-make-default}
Make the connection at point the ``default'' connection. It will then
be used for commands in @code{slime-mode} source buffers.
-@kbditem{g, slime-update-connection-list}
+@kbdanchor{g, slime-update-connection-list}
Update the connection list in the buffer.
@kbditem{q, slime-temp-buffer-quit}
Quit the connection list (kill buffer, restore window configuration).
+@fcnanchor{slime-connect}
+Connect to a running Swank server.
+
+@fcnanchor{slime-disconnect}
+Disconnect all connextions.
+
+@fcnanchor{slime-connection-list-mode}
+Connection-list. @acronym{SLIME} Connection List Mode.
@end table
+@c -----------------------
@node Typeout frames, , Multiple connections, Extras
@section Typeout frames
@@ -1188,21 +1433,22 @@
expansions, and so on.
@table @kbd
-@item M-x slime-ensure-typeout-frame
+@fcnanchor{slime-ensure-typeout-frame}
Ensure that a typeout frame exists, creating one if necessary.
@end table
If the typeout frame is closed then the echo area will be used again
as usual.
-To have a typeout frame created automatically at startup you can use
-the @code{slime-connected-hook}:
+To have a typeout frame created automatically at startup you can add
+the @code{slime-connected-hook} to your @file{~/.emacs} file:
@example
(add-hook 'slime-connected-hook 'slime-ensure-typeout-frame)
@end example
-@node Customization, Credits, Extras, Top
+@c -----------------------
+@node Customization, Tips and Tricks, Extras, Top
@chapter Customization
@menu
@@ -1210,6 +1456,7 @@
* Lisp-side::
@end menu
+@c -----------------------
@node Emacs-side customization, Lisp-side, Customization, Customization
@section Emacs-side
@@ -1231,6 +1478,7 @@
(threads) in your Lisp system. It causes any necessary initialization
to be performed during Lisp server startup.
+@anchor{slime-complete-symbol-function}
@item slime-complete-symbol-function
The function to use for completion of Lisp symbols. Three completion
styles are available. The default @code{slime-complete-symbol*}
@@ -1258,16 +1506,15 @@
completes in the usual Emacs way. Finally, there is
@code{slime-fuzzy-complete-symbol}, which is quite different from both
of the above and tries to find best matches to an abbreviated symbol.
-It also has its own keybinding, defaulting to @kbd{C-c M-i}.
+It also has its own key binding, defaulting to @kbd{C-c M-i}.
@xref{slime-fuzzy-complete-symbol}, for more information.
-@item slime-translate-to-lisp-filename-function
-@itemx slime-translate-from-lisp-filename-function
-These functions can be used to translate filenames between Emacs and
-the Lisp system. They are useful if you run Emacs and Lisp on separate
-machines which share a common file system but use a different directory
-structure (different ``mount points''). This is most common with
-@acronym{SMB}-based file sharing.
+@item slime-filename-translations
+This variable controls filename translation between Emacs and the Lisp
+system. It is useful if you run Emacs and Lisp on separate machines
+which don't share a common file system or if they share the filessytem
+but have different layouts, as is the case with @acronym{SMB}-based
+file sharing.
@item slime-net-coding-system
If you want to transmit Unicode characters between Emacs and the Lisp
@@ -1288,6 +1535,7 @@
* Hooks::
@end menu
+@c -----------------------
@node Hooks, , Emacs-side customization, Emacs-side customization
@subsection Hooks
@@ -1301,8 +1549,7 @@
@item slime-connected-hook
This hook is run when @SLIME{} establishes a connection to a Lisp
-server. An example use is to create a Typeout frame (@xref{Typeout
-frames}.)
+server. An example use is to create a Typeout frame (@xref{Typeout frames}.)
@item sldb-hook
This hook is run after @SLDB{} is invoked. The hook functions are
@@ -1312,6 +1559,7 @@
@end table
+@c -----------------------
@node Lisp-side, , Emacs-side customization, Customization
@section Lisp-side (Swank)
@@ -1325,6 +1573,7 @@
* Other configurables::
@end menu
+@c -----------------------
@node Communication style, Other configurables, Lisp-side, Lisp-side
@subsection Communication style
@@ -1336,6 +1585,12 @@
The available communication styles are:
@table @code
+@item NIL
+This style simply loops reading input from the communication socket
+and serves @SLIME{} protocol events as they arise. The simplicity
+means that the Lisp cannot do any other processing while under
+@SLIME{}'s control.
+
@item :FD-HANDLER
This style uses the classical Unix-style ``@code{select()}-loop.''
Swank registers the communication socket with an event-dispatching
@@ -1367,12 +1622,13 @@
The default request handling style is chosen according to the
capabilities your Lisp system. The general order of preference is
-@code{:SPAWN}, then @code{:SIGIO}, then @code{:FD-HANDLER}. You can
-check the default style by calling
-@code{SWANK-BACKEND:PREFERRED-COMMUNICATION-STYLE}. You can also
-override the default by setting @code{SWANK:*COMMUNICATION-STYLE*} in
-your Swank init file.
+@code{:SPAWN}, then @code{:SIGIO}, then @code{:FD-HANDLER}, with
+@code{NIL} as a last resort. You can check the default style by
+calling @code{SWANK-BACKEND:PREFERRED-COMMUNICATION-STYLE}. You can
+also override the default by setting
+@code{SWANK:*COMMUNICATION-STYLE*} in your Swank init file.
+@c -----------------------
@node Other configurables, , Communication style, Lisp-side
@subsection Other configurables
@@ -1414,12 +1670,17 @@
@item SWANK:*USE-DEDICATED-OUTPUT-STREAM*
This variable controls an optimization for sending printed output from
-Lisp to Emacs. When @code{t} (the default) a separate socket is
-established solely for Lisp to send printed output to Emacs
-through. Without the optimization it is necessary to send output in
-protocol-messages to Emacs which must then be decoded, and this
-doesn't always keep up if Lisp starts ``spewing'' copious output.
+Lisp to Emacs. When @code{t} a separate socket is established solely for
+Lisp to send printed output to Emacs through. Without the optimization
+it is necessary to send output in protocol-messages to Emacs which must
+then be decoded, and this doesn't always keep up if Lisp starts
+``spewing'' copious output.
+@item SWANK:*DEDICATED-OUTPUT-STREAM-PORT*
+When @code{*USE-DEDICATED-OUTPUT-STREAM*} is @code{t} the stream will
+be opened on this port. The default value, @code{0}, means that the
+stream will be opened on some random port.
+
@item SWANK:*LOG-EVENTS*
Setting this variable to @code{t} causes all protocol messages
exchanged with Emacs to be printed to @code{*TERMINAL-IO*}. This is
@@ -1430,7 +1691,203 @@
@end table
-@node Credits, , Customization, Top
+@c -----------------------
+@node Tips and Tricks, Credits, Customization, Top
+@chapter Tips and Tricks
+
+@menu
+* Connecting to a remote lisp::
+* Global IO Redirection::
+* Auto-SLIME::
+@end menu
+
+@c -----------------------
+@node Connecting to a remote lisp
+@section Connecting to a remote lisp
+
+One of the advantages of the way @SLIME{} is implemented is that we
+can easily run the Emacs side (slime.el) on one machine and the lisp
+backend (swank) on another. The basic idea is to start up lisp on the
+remote machine, load swank and wait for incoming slime connections. On
+the local machine we start up emacs and tell slime to connect to the
+remote machine. The details are a bit messier but the underlying idea
+is that simple.
+
+@menu
+* Setting up the lisp image::
+* Setting up Emacs::
+* Setting up pathname translations::
+@end menu
+
+@c -----------------------
+@node Setting up the lisp image
+@subsection Setting up the lisp image
+
+
+When you want to load swank without going through the normal, Emacs
+based, process just load the @file{swank-loader.lisp} file. Just
+execute
+
+@example
+(load "/path/to/swank-loader.lisp")
+@end example
+
+inside a running lisp image@footnote{@SLIME{} also provides an
+@acronym{ASDF} system definiton which does the same thing}. Now all we
+need to do is startup our swank server. The first example assumes we're
+using the default settings.
+
+@example
+(swank:create-server)
+@end example
+
+Since we're going to be tunneling our connection via
+ssh@footnote{there is a way to connect without an ssh tunnel, but it
+has the side-effect of giving the entire world access to your lisp
+image, se we're not gonig to talk about it} and we'll only have on
+port open we want to tell swank to not use an extra connection for
+output:
+
+@example
+(setf swank:*use-dedicated-output-stream* nil)
+@end example
+
+@c -----------------------
+=======
+If you need to do anything particular
+(like be able to reconnect to swank after you're done), look into
+@code{swank:create-server}'s other arguments. Some of these arguments
+are
+@table @code
+
+@item :PORT
+Port number for the server to listen on (default: 4005).
+@item :STYLE
+See @xref{Communication style}.
+@item :DONT-CLOSE
+Boolean indicating if the server will continue to accept connections
+after the first one (default: @code{NIL}). For ``long-running'' lisp processes
+to which you want to be able to connect from time to time,
+specify @code{:dont-close t}
+@item :CODING-SYSTEM
+String designating the encoding to be used to communicate between the
+Emacs and Lisp.
+@end table
+
+So the more complete example will be
+@example
+(swank:create-server :port 4005 :dont-close t :coding-system "utf-8-unix")
+@end example
+On the emacs side you will use something like
+@example
+(setq slime-net-coding-system 'utf-8-unix)
+(slime-connect "127.0.0.1" 4005))
+@end example
+to connect to this lisp image from the same machine.
+
+
+>>>>>>> 1.49
+@node Setting up Emacs
+@subsection Setting up Emacs
+
+Now we need to create the tunnel between the local machine and the
+remote machine.
+
+@example
+ssh -L4005:127.0.0.1:4005 username@@remote.example.com
+@end example
+
+That ssh invocation creates an ssh tunnel between the port 4005 on our
+local machine and the port 4005 on the remote machine@footnote{By
+default swank listens for incoming connections on port 4005, had we
+passed a @code{:port} parameter to @code{swank:create-server} we'd be
+using that port number instead}.
+
+Finally we can start @SLIME{}:
+
+@example
+M-x slime-connect RET RET
+@end example
+
+The @kbd{RET RET} sequence just means that we want to use the default
+host (@code{127.0.0.1}) and the default port (@code{4005}). Even
+though we're connecting to a remote machine the ssh tunnel fools Emacs
+into thinking it's actually @code{127.0.0.1}.
+
+@c -----------------------
+@node Setting up pathname translations
+@subsection Setting up pathname translations
+
+One of the main problems with running swank remotely is that Emacs
+assumes the files can be found using normal filenames. if we want
+things like @code{slime-compile-and-load-file} (@kbd{C-c C-k}) and
+@code{slime-edit-definition} (@kbd{M-.}) to work correctly we need to
+find a way to let our local Emacs refer to remote files.
+
+There are, mainly, two ways to do this. The first is to mount, using
+NFS or similar, the remote machine's hard disk on the local machine's
+file system in such a fashion that a filename like
+(a)file{/opt/project/source.lisp} refers to the same file on both
+machines. Unfortunetly NFS is usually slow, often buggy, and not
+always feasable, fortunetely we have an ssh connection and Emacs'
+@code{tramp-mode} can do the rest.
+
+What we do is teach Emacs how to take a filename on the remote machine
+and translate it into something that tramp can understand and access
+(and vice-versa). Assuming the remote machine's host name is
+(a)code{remote.example.com}, @code{cl:machine-instance} returns
+``remote'' and we login as the user ``user'' we can use @SLIME{}'s
+built-in mechanism to setup the proper transaltions by simply doing:
+
+@example
+(push (slime-create-filename-translator :machine-instance "remote.example.com"
+ :remote-host "remote"
+ :username "user")
+ slime-filename-translations)
+@end example
+
+@c -----------------------
+@node Global IO Redirection
+@section Globally redirecting all IO to the REPL
+
+By default @SLIME{} does not change @code{*standard-output*} and
+friends outside of the @REPL{}. If you have any other threads which
+call @code{format}, @code{write-string}, etc. that output will be seen
+only in the @code{*inferior-lisp*} buffer or on the terminal, more
+often than not this inconvenient. So, if you want code such as this:
+
+@example
+(run-in-new-thread
+ (lambda ()
+ (write-line "In some random thread.~%" *standard-output*)))
+@end example
+
+to send its output to @SLIME{}'s repl buffer, as opposed to
+@code{*inferior-lisp*}, set @code{swank:*globally-redirect-io*} to T.
+
+Note that the value of this variable is only checked when swank
+accepts the connection so you should set it via
+(a)file{~/.swank.lisp}. Otherwise you will need to call
+@code{swank::globally-redirect-io-to-connection} yourself, but you
+shouldn't do that unless you know what you're doing.
+
+@c -----------------------
+@node Auto-SLIME
+@section Connecting to SLIME automatically
+
+To make @SLIME{} connect to your lisp whenever you open a lisp file
+just add this to your @file{.emacs}:
+
+@example
+(add-hook 'slime-mode-hook
+ (lambda ()
+ (unless (slime-connected-p)
+ (save-excursion (slime)))))
+@end example
+
+
+@c -----------------------
+@node Credits, Index to Key Bindings, Tips and Tricks, Top
@chapter Credits
@emph{The soppy ending...}
@@ -1466,4 +1923,768 @@
LispWorks. Thanks also to Alain Picard and Memetrics for funding
Martin's initial work on the LispWorks backend!
+
+@c -----------------------
+@node Index to Key Bindings, Index to Functions, Credits, Top
+@appendix Index to Key Bindings
+
+@table @kbd
+@kbdindex{SPC, slime-space}
+@kbdindex{C-c RET, slime-macroexpand-1}
+@kbdindex{C-c :, slime-interactive-eval}
+@kbdindex{C-c <, slime-list-callers}
+@kbdindex{C-c >, slime-list-callees}
+@kbdindex{C-c E, slime-edit-value}
+@kbdindex{C-c I, slime-inspect}
+@kbdindex{C-c u, slime-undefine-function}
+@kbdindex{C-c ~, slime-sync-package-and-default-directory}
+@kbdindex{C-c C-], slime-close-all-sexp}
+@kbdindex{C-c C-a, slime-nop}
+@kbdindex{C-c C-b, slime-interrupt}
+@kbdindex{C-c C-c, slime-compile-defun}
+@kbdindex{C-c C-d d, slime-describe-symbol}
+@kbdindex{C-c C-d ~, common-lisp-hyperspec-format}
+@kbdindex{C-c C-e, slime-interactive-eval}
+@kbdindex{C-c C-f, slime-describe-function}
+@kbdindex{C-c C-i, slime-complete-symbol}
+@kbdindex{C-c C-k, slime-compile-and-load-file}
+@kbdindex{C-c C-l, slime-load-file}
+@kbdindex{C-c C-m, slime-macroexpand-1}
+@kbdindex{C-c C-p, slime-pprint-eval-last-expression}
+@kbdindex{C-c C-q, slime-close-parens-at-point}
+@kbdindex{C-c C-r, slime-eval-region}
+@kbdindex{C-c C-s, slime-complete-form}
+@kbdindex{C-c C-t, slime-toggle-trace-fdefinition}
+@kbdindex{C-c C-v, slime-nop}
+@kbdindex{C-c C-w s, slime-who-sets}
+@kbdindex{C-c C-x c, slime-list-connections}
+@kbdindex{C-c C-x t, slime-list-threads}
+@kbdindex{C-c C-y, slime-call-defun}
+@kbdindex{C-c C-z, slime-switch-to-output-buffer}
+@kbdindex{C-c M-c, slime-remove-notes}.
+@kbdindex{C-c M-d, slime-disassemble-symbol}
+@kbdindex{C-c M-i, slime-fuzzy-complete-symbol}
+@kbdindex{C-c M-g, slime-quit}
+@kbdindex{C-c M-k, slime-compile-file}
+@kbdindex{C-c M-m, slime-macroexpand-all}
+@kbdindex{C-c M-p, slime-repl-set-package}
+@kbdindex{C-c M-q, slime-reindent-defun}
+@kbdindex{C-x 4 ., slime-edit-definition-other-window}
+@kbdindex{C-x 5 ., slime-edit-definition-other-frame}
+@kbdindex{C-x C-e, slime-eval-last-expression}
+@kbdindex{C-x M-e, slime-eval-last-expression-display-output}
+@kbdindex{M-TAB, slime-complete-symbol}
+@kbdindex{M-*, slime-pop-find-definition-stack}
+@kbdindex{M-., slime-edit-definition}
+@kbdindex{M-\,, slime-pop-find-definition-stack}
+@kbdindex{M-n, slime-next-note}
+@kbdindex{M-p, slime-previous-note}
+@kbdindex{C-M-i, slime-complete-symbol}
+@kbdindex{C-M-x, slime-eval-defun}
+@end table
+
+@c -----------------------
+@node Index to Functions, , Index to Key Bindings, Top
+@appendix Index to Functions
+
+@c Note: the functions commented out below are in slime.el but as
+@c yet unreferenced (and may or may not be -jkc-).
+
+@table @code
+@fcnindex{common-lisp-hyperspec-format}
+@c @fcnindex{sldb-mode-hook}
+@c @fcnindex{slime-mode-hook}
+@c @fcnindex{slime-repl-mode-hook}
+@c @fcnindex{compile}
+@c @fcnindex{compile-defun}
+@c @fcnindex{fboundp}
+@c @fcnindex{def-sldb-face}
+@c @fcnindex{def-sldb-faces}
+@c @fcnindex{def-slime-selector-method}
+@c @fcnindex{def-slime-test}
+@c @fcnindex{define-sldb-invoke-restart-key}
+@c @fcnindex{define-sldb-invoke-restart-keys}
+@c @fcnindex{define-slime-dialect}
+@c @fcnindex{defslime-repl-shortcut}
+@c @fcnindex{destructure-case}
+@c @fcnindex{in-sldb-face}
+@c @fcnindex{inferior-slime-closing-return}
+@c @fcnindex{inferior-slime-indent-line}
+@c @fcnindex{inferior-slime-input-complete-p}
+@c @fcnindex{inferior-slime-return}
+@fcnindex{sldb-abort}
+@c @fcnindex{sldb-activate}
+@c @fcnindex{sldb-add-face}
+@c @fcnindex{sldb-backward-frame}
+@c @fcnindex{sldb-beginning-of-backtrace}
+@c @fcnindex{sldb-break}
+@c @fcnindex{sldb-break-on-return}
+@fcnindex{sldb-break-with-default-debugger}
+@c @fcnindex{sldb-buffers}
+@c @fcnindex{sldb-catch-tags}
+@fcnindex{sldb-continue}
+@c @fcnindex{sldb-debugged-continuations}
+@c @fcnindex{sldb-default-action}
+@c @fcnindex{sldb-default-action/mouse}
+@c @fcnindex{sldb-delete-overlays}
+@c @fcnindex{sldb-details-down}
+@c @fcnindex{sldb-details-up}
+@fcnindex{sldb-disassemble}
+@c @fcnindex{sldb-dispatch-extras}
+@c @fcnindex{sldb-down}
+@c @fcnindex{sldb-end-of-backtrace}
+@fcnindex{sldb-eval-in-frame}
+@c @fcnindex{sldb-exit}
+@c @fcnindex{sldb-fetch-all-frames}
+@c @fcnindex{sldb-fetch-more-frames}
+@c @fcnindex{sldb-find-buffer}
+@c @fcnindex{sldb-format-reference-node}
+@c @fcnindex{sldb-format-reference-source}
+@c @fcnindex{sldb-forward-frame}
+@c @fcnindex{sldb-frame-details-visible-p}
+@c @fcnindex{sldb-frame-locals}
+@c @fcnindex{sldb-frame-number-at-point}
+@c @fcnindex{sldb-frame-region}
+@c @fcnindex{sldb-get-buffer}
+@c @fcnindex{sldb-get-default-buffer}
+@c @fcnindex{sldb-goto-last-frame}
+@c @fcnindex{sldb-help-summary}
+@c @fcnindex{sldb-hide-frame-details}
+@c @fcnindex{sldb-highlight-sexp}
+@c @fcnindex{sldb-insert-condition}
+@c @fcnindex{sldb-insert-frame}
+@c @fcnindex{sldb-insert-frames}
+@c @fcnindex{sldb-insert-locals}
+@c @fcnindex{sldb-insert-references}
+@c @fcnindex{sldb-insert-restarts}
+@c @fcnindex{sldb-inspect-condition}
+@fcnindex{sldb-inspect-in-frame}
+@c @fcnindex{sldb-inspect-var}
+@c @fcnindex{sldb-invoke-restart}
+@c @fcnindex{sldb-level}
+@c @fcnindex{sldb-list-catch-tags}
+@c @fcnindex{sldb-list-locals}
+@c @fcnindex{sldb-lookup-reference}
+@c @fcnindex{sldb-maybe-recenter-region}
+@c @fcnindex{sldb-next}
+@c @fcnindex{sldb-out}
+@fcnindex{sldb-pprint-eval-in-frame}
+@c @fcnindex{sldb-previous-frame-number}
+@c @fcnindex{sldb-print-condition}
+@c @fcnindex{sldb-prune-initial-frames}
+@fcnindex{sldb-quit}
+@c @fcnindex{sldb-reference-properties}
+@c @fcnindex{sldb-restart-at-point}
+@fcnindex{sldb-restart-frame}
+@fcnindex{sldb-return-from-frame}
+@c @fcnindex{sldb-setup}
+@c @fcnindex{sldb-show-frame-details}
+@c @fcnindex{sldb-show-frame-source}
+@fcnindex{sldb-show-source}
+@fcnindex{sldb-step}
+@c @fcnindex{sldb-sugar-move}
+@fcnindex{sldb-toggle-details}
+@c @fcnindex{sldb-up}
+@c @fcnindex{sldb-var-number-at-point}
+@c @fcnindex{sldb-xemacs-emulate-point-entered-hook}
+@c @fcnindex{sldb-xemacs-post-command-hook}
+@fcnindex{slime-abort-connection}
+@c @fcnindex{slime-accept-process-output}
+@c @fcnindex{slime-activate-font-lock-magic}
+@c @fcnindex{slime-add-face}
+@c @fcnindex{slime-add-presentation-properties}
+@c @fcnindex{slime-after-change-function}
+@c @fcnindex{slime-alistify}
+@fcnindex{slime-apropos}
+@fcnindex{slime-apropos-all}
+@fcnindex{slime-apropos-package}
+@c @fcnindex{slime-apropos-summary} [internal]
+@c @fcnindex{slime-arglist}
+@c @fcnindex{slime-arglist-specializers}
+@c @fcnindex{slime-at-top-level-p}
+@c @fcnindex{slime-autodoc} [internal]
+@c @fcnindex{slime-autodoc-global-at-point} [internal]
+@c @fcnindex{slime-autodoc-message} [internal]
+@c @fcnindex{slime-autodoc-message-dimensions} [internal]
+@c @fcnindex{slime-autodoc-message-ok-p} [internal]
+@fcnindex{slime-autodoc-mode}
+@c @fcnindex{slime-autodoc-pre-command-refresh-echo-area} [internal]
+@c @fcnindex{slime-autodoc-start-timer} ??
+@c @fcnindex{slime-autodoc-stop-timer} [internal]
+@c @fcnindex{slime-autodoc-thing-at-point} [internal]
+@c @fcnindex{slime-autodoc-timer-hook} [internal]
+@c @fcnindex{slime-background-activities-enabled-p}
+@c @fcnindex{slime-background-message}
+@c @fcnindex{slime-batch-test}
+@c @fcnindex{slime-beginning-of-comment} [internal]
+@c @fcnindex{slime-beginning-of-list} [internal]
+@c @fcnindex{slime-beginning-of-symbol} [internal]
+@c @fcnindex{slime-bogus-completion-alist}
+@c @fcnindex{slime-browse-classes}
+@c @fcnindex{slime-browse-xrefs}
+@c @fcnindex{slime-buffer-substring-with-reified-output}
+@c @fcnindex{slime-busy-p}
+@c @fcnindex{slime-bytecode-stale-p}
+@fcnindex{slime-call-defun}
+@c @fcnindex{slime-call-describer}
+@c @fcnindex{slime-call-with-browser-setup}
+@fcnindex{slime-calls-who}
+@c @fcnindex{slime-changelog-date}
+@c @fcnindex{slime-cheat-sheet}
+@c @fcnindex{slime-cheat-sheet-table}
+@c @fcnindex{slime-check}
+@c @fcnindex{slime-check-coding-system}
+@c @fcnindex{slime-check-connected}
+@c @fcnindex{slime-check-eval-in-emacs-enabled}
+@c @fcnindex{slime-check-sldb-level}
+@c @fcnindex{slime-check-top-level}
+@c @fcnindex{slime-choose-connection}
+@c @fcnindex{slime-choose-overlay-for-sexp}
+@c @fcnindex{slime-choose-overlay-region}
+@c @fcnindex{slime-cl-symbol-external-ref-p}
+@c @fcnindex{slime-cl-symbol-name}
+@c @fcnindex{slime-cl-symbol-package}
+@fcnindex{slime-close-all-sexp}
+@fcnindex{slime-close-parens-at-point}
+@c @fcnindex{slime-coding-system-cl-name}
+@c @fcnindex{slime-coding-system-mulibyte-p}
+@c @fcnindex{slime-compilation-finished}
+@c @fcnindex{slime-compilation-finished-continuation}
+@fcnindex{slime-compile-and-load-file}
+@fcnindex{slime-compile-defun}
+@fcnindex{slime-compile-file}
+@fcnindex{slime-compile-region}
+@c @fcnindex{slime-compile-string} [internal]
+@fcnindex{slime-compiler-macroexpand}
+@fcnindex{slime-compiler-macroexpand-1}
+@c @fcnindex{slime-compiler-notes} [internal]
+@fcnindex{slime-compiler-notes-default-action-or-show-details}
+@fcnindex{slime-compiler-notes-default-action-or-show-details/mouse}
+@fcnindex{slime-compiler-notes-quit}
+@fcnindex{slime-compiler-notes-show-details}
+@c @fcnindex{slime-compiler-notes-to-tree} [internal]
+@c @fcnindex{slime-complete-delay-restoration} [internal]
+@c @fcnindex{slime-complete-forget-window-configuration} [internal]
+@fcnindex{slime-complete-form}
+@c @fcnindex{slime-complete-maybe-restore-window-configuration} [internal]
+@c @fcnindex{slime-complete-maybe-save-window-configuration} [internal]
+@c @fcnindex{slime-complete-restore-window-configuration} [internal]
+@fcnindex{slime-complete-symbol}
+@c @fcnindex{slime-complete-symbol*} [internal]
+@c @fcnindex{slime-complete-symbol*-fancy-bit} [internal]
+@c @fcnindex{slime-completion-window-active-p} [internal]
+@c @fcnindex{slime-completions} [internal]
+@c @fcnindex{slime-completions-for-keyword} [internal]
+@fcnindex{slime-connect}
+@c @fcnindex{slime-connected-p} [internal]
+@c @fcnindex{slime-connection} [internal]
+@c @fcnindex{slime-connection-at-point} [internal]
+@c @fcnindex{slime-connection-close-hook} [internal]
+@fcnindex{slime-connection-list-make-default}
+@fcnindex{slime-connection-list-mode}
+@c @fcnindex{slime-connection-port} [internal]
+@c @fcnindex{slime-control-modified-char}
+@c @fcnindex{slime-copy-or-inspect-presentation-at-mouse}
+@c @fcnindex{slime-copy-presentation-at-mouse}
+@c @fcnindex{slime-create-message-window}
+@c @fcnindex{slime-create-note-overlay}
+@c @fcnindex{slime-create-test-results-buffer}
+@c @fcnindex{slime-current-connection} [internal]
+@c @fcnindex{slime-current-package} [internal]
+@c @fcnindex{slime-def-connection-var}
+@c @fcnindex{slime-define-keys}
+@c @fcnindex{slime-defun-at-point}
+@c @fcnindex{slime-delete-hidden-outline-text}
+@fcnindex{slime-describe-function}
+@c @fcnindex{slime-describe-presentation-at-mouse}
+@fcnindex{slime-describe-symbol}
+@fcnindex{slime-disassemble-symbol}
+@fcnindex{slime-disconnect}
+@c @fcnindex{slime-dismiss-temp-buffer}
+@c @fcnindex{slime-dispatch-event}
+@c @fcnindex{slime-display-buffer-region}
+@c @fcnindex{slime-display-completion-list}
+@c @fcnindex{slime-display-eval-result}
+@c @fcnindex{slime-display-message}
+@c @fcnindex{slime-display-output-buffer}
+@c @fcnindex{slime-display-xref-buffer}
+@c @fcnindex{slime-documentation}
+@c @fcnindex{slime-draw-connection-list}
+@c @fcnindex{slime-easy-menu}
+@c @fcnindex{slime-echo-arglist}
+@c @fcnindex{slime-ed}
+@fcnindex{slime-edit-definition}
+@fcnindex{slime-edit-definition-other-frame}
+@fcnindex{slime-edit-definition-other-window}
+@fcnindex{slime-edit-definition-with-etags}
+@fcnindex{slime-edit-value}
+@c @fcnindex{slime-edit-value-callback}
+@c @fcnindex{slime-edit-value-commit}
+@c @fcnindex{slime-emacs-20-p}
+@c @fcnindex{slime-enclosing-operator-names}
+@c @fcnindex{slime-end-of-symbol}
+@c @fcnindex{slime-ensure-presentation-overlay}
+@c @fcnindex{slime-ensure-typeout-frame}
+@c @fcnindex{slime-etags-definitions}
+@c @fcnindex{slime-eval}
+@c @fcnindex{slime-eval-async}
+@c @fcnindex{slime-eval-buffer}
+@fcnindex{slime-eval-defun}
+@c @fcnindex{slime-eval-describe}
+@c @fcnindex{slime-eval-feature-conditional}
+@c @fcnindex{slime-eval-for-lisp}
+@fcnindex{slime-eval-last-expression}
+@fcnindex{slime-eval-last-expression-display-output}
+@c @fcnindex{slime-eval-macroexpand}
+@c @fcnindex{slime-eval-macroexpand-inplace}
+@c @fcnindex{slime-eval-print}
+@c @fcnindex{slime-eval-print-last-expression}
+@fcnindex{slime-eval-region}
+@c @fcnindex{slime-eval-with-transcript}
+@c @fcnindex{slime-events-buffer}
+@c @fcnindex{slime-execute-tests}
+@c @fcnindex{slime-expand-abbreviations-and-complete}
+@c @fcnindex{slime-expand-class-node}
+@c @fcnindex{slime-expand-xrefs}
+@c @fcnindex{slime-extract-context}
+@c @fcnindex{slime-face-inheritance-possible-p}
+@c @fcnindex{slime-fetch-browsable-xrefs}
+@c @fcnindex{slime-filter-buffers}
+@c @fcnindex{slime-find-asd} [internal]
+@c @fcnindex{slime-find-buffer-package} [internal]
+@c @fcnindex{slime-find-coding-system} [internal]
+@c @fcnindex{slime-find-connection-by-name} [internal]
+@c @fcnindex{slime-find-filename-translators} [internal]
+@c @fcnindex{slime-find-next-note} [internal]
+@c @fcnindex{slime-find-note} [internal]
+@c @fcnindex{slime-find-previous-note} [internal]
+@c @fcnindex{slime-first-change-hook}
+@c @fcnindex{slime-fontify-string}
+@c @fcnindex{slime-forward-blanks}
+@c @fcnindex{slime-forward-positioned-source-path}
+@c @fcnindex{slime-forward-reader-comment}
+@c @fcnindex{slime-forward-reader-conditional}
+@c @fcnindex{slime-forward-sexp}
+@c @fcnindex{slime-forward-source-path}
+@c @fcnindex{slime-frame-windows}
+@c @fcnindex{slime-from-lisp-filename}
+@fcnindex{slime-fuzzy-abort}
+@fcnindex{slime-fuzzy-complete-symbol}
+@fcnindex{slime-fuzzy-completions-mode}
+@c @fcnindex{slime-fuzzy-choices-buffer} [internal]
+@c @fcnindex{slime-fuzzy-completions} [internal]
+@c @fcnindex{slime-fuzzy-done} [internal]
+@c @fcnindex{slime-fuzzy-insert} [internal]
+@c @fcnindex{slime-fuzzy-insert-completion-choice} [internal]
+@c @fcnindex{slime-fuzzy-insert-from-point} [internal]
+@c @fcnindex{slime-fuzzy-maybe-restore-window-configuration} [internal]
+@c @fcnindex{slime-fuzzy-next} ???
+@c @fcnindex{slime-fuzzy-post-command-hook} [internal]
+@c @fcnindex{slime-fuzzy-prev} ???
+@c @fcnindex{slime-fuzzy-save-window-configuration} [internal]
+@c @fcnindex{slime-fuzzy-select} ???
+@c @fcnindex{slime-fuzzy-select/mouse} ???
+@c @fcnindex{slime-fuzzy-selected} [internal]
+@c @fcnindex{slime-fuzzy-window-configuration-change} [internal]
+@c @fcnindex{slime-fuzzy-window-configuration-change-add-hook} [internal]
+@c @fcnindex{slime-generate-connection-name}
+@c @fcnindex{slime-get-arglist} [internal]
+@c @fcnindex{slime-get-cached-autodoc} [internal]
+@c @fcnindex{slime-get-fuzzy-buffer} [internal]
+@c @fcnindex{slime-global-variable-name-p} [internal]
+@fcnindex{slime-goto-connection}
+@c @fcnindex{slime-goto-definition} ???
+@c @fcnindex{slime-goto-definition-other-window} [internal]
+@c @fcnindex{slime-goto-location-buffer} [internal]
+@c @fcnindex{slime-goto-location-position} [internal]
+@c @fcnindex{slime-goto-next-xref} [internal]
+@c @fcnindex{slime-goto-source-location} [internal]
+@fcnindex{slime-goto-xref}
+@c @fcnindex{slime-group-similar}
+@c @fcnindex{slime-handle-indentation-update}
+@c @fcnindex{slime-handle-repl-shortcut}
+@c @fcnindex{slime-hide-inferior-lisp-buffer} [internal]
+@c @fcnindex{slime-highlight-edits}
+@c @fcnindex{slime-highlight-edits-compile-hook}
+@c @fcnindex{slime-highlight-edits-init-buffer}
+@c @fcnindex{slime-highlight-edits-reset-buffer}
+@c @fcnindex{slime-highlight-notes}
+@fcnindex{slime-hyperspec-lookup}
+@c @fcnindex{slime-in-expression-p}
+@c @fcnindex{slime-indent-and-complete-symbol}
+@c @fcnindex{slime-inferior-connect} [internal]
+@c @fcnindex{slime-inferior-lisp-args} [internal]
+@c @fcnindex{slime-init-command}
+@c @fcnindex{slime-init-connection-state}
+@c @fcnindex{slime-init-keymaps}
+@c @fcnindex{slime-init-output-buffer}
+@c @fcnindex{slime-init-xref-buffer}
+@c @fcnindex{slime-input-complete-p}
+@c @fcnindex{slime-insert-arglist}
+@c @fcnindex{slime-insert-balanced-comments}
+@c @fcnindex{slime-insert-presentation}
+@c @fcnindex{slime-insert-transcript-delimiter}
+@c @fcnindex{slime-insert-xrefs}
+@c @fcnindex{slime-inside-comment-p}
+@fcnindex{slime-inspect}
+@c @fcnindex{slime-inspect-presentation-at-mouse}
+@c @fcnindex{slime-inspector-buffer}
+@fcnindex{slime-inspector-copy-down}
+@fcnindex{slime-inspector-describe}
+@c @fcnindex{slime-inspector-fontify}
+@c @fcnindex{slime-inspector-insert-ispec}
+@fcnindex{slime-inspector-next}
+@c @fcnindex{slime-inspector-next-inspectable-object}
+@c @fcnindex{slime-inspector-operate-on-click}
+@fcnindex{slime-inspector-operate-on-point}
+@fcnindex{slime-inspector-pop}
+@c @fcnindex{slime-inspector-pprint}
+@c @fcnindex{slime-inspector-previous-inspectable-object}
+@fcnindex{slime-inspector-quit}
+@c @fcnindex{slime-inspector-reinspect}
+@fcnindex{slime-interactive-eval}
+@fcnindex{slime-interrupt}
+@c @fcnindex{slime-intersperse}
+@c @fcnindex{slime-io-speed-test}
+@c @fcnindex{slime-isearch}
+@c @fcnindex{slime-isearch-with-function}
+@c @fcnindex{slime-keys}
+@c @fcnindex{slime-kill-all-buffers}
+@c @fcnindex{slime-last-expression}
+@c @fcnindex{slime-length>}
+@c @fcnindex{slime-lisp-mode-hook}
+@c @fcnindex{slime-list-all-repl-shortcuts}
+@fcnindex{slime-list-callees}
+@fcnindex{slime-list-callers}
+@c @fcnindex{slime-list-compiler-notes}
+@fcnindex{slime-list-connections}
+@c @fcnindex{slime-list-repl-short-cuts}
+@fcnindex{slime-list-threads}
+@fcnindex{slime-load-file}
+@c @fcnindex{slime-load-file-set-package}
+@c @fcnindex{slime-load-system}
+@c @fcnindex{slime-log-event}
+@c @fcnindex{slime-lookup-lisp-implementation}
+@c @fcnindex{slime-lookup-shortcut}
+@fcnindex{slime-macroexpand-1}
+@fcnindex{slime-macroexpand-1-inplace}
+@c @fcnindex{slime-macroexpand-again}
+@fcnindex{slime-macroexpand-all}
+@c @fcnindex{slime-macroexpand-all-inplace}
+@c @fcnindex{slime-make-default-connection}
+@c @fcnindex{slime-make-net-buffer}
+@c @fcnindex{slime-make-tramp-file-name}
+@c @fcnindex{slime-make-typeout-frame}
+@c @fcnindex{slime-make-variables-buffer-local}
+@c @fcnindex{slime-mark-input-start}
+@c @fcnindex{slime-mark-output-end}
+@c @fcnindex{slime-mark-output-start}
+@c @fcnindex{slime-mark-presentation-end}
+@c @fcnindex{slime-mark-presentation-end-handler}
+@c @fcnindex{slime-mark-presentation-start}
+@c @fcnindex{slime-mark-presentation-start-handler}
+@c @fcnindex{slime-maybe-complete-as-filename}
+@c @fcnindex{slime-maybe-display-output-buffer}
+@c @fcnindex{slime-maybe-list-compiler-notes}
+@c @fcnindex{slime-maybe-show-xrefs-for-notes}
+@c @fcnindex{slime-maybe-start-lisp}
+@c @fcnindex{slime-menu-choices-for-presentation}
+@c @fcnindex{slime-merge-note-into-overlay}
+@c @fcnindex{slime-merge-notes}
+@c @fcnindex{slime-merge-notes-for-display}
+@c @fcnindex{slime-message}
+@c @fcnindex{slime-minibuffer-respecting-message}
+@c @fcnindex{slime-most-severe}
+@c @fcnindex{slime-net-close}
+@c @fcnindex{slime-net-connect}
+@c @fcnindex{slime-net-decode-length}
+@c @fcnindex{slime-net-encode-length}
+@c @fcnindex{slime-net-filter}
+@c @fcnindex{slime-net-have-input-p}
+@c @fcnindex{slime-net-read}
+@c @fcnindex{slime-net-send}
+@c @fcnindex{slime-net-sentinel}
+@c @fcnindex{slime-next-line/not-add-newlines}
+@c @fcnindex{slime-next-location}
+@fcnindex{slime-next-note}
+@fcnindex{slime-nop}
+@c @fcnindex{slime-note-at-point}
+@c @fcnindex{slime-note-count-string}
+@c @fcnindex{slime-note-has-location-p}
+@c @fcnindex{slime-note-overlay-p}
+@c @fcnindex{slime-note-overlays-at-point}
+@c @fcnindex{slime-note.location}
+@c @fcnindex{slime-note.message}
+@c @fcnindex{slime-note.references}
+@c @fcnindex{slime-note.severity}
+@c @fcnindex{slime-note.short-message}
+@c @fcnindex{slime-notes-in-same-location-p}
+@c @fcnindex{slime-one-line-ify}
+@c @fcnindex{slime-oneliner}
+@c @fcnindex{slime-only-whitespace-p}
+@c @fcnindex{slime-oos}
+@c @fcnindex{slime-open-inspector}
+@c @fcnindex{slime-open-stream-to-lisp}
+@c @fcnindex{slime-output-buffer}
+@c @fcnindex{slime-output-filter}
+@c @fcnindex{slime-overlay-note}
+@c @fcnindex{slime-parse-context}
+@c @fcnindex{slime-parse-context}
+@c @fcnindex{slime-parse-extended-operator-name}
+@c @fcnindex{slime-parse-extended-operator-name/apply}
+@c @fcnindex{slime-parse-extended-operator-name/cerror}
+@c @fcnindex{slime-parse-extended-operator-name/defmethod}
+@c @fcnindex{slime-parse-extended-operator-name/make-instance}
+@c @fcnindex{slime-parse-toplevel-form}
+@c @fcnindex{slime-pattern-path}
+@c @fcnindex{slime-ping}
+@c @fcnindex{slime-point-moves-p}
+@fcnindex{slime-pop-find-definition-stack}
+@c @fcnindex{slime-pop-to-other-window}
+@c @fcnindex{slime-post-command-hook}
+@fcnindex{slime-pprint-eval-last-expression}
+@c @fcnindex{slime-pprint-event}
+@c @fcnindex{slime-pre-command-hook}
+@c @fcnindex{slime-presentation-around-click}
+@c @fcnindex{slime-presentation-around-or-before-point}
+@c @fcnindex{slime-presentation-around-point}
+@c @fcnindex{slime-presentation-expression}
+@c @fcnindex{slime-presentation-menu}
+@c @fcnindex{slime-presentation-start-p}
+@c @fcnindex{slime-presentation-stop-p}
+@c @fcnindex{slime-presentation-whole-p}
+@c @fcnindex{slime-presentations-around-point}
+@c @fcnindex{slime-preserve-zmacs-region}
+@c @fcnindex{slime-pretty-lambdas}
+@c @fcnindex{slime-pretty-package-name}
+@c @fcnindex{slime-pretty-print-presentation-at-mouse}
+@fcnindex{slime-previous-note}
+@c @fcnindex{slime-prin1-to-string}
+@c @fcnindex{slime-print-apropos}
+@c @fcnindex{slime-print-check-error}
+@c @fcnindex{slime-print-check-failed}
+@c @fcnindex{slime-print-check-ok}
+@c @fcnindex{slime-process}
+@c @fcnindex{slime-process-available-input}
+@fcnindex{slime-profile-package}
+@fcnindex{slime-profile-report}
+@fcnindex{slime-profile-reset}
+@fcnindex{slime-profiled-functions}
+@c @fcnindex{slime-propertize-region}
+@c @fcnindex{slime-property-bounds}
+@c @fcnindex{slime-property-position}
+@c @fcnindex{slime-push-definition-stack}
+@c @fcnindex{slime-qualify-cl-symbol}
+@c @fcnindex{slime-qualify-cl-symbol-name}
+@fcnindex{slime-quit}
+@c @fcnindex{slime-quit-connection-at-point}
+@c @fcnindex{slime-quit-lisp}
+@c @fcnindex{slime-quit-sentinel}
+@c @fcnindex{slime-random-words-of-encouragement}
+@c @fcnindex{slime-re-evaluate-defvar}
+@c @fcnindex{slime-read-from-minibuffer}
+@c @fcnindex{slime-read-interactive-args}
+@c @fcnindex{slime-read-object}
+@c @fcnindex{slime-read-package-name}
+@c @fcnindex{slime-read-port-and-connect}
+@c @fcnindex{slime-read-swank-port}
+@c @fcnindex{slime-read-symbol-name}
+@c @fcnindex{slime-read-system-name}
+@c @fcnindex{slime-read-test-name}
+@c @fcnindex{slime-reading-p}
+@c @fcnindex{slime-recenter-window}
+@c @fcnindex{slime-recently-visited-buffer}
+@c @fcnindex{slime-recompile-bytecode}
+@c @fcnindex{slime-region-for-defun-at-point}
+@c @fcnindex{slime-reify-old-output}
+@fcnindex{slime-reindent-defun}
+@c @fcnindex{slime-reinitialize-inferior-lisp-p} [internal]
+@c @fcnindex{slime-remove-balanced-comments}
+@c @fcnindex{slime-remove-edits}
+@fcnindex{slime-remove-notes}
+@c @fcnindex{slime-remove-old-overlays}
+@c @fcnindex{slime-remove-presentation-properties}
+@c @fcnindex{slime-repl}
+@c @fcnindex{slime-repl-abort-read}
+@c @fcnindex{slime-repl-add-to-input-history}
+@c @fcnindex{slime-repl-at-prompt-end-p}
+@fcnindex{slime-repl-beginning-of-defun}
+@fcnindex{slime-repl-bol}
+@c @fcnindex{slime-repl-buffer}
+@c @fcnindex{slime-repl-call-with-handler}
+@fcnindex{slime-repl-clear-buffer}
+@fcnindex{slime-repl-clear-output}
+@fcnindex{slime-repl-closing-return}
+@c @fcnindex{slime-repl-current-input}
+@c @fcnindex{slime-repl-delete-current-input}
+@fcnindex{slime-repl-end-of-defun}
+@c @fcnindex{slime-repl-eol}
+@c @fcnindex{slime-repl-eval-string}
+@c @fcnindex{slime-repl-find-prompt}
+@c @fcnindex{slime-repl-grab-old-input}
+@c @fcnindex{slime-repl-grab-old-output}
+@c @fcnindex{slime-repl-history-replace}
+@c @fcnindex{slime-repl-in-input-area-p}
+@c @fcnindex{slime-repl-input-line-beginning-position}
+@c @fcnindex{slime-repl-insert-prompt}
+@c @fcnindex{slime-repl-insert-result}
+@c @fcnindex{slime-repl-kill-input}
+@c @fcnindex{slime-repl-load-history}
+@c @fcnindex{slime-repl-matching-input-regexp}
+@c @fcnindex{slime-repl-merge-histories}
+@c @fcnindex{slime-repl-mode}
+@c @fcnindex{slime-repl-move-output-mark-before-prompt}
+@fcnindex{slime-repl-newline-and-indent}
+@fcnindex{slime-repl-next-input}
+@fcnindex{slime-repl-next-matching-input}
+@fcnindex{slime-repl-next-prompt}
+@c @fcnindex{slime-repl-position-in-history}
+@fcnindex{slime-repl-previous-input}
+@fcnindex{slime-repl-previous-matching-input}
+@fcnindex{slime-repl-previous-prompt}
+@c @fcnindex{slime-repl-read-break}
+@c @fcnindex{slime-repl-read-history}
+@c @fcnindex{slime-repl-read-history-filename}
+@c @fcnindex{slime-repl-read-string}
+@c @fcnindex{slime-repl-recenter-if-needed}
+@c @fcnindex{slime-repl-replace-input}
+@fcnindex{slime-repl-return}
+@c @fcnindex{slime-repl-return-string}
+@c @fcnindex{slime-repl-safe-load-history}
+@c @fcnindex{slime-repl-safe-save-merged-history}
+@c @fcnindex{slime-repl-save-all-histories}
+@c @fcnindex{slime-repl-save-history}
+@c @fcnindex{slime-repl-save-merged-history}
+@c @fcnindex{slime-repl-send-input}
+@c @fcnindex{slime-repl-send-string}
+@fcnindex{slime-repl-set-package}
+@c @fcnindex{slime-repl-show-abort}
+@c @fcnindex{slime-repl-show-maximum-output}
+@c @fcnindex{slime-repl-update-banner}
+@c @fcnindex{slime-reset}
+@c @fcnindex{slime-reset-repl-markers}
+@fcnindex{slime-restart-connection-at-point}
+@fcnindex{slime-restart-inferior-lisp}
+@c @fcnindex{slime-restart-sentinel} [internal]
+@c @fcnindex{slime-run-one-test}
+@c @fcnindex{slime-run-tests}
+@c @fcnindex{slime-run-when-idle}
+@c @fcnindex{slime-safe-encoding-p}
+@c @fcnindex{slime-same-line-p}
+@c @fcnindex{slime-save-some-lisp-buffers}
+@c @fcnindex{slime-scheme-mode-hook}
+@fcnindex{slime-scratch}
+@c @fcnindex{slime-scratch-buffer}
+@c @fcnindex{slime-search-call-site}
+@c @fcnindex{slime-search-method-location}
+@c @fcnindex{slime-search-property-change-fn}
+@c @fcnindex{slime-search-suppressed-forms}
+@c @fcnindex{slime-secret}
+@c @fcnindex{slime-select-connection}
+@fcnindex{slime-selector}
+@c @fcnindex{slime-send}
+@c @fcnindex{slime-send-sigint}
+@c @fcnindex{slime-set-connection-info}
+@c @fcnindex{slime-set-default-directory}
+@c @fcnindex{slime-set-inferior-process}
+@c @fcnindex{slime-set-package}
+@c @fcnindex{slime-set-state}
+@c @fcnindex{slime-set-truncate-lines}
+@c @fcnindex{slime-setup-command-hooks}
+@c @fcnindex{slime-setup-connection}
+@c @fcnindex{slime-setup-first-change-hook}
+@c @fcnindex{slime-severity-face}
+@c @fcnindex{slime-severity-label}
+@c @fcnindex{slime-sexp-at-point}
+@c @fcnindex{slime-sexp-at-point-or-error}
+@c @fcnindex{slime-shared-lisp-mode-hook}
+@c @fcnindex{slime-show-apropos}
+@c @fcnindex{slime-show-buffer-position}
+@c @fcnindex{slime-show-definitions}
+@c @fcnindex{slime-show-description}
+@c @fcnindex{slime-show-last-output}
+@c @fcnindex{slime-show-last-output-region}
+@c @fcnindex{slime-show-note}
+@c @fcnindex{slime-show-note-counts}
+@c @fcnindex{slime-show-source-location}
+@c @fcnindex{slime-show-xref}
+@c @fcnindex{slime-show-xrefs}
+@c @fcnindex{slime-simple-complete-symbol}
+@c @fcnindex{slime-simple-completions}
+@c @fcnindex{slime-sldb-level=}
+@fcnindex{slime-space}
+@c @fcnindex{slime-start-and-load}
+@c @fcnindex{slime-start-lisp}
+@c @fcnindex{slime-start-swank-server}
+@c @fcnindex{slime-swank-port-file}
+@fcnindex{slime-switch-to-output-buffer}
+@c @fcnindex{slime-switch-to-scratch-buffer}
+@c @fcnindex{slime-symbol-at-point}
+@c @fcnindex{slime-symbol-end-pos}
+@c @fcnindex{slime-symbol-name-at-point}
+@c @fcnindex{slime-symbol-start-pos}
+@c @fcnindex{slime-sync}
+@fcnindex{slime-sync-package-and-default-directory}
+@c @fcnindex{slime-sync-to-top-level}
+@fcnindex{slime-temp-buffer-quit}
+@c @fcnindex{slime-temporarily-highlight-note}
+@c @fcnindex{slime-test-expect}
+@c @fcnindex{slime-test-failure}
+@c @fcnindex{slime-test-heading}
+@c @fcnindex{slime-test-message}
+@c @fcnindex{slime-test-should-fail-p}
+@c @fcnindex{slime-thread-attach}
+@c @fcnindex{slime-thread-debug}
+@c @fcnindex{slime-thread-insert}
+@c @fcnindex{slime-thread-kill}
+@c @fcnindex{slime-thread-quit}
+@c @fcnindex{slime-to-feature-keyword}
+@c @fcnindex{slime-to-lisp-filename}
+@fcnindex{slime-toggle-profile-fdefinition}
+@fcnindex{slime-toggle-trace-fdefinition}
+@c @fcnindex{slime-trace-query}
+@c @fcnindex{slime-tree-at-point}
+@c @fcnindex{slime-tree-decoration}
+@c @fcnindex{slime-tree-default-printer}
+@c @fcnindex{slime-tree-delete}
+@c @fcnindex{slime-tree-for-note}
+@c @fcnindex{slime-tree-for-severity}
+@c @fcnindex{slime-tree-indent-item}
+@c @fcnindex{slime-tree-insert}
+@c @fcnindex{slime-tree-insert-decoration}
+@c @fcnindex{slime-tree-insert-list}
+@c @fcnindex{slime-tree-insert-references}
+@c @fcnindex{slime-tree-leaf-p}
+@c @fcnindex{slime-tree-print-with-references}
+@c @fcnindex{slime-tree-toggle}
+@c @fcnindex{slime-typeout-active-p}
+@c @fcnindex{slime-typeout-message}
+@fcnindex{slime-undefine-function}
+@c @fcnindex{slime-underline-color}
+@fcnindex{slime-unprofile-all}
+@fcnindex{slime-untrace-all}
+@c @fcnindex{slime-update-autodoc-cache}
+@fcnindex{slime-update-connection-list}
+@c @fcnindex{slime-update-indentation} ???
+@c @fcnindex{slime-update-modeline-package}
+@c @fcnindex{slime-urge-bytecode-recompile}
+@c @fcnindex{slime-use-sigint-for-interrupt}
+@c @fcnindex{slime-user-first-name}
+@c @fcnindex{slime-visit-source-path}
+@c @fcnindex{slime-wait-condition}
+@fcnindex{slime-who-binds}
+@fcnindex{slime-who-calls}
+@fcnindex{slime-who-macroexpands}
+@fcnindex{slime-who-references}
+@fcnindex{slime-who-sets}
+@fcnindex{slime-who-specializes}
+@c @fcnindex{slime-window-config-fingerprint}
+@c @fcnindex{slime-with-output-end-mark}
+@c @fcnindex{slime-with-rigid-indentation}
+@c @fcnindex{slime-write-string}
+@c @fcnindex{slime-xref}
+@c @fcnindex{slime-xref-buffer}
+@c @fcnindex{slime-xref-cleanup}
+@end table
+
@bye
Modified: trunk/thirdparty/emacs/slime/doc/texinfo-tabulate.awk
===================================================================
--- trunk/thirdparty/emacs/slime/doc/texinfo-tabulate.awk 2006-11-30 14:00:03 UTC (rev 2091)
+++ trunk/thirdparty/emacs/slime/doc/texinfo-tabulate.awk 2006-11-30 16:32:54 UTC (rev 2092)
@@ -3,6 +3,9 @@
# Format input lines into a multi-column texinfo table.
# Note: does not do texinfo-escaping of the input.
+# This code has been placed in the Public Domain. All warranties
+# are disclaimed.
+
BEGIN {
columns = 3;
printf("@multitable @columnfractions");
Modified: trunk/thirdparty/emacs/slime/hyperspec.el
===================================================================
--- trunk/thirdparty/emacs/slime/hyperspec.el 2006-11-30 14:00:03 UTC (rev 2091)
+++ trunk/thirdparty/emacs/slime/hyperspec.el 2006-11-30 16:32:54 UTC (rev 2092)
@@ -60,6 +60,16 @@
(defvar common-lisp-hyperspec-symbols (make-vector 67 0))
+(defun common-lisp-hyperspec-strip-cl-package (name)
+ (if (string-match "^\\([^:]*\\)::?\\([^:]*\\)$" name)
+ (let ((package-name (match-string 1 name))
+ (symbol-name (match-string 2 name)))
+ (if (member (downcase package-name)
+ '("cl" "common-lisp"))
+ symbol-name
+ name))
+ name))
+
(defun common-lisp-hyperspec (symbol-name)
"View the documentation on SYMBOL-NAME from the Common Lisp HyperSpec.
If SYMBOL-NAME has more than one definition, all of them are displayed with
@@ -73,22 +83,29 @@
Visit http://www.lispworks.com/reference/HyperSpec/ for more information.
If you copy the HyperSpec to another location, customize the variable
`common-lisp-hyperspec-root' to point to that location."
- (interactive (list (let ((symbol-at-point (thing-at-point 'symbol)))
- (if (and symbol-at-point
- (intern-soft (downcase symbol-at-point)
+ (interactive (list (let* ((symbol-at-point (thing-at-point 'symbol))
+ (stripped-symbol
+ (and symbol-at-point
+ (downcase
+ (common-lisp-hyperspec-strip-cl-package
+ symbol-at-point)))))
+ (if (and stripped-symbol
+ (intern-soft stripped-symbol
common-lisp-hyperspec-symbols))
- symbol-at-point
+ stripped-symbol
(completing-read
"Look up symbol in Common Lisp HyperSpec: "
common-lisp-hyperspec-symbols #'boundp
- t symbol-at-point
+ t stripped-symbol
'common-lisp-hyperspec-history)))))
(maplist (lambda (entry)
(browse-url (concat common-lisp-hyperspec-root "Body/" (car entry)))
(if (cdr entry)
(sleep-for 1.5)))
- (let ((symbol (intern-soft (downcase symbol-name)
- common-lisp-hyperspec-symbols)))
+ (let ((symbol (intern-soft
+ (common-lisp-hyperspec-strip-cl-package
+ (downcase symbol-name))
+ common-lisp-hyperspec-symbols)))
(if (and symbol (boundp symbol))
(symbol-value symbol)
(error "The symbol `%s' is not defined in Common Lisp"
@@ -1188,6 +1205,10 @@
(pushnew (cadr entry) (symbol-value symbol) :test 'equal)
(set symbol (cdr entry))))))
'(("c" (22 3 1 1)) ("C: Character" (22 3 1 1))
+ ("%" (22 3 1 2)) ("Percent: Newline" (22 3 1 2))
+ ("&" (22 3 1 3)) ("Ampersand: Fresh-line" (22 3 1 3))
+ ("|" (22 3 1 4)) ("Vertical-Bar: Page" (22 3 1 4))
+ ("~" (22 3 1 5)) ("Tilde: Tilde" (22 3 1 5))
("r" (22 3 2 1)) ("R: Radix" (22 3 2 1))
("d" (22 3 2 2)) ("D: Decimal" (22 3 2-2))
("b" (22 3 2 3)) ("B: Binary" (22 3 2 3))
Modified: trunk/thirdparty/emacs/slime/mkdist.sh
===================================================================
--- trunk/thirdparty/emacs/slime/mkdist.sh 2006-11-30 14:00:03 UTC (rev 2091)
+++ trunk/thirdparty/emacs/slime/mkdist.sh 2006-11-30 16:32:54 UTC (rev 2092)
@@ -1,4 +1,8 @@
#!/bin/sh
+
+# This code has been placed in the Public Domain. All warranties
+# are disclaimed.
+
version="1.2"
dist="slime-$version"
Modified: trunk/thirdparty/emacs/slime/nregex.lisp
===================================================================
--- trunk/thirdparty/emacs/slime/nregex.lisp 2006-11-30 14:00:03 UTC (rev 2091)
+++ trunk/thirdparty/emacs/slime/nregex.lisp 2006-11-30 16:32:54 UTC (rev 2092)
@@ -1,13 +1,12 @@
;;;
;;; This code was written by:
;;;
-;;; Lawrence E. Freil <lef(a)nscf.org>
+;;; Lawrence E. Freil <lef(a)freil.com>
;;; National Science Center Foundation
;;; Augusta, Georgia 30909
;;;
-;;; If you modify this code, please comment your modifications
-;;; clearly and inform the author of any improvements so they
-;;; can be incorporated in future releases.
+;;; This program was released into the public domain on 2005-08-31.
+;;; (See the slime-devel mailing list archive for details.)
;;;
;;; nregex.lisp - My 4/8/92 attempt at a Lisp based regular expression
;;; parser.
@@ -26,8 +25,11 @@
(in-package :cl-user)
+;; Renamed to slime-nregex avoid name clashes with other versions of
+;; this file. -- he
+
;;;; CND - 6/3/2001
-(defpackage nregex
+(defpackage slime-nregex
(:use #:common-lisp)
(:export
#:regex
@@ -35,7 +37,7 @@
))
;;;; CND - 6/3/2001
-(in-package :nregex)
+(in-package :slime-nregex)
;;;
;;; First we create a copy of macros to help debug the beast
Modified: trunk/thirdparty/emacs/slime/present.lisp
===================================================================
--- trunk/thirdparty/emacs/slime/present.lisp 2006-11-30 14:00:03 UTC (rev 2091)
+++ trunk/thirdparty/emacs/slime/present.lisp 2006-11-30 16:32:54 UTC (rev 2092)
@@ -38,9 +38,24 @@
(presenting-object-1 ,object ,stream ,continue)
(funcall ,continue)))))
+;;; Get pretty printer patches for SBCL
+#+sbcl
+(eval-when (:compile-toplevel :load-toplevel :execute)
+ (handler-bind ((simple-error
+ (lambda (c)
+ (declare (ignore c))
+ (let ((clobber-it (find-restart 'sb-kernel::clobber-it)))
+ (when clobber-it (invoke-restart clobber-it))))))
+ (sb-ext:without-package-locks
+ (swank-backend::with-debootstrapping
+ (load (make-pathname
+ :name "sbcl-pprint-patch"
+ :type "lisp"
+ :directory (pathname-directory swank-loader:*source-directory*)))))))
+
(let ((last-stream nil)
(last-answer nil))
- (defmethod slime-stream-p (stream)
+ (defun slime-stream-p (stream)
"Check if stream is one of the slime streams, since if it isn't we
don't want to present anything"
(if (eq last-stream stream)
@@ -68,8 +83,12 @@
;; layout.
(slime-stream-p (pretty-print::pretty-stream-target stream))))
#+sbcl
- (and (typep stream 'sb-impl::indenting-stream)
- (slime-stream-p (sb-impl::indenting-stream-stream stream)))
+ (or (and (typep stream 'sb-impl::indenting-stream)
+ (slime-stream-p (sb-impl::indenting-stream-stream stream)))
+ (and (typep stream 'sb-pretty::pretty-stream)
+ (fboundp 'sb-pretty::enqueue-annotation)
+ (not *use-dedicated-output-stream*)
+ (slime-stream-p (sb-pretty::pretty-stream-target stream))))
#+allegro
(and (typep stream 'excl:xp-simple-stream)
(slime-stream-p (excl::stream-output-handle stream)))
@@ -97,8 +116,13 @@
(fboundp 'pp::enqueue-annotation))
(pp::enqueue-annotation stream function arg)
(funcall function arg stream nil)))
-#-(or allegro cmu)
+#+sbcl
(defun write-annotation (stream function arg)
+ (if (typep stream 'sb-pretty::pretty-stream)
+ (sb-pretty::enqueue-annotation stream function arg)
+ (funcall function arg stream nil)))
+#-(or allegro cmu sbcl)
+(defun write-annotation (stream function arg)
(funcall function arg stream nil))
(defstruct presentation-record
@@ -144,6 +168,21 @@
(write-annotation stream #'presentation-end record)))
(funcall continue)))
+(defun make-presentations-result (values)
+ ;; Override a function in swank.lisp, so that
+ ;; nested presentations work in the REPL result.
+ (cond
+ ((null values)
+ '(:values ()))
+ (t
+ ;; Do the output ourselves.
+ (fresh-line)
+ (dolist (o values)
+ (presenting-object o *standard-output*
+ (prin1 o))
+ (terpri))
+ '(:suppress-output))))
+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Example: Tell openmcl and cmucl to always present unreadable objects. try (describe 'class)
Added: trunk/thirdparty/emacs/slime/sbcl-pprint-patch.lisp
===================================================================
--- trunk/thirdparty/emacs/slime/sbcl-pprint-patch.lisp 2006-11-30 14:00:03 UTC (rev 2091)
+++ trunk/thirdparty/emacs/slime/sbcl-pprint-patch.lisp 2006-11-30 16:32:54 UTC (rev 2092)
@@ -0,0 +1,332 @@
+;; Pretty printer patch for SBCL, which adds the "annotations" feature
+;; required for sending presentations through pretty-printing streams.
+;;
+;; The section marked "Changed functions" and the DEFSTRUCT
+;; PRETTY-STREAM are based on SBCL's pprint.lisp.
+;;
+;; Public domain.
+
+(in-package "SB!PRETTY")
+
+(defstruct (annotation (:include queued-op))
+ (handler (constantly nil) :type function)
+ (record))
+
+
+(defstruct (pretty-stream (:include sb!kernel:ansi-stream
+ (out #'pretty-out)
+ (sout #'pretty-sout)
+ (misc #'pretty-misc))
+ (:constructor make-pretty-stream (target))
+ (:copier nil))
+ ;; Where the output is going to finally go.
+ (target (missing-arg) :type stream)
+ ;; Line length we should format to. Cached here so we don't have to keep
+ ;; extracting it from the target stream.
+ (line-length (or *print-right-margin*
+ (sb!impl::line-length target)
+ default-line-length)
+ :type column)
+ ;; A simple string holding all the text that has been output but not yet
+ ;; printed.
+ (buffer (make-string initial-buffer-size) :type (simple-array character (*)))
+ ;; The index into BUFFER where more text should be put.
+ (buffer-fill-pointer 0 :type index)
+ ;; Whenever we output stuff from the buffer, we shift the remaining noise
+ ;; over. This makes it difficult to keep references to locations in
+ ;; the buffer. Therefore, we have to keep track of the total amount of
+ ;; stuff that has been shifted out of the buffer.
+ (buffer-offset 0 :type posn)
+ ;; The column the first character in the buffer will appear in. Normally
+ ;; zero, but if we end up with a very long line with no breaks in it we
+ ;; might have to output part of it. Then this will no longer be zero.
+ (buffer-start-column (or (sb!impl::charpos target) 0) :type column)
+ ;; The line number we are currently on. Used for *PRINT-LINES*
+ ;; abbreviations and to tell when sections have been split across
+ ;; multiple lines.
+ (line-number 0 :type index)
+ ;; the value of *PRINT-LINES* captured at object creation time. We
+ ;; use this, instead of the dynamic *PRINT-LINES*, to avoid
+ ;; weirdness like
+ ;; (let ((*print-lines* 50))
+ ;; (pprint-logical-block ..
+ ;; (dotimes (i 10)
+ ;; (let ((*print-lines* 8))
+ ;; (print (aref possiblybigthings i) prettystream)))))
+ ;; terminating the output of the entire logical blockafter 8 lines.
+ (print-lines *print-lines* :type (or index null) :read-only t)
+ ;; Stack of logical blocks in effect at the buffer start.
+ (blocks (list (make-logical-block)) :type list)
+ ;; Buffer holding the per-line prefix active at the buffer start.
+ ;; Indentation is included in this. The length of this is stored
+ ;; in the logical block stack.
+ (prefix (make-string initial-buffer-size) :type (simple-array character (*)))
+ ;; Buffer holding the total remaining suffix active at the buffer start.
+ ;; The characters are right-justified in the buffer to make it easier
+ ;; to output the buffer. The length is stored in the logical block
+ ;; stack.
+ (suffix (make-string initial-buffer-size) :type (simple-array character (*)))
+ ;; Queue of pending operations. When empty, HEAD=TAIL=NIL. Otherwise,
+ ;; TAIL holds the first (oldest) cons and HEAD holds the last (newest)
+ ;; cons. Adding things to the queue is basically (setf (cdr head) (list
+ ;; new)) and removing them is basically (pop tail) [except that care must
+ ;; be taken to handle the empty queue case correctly.]
+ (queue-tail nil :type list)
+ (queue-head nil :type list)
+ ;; Block-start queue entries in effect at the queue head.
+ (pending-blocks nil :type list)
+ ;; Queue of annotations to the buffer
+ (annotations-tail nil :type list)
+ (annotations-head nil :type list))
+
+
+(defmacro enqueue (stream type &rest args)
+ (let ((constructor (intern (concatenate 'string
+ "MAKE-"
+ (symbol-name type))
+ "SB-PRETTY")))
+ (once-only ((stream stream)
+ (entry `(,constructor :posn
+ (index-posn
+ (pretty-stream-buffer-fill-pointer
+ ,stream)
+ ,stream)
+ ,@args))
+ (op `(list ,entry))
+ (head `(pretty-stream-queue-head ,stream)))
+ `(progn
+ (if ,head
+ (setf (cdr ,head) ,op)
+ (setf (pretty-stream-queue-tail ,stream) ,op))
+ (setf (pretty-stream-queue-head ,stream) ,op)
+ ,entry))))
+
+;;;
+;;; New helper functions
+;;;
+
+(defun enqueue-annotation (stream handler record)
+ (enqueue stream annotation :handler handler
+ :record record))
+
+(defun re-enqueue-annotation (stream annotation)
+ (let* ((annotation-cons (list annotation))
+ (head (pretty-stream-annotations-head stream)))
+ (if head
+ (setf (cdr head) annotation-cons)
+ (setf (pretty-stream-annotations-tail stream) annotation-cons))
+ (setf (pretty-stream-annotations-head stream) annotation-cons)
+ nil))
+
+(defun re-enqueue-annotations (stream end)
+ (loop for tail = (pretty-stream-queue-tail stream) then (cdr tail)
+ while (and tail (not (eql (car tail) end)))
+ when (annotation-p (car tail))
+ do (re-enqueue-annotation stream (car tail))))
+
+(defun dequeue-annotation (stream &key end-posn)
+ (let ((next-annotation (car (pretty-stream-annotations-tail stream))))
+ (when next-annotation
+ (when (or (not end-posn)
+ (<= (annotation-posn next-annotation) end-posn))
+ (pop (pretty-stream-annotations-tail stream))
+ (unless (pretty-stream-annotations-tail stream)
+ (setf (pretty-stream-annotations-head stream) nil))
+ next-annotation))))
+
+(defun invoke-annotation (stream annotation truncatep)
+ (let ((target (pretty-stream-target stream)))
+ (funcall (annotation-handler annotation)
+ (annotation-record annotation)
+ target
+ truncatep)))
+
+(defun output-buffer-with-annotations (stream end)
+ (let ((target (pretty-stream-target stream))
+ (buffer (pretty-stream-buffer stream))
+ (end-posn (index-posn end stream))
+ (start 0))
+ (loop
+ for annotation = (dequeue-annotation stream :end-posn end-posn)
+ while annotation
+ do
+ (let ((annotation-index (posn-index (annotation-posn annotation)
+ stream)))
+ (when (> annotation-index start)
+ (write-string buffer target :start start
+ :end annotation-index)
+ (setf start annotation-index))
+ (invoke-annotation stream annotation nil)))
+ (when (> end start)
+ (write-string buffer target :start start :end end))))
+
+(defun flush-annotations (stream end truncatep)
+ (let ((end-posn (index-posn end stream)))
+ (loop
+ for annotation = (dequeue-annotation stream :end-posn end-posn)
+ while annotation
+ do (invoke-annotation stream annotation truncatep))))
+
+;;;
+;;; Changed functions
+;;;
+
+(defun maybe-output (stream force-newlines-p)
+ (declare (type pretty-stream stream))
+ (let ((tail (pretty-stream-queue-tail stream))
+ (output-anything nil))
+ (loop
+ (unless tail
+ (setf (pretty-stream-queue-head stream) nil)
+ (return))
+ (let ((next (pop tail)))
+ (etypecase next
+ (newline
+ (when (ecase (newline-kind next)
+ ((:literal :mandatory :linear) t)
+ (:miser (misering-p stream))
+ (:fill
+ (or (misering-p stream)
+ (> (pretty-stream-line-number stream)
+ (logical-block-section-start-line
+ (first (pretty-stream-blocks stream))))
+ (ecase (fits-on-line-p stream
+ (newline-section-end next)
+ force-newlines-p)
+ ((t) nil)
+ ((nil) t)
+ (:dont-know
+ (return))))))
+ (setf output-anything t)
+ (output-line stream next)))
+ (indentation
+ (unless (misering-p stream)
+ (set-indentation stream
+ (+ (ecase (indentation-kind next)
+ (:block
+ (logical-block-start-column
+ (car (pretty-stream-blocks stream))))
+ (:current
+ (posn-column
+ (indentation-posn next)
+ stream)))
+ (indentation-amount next)))))
+ (block-start
+ (ecase (fits-on-line-p stream (block-start-section-end next)
+ force-newlines-p)
+ ((t)
+ ;; Just nuke the whole logical block and make it look like one
+ ;; nice long literal. (But don't nuke annotations.)
+ (let ((end (block-start-block-end next)))
+ (expand-tabs stream end)
+ (re-enqueue-annotations stream end)
+ (setf tail (cdr (member end tail)))))
+ ((nil)
+ (really-start-logical-block
+ stream
+ (posn-column (block-start-posn next) stream)
+ (block-start-prefix next)
+ (block-start-suffix next)))
+ (:dont-know
+ (return))))
+ (block-end
+ (really-end-logical-block stream))
+ (tab
+ (expand-tabs stream next))
+ (annotation
+ (re-enqueue-annotation stream next))))
+ (setf (pretty-stream-queue-tail stream) tail))
+ output-anything))
+
+(defun output-line (stream until)
+ (declare (type pretty-stream stream)
+ (type newline until))
+ (let* ((target (pretty-stream-target stream))
+ (buffer (pretty-stream-buffer stream))
+ (kind (newline-kind until))
+ (literal-p (eq kind :literal))
+ (amount-to-consume (posn-index (newline-posn until) stream))
+ (amount-to-print
+ (if literal-p
+ amount-to-consume
+ (let ((last-non-blank
+ (position #\space buffer :end amount-to-consume
+ :from-end t :test #'char/=)))
+ (if last-non-blank
+ (1+ last-non-blank)
+ 0)))))
+ (output-buffer-with-annotations stream amount-to-print)
+ (flush-annotations stream amount-to-consume nil)
+ (let ((line-number (pretty-stream-line-number stream)))
+ (incf line-number)
+ (when (and (not *print-readably*)
+ (pretty-stream-print-lines stream)
+ (>= line-number (pretty-stream-print-lines stream)))
+ (write-string " .." target)
+ (flush-annotations stream
+ (pretty-stream-buffer-fill-pointer stream)
+ t)
+ (let ((suffix-length (logical-block-suffix-length
+ (car (pretty-stream-blocks stream)))))
+ (unless (zerop suffix-length)
+ (let* ((suffix (pretty-stream-suffix stream))
+ (len (length suffix)))
+ (write-string suffix target
+ :start (- len suffix-length)
+ :end len))))
+ (throw 'line-limit-abbreviation-happened t))
+ (setf (pretty-stream-line-number stream) line-number)
+ (write-char #\newline target)
+ (setf (pretty-stream-buffer-start-column stream) 0)
+ (let* ((fill-ptr (pretty-stream-buffer-fill-pointer stream))
+ (block (first (pretty-stream-blocks stream)))
+ (prefix-len
+ (if literal-p
+ (logical-block-per-line-prefix-end block)
+ (logical-block-prefix-length block)))
+ (shift (- amount-to-consume prefix-len))
+ (new-fill-ptr (- fill-ptr shift))
+ (new-buffer buffer)
+ (buffer-length (length buffer)))
+ (when (> new-fill-ptr buffer-length)
+ (setf new-buffer
+ (make-string (max (* buffer-length 2)
+ (+ buffer-length
+ (floor (* (- new-fill-ptr buffer-length)
+ 5)
+ 4)))))
+ (setf (pretty-stream-buffer stream) new-buffer))
+ (replace new-buffer buffer
+ :start1 prefix-len :start2 amount-to-consume :end2 fill-ptr)
+ (replace new-buffer (pretty-stream-prefix stream)
+ :end1 prefix-len)
+ (setf (pretty-stream-buffer-fill-pointer stream) new-fill-ptr)
+ (incf (pretty-stream-buffer-offset stream) shift)
+ (unless literal-p
+ (setf (logical-block-section-column block) prefix-len)
+ (setf (logical-block-section-start-line block) line-number))))))
+
+(defun output-partial-line (stream)
+ (let* ((fill-ptr (pretty-stream-buffer-fill-pointer stream))
+ (tail (pretty-stream-queue-tail stream))
+ (count
+ (if tail
+ (posn-index (queued-op-posn (car tail)) stream)
+ fill-ptr))
+ (new-fill-ptr (- fill-ptr count))
+ (buffer (pretty-stream-buffer stream)))
+ (when (zerop count)
+ (error "Output-partial-line called when nothing can be output."))
+ (output-buffer-with-annotations stream count)
+ (incf (pretty-stream-buffer-start-column stream) count)
+ (replace buffer buffer :end1 new-fill-ptr :start2 count :end2 fill-ptr)
+ (setf (pretty-stream-buffer-fill-pointer stream) new-fill-ptr)
+ (incf (pretty-stream-buffer-offset stream) count)))
+
+(defun force-pretty-output (stream)
+ (maybe-output stream nil)
+ (expand-tabs stream nil)
+ (re-enqueue-annotations stream nil)
+ (output-buffer-with-annotations stream
+ (pretty-stream-buffer-fill-pointer stream)))
+
\ No newline at end of file
Modified: trunk/thirdparty/emacs/slime/slime.el
===================================================================
--- trunk/thirdparty/emacs/slime/slime.el 2006-11-30 14:00:03 UTC (rev 2091)
+++ trunk/thirdparty/emacs/slime/slime.el 2006-11-30 16:32:54 UTC (rev 2092)
@@ -1,8 +1,8 @@
-;;; -*- mode: emacs-lisp; mode: outline-minor; outline-regexp: ";;;;+"; indent-tabs-mode: nil -*-
-;; slime.el -- Superior Lisp Interaction Mode for Emacs
+;;; slime.el -- Superior Lisp Interaction Mode for Emacs
+;;
;;;; License
;; Copyright (C) 2003 Eric Marsden, Luke Gorrie, Helmut Eller
-;; Copyright (C) 2004 Luke Gorrie, Helmut Eller
+;; Copyright (C) 2004,2005,2006 Luke Gorrie, Helmut Eller
;;
;; This program is free software; you can redistribute it and/or
;; modify it under the terms of the GNU General Public License as
@@ -65,22 +65,40 @@
(require 'easymenu)
(defvar slime-use-autodoc-mode nil
- "When non-nil always enabled slime-autodoc-mode in slime-mode.")
+ "When non-nil always enable slime-autodoc-mode in slime-mode.")
-(defun* slime-setup (&key autodoc typeout-frame)
+(defvar slime-use-highlight-edits-mode nil
+ "When non-nil always enable slime-highlight-edits-mode in slime-mode")
+
+(defvar slime-highlight-compiler-notes t
+ "When non-nil highlight buffers with compilation notes, warnings and errors.")
+
+(defun* slime-setup (&key autodoc typeout-frame highlight-edits)
"Setup Emacs so that lisp-mode buffers always use SLIME."
- (add-hook 'lisp-mode-hook 'slime-lisp-mode-hook)
+ (when (member 'lisp-mode slime-lisp-modes)
+ (add-hook 'lisp-mode-hook 'slime-lisp-mode-hook))
+ (when (member 'scheme-mode slime-lisp-modes)
+ (add-hook 'scheme-mode-hook 'slime-scheme-mode-hook))
(when typeout-frame
(add-hook 'slime-connected-hook 'slime-ensure-typeout-frame))
- (setq slime-use-autodoc-mode autodoc))
+ (setq slime-use-autodoc-mode autodoc)
+ (setq slime-use-highlight-edits-mode highlight-edits))
-(defun slime-lisp-mode-hook ()
+(defun slime-shared-lisp-mode-hook ()
(slime-mode 1)
- (set (make-local-variable 'lisp-indent-function)
- 'common-lisp-indent-function)
(when slime-use-autodoc-mode
- (slime-autodoc-mode 1)))
+ (slime-autodoc-mode 1))
+ (when slime-use-highlight-edits-mode
+ (slime-highlight-edits-mode 1)))
+(defun slime-lisp-mode-hook ()
+ (slime-shared-lisp-mode-hook)
+ (set (make-local-variable 'lisp-indent-function)
+ 'common-lisp-indent-function))
+
+(defun slime-scheme-mode-hook ()
+ (slime-shared-lisp-mode-hook))
+
(eval-and-compile
(defvar slime-path
(let ((path (or (locate-library "slime") load-file-name)))
@@ -90,6 +108,22 @@
The default value is automatically computed from the location of the
Emacs Lisp package."))
+(eval-and-compile
+ (defun slime-changelog-date ()
+ "Return the datestring of the latest entry in the ChangeLog file.
+Return nil if the ChangeLog file cannot be found."
+ (let ((changelog (concat slime-path "ChangeLog")))
+ (if (file-exists-p changelog)
+ (with-temp-buffer
+ (insert-file-contents changelog nil 0 100)
+ (goto-char (point-min))
+ (symbol-name (read (current-buffer))))
+ nil))))
+
+(defvar slime-protocol-version nil)
+(setq slime-protocol-version
+ (eval-when-compile (slime-changelog-date)))
+
;;;; Customize groups
;;
@@ -138,14 +172,6 @@
:prefix "slime-"
:group 'slime)
-;; XXX How can we get rid of this? I think only CMUCL needs it.
-;; -luke (17/Jul/2004)
-(defcustom slime-multiprocessing nil
- "Instruct the Lisp system to initialize multiprocessing on startup.
-You may need to enable this in order to use threads with SLIME."
- :type 'boolean
- :group 'slime-lisp)
-
(defcustom slime-backend "swank-loader.lisp"
"The name of the Lisp file that loads the Swank server.
This name is interpreted relative to the directory containing
@@ -158,17 +184,47 @@
:type 'hook
:group 'slime-lisp)
-(defcustom slime-translate-to-lisp-filename-function 'identity
- "Function to use for translating Emacs filenames to Lisp filenames.
-The function recieves a string as argument and should return string.
-No suitable functions are ready-made, you have to write one yourself."
- :type 'function
+(defcustom slime-filename-translations nil
+ "Alist of mappings between machine names and filename
+translation functions. Each element is of the
+form (HOSTNAME-REGEXP TO-LISP FROM-LISP).
+
+HOSTNAME-REGEXP is a regexp which is applied to the connection's
+slime-machine-instance. If HOSTNAME-REGEXP maches then the
+corresponding TO-LISP and FROM-LISP functions will be used to
+translate emacs filenames and lisp filenames.
+
+TO-LISP will be passed the filename of an emacs buffer and must
+return a string which the underlying lisp understandas as a
+pathname. FROM-LISP will be passed a pathname as returned by the
+underlying lisp and must return something that emacs will
+understand as a filename (this string will be passed to
+find-file).
+
+This list will be traversed in order, so multiple matching
+regexps are possible.
+
+Example:
+
+Assuming you run emacs locally and connect to slime running on
+the machine 'soren' and you can connect with the username
+'animaliter':
+
+ (push (list \"^soren$\"
+ (lambda (emacs-filename)
+ (subseq emacs-filename (length \"/ssh:animaliter@soren:\")))
+ (lambda (lisp-filename)
+ (concat \"/ssh:animaliter@soren:\" lisp-filename)))
+ slime-filename-translations)
+
+See also `slime-create-filename-translator'."
+ :type 'list
:group 'slime-lisp)
-(defcustom slime-translate-from-lisp-filename-function 'identity
- "Function to use for translating Lisp filenames to Emacs filenames.
-See also `slime-translate-to-lisp-filename-function'."
- :type 'function
+(defcustom slime-enable-evaluate-in-emacs nil
+ "*If non-nil, the inferior Lisp can evaluate arbitrary forms in Emacs.
+The default is nil, as this feature can be a security risk."
+ :type '(boolean)
:group 'slime-lisp)
;;;;; slime-mode
@@ -182,13 +238,13 @@
"Function to call when edit-definition fails to find the source itself.
The function is called with the definition name, a string, as its argument.
-If you want to fallback on TAGS you can set this to `find-tags' or
+If you want to fallback on TAGS you can set this to `find-tag' or
`slime-edit-definition-with-etags'."
:type 'symbol
:group 'slime-mode-mode
:options '(nil
slime-edit-definition-with-etags
- find-tags))
+ find-tag))
(defcustom slime-compilation-finished-hook 'slime-maybe-list-compiler-notes
"Hook called with a list of compiler notes after a compilation."
@@ -198,18 +254,46 @@
slime-list-compiler-notes
slime-maybe-show-xrefs-for-notes))
+(defcustom slime-goto-first-note-after-compilation nil
+ "When T next-note will always goto to the first note in a
+final, no matter where the point is."
+ :group 'slime-mode
+ :type 'boolean)
+
(defcustom slime-complete-symbol-function 'slime-complete-symbol*
- "Function to perform symbol completion."
+ "*Function to perform symbol completion."
:group 'slime-mode
:type '(choice (const :tag "Simple" slime-simple-complete-symbol)
(const :tag "Compound" slime-complete-symbol*)
(const :tag "Fuzzy" slime-fuzzy-complete-symbol)))
+(defcustom slime-when-complete-filename-expand nil
+ "Use comint-replace-by-expanded-filename instead of comint-dynamic-complete-as-filename to complete file names"
+ :group 'slime-mode
+ :type 'boolean)
+
(defcustom slime-complete-symbol*-fancy nil
"Use information from argument lists for DWIM'ish symbol completion."
:group 'slime-mode
:type 'boolean)
+(defcustom slime-fuzzy-completion-in-place nil
+ "When non-NIL the fuzzy symbol completion is done in place as
+opposed to moving the point to the completion buffer."
+ :group 'slime-mode
+ :type 'boolean)
+
+(defcustom slime-fuzzy-completion-limit 300
+ "Only return and present this many symbols from swank."
+ :group 'slime-mode
+ :type 'integer)
+
+(defcustom slime-fuzzy-completion-time-limit-in-msec 1500
+ "Limit the time spent (given in msec) in swank while gathering comletitions.
+\(NOTE: currently it's rounded up the nearest second)"
+ :group 'slime-mode
+ :type 'integer)
+
(defcustom slime-space-information-p t
"Have the SPC key offer arglist information."
:type 'boolean
@@ -357,6 +441,43 @@
:type '(character)
:group 'slime-repl)
+(defcustom slime-repl-enable-presentations
+ (cond ((and (not (featurep 'xemacs)) (= emacs-major-version 20))
+ ;; mouseable text sucks in Emacs 20
+ nil)
+ (t t))
+ "*Should we enable presentations"
+ :type '(boolean)
+ :group 'slime-repl)
+
+(defcustom slime-repl-only-save-lisp-buffers t
+ "When T we only attempt to save lisp-mode file buffers. When
+ NIL slime will attempt to save all buffers (as per
+ save-some-buffers). This applies to all ASDF related repl
+ shortcuts."
+ :type '(boolean)
+ :group 'slime-repl)
+
+(defcustom slime-repl-return-behaviour :send-if-complete
+ "Keyword specifying how slime-repl-return behaves when the
+ point is on a lisp expression (as opposed to being on a
+ previous output).
+
+Currently only two values are supported:
+
+:send-if-complete - If the current expression is complete, as per
+slime-input-complete-p, it is sent to the underlying lisp,
+otherwise a newline is inserted. The current value of (point) has
+no effect.
+
+:send-only-if-after-complete - If the current expression is complete
+and point is after the expression it is sent, otherwise a newline
+is inserted."
+ :type '(choice (const :tag "Send if complete" :value :send-if-complete)
+ (const :tag "Send only if after complete" :value :send-only-if-after-complete))
+ :group 'slime-repl)
+
+
(defface slime-repl-prompt-face
(if (slime-face-inheritance-possible-p)
'((t (:inherit font-lock-keyword-face)))
@@ -377,13 +498,15 @@
(defface slime-repl-output-mouseover-face
- (if (slime-face-inheritance-possible-p)
- '((t
- (:box
- (:line-width 1 :color "black" :style released-button)
- :inherit
- (slime-repl-inputed-output-face))))
- '((t (:box (:line-width 1 :color "black")))))
+ (if (featurep 'xemacs)
+ '((t (:bold t)))
+ (if (slime-face-inheritance-possible-p)
+ '((t
+ (:box
+ (:line-width 1 :color "black" :style released-button)
+ :inherit
+ (slime-repl-inputed-output-face))))
+ '((t (:box (:line-width 1 :color "black"))))))
"Face for Lisp output in the SLIME REPL, when the mouse hovers over it"
:group 'slime-repl)
@@ -404,10 +527,76 @@
"Face for the result of an evaluation in the SLIME REPL."
:group 'slime-repl)
+(defcustom slime-repl-history-file "~/.slime-history.eld"
+ "File to save the persistent REPL history to."
+ :type 'string
+ :group 'slime-repl)
+
+(defcustom slime-repl-history-size 200
+ "*Maximum number of lines for persistent REPL history."
+ :type 'integer
+ :group 'slime-repl)
+
;;;; Minor modes
+;;;; slime-target-buffer-fuzzy-completions-mode
+;;;; NOTE: this mode has to be able to override key mappings in slime-mode
+
+(defun mimic-key-bindings (from-keymap to-keymap bindings-or-operation operation)
+ "Iterate on BINDINGS-OR-OPERATION. If an element is a symbol then
+try to look it up (as an operation) in FROM-KEYMAP. Non symbols are taken
+as default key bindings when none to be mimiced was found in FROM-KEYMAP.
+Set the resulting list of keys in TO-KEYMAP to OPERATION."
+ (let ((mimic-keys nil)
+ (direct-keys nil))
+ (dolist (key-or-operation bindings-or-operation)
+ (if (symbolp key-or-operation)
+ (setf mimic-keys (append mimic-keys (where-is-internal key-or-operation from-keymap nil t)))
+ (push key-or-operation direct-keys)))
+ (dolist (key (or mimic-keys direct-keys))
+ (define-key to-keymap key operation))))
+
+(defvar slime-target-buffer-fuzzy-completions-map
+ (let* ((map (make-sparse-keymap)))
+ (flet ((remap (keys to)
+ (mimic-key-bindings global-map map keys to)))
+
+ (remap (list 'keyboard-quit (kbd "C-g")) 'slime-fuzzy-abort)
+
+ (remap (list 'slime-fuzzy-indent-and-complete-symbol
+ 'slime-indent-and-complete-symbol
+ (kbd "<tab>"))
+ 'slime-fuzzy-select-or-update-completions)
+ (remap (list 'previous-line (kbd "<up>")) 'slime-fuzzy-prev)
+ (remap (list 'next-line (kbd "<down>")) 'slime-fuzzy-next)
+ (remap (list 'isearch-forward (kbd "C-s"))
+ (lambda ()
+ (interactive)
+ (select-window (get-buffer-window (slime-get-fuzzy-buffer)))
+ (call-interactively 'isearch-forward)))
+
+ ;; some unconditional direct bindings
+ (dolist (key (list (kbd "RET") (kbd "<SPC>") "(" ")" "[" "]"))
+ (define-key map key 'slime-fuzzy-select-and-process-event-in-target-buffer)))
+ map
+ )
+ "Keymap for slime-target-buffer-fuzzy-completions-mode. This will override the key
+bindings in the target buffer temporarily during completion.")
+
+(define-minor-mode slime-fuzzy-target-buffer-completions-mode
+ "This minor mode is intented to override key bindings during fuzzy
+completions in the target buffer. Most of the bindings will do an implicit select
+in the completion window and let the keypress be processed in the target buffer."
+ nil
+ nil
+ slime-target-buffer-fuzzy-completions-map)
+
+(add-to-list 'minor-mode-alist
+ '(slime-fuzzy-target-buffer-completions-mode
+ " Fuzzy Target Buffer Completions"))
+
+
;;;;; slime-mode
-
(define-minor-mode slime-mode
"\\<slime-mode-map>\
SLIME: The Superior Lisp Interaction Mode for Emacs (minor-mode).
@@ -452,7 +641,7 @@
(defun slime-update-modeline-package ()
(ignore-errors
(when (and slime-update-modeline-package
- (eq major-mode 'lisp-mode)
+ (memq major-mode slime-lisp-modes)
slime-mode)
(let ((package (slime-current-package)))
(when package
@@ -526,7 +715,7 @@
"Return t if the region from START to END contains a complete sexp."
(save-excursion
(goto-char start)
- (cond ((looking-at "\\s *['`#]?(")
+ (cond ((looking-at "\\s *['`#]?[(\"]")
(ignore-errors
(save-restriction
(narrow-to-region start end)
@@ -587,6 +776,7 @@
("\C-\M-x" slime-eval-defun)
(":" slime-interactive-eval :prefixed t :sldb t)
("\C-e" slime-interactive-eval :prefixed t :sldb t :inferior t)
+ ("\C-y" slime-call-defun :prefixed t)
("E" slime-edit-value :prefixed t :sldb t :inferior t)
("\C-z" slime-switch-to-output-buffer :prefixed t :sldb t)
("\C-b" slime-interrupt :prefixed t :inferior t :sldb t)
@@ -682,7 +872,7 @@
(define-key slime-doc-map (string key) command)
(unless (equal key ?h) ; But don't bind C-h
(let ((modified (slime-control-modified-char key)))
- (define-key slime-doc-map (string modified) command)))))
+ (define-key slime-doc-map (vector modified) command)))))
;; C-c C-d is the prefix for the doc map.
(slime-define-key "\C-d" slime-doc-map :prefixed t :inferior t)
;; Who-xref
@@ -692,14 +882,14 @@
;; We bind both unmodified and with control.
(define-key slime-who-map (string key) command)
(let ((modified (slime-control-modified-char key)))
- (define-key slime-who-map (string modified) command))))
+ (define-key slime-who-map (vector modified) command))))
;; C-c C-w is the prefix for the who-xref map.
(slime-define-key "\C-w" slime-who-map :prefixed t :inferior t))
(defun slime-control-modified-char (char)
"Return the control-modified version of CHAR."
;; Maybe better to just bitmask it?
- (car (read-from-string (format "?\\C-%c" char))))
+ (read (format "?\\C-%c" char)))
(slime-init-keymaps)
@@ -723,7 +913,8 @@
[ "Eval Region" slime-eval-region ,C ]
[ "Scratch Buffer" slime-scratch ,C ]
[ "Interactive Eval..." slime-interactive-eval ,C ]
- [ "Edit Lisp Value..." slime-edit-value ,C ])
+ [ "Edit Lisp Value..." slime-edit-value ,C ]
+ [ "Call Defun" slime-call-defun ,C ])
("Debugging"
[ "Macroexpand Once..." slime-macroexpand-1 ,C ]
[ "Macroexpand All..." slime-macroexpand-all ,C ]
@@ -774,8 +965,7 @@
[ "Interrupt Command" slime-interrupt ,C ]
[ "Abort Async. Command" slime-quit ,C ]
[ "Sync Package & Directory" slime-sync-package-and-default-directory ,C]
- [ "Set Package in REPL" slime-repl-set-package ,C]
- )))
+ [ "Set Package in REPL" slime-repl-set-package ,C])))
(defvar slime-repl-easy-menu
(let ((C '(slime-connected-p)))
@@ -789,7 +979,8 @@
[ "Goto Previous Prompt " slime-repl-previous-prompt t ]
[ "Goto Next Prompt " slime-repl-next-prompt t ]
[ "Clear Last Output" slime-repl-clear-output t ]
- [ "Clear Buffer " slime-repl-clear-buffer t ])))
+ [ "Clear Buffer " slime-repl-clear-buffer t ]
+ [ "Kill Current Input" slime-repl-kill-input t ])))
(defvar slime-sldb-easy-menu
(let ((C '(slime-connected-p)))
@@ -813,7 +1004,10 @@
("Invoke Restart"
[ "Continue" sldb-continue ,C ]
[ "Abort" sldb-abort ,C ]
- [ "Step" sldb-step ,C ])
+ [ "Step" sldb-step ,C ]
+ [ "Step next" sldb-next ,C ]
+ [ "Step out" sldb-out ,C ]
+ )
"--"
[ "Quit (throw)" sldb-quit ,C ]
[ "Break With Default Debugger" sldb-break-with-default-debugger ,C ])))
@@ -829,6 +1023,8 @@
(defun slime-repl-add-easy-menu ()
(easy-menu-define menubar-slime-repl slime-repl-mode-map
"REPL" slime-repl-easy-menu)
+ (easy-menu-define menubar-slime slime-repl-mode-map
+ "SLIME" slime-easy-menu)
(easy-menu-add slime-repl-easy-menu 'slime-repl-mode-map)))
(add-hook 'sldb-mode-hook
@@ -838,6 +1034,19 @@
(easy-menu-add slime-sldb-easy-menu 'sldb-mode-map)))
+;;;; Emacs compatibility
+
+(or (fboundp 'add-local-hook)
+ (defun add-local-hook (hook function &optional append)
+ (make-local-hook hook)
+ (add-hook hook function append t)))
+
+(or (fboundp 'remove-local-hook)
+ (defun remove-local-hook (hook function)
+ (if (local-variable-p hook (current-buffer))
+ (remove-hook hook function t))))
+
+
;;;; Setup initial `slime-mode' hooks
(make-variable-buffer-local
@@ -849,24 +1058,19 @@
"Execute all functions in `slime-pre-command-actions', then NIL it."
(dolist (undo-fn slime-pre-command-actions)
(ignore-errors (funcall undo-fn)))
- (setq slime-pre-command-actions nil)
- (slime-presentation-command-hook))
+ (setq slime-pre-command-actions nil))
(defun slime-post-command-hook ()
- (when (and slime-mode (slime-connected-p))
- (slime-process-available-input))
(when (null pre-command-hook) ; sometimes this is lost
- (add-hook 'pre-command-hook 'slime-pre-command-hook)))
+ (add-hook 'pre-command-hook 'slime-pre-command-hook)))
(defun slime-setup-command-hooks ()
"Setup a buffer-local `pre-command-hook' to call `slime-pre-command-hook'."
- (make-local-hook 'pre-command-hook)
- (make-local-hook 'post-command-hook)
- (add-hook 'pre-command-hook 'slime-pre-command-hook)
- (add-hook 'post-command-hook 'slime-post-command-hook))
+ (add-local-hook 'pre-command-hook 'slime-pre-command-hook)
+ (add-local-hook 'post-command-hook 'slime-post-command-hook)
+ (when slime-repl-enable-presentations
+ (add-local-hook 'after-change-functions 'slime-after-change-function)))
-(add-hook 'slime-mode-hook 'slime-setup-command-hooks)
-
;;;; Framework'ey bits
;;;
@@ -1025,7 +1229,7 @@
(completing-read prompt (slime-bogus-completion-alist
(slime-eval
`(swank:list-all-package-names t)))
- nil nil initial-value)))
+ nil t initial-value)))
;; Interface
(defun slime-read-symbol-name (prompt &optional query)
@@ -1092,16 +1296,19 @@
"The window config \"fingerprint\" after displaying the buffer."))
;; Interface
-(defun* slime-get-temp-buffer-create (name &key mode noselectp)
+(defun* slime-get-temp-buffer-create (name &key mode noselectp reusep)
"Return a fresh temporary buffer called NAME in MODE.
The buffer also uses the minor-mode `slime-temp-buffer-mode'. Pressing
`q' in the buffer will restore the window configuration to the way it
is when the buffer was created, i.e. when this function was called.
-If NOSELECTP is true then the buffer is shown by `display-buffer',
-otherwise it is shown and selected by `pop-to-buffer'."
+If NOSELECTP is true, then the buffer is shown by `display-buffer',
+otherwise it is shown and selected by `pop-to-buffer'.
+
+If REUSEP is true and a buffer does already exist with name NAME,
+then the buffer will be reused instead of being killed."
(let ((window-config (current-window-configuration)))
- (when (get-buffer name) (kill-buffer name))
+ (when (and (get-buffer name) (not reusep)) (kill-buffer name))
(with-current-buffer (get-buffer-create name)
(when mode (funcall mode))
(slime-temp-buffer-mode 1)
@@ -1114,14 +1321,17 @@
(current-buffer))))
;; Interface
-(defmacro* slime-with-output-to-temp-buffer ((name &optional mode)
+(defmacro* slime-with-output-to-temp-buffer ((name &key mode reusep)
package &rest body)
"Similar to `with-output-to-temp-buffer'.
Also saves the window configuration, and inherits the current
`slime-connection' in a buffer-local variable."
`(let ((connection (slime-connection))
- (standard-output (slime-get-temp-buffer-create ,name :mode ',mode)))
- (prog1 (with-current-buffer standard-output ,@body)
+ (standard-output (slime-get-temp-buffer-create ,name :mode ',mode
+ :reusep ,reusep)))
+ (prog1 (with-current-buffer standard-output
+ ;; set explicitely to NIL in case the buffer got reused. (REUSEP)
+ (let ((buffer-read-only nil)) ,@body))
(with-current-buffer standard-output
(setq slime-buffer-connection connection)
(setq slime-buffer-package ,package)
@@ -1140,12 +1350,15 @@
;; Interface
(defun slime-temp-buffer-quit ()
- "Kill the current buffer and restore the old window configuration.
-See `slime-temp-buffer-dismiss'."
+ "Kill the current (temp) buffer without asking. To restore the
+window configuration without killing the buffer see
+`slime-dismiss-temp-buffer'."
(interactive)
- (let ((buf (current-buffer)))
- (slime-dismiss-temp-buffer)
- (kill-buffer buf)))
+ (let* ((buffer (current-buffer))
+ (window (get-buffer-window buffer)))
+ (kill-buffer buffer)
+ (when window
+ (delete-window window))))
;; Interface
(defun slime-dismiss-temp-buffer ()
@@ -1181,16 +1394,64 @@
(defun slime-to-lisp-filename (filename)
"Translate the string FILENAME to a Lisp filename.
-See `slime-translate-to-lisp-filename-function'."
- (funcall slime-translate-to-lisp-filename-function
- ;; expand-file-name so that Lisp doesn't see ~foo/bar, etc
+See `slime-filename-translations'."
+ (funcall (first (slime-find-filename-translators (slime-machine-instance)))
(expand-file-name filename)))
(defun slime-from-lisp-filename (filename)
"Translate the Lisp filename FILENAME to an Emacs filename.
-See `slime-translate-from-lisp-filename-function'."
- (funcall slime-translate-from-lisp-filename-function filename))
+See `slime-filename-translations'."
+ (funcall (second (slime-find-filename-translators (slime-machine-instance)))
+ filename))
+(defun slime-find-filename-translators (hostname)
+ (cond ((and hostname slime-filename-translations)
+ (or (cdr (assoc-if (lambda (regexp) (string-match regexp hostname))
+ slime-filename-translations))
+ (error "No filename-translations for hostname: %s" hostname)))
+ (t (list #'identity #'identity))))
+
+(defun slime-make-tramp-file-name (username remote-host lisp-filename)
+ "Old (with multi-hops) tramp compatability function"
+ (require 'tramp)
+ (if (boundp 'tramp-multi-methods)
+ (tramp-make-tramp-file-name nil nil
+ username
+ remote-host
+ lisp-filename)
+ (tramp-make-tramp-file-name nil
+ username
+ remote-host
+ lisp-filename)))
+
+(defun* slime-create-filename-translator (&key machine-instance
+ remote-host
+ username)
+ "Creates a three element list suitable for push'ing onto
+slime-filename-translations which uses Tramp to load files on
+hostname using username. MACHINE-INSTANCE is a required
+parameter, REMOTE-HOST defaults to MACHINE-INSTANCE and USERNAME
+defaults to (user-login-name).
+
+MACHINE-INSTANCE is the value returned by slime-machine-instance,
+which is just the value returned by cl:machine-instance on the
+remote lisp. REMOTE-HOST is the fully qualified domain name (or
+just the IP) of the remote machine. USERNAME is the username we
+should login with.
+The functions created here expect your tramp-default-method or
+ tramp-default-method-alist to be setup correctly."
+ (lexical-let ((remote-host (or remote-host machine-instance))
+ (username (or username (user-login-name))))
+ (list (concat "^" machine-instance "$")
+ (lambda (emacs-filename)
+ (tramp-file-name-localname
+ (tramp-dissect-file-name emacs-filename)))
+ `(lambda (lisp-filename)
+ (slime-make-tramp-file-name
+ ,username
+ ,remote-host
+ lisp-filename)))))
+
;;;; Starting SLIME
;;;
@@ -1202,46 +1463,94 @@
(defvar slime-inferior-lisp-program-history '()
"History list of command strings. Used by `slime'.")
-;; XXX: inferior-lisp-program isn't preloaded in XEmacs. maybe we
-;; should use something else.
+;; We no longer load inf-lisp, but we use this variable for backward
+;; compatibility.
(defvar inferior-lisp-program "lisp"
"*Program name for invoking an inferior Lisp with for Inferior Lisp mode.")
-(defun slime (&optional command buffer coding-system)
+(defun slime (&optional command coding-system)
"Start an inferior^_superior Lisp and connect to its Swank server."
- (interactive (list (if current-prefix-arg
- (read-string "Run lisp: " inferior-lisp-program
- 'slime-inferior-lisp-program-history))
- "*inferior-lisp*"
- (if (eq 16 (prefix-numeric-value current-prefix-arg))
- (read-coding-system "set slime-coding-system: "
- slime-net-coding-system))))
- (let ((command (or (slime-find-lisp-implementation command)
- inferior-lisp-program))
- (buffer (or buffer "*inferior-lisp*"))
- (coding-system (or coding-system slime-net-coding-system)))
- (let ((symbolic-lisp-name (slime-symbolic-lisp-name-p command)))
- (slime-check-coding-system coding-system)
- (setq slime-net-coding-system coding-system)
- (when (or (not (slime-bytecode-stale-p))
- (slime-urge-bytecode-recompile))
- (let ((proc (slime-maybe-start-lisp command buffer)))
- (slime-inferior-connect proc nil symbolic-lisp-name)
- (pop-to-buffer (process-buffer proc)))))))
+ (interactive)
+ (apply #'slime-start (slime-read-interactive-args)))
-(defun slime-connect (host port &optional kill-old-p symbolic-lisp-name)
+(defun slime-read-interactive-args ()
+ "Return the list of args which should be passed to `slime-start'.
+
+The rules for selecting the arguments are rather complicated:
+
+- In the most common case, i.e. if there's no prefix-arg in
+ effect and if `slime-lisp-implementations' is nil, use
+ `inferior-lisp-program' as fallback.
+
+- If the table `slime-lisp-implementations' is non-nil use the
+ implementation with name `slime-default-lisp' or if that's nil
+ the first entry in the table.
+
+- If the prefix-arg is `-', prompt for one of the registered
+ lisps.
+
+- If the prefix-arg is positive, read the command to start the
+ process."
+ (let ((table slime-lisp-implementations))
+ (cond ((not current-prefix-arg)
+ (cond (table
+ (slime-lookup-lisp-implementation
+ table (or slime-default-lisp (car (first table)))))
+ (t
+ (destructuring-bind (program &rest args)
+ (split-string inferior-lisp-program)
+ (list :program program :program-args args)))))
+ ((eq current-prefix-arg '-)
+ (let ((key (completing-read
+ "Lisp name: " (mapcar (lambda (x)
+ (list (symbol-name (car x))))
+ table)
+ nil t)))
+ (slime-lookup-lisp-implementation table (intern key))))
+ (t
+ (destructuring-bind (program &rest program-args)
+ (split-string (read-string
+ "Run lisp: " inferior-lisp-program
+ 'slime-inferior-lisp-program-history))
+ (let ((coding-system
+ (if (eq 16 (prefix-numeric-value current-prefix-arg))
+ (read-coding-system "set slime-coding-system: "
+ slime-net-coding-system)
+ slime-net-coding-system)))
+ (list :program program :program-args program-args
+ :coding-system coding-system)))))))
+
+(defun slime-lookup-lisp-implementation (table name)
+ (destructuring-bind (name (prog &rest args) &rest keys) (assoc name table)
+ (list* :name name :program prog :program-args args keys)))
+
+(defun* slime-start (&key (program inferior-lisp-program) program-args
+ (coding-system slime-net-coding-system)
+ (init 'slime-init-command)
+ name
+ (buffer "*inferior-lisp*"))
+ (let ((args (list :program program :program-args program-args :buffer buffer
+ :coding-system coding-system :init init :name name)))
+ (slime-check-coding-system coding-system)
+ (when (or (not (slime-bytecode-stale-p))
+ (slime-urge-bytecode-recompile))
+ (let ((proc (slime-maybe-start-lisp program program-args buffer)))
+ (slime-inferior-connect proc args)
+ (pop-to-buffer (process-buffer proc))))))
+
+(defun slime-connect (host port &optional coding-system)
"Connect to a running Swank server."
- (interactive (list (read-from-minibuffer "Host: " "127.0.0.1")
- (read-from-minibuffer "Port: " "4005" nil t)
- (if (null slime-net-processes)
- t
- (y-or-n-p "Close old connections first? "))))
- (slime-check-coding-system)
- (when kill-old-p (slime-disconnect))
- (message "Connecting to Swank on port %S.." port)
- (let* ((process (slime-net-connect host port))
- (slime-dispatching-connection process))
- (slime-setup-connection process symbolic-lisp-name)))
+ (interactive (list (read-from-minibuffer "Host: " slime-lisp-host)
+ (read-from-minibuffer "Port: " "4005" nil t)))
+ (when (and (interactive-p) slime-net-processes
+ (y-or-n-p "Close old connections first? "))
+ (slime-disconnect))
+ (let ((coding-system (or coding-system slime-net-coding-system)))
+ (slime-check-coding-system coding-system)
+ (message "Connecting to Swank on port %S.." port)
+ (let* ((process (slime-net-connect host port coding-system))
+ (slime-dispatching-connection process))
+ (slime-setup-connection process))))
(defun slime-start-and-load (filename &optional package)
"Start Slime, if needed, load the current file and set the package."
@@ -1342,63 +1651,76 @@
;;; Starting the inferior Lisp and loading Swank:
-(defun slime-maybe-start-lisp (command buffername)
- "Start an inferior lisp. Instruct it to load Swank."
- (cond ((not (comint-check-proc buffername))
- (slime-start-lisp command buffername (slime-init-command)))
- ((y-or-n-p "Create an additional *inferior-lisp*? ")
- (slime-start-lisp command (generate-new-buffer-name buffername)
- (slime-init-command)))
- (t
- (when-let (conn (find (get-buffer-process buffername)
- slime-net-processes
+(defun slime-maybe-start-lisp (program program-args buffer)
+ "Return a new or existing inferior lisp process."
+ (cond ((not (comint-check-proc buffer))
+ (slime-start-lisp program program-args buffer))
+ ((slime-reinitialize-inferior-lisp-p program program-args buffer)
+ (when-let (conn (find (get-buffer-process buffer) slime-net-processes
:key #'slime-inferior-process))
(slime-net-close conn))
- (get-buffer-process buffername))))
+ (get-buffer-process buffer))
+ (t (slime-start-lisp program program-args
+ (generate-new-buffer-name buffer)))))
-(defun slime-init-command ()
- "Return a string to initialize Lisp."
- (let ((swank (slime-to-lisp-filename (if (file-name-absolute-p slime-backend)
- slime-backend
- (concat slime-path slime-backend))))
- (mp (if slime-multiprocessing "(swank:startup-multiprocessing)\n" "")))
- (format "(load %S :verbose t)\n%s" swank mp)))
+(defun slime-reinitialize-inferior-lisp-p (program program-args buffer)
+ (let ((args (slime-inferior-lisp-args (get-buffer-process buffer))))
+ (and (equal (plist-get args :program) program)
+ (equal (plist-get args :program-args) program-args)
+ (not (y-or-n-p "Create an additional *inferior-lisp*? ")))))
-(defun slime-start-lisp (command buffername init-string)
- "Start Lisp with COMMAND in BUFFERNAME and send INIT-STRING to it.
-Return the new process."
- (let ((proc (slime-inferior-lisp command buffername)))
- (when slime-kill-without-query-p
- (process-kill-without-query proc))
- (when init-string
- (comint-send-string proc init-string)
- proc)))
-
-(defun slime-inferior-lisp (command buffername)
+(defun slime-start-lisp (program program-args buffer)
"Does the same as `inferior-lisp' but less ugly.
Return the created process."
- (let ((args (split-string command))) ; XXX consider: cmucl -eval '(+ 1 2)'
- (with-current-buffer (get-buffer-create buffername)
- (comint-mode)
- (comint-exec (current-buffer) "inferior-lisp" (car args) nil (cdr args))
- (lisp-mode-variables t)
- (get-buffer-process (current-buffer)))))
+ (with-current-buffer (get-buffer-create buffer)
+ (comint-mode)
+ (comint-exec (current-buffer) "inferior-lisp" program nil program-args)
+ (lisp-mode-variables t)
+ (let ((proc (get-buffer-process (current-buffer))))
+ (when slime-kill-without-query-p
+ (process-kill-without-query proc))
+ proc)))
-(defun slime-inferior-connect (process &optional retries symbolic-lisp-name)
+(defun slime-inferior-connect (process args)
"Start a Swank server in the inferior Lisp and connect."
(when (file-regular-p (slime-swank-port-file))
(delete-file (slime-swank-port-file)))
- (slime-start-swank-server process)
- (slime-read-port-and-connect process retries symbolic-lisp-name))
+ (slime-start-swank-server process args)
+ (slime-read-port-and-connect process nil))
-(defun slime-start-swank-server (process)
+(defvar slime-inferior-lisp-args nil
+ "A buffer local variable in the inferior proccess.")
+
+(defun slime-start-swank-server (process args)
"Start a Swank server on the inferior lisp."
- (let* ((encoding (slime-coding-system-cl-name slime-net-coding-system))
- (file (slime-to-lisp-filename (slime-swank-port-file))))
- (comint-send-string process
- (format "(swank:start-server %S :external-format %s)\n"
- file encoding))))
+ (destructuring-bind (&key coding-system init &allow-other-keys) args
+ (with-current-buffer (process-buffer process)
+ (make-local-variable 'slime-inferior-lisp-args)
+ (setq slime-inferior-lisp-args args)
+ (let ((str (funcall init (slime-swank-port-file) coding-system)))
+ (goto-char (process-mark process))
+ (insert-before-markers str)
+ (process-send-string process str)))))
+(defun slime-inferior-lisp-args (process)
+ (with-current-buffer (process-buffer process)
+ slime-inferior-lisp-args))
+
+;; XXX load-server & start-server used to be separated. maybe that was better.
+(defun slime-init-command (port-filename coding-system)
+ "Return a string to initialize Lisp."
+ (let ((loader (if (file-name-absolute-p slime-backend)
+ slime-backend
+ (concat slime-path slime-backend)))
+ (encoding (slime-coding-system-cl-name coding-system)))
+ ;; Return a single form to avoid problems with buffered input.
+ (format "%S\n\n"
+ `(progn
+ (load ,loader :verbose t)
+ (funcall (read-from-string "swank:start-server")
+ ,port-filename
+ :coding-system ,encoding)))))
+
(defun slime-swank-port-file ()
"Filename where the SWANK server writes its TCP port number."
(concat (file-name-as-directory
@@ -1407,11 +1729,10 @@
(t "/tmp/")))
(format "slime.%S" (emacs-pid))))
-(defun slime-read-port-and-connect (inferior-process retries &optional symbolic-lisp-name)
+(defun slime-read-port-and-connect (inferior-process retries)
(lexical-let ((process inferior-process)
(retries retries)
- (attempt 0)
- (lisp-name symbolic-lisp-name))
+ (attempt 0))
(labels
;; A small one-state machine to attempt a connection with
;; timer-based retries.
@@ -1427,16 +1748,18 @@
(cancel-timer slime-connect-retry-timer))
(setq slime-connect-retry-timer nil) ; remove old timer
(cond ((file-exists-p (slime-swank-port-file))
- (let ((port (slime-read-swank-port)))
+ (let ((port (slime-read-swank-port))
+ (args (slime-inferior-lisp-args process)))
(delete-file (slime-swank-port-file))
- (let ((c (slime-connect "127.0.0.1" port nil lisp-name)))
+ (let ((c (slime-connect slime-lisp-host port
+ (plist-get args :coding-system))))
(slime-set-inferior-process c process))))
((and retries (zerop retries))
(message "Failed to connect to Swank."))
(t
(when retries (decf retries))
(setq slime-connect-retry-timer
- (run-with-timer 1 nil #'attempt-connection))))))
+ (run-with-timer 0.2 nil #'attempt-connection))))))
(attempt-connection))))
(defun slime-read-swank-port ()
@@ -1508,6 +1831,9 @@
;;; here. They are defined elsewhere by the event-dispatching
;;; functions in this file and in swank.lisp.
+(defvar slime-lisp-host "127.0.0.1"
+ "The default hostname (or IP address) to connect to.")
+
(defvar slime-net-processes nil
"List of processes (sockets) connected to Lisps.")
@@ -1515,25 +1841,6 @@
"List of functions called when a slime network connection closes.
The functions are called with the process as their argument.")
-(defvar slime-net-coding-system
- (find-if (cond ((featurep 'xemacs)
- (if (fboundp 'find-coding-system)
- #'find-coding-system
- (lambda (x) (eq x 'binary))))
- (t #'coding-system-p))
- '(iso-latin-1-unix iso-8859-1-unix binary))
- "*Coding system used for network connections.
-See also `slime-net-valid-coding-systems'.")
-
-(defvar slime-net-valid-coding-systems
- '((iso-latin-1-unix nil :iso-latin-1-unix)
- (iso-8859-1-unix nil :iso-latin-1-unix)
- (binary nil :iso-latin-1-unix)
- (utf-8-unix t :utf-8-unix)
- (emacs-mule-unix t :emacs-mule-unix))
- "A list of valid coding systems.
-Each element is of the form: (NAME MULTIBYTEP CL-NAME)")
-
(defun slime-secret ()
"Finds the magic secret from the user's home directory.
Returns nil if the file doesn't exist or is empty; otherwise the first
@@ -1546,7 +1853,7 @@
(file-error nil)))
;;; Interface
-(defun slime-net-connect (host port)
+(defun slime-net-connect (host port coding-system)
"Establish a connection with a CL."
(let* ((inhibit-quit nil)
(proc (open-network-stream "SLIME Lisp" nil host port))
@@ -1558,9 +1865,8 @@
(when slime-kill-without-query-p
(process-kill-without-query proc))
(when (fboundp 'set-process-coding-system)
- (set-process-coding-system proc
- slime-net-coding-system
- slime-net-coding-system))
+ (slime-check-coding-system coding-system)
+ (set-process-coding-system proc coding-system coding-system))
(when-let (secret (slime-secret))
(slime-net-send secret proc))
proc))
@@ -1569,25 +1875,55 @@
"Make a buffer suitable for a network process."
(let ((buffer (generate-new-buffer name)))
(with-current-buffer buffer
- (when (fboundp 'set-buffer-multibyte)
- (set-buffer-multibyte
- (slime-coding-system-mulibyte-p slime-net-coding-system)))
(buffer-disable-undo))
buffer))
-(defun slime-find-coding-system (&optional coding-system)
- (let* ((coding-system (or coding-system slime-net-coding-system))
- (props (assq coding-system slime-net-valid-coding-systems)))
- (check-coding-system coding-system)
+;;;;; Coding system madness
+
+(defvar slime-net-valid-coding-systems
+ '((iso-latin-1-unix nil "iso-latin-1-unix")
+ (iso-8859-1-unix nil "iso-latin-1-unix")
+ (binary nil "iso-latin-1-unix")
+ (utf-8-unix t "utf-8-unix")
+ (emacs-mule-unix t "emacs-mule-unix")
+ (euc-jp-unix t "euc-jp-unix"))
+ "A list of valid coding systems.
+Each element is of the form: (NAME MULTIBYTEP CL-NAME)")
+
+(defun slime-find-coding-system (name)
+ "Return the coding system for the symbol NAME.
+The result is either an element in `slime-net-valid-coding-systems'
+of nil."
+ (let* ((probe (assq name slime-net-valid-coding-systems)))
+ (if (and probe (if (fboundp 'check-coding-system)
+ (ignore-errors (check-coding-system (car probe)))
+ (eq (car probe) 'binary)))
+ probe)))
+
+(defvar slime-net-coding-system
+ (find-if 'slime-find-coding-system
+ '(iso-latin-1-unix iso-8859-1-unix binary))
+ "*Coding system used for network connections.
+See also `slime-net-valid-coding-systems'.")
+
+(defun slime-check-coding-system (coding-system)
+ "Signal an error if CODING-SYSTEM isn't a valid coding system."
+ (interactive)
+ (let ((props (slime-find-coding-system coding-system)))
(unless props
(error "Invalid slime-net-coding-system: %s. %s"
coding-system (mapcar #'car slime-net-valid-coding-systems)))
- props))
-
-(defun slime-check-coding-system (&optional coding-system)
- (interactive)
- (slime-find-coding-system coding-system))
+ (when (and (second props) (boundp 'default-enable-multibyte-characters))
+ (assert default-enable-multibyte-characters))
+ t))
+(defcustom slime-repl-history-file-coding-system
+ (cond ((slime-find-coding-system 'utf-8-unix) 'utf-8-unix)
+ (t slime-net-coding-system))
+ "*The coding system for the history file."
+ :type 'symbol
+ :group 'slime-repl)
+
(defun slime-coding-system-mulibyte-p (coding-system)
(second (slime-find-coding-system coding-system)))
@@ -1620,12 +1956,18 @@
(and (not (multibyte-string-p string))
(not (slime-coding-system-mulibyte-p coding-system))))))
-(defun slime-net-close (process)
+(defun slime-net-close (process &optional debug)
(setq slime-net-processes (remove process slime-net-processes))
(when (eq process slime-default-connection)
(setq slime-default-connection nil))
- (run-hook-with-args 'slime-net-process-close-hooks process)
- (ignore-errors (kill-buffer (process-buffer process))))
+ (cond (debug
+ (set-process-sentinel process 'ignore)
+ (set-process-filter process 'ignore)
+ (delete-process process))
+ (t
+ (run-hook-with-args 'slime-net-process-close-hooks process)
+ ;; killing the buffer also closes the socket
+ (kill-buffer (process-buffer process)))))
(defun slime-net-sentinel (process message)
(message "Lisp connection closed unexpectedly: %s" message)
@@ -1636,41 +1978,36 @@
;;; complete messages and hands them off to the event dispatcher.
(defun slime-net-filter (process string)
- "Accept output from the socket and input all complete messages."
+ "Accept output from the socket and process all complete messages."
(with-current-buffer (process-buffer process)
- (save-excursion
- (goto-char (point-max))
- (insert string))
- (slime-process-available-input)))
+ (goto-char (point-max))
+ (insert string))
+ (slime-process-available-input process))
-(defun slime-run-when-idle (function)
+(defun slime-run-when-idle (function &rest args)
"Call FUNCTION as soon as Emacs is idle."
- (cond ((featurep 'xemacs)
- (run-at-time itimer-short-interval nil
- (lambda (f) (funcall f)) function))
- (t (run-at-time 0 nil function))))
+ (apply #'run-at-time
+ (if (featurep 'xemacs) itimer-short-interval 0)
+ nil function args))
-(defun slime-process-available-input ()
+(defun slime-process-available-input (process)
"Process all complete messages that have arrived from Lisp."
- (unwind-protect
- (dolist (proc slime-net-processes)
- (with-current-buffer (process-buffer proc)
- (while (slime-net-have-input-p)
- (let ((event (condition-case error
- (slime-net-read)
- (error
- (message "net-read error: %S" error)
- (ding)
- (sleep-for 2)
- (ignore-errors (slime-net-close proc))
- (error "PANIC!")))))
- (save-current-buffer
- (slime-log-event event)
- (slime-dispatch-event event proc))))))
- (dolist (p slime-net-processes)
- (with-current-buffer (process-buffer p)
- (when (slime-net-have-input-p)
- (slime-run-when-idle 'slime-process-available-input))))))
+ (with-current-buffer (process-buffer process)
+ (while (slime-net-have-input-p)
+ (let ((event (condition-case error
+ (slime-net-read)
+ (error
+ (slime-net-close process t)
+ (error "net-read error: %S" error)))))
+ (slime-log-event event)
+ (let ((ok nil))
+ (unwind-protect
+ (save-current-buffer
+ (slime-dispatch-event event process)
+ (setq ok t))
+ (unless ok
+ (slime-run-when-idle
+ 'slime-process-available-input process))))))))
(defun slime-net-have-input-p ()
"Return true if a complete message is available."
@@ -1684,13 +2021,14 @@
(let* ((length (slime-net-decode-length))
(start (+ 6 (point)))
(end (+ start length)))
- (let ((string (buffer-substring start end)))
+ (assert (plusp length))
+ (let ((string (buffer-substring-no-properties start end)))
(prog1 (read string)
(delete-region (point-min) end)))))
(defun slime-net-decode-length ()
"Read a 24-bit hex-encoded integer from buffer."
- (string-to-number (buffer-substring (point) (+ (point) 6)) 16))
+ (string-to-number (buffer-substring-no-properties (point) (+ (point) 6)) 16))
(defun slime-net-encode-length (n)
"Encode an integer into a 24-bit hex string."
@@ -1766,11 +2104,17 @@
Used for all Lisp communication, except when overridden by
`slime-dispatching-connection' or `slime-buffer-connection'.")
+(defun slime-current-connection ()
+ "Return the connection to use for Lisp interaction.
+Return nil if there's no connection."
+ (or slime-dispatching-connection
+ slime-buffer-connection
+ slime-default-connection))
+
(defun slime-connection ()
- "Return the connection to use for Lisp interaction."
- (let ((conn (or slime-dispatching-connection
- slime-buffer-connection
- slime-default-connection)))
+ "Return the connection to use for Lisp interaction.
+Signal an error if there's no connection."
+ (let ((conn (slime-current-connection)))
(cond ((and (not conn) slime-net-processes)
(error "No default connection selected."))
((not conn)
@@ -1871,15 +2215,12 @@
(slime-def-connection-var slime-lisp-implementation-version nil
"The implementation type of the Lisp process.")
-(slime-def-connection-var slime-lisp-implementation-type-name nil
- "The short name for the implementation type of the Lisp process.")
+(slime-def-connection-var slime-lisp-implementation-name nil
+ "The short name for the Lisp implementation.")
(slime-def-connection-var slime-connection-name nil
"The short name for connection.")
-(slime-def-connection-var slime-symbolic-lisp-name nil
- "The symbolic name passed to slime when starting connection.")
-
(slime-def-connection-var slime-inferior-process nil
"The inferior process for the connection if any.")
@@ -1895,14 +2236,14 @@
"The number of SLIME connections made. For generating serial numbers.")
;;; Interface
-(defun slime-setup-connection (process symbolic-lisp-name)
+(defun slime-setup-connection (process)
"Make a connection out of PROCESS."
(let ((slime-dispatching-connection process))
- (slime-init-connection-state process symbolic-lisp-name)
+ (slime-init-connection-state process)
(slime-select-connection process)
process))
-(defun slime-init-connection-state (proc symbolic-lisp-name)
+(defun slime-init-connection-state (proc)
"Initialize connection state in the process-buffer of PROC."
;; To make life simpler for the user: if this is the only open
;; connection then reset the connection counter.
@@ -1911,31 +2252,47 @@
(slime-with-connection-buffer ()
(setq slime-buffer-connection proc))
(setf (slime-connection-number proc) (incf slime-connection-counter))
- (setf (slime-symbolic-lisp-name proc)
- (slime-generate-symbolic-lisp-name symbolic-lisp-name))
- ;; We do our initialization asynchronously. The current function may
- ;; be called from a timer, and if we setup the REPL from a timer
- ;; then it mysteriously uses the wrong keymap for the first command.
+ ;; We do the rest of our initialization asynchronously. The current
+ ;; function may be called from a timer, and if we setup the REPL
+ ;; from a timer then it mysteriously uses the wrong keymap for the
+ ;; first command.
(slime-eval-async '(swank:connection-info)
- (lambda (info)
- (slime-set-connection-info proc info))))
+ (lexical-let ((proc proc))
+ (lambda (info)
+ (slime-set-connection-info proc info)))))
(defun slime-set-connection-info (connection info)
"Initialize CONNECTION with INFO received from Lisp."
- (destructuring-bind (pid type name features style version host) info
- (setf (slime-pid) pid
- (slime-lisp-implementation-type) type
- (slime-lisp-implementation-type-name) name
- (slime-connection-name) (slime-generate-connection-name name)
- (slime-lisp-features) features
- (slime-communication-style) style
- (slime-lisp-implementation-version) version
- (slime-machine-instance) host))
- (setq slime-state-name "") ; FIXME
- (slime-hide-inferior-lisp-buffer)
- (slime-init-output-buffer connection)
- (run-hooks 'slime-connected-hook)
- (message "Connected. %s" (slime-random-words-of-encouragement)))
+ (let ((slime-dispatching-connection connection))
+ (destructuring-bind (&key pid style lisp-implementation machine
+ features package version &allow-other-keys) info
+ (or (equal version slime-protocol-version)
+ (yes-or-no-p "Protocol version mismatch. Continue anyway? ")
+ (slime-net-close connection)
+ (top-level))
+ (setf (slime-pid) pid
+ (slime-communication-style) style
+ (slime-lisp-features) features)
+ (destructuring-bind (&key name prompt) package
+ (setf (slime-lisp-package) name
+ (slime-lisp-package-prompt-string) prompt))
+ (destructuring-bind (&key type name version) lisp-implementation
+ (setf (slime-lisp-implementation-type) type
+ (slime-lisp-implementation-version) version
+ (slime-lisp-implementation-name) name
+ (slime-connection-name) (slime-generate-connection-name name)))
+ (destructuring-bind (&key instance type version) machine
+ (setf (slime-machine-instance) instance)))
+ (setq slime-state-name "") ; FIXME
+ (when-let (p (slime-inferior-process))
+ (when-let (name (plist-get (slime-inferior-lisp-args p) ':name))
+ (unless (string= (slime-lisp-implementation-name) name)
+ (setf (slime-connection-name)
+ (slime-generate-connection-name (symbol-name name))))))
+ (slime-hide-inferior-lisp-buffer)
+ (slime-init-output-buffer connection)
+ (run-hooks 'slime-connected-hook)
+ (message "Connected. %s" (slime-random-words-of-encouragement))))
(defun slime-generate-connection-name (lisp-name)
(loop for i from 1
@@ -1944,15 +2301,6 @@
:key #'slime-connection-name :test #'equal)
finally (return name)))
-(defun slime-generate-symbolic-lisp-name (lisp-name)
- (if lisp-name
- (loop for i from 1
- for name = lisp-name then (format "%s<%d>" lisp-name i)
- while (find name slime-net-processes
- :key #'slime-symbolic-lisp-name :test #'equal)
- finally (return name))))
-
-
(defun slime-connection-close-hook (process)
(when (eq process slime-default-connection)
(when slime-net-processes
@@ -2023,7 +2371,12 @@
"*If true, don't send background requests if Lisp is already busy.")
(defun slime-background-activities-enabled-p ()
- (and (slime-connected-p)
+ (and (or slime-mode
+ (eq major-mode 'sldb-mode)
+ (eq major-mode 'slime-repl-mode))
+ (let ((con (slime-current-connection)))
+ (and con
+ (eq (process-status con) 'open)))
(or (not (slime-busy-p))
(not slime-inhibit-pipelining))))
@@ -2078,8 +2431,8 @@
This is set only in buffers bound to specific packages."))
;;; `slime-rex' is the RPC primitive which is used to implement both
-;;; `slime-eval' and `slime-eval-async'. You can use it directly you
-;;; need to but the others are usually more convenient.
+;;; `slime-eval' and `slime-eval-async'. You can use it directly if
+;;; you need to, but the others are usually more convenient.
(defmacro* slime-rex ((&rest saved-vars)
(sexp &optional
@@ -2098,10 +2451,11 @@
PACKAGE is evaluated and Lisp binds *BUFFER-PACKAGE* to this package.
The default value is (slime-current-package).
-CLAUSES is a list of patterns with same syntax as `destructure-case'.
-The result of the evaluation is dispatched on CLAUSES. The result is
-either a sexp of the form (:ok VALUE) or (:abort). CLAUSES is
-executed asynchronously.
+CLAUSES is a list of patterns with same syntax as
+`destructure-case'. The result of the evaluation of SEXP is
+dispatched on CLAUSES. The result is either a sexp of the
+form (:ok VALUE) or (:abort REASON). CLAUSES is executed
+asynchronously.
Note: don't use backquote syntax for SEXP, because Emacs20 cannot
deal with that."
@@ -2125,32 +2479,42 @@
search for and read an `in-package' form.
The REPL buffer is a special case: it's package is `slime-lisp-package'."
- (or (and (eq major-mode 'slime-repl-mode) (slime-lisp-package))
- slime-buffer-package
- (save-restriction
- (widen)
- (slime-find-buffer-package))))
+ (cond ((eq major-mode 'slime-repl-mode)
+ (slime-lisp-package))
+ (slime-buffer-package)
+ (t (save-restriction
+ (widen)
+ (slime-find-buffer-package)))))
-(defvar slime-find-buffer-package-function nil
- "Function to use instead of `slime-find-buffer-package'.
-The result should be a string. The string will be READ at the Lisp
-side.")
+(defvar slime-find-buffer-package-function 'slime-search-buffer-package
+ "*Function to use for `slime-find-buffer-package'.
+The result should be the package-name (a string)
+or nil if nothing suitable can be found.")
(defun slime-find-buffer-package ()
"Figure out which Lisp package the current buffer is associated with."
- (if slime-find-buffer-package-function
- (funcall slime-find-buffer-package-function)
+ (funcall slime-find-buffer-package-function))
+
+;; When modifing this code consider cases like:
+;; (in-package #.*foo*)
+;; (in-package #:cl)
+;; (in-package :cl)
+;; (in-package "CL")
+;; (in-package |CL|)
+;; (in-package #+ansi-cl :cl #-ansi-cl 'lisp)
+(defun slime-search-buffer-package ()
+ (let ((case-fold-search t)
+ (regexp (concat "^(\\(cl:\\|common-lisp:\\)?in-package\\>[ \n\t\r']*"
+ "\\([^)]+\\)[ \n\t]*)")))
(save-excursion
- (when (let ((case-fold-search t)
- (regexp "^(\\(cl:\\|common-lisp:\\)?in-package\\>"))
- (or (re-search-backward regexp nil t)
- (re-search-forward regexp nil t)))
- (goto-char (match-end 0))
- (skip-chars-forward " \n\t\f\r#'")
- (let ((pkg (ignore-errors (read (current-buffer)))))
- (if pkg (format "%S" pkg)))))))
+ (when (or (re-search-backward regexp nil t)
+ (re-search-forward regexp nil t))
+ (let ((string (match-string-no-properties 2)))
+ (cond ((string-match "^\"" string) (ignore-errors (read string)))
+ ((string-match "^#?:" string) (substring string (match-end 0)))
+ (t string)))))))
-;;; Synchronous requests is implemented in terms of asynchronous
+;;; Synchronous requests are implemented in terms of asynchronous
;;; ones. We make an asynchronous request with a continuation function
;;; that `throw's its result up to a `catch' and then enter a loop of
;;; handling I/O until that happens.
@@ -2161,7 +2525,8 @@
(defun slime-eval (sexp &optional package)
"Evaluate EXPR on the superior Lisp and return the result."
(when (null package) (setq package (slime-current-package)))
- (let* ((tag (gensym "slime-result-"))
+ (let* ((tag (gensym (format "slime-result-%d-"
+ (1+ (slime-continuation-counter)))))
(slime-stack-eval-tags (cons tag slime-stack-eval-tags)))
(apply
#'funcall
@@ -2173,11 +2538,15 @@
(error "tag = %S eval-tags = %S sexp = %S"
tag slime-stack-eval-tags sexp))
(throw tag (list #'identity value)))
- ((:abort)
- (throw tag (list #'error "Synchronous Lisp Evaluation aborted."))))
+ ((:abort &optional reason)
+ (throw tag (list #'error (or reason "Synchronous Lisp Evaluation aborted.")))))
(let ((debug-on-quit t)
- (inhibit-quit nil))
- (while t (accept-process-output nil 0 10000)))))))
+ (inhibit-quit nil)
+ (conn (slime-connection)))
+ (while t
+ (unless (eq (process-status conn) 'open)
+ (error "Lisp connection closed unexpectedly"))
+ (slime-accept-process-output nil 0.01)))))))
(defun slime-eval-async (sexp &optional cont package)
"Evaluate EXPR on the superior Lisp and call CONT with the result."
@@ -2185,8 +2554,8 @@
(sexp (or package (slime-current-package)))
((:ok result)
(when cont (funcall cont result)))
- ((:abort)
- (message "Evaluation aborted."))))
+ ((:abort &optional reason)
+ (message (or reason "Evaluation aborted.")))))
;;; These functions can be handy too:
@@ -2219,7 +2588,7 @@
(when (slime-rex-continuations)
(let ((tag (caar (slime-rex-continuations))))
(while (find tag (slime-rex-continuations) :key #'car)
- (accept-process-output nil 0 100000)))))
+ (slime-accept-process-output nil 0.1)))))
(defun slime-ping ()
"Check that communication works."
@@ -2243,17 +2612,15 @@
(slime-def-connection-var slime-continuation-counter 0
"Continuation serial number counter.")
-(defvar slime-current-output-id nil
- "The id of the current repl output.
-
-This variable is rebound by the :RETURN event handler and used by
-slime-repl-insert-prompt.")
-
(defun slime-dispatch-event (event &optional process)
(let ((slime-dispatching-connection (or process (slime-connection))))
(destructure-case event
- ((:read-output output)
- (slime-output-string output))
+ ((:write-string output)
+ (slime-write-string output))
+ ((:presentation-start id)
+ (slime-mark-presentation-start id))
+ ((:presentation-end id)
+ (slime-mark-presentation-end id))
;;
((:emacs-rex form package thread continuation)
(slime-set-state "|eval...")
@@ -2264,13 +2631,11 @@
(slime-send `(:emacs-rex ,form ,package ,thread ,id))))
((:return value id)
(let ((rec (assq id (slime-rex-continuations))))
- (cond (rec (setf (slime-rex-continuations )
+ (cond (rec (setf (slime-rex-continuations)
(remove rec (slime-rex-continuations)))
(when (null (slime-rex-continuations))
(slime-set-state ""))
- (let ((slime-current-output-id id)) ;; this is not very
- ;; elegant but it avoids changing the protocol
- (funcall (cdr rec) value)))
+ (funcall (cdr rec) value))
(t
(error "Unexpected reply: %S %S" id value)))))
((:debug-activate thread level)
@@ -2279,18 +2644,16 @@
((:debug thread level condition restarts frames conts)
(assert thread)
(sldb-setup thread level condition restarts frames conts))
- ((:debug-return thread level &optional stepping)
+ ((:debug-return thread level stepping)
(assert thread)
(sldb-exit thread level stepping))
((:emacs-interrupt thread)
- (cond ((slime-use-sigint-for-interrupt) (slime-send-sigint))
- (t (slime-send `(:emacs-interrupt ,thread)))))
+ (slime-send `(:emacs-interrupt ,thread)))
((:read-string thread tag)
(assert thread)
(slime-repl-read-string thread tag))
- ((:evaluate-in-emacs string thread tag)
- (assert thread)
- (evaluate-in-emacs (car (read-from-string string)) thread tag))
+ ((:y-or-n-p thread tag question)
+ (slime-y-or-n-p thread tag question))
((:read-aborted thread tag)
(assert thread)
(slime-repl-abort-read thread tag))
@@ -2307,13 +2670,16 @@
((:open-dedicated-output-stream port)
(slime-open-stream-to-lisp port))
((:eval-no-wait fun args)
+ (slime-check-eval-in-emacs-enabled)
(apply (intern fun) args))
- ((:eval thread tag fun args)
- (slime-eval-for-lisp thread tag (intern fun) args))
+ ((:eval thread tag form-string)
+ (slime-eval-for-lisp thread tag form-string))
((:emacs-return thread tag value)
(slime-send `(:emacs-return ,thread ,tag ,value)))
((:ed what)
(slime-ed what))
+ ((:background-message message)
+ (slime-background-message "%s" message))
((:debug-condition thread message)
(assert thread)
(message "%s" message)))))
@@ -2328,11 +2694,9 @@
(setf (slime-rex-continuations) '())
(mapc #'kill-buffer (sldb-buffers)))
-(defconst +slime-sigint+ 2)
-
(defun slime-send-sigint ()
(interactive)
- (signal-process (slime-pid) +slime-sigint+))
+ (signal-process (slime-pid) 'SIGINT))
;;;;; Event logging to *slime-events*
;;;
@@ -2387,6 +2751,9 @@
;;;; Stream output
+(slime-def-connection-var slime-connection-output-buffer nil
+ "The buffer for the REPL. May be nil or a dead buffer.")
+
(defcustom slime-header-line-p t
"If non-nil, display a header line in Slime buffers."
:type 'boolean
@@ -2415,14 +2782,18 @@
(defun slime-output-buffer (&optional noprompt)
"Return the output buffer, create it if necessary."
- (or (slime-repl-buffer)
- (let ((connection (slime-connection)))
- (with-current-buffer (slime-repl-buffer t)
- (slime-repl-mode)
- (setq slime-buffer-connection connection)
- (slime-reset-repl-markers)
- (unless noprompt (slime-repl-insert-prompt "" 0))
- (current-buffer)))))
+ (let ((buffer (slime-connection-output-buffer)))
+ (or (if (buffer-live-p buffer) buffer)
+ (setf (slime-connection-output-buffer)
+ (let ((connection (slime-connection)))
+ (with-current-buffer (slime-repl-buffer t connection)
+ (unless (eq major-mode 'slime-repl-mode)
+ (slime-repl-mode))
+ (setq slime-buffer-connection connection)
+ (slime-reset-repl-markers)
+ (unless noprompt
+ (slime-repl-insert-prompt '(:suppress-output) 0))
+ (current-buffer)))))))
(defun slime-repl-update-banner ()
(let* ((banner (format "%s Port: %s Pid: %s"
@@ -2443,26 +2814,14 @@
(animate-string (format "; SLIME %s" (or (slime-changelog-date)
"- ChangeLog file not found"))
0 0))
- (slime-repl-insert-prompt (if use-header-p "" (concat "; " banner)))))
+ (slime-repl-insert-prompt (cond (use-header-p `(:suppress-output))
+ (t `(:values (,(concat "; " banner))))))))
-(defun slime-changelog-date ()
- "Return the datestring of the latest entry in the ChangeLog file.
-Return nil if the ChangeLog file cannot be found."
- (let ((changelog (concat slime-path "ChangeLog")))
- (if (file-exists-p changelog)
- (with-temp-buffer
- (insert-file-contents changelog nil 0 100)
- (goto-char (point-min))
- (symbol-name (read (current-buffer))))
- nil)))
-
(defun slime-init-output-buffer (connection)
(with-current-buffer (slime-output-buffer t)
- (setq slime-buffer-connection connection)
- ;; set the directory stack
- (setq slime-repl-directory-stack
- (list (expand-file-name default-directory)))
- (setq slime-repl-package-stack (list (slime-lisp-package)))
+ (setq slime-buffer-connection connection
+ slime-repl-directory-stack '()
+ slime-repl-package-stack '())
(slime-repl-update-banner)))
(defvar slime-show-last-output-function
@@ -2482,14 +2841,10 @@
(display-buffer (current-buffer)))
(when (eobp)
(slime-repl-show-maximum-output t)))
-
-(defun slime-flush-output ()
- (while (accept-process-output nil 0 20)))
(defun slime-show-last-output ()
"Show the output from the last Lisp evaluation."
(with-current-buffer (slime-output-buffer)
- (slime-flush-output)
(let ((start slime-output-start)
(end slime-output-end))
(funcall slime-show-last-output-function start end))))
@@ -2526,27 +2881,184 @@
(> (- slime-output-end slime-output-start) 1000)))))
(defun slime-output-filter (process string)
- (when (and (slime-connected-p)
- (plusp (length string)))
- (with-current-buffer (process-buffer process)
- (slime-output-string string))))
+ (with-current-buffer (process-buffer process)
+ (when (and (plusp (length string))
+ (eq (process-status slime-buffer-connection) 'open))
+ (slime-write-string string))))
+;; FIXME: This conditional is not right - just used because the code
+;; here does not work in XEmacs.
+(when slime-repl-enable-presentations
+ (when (boundp 'text-property-default-nonsticky)
+ (pushnew '(slime-repl-presentation . t) text-property-default-nonsticky
+ :test 'equal)
+ (pushnew '(slime-repl-result-face . t) text-property-default-nonsticky
+ :test 'equal)))
+
+(make-variable-buffer-local
+ (defvar slime-presentation-start-to-point (make-hash-table)))
+
+(defun slime-mark-presentation-start (id)
+ (setf (gethash id slime-presentation-start-to-point)
+ (with-current-buffer (slime-output-buffer)
+ (marker-position (symbol-value 'slime-output-end)))))
+
+(defun slime-mark-presentation-start-handler (process string)
+ (if (and string (string-match "<\\([-0-9]+\\)" string))
+ (let* ((match (substring string (match-beginning 1) (match-end 1)))
+ (id (car (read-from-string match))))
+ (slime-mark-presentation-start id))))
+
+(defun slime-mark-presentation-end (id)
+ (let ((start (gethash id slime-presentation-start-to-point)))
+ (remhash id slime-presentation-start-to-point)
+ (when start
+ (with-current-buffer (slime-output-buffer)
+ (slime-add-presentation-properties start (symbol-value 'slime-output-end)
+ id nil)))))
+
+(defun slime-mark-presentation-end-handler (process string)
+ (if (and string (string-match ">\\([-0-9]+\\)" string))
+ (let* ((match (substring string (match-beginning 1) (match-end 1)))
+ (id (car (read-from-string match))))
+ (slime-mark-presentation-end id))))
+
+(defstruct slime-presentation text id)
+
+(defvar slime-presentation-syntax-table
+ (let ((table (copy-syntax-table lisp-mode-syntax-table)))
+ ;; We give < and > parenthesis syntax, so that #< ... > is treated
+ ;; as a balanced expression. This allows to use C-M-k, C-M-SPC,
+ ;; etc. to deal with a whole presentation. (For Lisp mode, this
+ ;; is not desirable, since we do not wish to get a mismatched
+ ;; paren highlighted everytime we type < or >.)
+ (modify-syntax-entry ?< "(>" table)
+ (modify-syntax-entry ?> ")<" table)
+ table)
+ "Syntax table for presentations.")
+
+(defun slime-add-presentation-properties (start end id result-p)
+ "Make the text between START and END a presentation with ID.
+RESULT-P decides whether a face for a return value or output text is used."
+ (let* ((text (buffer-substring-no-properties start end))
+ (presentation (make-slime-presentation :text text :id id)))
+ (let ((inhibit-modification-hooks t))
+ (add-text-properties start end
+ `(modification-hooks (slime-after-change-function)
+ insert-in-front-hooks (slime-after-change-function)
+ insert-behind-hooks (slime-after-change-function)
+ syntax-table ,slime-presentation-syntax-table
+ rear-nonsticky t))
+ ;; Use the presentation as the key of a text property
+ (case (- end start)
+ (0)
+ (1
+ (add-text-properties start end
+ `(slime-repl-presentation ,presentation
+ ,presentation :start-and-end)))
+ (t
+ (add-text-properties start (1+ start)
+ `(slime-repl-presentation ,presentation
+ ,presentation :start))
+ (when (> (- end start) 2)
+ (add-text-properties (1+ start) (1- end)
+ `(,presentation :interior)))
+ (add-text-properties (1- end) end
+ `(slime-repl-presentation ,presentation
+ ,presentation :end))))
+ ;; Also put an overlay for the face and the mouse-face. This enables
+ ;; highlighting of nested presentations. However, overlays get lost
+ ;; when we copy a presentation; their removal is also not undoable.
+ ;; In these cases the mouse-face text properties need to take over ---
+ ;; but they do not give nested highlighting.
+ (slime-ensure-presentation-overlay start end presentation))))
+
+(defun slime-ensure-presentation-overlay (start end presentation)
+ (unless (find presentation (overlays-at start)
+ :key (lambda (overlay)
+ (overlay-get overlay 'slime-repl-presentation)))
+ (let ((overlay (make-overlay start end (current-buffer) t nil)))
+ (overlay-put overlay 'slime-repl-presentation presentation)
+ (overlay-put overlay 'mouse-face 'slime-repl-output-mouseover-face)
+ (overlay-put overlay 'help-echo
+ (if (eq major-mode 'slime-repl-mode)
+ "mouse-2: copy to input; mouse-3: menu"
+ "mouse-2: inspect; mouse-3: menu"))
+ (overlay-put overlay 'face 'slime-repl-inputed-output-face)
+ (overlay-put overlay 'keymap slime-presentation-map))))
+
+(defun slime-remove-presentation-properties (from to presentation)
+ (let ((inhibit-read-only t))
+ (remove-text-properties from to
+ `(,presentation t syntax-table t rear-nonsticky t))
+ (when (eq (get-text-property from 'slime-repl-presentation) presentation)
+ (remove-text-properties from (1+ from) `(slime-repl-presentation t)))
+ (when (eq (get-text-property (1- to) 'slime-repl-presentation) presentation)
+ (remove-text-properties (1- to) to `(slime-repl-presentation t)))
+ (dolist (overlay (overlays-at from))
+ (when (eq (overlay-get overlay 'slime-repl-presentation) presentation)
+ (delete-overlay overlay)))))
+
+(defun slime-insert-presentation (string output-id)
+ (cond ((not slime-repl-enable-presentations)
+ (insert string))
+ (t
+ (let ((start (point)))
+ (insert string)
+ (slime-add-presentation-properties start (point) output-id t)))))
+
(defun slime-open-stream-to-lisp (port)
(let ((stream (open-network-stream "*lisp-output-stream*"
(slime-with-connection-buffer ()
(current-buffer))
- "127.0.0.1" port)))
+ slime-lisp-host port)))
(when slime-kill-without-query-p
(process-kill-without-query stream))
(set-process-filter stream 'slime-output-filter)
- (set-process-coding-system stream
- slime-net-coding-system
- slime-net-coding-system)
+ (when slime-repl-enable-presentations
+ (require 'bridge)
+ (defun bridge-insert (process output)
+ (slime-output-filter process (or output "")))
+ (install-bridge)
+ (setq bridge-destination-insert nil)
+ (setq bridge-source-insert nil)
+ (setq bridge-handlers
+ (list* '("<" . slime-mark-presentation-start-handler)
+ '(">" . slime-mark-presentation-end-handler)
+ bridge-handlers)))
+ (let ((pcs (process-coding-system (slime-current-connection))))
+ (set-process-coding-system stream (car pcs) (cdr pcs)))
(when-let (secret (slime-secret))
(slime-net-send secret stream))
stream))
-(defun slime-output-string (string)
+(defun slime-io-speed-test (&optional profile)
+ "A simple minded benchmark for stream performance.
+If a prefix argument is given, instrument the slime package for
+profiling before running the benchmark."
+ (interactive "P")
+ (eval-and-compile
+ (require 'elp))
+ (elp-reset-all)
+ (elp-restore-all)
+ (load "slime.el")
+ ;;(byte-compile-file "slime-net.el" t)
+ ;;(setq slime-log-events nil)
+ (setq slime-enable-evaluate-in-emacs t)
+ ;;(setq slime-repl-enable-presentations nil)
+ (when profile
+ (elp-instrument-package "slime-"))
+ (kill-buffer (slime-output-buffer))
+ ;;(display-buffer (slime-output-buffer))
+ (delete-other-windows)
+ (sit-for 0)
+ (slime-repl-send-string "(swank:io-speed-test 5000 1)")
+ (let ((proc (slime-inferior-process)))
+ (when proc
+ (switch-to-buffer (process-buffer proc))
+ (goto-char (point-max)))))
+
+(defun slime-write-string (string)
(with-current-buffer (slime-output-buffer)
(slime-with-output-end-mark
(slime-propertize-region '(face slime-repl-output-face)
@@ -2634,7 +3146,7 @@
(defvar slime-repl-input-history '()
"History list of strings read from the REPL buffer.")
- (defvar slime-repl-input-history-position 0
+ (defvar slime-repl-input-history-position -1
"Newer items have smaller indices.")
(defvar slime-repl-prompt-start-mark)
@@ -2651,9 +3163,7 @@
(defun slime-repl-buffer (&optional create connection)
"Get the REPL buffer for the current connection; optionally create."
(funcall (if create #'get-buffer-create #'get-buffer)
- (format "*slime-repl %s*"
- (or (slime-symbolic-lisp-name connection)
- (slime-connection-name connection)))))
+ (format "*slime-repl %s*" (slime-connection-name connection))))
(defun slime-repl-mode ()
"Major mode for interacting with a superior Lisp.
@@ -2670,94 +3180,326 @@
(setq slime-current-thread :repl-thread)
(set (make-local-variable 'scroll-conservatively) 20)
(set (make-local-variable 'scroll-margin) 0)
+ (slime-repl-safe-load-history)
+ (add-local-hook 'kill-buffer-hook 'slime-repl-safe-save-merged-history)
+ (add-hook 'kill-emacs-hook 'slime-repl-save-all-histories)
(slime-setup-command-hooks)
+ (when slime-use-autodoc-mode
+ (slime-autodoc-mode 1))
+ (when slime-repl-enable-presentations
+ ;; Respect the syntax text properties of presentations.
+ (set (make-local-variable 'parse-sexp-lookup-properties) t))
(run-hooks 'slime-repl-mode-hook))
-;; alanr
-(defun slime-presentation-command-hook ()
- (let* ((props-here (text-properties-at (point)))
- (props-before (and (not (= (point) (point-min))) (text-properties-at (1- (point)))))
- (inside (and (getf props-here 'slime-repl-old-output)))
- (at-beginning (and inside (not (getf props-before 'slime-repl-old-output))))
- (at-end (and (or (= (point) (point-max)) (not (getf props-here 'slime-repl-old-output)))
- (getf props-before 'slime-repl-old-output)))
- (start (cond (at-beginning (point))
- (inside (previous-single-property-change (point) 'slime-repl-old-output))
- (at-end (previous-single-property-change (1- (point)) 'slime-repl-old-output))))
- (end (cond (at-beginning (or (next-single-property-change (point) 'slime-repl-old-output) (point-max)))
- (inside (or (next-single-property-change (point) 'slime-repl-old-output) (point-max)))
- (at-end (point)))))
- ; (setq message (format "%s %s %s %s %s" at-beginning inside at-end start end))
- (when (and (or inside at-end) start end (> end start))
- (let ((kind (get this-command 'action-type)))
- ; (message (format "%s %s %s %s" at-beginning inside at-end kind))
- (cond ((and (eq kind 'inserts) inside (not at-beginning))
- (setq this-command 'ignore-event))
- ((and (eq kind 'deletes-forward) inside (not at-end))
- (kill-region start end)
- (setq this-command 'ignore-event))
- ((and (eq kind 'deletes-backward) (or inside at-end) (not at-beginning))
- (kill-region start end)
- (setq this-command 'ignore-event))))))
- )
+(defun slime-presentation-whole-p (presentation start end &optional object)
+ (let ((object (or object (current-buffer))))
+ (string= (etypecase object
+ (buffer (with-current-buffer object
+ (buffer-substring-no-properties start end)))
+ (string (substring-no-properties object start end)))
+ (slime-presentation-text presentation))))
-(defun slime-presentation-post-command-hook ()
- (when (null pre-command-hook)
- (message "Lost the pre-command-hook. Putting it back!") ; can't seem to prevent this losing, even when trying to catch error
- (add-hook 'pre-command-hook 'slime-pre-command-hook)
- (add-hook 'pre-command-hook 'slime-presentation-command-hook)))
+(defun slime-presentations-around-point (point &optional object)
+ (let ((object (or object (current-buffer))))
+ (loop for (key value . rest) on (text-properties-at point object) by 'cddr
+ when (slime-presentation-p key)
+ collect key)))
-(defun slime-copy-presentation-at-point (event)
+(defun slime-presentation-start-p (tag)
+ (memq tag '(:start :start-and-end)))
+
+(defun slime-presentation-stop-p (tag)
+ (memq tag '(:end :start-and-end)))
+
+(defun* slime-presentation-start (point presentation
+ &optional (object (current-buffer)))
+ "Find start of `presentation' at `point' in `object'.
+Return buffer index and whether a start-tag was found."
+ (let* ((this-presentation (get-text-property point presentation object)))
+ (while (not (slime-presentation-start-p this-presentation))
+ (let ((change-point (previous-single-property-change
+ point presentation object)))
+ (unless change-point
+ (return-from slime-presentation-start
+ (values (etypecase object
+ (buffer (with-current-buffer object 1))
+ (string 0))
+ nil)))
+ (setq this-presentation (get-text-property change-point
+ presentation object))
+ (unless this-presentation
+ (return-from slime-presentation-start
+ (values point nil)))
+ (setq point change-point)))
+ (values point t)))
+
+(defun* slime-presentation-end (point presentation
+ &optional (object (current-buffer)))
+ "Find end of presentation at `point' in `object'. Return buffer
+index (after last character of the presentation) and whether an
+end-tag was found."
+ (let* ((this-presentation (get-text-property point presentation object)))
+ (while (not (slime-presentation-stop-p this-presentation))
+ (let ((change-point (next-single-property-change
+ point presentation object)))
+ (unless change-point
+ (return-from slime-presentation-end
+ (values (etypecase object
+ (buffer (with-current-buffer object (point-max)))
+ (string (length object)))
+ nil)))
+ (setq point change-point)
+ (setq this-presentation (get-text-property point
+ presentation object))))
+ (if this-presentation
+ (let ((after-end (next-single-property-change point
+ presentation object)))
+ (if (not after-end)
+ (values (etypecase object
+ (buffer (with-current-buffer object (point-max)))
+ (string (length object)))
+ t)
+ (values after-end t)))
+ (values point nil))))
+
+(defun* slime-presentation-bounds (point presentation
+ &optional (object (current-buffer)))
+ "Return start index and end index of `presentation' around `point'
+in `object', and whether the presentation is complete."
+ (multiple-value-bind (start good-start)
+ (slime-presentation-start point presentation object)
+ (multiple-value-bind (end good-end)
+ (slime-presentation-end point presentation object)
+ (values start end
+ (and good-start good-end
+ (slime-presentation-whole-p presentation
+ start end object))))))
+
+(defun slime-presentation-around-point (point &optional object)
+ "Return presentation, start index, end index, and whether the
+presentation is complete."
+ (let ((object (or object (current-buffer)))
+ (innermost-presentation nil)
+ (innermost-start 0)
+ (innermost-end most-positive-fixnum))
+ (dolist (presentation (slime-presentations-around-point point object))
+ (multiple-value-bind (start end whole-p)
+ (slime-presentation-bounds point presentation object)
+ (when whole-p
+ (when (< (- end start) (- innermost-end innermost-start))
+ (setq innermost-start start
+ innermost-end end
+ innermost-presentation presentation)))))
+ (values innermost-presentation
+ innermost-start innermost-end)))
+
+(defun slime-presentation-around-or-before-point (point &optional object)
+ (let ((object (or object (current-buffer))))
+ (multiple-value-bind (presentation start end whole-p)
+ (slime-presentation-around-point point object)
+ (if presentation
+ (values presentation start end whole-p)
+ (slime-presentation-around-point (1- point) object)))))
+
+(defun* slime-for-each-presentation-in-region (from to function &optional (object (current-buffer)))
+ "Call `function' with arguments `presentation', `start', `end',
+`whole-p' for every presentation in the region `from'--`to' in the
+string or buffer `object'."
+ (flet ((handle-presentation (presentation point)
+ (multiple-value-bind (start end whole-p)
+ (slime-presentation-bounds point presentation object)
+ (funcall function presentation start end whole-p))))
+ ;; Handle presentations active at `from'.
+ (dolist (presentation (slime-presentations-around-point from object))
+ (handle-presentation presentation from))
+ ;; Use the `slime-repl-presentation' property to search for new presentations.
+ (let ((point from))
+ (while (< point to)
+ (setq point (next-single-property-change point 'slime-repl-presentation object to))
+ (let* ((presentation (get-text-property point 'slime-repl-presentation object))
+ (status (get-text-property point presentation object)))
+ (when (slime-presentation-start-p status)
+ (handle-presentation presentation point)))))))
+
+;; XEmacs compatibility hack, from message by Stephen J. Turnbull on
+;; xemacs-beta(a)xemacs.org of 18 Mar 2002
+(unless (boundp 'undo-in-progress)
+ (defvar undo-in-progress nil
+ "Placeholder defvar for XEmacs compatibility from SLIME.")
+ (defadvice undo-more (around slime activate)
+ (let ((undo-in-progress t)) ad-do-it)))
+
+(defun slime-after-change-function (start end &rest ignore)
+ "Check all presentations within and adjacent to the change.
+When a presentation has been altered, change it to plain text."
+ (let ((inhibit-modification-hooks t))
+ (let ((real-start (max 1 (1- start)))
+ (real-end (min (1+ (buffer-size)) (1+ end)))
+ (any-change nil))
+ ;; positions around the change
+ (slime-for-each-presentation-in-region
+ real-start real-end
+ (lambda (presentation from to whole-p)
+ (cond
+ (whole-p
+ (slime-ensure-presentation-overlay from to presentation))
+ ((not undo-in-progress)
+ (slime-remove-presentation-properties from to
+ presentation)
+ (setq any-change t)))))
+ (when any-change
+ (undo-boundary)))))
+
+(defun slime-presentation-around-click (event)
+ "Return the presentation around the position of the mouse-click EVENT.
+If there is no presentation, signal an error.
+Also return the start position, end position, and buffer of the presentation."
+ (when (and (featurep 'xemacs) (not (button-press-event-p event)))
+ (error "Command must be bound to a button-press-event"))
+ (let ((point (if (featurep 'xemacs) (event-point event) (posn-point (event-end event))))
+ (window (if (featurep 'xemacs) (event-window event) (caadr event))))
+ (with-current-buffer (window-buffer window)
+ (multiple-value-bind (presentation start end)
+ (slime-presentation-around-point point)
+ (unless presentation
+ (error "No presentation at click"))
+ (values presentation start end (current-buffer))))))
+
+(defun slime-copy-or-inspect-presentation-at-mouse (event)
+ (interactive "e") ; no "@" -- we don't want to select the clicked-at window
+ (multiple-value-bind (presentation start end buffer)
+ (slime-presentation-around-click event)
+ (if (with-current-buffer buffer
+ (eq major-mode 'slime-repl-mode))
+ (slime-copy-presentation-at-mouse event)
+ (slime-inspect-presentation-at-mouse event))))
+
+(defun slime-inspect-presentation-at-mouse (event)
(interactive "e")
- (let* ((point (posn-point (event-end event)))
- (what (get-text-property point 'slime-repl-old-output))
- (start (previous-single-property-change point 'slime-repl-old-output))
- (end (or (next-single-property-change point 'slime-repl-old-output) (point-max))))
- (when (not (string-match "\\s-" (buffer-substring (1- (point)) (point))))
- (insert " "))
- (slime-propertize-region '(face slime-repl-inputed-output-face)
- (insert (buffer-substring start end)))
- (when (and (not (eolp)) (not (looking-at "\\s-")))
- (insert " "))))
+ (multiple-value-bind (presentation start end buffer)
+ (slime-presentation-around-click event)
+ (let ((reset-p
+ (with-current-buffer buffer
+ (not (eq major-mode 'slime-inspector-mode)))))
+ (slime-inspect (slime-presentation-expression presentation)
+ (not reset-p)))))
-(put 'self-insert-command 'action-type 'inserts)
-(put 'self-insert-command-1 'action-type 'inserts)
-(put 'yank 'action-type 'inserts)
-(put 'kill-word 'action-type 'deletes-forward)
-(put 'delete-char 'action-type 'deletes-forward)
-(put 'kill-sexp 'action-type 'deletes-forward)
-(put 'backward-kill-sexp 'action-type 'deletes-backward)
-(put 'backward-delete-char 'action-type 'deletes-backward)
-(put 'backward-kill-word 'action-type 'deletes-backward)
-(put 'backward-delete-char-untabify 'action-type 'deletes-backward)
-(put 'slime-repl-newline-and-indent 'action-type 'inserts)
+(defun slime-copy-presentation-at-mouse (event)
+ (interactive "e")
+ (multiple-value-bind (presentation start end buffer)
+ (slime-presentation-around-click event)
+ (let ((presentation-text
+ (with-current-buffer buffer
+ (buffer-substring start end))))
+ (unless (eql major-mode 'slime-repl-mode)
+ (slime-switch-to-output-buffer))
+ (flet ((do-insertion ()
+ (when (not (string-match "\\s-"
+ (buffer-substring (1- (point)) (point))))
+ (insert " "))
+ (insert presentation-text)
+ (when (and (not (eolp)) (not (looking-at "\\s-")))
+ (insert " "))))
+ (if (>= (point) slime-repl-prompt-start-mark)
+ (do-insertion)
+ (save-excursion
+ (goto-char (point-max))
+ (do-insertion)))))))
+(defun slime-describe-presentation-at-mouse (event)
+ (interactive "@e")
+ (multiple-value-bind (presentation) (slime-presentation-around-click event)
+ (slime-eval-describe
+ `(swank::describe-to-string
+ (swank::lookup-presented-object ',(slime-presentation-id presentation))))))
+(defun slime-pretty-print-presentation-at-mouse (event)
+ (interactive "@e")
+ (multiple-value-bind (presentation) (slime-presentation-around-click event)
+ (slime-eval-describe
+ `(swank::swank-pprint
+ (cl:list
+ (swank::lookup-presented-object ',(slime-presentation-id presentation)))))))
+
+(defvar slime-presentation-map (make-sparse-keymap))
+
+(define-key slime-presentation-map [mouse-2] 'slime-copy-or-inspect-presentation-at-mouse)
+(define-key slime-presentation-map [mouse-3] 'slime-presentation-menu)
+
+(when (featurep 'xemacs)
+ (define-key slime-presentation-map [button2] 'slime-copy-or-inspect-presentation-at-mouse)
+ (define-key slime-presentation-map [button3] 'slime-presentation-menu))
+
+;; protocol for handling up a menu.
+;; 1. Send lisp message asking for menu choices for this object.
+;; Get back list of strings.
+;; 2. Let used choose
+;; 3. Call back to execute menu choice, passing nth and string of choice
+
+(defun slime-menu-choices-for-presentation (presentation from to choice-to-lambda)
+ "Return a menu for `presentation' at `from'--`to' in the current
+buffer, suitable for `x-popup-menu'."
+ (let* ((what (slime-presentation-id presentation))
+ (choices (slime-eval
+ `(swank::menu-choices-for-presentation-id ',what))))
+ (flet ((savel (f) ;; IMPORTANT - xemacs can't handle lambdas in x-popup-menu. So give them a name
+ (let ((sym (gensym)))
+ (setf (gethash sym choice-to-lambda) f)
+ sym)))
+ (etypecase choices
+ (list
+ `(,(if (featurep 'xemacs) " " "")
+ (""
+ ("Inspect" . ,(savel 'slime-inspect-presentation-at-mouse))
+ ("Describe" . ,(savel 'slime-describe-presentation-at-mouse))
+ ("Pretty-print" . ,(savel 'slime-pretty-print-presentation-at-mouse))
+ ("Copy to input" . ,(savel 'slime-copy-presentation-at-mouse))
+ ,@(let ((nchoice 0))
+ (mapcar
+ (lambda (choice)
+ (incf nchoice)
+ (cons choice
+ (savel `(lambda ()
+ (interactive)
+ (slime-eval
+ '(swank::execute-menu-choice-for-presentation-id
+ ',what ,nchoice ,(nth (1- nchoice) choices)))))))
+ choices)))))
+ (symbol ; not-present
+ (slime-remove-presentation-properties from to presentation)
+ (sit-for 0) ; allow redisplay
+ `("Object no longer recorded"
+ ("sorry" . ,(if (featurep 'xemacs) nil '(nil)))))))))
+
+(defun slime-presentation-menu (event)
+ (interactive "e")
+ (let* ((point (if (featurep 'xemacs) (event-point event)
+ (posn-point (event-end event))))
+ (window (if (featurep 'xemacs) (event-window event) (caadr event)))
+ (choice-to-lambda (make-hash-table)))
+ (with-current-buffer (window-buffer window)
+ (multiple-value-bind (presentation from to)
+ (slime-presentation-around-point point)
+ (unless presentation
+ (error "No presentation at event position"))
+ (let ((menu (slime-menu-choices-for-presentation
+ presentation from to choice-to-lambda)))
+ (let ((choice (x-popup-menu event menu)))
+ (when choice
+ (call-interactively (gethash choice choice-to-lambda)))))))))
+
(defun slime-repl-insert-prompt (result &optional time)
- "Goto to point max, insert RESULT and the prompt. Set
-slime-output-end to start of the inserted text slime-input-start to
-end end."
- (slime-flush-output)
+ "Goto to point max, insert RESULT and the prompt.
+Set slime-output-end to start of the inserted text slime-input-start
+to end end."
(goto-char (point-max))
(let ((start (point)))
(unless (bolp) (insert "\n"))
- (unless (string= "" result)
- (slime-propertize-region `(face slime-repl-result-face
- slime-repl-old-output ,slime-current-output-id
- mouse-face slime-repl-output-mouseover-face
- keymap (keymap (mouse-2 . slime-copy-presentation-at-point)))
- (insert result))
- (unless (bolp) (insert "\n"))
- (let ((inhibit-read-only t))
- (put-text-property (- (point) 2) (point)
- 'rear-nonsticky
- '(slime-repl-old-output face read-only))))
+ (slime-repl-insert-result result)
(let ((prompt-start (point))
(prompt (format "%s> " (slime-lisp-package-prompt-string))))
(slime-propertize-region
- '(face slime-repl-prompt-face
- read-only t
- intangible t
+ '(face slime-repl-prompt-face read-only t intangible t
slime-repl-prompt t
;; emacs stuff
rear-nonsticky (slime-repl-prompt read-only face intangible)
@@ -2777,6 +3519,26 @@
(current-buffer)))))))
(slime-repl-show-maximum-output))
+(defun slime-repl-insert-result (result)
+ "Insert the result of an evaluation.
+RESULT can be one of:
+ (:values (STRING...))
+ (:present ((STRING . ID)...))
+ (:suppress-output)"
+ (destructure-case result
+ ((:values strings)
+ (cond ((null strings) (insert "; No value\n"))
+ (t (dolist (s strings)
+ (slime-insert-propertized `(face slime-repl-result-face) s)
+ (insert "\n")))))
+ ((:present stuff)
+ (cond ((and stuff slime-repl-enable-presentations)
+ (loop for (s . id) in stuff do
+ (slime-insert-presentation s id)
+ (insert "\n")))
+ (t (slime-repl-insert-result `(:values ,(mapcar #'car stuff))))))
+ ((:suppress-output))))
+
(defun slime-repl-move-output-mark-before-prompt (buffer)
(when (buffer-live-p buffer)
(with-current-buffer buffer
@@ -2799,25 +3561,40 @@
"Return the current input as string.
The input is the region from after the last prompt to the end of
buffer. Presentations of old results are expanded into code."
- (let ((str-props (buffer-substring slime-repl-input-start-mark
- slime-repl-input-end-mark))
- (str-no-props (buffer-substring-no-properties slime-repl-input-start-mark
- slime-repl-input-end-mark)))
- (reify-old-output str-props str-no-props)))
+ (slime-buffer-substring-with-reified-output slime-repl-input-start-mark
+ slime-repl-input-end-mark))
-(defun reify-old-output (str-props str-no-props)
- (let ((pos (slime-property-position 'slime-repl-old-output str-props)))
+(defun slime-presentation-expression (presentation)
+ "Return a string that contains a CL s-expression accessing
+the presented object."
+ (let ((id (slime-presentation-id presentation)))
+ (etypecase id
+ (number
+ ;; Make sure it works even if *read-base* is not 10.
+ (format "(swank:get-repl-result #10r%d)" id))
+ (list
+ ;; for frame variables and inspector parts
+ (format "(swank:get-repl-result '%s)" id)))))
+
+(defun slime-buffer-substring-with-reified-output (start end)
+ (let ((str-props (buffer-substring start end))
+ (str-no-props (buffer-substring-no-properties start end)))
+ (slime-reify-old-output str-props str-no-props)))
+
+(defun slime-reify-old-output (str-props str-no-props)
+ (let ((pos (slime-property-position 'slime-repl-presentation str-props)))
(if (null pos)
str-no-props
- (let ((end-pos (or (next-single-property-change pos 'slime-repl-old-output str-props)
- (length str-props)))
- (id (get-text-property pos 'slime-repl-old-output str-props)))
- (concat (substring str-no-props 0 pos)
- ;; Eval in the reader so that we play nice with quote.
- ;; -luke (19/May/2005)
- "#." (slime-prin1-to-string `(swank:get-repl-result ,id))
- (reify-old-output (substring str-props end-pos)
- (substring str-no-props end-pos)))))))
+ (multiple-value-bind (presentation start-pos end-pos whole-p)
+ (slime-presentation-around-point pos str-props)
+ (if (not presentation)
+ str-no-props
+ (concat (substring str-no-props 0 pos)
+ ;; Eval in the reader so that we play nice with quote.
+ ;; -luke (19/May/2005)
+ "#." (slime-presentation-expression presentation)
+ (slime-reify-old-output (substring str-props end-pos)
+ (substring str-no-props end-pos))))))))
(defun slime-property-position (text-property &optional object)
"Return the first position of TEXT-PROPERTY, or nil."
@@ -2829,7 +3606,8 @@
(when (and (plusp (length string))
(eq ?\n (aref string (1- (length string)))))
(setq string (substring string 0 -1)))
- (unless (equal string (car slime-repl-input-history))
+ (unless (or (= (length string) 0)
+ (equal string (car slime-repl-input-history)))
(push string slime-repl-input-history))
(setq slime-repl-input-history-position -1))
@@ -2842,7 +3620,6 @@
((:abort) (slime-repl-show-abort))))
(defun slime-repl-send-string (string &optional command-string)
- (slime-repl-add-to-input-history (or command-string string))
(cond (slime-repl-read-mode
(slime-repl-return-string string))
(t (slime-repl-eval-string string))))
@@ -2854,8 +3631,10 @@
(insert-before-markers "; Evaluation aborted\n"))
(slime-rex ()
((list 'swank:listener-eval "") nil)
- ((:ok result) (with-current-buffer (slime-output-buffer)
- (slime-repl-insert-prompt ""))))))
+ ((:ok result)
+ ;; A hack to get the prompt
+ (with-current-buffer (slime-output-buffer)
+ (slime-repl-insert-prompt '(:suppress-output)))))))
(defun slime-mark-input-start ()
(set-marker slime-repl-last-input-start-mark
@@ -2869,16 +3648,19 @@
(set-marker slime-output-end position)))
(defun slime-mark-output-end ()
+ ;; Don't put slime-repl-output-face again; it would remove the
+ ;; special presentation face, for instance in the SBCL inspector.
(add-text-properties slime-output-start slime-output-end
- '(face slime-repl-output-face rear-nonsticky (face))))
+ '(;;face slime-repl-output-face
+ rear-nonsticky (face))))
(defun slime-repl-bol ()
"Go to the beginning of line or the prompt."
(interactive)
- (if (and (>= (point) slime-repl-input-start-mark)
- (slime-same-line-p (point) slime-repl-input-start-mark))
- (goto-char slime-repl-input-start-mark)
- (beginning-of-line 1))
+ (cond ((and (>= (point) slime-repl-input-start-mark)
+ (slime-same-line-p (point) slime-repl-input-start-mark))
+ (goto-char slime-repl-input-start-mark))
+ (t (beginning-of-line 1)))
(slime-preserve-zmacs-region))
(defun slime-repl-eol ()
@@ -2957,51 +3739,58 @@
(interactive "P")
(slime-check-connected)
(assert (<= (point) slime-repl-input-end-mark))
- (cond ((and (get-text-property (point) 'slime-repl-old-input)
+ (cond (end-of-input
+ (slime-repl-send-input))
+ (slime-repl-read-mode ; bad style?
+ (slime-repl-send-input t))
+ ((and (get-text-property (point) 'slime-repl-old-input)
(< (point) slime-repl-input-start-mark))
(slime-repl-grab-old-input end-of-input)
- (unless (pos-visible-in-window-p slime-repl-input-end-mark)
- (save-excursion
- (goto-char slime-repl-input-end-mark)
- (recenter -1))))
- ((and (or (get-text-property (point) 'slime-repl-old-output)
- (get-text-property (1- (point)) 'slime-repl-old-output))
- (< (point) slime-repl-input-start-mark))
+ (slime-repl-recenter-if-needed))
+ ((and (car (slime-presentation-around-or-before-point (point)))
+ (< (point) slime-repl-input-start-mark))
(slime-repl-grab-old-output end-of-input)
- (unless (pos-visible-in-window-p slime-repl-input-end-mark)
- (save-excursion
- (goto-char slime-repl-input-end-mark)
- (recenter -1))))
- (end-of-input
- (slime-repl-send-input))
- (slime-repl-read-mode ; bad style?
+ (slime-repl-recenter-if-needed))
+ ((slime-input-complete-p slime-repl-input-start-mark
+ (ecase slime-repl-return-behaviour
+ (:send-only-if-after-complete (min (point) slime-repl-input-end-mark))
+ (:send-if-complete slime-repl-input-end-mark)))
(slime-repl-send-input t))
- ((slime-input-complete-p slime-repl-input-start-mark
- slime-repl-input-end-mark)
- (slime-repl-send-input t))
(t
(slime-repl-newline-and-indent)
(message "[input not complete]"))))
+(defun slime-repl-recenter-if-needed ()
+ "Make sure that slime-repl-input-end-mark is visible."
+ (unless (pos-visible-in-window-p slime-repl-input-end-mark)
+ (save-excursion
+ (goto-char slime-repl-input-end-mark)
+ (recenter -1))))
+
(defun slime-repl-send-input (&optional newline)
"Goto to the end of the input and send the current input.
If NEWLINE is true then add a newline at the end of the input."
(when (< (point) slime-repl-input-start-mark)
(error "No input at point."))
(goto-char slime-repl-input-end-mark)
- (when newline
- (insert "\n")
- (slime-repl-show-maximum-output))
- (let ((inhibit-read-only t))
- (add-text-properties slime-repl-input-start-mark (point)
- `(slime-repl-old-input
- ,(incf slime-repl-old-input-counter))))
- (let ((overlay (make-overlay slime-repl-input-start-mark (point))))
- ;; These properties are on an overlay so that they won't be taken
- ;; by kill/yank.
- (overlay-put overlay 'read-only t)
- (overlay-put overlay 'face 'slime-repl-input-face)
- (overlay-put overlay 'rear-nonsticky '(face slime-repl-old-input-counter)))
+ (let ((end (point))) ; end of input, without the newline
+ (when newline
+ (insert "\n")
+ (slime-repl-show-maximum-output))
+ (let ((inhibit-read-only t))
+ (add-text-properties slime-repl-input-start-mark
+ (point)
+ `(slime-repl-old-input
+ ,(incf slime-repl-old-input-counter))))
+ (let ((overlay (make-overlay slime-repl-input-start-mark end)))
+ ;; These properties are on an overlay so that they won't be taken
+ ;; by kill/yank.
+ (overlay-put overlay 'read-only t)
+ (overlay-put overlay 'face 'slime-repl-input-face)))
+ (slime-repl-add-to-input-history
+ (buffer-substring slime-repl-input-start-mark
+ slime-repl-input-end-mark))
+
(let ((input (slime-repl-current-input)))
(goto-char slime-repl-input-end-mark)
(slime-mark-input-start)
@@ -3010,7 +3799,7 @@
(defun slime-repl-grab-old-input (replace)
"Resend the old REPL input at point.
-If replace it non-nil the current input is replaced with the old
+If replace is non-nil the current input is replaced with the old
input; otherwise the new input is appended. The old input has the
text property `slime-repl-old-input'."
(multiple-value-bind (beg end) (slime-property-bounds 'slime-repl-old-input)
@@ -3029,9 +3818,9 @@
(defun slime-repl-grab-old-output (replace)
"Resend the old REPL output at point.
If replace it non-nil the current input is replaced with the old
-output; otherwise the new input is appended. The old output has the
-text property `slime-repl-old-output'."
- (multiple-value-bind (beg end) (slime-property-bounds 'slime-repl-old-output)
+output; otherwise the new input is appended."
+ (multiple-value-bind (presentation beg end)
+ (slime-presentation-around-or-before-point (point))
(let ((old-output (buffer-substring beg end))) ;;keep properties
;; Append the old input or replace the current input
(cond (replace (goto-char slime-repl-input-start-mark))
@@ -3040,9 +3829,7 @@
(insert " "))))
(delete-region (point) slime-repl-input-end-mark)
(let ((inhibit-read-only t))
- (slime-propertize-region
- '(face slime-repl-inputed-output-face)
- (insert old-output))))))
+ (insert old-output)))))
(defun slime-property-bounds (prop)
"Return two the positions of the previous and next changes to PROP.
@@ -3054,13 +3841,14 @@
;; forward one char to avoid doing the wrong thing if
;; we're at the beginning of the old input. -luke
;; (18/Jun/2004)
- (unless (not (get-text-property (point) 'slime-repl-old-output))
- ;alanr unless we are sitting right after it May 19, 2005
+ (unless (not (get-text-property (point) prop))
+ ;; alanr unless we are sitting right after it May 19, 2005
(ignore-errors (forward-char)))
(previous-single-char-property-change (point) prop)))
(end (save-excursion
- (if (get-text-property (point) 'slime-repl-old-output)
- (progn (goto-char (next-single-char-property-change (point) prop))
+ (if (get-text-property (point) prop)
+ (progn (goto-char (next-single-char-property-change
+ (point) prop))
(skip-chars-backward "\n \t\r" beg)
(point))
(point)))))
@@ -3090,6 +3878,12 @@
(defun slime-repl-delete-current-input ()
(delete-region slime-repl-input-start-mark slime-repl-input-end-mark))
+(defun slime-repl-kill-input ()
+ "Kill all text from last stuff output by the Lisp process to point."
+ (interactive)
+ (when (> (point) (marker-position slime-repl-input-start-mark))
+ (kill-region slime-repl-input-start-mark (point))))
+
(defun slime-repl-replace-input (string)
(slime-repl-delete-current-input)
(insert-and-inherit string))
@@ -3102,7 +3896,7 @@
(defun slime-repl-clear-buffer ()
"Delete the entire output generated by the Lisp process."
(interactive)
- (slime-eval `(swank::clear-repl-results))
+ (slime-eval-async `(swank:clear-repl-results))
(set-marker slime-repl-last-input-start-mark nil)
(let ((inhibit-read-only t))
(delete-region (point-min) (slime-repl-input-line-beginning-position))
@@ -3111,7 +3905,6 @@
(defun slime-repl-clear-output ()
"Delete the output inserted since the last input."
(interactive)
- (slime-eval `(swank::clear-last-repl-result))
(let ((start (save-excursion
(slime-repl-previous-prompt)
(ignore-errors (forward-sexp))
@@ -3135,7 +3928,7 @@
(slime-eval `(swank:set-package ,package))
(setf (slime-lisp-package) name)
(setf (slime-lisp-package-prompt-string) prompt-string)
- (slime-repl-insert-prompt "" 0)
+ (slime-repl-insert-prompt '(:suppress-output) 0)
(insert unfinished-input)))))
@@ -3149,14 +3942,31 @@
(defvar slime-repl-history-pattern nil
"The regexp most recently used for finding input history.")
-(defun slime-repl-history-replace (direction regexp &optional delete-at-end-p)
+;; initialized later when slime-repl-mode-map is available
+(defvar slime-repl-history-map (make-sparse-keymap)
+ "Map active while in the minibuffer reading repl search regexp.")
+
+(defun* slime-repl-history-replace (direction &optional regexp delete-at-end-p)
"Replace the current input with the next line in DIRECTION matching REGEXP.
DIRECTION is 'forward' or 'backward' (in the history list).
If DELETE-AT-END-P is non-nil then remove the string if the end of the
-history is reached."
- (setq slime-repl-history-pattern regexp)
- (let ((pos (slime-repl-position-in-history direction regexp))
- (forward (eq direction 'forward)))
+history is reached. Returns t if there were any matches."
+ (when regexp
+ (setq slime-repl-history-pattern regexp))
+ (let* ((forward (eq direction 'forward))
+ (history-length (length slime-repl-input-history))
+ (pos (if regexp
+ (slime-repl-position-in-history direction regexp)
+ (if (>= slime-repl-input-history-position 0)
+ (+ slime-repl-input-history-position
+ (if forward -1 1))
+ (unless forward
+ 0)))))
+ (when (and pos
+ (or (< pos 0)
+ (>= pos history-length)))
+
+ (setf pos nil))
(cond (pos
(slime-repl-replace-input (nth pos slime-repl-input-history))
(setq slime-repl-input-history-position pos)
@@ -3166,13 +3976,15 @@
(message "End of history"))
(t (message "Beginning of history")))
(setq slime-repl-input-history-position
- (if forward -1 (length slime-repl-input-history))))
+ (if forward -1 history-length)))
((and delete-at-end-p slime-repl-wrap-history)
(slime-repl-replace-input "")
(setq slime-repl-input-history-position
- (if forward (length slime-repl-input-history) -1)))
+ (if forward history-length -1)))
(t
- (message "End of history; no matching item")))))
+ (message "End of history; no matching item")
+ (return-from slime-repl-history-replace nil))))
+ t)
(defun slime-repl-position-in-history (direction regexp)
"Return the position of the history item matching regexp.
@@ -3181,37 +3993,172 @@
(let* ((step (ecase direction
(forward -1)
(backward 1)))
- (history-pos0 slime-repl-input-history-position))
+ (history-pos0 slime-repl-input-history-position)
+ (history-length (length slime-repl-input-history)))
(loop for pos = (+ history-pos0 step) then (+ pos step)
while (and (<= 0 pos)
- (< pos (length slime-repl-input-history)))
+ (< pos history-length))
do (let ((string (nth pos slime-repl-input-history)))
(when (and (string-match regexp string)
(not (string= string (slime-repl-current-input))))
(return pos))))))
+(defun slime-repl-previous-input ()
+ (interactive)
+ (slime-repl-history-replace 'backward nil t))
+
+(defun slime-repl-next-input ()
+ (interactive)
+ (slime-repl-history-replace 'forward nil t))
+
(defun slime-repl-matching-input-regexp ()
(if (memq last-command
- '(slime-repl-previous-input slime-repl-next-input))
+ '(slime-repl-previous-input-starting-with-current-input slime-repl-next-input-starting-with-current-input))
slime-repl-history-pattern
(concat "^" (regexp-quote (slime-repl-current-input)))))
-(defun slime-repl-previous-input ()
+(defun slime-repl-previous-input-starting-with-current-input ()
(interactive)
(slime-repl-history-replace 'backward (slime-repl-matching-input-regexp) t))
-(defun slime-repl-next-input ()
+(defun slime-repl-next-input-starting-with-current-input ()
(interactive)
(slime-repl-history-replace 'forward (slime-repl-matching-input-regexp) t))
-(defun slime-repl-previous-matching-input (regexp)
- (interactive "sPrevious element matching (regexp): ")
- (slime-repl-history-replace 'backward regexp))
+(defun slime-repl-continue-search-with-last-pattern ()
+ (interactive)
+ (when slime-repl-history-pattern
+ (throw 'continue slime-repl-history-pattern)))
-(defun slime-repl-next-matching-input (regexp)
- (interactive "sNext element matching (regexp): ")
- (slime-repl-history-replace 'forward regexp))
+(defun slime-repl-previous-or-next-matching-input (regexp direction prompt)
+ (let ((command this-command))
+ (unless regexp
+ (setf regexp (if (and slime-repl-history-pattern
+ (memq last-command
+ '(slime-repl-previous-matching-input slime-repl-next-matching-input)))
+ slime-repl-history-pattern
+ (catch 'continue
+ (slime-read-from-minibuffer
+ prompt (slime-symbol-name-at-point) slime-repl-history-map)))))
+ (when (and regexp (> (length regexp) 0))
+ (when (slime-repl-history-replace direction regexp)
+ (setf this-command command)))))
+(defun slime-repl-previous-matching-input ()
+ (interactive)
+ (slime-repl-previous-or-next-matching-input
+ nil 'backward "Previous element matching (regexp): "))
+
+(defun slime-repl-next-matching-input ()
+ (interactive)
+ (slime-repl-previous-or-next-matching-input
+ nil 'forward "Next element matching (regexp): "))
+
+;;;;; Persistent History
+
+(defun slime-repl-merge-histories (old-hist new-hist)
+ "Merge entries from OLD-HIST and NEW-HIST."
+ ;; Newer items in each list are at the beginning.
+ (append
+ ;; first the new unique elements...
+ (remove-if #'(lambda (entry)
+ (member entry old-hist))
+ new-hist)
+ ;; then the old unique elements...
+ (remove-if #'(lambda (entry)
+ (member entry new-hist))
+ old-hist)
+ ;; and finally elements existing in both lists
+ (remove-if #'(lambda (entry)
+ (not (member entry old-hist)))
+ new-hist)))
+
+(defun slime-repl-load-history (&optional filename)
+ "Set the current SLIME REPL history.
+It can be read either from FILENAME or `slime-repl-history-file' or
+from a user defined filename."
+ (interactive (list (slime-repl-read-history-filename)))
+ (let ((file (or filename slime-repl-history-file)))
+ (setq slime-repl-input-history (slime-repl-read-history file t))))
+
+(defun slime-repl-read-history (&optional filename noerrer)
+ "Read and return the history from FILENAME.
+The default value for FILENAME is `slime-repl-history-file'.
+If NOERROR is true return and the file doesn't exits return nil."
+ (let ((file (or filename slime-repl-history-file)))
+ (cond ((not (file-readable-p file)) '())
+ (t (with-temp-buffer
+ (insert-file-contents file)
+ (read (current-buffer)))))))
+
+(defun slime-repl-read-history-filename ()
+ (read-file-name "Use SLIME REPL history from file: "
+ slime-repl-history-file))
+
+(defun slime-repl-save-merged-history (&optional filename)
+ "Read the history file, merge the current REPL history and save it.
+This tries to be smart in merging the history from the file and the
+current history in that it tries to detect the unique entries using
+`slime-repl-merge-histories'."
+ (interactive (list (slime-repl-read-history-filename)))
+ (let ((file (or filename slime-repl-history-file)))
+ (message "saving history...")
+ (let ((hist (slime-repl-merge-histories (slime-repl-read-history file t)
+ slime-repl-input-history)))
+ (slime-repl-save-history file hist))))
+
+(defun slime-repl-save-history (&optional filename history)
+ "Simply save the current SLIME REPL history to a file.
+When SLIME is setup to always load the old history and one uses only
+one instance of slime all the time, there is no need to merge the
+files and this function is sufficient.
+
+When the list is longer than `slime-repl-history-size' it will be
+truncated. That part is untested, though!"
+ (interactive (list (slime-repl-read-history-filename)))
+ (let ((file (or filename slime-repl-history-file))
+ (hist (or history slime-repl-input-history)))
+ (unless (file-writable-p file)
+ (error (format "History file not writable: %s" file)))
+ (let ((hist (subseq hist 0 (min (length hist) slime-repl-history-size))))
+ ;;(message "saving %s to %s\n" hist file)
+ (with-temp-file file
+ (let ((cs slime-repl-history-file-coding-system))
+ (setq buffer-file-coding-system cs)
+ (insert (format ";; -*- coding: %s -*-\n" cs)))
+ (insert ";; History for SLIME REPL. Automatically written.\n"
+ ";; Edit only if you know what you're doing\n")
+ (pp (mapcar #'substring-no-properties hist) (current-buffer))))))
+
+(defun slime-repl-save-all-histories ()
+ "Save the history in each repl buffer."
+ (dolist (b (buffer-list))
+ (with-current-buffer b
+ (when (eq major-mode 'slime-repl-mode)
+ (slime-repl-safe-save-merged-history)))))
+
+(defun slime-repl-safe-save-merged-history ()
+ (slime-repl-call-with-handler
+ #'slime-repl-save-merged-history
+ "%S while saving the history. Continue? "))
+
+(defun slime-repl-safe-load-history ()
+ (slime-repl-call-with-handler
+ #'slime-repl-load-history
+ "%S while loading the history. Continue? "))
+
+(defun slime-repl-call-with-handler (fun query)
+ "Call FUN in the context of an error handler.
+The handler will use qeuery to ask the use if the error should be ingored."
+ (condition-case err
+ (funcall fun)
+ (error
+ (if (y-or-n-p (format query (error-message-string err)))
+ nil
+ (signal (car err) (cdr err))))))
+
+;;;;; REPL mode setup
+
(defun slime-repl ()
(interactive)
(slime-switch-to-output-buffer))
@@ -3234,9 +4181,9 @@
("\C-a" 'slime-repl-bol)
([home] 'slime-repl-bol)
("\C-e" 'slime-repl-eol)
- ("\M-p" 'slime-repl-previous-input)
+ ("\M-p" 'slime-repl-previous-input-starting-with-current-input)
((kbd "C-<up>") 'slime-repl-previous-input)
- ("\M-n" 'slime-repl-next-input)
+ ("\M-n" 'slime-repl-next-input-starting-with-current-input)
((kbd "C-<down>") 'slime-repl-next-input)
("\M-r" 'slime-repl-previous-matching-input)
("\M-s" 'slime-repl-next-matching-input)
@@ -3253,6 +4200,7 @@
("\C-\M-x" 'slime-eval-defun)
("\C-c\C-o" 'slime-repl-clear-output)
("\C-c\C-t" 'slime-repl-clear-buffer)
+ ("\C-c\C-u" 'slime-repl-kill-input)
("\C-c\C-n" 'slime-repl-next-prompt)
("\C-c\C-p" 'slime-repl-previous-prompt)
("\M-\C-a" 'slime-repl-beginning-of-defun)
@@ -3261,6 +4209,16 @@
("\C-c\C-k" 'slime-compile-and-load-file)
("\C-c\C-z" 'slime-nop))
+;; set up slime-repl-history-map
+(flet ((remap (keys to)
+ (mimic-key-bindings slime-repl-mode-map slime-repl-history-map keys to)))
+ (remap (list 'slime-repl-previous-matching-input (kbd "M-r"))
+ 'slime-repl-continue-search-with-last-pattern)
+ (remap (list 'slime-repl-next-matching-input (kbd "M-n"))
+ 'slime-repl-continue-search-with-last-pattern))
+
+;;;;;; REPL Read Mode
+
(define-key slime-repl-mode-map
(string slime-repl-shortcut-dispatch-char) 'slime-handle-repl-shortcut)
@@ -3288,10 +4246,8 @@
(slime-mark-input-start)
(slime-repl-read-mode 1))
-(defun evaluate-in-emacs (expr thread tag)
- (push thread slime-read-string-threads)
- (push tag slime-read-string-tags)
- (slime-repl-return-string (eval expr)))
+(defun slime-y-or-n-p (thread tag question)
+ (slime-dispatch-event `(:emacs-return ,thread ,tag ,(y-or-n-p question))))
(defun slime-repl-return-string (string)
(slime-dispatch-event `(:emacs-return-string
@@ -3302,7 +4258,7 @@
(defun slime-repl-read-break ()
(interactive)
- (slime-eval-async `(cl:break)))
+ (slime-dispatch-event `(:emacs-interrupt ,(car slime-read-string-threads))))
(defun slime-repl-abort-read (thread tag)
(with-current-buffer (slime-output-buffer)
@@ -3325,17 +4281,15 @@
(defun slime-handle-repl-shortcut ()
(interactive)
- (if (save-excursion
- (goto-char slime-repl-input-start-mark)
- (looking-at " *$"))
+ (if (> (point) slime-repl-input-start-mark)
+ (insert (string slime-repl-shortcut-dispatch-char))
(let ((shortcut (slime-lookup-shortcut
(completing-read "Command: "
(slime-bogus-completion-alist
(slime-list-all-repl-shortcuts))
nil t nil
'slime-repl-shortcut-history))))
- (call-interactively (slime-repl-shortcut.handler shortcut)))
- (insert (string slime-repl-shortcut-dispatch-char))))
+ (call-interactively (slime-repl-shortcut.handler shortcut)))))
(defun slime-list-all-repl-shortcuts ()
(loop for shortcut in slime-repl-shortcut-table
@@ -3384,6 +4338,13 @@
(insert (car names) ")"))
(insert "\n " (slime-repl-shortcut.one-liner shortcut)
"\n"))))))
+
+(defun slime-save-some-lisp-buffers ()
+ (if slime-repl-only-save-lisp-buffers
+ (save-some-buffers nil (lambda ()
+ (and (memq major-mode slime-lisp-modes)
+ (not (null buffer-file-name)))))
+ (save-some-buffers)))
(defslime-repl-shortcut slime-repl-shortcut-help ("help" "?")
(:handler 'slime-list-repl-short-cuts)
@@ -3400,43 +4361,48 @@
(message "Directory %s" dir))))
(:one-liner "Show the current directory."))
-(defslime-repl-shortcut slime-repl-push-directory ("push-directory" "+d"
- "pushd")
+(defslime-repl-shortcut slime-repl-push-directory
+ ("push-directory" "+d" "pushd")
(:handler (lambda (directory)
(interactive
- (list (read-directory-name
+ (list (read-directory-name
"Push directory: "
- (slime-eval '(swank:default-directory)) nil nil "")))
- (push directory slime-repl-directory-stack)
+ (slime-eval '(swank:default-directory))
+ nil nil "")))
+ (push (slime-eval '(swank:default-directory))
+ slime-repl-directory-stack)
(slime-set-default-directory directory)))
- (:one-liner "Push a new directory onto the directory stack."))
+ (:one-liner "Save the current directory and set it to a new one."))
-(defslime-repl-shortcut slime-repl-pop-directory ("pop-directory" "-d")
+(defslime-repl-shortcut slime-repl-pop-directory
+ ("pop-directory" "-d" "popd")
(:handler (lambda ()
(interactive)
- (unless (= 1 (length slime-repl-directory-stack))
- (pop slime-repl-directory-stack))
- (slime-set-default-directory (car slime-repl-directory-stack))))
- (:one-liner "Pop the current directory."))
+ (if (null slime-repl-directory-stack)
+ (message "Directory stack is empty.")
+ (slime-set-default-directory
+ (pop slime-repl-directory-stack)))))
+ (:one-liner "Restore the last saved directory."))
-(defslime-repl-shortcut nil ("change-package" "!p")
+(defslime-repl-shortcut nil ("change-package" "!p" "in-package" "in")
(:handler 'slime-repl-set-package)
(:one-liner "Change the current package."))
(defslime-repl-shortcut slime-repl-push-package ("push-package" "+p")
(:handler (lambda (package)
(interactive (list (slime-read-package-name "Package: ")))
- (push package slime-repl-package-stack)
+ (push (slime-lisp-package) slime-repl-package-stack)
(slime-repl-set-package package)))
- (:one-liner "Push a package onto the package stack."))
+ (:one-liner "Save the current package and set it to a new one."))
(defslime-repl-shortcut slime-repl-pop-package ("pop-package" "-p")
(:handler (lambda ()
(interactive)
- (unless (= 1 (length slime-repl-package-stack))
- (pop slime-repl-package-stack))
- (slime-repl-set-package (car slime-repl-package-stack))))
- (:one-liner "Pop the top of the package stack."))
+ (if (null slime-repl-package-stack)
+ (message "Package stack is empty.")
+ (slime-repl-set-package
+ (pop slime-repl-package-stack)))))
+ (:one-liner "Restore the last saved package."))
(defslime-repl-shortcut slime-repl-resend ("resend-form")
(:handler (lambda ()
@@ -3446,6 +4412,10 @@
(slime-repl-send-input)))
(:one-liner "Resend the last form."))
+(defslime-repl-shortcut slime-repl-disconnect ("disconnect")
+ (:handler 'slime-disconnect)
+ (:one-liner "Disconnect all connections."))
+
(defslime-repl-shortcut slime-repl-sayoonara ("sayoonara")
(:handler (lambda ()
(interactive)
@@ -3471,7 +4441,7 @@
(:handler (lambda (filename)
(interactive (list (expand-file-name
(read-file-name "File: " nil nil nil nil))))
- (save-some-buffers)
+ (slime-save-some-lisp-buffers)
(slime-eval-async
`(swank:compile-file-if-needed
,(slime-to-lisp-filename filename) t)
@@ -3503,13 +4473,15 @@
(slime-oos (slime-read-system-name) "COMPILE-OP" :force t)))
(:one-liner "Recompile (but not load) an ASDF system."))
-(defslime-repl-shortcut slime-restart-inferior-lisp ("restart-inferior-lisp")
- (:handler 'slime-restart-inferior-lisp-aux)
+(defslime-repl-shortcut nil ("restart-inferior-lisp")
+ (:handler 'slime-restart-inferior-lisp)
(:one-liner "Restart *inferior-lisp* and reconnect SLIME."))
-(defun slime-restart-inferior-lisp-aux ()
+(defun slime-restart-inferior-lisp ()
(interactive)
+ (assert (slime-inferior-process) () "No inferior lisp process")
(slime-eval-async '(swank:quit-lisp))
+ (set-process-filter (slime-connection) nil)
(set-process-sentinel (slime-connection) 'slime-restart-sentinel))
(defun slime-restart-sentinel (process message)
@@ -3517,14 +4489,16 @@
Also rearrange windows."
(assert (process-status process) 'closed)
(let* ((proc (slime-inferior-process process))
- (args (mapconcat #'identity (process-command proc) " "))
+ (args (slime-inferior-lisp-args proc))
(buffer (buffer-name (process-buffer proc)))
(buffer-window (get-buffer-window buffer))
- (new-proc (slime-start-lisp args buffer (slime-init-command)))
+ (new-proc (slime-start-lisp (plist-get args :program)
+ (plist-get args :program-args)
+ buffer))
(repl-buffer (slime-repl-buffer nil process))
(repl-window (and repl-buffer (get-buffer-window repl-buffer))))
(slime-net-close process)
- (slime-inferior-connect new-proc)
+ (slime-inferior-connect new-proc args)
(cond ((and repl-window (not buffer-window))
(set-window-buffer repl-window buffer)
(select-window repl-window))
@@ -3579,6 +4553,11 @@
;;;; Compilation and the creation of compiler-note annotations
+(defvar slime-before-compile-functions nil
+ "A list of function called before compiling a buffer or region.
+The function receive two arguments: the beginning and the end of the
+region that will be compiled.")
+
(defun slime-compile-and-load-file ()
"Compile and load the buffer's file and highlight compiler notes.
@@ -3598,18 +4577,21 @@
(interactive)
(unless (memq major-mode slime-lisp-modes)
(error "Only valid in lisp-mode"))
+ (check-parens)
(unless buffer-file-name
(error "Buffer %s is not associated with a file." (buffer-name)))
(when (and (buffer-modified-p)
(y-or-n-p (format "Save file %s? " (buffer-file-name))))
(save-buffer))
+ (run-hook-with-args 'slime-before-compile-functions (point-min) (point-max))
(let ((lisp-filename (slime-to-lisp-filename (buffer-file-name))))
(slime-insert-transcript-delimiter
(format "Compile file %s" lisp-filename))
(when slime-display-compilation-output
(slime-display-output-buffer))
(slime-eval-async
- `(swank:compile-file-for-emacs ,lisp-filename ,(if load t nil))
+ `(swank:compile-file-for-emacs
+ ,lisp-filename ,(if load t nil))
(slime-compilation-finished-continuation))
(message "Compiling %s.." lisp-filename)))
@@ -3621,14 +4603,17 @@
(and asdf-systems-in-directory
(file-name-sans-extension (car asdf-systems-in-directory)))))
-(defun slime-load-system (&optional system-name)
+(defun slime-load-system (&optional system)
"Compile and load an ASDF system.
Default system name is taken from first file matching *.asd in current
buffer's working directory"
(interactive (list (slime-read-system-name)))
- (slime-oos system-name "LOAD-OP"))
+ (slime-oos system "LOAD-OP"))
+(defvar slime-system-history nil
+ "History list for ASDF system names.")
+
(defun slime-read-system-name (&optional prompt initial-value)
"Read a system name from the minibuffer, prompting with PROMPT."
(setq prompt (or prompt "System: "))
@@ -3638,30 +4623,28 @@
(slime-eval
`(swank:list-all-systems-in-central-registry))))))
(completing-read prompt alist nil nil
- (or initial-value (slime-find-asd) ""))))
+ (or initial-value (slime-find-asd) "")
+ 'slime-system-history)))
-(defun slime-oos (system-name operation &rest keyword-args)
- (save-some-buffers)
+(defun slime-oos (system operation &rest keyword-args)
+ (slime-save-some-lisp-buffers)
(slime-display-output-buffer)
(message "Performing ASDF %S%s on system %S"
operation (if keyword-args (format " %S" keyword-args) "")
- system-name)
+ system)
(slime-eval-async
- `(swank:operate-on-system-for-emacs ,system-name ,operation ,@keyword-args)
+ `(swank:operate-on-system-for-emacs ,system ,operation ,@keyword-args)
(slime-compilation-finished-continuation)))
(defun slime-compile-defun ()
"Compile the current toplevel form."
(interactive)
- (slime-compile-string (slime-defun-at-point)
- (save-excursion
- (end-of-defun)
- (beginning-of-defun)
- (point))))
+ (apply #'slime-compile-region (slime-region-for-defun-at-point)))
(defun slime-compile-region (start end)
"Compile the region."
(interactive "r")
+ (run-hook-with-args 'slime-before-compile-functions start end)
(slime-compile-string (buffer-substring-no-properties start end) start))
(defun slime-compile-string (string start-offset)
@@ -3673,8 +4656,6 @@
,(if (buffer-file-name) (file-name-directory (buffer-file-name))))
(slime-compilation-finished-continuation)))
-(defvar slime-hide-style-warning-count-if-zero t)
-
(defun slime-note-count-string (severity count &optional suppress-if-zero)
(cond ((and (zerop count) suppress-if-zero)
"")
@@ -3688,14 +4669,12 @@
(:warning (incf nwarnings))
(:style-warning (incf nstyle-warnings))
(:note (incf nnotes))))
- (message
- "Compilation finished:%s%s%s%s%s"
- (slime-note-count-string "error" nerrors)
- (slime-note-count-string "warning" nwarnings)
- (slime-note-count-string "style-warning" nstyle-warnings
- slime-hide-style-warning-count-if-zero)
- (slime-note-count-string "note" nnotes)
- (if secs (format "[%s secs]" secs) ""))))
+ (message "Compilation finished:%s%s%s%s%s"
+ (slime-note-count-string "error" nerrors)
+ (slime-note-count-string "warning" nwarnings)
+ (slime-note-count-string "style-warning" nstyle-warnings t)
+ (slime-note-count-string "note" nnotes)
+ (if secs (format "[%s secs]" secs) ""))))
(defun slime-xrefs-for-notes (notes)
(let ((xrefs))
@@ -3734,9 +4713,11 @@
(defun slime-compilation-finished (result buffer)
(let ((notes (slime-compiler-notes)))
(with-current-buffer buffer
+ (setf slime-compilation-just-finished t)
(multiple-value-bind (result secs) result
(slime-show-note-counts notes secs)
- (slime-highlight-notes notes)))
+ (when slime-highlight-compiler-notes
+ (slime-highlight-notes notes))))
(run-hook-with-args 'slime-compilation-finished-hook notes)))
(defun slime-compilation-finished-continuation ()
@@ -3747,9 +4728,10 @@
(defun slime-highlight-notes (notes)
"Highlight compiler notes, warnings, and errors in the buffer."
(interactive (list (slime-compiler-notes)))
- (save-excursion
- (slime-remove-old-overlays)
- (mapc #'slime-overlay-note (slime-merge-notes-for-display notes))))
+ (with-temp-message "Highlighting notes..."
+ (save-excursion
+ (slime-remove-old-overlays)
+ (mapc #'slime-overlay-note (slime-merge-notes-for-display notes)))))
(defun slime-compiler-notes ()
"Return all compiler notes, warnings, and errors."
@@ -3775,7 +4757,6 @@
(funcall predicate)))
(buffer-list)))
-
;;;;; Merging together compiler notes in the same location.
@@ -3845,19 +4826,20 @@
(defun slime-list-compiler-notes (&optional notes)
"Show the compiler notes NOTES in tree view."
(interactive)
- (let ((notes (or notes (slime-compiler-notes))))
- (with-current-buffer
- (slime-get-temp-buffer-create "*compiler notes*"
- :mode 'slime-compiler-notes-mode)
- (let ((inhibit-read-only t))
- (erase-buffer)
- (when (null notes)
- (insert "[no notes]"))
- (dolist (tree (slime-compiler-notes-to-tree notes))
- (slime-tree-insert tree "")
- (insert "\n")))
- (setq buffer-read-only t)
- (goto-char (point-min)))))
+ (with-temp-message "Preparing compiler note tree..."
+ (let ((notes (or notes (slime-compiler-notes))))
+ (with-current-buffer
+ (slime-get-temp-buffer-create "*compiler notes*"
+ :mode 'slime-compiler-notes-mode)
+ (let ((inhibit-read-only t))
+ (erase-buffer)
+ (when (null notes)
+ (insert "[no notes]"))
+ (dolist (tree (slime-compiler-notes-to-tree notes))
+ (slime-tree-insert tree "")
+ (insert "\n")))
+ (setq buffer-read-only t)
+ (goto-char (point-min))))))
(defun slime-alistify (list key test)
"Partition the elements of LIST into an alist. KEY extracts the key
@@ -4130,18 +5112,22 @@
(defun slime-choose-overlay-region (note)
"Choose the start and end points for an overlay over NOTE.
If the location's sexp is a list spanning multiple lines, then the
-region around the first element is used."
+region around the first element is used.
+Return nil if there's no useful source location."
(let ((location (slime-note.location note)))
- (destructure-case location
- ((:error msg) ) ; do nothing
- ((:location _file pos _hints)
- (destructure-case pos
- ((:position pos &optional alignp)
- (if (eq (slime-note.severity note) :read-error)
- (values pos (1+ pos))
- (slime-choose-overlay-for-sexp location)))
- (t
- (slime-choose-overlay-for-sexp location)))))))
+ (when location
+ (destructure-case location
+ ((:error _) _ nil) ; do nothing
+ ((:location file pos _hints)
+ (cond ((eq (car file) ':source-form) nil)
+ (t
+ (destructure-case pos
+ ((:position pos &optional alignp)
+ (if (eq (slime-note.severity note) :read-error)
+ (values pos (1+ pos))
+ (slime-choose-overlay-for-sexp location)))
+ (t
+ (slime-choose-overlay-for-sexp location))))))))))
(defun slime-choose-overlay-for-sexp (location)
(slime-goto-source-location location)
@@ -4152,13 +5138,13 @@
(values start (point))
(values (1+ start)
(progn (goto-char (1+ start))
- (or (forward-sexp 1)
- (point)))))))
+ (ignore-errors (forward-sexp 1))
+ (point))))))
(defun slime-same-line-p (pos1 pos2)
"Return t if buffer positions POS1 and POS2 are on the same line."
- (save-excursion (goto-char (min pos1 pos2))
- (<= (max pos1 pos2) (line-end-position))))
+ (save-excursion (goto-char (min pos1 pos2))
+ (<= (max pos1 pos2) (line-end-position))))
(defun slime-severity-face (severity)
"Return the name of the font-lock face representing SEVERITY."
@@ -4212,7 +5198,10 @@
(defun slime-goto-location-buffer (buffer)
(destructure-case buffer
((:file filename)
- (set-buffer (find-file-noselect (slime-from-lisp-filename filename) t))
+ (let ((emacs-filename (slime-from-lisp-filename filename)))
+ (unless (and (buffer-file-name)
+ (string= (buffer-file-name) emacs-filename))
+ (set-buffer (find-file-noselect emacs-filename t))))
(goto-char (point-min)))
((:buffer buffer)
(set-buffer buffer)
@@ -4220,6 +5209,7 @@
((:source-form string)
(set-buffer (get-buffer-create "*SLIME Source Form*"))
(erase-buffer)
+ (lisp-mode)
(insert string)
(goto-char (point-min)))))
@@ -4231,7 +5221,8 @@
(slime-forward-sexp)
(beginning-of-sexp)))
((:line start &optional end)
- (goto-line start))
+ (goto-line start)
+ (skip-chars-forward " \t"))
((:function-name name)
(let ((case-fold-search t)
(name (regexp-quote name)))
@@ -4239,25 +5230,12 @@
(re-search-forward
(format "\\s *(def\\(\\s_\\|\\sw\\)*\\s +%s\\S_" name) nil t)
(re-search-forward
- ;; FIXME: Isn't this far to general?
+ (format "\\s *(def\\(\\s_\\|\\sw\\)*\\s +(*%s\\S_" name) nil t)
+ (re-search-forward
(format "[( \t]%s\\>\\(\\s \\|$\\)" name) nil t)))
(goto-char (match-beginning 0)))
- ;; Looks for a sequence of words (def<something> method name
- ;; qualifers specializers don't look for "T" since it isn't
- ;; requires (arg without t) as class is taken as such.
((:method name specializers &rest qualifiers)
- (let* ((case-fold-search t)
- (name (regexp-quote name))
- (qualifiers (mapconcat (lambda (el) (concat ".+?\\<" el "\\>"))
- qualifiers ""))
- (specializers (mapconcat (lambda (el) (concat ".+?\\<" el "\\>"))
- (remove "T" specializers) ""))
- (regexp (format "\\s *(def\\(\\s_\\|\\sw\\)*\\s +%s\\>%s%s" name
- qualifiers specializers)))
- (or (and (re-search-forward regexp nil t)
- (goto-char (match-beginning 0)))
- ;; (slime-goto-location-position `(:function-name ,name))
- )))
+ (slime-search-method-location name specializers qualifiers))
((:source-path source-path start-position)
(cond (start-position
(goto-char start-position)
@@ -4271,6 +5249,29 @@
(slime-isearch text)
(forward-char delta))))
+(defun slime-search-method-location (name specializers qualifiers)
+ ;; Look for a sequence of words (def<something> method name
+ ;; qualifers specializers don't look for "T" since it isn't requires
+ ;; (arg without t) as class is taken as such.
+ (let* ((case-fold-search t)
+ (name (regexp-quote name))
+ (qualifiers (mapconcat (lambda (el) (concat ".+?\\<" el "\\>"))
+ qualifiers ""))
+ (specializers (mapconcat (lambda (el)
+ (if (eql (aref el 0) ?\()
+ (let ((spec (read el)))
+ (if (eq (car spec) 'EQL)
+ (concat ".*?\\n\\{0,1\\}.*?(EQL.*?'\\{0,1\\}" (format "%s" (second spec)) ")")
+ (error "don't understand specializer: %s,%s" el (car spec))))
+ (concat ".+?\n\\{0,1\\}.+?\\<" el "\\>")))
+ (remove "T" specializers) ""))
+ (regexp (format "\\s *(def\\(\\s_\\|\\sw\\)*\\s +%s\\s +%s%s" name
+ qualifiers specializers)))
+ (or (and (re-search-forward regexp nil t)
+ (goto-char (match-beginning 0)))
+ ;; (slime-goto-location-position `(:function-name ,name))
+ )))
+
(defun slime-search-call-site (fname)
"Move to the place where FNAME called.
Don't move if there are multiple or no calls in the current defun."
@@ -4283,7 +5284,6 @@
(goto-char (match-beginning 0)))
(t (goto-char start))))))
-
(defun slime-goto-source-location (location &optional noerror)
"Move to the source location LOCATION. Several kinds of locations
are supported:
@@ -4430,21 +5430,40 @@
;;;;; Visiting and navigating the overlays of compiler notes
+(defvar slime-compilation-just-finished nil
+ "A buffer local variable which is T when we've just compiled a
+buffer and haven't yet started navigating its notes.")
+(make-variable-buffer-local 'slime-compilation-just-finished)
+
(defun slime-next-note ()
"Go to and describe the next compiler note in the buffer."
(interactive)
- (slime-find-next-note)
- (if (slime-note-at-point)
- (slime-show-note (slime-note-at-point))
- (message "No next note.")))
+ (let ((here (point)))
+ (when (and slime-goto-first-note-after-compilation
+ slime-compilation-just-finished)
+ (goto-char (point-min))
+ (setf slime-compilation-just-finished nil))
+ (slime-find-next-note)
+ (if (slime-note-at-point)
+ (slime-show-note (slime-note-at-point))
+ (progn
+ (goto-char here)
+ (message "No next note.")))))
(defun slime-previous-note ()
"Go to and describe the previous compiler note in the buffer."
(interactive)
- (slime-find-previous-note)
- (if (slime-note-at-point)
- (slime-show-note (slime-note-at-point))
- (message "No previous note.")))
+ (let ((here (point)))
+ (when (and slime-goto-first-note-after-compilation
+ slime-compilation-just-finished)
+ (goto-char (point-max))
+ (setf slime-compilation-just-finished nil))
+ (slime-find-previous-note)
+ (if (slime-note-at-point)
+ (slime-show-note (slime-note-at-point))
+ (progn
+ (goto-char here)
+ (message "No previous note.")))))
(defun slime-remove-notes ()
"Remove compiler-note annotations from the current buffer."
@@ -4515,23 +5534,32 @@
Designed to be bound to the SPC key. Prefix argument can be used to insert
more than one space."
(interactive "p")
+ (self-insert-command n)
(unwind-protect
(when (and slime-space-information-p
(slime-background-activities-enabled-p))
- (slime-echo-arglist))
- (self-insert-command n)))
+ (slime-echo-arglist))))
+(defun slime-fontify-string (string)
+ "Fontify STRING as `font-lock-mode' does in Lisp mode."
+ (with-current-buffer (get-buffer-create " *slime-fontify*")
+ (erase-buffer)
+ (if (not (eq major-mode 'lisp-mode))
+ (lisp-mode))
+ (insert string)
+ (let ((font-lock-verbose nil))
+ (font-lock-fontify-buffer))
+ (goto-char (point-min))
+ (when (re-search-forward "===> \\(\\(.\\|\n\\)*\\) <===" nil t)
+ (let ((highlight (match-string 1)))
+ ;; Can't use (replace-match highlight) here -- broken in Emacs 21
+ (delete-region (match-beginning 0) (match-end 0))
+ (slime-insert-propertized '(face highlight) highlight)))
+ (buffer-substring (point-min) (point-max))))
+
(defun slime-echo-arglist ()
"Display the arglist of the current form in the echo area."
- (let ((names (slime-enclosing-operator-names)))
- (when names
- (slime-eval-async
- `(swank:arglist-for-echo-area (quote ,names))
- (lexical-let ((buffer (current-buffer)))
- (lambda (message)
- (if message
- (with-current-buffer buffer
- (slime-message "%s" message)))))))))
+ (slime-autodoc))
(defun slime-arglist (name)
"Show the argument list for NAME."
@@ -4539,7 +5567,9 @@
(slime-eval-async
`(swank:arglist-for-echo-area (quote (,name)))
(lambda (arglist)
- (message "%s" arglist))))
+ (if arglist
+ (message "%s" (slime-fontify-string arglist))
+ (error "Arglist not available")))))
(defun slime-insert-arglist (name)
"Insert the argument list for NAME behind the symbol point is
@@ -4557,8 +5587,8 @@
(insert arglist))))))
(defun slime-complete-form ()
- "Complete the form at point. This is a superset of the
-functionality of `slime-insert-arglist'."
+ "Complete the form at point.
+This is a superset of the functionality of `slime-insert-arglist'."
(interactive)
;; Find the (possibly incomplete) form around point.
(let* ((start (save-excursion (backward-up-list 1) (point)))
@@ -4571,7 +5601,10 @@
(progn
(just-one-space)
(save-excursion
- (insert result)))))))
+ (insert result))
+ (save-excursion
+ (backward-up-list 1)
+ (indent-sexp)))))))
(defun slime-get-arglist (symbol-name)
"Return the argument list for SYMBOL-NAME."
@@ -4604,38 +5637,109 @@
(arg (setq slime-autodoc-mode t))
(t (setq slime-autodoc-mode (not slime-autodoc-mode))))
(if slime-autodoc-mode
- (slime-autodoc-start-timer)
+ (progn
+ (slime-autodoc-start-timer)
+ (add-hook 'pre-command-hook
+ 'slime-autodoc-pre-command-refresh-echo-area t))
(slime-autodoc-stop-timer)))
+(defvar slime-autodoc-last-message "")
+
(defun slime-autodoc ()
"Print some apropos information about the code at point, if applicable."
- (when-let (name (or (slime-autodoc-global-at-point)
- (slime-function-called-at-point/line)))
- (let ((cache-key (slime-qualify-cl-symbol-name name)))
- (or (when-let (documentation (slime-get-cached-autodoc cache-key))
- (slime-background-message "%s" documentation)
- t)
- ;; Asynchronously fetch, cache, and display documentation
- (slime-eval-async
- (if (slime-global-variable-name-p name)
- `(swank:variable-desc-for-echo-area ,name)
- `(swank:arglist-for-echo-area '(,name)))
- (with-lexical-bindings (cache-key name)
- (lambda (doc)
- (when (null doc)
- (setq doc ""))
+ (destructuring-bind (cache-key retrieve-form) (slime-autodoc-thing-at-point)
+ (let ((cached (slime-get-cached-autodoc cache-key)))
+ (if cached
+ (slime-autodoc-message cached)
+ ;; Asynchronously fetch, cache, and display documentation
+ (slime-eval-async
+ retrieve-form
+ (with-lexical-bindings (cache-key)
+ (lambda (doc)
+ (let ((doc (if doc (slime-fontify-string doc) "")))
(slime-update-autodoc-cache cache-key doc)
- (slime-background-message "%s" doc))))))))
+ (slime-autodoc-message doc)))))))))
+(defcustom slime-autodoc-use-multiline-p nil
+ "If non-nil, allow long autodoc messages to resize echo area display."
+ :type 'boolean
+ :group 'slime-ui)
+
+(defun slime-autodoc-message (doc)
+ "Display the autodoc documentation string DOC."
+ (cond
+ ((slime-typeout-active-p)
+ (setq slime-autodoc-last-message "") ; no need for refreshing
+ (slime-typeout-message doc))
+ (t
+ (unless slime-autodoc-use-multiline-p
+ (setq doc (slime-oneliner doc)))
+ (setq slime-autodoc-last-message doc)
+ (message "%s" doc))))
+
+(defun slime-autodoc-message-dimensions ()
+ "Return the available width and height for pretty printing autodoc
+messages."
+ (cond
+ ((slime-typeout-active-p)
+ ;; Use the full width of the typeout window;
+ ;; we don't care about the height, as typeout window can be scrolled
+ (values (window-width slime-typeout-window)
+ nil))
+ (slime-autodoc-use-multiline-p
+ ;; Use the full width of the minibuffer;
+ ;; minibuffer will grow vertically if necessary
+ (values (window-width (minibuffer-window))
+ nil))
+ (t
+ ;; Try to fit everything in one line; we cut off when displaying
+ (values 1000 1))))
+
+(defun slime-autodoc-pre-command-refresh-echo-area ()
+ (unless (string= slime-autodoc-last-message "")
+ (if (slime-autodoc-message-ok-p)
+ (message "%s" slime-autodoc-last-message)
+ (setq slime-autodoc-last-message ""))))
+
+(defun slime-autodoc-thing-at-point ()
+ "Return a cache key and a swank form."
+ (let ((global (slime-autodoc-global-at-point)))
+ (if global
+ (values (slime-qualify-cl-symbol-name global)
+ `(swank:variable-desc-for-echo-area ,global))
+ (multiple-value-bind (operators arg-indices)
+ (slime-enclosing-operator-names)
+ (values (mapcar* (lambda (designator arg-index)
+ (cons
+ (if (symbolp designator)
+ (slime-qualify-cl-symbol-name designator)
+ designator)
+ arg-index))
+ operators arg-indices)
+ (multiple-value-bind (width height)
+ (slime-autodoc-message-dimensions)
+ `(swank:arglist-for-echo-area ',operators
+ :arg-indices ',arg-indices
+ :print-right-margin ,width
+ :print-lines ,height)))))))
+
(defun slime-autodoc-global-at-point ()
"Return the global variable name at point, if any."
(when-let (name (slime-symbol-name-at-point))
(if (slime-global-variable-name-p name) name)))
+(defcustom slime-global-variable-name-regexp "^\\(.*:\\)?\\([*+]\\).+\\2$"
+ "Regexp used to check if a symbol name is a global variable.
+
+Default value assumes +this+ or *that* naming conventions."
+ :type 'regexp
+ :group 'slime)
+
(defun slime-global-variable-name-p (name)
"Is NAME a global variable?
Globals are recognised purely by *this-naming-convention*."
- (string-match "^\\(.*::?\\)?[*+].*[*+]$" name))
+ (and (< (length name) 80) ; avoid overflows in regexp matcher
+ (string-match slime-global-variable-name-regexp name)))
(defun slime-get-cached-autodoc (symbol-name)
"Return the cached autodoc documentation for SYMBOL-NAME, or nil."
@@ -4698,9 +5802,11 @@
(defun slime-autodoc-message-ok-p ()
"Return true if printing a message is currently okay (shouldn't
annoy the user)."
- (and slime-mode
+ (and (or slime-mode (eq major-mode 'slime-repl-mode)
+ (eq major-mode 'sldb-mode))
slime-autodoc-mode
- (null (current-message))
+ (or (null (current-message))
+ (string= (current-message) slime-autodoc-last-message))
(not executing-kbd-macro)
(not (and (boundp 'edebug-active) (symbol-value 'edebug-active)))
(not cursor-in-echo-area)
@@ -4746,6 +5852,85 @@
(slime-make-typeout-frame)))
+;;;; edit highlighting
+
+(defface slime-highlight-edits-face
+ `((((class color) (background light))
+ (:background "lightgray"))
+ (((class color) (background dark))
+ (:background "dimgray"))
+ (t (:background "yellow")))
+ "Face for displaying edit but not compiled code."
+ :group 'slime-mode-faces)
+
+(define-minor-mode slime-highlight-edits-mode
+ "Minor mode to highlight not-yet-compiled code." nil)
+
+(add-hook 'slime-highlight-edits-mode-on-hook
+ 'slime-highlight-edits-init-buffer)
+
+(add-hook 'slime-highlight-edits-mode-off-hook
+ 'slime-highlight-edits-reset-buffer)
+
+(defun slime-highlight-edits-init-buffer ()
+ (make-local-variable 'after-change-functions)
+ (add-to-list 'after-change-functions
+ 'slime-highlight-edits)
+ (add-to-list 'slime-before-compile-functions
+ 'slime-highlight-edits-compile-hook))
+
+(defun slime-highlight-edits-reset-buffer ()
+ (setq after-change-functions
+ (remove 'slime-highlight-edits after-change-functions))
+ (slime-remove-edits (point-min) (point-max)))
+
+(defun slime-highlight-edits (beg end &optional len)
+ (save-match-data
+ (when (and (slime-connected-p)
+ (not (slime-inside-comment-p beg end))
+ (not (slime-only-whitespace-p beg end)))
+ (let ((overlay (make-overlay beg end)))
+ (overlay-put overlay 'face 'slime-highlight-edits-face)
+ (overlay-put overlay 'slime-edit t)))))
+
+(defun slime-remove-edits (start end)
+ "Delete the existing Slime edit hilights in the current buffer."
+ (save-excursion
+ (goto-char start)
+ (while (< (point) end)
+ (dolist (o (overlays-at (point)))
+ (when (overlay-get o 'slime-edit)
+ (delete-overlay o)))
+ (goto-char (next-overlay-change (point))))))
+
+(defun slime-highlight-edits-compile-hook (start end)
+ (when slime-highlight-edits-mode
+ (let ((start (save-excursion (goto-char start)
+ (skip-chars-backward " \t\n\r")
+ (point)))
+ (end (save-excursion (goto-char end)
+ (skip-chars-forward " \t\n\r")
+ (point))))
+ (slime-remove-edits start end))))
+
+(defun slime-inside-comment-p (beg end)
+ "Is the region from BEG to END in a comment?"
+ (save-excursion
+ (goto-char beg)
+ (let* ((hs-c-start-regexp ";\\|#|")
+ (comment (hs-inside-comment-p)))
+ (and comment
+ (destructuring-bind (cbeg cend) comment
+ (<= end cend))))))
+
+(defun slime-only-whitespace-p (beg end)
+ "Contains the region from BEG to END only whitespace?"
+ (save-excursion
+ (goto-char beg)
+ (skip-chars-forward " \n\t\r" end)
+ (<= end (point))))
+
+
;;;; Completion
;; XXX those long names are ugly to read; long names an indicator for
@@ -4853,7 +6038,7 @@
(let* ((end (move-marker (make-marker) (slime-symbol-end-pos)))
(beg (move-marker (make-marker) (slime-symbol-start-pos)))
(prefix (buffer-substring-no-properties beg end))
- (completion-result (slime-completions prefix))
+ (completion-result (slime-contextual-completions beg end))
(completion-set (first completion-result))
(completed-prefix (second completion-result)))
(if (null completion-set)
@@ -4876,14 +6061,24 @@
(when (member completed-prefix completion-set)
(slime-minibuffer-respecting-message
"Complete but not unique"))
- (let ((unambiguous-completion-length
- (loop for c in completion-set
- minimizing (or (mismatch completed-prefix c)
- (length completed-prefix)))))
- (goto-char (+ beg unambiguous-completion-length))
- (slime-display-completion-list completion-set
- completed-prefix)
- (slime-complete-delay-restoration)))))))
+ (if (and (eq last-command this-command)
+ (slime-completion-window-active-p))
+ ;; Scroll the completions window only
+ (let ((window slime-completions-window))
+ (with-current-buffer (window-buffer window)
+ (if (pos-visible-in-window-p (point-max) window)
+ (set-window-start window (point-min) nil)
+ (let ((other-window-scroll-buffer
+ (window-buffer window)))
+ (scroll-other-window)))))
+ (let ((unambiguous-completion-length
+ (loop for c in completion-set
+ minimizing (or (mismatch completed-prefix c)
+ (length completed-prefix)))))
+ (goto-char (+ beg unambiguous-completion-length))
+ (slime-display-completion-list completion-set
+ completed-prefix)
+ (slime-complete-delay-restoration))))))))
(defun slime-complete-symbol*-fancy-bit ()
"Do fancy tricks after completing a symbol.
@@ -4937,7 +6132,9 @@
Return nil iff if point is not at filename."
(if (save-excursion (re-search-backward "\"[^ \t\n]+\\=" nil t))
(let ((comint-completion-addsuffix '("/" . "\"")))
- (comint-dynamic-complete-as-filename)
+ (if slime-when-complete-filename-expand
+ (comint-replace-by-expanded-filename)
+ (comint-dynamic-complete-as-filename))
t)
nil))
@@ -4954,6 +6151,7 @@
"Minibuffer keymap used for reading CL expressions.")
(set-keymap-parent slime-read-expression-map minibuffer-local-map)
+(set-keymap-parent slime-repl-history-map slime-read-expression-map)
(define-key slime-read-expression-map "\t" 'slime-complete-symbol)
(define-key slime-read-expression-map "\M-\t" 'slime-complete-symbol)
@@ -4961,7 +6159,7 @@
(defvar slime-read-expression-history '()
"History list of expressions read from the minibuffer.")
-(defun slime-read-from-minibuffer (prompt &optional initial-value)
+(defun slime-read-from-minibuffer (prompt &optional initial-value keymap)
"Read a string from the minibuffer, prompting with PROMPT.
If INITIAL-VALUE is non-nil, it is inserted into the minibuffer before
reading input. The result is a string (\"\" if no input was given)."
@@ -4973,7 +6171,8 @@
(setq slime-buffer-connection connection)
(set-syntax-table lisp-mode-syntax-table)))
minibuffer-setup-hook)))
- (read-from-minibuffer prompt initial-value slime-read-expression-map
+ (read-from-minibuffer prompt initial-value
+ (or keymap slime-read-expression-map)
nil 'slime-read-expression-history)))
(defun slime-bogus-completion-alist (list)
@@ -4983,12 +6182,50 @@
alist but ignores CDRs."
(mapcar (lambda (x) (cons x nil)) list))
+(defun* slime-contextual-completions (beg end)
+ "Return a list of completions of the token from BEG to END in the
+current buffer."
+ (let ((token (buffer-substring-no-properties beg end)))
+ (cond
+ ((and (< beg (point-max))
+ (string= (buffer-substring-no-properties beg (1+ beg)) ":"))
+ ;; Contextual keyword completion
+ (multiple-value-bind (operator-names arg-indices)
+ (save-excursion
+ (goto-char beg)
+ (slime-enclosing-operator-names))
+ (when operator-names
+ (let ((completions
+ (slime-completions-for-keyword operator-names token
+ arg-indices)))
+ (when (first completions)
+ (return-from slime-contextual-completions completions))
+ ;; If no matching keyword was found, do regular symbol
+ ;; completion.
+ ))))
+ ((and (> beg 2)
+ (string= (buffer-substring-no-properties (- beg 2) beg) "#\\"))
+ ;; Character name completion
+ (return-from slime-contextual-completions
+ (slime-completions-for-character token))))
+ ;; Regular symbol completion
+ (slime-completions token)))
+
(defun slime-completions (prefix)
- (slime-eval `(swank:completions ,prefix ,(slime-current-package))))
+ (slime-eval `(swank:completions ,prefix ',(slime-current-package))))
(defun slime-simple-completions (prefix)
- (slime-eval `(swank:simple-completions ,prefix ,(slime-current-package))))
+ (slime-eval `(swank:simple-completions ,prefix ',(slime-current-package))))
+(defun slime-completions-for-keyword (operator-designator prefix
+ arg-indices)
+ (slime-eval `(swank:completions-for-keyword ',operator-designator
+ ,prefix
+ ',arg-indices)))
+
+(defun slime-completions-for-character (prefix)
+ (slime-eval `(swank:completions-for-character ,prefix)))
+
;;;; Fuzzy completion
@@ -5018,6 +6255,9 @@
"The current completion object. If this is the same before and
after point moves in the completions buffer, the text is not
replaced in the target for efficiency.")
+(defvar slime-fuzzy-current-completion-overlay nil
+ "The overlay representing the current completion in the completion
+buffer. This is used to hightlight the text.")
(define-derived-mode slime-fuzzy-completions-mode
fundamental-mode "Fuzzy Completions"
@@ -5029,23 +6269,34 @@
(defvar slime-fuzzy-completions-map
(let* ((map (make-sparse-keymap)))
+ (flet ((remap (keys to)
+ (mimic-key-bindings global-map map keys to)))
+ (remap (list 'keyboard-quit (kbd "C-g")) 'slime-fuzzy-abort)
+ (define-key map "q" 'slime-fuzzy-abort)
- (define-key map "q" 'slime-fuzzy-abort)
- (define-key map "\r" 'slime-fuzzy-select)
+ (remap (list 'previous-line (kbd "<up>")) 'slime-fuzzy-prev)
+ (remap (list 'next-line (kbd "<down>")) 'slime-fuzzy-next)
- (define-key map "n" 'slime-fuzzy-next)
- (define-key map "\M-n" 'slime-fuzzy-next)
+ (define-key map "n" 'slime-fuzzy-next)
+ (define-key map "\M-n" 'slime-fuzzy-next)
- (define-key map "p" 'slime-fuzzy-prev)
- (define-key map "\M-p" 'slime-fuzzy-prev)
+ (define-key map "p" 'slime-fuzzy-prev)
+ (define-key map "\M-p" 'slime-fuzzy-prev)
- (define-key map "\d" 'scroll-down)
- (define-key map " " 'scroll-up)
+ (define-key map "\d" 'scroll-down)
+
+ (remap (list 'slime-fuzzy-indent-and-complete-symbol
+ 'slime-indent-and-complete-symbol
+ (kbd "<tab>"))
+ 'slime-fuzzy-select)
+
+ (define-key map (kbd "<mouse-2>") 'slime-fuzzy-select/mouse))
- (define-key map [mouse-2] 'slime-fuzzy-select/mouse)
+ (define-key map (kbd "RET") 'slime-fuzzy-select)
+ (define-key map (kbd "<SPC>") 'slime-fuzzy-select)
map)
- "Keymap for slime-fuzzy-completions-mode.")
+ "Keymap for slime-fuzzy-completions-mode when in the completion buffer.")
(defun slime-fuzzy-completions (prefix &optional default-package)
"Get the list of sorted completion objects from completing
@@ -5056,7 +6307,9 @@
(slime-eval `(swank:fuzzy-completions ,prefix
,(or default-package
(slime-find-buffer-package)
- (slime-current-package))))))
+ (slime-current-package))
+ :limit ,slime-fuzzy-completion-limit
+ :time-limit-in-msec ,slime-fuzzy-completion-time-limit-in-msec))))
(defun slime-fuzzy-selected (prefix completion)
"Tell the connected Lisp that the user selected completion
@@ -5066,12 +6319,29 @@
(slime-eval `(swank:fuzzy-completion-selected ,no-properties
',completion))))
+(defun slime-fuzzy-indent-and-complete-symbol ()
+ "Indent the current line and perform fuzzy symbol completion. First
+indent the line. If indenting doesn't move point, complete the
+symbol. If there's no symbol at the point, show the arglist for the
+most recently enclosed macro or function."
+ (interactive)
+ (let ((pos (point)))
+ (unless (get-text-property (line-beginning-position) 'slime-repl-prompt)
+ (lisp-indent-line))
+ (when (= pos (point))
+ (cond ((save-excursion (re-search-backward "[^() \n\t\r]+\\=" nil t))
+ (slime-fuzzy-complete-symbol))
+ ((memq (char-before) '(?\t ?\ ))
+ (slime-echo-arglist))))))
+
(defun* slime-fuzzy-complete-symbol ()
"Fuzzily completes the abbreviation at point into a symbol."
(interactive)
(when (save-excursion (re-search-backward "\"[^ \t\n]+\\=" nil t))
(return-from slime-fuzzy-complete-symbol
- (comint-dynamic-complete-as-filename)))
+ (if slime-when-complete-filename-expand
+ (comint-replace-by-expanded-filename)
+ (comint-dynamic-complete-as-filename))))
(let* ((end (move-marker (make-marker) (slime-symbol-end-pos)))
(beg (move-marker (make-marker) (slime-symbol-start-pos)))
(prefix (buffer-substring-no-properties beg end))
@@ -5080,13 +6350,14 @@
(progn (slime-minibuffer-respecting-message
"Can't find completion for \"%s\"" prefix)
(ding)
- (slime-complete-restore-window-configuration))
+ (slime-fuzzy-done))
(goto-char end)
(cond ((= (length completion-set) 1)
(insert-and-inherit (caar completion-set))
(delete-region beg end)
(goto-char (+ beg (length (caar completion-set))))
- (slime-minibuffer-respecting-message "Sole completion"))
+ (slime-minibuffer-respecting-message "Sole completion")
+ (slime-fuzzy-done))
;; Incomplete
(t
(slime-minibuffer-respecting-message "Complete but not unique")
@@ -5162,13 +6433,26 @@
`end'. This saves the window configuration before popping the
buffer so that it can possibly be restored when the user is
done."
- (setq slime-fuzzy-target-buffer (current-buffer))
- (setq slime-fuzzy-start (move-marker (make-marker) start))
- (setq slime-fuzzy-end (move-marker (make-marker) end))
- (set-marker-insertion-type slime-fuzzy-end t)
- (setq slime-fuzzy-original-text (buffer-substring start end))
- (setq slime-fuzzy-text slime-fuzzy-original-text)
- (slime-fuzzy-save-window-configuration)
+ (let ((new-completion-buffer (not slime-fuzzy-target-buffer)))
+ (when new-completion-buffer
+ (slime-fuzzy-save-window-configuration))
+ (slime-fuzzy-enable-target-buffer-completions-mode)
+ (setq slime-fuzzy-target-buffer (current-buffer))
+ (setq slime-fuzzy-start (move-marker (make-marker) start))
+ (setq slime-fuzzy-end (move-marker (make-marker) end))
+ (set-marker-insertion-type slime-fuzzy-end t)
+ (setq slime-fuzzy-original-text (buffer-substring start end))
+ (setq slime-fuzzy-text slime-fuzzy-original-text)
+ (slime-fuzzy-fill-completions-buffer completions)
+ (pop-to-buffer (slime-get-fuzzy-buffer))
+ (when new-completion-buffer
+ (add-local-hook 'kill-buffer-hook 'slime-fuzzy-abort))
+ (when slime-fuzzy-completion-in-place
+ ;; switch back to the original buffer
+ (switch-to-buffer-other-window slime-fuzzy-target-buffer))))
+
+(defun slime-fuzzy-fill-completions-buffer (completions)
+ "Erases and fills the completion buffer with the given completions."
(with-current-buffer (slime-get-fuzzy-buffer)
(setq buffer-read-only nil)
(erase-buffer)
@@ -5188,12 +6472,21 @@
(setq buffer-read-only t))
(setq slime-fuzzy-current-completion
(caar completions))
- (slime-fuzzy-insert (caar completions))
- (goto-char slime-fuzzy-first)
- (pop-to-buffer (current-buffer))
- (add-hook (make-local-variable 'post-command-hook)
- 'slime-fuzzy-post-command-hook)))
+ (goto-char 0)
+ (slime-fuzzy-next)))
+(defun slime-fuzzy-enable-target-buffer-completions-mode ()
+ "Store the target buffer's local map, so that we can restore it."
+ (unless slime-fuzzy-target-buffer-completions-mode
+; (slime-log-event "Enabling target buffer completions mode")
+ (slime-fuzzy-target-buffer-completions-mode 1)))
+
+(defun slime-fuzzy-disable-target-buffer-completions-mode ()
+ "Restores the target buffer's local map when completion is finished."
+ (when slime-fuzzy-target-buffer-completions-mode
+; (slime-log-event "Disabling target buffer completions mode")
+ (slime-fuzzy-target-buffer-completions-mode 0)))
+
(defun slime-fuzzy-insert-from-point ()
"Inserts the completion that is under point in the completions
buffer into the target buffer. If the completion in question had
@@ -5224,23 +6517,43 @@
"Moves point directly to the next completion in the completions
buffer."
(interactive)
- (goto-char
- (next-single-char-property-change (point) 'completion)))
+ (with-current-buffer (slime-get-fuzzy-buffer)
+ (slime-fuzzy-dehighlight-current-completion)
+ (let ((point (next-single-char-property-change (point) 'completion)))
+ (when (= point (point-max))
+ (setf point (previous-single-char-property-change (point-max) 'completion nil slime-fuzzy-first)))
+ (set-window-point (get-buffer-window (current-buffer)) point)
+ (goto-char point))
+ (slime-fuzzy-highlight-current-completion)))
(defun slime-fuzzy-prev ()
"Moves point directly to the previous completion in the
completions buffer."
(interactive)
- (goto-char (previous-single-char-property-change
- (point) 'completion
- nil slime-fuzzy-first)))
+ (with-current-buffer (slime-get-fuzzy-buffer)
+ (slime-fuzzy-dehighlight-current-completion)
+ (let ((point (previous-single-char-property-change (point) 'completion nil slime-fuzzy-first)))
+ (set-window-point (get-buffer-window (current-buffer)) point)
+ (goto-char point))
+ (slime-fuzzy-highlight-current-completion)))
+(defun slime-fuzzy-dehighlight-current-completion ()
+ "Restores the original face for the current completion."
+ (when slime-fuzzy-current-completion-overlay
+ (overlay-put slime-fuzzy-current-completion-overlay 'face 'nil)))
+
+(defun slime-fuzzy-highlight-current-completion ()
+ "Highlights the current completion, so that the user can see it on the screen."
+ (let ((pos (point)))
+ (setq slime-fuzzy-current-completion-overlay (make-overlay (point) (search-forward " ") (current-buffer) t nil))
+ (overlay-put slime-fuzzy-current-completion-overlay 'face 'secondary-selection)
+ (goto-char pos)))
+
(defun slime-fuzzy-abort ()
"Aborts the completion process, setting the completions slot in
the target buffer back to its original contents."
(interactive)
(when slime-fuzzy-target-buffer
- (slime-fuzzy-insert slime-fuzzy-original-text)
(slime-fuzzy-done)))
(defun slime-fuzzy-select ()
@@ -5257,6 +6570,36 @@
completion)
(slime-fuzzy-done))))))
+(defun slime-fuzzy-select-or-update-completions ()
+ "If there were no changes since the last time fuzzy completion was started
+this function will select the current completion. Otherwise refreshes the completion
+list based on the changes made."
+ (interactive)
+; (slime-log-event "Selecting or updating completions")
+ (if (string-equal slime-fuzzy-original-text
+ (buffer-substring slime-fuzzy-start
+ slime-fuzzy-end))
+ (slime-fuzzy-select)
+ (slime-fuzzy-complete-symbol)))
+
+(defun slime-fuzzy-process-event-in-completions-buffer ()
+ "Simply processes the event in the target buffer"
+ (interactive)
+ (with-current-buffer (slime-get-fuzzy-buffer)
+ (push last-input-event unread-command-events)))
+
+(defun slime-fuzzy-select-and-process-event-in-target-buffer ()
+ "Selects the current completion, making sure that it is inserted
+into the target buffer and processes the event in the target buffer."
+ (interactive)
+; (slime-log-event "Selecting and processing event in target buffer")
+ (when slime-fuzzy-target-buffer
+ (let ((buff slime-fuzzy-target-buffer))
+ (slime-fuzzy-select)
+ (with-current-buffer buff
+ (slime-fuzzy-disable-target-buffer-completions-mode)
+ (push last-input-event unread-command-events)))))
+
(defun slime-fuzzy-select/mouse (event)
"Handle a mouse-2 click on a completion choice as if point were
on the completion choice and the slime-fuzzy-select command was
@@ -5274,18 +6617,18 @@
and attempts to restore the window configuration. If this fails,
it just burys the completions buffer and leaves the window
configuration alone."
- (set-buffer slime-fuzzy-target-buffer)
- (remove-hook 'post-command-hook
- 'slime-fuzzy-post-command-hook)
- (if (slime-fuzzy-maybe-restore-window-configuration)
- (bury-buffer (slime-get-fuzzy-buffer))
- ;; We couldn't restore the windows, so just bury the fuzzy
- ;; completions buffer and let something else fill it in.
- (pop-to-buffer (slime-get-fuzzy-buffer))
- (bury-buffer))
- (pop-to-buffer slime-fuzzy-target-buffer)
- (goto-char slime-fuzzy-end)
- (setq slime-fuzzy-target-buffer nil))
+ (when slime-fuzzy-target-buffer
+ (set-buffer slime-fuzzy-target-buffer)
+ (slime-fuzzy-disable-target-buffer-completions-mode)
+ (if (slime-fuzzy-maybe-restore-window-configuration)
+ (bury-buffer (slime-get-fuzzy-buffer))
+ ;; We couldn't restore the windows, so just bury the fuzzy
+ ;; completions buffer and let something else fill it in.
+ (pop-to-buffer (slime-get-fuzzy-buffer))
+ (bury-buffer))
+ (pop-to-buffer slime-fuzzy-target-buffer)
+ (goto-char slime-fuzzy-end)
+ (setq slime-fuzzy-target-buffer nil)))
(defun slime-fuzzy-save-window-configuration ()
"Saves the current window configuration, and (if the
@@ -5354,36 +6697,51 @@
dspec location)
(defun slime-edit-definition (name &optional where)
- "Lookup the definition of the symbol at point.
-If there's no symbol at point, or a prefix argument is given, then the
+ "Lookup the definition of the name at point.
+If there's no name at point, or a prefix argument is given, then the
function name is prompted."
- (interactive (list (slime-read-symbol-name "Symbol: ")))
+ (interactive (list (slime-read-symbol-name "Name: ")))
(let ((definitions (slime-eval `(swank:find-definitions-for-emacs ,name))))
- (if (null definitions)
- (if slime-edit-definition-fallback-function
- (funcall slime-edit-definition-fallback-function name)
- (error "No known definition for: %s" name))
- (slime-goto-definition name definitions where))))
+ (cond
+ ((null definitions)
+ (if slime-edit-definition-fallback-function
+ (funcall slime-edit-definition-fallback-function name)
+ (error "No known definition for: %s" name)))
+ ((and (consp definitions) (null (cdr definitions))
+ (eql (car (slime-definition.location (car definitions))) :error))
+ (if slime-edit-definition-fallback-function
+ (funcall slime-edit-definition-fallback-function name)
+ (error "%s" (cadr (slime-definition.location (car definitions))))))
+ (t
+ (slime-goto-definition name definitions where)))))
(defun slime-goto-definition (name definitions &optional where)
(slime-push-definition-stack)
- (if (slime-length> definitions 1)
- (slime-show-definitions name definitions)
- (let ((def (car definitions)))
- (destructure-case (slime-definition.location def)
- ;; Take care of errors before switching any windows/buffers.
- ((:error message)
- (error "%s" message))
- (t
- (cond ((equal where 'window)
- (slime-goto-definition-other-window (car definitions)))
- ((equal where 'frame)
- (let ((pop-up-frames t))
- (slime-goto-definition-other-window (car definitions))))
- (t
- (slime-goto-source-location (slime-definition.location
- (car definitions)))
- (switch-to-buffer (current-buffer)))))))))
+ (let ((all-locations-equal
+ (or (null definitions)
+ (let ((first-location (slime-definition.location (first definitions))))
+ (every (lambda (definition)
+ (equal (slime-definition.location definition)
+ first-location))
+ (rest definitions))))))
+ (if (and (slime-length> definitions 1)
+ (not all-locations-equal))
+ (slime-show-definitions name definitions)
+ (let ((def (car definitions)))
+ (destructure-case (slime-definition.location def)
+ ;; Take care of errors before switching any windows/buffers.
+ ((:error message)
+ (error "%s" message))
+ (t
+ (cond ((equal where 'window)
+ (slime-goto-definition-other-window (car definitions)))
+ ((equal where 'frame)
+ (let ((pop-up-frames t))
+ (slime-goto-definition-other-window (car definitions))))
+ (t
+ (slime-goto-source-location (slime-definition.location
+ (car definitions)))
+ (switch-to-buffer (current-buffer))))))))))
(defun slime-goto-definition-other-window (definition)
(slime-pop-to-other-window)
@@ -5452,9 +6810,9 @@
(save-excursion
(save-match-data
(when (and (buffer-file-name)
- (slime-connected-p))
- (let ((filename (slime-to-lisp-filename (buffer-file-name))))
- (slime-eval-async `(swank:buffer-first-change ,filename)))))))
+ (slime-background-activities-enabled-p))
+ (let ((filename (slime-to-lisp-filename (buffer-file-name))))
+ (slime-eval-async `(swank:buffer-first-change ,filename)))))))
(defun slime-setup-first-change-hook ()
(add-hook (make-local-variable 'first-change-hook)
@@ -5465,24 +6823,32 @@
;;;; Eval for Lisp
-(defun slime-eval-for-lisp (thread tag fun args)
+(defun slime-eval-for-lisp (thread tag form-string)
(let ((ok nil)
(value nil)
(c (slime-connection)))
- (unwind-protect (progn
- (setq value (apply fun args))
+ (unwind-protect (progn
+ (slime-check-eval-in-emacs-enabled)
+ (setq value (eval (read form-string)))
(setq ok t))
(let ((result (if ok `(:ok ,value) `(:abort))))
- (slime-dispatch-event `(:emacs-return ,thread ,tag ,result))))))
+ (slime-dispatch-event `(:emacs-return ,thread ,tag ,result) c)))))
+(defun slime-check-eval-in-emacs-enabled ()
+ "Raise an error if `slime-enable-evaluate-in-emacs' isn't true."
+ (unless slime-enable-evaluate-in-emacs
+ (error "eval-in-emacs not enabled")))
+
;;;; `ED'
(defvar slime-ed-frame nil
"The frame used by `slime-ed'.")
-(defvar slime-ed-use-dedicated-frame t
- "*When non-nil, `slime-ed' will create and reuse a dedicated frame.")
+(defcustom slime-ed-use-dedicated-frame t
+ "*When non-nil, `slime-ed' will create and reuse a dedicated frame."
+ :type 'boolean
+ :group 'slime-mode)
(defun slime-ed (what)
"Edit WHAT.
@@ -5490,10 +6856,11 @@
WHAT can be:
A filename (string),
A list (FILENAME LINE [COLUMN]),
- A function name (symbol),
+ A list (FILENAME :charpos CHARPOS),
+ A function name (symbol or cons),
nil.
-This for use in the implementation of COMMON-LISP:ED."
+This is for use in the implementation of COMMON-LISP:ED."
;; Without `save-excursion' very strange things happen if you call
;; (swank:ed-in-emacs X) from the REPL. -luke (18/Jan/2004)
(save-excursion
@@ -5503,18 +6870,24 @@
(select-frame slime-ed-frame))
(cond ((stringp what)
(find-file (slime-from-lisp-filename what)))
- ((listp what)
+ ((and (consp what) (stringp (first what)))
(find-file (first (slime-from-lisp-filename what)))
- (goto-line (second what))
- ;; Find the correct column, without going past the end of
- ;; the line.
- (let ((col (third what)))
- (while (and col
- (< (point) (point-at-eol))
- (/= (decf col) -1))
- (forward-char 1))))
+ (cond
+ ((eql (second what) :charpos)
+ (goto-char (third what)))
+ (t
+ (goto-line (second what))
+ ;; Find the correct column, without going past the end of
+ ;; the line.
+ (let ((col (third what)))
+ (while (and col
+ (< (point) (point-at-eol))
+ (/= (decf col) -1))
+ (forward-char 1))))))
((and what (symbolp what))
(slime-edit-definition (symbol-name what)))
+ ((consp what)
+ (slime-edit-definition (prin1-to-string what)))
(t nil)))) ; nothing in particular
@@ -5545,19 +6918,20 @@
(destructuring-bind (output value) result
(insert output value)))))))
-(defun slime-eval-with-transcript (form &optional fn wait)
+(defun slime-eval-with-transcript (form &optional fn)
"Send FROM and PACKAGE to Lisp and pass the result to FN.
Display the result in the message area, if FN is nil.
Show the output buffer if the evaluation causes any output."
(with-current-buffer (slime-output-buffer)
- (slime-with-output-end-mark (slime-mark-output-start)))
+ (slime-with-output-end-mark
+ (slime-mark-output-start)))
(with-lexical-bindings (fn)
(slime-eval-async form
(lambda (value)
(with-current-buffer (slime-output-buffer)
+ (slime-show-last-output)
(cond (fn (funcall fn value))
- (t (message "%s" value)))
- (slime-show-last-output))))))
+ (t (message "%s" value))))))))
(defun slime-eval-describe (form)
"Evaluate FORM in Lisp and display the result in a new buffer."
@@ -5594,8 +6968,9 @@
window))))))
(defun slime-last-expression ()
- (buffer-substring-no-properties (save-excursion (backward-sexp) (point))
- (point)))
+ (slime-buffer-substring-with-reified-output
+ (save-excursion (backward-sexp) (point))
+ (point)))
(defun slime-eval-last-expression ()
"Evaluate the expression preceding point."
@@ -5649,6 +7024,21 @@
(insert "\n")
(slime-eval-print string))
+(defun slime-call-defun ()
+ (interactive)
+ "Insert a call to the function defined around point into the REPL."
+ (let ((toplevel (slime-parse-toplevel-form)))
+ (unless (and (consp toplevel)
+ (member (car toplevel) '(:defun :defmethod :defgeneric))
+ (symbolp (cadr toplevel)))
+ (error "Not in a function definition"))
+ (let* ((symbol (cadr toplevel))
+ (function-call
+ (format "(%s " (slime-qualify-cl-symbol-name symbol))))
+ (slime-switch-to-output-buffer)
+ (goto-char slime-repl-input-start-mark)
+ (insert function-call))))
+
;;;; Edit Lisp value
;;;
(defun slime-edit-value (form-string)
@@ -5711,7 +7101,7 @@
(defun slime-toggle-trace-fdefinition (&optional using-context-p)
"Toggle trace."
- (interactive "P")
+ (interactive "p")
(let ((spec (if using-context-p
(slime-extract-context)
(slime-symbol-at-point))))
@@ -5820,18 +7210,18 @@
"A helper function to determine the current context.
The pattern can have the form:
pattern ::= () ;matches always
- | (*) ;matches insde a list
+ | (*) ;matches inside a list
| (<symbol> <pattern>) ;matches if the first element in
- ; current the list is <symbol> and
+ ; the current list is <symbol> and
; if <pattern> matches.
- | ((<pattern>)) ;matches if are in a nested list."
+ | ((<pattern>)) ;matches if we are in a nested list."
(save-excursion
(let ((path (reverse (slime-pattern-path pattern))))
(loop for p in path
always (ignore-errors
(etypecase p
(symbol (slime-beginning-of-list)
- (looking-at (symbol-name p)))
+ (eq (read (current-buffer)) p))
(number (backward-up-list p)
t)))))))
@@ -5887,12 +7277,13 @@
(interactive (list
(read-file-name "Load file: " nil nil
nil (if (buffer-file-name)
- (file-name-sans-extension
- (file-name-nondirectory
- (buffer-file-name)))))))
+ (file-name-nondirectory
+ (buffer-file-name))))))
(let ((lisp-filename (slime-to-lisp-filename (expand-file-name filename))))
(slime-eval-with-transcript `(swank:load-file ,lisp-filename))))
+
+
;;;; Profiling
@@ -5944,20 +7335,26 @@
(defun slime-hyperspec-lookup (symbol-name)
"A wrapper for `hyperspec-lookup'"
- (interactive (list (let ((symbol-at-point (slime-symbol-name-at-point)))
- (if (and symbol-at-point
- (intern-soft (downcase symbol-at-point)
+ (interactive (list (let* ((symbol-at-point (slime-symbol-name-at-point))
+ (stripped-symbol
+ (and symbol-at-point
+ (downcase
+ (common-lisp-hyperspec-strip-cl-package
+ symbol-at-point)))))
+ (if (and stripped-symbol
+ (intern-soft stripped-symbol
common-lisp-hyperspec-symbols))
- symbol-at-point
+ stripped-symbol
(completing-read
"Look up symbol in Common Lisp HyperSpec: "
common-lisp-hyperspec-symbols #'boundp
- t symbol-at-point
+ t stripped-symbol
'common-lisp-hyperspec-history)))))
(hyperspec-lookup symbol-name))
(defun slime-show-description (string package)
- (slime-with-output-to-temp-buffer ("*SLIME Description*") package (princ string)))
+ (slime-with-output-to-temp-buffer ("*SLIME Description*")
+ package (princ string)))
(defun slime-describe-symbol (symbol-name)
"Describe the symbol at point."
@@ -6002,7 +7399,7 @@
(let ((buffer-package (or package (slime-current-package))))
(slime-eval-async
`(swank:apropos-list-for-emacs ,string ,only-external-p
- ,case-sensitive-p ,package)
+ ,case-sensitive-p ',package)
(lexical-let ((string string)
(package buffer-package)
(summary (slime-apropos-summary string case-sensitive-p
@@ -6025,7 +7422,7 @@
(defun slime-show-apropos (plists string package summary)
(if (null plists)
(message "No apropos matches for %S" string)
- (slime-with-output-to-temp-buffer ("*SLIME Apropos*" apropos-mode) package
+ (slime-with-output-to-temp-buffer ("*SLIME Apropos*" :mode apropos-mode) package
(set-syntax-table lisp-mode-syntax-table)
(slime-mode t)
(if (boundp 'header-line-format)
@@ -6060,6 +7457,8 @@
in '((:variable "Variable")
(:function "Function")
(:generic-function "Generic Function")
+ (:macro "Macro")
+ (:special-operator "Special Operator")
(:setf "Setf")
(:type "Type")
(:class "Class")
@@ -6067,6 +7466,7 @@
(:alien-struct "Alien struct")
(:alien-union "Alien type")
(:alien-enum "Alien enum"))
+ ;; Properties not listed here will not show up in the buffer
do
(let ((value (plist-get plist prop))
(start (point)))
@@ -6155,14 +7555,12 @@
(defmacro* slime-with-xref-buffer ((package ref-type symbol) &body body)
"Execute BODY in a xref buffer, then show that buffer."
- (let ((type (gensym))
- (sym (gensym)))
- `(let ((,type ,ref-type)
- (,sym ,symbol))
+ (let ((type (gensym)) (sym (gensym)) (pkg (gensym)))
+ `(let ((,type ,ref-type) (,sym ,symbol) (,pkg ,package))
(with-current-buffer (get-buffer-create
(format "*XREF[%s: %s]*" ,type ,sym))
(prog2 (progn
- (slime-init-xref-buffer ,package ,type ,sym)
+ (slime-init-xref-buffer ,pkg ,type ,sym)
(make-local-variable 'slime-xref-saved-window-configuration)
(setq slime-xref-saved-window-configuration
(current-window-configuration)))
@@ -6182,11 +7580,17 @@
(loop for (group . refs) in xrefs do
(progn
(slime-insert-propertized '(face bold) group "\n")
- (loop for (label . location) in refs do
- (slime-insert-propertized
+ (loop
+ for (label . location) in refs
+ do (slime-insert-propertized
(list 'slime-location location
'face 'font-lock-keyword-face)
- " " (slime-one-line-ify label) "\n"))))
+ " " (slime-one-line-ify label))
+ do (insert " - " (if (and (eql :location (car location))
+ (assoc :file (cdr location)))
+ (second (assoc :file (cdr location)))
+ "file unknown")
+ "\n"))))
;; Remove the final newline to prevent accidental window-scrolling
(backward-char 1)
(delete-char 1))
@@ -6325,14 +7729,80 @@
(let ((buffer (current-buffer)))
(delete-windows-on buffer)
(kill-buffer buffer)))
-
+
;;;; Macroexpansion
-(defun slime-eval-macroexpand (expander)
- (let ((string (slime-sexp-at-point)))
- (slime-eval-describe `(,expander ,string))))
+(define-minor-mode slime-macroexpansion-minor-mode
+ "SLIME mode for macroexpansion"
+ nil
+ " temp"
+ '(("q" . slime-temp-buffer-quit)
+ ("g" . slime-macroexpand-again)))
+(flet ((remap (from to)
+ (dolist (mapping (where-is-internal from slime-mode-map))
+ (define-key slime-macroexpansion-minor-mode-map mapping to))))
+ (remap 'slime-macroexpand-1 'slime-macroexpand-1-inplace)
+ (remap 'slime-macroexpand-all 'slime-macroexpand-all-inplace)
+ (remap 'undo '(lambda (&optional arg)
+ (interactive)
+ (let ((buffer-read-only nil))
+ (when slime-use-highlight-edits-mode
+ (slime-remove-edits (point-min) (point-max)))
+ (undo arg)))))
+
+(defvar slime-eval-macroexpand-expression nil
+ "Specifies the last macroexpansion preformed. This variable
+ specifies both what was expanded and how.")
+
+(defun slime-eval-macroexpand (expander &optional string)
+ (unless string
+ (setf string (slime-sexp-at-point-or-error)))
+ (setf slime-eval-macroexpand-expression `(,expander ,string))
+ (lexical-let ((package (slime-current-package)))
+ (slime-eval-async
+ slime-eval-macroexpand-expression
+ (lambda (expansion)
+ (slime-with-output-to-temp-buffer
+ ;; reusep for preserving `undo' functionality.
+ ("*SLIME macroexpansion*" :mode lisp-mode :reusep t) package
+ (slime-macroexpansion-minor-mode)
+ (erase-buffer)
+ (insert expansion)
+ (font-lock-fontify-buffer))))))
+
+(defun slime-eval-macroexpand-inplace (expander)
+ "Substitutes the current sexp at place with its macroexpansion.
+
+NB: Does not affect *slime-eval-macroexpand-expression*"
+ (interactive)
+ (lexical-let* ((string (slime-sexp-at-point-or-error))
+ (bounds (bounds-of-thing-at-point 'sexp))
+ (start (car bounds))
+ (end (cdr bounds))
+ (point (point))
+ (package (slime-current-package))
+ (buffer (current-buffer)))
+ ;; SLIME-SEXP-AT-POINT returns "'(FOO BAR BAZ)" even when point is
+ ;; placed at the opening parenthesis, which wouldn't get expanded
+ ;; even though FOO was a macro. Hence this workaround:
+ (when (and (eq ?\' (elt string 0)) (eq ?\( (elt string 1)))
+ (setf string (substring string 1)) (incf start))
+ (slime-eval-async
+ `(,expander ,string)
+ (lambda (expansion)
+ (with-current-buffer buffer
+ (let ((buffer-read-only nil))
+ (when slime-use-highlight-edits-mode
+ (slime-remove-edits (point-min) (point-max)))
+ (goto-char start)
+ (delete-region start end)
+ (insert expansion)
+ (goto-char start)
+ (indent-sexp)
+ (goto-char point)))))))
+
(defun slime-macroexpand-1 (&optional repeatedly)
"Display the macro expansion of the form at point. The form is
expanded with CL:MACROEXPAND-1 or, if a prefix argument is given, with
@@ -6341,18 +7811,45 @@
(slime-eval-macroexpand
(if repeatedly 'swank:swank-macroexpand 'swank:swank-macroexpand-1)))
+(defun slime-macroexpand-1-inplace (&optional repeatedly)
+ (interactive "P")
+ (slime-eval-macroexpand-inplace
+ (if repeatedly 'swank:swank-macroexpand 'swank:swank-macroexpand-1)))
+
(defun slime-macroexpand-all ()
"Display the recursively macro expanded sexp at point."
(interactive)
(slime-eval-macroexpand 'swank:swank-macroexpand-all))
+(defun slime-macroexpand-all-inplace ()
+ "Display the recursively macro expanded sexp at point."
+ (interactive)
+ (slime-eval-macroexpand-inplace 'swank:swank-macroexpand-all))
+
+(defun slime-compiler-macroexpand ()
+ "Display the compiler-macro expansion of sexp at point."
+ (interactive)
+ (slime-eval-macroexpand 'swank:swank-compiler-macroexpand))
+
+(defun slime-compiler-macroexpand-1 ()
+ "Display the compiler-macro expansion of sexp at point."
+ (interactive)
+ (slime-eval-macroexpand 'swank:swank-compiler-macroexpand-1))
+
+(defun slime-macroexpand-again ()
+ "Reperform the last macroexpansion."
+ (interactive)
+ (slime-eval-macroexpand (first slime-eval-macroexpand-expression)
+ (second slime-eval-macroexpand-expression)))
+
;;;; Subprocess control
(defun slime-interrupt ()
"Interrupt Lisp."
(interactive)
- (slime-dispatch-event `(:emacs-interrupt ,slime-current-thread)))
+ (cond ((slime-use-sigint-for-interrupt) (slime-send-sigint))
+ (t (slime-dispatch-event `(:emacs-interrupt ,slime-current-thread)))))
(defun slime-quit ()
(error "Not implemented properly. Use `slime-interrupt' instead."))
@@ -6362,6 +7859,7 @@
(interactive)
(slime-eval-async '(swank:quit-lisp))
(kill-buffer (slime-output-buffer))
+ (set-process-filter (slime-connection) nil)
(set-process-sentinel (slime-connection) 'slime-quit-sentinel))
(defun slime-quit-sentinel (process message)
@@ -6371,7 +7869,6 @@
(when inferior (delete-process inferior))
(when inferior-buffer (kill-buffer inferior-buffer))
(slime-net-close process)
- (slime-set-state "[not connected]" process)
(message "Connection closed.")))
(defun slime-set-package (package)
@@ -6380,7 +7877,7 @@
(message "*package*: %s" (slime-eval `(swank:set-package ,package))))
(defun slime-set-default-directory (directory)
- "Make DIRECTION become Lisp's current directory."
+ "Make DIRECTORY become Lisp's current directory."
(interactive (list (read-directory-name "Directory: " nil nil t)))
(message "default-directory: %s"
(slime-from-lisp-filename
@@ -6461,6 +7958,19 @@
;;;;; sldb-mode
+(defvar sldb-mode-syntax-table
+ (let ((table (copy-syntax-table lisp-mode-syntax-table)))
+ ;; We give < and > parenthesis syntax, so that #< ... > is treated
+ ;; as a balanced expression. This enables autodoc-mode to match
+ ;; #<unreadable> actual arguments in the backtraces with formal
+ ;; arguments of the function. (For Lisp mode, this is not
+ ;; desirable, since we do not wish to get a mismatched paren
+ ;; highlighted everytime we type < or >.)
+ (modify-syntax-entry ?< "(" table)
+ (modify-syntax-entry ?> ")" table)
+ table)
+ "Syntax table for SLDB mode.")
+
(define-derived-mode sldb-mode fundamental-mode "sldb"
"Superior lisp debugger mode. In addition to ordinary SLIME commands,
the following are available:\\<sldb-mode-map>
@@ -6497,12 +8007,13 @@
\\{sldb-mode-map}"
(erase-buffer)
- (set-syntax-table lisp-mode-syntax-table)
+ (set-syntax-table sldb-mode-syntax-table)
(slime-set-truncate-lines)
+ (when slime-use-autodoc-mode
+ (slime-autodoc-mode 1))
;; Make original slime-connection "sticky" for SLDB commands in this buffer
(setq slime-buffer-connection (slime-connection))
- (make-local-variable 'kill-buffer-hook)
- (add-hook 'kill-buffer-hook 'sldb-delete-overlays))
+ (add-local-hook 'kill-buffer-hook 'sldb-delete-overlays))
(defun sldb-help-summary ()
"Show summary of important sldb commands"
@@ -6550,6 +8061,8 @@
("R" 'sldb-return-from-frame)
("c" 'sldb-continue)
("s" 'sldb-step)
+ ("x" 'sldb-next)
+ ("o" 'sldb-out)
("b" 'sldb-break-on-return)
("a" 'sldb-abort)
("q" 'sldb-quit)
@@ -6662,12 +8175,13 @@
(recursive-edit)))))
(defun sldb-activate (thread level)
- (with-current-buffer (sldb-find-buffer thread)
- (unless (equal sldb-level level)
- (with-lexical-bindings (thread level)
- (slime-eval-async `(swank:debugger-info-for-emacs 0 1)
- (lambda (result)
- (apply #'sldb-setup thread level result)))))))
+ (unless (let ((b (sldb-find-buffer thread)))
+ (and b (with-current-buffer b (equal sldb-level level))))
+ (slime-rex (thread level)
+ ('(swank:debugger-info-for-emacs 0 10)
+ nil thread)
+ ((:ok result)
+ (apply #'sldb-setup thread level result)))))
(defun sldb-exit (thread level &optional stepping)
(when-let (sldb (sldb-find-buffer thread))
@@ -6682,6 +8196,9 @@
(defun sldb-insert-condition (condition)
(destructuring-bind (message type references extras) condition
+ (when (> (length message) 70)
+ (add-text-properties 0 (length message) (list 'help-echo message)
+ message))
(slime-insert-propertized '(sldb-default-action sldb-inspect-condition)
(in-sldb-face topline message)
"\n"
@@ -6928,9 +8445,9 @@
(let ((start (or start (point)))
(end (or end (save-excursion (ignore-errors (forward-sexp)) (point)))))
(push (make-overlay start (1+ start)) sldb-overlays)
- (push (make-overlay (1- end) end) sldb-overlays)
- (dolist (overlay sldb-overlays)
- (overlay-put overlay 'face 'secondary-selection))))
+ (push (make-overlay (1- end) end) sldb-overlays))
+ (dolist (overlay sldb-overlays)
+ (overlay-put overlay 'face 'secondary-selection)))
(defun sldb-toggle-details (&optional on)
@@ -6966,19 +8483,13 @@
(sldb-insert-locals frame-number indent2)
(when sldb-show-catch-tags
(let ((catchers (sldb-catch-tags frame-number)))
- (cond ((null catchers)
- (insert indent1
- (in-sldb-face catch-tag "[No catch-tags]\n")))
- (t
- (insert indent1 "Catch-tags:\n")
- (dolist (tag catchers)
- (slime-insert-propertized
- '(catch-tag ,tag)
- indent2 (in-sldb-face catch-tag
- (format "%s\n" tag))))))))
-
- (unless sldb-enable-styled-backtrace (terpri))
- (point)))))
+ (when catchers
+ (insert indent1 "Catch-tags:\n")
+ (dolist (tag catchers)
+ (slime-insert-propertized
+ '(catch-tag ,tag)
+ indent2
+ (in-sldb-face catch-tag (format "%s\n" tag)))))))))))
(apply #'sldb-maybe-recenter-region (sldb-frame-region)))
(defun sldb-frame-region ()
@@ -7015,7 +8526,7 @@
(let* ((number (sldb-frame-number-at-point)))
(slime-eval-async `(swank:eval-string-in-frame ,string ,number)
(if current-prefix-arg
- 'slime-output-string
+ 'slime-write-string
'slime-display-eval-result))))
(defun sldb-pprint-eval-in-frame (string)
@@ -7028,9 +8539,8 @@
(defun sldb-inspect-in-frame (string)
"Prompt for an expression and inspect it in the selected frame."
- (interactive (list (slime-read-from-minibuffer
- "Inspect in frame (evaluated): "
- (slime-sexp-at-point))))
+ (interactive (list (slime-read-object
+ "Inspect in frame (evaluated): ")))
(let ((number (sldb-frame-number-at-point)))
(slime-eval-async `(swank:inspect-in-frame ,string ,number)
'slime-open-inspector)))
@@ -7095,7 +8605,10 @@
(insert prefix (in-sldb-face local-name name))
(unless (zerop id)
(insert (in-sldb-face local-name (format "#%d" id))))
- (insert " = " (in-sldb-face local-value value)))
+ (insert " = ")
+ (slime-insert-presentation
+ (in-sldb-face local-value value)
+ `(:frame-var ,frame ,i)))
(insert "\n"))))
(defun sldb-inspect-var ()
@@ -7194,6 +8707,18 @@
(let ((frame (sldb-frame-number-at-point)))
(slime-eval-async `(swank:sldb-step ,frame))))
+(defun sldb-next ()
+ "Select the \"continue\" restart and set a new break point."
+ (interactive)
+ (let ((frame (sldb-frame-number-at-point)))
+ (slime-eval-async `(swank:sldb-next ,frame))))
+
+(defun sldb-out ()
+ "Select the \"continue\" restart and set a new break point."
+ (interactive)
+ (let ((frame (sldb-frame-number-at-point)))
+ (slime-eval-async `(swank:sldb-out ,frame))))
+
(defun sldb-break-on-return ()
"Set a breakpoint at the current frame.
The debugger is entered when the frame exits."
@@ -7242,7 +8767,7 @@
(interactive)
(when (null sldb-condition)
(error "No condition known (wrong buffer?)"))
- (slime-output-string (format "%s\n%s\n"
+ (slime-write-string (format "%s\n%s\n"
(first sldb-condition)
(second sldb-condition))))
@@ -7270,7 +8795,7 @@
(slime-propertize-region `(thread-id ,idx)
(insert (format "%3s: " id))
(slime-insert-propertized '(face bold) name)
- (insert-char ?\040 (- 30 (current-column)))
+ (insert-char ?\ (- 30 (current-column)))
(let ((summary-start (point)))
(insert " " summary)
(unless (bolp) (insert "\n"))
@@ -7296,6 +8821,7 @@
(defun slime-thread-quit ()
(interactive)
+ (slime-eval-async `(swank:quit-thread-browser))
(kill-buffer (current-buffer)))
(defun slime-thread-kill ()
@@ -7319,37 +8845,27 @@
;;;;; Connection listing
-(defvar slime-registered-lisp-implementations ())
+(defvar slime-lisp-implementations nil
+ "*A list of known Lisp implementations.
+The list should have the form:
+ ((NAME (PROGRAM PROGRAM-ARGS...) &key INIT CODING-SYSTEM) ...)
-(defun slime-register-lisp-implementation (name command)
- (interactive "sName: \nfCommand: ")
- (let ((cons (assoc name slime-registered-lisp-implementations)))
- (if cons
- (setf (cdr cons) command)
- (push (cons name command) slime-registered-lisp-implementations)))
- (if (string= inferior-lisp-program "lisp")
- (slime-select-lisp-implementation name)))
+NAME is a symbol for the implementation.
+PROGRAM and PROGRAM-ARGS are strings used to start the Lisp process.
+INIT is a function that should return a string to load and start
+ Swank. The function will be called with the PORT-FILENAME and ENCODING as
+ arguments. INIT defaults to `slime-init-command'.
+CODING-SYSTEM a symbol for the coding system. The default is
+ slime-net-coding-system
-(defun slime-select-lisp-implementation (name)
- (interactive "sName: ")
- (setq inferior-lisp-program
- (cdr (assoc name slime-registered-lisp-implementations))))
+Here's an example:
+ ((cmucl (\"/opt/cmucl/bin/lisp\" \"-quiet\") :init slime-init-command)
+ (acl (\"acl7\") :coding-system emacs-mule))")
-(defun slime-find-lisp-implementation (name)
- (let ((cons (or (assoc name slime-registered-lisp-implementations)
- (rassoc name slime-registered-lisp-implementations))))
- (if cons (cdr cons) name)))
+(defvar slime-default-lisp nil
+ "*The name of the default Lisp implementation.
+See `slime-lisp-implementations'")
-;; XXX: unused function
-(defun slime-find-lisp-implementation-name (command)
- (cdr (rassoc command slime-registered-lisp-implementations)))
-
-(defun slime-symbolic-lisp-name-p (name)
- (let ((cons (or (assoc name slime-registered-lisp-implementations)
- (rassoc name slime-registered-lisp-implementations))))
- (if cons (car cons))))
-
-
(define-derived-mode slime-connection-list-mode fundamental-mode
"connection-list"
"SLIME Connection List Mode.
@@ -7362,7 +8878,8 @@
((kbd "RET") 'slime-goto-connection)
("d" 'slime-connection-list-make-default)
("g" 'slime-update-connection-list)
- ((kbd "C-k") 'slime-quit-connection-at-point))
+ ((kbd "C-k") 'slime-quit-connection-at-point)
+ ("R" 'slime-restart-connection-at-point))
(defun slime-connection-at-point ()
(or (get-text-property (point) 'slime-connection)
@@ -7381,6 +8898,11 @@
(while (memq connection slime-net-processes)
(sit-for 0 100)))
(slime-update-connection-list))
+
+(defun slime-restart-connection-at-point (connection)
+ (interactive (list (slime-connection-at-point)))
+ (let ((slime-dispatching-connection connection))
+ (slime-restart-inferior-lisp)))
(defun slime-connection-list-make-default ()
"Make the connection at point the default connection."
@@ -7470,18 +8992,22 @@
(defvar slime-inspector-mark-stack '())
(defvar slime-saved-window-config)
-(defun slime-inspect (form)
+(defun slime-inspect (form &optional no-reset)
"Eval an expression and inspect the result."
(interactive (list (slime-read-object "Inspect value (evaluated): ")))
- (slime-eval-async form 'slime-open-inspector))
+ (slime-eval-async `(swank:init-inspector ,form ,(not no-reset))
+ 'slime-open-inspector))
(defun slime-read-object (prompt)
- (let ((id (get-text-property (point) 'slime-repl-old-output)))
- (if id
- `(swank:init-inspector ,(format "(swank:get-repl-result %S)" id))
- `(swank:init-inspector
- ,(slime-read-from-minibuffer "Inspect value (evaluated): "
- (slime-sexp-at-point))))))
+ "Read a Common Lisp expression from the minibuffer, providing
+defaults from the s-expression at point. If point is within a
+presentation, don't prompt, just return the presentation."
+ (multiple-value-bind (presentation start end)
+ (slime-presentation-around-point (point))
+ (if presentation
+ (slime-presentation-expression presentation)
+ (slime-read-from-minibuffer prompt
+ (slime-sexp-at-point)))))
(define-derived-mode slime-inspector-mode fundamental-mode "Slime-Inspector"
(set-syntax-table lisp-mode-syntax-table)
@@ -7505,12 +9031,16 @@
"Display INSPECTED-PARTS in a new inspector window.
Optionally set point to POINT."
(with-current-buffer (slime-inspector-buffer)
+ (setq slime-buffer-connection (slime-current-connection))
(let ((inhibit-read-only t))
(erase-buffer)
- (destructuring-bind (&key title type content) inspected-parts
+ (destructuring-bind (&key title type content id) inspected-parts
(macrolet ((fontify (face string)
- `(slime-inspector-fontify ,face ,string)))
- (insert (fontify topline title))
+ `(slime-inspector-fontify ,face ,string)))
+ (slime-propertize-region (list 'slime-part-number id
+ 'mouse-face 'highlight
+ 'face 'slime-inspector-action-face)
+ (slime-insert-presentation title `(:inspected-part ,id)))
(while (eq (char-before) ?\n)
(backward-delete-char 1))
(insert "\n [" (fontify label "type:") " " (fontify type type) "]\n"
@@ -7526,10 +9056,11 @@
(insert ispec)
(destructure-case ispec
((:value string id)
- (slime-insert-propertized (list 'slime-part-number id
- 'mouse-face 'highlight
- 'face 'slime-inspector-value-face)
- string))
+ (slime-propertize-region
+ (list 'slime-part-number id
+ 'mouse-face 'highlight
+ 'face 'slime-inspector-value-face)
+ (slime-insert-presentation string `(:inspected-part ,id))))
((:action string id)
(slime-insert-propertized (list 'slime-action-number id
'mouse-face 'highlight
@@ -7656,9 +9187,14 @@
(interactive)
(slime-eval-describe `(swank:describe-inspectee)))
+(defun slime-inspector-pprint (part)
+ (interactive (list (or (get-text-property (point) 'slime-part-number)
+ (error "No part at point"))))
+ (slime-eval-describe `(swank:pprint-inspector-part ,part)))
+
(defun slime-inspector-reinspect ()
(interactive)
- (slime-eval-async `(swank::inspect-object swank::*inspectee*) 'slime-open-inspector))
+ (slime-eval-async `(swank:inspector-reinspect) 'slime-open-inspector))
(slime-define-keys slime-inspector-mode-map
([return] 'slime-inspector-operate-on-point)
@@ -7669,6 +9205,7 @@
("n" 'slime-inspector-next)
(" " 'slime-inspector-next)
("d" 'slime-inspector-describe)
+ ("p" 'slime-inspector-pprint)
("q" 'slime-inspector-quit)
("g" 'slime-inspector-reinspect)
("\C-i" 'slime-inspector-next-inspectable-object)
@@ -7824,7 +9361,10 @@
(def-slime-selector-method ?r
"SLIME Read-Eval-Print-Loop."
- (slime-output-buffer))
+ (cond ((slime-current-connection)
+ (slime-output-buffer))
+ ((y-or-n-p "No connection: start Slime? ")
+ (slime))))
(def-slime-selector-method ?s
"*slime-scratch* buffer."
@@ -7870,6 +9410,7 @@
Only considers buffers that are not already visible."
(loop for buffer in (buffer-list)
when (and (with-current-buffer buffer (eq major-mode mode))
+ (not (string-match "^ " (buffer-name buffer)))
(null (get-buffer-window buffer 'visible)))
return buffer
finally (error "Can't find unshown buffer in %S" mode)))
@@ -7877,7 +9418,7 @@
;;;; Editing commands
-(defvar *slime-comment-start-regexp*
+(defvar slime-comment-start-regexp
"\\(\\(^\\|[^\n\\\\]\\)\\([\\\\][\\\\]\\)*\\);+[ \t]*"
"Regexp to match the start of a comment.")
@@ -7887,7 +9428,7 @@
Otherwise leave point unchanged and return NIL."
(let ((boundary (point)))
(beginning-of-line)
- (cond ((re-search-forward *slime-comment-start-regexp* boundary t)
+ (cond ((re-search-forward slime-comment-start-regexp boundary t)
(point))
(t (goto-char boundary)
nil))))
@@ -8070,11 +9611,17 @@
(string-match "^\\(def\\|\\with-\\)" symbol-name))
(let ((symbol (intern symbol-name))
(indent (cdr info)))
- ;; Does the symbol have an indentation value that we set?
- (when (equal (get symbol 'common-lisp-indent-function)
- (get symbol 'slime-indent))
- (put symbol 'slime-indent indent)
- (put symbol 'common-lisp-indent-function indent)))))))
+ (let ((old-slime-indent (get symbol 'slime-indent)))
+ (flet ((update (indent-function)
+ ;; Does the symbol have an indentation value
+ ;; that we set?
+ (when (equal (get symbol indent-function)
+ old-slime-indent)
+ (put symbol 'slime-indent indent)
+ (put symbol indent-function indent))))
+ (update 'common-lisp-indent-function)
+ (when (member 'scheme-mode slime-lisp-modes)
+ (update 'scheme-indent-function)))))))))
(defun slime-reindent-defun (&optional force-text-fill)
"Reindent the current defun, or refill the current paragraph.
@@ -8106,6 +9653,101 @@
(indent-region start end nil)))))
+;;;; Cheat Sheet
+
+(defun slime-cheat-sheet ()
+ (interactive)
+ (switch-to-buffer-other-frame (get-buffer-create "*SLIME Cheat Sheet*"))
+ (setq buffer-read-only nil)
+ (delete-region (point-min) (point-max))
+ (goto-char (point-min))
+ (insert "SLIME: The Superior Lisp Interaction Mode for Emacs (minor-mode).\n\n")
+ (dolist (mode slime-cheat-sheet-table)
+ (let ((title (getf mode :title))
+ (mode-map (getf mode :map))
+ (mode-keys (getf mode :bindings)))
+ (insert title)
+ (insert ":\n")
+ (insert (make-string (1+ (length title)) ?-))
+ (insert "\n")
+ (let ((keys '())
+ (descriptions '()))
+ (dolist (func mode-keys)
+ ;; func is eithor the function name or a list (NAME DESCRIPTION)
+ (push (if (symbolp func)
+ (prin1-to-string func)
+ (second func))
+ descriptions)
+ (let ((all-bindings (where-is-internal (if (symbolp func)
+ func
+ (first func))
+ (symbol-value mode-map)))
+ (key-bindings '()))
+ (dolist (binding all-bindings)
+ (when (and (vectorp binding)
+ (integerp (aref binding 0)))
+ (push binding key-bindings)))
+ (push (mapconcat 'key-description key-bindings " or ") keys)))
+ (loop
+ with key-length = (apply 'max (mapcar 'length keys))
+ with desc-length = (apply 'max (mapcar 'length descriptions))
+ for key in (nreverse keys)
+ for desc in (nreverse descriptions)
+ do (insert desc)
+ do (insert (make-string (- desc-length (length desc)) ? ))
+ do (insert " => ")
+ do (insert (if (string= "" key)
+ "<not on any key>"
+ key))
+ do (insert "\n")
+ finally do (insert "\n")))))
+ (setq buffer-read-only t)
+ (goto-char (point-min)))
+
+(defvar slime-cheat-sheet-table
+ '((:title "Editing lisp code"
+ :map slime-mode-map
+ :bindings ((slime-eval-defun "Evaluate current top level form")
+ (slime-compile-defun "Compile current top level form")
+ (slime-interactive-eval "Prompt for form and eval it")
+ (slime-compile-and-load-file "Compile and load current file")
+ (slime-sync-package-and-default-directory "Synch default package and directory with current buffer")
+ (slime-next-note "Next compiler note")
+ (slime-previous-note "Previous compiler note")
+ (slime-remove-notes "Remove notes")
+ slime-hyperspec-lookup))
+ (:title "Completion"
+ :map slime-mode-map
+ :bindings (slime-indent-and-complete-symbol
+ slime-fuzzy-complete-symbol))
+ (:title "At the REPL"
+ :map slime-repl-mode-map
+ :bindings (slime-repl-clear-buffer
+ slime-describe-symbol))
+ (:title "Within SLDB buffers"
+ :map sldb-mode-map
+ :bindings ((sldb-default-action "Do 'whatever' with thing at point")
+ (sldb-toggle-details "Toggle frame details visualization")
+ (sldb-quit "Quit to REPL")
+ (sldb-abort "Invoke ABORT restart")
+ (sldb-continue "Invoke CONTINUE restart (if available)")
+ (sldb-show-source "Jump to frame's source code")
+ (sldb-eval-in-frame "Evaluate in frame at point")
+ (sldb-inspect-in-frame "Evaluate in frame at point and inspect result")))
+ (:title "Within the Inspector"
+ :map slime-inspector-mode-map
+ :bindings ((slime-inspector-next-inspectable-object "Jump to next inspectable object")
+ (slime-inspector-operate-on-point "Inspect object or execute action at point")
+ (slime-inspector-reinspect "Reinspect current object")
+ (slime-inspector-pop "Return to previous object")
+ (slime-inspector-copy-down "Send object at point to REPL")
+ (slime-inspector-quit "Quit")))
+ (:title "Finding Definitions"
+ :map slime-mode-map
+ :bindings (slime-edit-definition
+ slime-pop-find-definition-stack))))
+
+
;;;; Test suite
(defstruct (slime-test (:conc-name slime-test.))
@@ -8155,8 +9797,22 @@
(goto-char (overlay-start o))
(show-subtree)))))
+(defun slime-run-one-test (name)
+ "Ask for the name of a test and then execute the test."
+ (interactive (list (slime-read-test-name)))
+ (let ((test (find name slime-tests :key #'slime-test.name)))
+ (assert test)
+ (let ((slime-tests (list test)))
+ (slime-run-tests))))
+
+(defun slime-read-test-name ()
+ (let ((alist (mapcar (lambda (test)
+ (list (symbol-name (slime-test.name test))))
+ slime-tests)))
+ (read (completing-read "Test: " alist nil t))))
+
(defun slime-test-should-fail-p (test)
- (member (slime-lisp-implementation-type-name)
+ (member (slime-lisp-implementation-name)
(slime-test.fails-for test)))
(defun slime-execute-tests ()
@@ -8173,6 +9829,7 @@
(slime-test-heading 1 "%s" name)
(dolist (input inputs)
(incf slime-total-tests)
+ (message "%s: %s" name input)
(slime-test-heading 2 "input: %s" input)
(if slime-test-debug-on-error
(let ((debug-on-error t)
@@ -8337,6 +9994,7 @@
(setq slime-tests nil)
(defun slime-check-top-level (&optional test-name)
+ (slime-accept-process-output nil 0.001)
(slime-check "At the top level (no debugging or pending RPCs)"
(slime-at-top-level-p)))
@@ -8350,7 +10008,10 @@
(cond ((time-less-p end (current-time))
(error "Timeout waiting for condition: %S" name))
(t
- (accept-process-output nil 0 100000))))))
+ ;; XXX if a process-filter enters a recursive-edit, we
+ ;; hang forever
+ (save-excursion
+ (slime-accept-process-output nil 0.1)))))))
(defun slime-sync-to-top-level (timeout)
(slime-wait-condition "top-level" #'slime-at-top-level-p timeout))
@@ -8433,7 +10094,7 @@
"Lookup the argument list for FUNCTION-NAME.
Confirm that EXPECTED-ARGLIST is displayed."
'(("swank:start-server"
- "(swank:start-server port-file &key \\((style \\*communication-style\\*)\\|style\\)[ \n]+dont-close[ \n]+(external-format \\*coding-system\\*))")
+ "(swank:start-server port-file &key \\((style swank:\\*communication-style\\*)\\|style\\)[ \n]+dont-close[ \n]+(external-format swank::\\*coding-system\\*))")
("swank::compound-prefix-match"
"(swank::compound-prefix-match prefix target)")
("swank::create-socket"
@@ -8477,13 +10138,25 @@
("(defun cl-user::foo ()
\"\\\" bla bla \\\"\"
(cl-user::bar))"
+ (cl-user::bar))
+ ("(defun cl-user::foo ()
+ #.*log-events*
+ (cl-user::bar))"
+ (cl-user::bar))
+ ("#.'(defun x () (/ 1 0))
+ (defun foo ()
+ (cl-user::bar))
+
+ "
(cl-user::bar)))
- (slime-check-top-level)
+ (slime-check-top-level)
(with-temp-buffer
(lisp-mode)
(insert program)
- (slime-compile-defun)
- (slime-sync)
+ (setq slime-buffer-package ":swank")
+ (slime-compile-string (buffer-string) 1)
+ (setq slime-buffer-package ":cl-user")
+ (slime-sync-to-top-level 5)
(goto-char (point-max))
(slime-previous-note)
(slime-check error-location-correct
@@ -8510,19 +10183,53 @@
(slime-eval-async 'no-such-variable)))))))
(let ((sldb-hook (cons debug-hook sldb-hook)))
(slime-eval-async 'no-such-variable)
- (slime-sync-to-top-level 15)
+ (slime-sync-to-top-level 5)
(slime-check-top-level)
(slime-check ("Maximum depth reached (%S) is %S."
debug-hook-max-depth depth)
(= debug-hook-max-depth depth))))))
+(def-slime-test unwind-to-previous-sldb-level (level2 level1)
+ "Test recursive debugging and returning to lower SLDB levels."
+ '((2 1) (4 2))
+ (slime-check-top-level)
+ (lexical-let ((level2 level2)
+ (level1 level1)
+ (state 'enter)
+ (max-depth 0))
+ (let ((debug-hook
+ (lambda ()
+ (with-current-buffer (sldb-get-default-buffer)
+ (setq max-depth (max sldb-level max-depth))
+ (ecase state
+ (enter
+ (cond ((= sldb-level level2)
+ (setq state 'leave)
+ (sldb-invoke-restart 0))
+ (t
+ (slime-eval-async `(cl:aref cl:nil ,sldb-level)))))
+ (leave
+ (cond ((= sldb-level level1)
+ (setq state 'ok)
+ (sldb-quit))
+ (t
+ (sldb-invoke-restart 0)))))))))
+ (let ((sldb-hook (cons debug-hook sldb-hook)))
+ (slime-eval-async `(cl:aref cl:nil 0))
+ (slime-sync-to-top-level 15)
+ (slime-check-top-level)
+ (slime-check ("Maximum depth reached (%S) is %S." max-depth level2)
+ (= max-depth level2))
+ (slime-check ("Final state reached.")
+ (eq state 'ok))))))
+
(def-slime-test loop-interrupt-quit
()
"Test interrupting a loop."
'(())
(slime-check-top-level)
(slime-eval-async '(cl:loop) (lambda (_) ) "CL-USER")
- (accept-process-output nil 1)
+ (slime-accept-process-output nil 1)
(slime-check "In eval state." (slime-busy-p))
(slime-interrupt)
(slime-wait-condition "First interrupt" (lambda () (slime-sldb-level= 1)) 5)
@@ -8562,29 +10269,30 @@
(let ((sldb-hook (lambda () (sldb-continue) (setq done t))))
(slime-interactive-eval
"(progn(cerror \"foo\" \"restart\")(cerror \"bar\" \"restart\")(+ 1 2))")
- (while (not done) (accept-process-output))
+ (while (not done) (slime-accept-process-output))
(slime-sync-to-top-level 5)
(slime-check-top-level)
(let ((message (current-message)))
(slime-check "Minibuffer contains: \"3\""
- (equal "3 (#x3, #o3, #b11)" message))))))
+ (equal "=> 3 (#x3, #o3, #b11)" message))))))
(def-slime-test interrupt-bubbling-idiot
()
"Test interrupting a loop that sends a lot of output to Emacs."
'(())
+ (slime-accept-process-output nil 1)
(slime-check-top-level)
(slime-eval-async '(cl:loop :for i :from 0 :do (cl:progn (cl:print i)
- (cl:force-output)))
- (lambda (_) ) "CL-USER")
- (accept-process-output nil 1)
- (slime-wait-condition "running" #'slime-busy-p 5)
+ (cl:finish-output)))
+ (lambda (_) )
+ "CL-USER")
+ (sleep-for 1)
(slime-interrupt)
(slime-wait-condition "Debugger visible"
(lambda ()
(and (slime-sldb-level= 1)
(get-buffer-window (sldb-get-default-buffer))))
- 5)
+ 30)
(with-current-buffer (sldb-get-default-buffer)
(sldb-quit))
(slime-sync-to-top-level 5))
@@ -8599,11 +10307,10 @@
(let ((p (slime-eval
`(swank:listener-eval
,(format
- "(cl:setq cl:*package* (cl:find-package %S))
+ "(cl:setq cl:*print-case* :upcase)
+ (cl:setq cl:*package* (cl:find-package %S))
(cl:package-name cl:*package*)" package-name))
(slime-lisp-package))))
- (slime-check ("In %s package." package-name)
- (equal (format "\"%s\"" package-name) p))
(slime-check ("slime-lisp-package is %S." package-name)
(equal (slime-lisp-package) package-name))
(slime-check ("slime-lisp-package-prompt-string is in %S." nicknames)
@@ -8618,13 +10325,11 @@
("(princ 10)" "SWANK> (princ 10)
10
10
-SWANK> "
- )
+SWANK> ")
("(princ 10)(princ 20)" "SWANK> (princ 10)(princ 20)
1020
20
-SWANK> "
- )
+SWANK> ")
("(dotimes (i 10 77) (princ i) (terpri))"
"SWANK> (dotimes (i 10 77) (princ i) (terpri))
0
@@ -8638,9 +10343,7 @@
8
9
77
-SWANK> "
- )
- )
+SWANK> "))
(with-current-buffer (slime-output-buffer)
(setf (slime-lisp-package-prompt-string) "SWANK"))
(kill-buffer (slime-output-buffer))
@@ -8668,9 +10371,7 @@
("(+ 1\n" "2)" "SWANK> (+ 1
2)
3
-SWANK> ")
-
-)
+SWANK> "))
(with-current-buffer (slime-output-buffer)
(setf (slime-lisp-package-prompt-string) "SWANK"))
(kill-buffer (slime-output-buffer))
@@ -8701,8 +10402,8 @@
\(+ 2 3
4)
\(+ 2 3 4)
-SWANK> ")
- )
+SWANK> "))
+ (slime-sync-to-top-level 2)
(with-current-buffer (slime-output-buffer)
(setf (slime-lisp-package-prompt-string) "SWANK"))
(kill-buffer (slime-output-buffer))
@@ -8713,8 +10414,8 @@
(insert input)
(call-interactively 'slime-repl-return)
(slime-sync-to-top-level 5)
- (slime-check "Buffer contains result"
- (equal result-contents (buffer-string)))))
+ (slime-test-expect "Buffer contains result"
+ result-contents (buffer-string))))
(def-slime-test repl-read-lines
(command inputs final-contents)
@@ -8748,7 +10449,16 @@
SWANK> " nil)
("(princ 10)" ";;;; (princ 10) ...
10
+SWANK> " t)
+ ("(princ \"����������������������������\")"
+ ";;;; (princ \"����������������������������\") ...
+����������������������������
SWANK> " t))
+ (when (and (fboundp 'string-to-multibyte)
+ (with-current-buffer (process-buffer (slime-connection))
+ enable-multibyte-characters))
+ (setq input (funcall 'string-to-multibyte input))
+ (setq result-contents (funcall 'string-to-multibyte result-contents)))
(with-current-buffer (slime-output-buffer)
(setf (slime-lisp-package-prompt-string) "SWANK"))
(kill-buffer (slime-output-buffer))
@@ -8765,19 +10475,65 @@
()
"Test if BREAK invokes SLDB."
'(())
+ (slime-accept-process-output nil 1)
+ (slime-check-top-level)
(slime-compile-string (prin1-to-string '(cl:defun cl-user::foo ()
(cl:break)))
0)
+ (slime-sync-to-top-level 2)
(slime-eval-async '(cl-user::foo))
(slime-wait-condition "Debugger visible"
(lambda ()
(and (slime-sldb-level= 1)
(get-buffer-window (sldb-get-default-buffer))))
- 10)
+ 5)
(with-current-buffer (sldb-get-default-buffer)
(sldb-quit))
+ (slime-accept-process-output nil 1)
(slime-sync-to-top-level 5))
-
+
+(def-slime-test user-interrupt
+ ()
+ "Let's see what happens if we send a user interrupt at toplevel."
+ '(())
+ (slime-check-top-level)
+ (slime-interrupt)
+ (slime-wait-condition "Debugger visible"
+ (lambda ()
+ (and (slime-sldb-level= 1)
+ (get-buffer-window (sldb-get-default-buffer))))
+ 5)
+ (with-current-buffer (sldb-get-default-buffer)
+ (sldb-quit))
+ (slime-sync-to-top-level 5))
+
+(def-slime-test disconnect
+ ()
+ "Close the connetion.
+Confirm that the subprocess continues gracefully.
+Reconnect afterwards."
+ '(())
+ (slime-check-top-level)
+ (let* ((c (slime-connection))
+ (p (slime-inferior-process c)))
+ (with-current-buffer (process-buffer p)
+ (erase-buffer))
+ (delete-process c)
+ (assert (equal (process-status c) 'closed) nil "Connection not closed")
+ (slime-accept-process-output nil 0.1)
+ (assert (equal (process-status p) 'run) nil "Subprocess not running")
+ (with-current-buffer (process-buffer p)
+ (assert (< (buffer-size) 500) t "Unusual output"))
+ (slime-inferior-connect p (slime-inferior-lisp-args p))
+ (lexical-let ((hook nil))
+ (setq hook (lambda ()
+ (remove-hook 'slime-connected-hook hook)))
+ (add-hook 'slime-connected-hook hook)
+ (while (member hook slime-connected-hook)
+ (sit-for 0.5)
+ (slime-accept-process-output nil 0.1)))
+ (slime-test-expect "We are connected again" p (slime-inferior-process))))
+
;;;; Utilities
@@ -8819,7 +10575,11 @@
(if (slime-cl-symbol-package s)
s
(format "%s::%s"
- (slime-current-package)
+ (let* ((package (slime-current-package)))
+ ;; package is a string like ":cl-user" or "CL-USER".
+ (if (and package (string-match "^:" package))
+ (substring package 1)
+ package))
(slime-cl-symbol-name s)))))
@@ -8827,21 +10587,35 @@
(defun slime-defun-at-point ()
"Return the text of the defun at point."
+ (apply #'buffer-substring-no-properties
+ (slime-region-for-defun-at-point)))
+
+(defun slime-region-for-defun-at-point ()
+ "Return the start and end position of the toplevel form at point."
(save-excursion
(end-of-defun)
(let ((end (point)))
(beginning-of-defun)
- (buffer-substring-no-properties (point) end))))
+ (list (point) end))))
(defun slime-beginning-of-symbol ()
"Move point to the beginning of the current symbol."
- (and (minusp (skip-syntax-backward "w_"))
- (when (eq (char-before) ?#) ; special case for things like "#<foo"
- (forward-char))))
+ (when (slime-point-moves-p
+ (while (slime-point-moves-p
+ (skip-syntax-backward "w_")
+ (when (eq (char-before) ?|)
+ (backward-sexp)))))
+ (when (eq (char-before) ?#) ; special case for things like "#<foo"
+ (forward-char))))
(defun slime-end-of-symbol ()
"Move point to the end of the current symbol."
- (skip-syntax-forward "w_"))
+ (while (slime-point-moves-p
+ (skip-syntax-forward "w_")
+ ;; | has the syntax as ", so we need to
+ ;; treat it manually rather than via syntax.
+ (when (looking-at "|")
+ (forward-sexp)))))
(put 'slime-symbol 'end-op 'slime-end-of-symbol)
(put 'slime-symbol 'beginning-op 'slime-beginning-of-symbol)
@@ -8880,71 +10654,135 @@
(let ((string (thing-at-point 'sexp)))
(if string (substring-no-properties string) nil)))
-(defun slime-function-called-at-point/line ()
- "Return the name of the function being called at point, provided the
-function call starts on the same line at the point itself."
- (and (ignore-errors
- (slime-same-line-p (save-excursion (backward-up-list 1) (point))
- (point)))
- (slime-function-called-at-point)))
+(defun slime-sexp-at-point-or-error ()
+ "Return the sexp at point as a string, othwise signal an error."
+ (or (slime-sexp-at-point)
+ (error "No expression at point.")))
-(defun slime-function-called-at-point ()
- "Return a function around point or else called by the list containing point.
-Return the symbol-name, or nil."
- (ignore-errors
- (save-excursion
- (save-restriction
- (narrow-to-region (max (point-min) (- (point) 1000))
- (point-max))
- ;; Move up to surrounding paren, then after the open.
- (backward-up-list 1)
- (when (or (ignore-errors
- ;; "((foo" is probably not a function call
- (save-excursion (backward-up-list 1)
- (looking-at "(\\s *(")))
- ;; nor is "( foo"
- (looking-at "([ \t]"))
- (error "Probably not a Lisp function call"))
- (forward-char 1)
- (slime-symbol-name-at-point)))))
+(defun slime-parse-extended-operator-name (name)
+ "Assume that point is at the operator NAME in the
+current buffer. If NAME is MAKE-INSTANCE or another operator in
+`slime-extendeded-operator-name-parser-alist', collect additional
+information from the operator call and encode it as an extended
+operator name like (MAKE-INSTANCE CLASS \"make-instance\"). Return
+NAME or the extended operator name."
+ (save-excursion
+ (ignore-errors
+ (forward-char (1+ (length name)))
+ (slime-forward-blanks)
+ (let* ((symbol-name (upcase (slime-cl-symbol-name name)))
+ (assoc (assoc symbol-name slime-extended-operator-name-parser-alist)))
+ (when assoc
+ (setq name (funcall (cdr assoc) name))))))
+ name)
-(defun slime-enclosing-operator-names ()
- "Return the list of operator names of the forms containing point."
- (let ((result '()))
+(defvar slime-extended-operator-name-parser-alist
+ '(("MAKE-INSTANCE" . slime-parse-extended-operator-name/make-instance)
+ ("MAKE-CONDITION" . slime-parse-extended-operator-name/make-instance)
+ ("ERROR" . slime-parse-extended-operator-name/make-instance)
+ ("SIGNAL" . slime-parse-extended-operator-name/make-instance)
+ ("WARN" . slime-parse-extended-operator-name/make-instance)
+ ("CERROR" . slime-parse-extended-operator-name/cerror)
+ ("CHANGE-CLASS" . slime-parse-extended-operator-name/cerror)
+ ("DEFMETHOD" . slime-parse-extended-operator-name/defmethod)
+ ("APPLY" . slime-parse-extended-operator-name/apply)))
+
+(defun slime-parse-extended-operator-name/make-instance (name)
+ (let ((str (slime-sexp-at-point)))
+ (when (= (aref str 0) ?')
+ (setq name (list :make-instance (substring str 1)
+ name))))
+ name)
+
+(defun slime-parse-extended-operator-name/apply (name)
+ (let ((str (slime-sexp-at-point)))
+ (when (string-match "^#?'\\(.*\\)" str)
+ (setq name (list :make-instance (match-string 1 str)
+ name))))
+ name)
+
+(defun slime-parse-extended-operator-name/cerror (name)
+ (let ((continue-string-sexp (slime-sexp-at-point))
+ (class-sexp (progn (forward-sexp) (forward-char 1) (slime-sexp-at-point))))
+ (when (= (aref class-sexp 0) ?')
+ (setq name (list :make-instance (substring class-sexp 1)
+ name
+ continue-string-sexp))))
+ name)
+
+(defun slime-parse-extended-operator-name/defmethod (name)
+ (let ((str (slime-sexp-at-point)))
+ (setq name (list :defmethod str))))
+
+(defun slime-enclosing-operator-names (&optional max-levels)
+ "Return the list of operator names of the forms containing point.
+As a secondary value, return the indices of the respective argument to
+the operator. When MAX-LEVELS is non-nil, go up at most this many
+levels of parens."
+ (let ((result '())
+ (arg-indices '())
+ (level 1))
(ignore-errors
- (save-restriction
- (narrow-to-region (save-excursion (beginning-of-defun) (point))
- (point))
- (save-excursion
- (while t
- (backward-up-list 1)
- (when (looking-at "(")
- (forward-char 1)
- (when-let (name (slime-symbol-name-at-point))
- (push name result))
- (backward-up-list 1))))))
- (nreverse result)))
+ (save-excursion
+ ;; Make sure we get the whole operator name.
+ (slime-end-of-symbol)
+ (save-restriction
+ (narrow-to-region (save-excursion (beginning-of-defun) (point))
+ (min (1+ (point)) (point-max)))
+ (while (or (not max-levels)
+ (<= level max-levels))
+ (let ((arg-index 0))
+ ;; Move to the beginning of the current sexp if not already there.
+ (if (or (and (char-after)
+ (member (char-syntax (char-after)) '(?\( ?')))
+ (member (char-syntax (char-before)) '(?\ ?>)))
+ (incf arg-index))
+ (ignore-errors
+ (backward-sexp 1))
+ (while (ignore-errors (backward-sexp 1)
+ (> (point) (point-min)))
+ (incf arg-index))
+ (backward-up-list 1)
+ (when (member (char-syntax (char-after)) '(?\( ?'))
+ (incf level)
+ (forward-char 1)
+ (let ((name (slime-symbol-name-at-point)))
+ (cond
+ (name
+ (push (slime-parse-extended-operator-name name) result)
+ (push arg-index arg-indices))
+ (t
+ (push nil result)
+ (push arg-index arg-indices))))
+ (backward-up-list 1)))))))
+ (values
+ (nreverse result)
+ (nreverse arg-indices))))
;;;;; Portability library
(when (featurep 'xemacs)
- (require 'overlay)
- (defun next-single-char-property-change (&rest args)
- (or (apply 'next-single-property-change args)
- (point-max)))
- (defun previous-single-char-property-change (&rest args)
- (or (apply 'previous-single-property-change args)
- (point-min)))
- (unless (fboundp 'string-make-unibyte)
- (defalias 'string-make-unibyte #'identity))
- )
+ (require 'overlay))
(eval-when (compile eval)
(defmacro slime-defun-if-undefined (name &rest rest)
`(unless (fboundp ',name)
(defun ,name ,@rest))))
+(defvar slime-accept-process-output-supports-floats
+ (ignore-errors (accept-process-output nil 0.0) t))
+
+(defun slime-accept-process-output (&optional process timeout)
+ "Like `accept-process-output' but the TIMEOUT argument can be a float."
+ (cond (slime-accept-process-output-supports-floats
+ (accept-process-output process timeout))
+ (t
+ (accept-process-output process
+ (if timeout (truncate timeout))
+ ;; Emacs 21 uses microsecs; Emacs 22 millisecs
+ (if timeout (truncate (* timeout 1000000)))))))
+
(put 'slime-defun-if-undefined 'lisp-indent-function 2)
(slime-defun-if-undefined next-single-char-property-change
@@ -8989,11 +10827,24 @@
(get-char-property (1- pos) prop object)))
return pos))))))))
+(slime-defun-if-undefined next-char-property-change (position &optional limit)
+ (let ((tmp (next-overlay-change position)))
+ (when tmp
+ (setq tmp (min tmp limit)))
+ (next-property-change position nil tmp)))
+
+(slime-defun-if-undefined previous-char-property-change
+ (position &optional limit)
+ (let ((tmp (previous-overlay-change position)))
+ (when tmp
+ (setq tmp (max tmp limit)))
+ (previous-property-change position nil tmp)))
+
(slime-defun-if-undefined substring-no-properties (string &optional start end)
(let* ((start (or start 0))
(end (or end (length string)))
(string (substring string start end)))
- (set-text-properties start end nil string)
+ (set-text-properties 0 (- end start) nil string)
string))
(slime-defun-if-undefined set-window-text-height (window height)
@@ -9160,6 +11011,21 @@
(or (getenv "TMPDIR") (getenv "TMP") (getenv "TEMP") "/tmp"))))
"The directory for writing temporary files."))
+(unless (fboundp 'with-temp-message)
+ (defmacro with-temp-message (message &rest body)
+ (let ((current-message (make-symbol "current-message"))
+ (temp-message (make-symbol "with-temp-message")))
+ `(let ((,temp-message ,message)
+ (,current-message))
+ (unwind-protect
+ (progn
+ (when ,temp-message
+ (setq ,current-message (current-message))
+ (message "%s" ,temp-message))
+ ,@body)
+ (and ,temp-message ,current-message
+ (message "%s" ,current-message)))))))
+
(defun slime-emacs-20-p ()
(and (not (featurep 'xemacs))
(= emacs-major-version 20)))
@@ -9184,8 +11050,9 @@
'(slime-alistify
slime-log-event
slime-events-buffer
- slime-output-string
+ slime-write-string
slime-output-buffer
+ slime-connection-output-buffer
slime-output-filter
slime-repl-show-maximum-output
slime-process-available-input
@@ -9203,4 +11070,10 @@
(provide 'slime)
+;; Local Variables:
+;; outline-regexp: ";;;;+"
+;; indent-tabs-mode: nil
+;; coding: latin-1-unix
+;; unibyte: t
+;; End:
;;; slime.el ends here
Modified: trunk/thirdparty/emacs/slime/swank-abcl.lisp
===================================================================
--- trunk/thirdparty/emacs/slime/swank-abcl.lisp 2006-11-30 14:00:03 UTC (rev 2091)
+++ trunk/thirdparty/emacs/slime/swank-abcl.lisp 2006-11-30 16:32:54 UTC (rev 2092)
@@ -1,4 +1,4 @@
-;;;; -*- Mode: lisp; indent-tabs-mode: nil; outline-regexp: ";;;;;*"; -*-
+;;;; -*- indent-tabs-mode: nil; outline-regexp: ";;;;;*"; -*-
;;;
;;; swank-abcl.lisp --- Armedbear CL specific code for SLIME.
;;;
@@ -17,7 +17,7 @@
(defun sys::break (&optional (format-control "BREAK called")
&rest format-arguments)
- (let ((*saved-backtrace* (sys::backtrace-as-list)))
+ (let ((*saved-backtrace* (backtrace-as-list-ignoring-swank-calls)))
(with-simple-restart (continue "Return from BREAK.")
(invoke-debugger
(sys::%make-condition 'simple-condition
@@ -25,26 +25,46 @@
:format-arguments format-arguments))))
nil))
-
(defimplementation make-fn-streams (input-fn output-fn)
(let* ((output (ext:make-slime-output-stream output-fn))
(input (ext:make-slime-input-stream input-fn output)))
(values input output)))
+(defimplementation call-with-compilation-hooks (function)
+ (funcall function))
+
;;; swank-mop
-;;dummies:
+;;dummies and definition
(defclass standard-slot-definition ()())
-(defun class-finalized-p (class) t)
+;(defun class-finalized-p (class) t)
(defun slot-definition-documentation (slot) #+nil (documentation slot 't))
(defun slot-definition-type (slot) t)
(defun class-prototype (class))
(defun generic-function-declarations (gf))
-(defun specializer-direct-methods (spec) nil)
+(defun specializer-direct-methods (spec) (mop::class-direct-methods spec))
+(defun slot-definition-name (slot)
+ (mop::%slot-definition-name slot))
+
+(defun class-slots (class)
+ (mop::%class-slots class))
+
+(defun method-generic-function (method)
+ (mop::%method-generic-function method))
+
+(defun method-function (method)
+ (mop::%method-function method))
+
+(defun slot-boundp-using-class (class object slotdef)
+ (system::slot-boundp object (slot-definition-name slotdef)))
+
+(defun slot-value-using-class (class object slotdef)
+ (system::slot-value object (slot-definition-name slotdef)))
+
(import-to-swank-mop
'( ;; classes
cl:standard-generic-function
@@ -58,12 +78,12 @@
mop::class-direct-subclasses
mop::class-direct-superclasses
mop::eql-specializer
- class-finalized-p ;;dummy
+ mop::class-finalized-p
cl:class-name
mop::class-precedence-list
class-prototype ;;dummy
- mop::class-slots
- specializer-direct-methods ;;dummy
+ class-slots
+ specializer-direct-methods
;; eql-specializer accessors
mop::eql-specializer-object
;; generic function readers
@@ -75,8 +95,8 @@
mop::generic-function-method-combination
mop::generic-function-name
;; method readers
- mop::method-generic-function
- mop::method-function
+ method-generic-function
+ method-function
mop::method-lambda-list
mop::method-specializers
mop::method-qualifiers
@@ -86,10 +106,13 @@
mop::slot-definition-initargs
mop::slot-definition-initform
mop::slot-definition-initfunction
- mop::slot-definition-name
+ slot-definition-name
slot-definition-type ;;dummy
mop::slot-definition-readers
- mop::slot-definition-writers))
+ mop::slot-definition-writers
+ slot-boundp-using-class
+ slot-value-using-class
+ ))
;;;; TCP Server
@@ -111,8 +134,8 @@
(ext:server-socket-close socket))
(defimplementation accept-connection (socket
- &key (external-format :iso-latin-1-unix))
- (assert (eq external-format :iso-latin-1-unix))
+ &key external-format buffering timeout)
+ (declare (ignore buffering timeout external-format))
(ext:get-socket-stream (ext:socket-accept socket)))
;;;; Unix signals
@@ -135,13 +158,12 @@
;;;; Misc
+(defimplementation arglist (fun)
+ (cond ((symbolp fun)
+ (multiple-value-bind (arglist present) (sys::arglist fun)
+ (if present arglist :not-available)))
+ (t :not-available)))
-(defimplementation arglist ((symbol t))
- (multiple-value-bind (arglist present)
- (sys::arglist symbol)
- (if present arglist :not-available)))
-
-
(defimplementation function-name (function)
(nth-value 2 (function-lambda-expression function)))
@@ -190,16 +212,20 @@
(defvar *sldb-topframe*)
+(defun backtrace-as-list-ignoring-swank-calls ()
+ (let ((list (ext:backtrace-as-list)))
+ (subseq list (1+ (or (position (intern "SWANK-DEBUGGER-HOOK" 'swank) list :key 'car) -1)))))
+
(defimplementation call-with-debugging-environment (debugger-loop-fn)
- (let ((*sldb-topframe* (car (ext:backtrace-as-list)) #+nil (excl::int-newest-frame)))
+ (let ((*sldb-topframe* (car (backtrace-as-list-ignoring-swank-calls)) #+nil (excl::int-newest-frame)))
(funcall debugger-loop-fn)))
(defun nth-frame (index)
- (nth index (ext:backtrace-as-list)))
+ (nth index (backtrace-as-list-ignoring-swank-calls)))
(defimplementation compute-backtrace (start end)
(let ((end (or end most-positive-fixnum)))
- (subseq (ext:backtrace-as-list) start end)))
+ (subseq (backtrace-as-list-ignoring-swank-calls) start end)))
(defimplementation print-frame (frame stream)
(write-string (string-trim '(#\space #\newline)
@@ -207,7 +233,7 @@
stream))
(defimplementation frame-locals (index)
- `((list :name "??" :id 0 :value "??")))
+ `(,(list :name "??" :id 0 :value "??")))
(defimplementation frame-catch-tags (index)
@@ -249,43 +275,54 @@
(defvar *buffer-string*)
(defvar *compile-filename*)
+(in-package :swank-backend)
+
(defun handle-compiler-warning (condition)
- #+nil
- (let ((loc (getf (slot-value condition 'excl::plist) :loc)))
- (signal (make-condition
- 'compiler-condition
- :original-condition condition
- :severity :warning
- :message (format nil "~A" condition)
- :location (cond (*buffer-name*
- (make-location
- (list :buffer *buffer-name*)
- (list :position *buffer-start-position*)))
- (loc
- (destructuring-bind (file . pos) loc
+ (let ((loc nil));(getf (slot-value condition 'excl::plist) :loc)))
+ (unless (member condition *abcl-signaled-conditions*) ; filter condition signaled more than once.
+ (push condition *abcl-signaled-conditions*)
+ (signal (make-condition
+ 'compiler-condition
+ :original-condition condition
+ :severity :warning
+ :message (format nil "~A" condition)
+ :location (cond (*buffer-name*
+ (make-location
+ (list :buffer *buffer-name*)
+ (list :position *buffer-start-position*)))
+ (loc
+ (destructuring-bind (file . pos) loc
+ (make-location
+ (list :file (namestring (truename file)))
+ (list :position (1+ pos)))))
+ (t
(make-location
- (list :file (namestring (truename file)))
- (list :position (1+ pos)))))
- (t
- (make-location
- (list :file *compile-filename*)
- (list :position 1))))))))
+ (list :file *compile-filename*)
+ (list :position 1)))))))))
-(defimplementation swank-compile-file (*compile-filename* load-p)
- (handler-bind ((warning #'handle-compiler-warning))
- (let ((*buffer-name* nil))
- (multiple-value-bind (fn warn fail)
- (compile-file *compile-filename*)
- (when load-p (unless fail (load fn)))))))
+(defvar *abcl-signaled-conditions*)
+(defimplementation swank-compile-file (filename load-p external-format)
+ (declare (ignore external-format))
+ (let ((jvm::*resignal-compiler-warnings* t)
+ (*abcl-signaled-conditions* nil))
+ (handler-bind ((warning #'handle-compiler-warning))
+ (let ((*buffer-name* nil)
+ (*compile-filename* filename))
+ (multiple-value-bind (fn warn fail) (compile-file filename)
+ (when (and load-p (not fail))
+ (load fn)))))))
+
(defimplementation swank-compile-string (string &key buffer position directory)
(declare (ignore directory))
- (handler-bind ((warning #'handle-compiler-warning))
- (let ((*buffer-name* buffer)
- (*buffer-start-position* position)
- (*buffer-string* string))
- (funcall (compile nil (read-from-string
- (format nil "(~S () ~A)" 'lambda string)))))))
+ (let ((jvm::*resignal-compiler-warnings* t)
+ (*abcl-signaled-conditions* nil))
+ (handler-bind ((warning #'handle-compiler-warning))
+ (let ((*buffer-name* buffer)
+ (*buffer-start-position* position)
+ (*buffer-string* string))
+ (funcall (compile nil (read-from-string
+ (format nil "(~S () ~A)" 'lambda string))))))))
#|
;;;; Definition Finding
@@ -364,17 +401,17 @@
(defmethod inspect-for-emacs ((slot mop::slot-definition) (inspector abcl-inspector))
(declare (ignore inspector))
(values "A slot."
- `("Name: " (:value ,(mop::slot-definition-name slot))
+ `("Name: " (:value ,(mop::%slot-definition-name slot))
(:newline)
"Documentation:" (:newline)
,@(when (slot-definition-documentation slot)
`((:value ,(slot-definition-documentation slot)) (:newline)))
"Initialization:" (:newline)
- " Args: " (:value ,(mop::slot-definition-initargs slot)) (:newline)
- " Form: " ,(if (mop::slot-definition-initfunction slot)
- `(:value ,(mop::slot-definition-initform slot))
+ " Args: " (:value ,(mop::%slot-definition-initargs slot)) (:newline)
+ " Form: " ,(if (mop::%slot-definition-initfunction slot)
+ `(:value ,(mop::%slot-definition-initform slot))
"#<unspecified>") (:newline)
- " Function: " (:value ,(mop::slot-definition-initfunction slot))
+ " Function: " (:value ,(mop::%slot-definition-initfunction slot))
(:newline))))
(defmethod inspect-for-emacs ((f function) (inspector abcl-inspector))
@@ -395,7 +432,7 @@
#|
-(defimplementation inspect-for-emacs ((o t) (inspector abcl-inspector))
+(defmethod inspect-for-emacs ((o t) (inspector abcl-inspector))
(let* ((class (class-of o))
(slots (mop::class-slots class)))
(values (format nil "~A~% is a ~A" o class)
@@ -469,6 +506,33 @@
(defimplementation receive ()
(ext:mailbox-read (mailbox (ext:current-thread))))
+;;; Auto-flush streams
+
+;; XXX race conditions
+(defvar *auto-flush-streams* '())
+
+(defvar *auto-flush-thread* nil)
+
+(defimplementation make-stream-interactive (stream)
+ (setq *auto-flush-streams* (adjoin stream *auto-flush-streams*))
+ (unless *auto-flush-thread*
+ (setq *auto-flush-thread*
+ (ext:make-thread #'flush-streams
+ :name "auto-flush-thread"))))
+
+(defun flush-streams ()
+ (loop
+ (setq *auto-flush-streams*
+ (remove-if (lambda (x)
+ (not (and (open-stream-p x)
+ (output-stream-p x))))
+ *auto-flush-streams*))
+ (mapc #'finish-output *auto-flush-streams*)
+ (sleep 0.15)))
+
(defimplementation quit-lisp ()
(ext:exit))
+
+
+
Modified: trunk/thirdparty/emacs/slime/swank-allegro.lisp
===================================================================
--- trunk/thirdparty/emacs/slime/swank-allegro.lisp 2006-11-30 14:00:03 UTC (rev 2091)
+++ trunk/thirdparty/emacs/slime/swank-allegro.lisp 2006-11-30 16:32:54 UTC (rev 2092)
@@ -1,41 +1,29 @@
-;;;; -*- Mode: lisp; indent-tabs-mode: nil; outline-regexp: ";;;;;*"; -*-
+;;;; -*- indent-tabs-mode: nil; outline-regexp: ";;;;;* "; -*-
;;;
;;; swank-allegro.lisp --- Allegro CL specific code for SLIME.
;;;
;;; Created 2003
;;;
;;; This code has been placed in the Public Domain. All warranties
-;;; are disclaimed. This code was written for "Allegro CL Trial
-;;; Edition "5.0 [Linux/X86] (8/29/98 10:57)".
+;;; are disclaimed.
;;;
(in-package :swank-backend)
(eval-when (:compile-toplevel :load-toplevel :execute)
(require :sock)
- (require :process)
+ (require :process))
- (import
- '(excl:fundamental-character-output-stream
- excl:stream-write-char
- excl:stream-force-output
- excl:fundamental-character-input-stream
- excl:stream-read-char
- excl:stream-listen
- excl:stream-unread-char
- excl:stream-clear-input
- excl:stream-line-column
- excl:stream-read-char-no-hang)))
+(import-from :excl *gray-stream-symbols* :swank-backend)
;;; swank-mop
-;; maybe better change MOP to ACLMOP ?
-;; CLOS also works in ACL5. --he
(import-swank-mop-symbols :clos '(:slot-definition-documentation))
(defun swank-mop:slot-definition-documentation (slot)
(documentation slot t))
+
;;;; TCP Server
(defimplementation preferred-communication-style ()
@@ -51,22 +39,30 @@
(defimplementation close-socket (socket)
(close socket))
-(defimplementation accept-connection (socket &key external-format)
- (let ((ef (or external-format :iso-latin-1-unix))
- (s (socket:accept-connection socket :wait t)))
- (set-external-format s ef)
+(defimplementation accept-connection (socket &key external-format buffering
+ timeout)
+ (declare (ignore buffering timeout))
+ (let ((s (socket:accept-connection socket :wait t)))
+ (when external-format
+ (setf (stream-external-format s) external-format))
s))
-(defun set-external-format (stream external-format)
- #-allegro-v5.0
- (let* ((name (ecase external-format
- (:iso-latin-1-unix :latin1)
- (:utf-8-unix :utf-8-unix)
- (:emacs-mule-unix :emacs-mule)))
- (ef (excl:crlf-base-ef
- (excl:find-external-format name :try-variant t))))
- (setf (stream-external-format stream) ef)))
+(defvar *external-format-to-coding-system*
+ '((:iso-8859-1
+ "latin-1" "latin-1-unix" "iso-latin-1-unix"
+ "iso-8859-1" "iso-8859-1-unix")
+ (:utf-8 "utf-8" "utf-8-unix")
+ (:euc-jp "euc-jp" "euc-jp-unix")
+ (:us-ascii "us-ascii" "us-ascii-unix")
+ (:emacs-mule "emacs-mule" "emacs-mule-unix")))
+(defimplementation find-external-format (coding-system)
+ (let ((e (rassoc-if (lambda (x) (member coding-system x :test #'equal))
+ *external-format-to-coding-system*)))
+ (and e (excl:crlf-base-ef
+ (excl:find-external-format (car e)
+ :try-variant t)))))
+
(defimplementation format-sldb-condition (c)
(princ-to-string c))
@@ -89,9 +85,8 @@
"allegro")
(defimplementation set-default-directory (directory)
- (let ((dir (namestring (setf *default-pathname-defaults*
- (truename (merge-pathnames directory))))))
- (excl:chdir dir)
+ (let* ((dir (namestring (truename (merge-pathnames directory)))))
+ (setf *default-pathname-defaults* (pathname (excl:chdir dir)))
dir))
(defimplementation default-directory ()
@@ -145,6 +140,15 @@
(excl::*break-hook* nil))
(funcall debugger-loop-fn)))
+(defimplementation sldb-break-at-start (fname)
+ ;; :print-before is kind of mis-used but we just want to stuff our break form
+ ;; somewhere. This does not work for setf, :before and :after methods, which
+ ;; need special syntax in the trace call, see ACL's doc/debugging.htm chapter 10.
+ (eval `(trace (,fname
+ :print-before
+ ((break "Function start breakpoint of ~A" ',fname)))))
+ `(:ok ,(format nil "Set breakpoint at start of ~S" fname)))
+
(defun find-topframe ()
(let ((skip-frames 3))
(do ((f (excl::int-newest-frame) (next-frame f))
@@ -232,7 +236,6 @@
(member (type-of object) '(excl::compiler-note compiler::compiler-note)))
(defun compiler-undefined-functions-called-warning-p (object)
- #-allegro-v5.0
(typep object 'excl:compiler-undefined-functions-called-warning))
(deftype compiler-note ()
@@ -287,10 +290,12 @@
)
(funcall function)))
-(defimplementation swank-compile-file (*compile-filename* load-p)
+(defimplementation swank-compile-file (filename load-p external-format)
(with-compilation-hooks ()
- (let ((*buffer-name* nil))
- (compile-file *compile-filename* :load-after-compile load-p))))
+ (let ((*buffer-name* nil)
+ (*compile-filename* filename))
+ (compile-file *compile-filename* :load-after-compile load-p
+ :external-format external-format))))
(defun call-with-temp-file (fn)
(let ((tmpname (system:make-temp-file-name)))
@@ -304,7 +309,12 @@
(lambda (stream filename)
(write-string string stream)
(finish-output stream)
- (let ((binary-filename (compile-file filename :load-after-compile t)))
+ (let ((binary-filename
+ (excl:without-redefinition-warnings
+ ;; Suppress Allegro's redefinition warnings; they are
+ ;; pointless when we are compiling via a temporary
+ ;; file.
+ (compile-file filename :load-after-compile t))))
(when binary-filename
(delete-file binary-filename))))))
@@ -350,10 +360,17 @@
(when (<= pos 0)
(return cr-count))))))
-(defun find-definition-in-file (fspec type file)
- (let* ((start (or (scm:find-definition-in-file fspec type file)
- (scm:find-definition-in-file (fspec-primary-name fspec)
- type file)))
+(defun find-definition-in-file (fspec type file top-level)
+ (let* ((part
+ (or (scm::find-definition-in-definition-group
+ fspec type (scm:section-file :file file)
+ :top-level top-level)
+ (scm::find-definition-in-definition-group
+ (fspec-primary-name fspec)
+ type (scm:section-file :file file)
+ :top-level top-level)))
+ (start (and part
+ (scm::source-part-start part)))
(pos (if start
(list :position (1+ (- start (count-cr file start))))
(list :function-name (string (fspec-primary-name fspec))))))
@@ -366,29 +383,15 @@
(list :buffer (subseq filename 0 pos))
(list :position (parse-integer (subseq filename (1+ pos)))))))
-(defun find-fspec-location (fspec type)
- (multiple-value-bind (file err) (ignore-errors (excl:source-file fspec type))
- (etypecase file
- (pathname
- (find-definition-in-file fspec type file))
- ((member :top-level)
- (list :error (format nil "Defined at toplevel: ~A"
- (fspec->string fspec))))
- (string
- (find-definition-in-buffer file))
- (null
- (list :error (if err
- (princ-to-string err)
- (format nil "Unknown source location for ~A"
- (fspec->string fspec)))))
- (cons
- (destructuring-bind ((type . filename)) file
- (assert (member type '(:operator)))
- (etypecase filename
- (pathname
- (find-definition-in-file fspec type filename))
- (string
- (find-definition-in-buffer filename))))))))
+(defun find-fspec-location (fspec type file top-level)
+ (etypecase file
+ (pathname
+ (find-definition-in-file fspec type file top-level))
+ ((member :top-level)
+ (list :error (format nil "Defined at toplevel: ~A"
+ (fspec->string fspec))))
+ (string
+ (find-definition-in-buffer file))))
(defun fspec->string (fspec)
(etypecase fspec
@@ -400,10 +403,28 @@
(prin1-to-string (second fspec)))))))
(defun fspec-definition-locations (fspec)
- (let ((defs (excl::find-multiple-definitions fspec)))
- (loop for (fspec type) in defs
- collect (list (list type fspec)
- (find-fspec-location fspec type)))))
+ (cond
+ ((and (listp fspec)
+ (eql (car fspec) :top-level-form))
+ (destructuring-bind (top-level-form file position) fspec
+ (list
+ (list (list nil fspec)
+ (make-location (list :buffer file)
+ (list :position position t))))))
+ ((and (listp fspec) (eq (car fspec) :internal))
+ (destructuring-bind (_internal next _n) fspec
+ (fspec-definition-locations next)))
+ (t
+ (let ((defs (excl::find-source-file fspec)))
+ (if (null defs)
+ (list
+ (list (list nil fspec)
+ (list :error
+ (format nil "Unknown source location for ~A"
+ (fspec->string fspec)))))
+ (loop for (fspec type file top-level) in defs
+ collect (list (list type fspec)
+ (find-fspec-location fspec type file top-level))))))))
(defimplementation find-definitions (symbol)
(fspec-definition-locations symbol))
@@ -471,6 +492,80 @@
2)
(xref-result result)))
+;;;; Profiling
+
+;; Per-function profiling based on description in
+;; http://www.franz.com/support/documentation/8.0/doc/runtime-analyzer.htm#dat…
+
+(defvar *profiled-functions* ())
+(defvar *profile-depth* 0)
+
+(defmacro with-redirected-y-or-n-p (&body body)
+ ;; If the profiler is restarted when the data from the previous
+ ;; session is not reported yet, the user is warned via Y-OR-N-P.
+ ;; As the CL:Y-OR-N-P question is (for some reason) not directly
+ ;; sent to the Slime user, the function CL:Y-OR-N-P is temporarily
+ ;; overruled.
+ `(let* ((pkg (find-package "common-lisp"))
+ (saved-pdl (excl::package-definition-lock pkg))
+ (saved-ynp (symbol-function 'cl:y-or-n-p)))
+
+ (setf (excl::package-definition-lock pkg) nil
+ (symbol-function 'cl:y-or-n-p) (symbol-function
+ (find-symbol "y-or-n-p-in-emacs"
+ "swank")))
+ (unwind-protect
+ (progn ,@body)
+
+ (setf (symbol-function 'cl:y-or-n-p) saved-ynp
+ (excl::package-definition-lock pkg) saved-pdl))))
+
+(defun start-acl-profiler ()
+ (with-redirected-y-or-n-p
+ (prof:start-profiler :type :time :count t
+ :start-sampling-p nil :verbose nil)))
+(defun acl-profiler-active-p ()
+ (not (eq (prof:profiler-status :verbose nil) :inactive)))
+
+(defun stop-acl-profiler ()
+ (prof:stop-profiler :verbose nil))
+
+(excl:def-fwrapper profile-fwrapper (&rest args)
+ ;; Ensures sampling is done during the execution of the function,
+ ;; taking into account recursion.
+ (declare (ignore args))
+ (cond ((zerop *profile-depth*)
+ (let ((*profile-depth* (1+ *profile-depth*)))
+ (prof:start-sampling)
+ (unwind-protect (excl:call-next-fwrapper)
+ (prof:stop-sampling))))
+ (t
+ (excl:call-next-fwrapper))))
+
+(defimplementation profile (fname)
+ (unless (acl-profiler-active-p)
+ (start-acl-profiler))
+ (excl:fwrap fname 'profile-fwrapper 'profile-fwrapper)
+ (push fname *profiled-functions*))
+
+(defimplementation profiled-functions ()
+ *profiled-functions*)
+
+(defimplementation unprofile (fname)
+ (excl:funwrap fname 'profile-fwrapper)
+ (setq *profiled-functions* (remove fname *profiled-functions*)))
+
+(defimplementation profile-report ()
+ (prof:show-flat-profile :verbose nil)
+ (when *profiled-functions*
+ (start-acl-profiler)))
+
+(defimplementation profile-reset ()
+ (when (acl-profiler-active-p)
+ (stop-acl-profiler)
+ (start-acl-profiler))
+ "Reset profiling counters.")
+
;;;; Inspecting
(defclass acl-inspector (inspector)
@@ -479,7 +574,6 @@
(defimplementation make-default-inspector ()
(make-instance 'acl-inspector))
-#-allegro-v5.0
(defmethod inspect-for-emacs ((f function) inspector)
inspector
(values "A function."
@@ -498,6 +592,10 @@
inspector
(values "A function." (allegro-inspect o)))
+(defmethod inspect-for-emacs ((o standard-object) (inspector acl-inspector))
+ inspector
+ (values (format nil "~A is a standard-object." o) (allegro-inspect o)))
+
(defun allegro-inspect (o)
(loop for (d dd) on (inspect::inspect-ctl o)
append (frob-allegro-field-def o d)
@@ -506,8 +604,9 @@
(defun frob-allegro-field-def (object def)
(with-struct (inspect::field-def- name type access) def
(ecase type
- ((:unsigned-word :unsigned-byte :unsigned-natural
- :unsigned-half-long :unsigned-3byte)
+ ((:unsigned-word :unsigned-byte :unsigned-natural
+ :unsigned-long :unsigned-half-long
+ :unsigned-3byte)
(label-value-line name (inspect::component-ref-v object access type)))
((:lisp :value)
(label-value-line name (inspect::component-ref object access)))
@@ -520,8 +619,9 @@
;;;; Multithreading
-(defimplementation startup-multiprocessing ()
- (mp:start-scheduler))
+(defimplementation initialize-multiprocessing (continuation)
+ (mp:start-scheduler)
+ (funcall continuation))
(defimplementation spawn (fn &key name)
(mp:process-run-function name fn))
@@ -631,7 +731,6 @@
(eval `(trace (,fspec ,@args)))
(format nil "~S is now traced." fspec))))
-#-allegro-v5.0
(defun toggle-trace-generic-function-methods (name)
(let ((methods (mop:generic-function-methods (fdefinition name))))
(cond ((tracedp name)
@@ -655,3 +754,20 @@
,(third fspec)))))
(t
fspec)))
+
+
+;;;; Weak hashtables
+
+(defimplementation make-weak-key-hash-table (&rest args)
+ (apply #'make-hash-table :weak-keys t args))
+
+(defimplementation make-weak-value-hash-table (&rest args)
+ (apply #'make-hash-table :values :weak args))
+
+
+;;;; Character names
+
+(defimplementation character-completion-set (prefix matchp)
+ (loop for name being the hash-keys of excl::*name-to-char-table*
+ when (funcall matchp prefix name)
+ collect (string-capitalize name)))
Modified: trunk/thirdparty/emacs/slime/swank-backend.lisp
===================================================================
--- trunk/thirdparty/emacs/slime/swank-backend.lisp 2006-11-30 14:00:03 UTC (rev 2091)
+++ trunk/thirdparty/emacs/slime/swank-backend.lisp 2006-11-30 16:32:54 UTC (rev 2092)
@@ -15,6 +15,8 @@
(:export #:sldb-condition
#:original-condition
#:compiler-condition
+ #:abort-request
+ #:request-abort
#:message
#:short-message
#:condition
@@ -84,6 +86,8 @@
#:slot-definition-type
#:slot-definition-readers
#:slot-definition-writers
+ #:slot-boundp-using-class
+ #:slot-value-using-class
;; generic function protocol
#:compute-applicable-methods-using-classes
#:finalize-inheritance))
@@ -110,26 +114,67 @@
Backends implement these functions using DEFIMPLEMENTATION."
(check-type documentation string "a documentation string")
- (flet ((gen-default-impl ()
- `(defmethod ,name ,args ,@default-body)))
- `(progn (defgeneric ,name ,args (:documentation ,documentation))
- (pushnew ',name *interface-functions*)
- ,(if (null default-body)
- `(pushnew ',name *unimplemented-interfaces*)
- (gen-default-impl))
- ;; see <http://www.franz.com/support/documentation/6.2/doc/pages/variables/compiler…>
- (eval-when (:compile-toplevel :load-toplevel :execute)
- (export ',name :swank-backend))
- ',name)))
+ (assert (every #'symbolp args) ()
+ "Complex lambda-list not supported: ~S ~S" name args)
+ (labels ((gen-default-impl ()
+ `(setf (get ',name 'default) (lambda ,args ,@default-body)))
+ (args-as-list (args)
+ (destructuring-bind (req opt key rest) (parse-lambda-list args)
+ `(,@req ,@opt
+ ,@(loop for k in key append `(,(kw k) ,k))
+ ,@(or rest '(())))))
+ (parse-lambda-list (args)
+ (parse args '(&optional &key &rest)
+ (make-array 4 :initial-element nil)))
+ (parse (args keywords vars)
+ (cond ((null args)
+ (reverse (map 'list #'reverse vars)))
+ ((member (car args) keywords)
+ (parse (cdr args) (cdr (member (car args) keywords)) vars))
+ (t (push (car args) (aref vars (length keywords)))
+ (parse (cdr args) keywords vars))))
+ (kw (s) (intern (string s) :keyword)))
+ `(progn
+ (defun ,name ,args
+ ,documentation
+ (let ((f (or (get ',name 'implementation)
+ (get ',name 'default))))
+ (cond (f (apply f ,@(args-as-list args)))
+ (t (error "~S not implementated" ',name)))))
+ (pushnew ',name *interface-functions*)
+ ,(if (null default-body)
+ `(pushnew ',name *unimplemented-interfaces*)
+ (gen-default-impl))
+ ;; see <http://www.franz.com/support/documentation/6.2/doc/pages/variables/compiler…>
+ (eval-when (:compile-toplevel :load-toplevel :execute)
+ (export ',name :swank-backend))
+ ',name)))
(defmacro defimplementation (name args &body body)
- `(progn (defmethod ,name ,args ,@body)
- (if (member ',name *interface-functions*)
- (setq *unimplemented-interfaces*
- (remove ',name *unimplemented-interfaces*))
- (warn "DEFIMPLEMENTATION of undefined interface (~S)" ',name))
- ',name))
+ (assert (every #'symbolp args) ()
+ "Complex lambda-list not supported: ~S ~S" name args)
+ `(progn
+ (setf (get ',name 'implementation) (lambda ,args ,@body))
+ (if (member ',name *interface-functions*)
+ (setq *unimplemented-interfaces*
+ (remove ',name *unimplemented-interfaces*))
+ (warn "DEFIMPLEMENTATION of undefined interface (~S)" ',name))
+ ',name))
+(define-condition request-abort (error)
+ ((reason :initarg :reason :reader reason))
+ (:report (lambda (condition stream)
+ (princ (reason condition) stream)))
+ (:documentation "Condition signalled when SLIME wasn't able to
+complete a user request due to bad data. This condition is not
+for real errors but for situations where SLIME has to give up and
+return control back to the user."))
+
+(defun abort-request (reason-control &rest reason-args)
+ "Abort whatever swank is currently do and send a message to the
+user."
+ (error 'request-abort :reason (apply #'format nil reason-control reason-args)))
+
(defun warn-unimplemented-interfaces ()
"Warn the user about unimplemented backend features.
The portable code calls this function at startup."
@@ -155,6 +200,31 @@
(import real-symbol :swank-mop)
(export real-symbol :swank-mop)))))
+(defvar *gray-stream-symbols*
+ '(:fundamental-character-output-stream
+ :stream-write-char
+ :stream-fresh-line
+ :stream-force-output
+ :stream-finish-output
+ :fundamental-character-input-stream
+ :stream-read-char
+ :stream-listen
+ :stream-unread-char
+ :stream-clear-input
+ :stream-line-column
+ :stream-read-char-no-hang
+ ;; STREAM-LINE-LENGTH is an extension to gray streams that's apparently
+ ;; supported by CMUCL, OpenMCL, SBCL and SCL.
+ #+(or cmu openmcl sbcl scl)
+ :stream-line-length))
+
+(defun import-from (package symbol-names &optional (to-package *package*))
+ "Import the list of SYMBOL-NAMES found in the package PACKAGE."
+ (dolist (name symbol-names)
+ (multiple-value-bind (symbol found) (find-symbol (string name) package)
+ (assert found () "Symbol ~A not found in package ~A" name package)
+ (import symbol to-package))))
+
;;;; Utilities
@@ -186,9 +256,10 @@
(definterface close-socket (socket)
"Close the socket SOCKET.")
-(definterface accept-connection (socket &key external-format)
- "Accept a client connection on the listening socket SOCKET. Return
-a stream for the new connection.")
+(definterface accept-connection (socket &key external-format
+ buffering timeout)
+ "Accept a client connection on the listening socket SOCKET.
+Return a stream for the new connection.")
(definterface add-sigio-handler (socket fn)
"Call FN whenever SOCKET is readable.")
@@ -206,6 +277,12 @@
"Return one of the symbols :spawn, :sigio, :fd-handler, or NIL."
nil)
+(definterface set-stream-timeout (stream timeout)
+ "Set the 'stream 'timeout. The timeout is either the real number
+ specifying the timeout in seconds or 'nil for no timeout."
+ (declare (ignore stream timeout))
+ nil)
+
;;; Base condition for networking errors.
(define-condition network-error (simple-error) ())
@@ -285,17 +362,19 @@
Example:
\(operate-on-system \"SWANK\" \"COMPILE-OP\" :force t)"
(unless (member :asdf *features*)
- (error "ASDF is not loaded."))
+ (abort-request "ASDF is not loaded."))
(with-compilation-hooks ()
- (let ((operate (find-symbol "OPERATE" :asdf))
+ (let ((operate (find-symbol (symbol-name '#:operate) :asdf))
(operation (find-symbol operation-name :asdf)))
(when (null operation)
- (error "Couldn't find ASDF operation ~S" operation-name))
+ (abort-request "Couldn't find ASDF operation ~S" operation-name))
(apply operate operation system-name keyword-args))))
-(definterface swank-compile-file (filename load-p)
+(definterface swank-compile-file (filename load-p external-format)
"Compile FILENAME signalling COMPILE-CONDITIONs.
-If LOAD-P is true, load the file after compilation.")
+If LOAD-P is true, load the file after compilation.
+EXTERNAL-FORMAT is a value returned by find-external-format or
+:default.")
(deftype severity ()
'(member :error :read-error :warning :style-warning :note))
@@ -327,6 +406,48 @@
(location :initarg :location
:accessor location)))
+(definterface find-external-format (coding-system)
+ "Return a \"external file format designator\" for CODING-SYSTEM.
+CODING-SYSTEM is Emacs-style coding system name (a string),
+e.g. \"latin-1-unix\"."
+ (if (equal coding-system "iso-latin-1-unix")
+ :default
+ nil))
+
+(definterface guess-external-format (filename)
+ "Detect the external format for the file with name FILENAME.
+Return nil if the file contains no special markers."
+ ;; Look for a Emacs-style -*- coding: ... -*- or Local Variable: section.
+ (with-open-file (s filename :if-does-not-exist nil
+ :external-format (or (find-external-format "latin-1-unix")
+ :default))
+ (or (let* ((line (read-line s nil))
+ (p (search "-*-" line)))
+ (when p
+ (let* ((start (+ p (length "-*-")))
+ (end (search "-*-" line :start2 start)))
+ (when end
+ (%search-coding line start end)))))
+ (let* ((len (file-length s))
+ (buf (make-string (min len 3000))))
+ (file-position s (- len (length buf)))
+ (read-sequence buf s)
+ (let ((start (search "Local Variables:" buf :from-end t))
+ (end (search "End:" buf :from-end t)))
+ (and start end (< start end)
+ (%search-coding buf start end)))))))
+
+(defun %search-coding (str start end)
+ (let ((p (search "coding:" str :start2 start :end2 end)))
+ (when p
+ (incf p (length "coding:"))
+ (loop while (and (< p end)
+ (member (aref str p) '(#\space #\tab)))
+ do (incf p))
+ (let ((end (position-if (lambda (c) (find c '(#\space #\tab #\newline)))
+ str :start p)))
+ (find-external-format (subseq str p end))))))
+
;;;; Streams
@@ -373,17 +494,40 @@
"Recursively expand all macros in FORM.
Return the resulting form.")
+(definterface compiler-macroexpand-1 (form &optional env)
+ "Call the compiler-macro for form.
+If FORM is a function call for which a compiler-macro has been
+defined, invoke the expander function using *macroexpand-hook* and
+return the results and T. Otherwise, return the original form and
+NIL."
+ (let ((fun (and (consp form) (compiler-macro-function (car form)))))
+ (if fun
+ (let ((result (funcall *macroexpand-hook* fun form env)))
+ (values result (not (eq result form))))
+ (values form nil))))
+
+(definterface compiler-macroexpand (form &optional env)
+ "Repetitively call `compiler-macroexpand-1'."
+ (labels ((frob (form expanded)
+ (multiple-value-bind (new-form newly-expanded)
+ (compiler-macroexpand-1 form env)
+ (if newly-expanded
+ (frob new-form t)
+ (values new-form expanded)))))
+ (frob form env)))
+
(definterface describe-symbol-for-emacs (symbol)
"Return a property list describing SYMBOL.
The property list has an entry for each interesting aspect of the
symbol. The recognised keys are:
- :VARIABLE :FUNCTION :SETF :TYPE :CLASS :MACRO :COMPILER-MACRO
- :ALIEN-TYPE :ALIEN-STRUCT :ALIEN-UNION :ALIEN-ENUM
+ :VARIABLE :FUNCTION :SETF :SPECIAL-OPERATOR :MACRO :COMPILER-MACRO
+ :TYPE :CLASS :ALIEN-TYPE :ALIEN-STRUCT :ALIEN-UNION :ALIEN-ENUM
The value of each property is the corresponding documentation string,
-or :NOT-DOCUMENTED. It is legal to include keys not listed here.
+or :NOT-DOCUMENTED. It is legal to include keys not listed here (but
+slime-print-apropos in Emacs must know about them).
Properties should be included if and only if they are applicable to
the symbol. For example, only (and all) fbound symbols should include
@@ -404,6 +548,12 @@
;;;; Debugging
+(definterface install-debugger-globally (function)
+ "Install FUNCTION as the debugger for all threads/processes. This
+usually involves setting *DEBUGGER-HOOK* and, if the implementation
+permits, hooking into BREAK as well."
+ (setq *debugger-hook* function))
+
(definterface call-with-debugging-environment (debugger-loop-fn)
"Call DEBUGGER-LOOP-FN in a suitable debugging environment.
@@ -530,7 +680,22 @@
(definterface sldb-break-at-start (symbol)
"Set a breakpoint on the beginning of the function for SYMBOL.")
+(definterface sldb-stepper-condition-p (condition)
+ "Return true if SLDB was invoked due to a single-stepping condition,
+false otherwise. "
+ (declare (ignore condition))
+ nil)
+(definterface sldb-step-into ()
+ "Step into the current single-stepper form.")
+
+(definterface sldb-step-next ()
+ "Step to the next form in the current function.")
+
+(definterface sldb-step-out ()
+ "Stop single-stepping temporarily, but resume it once the current function
+returns.")
+
;;;; Definition finding
@@ -661,8 +826,9 @@
(definterface make-default-inspector ()
"Return an inspector object suitable for passing to inspect-for-emacs.")
-(definterface inspect-for-emacs (object inspector)
- "Explain to emacs how to inspect OBJECT.
+(defgeneric inspect-for-emacs (object inspector)
+ (:documentation
+ "Explain to Emacs how to inspect OBJECT.
The argument INSPECTOR is an object representing how to get at
the internals of OBJECT, it is usually an implementation specific
@@ -687,7 +853,7 @@
(:action label lambda) - Render LABEL (a text string) which when
clicked will call LAMBDA.
- NIL - do nothing.")
+ NIL - do nothing."))
(defmethod inspect-for-emacs ((object t) (inspector t))
"Generic method for inspecting any kind of object.
@@ -695,13 +861,12 @@
Since we don't know how to deal with OBJECT we simply dump the
output of CL:DESCRIBE."
(declare (ignore inspector))
- (values "A value."
- `("Type: " (:value ,(type-of object))
- (:newline)
- "Don't know how to inspect the object, dumping output of CL:DESCIRBE:"
- (:newline) (:newline)
- ,(with-output-to-string (desc)
- (describe object desc)))))
+ (values
+ "A value."
+ `("Type: " (:value ,(type-of object)) (:newline)
+ "Don't know how to inspect the object, dumping output of CL:DESCRIBE:"
+ (:newline) (:newline)
+ ,(with-output-to-string (desc) (describe object desc)))))
;;; Utilities for inspector methods.
;;;
@@ -724,14 +889,11 @@
;;; The default implementations are sufficient for non-multiprocessing
;;; implementations.
-(definterface startup-multiprocessing ()
- "Initialize multiprocessing, if necessary.
+(definterface initialize-multiprocessing (continuation)
+ "Initialize multiprocessing, if necessary and then invoke CONTINUATION.
-This function is called directly through the listener, not in an RPC
-from Emacs. This is to support interfaces such as CMUCL's
-MP::STARTUP-IDLE-AND-TOP-LEVEL-LOOPS which does not return like a
-normal function."
- nil)
+Depending on the impleimentaion, this function may never return."
+ (funcall continuation))
(definterface spawn (fn &key name)
"Create a new thread to call FN.")
@@ -772,6 +934,24 @@
(type function function))
(funcall function))
+(definterface make-recursive-lock (&key name)
+ "Make a lock for thread synchronization.
+Only one thread may hold the lock (via CALL-WITH-RECURSIVE-LOCK-HELD)
+at a time, but that thread may hold it more than once."
+ (cons nil (make-lock :name name)))
+
+(definterface call-with-recursive-lock-held (lock function)
+ "Call FUNCTION with LOCK held, queueing if necessary."
+ (if (eql (car lock) (current-thread))
+ (funcall function)
+ (call-with-lock-held (cdr lock)
+ (lambda ()
+ (unwind-protect
+ (progn
+ (setf (car lock) (current-thread))
+ (funcall function))
+ (setf (car lock) nil))))))
+
(definterface current-thread ()
"Return the currently executing thread."
0)
@@ -806,3 +986,26 @@
(:call CALLER CALLEE) ; trace calls from CALLER to CALLEE.
(:labels TOPLEVEL LOCAL)
(:flet TOPLEVEL LOCAL) ")
+
+
+;;;; Weak datastructures
+
+(definterface make-weak-key-hash-table (&rest args)
+ "Like MAKE-HASH-TABLE, but weak w.r.t. the keys."
+ (apply #'make-hash-table args))
+
+(definterface make-weak-value-hash-table (&rest args)
+ "Like MAKE-HASH-TABLE, but weak w.r.t. the values."
+ (apply #'make-hash-table args))
+
+
+;;;; Character names
+
+(definterface character-completion-set (prefix matchp)
+ "Return a list of names of characters that match PREFIX."
+ ;; Handle the standard and semi-standard characters.
+ (loop for name in '("Newline" "Space" "Tab" "Page" "Rubout"
+ "Linefeed" "Return" "Backspace")
+ when (funcall matchp prefix name)
+ collect name))
+
Modified: trunk/thirdparty/emacs/slime/swank-clisp.lisp
===================================================================
--- trunk/thirdparty/emacs/slime/swank-clisp.lisp 2006-11-30 14:00:03 UTC (rev 2091)
+++ trunk/thirdparty/emacs/slime/swank-clisp.lisp 2006-11-30 16:32:54 UTC (rev 2092)
@@ -2,24 +2,34 @@
;;;; Copyright (C) 2003, 2004 W. Jenkner, V. Sedach
-;;;; swank-clisp.lisp is free software; you can redistribute it and/or
+;;;; This program is free software; you can redistribute it and/or
;;;; modify it under the terms of the GNU General Public License as
-;;;; published by the Free Software Foundation; either version 2, or
-;;;; (at your option) any later version.
+;;;; published by the Free Software Foundation; either version 2 of
+;;;; the License, or (at your option) any later version.
+;;;; This program is distributed in the hope that it will be useful,
+;;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;;;; GNU General Public License for more details.
+
+;;;; You should have received a copy of the GNU General Public
+;;;; License along with this program; if not, write to the Free
+;;;; Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+;;;; MA 02111-1307, USA.
+
;;; This is work in progress, but it's already usable. Many things
;;; are adapted from other swank-*.lisp, in particular from
;;; swank-allegro (I don't use allegro at all, but it's the shortest
;;; one and I found Helmut Eller's code there enlightening).
-;;; This code is developed using the current CVS version of CLISP and
-;;; CLISP 2.32 on Linux. Older versions may not work (2.29 and below
-;;; are confirmed non-working; please upgrade). You need an image
-;;; containing the "SOCKET", "REGEXP", and "LINUX" packages. The
-;;; portable xref from the CMU AI repository and metering.lisp from
-;;; CLOCC [1] are also required (alternatively, you have to manually
-;;; comment out some code below).
-;;;
+;;; This code will work better with recent versions of CLISP (say, the
+;;; last release or CVS HEAD) while it may not work at all with older
+;;; versions. It is reasonable to expect it to work on platforms with
+;;; a "SOCKET" package, in particular on GNU/Linux or Unix-like
+;;; systems, but also on Win32. This backend uses the portable xref
+;;; from the CMU AI repository and metering.lisp from CLOCC [1], which
+;;; are conveniently included in SLIME.
+
;;; [1] http://cvs.sourceforge.net/viewcvs.py/clocc/clocc/src/tools/metering/
(in-package :swank-backend)
@@ -28,12 +38,8 @@
;;(use-package "SOCKET")
(use-package "GRAY"))
-(eval-when (:compile-toplevel :execute)
- (when (find-package "LINUX")
- (pushnew :linux *features*)))
-
-;;;; if this listp has the complete CLOS then we use it, othewise we
-;;;; build up a "fake" swank-mop and then overide the methods in the
+;;;; if this lisp has the complete CLOS then we use it, otherwise we
+;;;; build up a "fake" swank-mop and then override the methods in the
;;;; inspector.
(eval-when (:compile-toplevel :load-toplevel :execute)
@@ -42,7 +48,7 @@
(eql :external
(nth-value 1 (find-symbol (string ':standard-slot-definition)
:clos))))
- "True in those CLISP imagse which have a complete MOP implementation."))
+ "True in those CLISP images which have a complete MOP implementation."))
#+#.(cl:if swank-backend::*have-mop* '(cl:and) '(cl:or))
(progn
@@ -57,44 +63,40 @@
(:documentation
"Dummy class created so that swank.lisp will compile and load."))
-#+linux
-(defmacro with-blocked-signals ((&rest signals) &body body)
- (ext:with-gensyms ("SIGPROCMASK" ret mask)
- `(multiple-value-bind (,ret ,mask)
- (linux:sigprocmask-set-n-save
- ,linux:SIG_BLOCK
- ,(do ((sigset (linux:sigset-empty)
- (linux:sigset-add sigset (the fixnum (pop signals)))))
- ((null signals) sigset)))
- (linux:check-res ,ret 'linux:sigprocmask-set-n-save)
- (unwind-protect
- (progn ,@body)
- (linux:sigprocmask-set ,linux:SIG_SETMASK ,mask nil)))))
+;; #+#.(cl:if (cl:find-package "LINUX") '(and) '(or))
+;; (progn
+;; (defmacro with-blocked-signals ((&rest signals) &body body)
+;; (ext:with-gensyms ("SIGPROCMASK" ret mask)
+;; `(multiple-value-bind (,ret ,mask)
+;; (linux:sigprocmask-set-n-save
+;; ,linux:SIG_BLOCK
+;; ,(do ((sigset (linux:sigset-empty)
+;; (linux:sigset-add sigset (the fixnum (pop signals)))))
+;; ((null signals) sigset)))
+;; (linux:check-res ,ret 'linux:sigprocmask-set-n-save)
+;; (unwind-protect
+;; (progn ,@body)
+;; (linux:sigprocmask-set ,linux:SIG_SETMASK ,mask nil)))))
-;; XXX currently only works in CVS version. 2.32 breaks.
-;; #+linux
-;; (defimplementation call-without-interrupts (fn)
-;; (with-blocked-signals (#.linux:SIGINT) (funcall fn)))
-;;
-;; #-linux
+;; (defimplementation call-without-interrupts (fn)
+;; (with-blocked-signals (#.linux:SIGINT) (funcall fn))))
+
+;; #+#.(cl:if (cl:find-package "LINUX") '(or) '(and))
(defimplementation call-without-interrupts (fn)
(funcall fn))
-#+unix
-(defmethod getpid ()
- (funcall (or (find-symbol "PROGRAM-ID" :system)
- (find-symbol "PROCESS-ID" :system)
- (error "getpid not implemented"))))
+(let ((getpid (or (find-symbol "PROCESS-ID" :system)
+ ;; old name prior to 2005-03-01, clisp <= 2.33.2
+ (find-symbol "PROGRAM-ID" :system)
+ #+win32 ; integrated into the above since 2005-02-24
+ (and (find-package :win32) ; optional modules/win32
+ (find-symbol "GetCurrentProcessId" :win32)))))
+ (defimplementation getpid () ; a required interface
+ (cond
+ (getpid (funcall getpid))
+ #+win32 ((ext:getenv "PID")) ; where does that come from?
+ (t -1))))
-#+win32
-(defmethod getpid ()
- (cond ((find-package :win32)
- (funcall (find-symbol "GetCurrentProcessId" :win32)))
- (t
- (system::getenv "PID"))))
-
-;; the above is likely broken; we need windows NT users!
-
(defimplementation lisp-implementation-type-name ()
"clisp")
@@ -114,26 +116,45 @@
(defimplementation close-socket (socket)
(socket:socket-server-close socket))
-
-(defun find-encoding (external-format)
- (ecase external-format
- (:iso-latin-1-unix (ext:make-encoding :charset 'charset:iso-8859-1
- :line-terminator :unix))
- (:utf-8-unix (ext:make-encoding :charset 'charset:utf-8
- :line-terminator :unix))))
(defimplementation accept-connection (socket
- &key (external-format :iso-latin-1-unix))
+ &key external-format buffering timeout)
+ (declare (ignore buffering timeout))
(socket:socket-accept socket
:buffered nil ;; XXX should be t
:element-type 'character
- :external-format (find-encoding external-format)))
+ :external-format external-format))
+;;; Coding systems
+
+(defvar *external-format-to-coding-system*
+ '(((:charset "iso-8859-1" :line-terminator :unix)
+ "latin-1-unix" "iso-latin-1-unix" "iso-8859-1-unix")
+ ((:charset "iso-8859-1":latin-1)
+ "latin-1" "iso-latin-1" "iso-8859-1")
+ ((:charset "utf-8") "utf-8")
+ ((:charset "utf-8" :line-terminator :unix) "utf-8-unix")
+ ((:charset "euc-jp") "euc-jp")
+ ((:charset "euc-jp" :line-terminator :unix) "euc-jp-unix")
+ ((:charset "us-ascii") "us-ascii")
+ ((:charset "us-ascii" :line-terminator :unix) "us-ascii-unix")))
+
+(defimplementation find-external-format (coding-system)
+ (let ((args (car (rassoc-if (lambda (x)
+ (member coding-system x :test #'equal))
+ *external-format-to-coding-system*))))
+ (and args (apply #'ext:make-encoding args))))
+
+
;;; Swank functions
(defimplementation arglist (fname)
(block nil
- (or (ignore-errors (return (ext:arglist fname)))
+ (or (ignore-errors
+ (let ((exp (function-lambda-expression fname)))
+ (and exp (return (second exp)))))
+ (ignore-errors
+ (return (ext:arglist fname)))
:not-available)))
(defimplementation macroexpand-all (form)
@@ -143,18 +164,44 @@
"Return a plist describing SYMBOL.
Return NIL if the symbol is unbound."
(let ((result ()))
- (labels ((doc (kind)
- (or (documentation symbol kind) :not-documented))
- (maybe-push (property value)
- (when value
- (setf result (list* property value result)))))
+ (flet ((doc (kind)
+ (or (documentation symbol kind) :not-documented))
+ (maybe-push (property value)
+ (when value
+ (setf result (list* property value result)))))
+ (maybe-push :variable (when (boundp symbol) (doc 'variable)))
(when (fboundp symbol)
- (if (macro-function symbol)
- (setf (getf result :macro) (doc 'function))
- (setf (getf result :function) (doc 'function))))
- (maybe-push :variable (when (boundp symbol) (doc 'variable)))
- (maybe-push :class (when (find-class symbol nil)
- (doc 'type))) ;this should be fixed
+ (maybe-push
+ ;; Report WHEN etc. as macros, even though they may be
+ ;; implemented as special operators.
+ (if (macro-function symbol) :macro
+ (typecase (fdefinition symbol)
+ (generic-function :generic-function)
+ (function :function)
+ ;; (type-of 'progn) -> ext:special-operator
+ (t :special-operator)))
+ (doc 'function)))
+ (when (or (get symbol 'system::setf-function) ; e.g. #'(setf elt)
+ (get symbol 'system::setf-expander)); defsetf
+ (maybe-push :setf (doc 'setf)))
+ (when (or (get symbol 'system::type-symbol); cf. clisp/src/describe.lisp
+ (get symbol 'system::defstruct-description)
+ (get symbol 'system::deftype-expander))
+ (maybe-push :type (doc 'type))) ; even for 'structure
+ (when (find-class symbol nil)
+ (maybe-push :class (doc 'type)))
+ ;; Let this code work compiled in images without FFI
+ (let ((types (load-time-value
+ (and (find-package "FFI")
+ (symbol-value
+ (find-symbol "*C-TYPE-TABLE*" "FFI"))))))
+ ;; Use ffi::*c-type-table* so as not to suffer the overhead of
+ ;; (ignore-errors (ffi:parse-c-type symbol)) for 99.9% of symbols
+ ;; which are not FFI type names.
+ (when (and types (nth-value 1 (gethash symbol types)))
+ ;; Maybe use (case (head (ffi:deparse-c-type)))
+ ;; to distinguish struct and union types?
+ (maybe-push :alien-type :not-documented)))
result)))
(defimplementation describe-definition (symbol namespace)
@@ -165,21 +212,30 @@
(:class (describe (find-class symbol)))))
(defun fspec-pathname (symbol)
- (let ((path (getf (gethash symbol sys::*documentation*) 'sys::file)))
- (if (and path
- (member (pathname-type path)
- custom:*compiled-file-types* :test #'string=))
- (loop for suffix in custom:*source-file-types*
- thereis (make-pathname :defaults path :type suffix))
- path)))
+ (let ((path (documentation symbol 'sys::file))
+ lines)
+ (when (consp path)
+ (psetq path (car path)
+ lines (cdr path)))
+ (when (and path
+ (member (pathname-type path)
+ custom:*compiled-file-types* :test #'equal))
+ (setq path
+ (loop for suffix in custom:*source-file-types*
+ thereis (probe-file (make-pathname :defaults path
+ :type suffix)))))
+ (values path lines)))
(defun fspec-location (fspec)
- (let ((file (fspec-pathname fspec)))
+ (multiple-value-bind (file lines)
+ (fspec-pathname fspec)
(cond (file
(multiple-value-bind (truename c) (ignore-errors (truename file))
- (cond (truename
+ (cond (truename
(make-location (list :file (namestring truename))
- (list :function-name (string fspec))))
+ (if (consp lines)
+ (list* :line lines)
+ (list :function-name (string fspec)))))
(t (list :error (princ-to-string c))))))
(t (list :error (format nil "No source information available for: ~S"
fspec))))))
@@ -187,61 +243,97 @@
(defimplementation find-definitions (name)
(list (list name (fspec-location name))))
-(defvar *sldb-topframe*)
-(defvar *sldb-botframe*)
-(defvar *sldb-source*)
-(defvar *sldb-debugmode* 4)
+(defun trim-whitespace (string)
+ (string-trim #(#\newline #\space #\tab) string))
-(defun frame-down (frame)
- (sys::frame-down-1 frame sys::*debug-mode*))
+(defvar *sldb-backtrace*)
-(defun frame-up (frame)
- (sys::frame-up-1 frame sys::*debug-mode*))
-
(defimplementation call-with-debugging-environment (debugger-loop-fn)
- (let* ((sys::*break-count* (1+ sys::*break-count*))
- (sys::*driver* debugger-loop-fn)
- (sys::*fasoutput-stream* nil)
- (sys::*frame-limit1* (sys::frame-limit1 0))
- (sys::*frame-limit2* (sys::frame-limit2))
- (sys::*debug-mode* *sldb-debugmode*)
- (*sldb-topframe* sys::*frame-limit1*))
+ (let* (;;(sys::*break-count* (1+ sys::*break-count*))
+ ;;(sys::*driver* debugger-loop-fn)
+ ;;(sys::*fasoutput-stream* nil)
+ (*sldb-backtrace* (nthcdr 5 (sldb-backtrace))))
(funcall debugger-loop-fn)))
-(defun nth-frame (index)
- (loop for frame = *sldb-topframe* then (frame-up frame)
- repeat index
- finally (return frame)))
+(defun nth-frame (index)
+ (nth index *sldb-backtrace*))
+;; This is the old backtrace implementation. Not sure yet wheter the
+;; new is much better.
+;;
+;;(defimplementation compute-backtrace (start end)
+;; (let ((end (or end most-positive-fixnum)))
+;; (loop for last = nil then frame
+;; for frame = (nth-frame start) then (frame-up frame)
+;; for i from start below end
+;; until (or (eq frame last) (not frame))
+;; collect frame)))
+;;
+;;(defimplementation print-frame (frame stream)
+;; (write-string (trim-whitespace
+;; (with-output-to-string (stream)
+;; (sys::describe-frame stream frame)))
+;; stream))
+;;
+;;(defimplementation frame-locals (frame-number)
+;; (let* ((frame (nth-frame frame-number))
+;; (frame-env (sys::eval-at frame '(sys::the-environment))))
+;; (append
+;; (frame-do-venv frame (svref frame-env 0))
+;; (frame-do-fenv frame (svref frame-env 1))
+;; (frame-do-benv frame (svref frame-env 2))
+;; (frame-do-genv frame (svref frame-env 3))
+;; (frame-do-denv frame (svref frame-env 4)))))
+;;
+;;(defimplementation frame-var-value (frame var)
+;; (getf (nth var (frame-locals frame)) :value))
+
+(defun format-frame (frame)
+ (trim-whitespace
+ (with-output-to-string (s)
+ (sys::describe-frame s frame))))
+
+(defun function-frame-p (frame)
+ ;; We are interested in frames which like look "<5> foo ...".
+ ;; Ugly, I know.
+ (char= #\< (aref (format-frame frame) 0)))
+
+(defun sldb-backtrace ()
+ "Return a list ((ADDRESS . DESCRIPTION) ...) of frames."
+ (do ((fframes '())
+ (last nil frame)
+ (frame (sys::the-frame) (sys::frame-up-1 frame 1)))
+ ((eq frame last) (nreverse fframes))
+ (when (function-frame-p frame)
+ (push (cons frame (format-frame frame)) fframes))))
+
(defimplementation compute-backtrace (start end)
- (let ((end (or end most-positive-fixnum)))
- (loop for last = nil then frame
- for frame = (nth-frame start) then (frame-up frame)
- for i from start below end
- until (or (eq frame last) (system::driver-frame-p frame))
- collect frame)))
+ (let* ((bt *sldb-backtrace*)
+ (len (length bt)))
+ (subseq bt start (min (or end len) len))))
(defimplementation print-frame (frame stream)
- (write-string (string-left-trim '(#\Newline)
- (with-output-to-string (stream)
- (sys::describe-frame stream frame)))
- stream))
+ (let ((desc (cdr frame)))
+ (write-string (subseq (cdr frame)
+ (+ (position #\> desc) 2)
+ (position #\newline desc))
+ stream)))
+(defimplementation format-sldb-condition (condition)
+ (trim-whitespace (princ-to-string condition)))
+
(defimplementation eval-in-frame (form frame-number)
- (sys::eval-at (nth-frame frame-number) form))
+ (sys::eval-at (car (nth-frame frame-number)) form))
-(defimplementation frame-locals (frame-number)
- (let* ((frame (nth-frame frame-number))
- (frame-env (sys::eval-at frame '(sys::the-environment))))
- (append
- (frame-do-venv frame (svref frame-env 0))
- (frame-do-fenv frame (svref frame-env 1))
- (frame-do-benv frame (svref frame-env 2))
- (frame-do-genv frame (svref frame-env 3))
- (frame-do-denv frame (svref frame-env 4)))))
+;; Don't know how to access locals. Return some strings instead.
+;; Maybe we should search some frame nearby with a 'sys::the-environment?
+(defimplementation frame-locals (frame-number)
+ (let ((desc (cdr (nth-frame frame-number))))
+ (list (list :name :|| :id 0
+ :value (trim-whitespace
+ (subseq desc (position #\newline desc)))))))
-(defimplementation frame-var-value (frame var)
- (getf (nth var (frame-locals frame)) :value))
+(defimplementation frame-var-value (frame var) nil)
;; Interpreter-Variablen-Environment has the shape
;; NIL or #(v1 val1 ... vn valn NEXT-ENV).
@@ -278,17 +370,15 @@
nil)
(defimplementation return-from-frame (index form)
- (sys::return-from-eval-frame (nth-frame index) form))
+ (sys::return-from-eval-frame (car (nth-frame index)) form))
(defimplementation restart-frame (index)
- (sys::redo-eval-frame (nth-frame index)))
+ (sys::redo-eval-frame (car (nth-frame index))))
(defimplementation frame-source-location-for-emacs (index)
- (let ((f (nth-frame index)))
- (list :error (format nil "Cannot find source for frame: ~A ~A ~A"
- f
- (sys::eval-frame-p f)
- (sys::the-frame)))))
+ `(:error
+ ,(format nil "frame-source-location not implemented. (frame: ~A)"
+ (car (nth-frame index)))))
;;; Profiling
@@ -390,10 +480,11 @@
:message (princ-to-string condition)
:location (compiler-note-location))))
-(defimplementation swank-compile-file (filename load-p)
+(defimplementation swank-compile-file (filename load-p external-format)
(with-compilation-hooks ()
(with-compilation-unit ()
- (let ((fasl-file (compile-file filename)))
+ (let ((fasl-file (compile-file filename
+ :external-format external-format)))
(when (and load-p fasl-file)
(load fasl-file))
nil))))
Modified: trunk/thirdparty/emacs/slime/swank-cmucl.lisp
===================================================================
--- trunk/thirdparty/emacs/slime/swank-cmucl.lisp 2006-11-30 14:00:03 UTC (rev 2091)
+++ trunk/thirdparty/emacs/slime/swank-cmucl.lisp 2006-11-30 16:32:54 UTC (rev 2092)
@@ -94,13 +94,15 @@
(nth-value 1 (ext::get-socket-host-and-port (socket-fd socket))))
(defimplementation close-socket (socket)
- (sys:invalidate-descriptor socket)
- (ext:close-socket (socket-fd socket)))
+ (let ((fd (socket-fd socket)))
+ (sys:invalidate-descriptor fd)
+ (ext:close-socket fd)))
-(defimplementation accept-connection (socket &key external-format)
- (let ((ef (or external-format :iso-latin-1-unix)))
- (assert (eq ef ':iso-latin-1-unix))
- (make-socket-io-stream (ext:accept-tcp-connection socket))))
+(defimplementation accept-connection (socket &key
+ external-format buffering timeout)
+ (declare (ignore timeout external-format))
+ (let ((buffering (or buffering :full)))
+ (make-socket-io-stream (ext:accept-tcp-connection socket) buffering)))
;;;;; Sockets
@@ -115,9 +117,10 @@
(let ((hostent (ext:lookup-host-entry hostname)))
(car (ext:host-entry-addr-list hostent))))
-(defun make-socket-io-stream (fd)
+(defun make-socket-io-stream (fd buffering)
"Create a new input/output fd-stream for FD."
- (sys:make-fd-stream fd :input t :output t :element-type 'base-char))
+ (sys:make-fd-stream fd :input t :output t :element-type 'base-char
+ :buffering buffering))
;;;;; Signal-driven I/O
@@ -149,16 +152,13 @@
(defimplementation remove-sigio-handlers (socket)
(let ((fd (socket-fd socket)))
(setf *sigio-handlers* (remove fd *sigio-handlers* :key #'car))
- (sys:invalidate-descriptor fd))
- (close socket))
+ (sys:invalidate-descriptor fd)))
;;;;; SERVE-EVENT
(defimplementation add-fd-handler (socket fn)
(let ((fd (socket-fd socket)))
- (sys:add-fd-handler fd :input (lambda (_)
- _
- (funcall fn)))))
+ (sys:add-fd-handler fd :input (lambda (_) _ (funcall fn)))))
(defimplementation remove-fd-handlers (socket)
(sys:invalidate-descriptor (socket-fd socket)))
@@ -181,40 +181,61 @@
(:print-function %print-slime-output-stream)
(:constructor make-slime-output-stream (output-fn)))
(output-fn nil :type function)
- (buffer (make-string 512) :type string)
+ (buffer (make-string 8000) :type string)
(index 0 :type kernel:index)
- (column 0 :type kernel:index))
+ (column 0 :type kernel:index)
+ (last-flush-time (get-internal-real-time) :type unsigned-byte))
(defun %print-slime-output-stream (s stream d)
(declare (ignore d))
(print-unreadable-object (s stream :type t :identity t)))
(defun sos/out (stream char)
- (let ((buffer (sos.buffer stream))
- (index (sos.index stream)))
- (setf (schar buffer index) char)
- (setf (sos.index stream) (1+ index))
- (incf (sos.column stream))
- (when (char= #\newline char)
- (setf (sos.column stream) 0)
- (force-output stream))
- (when (= index (1- (length buffer)))
- (force-output stream)))
- char)
+ (system:without-interrupts
+ (let ((buffer (sos.buffer stream))
+ (index (sos.index stream)))
+ (setf (schar buffer index) char)
+ (setf (sos.index stream) (1+ index))
+ (incf (sos.column stream))
+ (when (char= #\newline char)
+ (setf (sos.column stream) 0)
+ (force-output stream))
+ (when (= index (1- (length buffer)))
+ (finish-output stream)))
+ char))
(defun sos/sout (stream string start end)
- (loop for i from start below end
- do (sos/out stream (aref string i))))
+ (system:without-interrupts
+ (loop for i from start below end
+ do (sos/out stream (aref string i)))))
+(defun log-stream-op (stream operation)
+ stream operation
+ #+(or)
+ (progn
+ (format sys:*tty* "~S @ ~D ~A~%" operation
+ (sos.index stream)
+ (/ (- (get-internal-real-time) (sos.last-flush-time stream))
+ (coerce internal-time-units-per-second 'double-float)))
+ (finish-output sys:*tty*)))
+
(defun sos/misc (stream operation &optional arg1 arg2)
(declare (ignore arg1 arg2))
(case operation
- ((:force-output :finish-output)
- (let ((end (sos.index stream)))
- (unless (zerop end)
- (let ((s (subseq (sos.buffer stream) 0 end)))
- (setf (sos.index stream) 0)
- (funcall (sos.output-fn stream) s)))))
+ (:finish-output
+ (log-stream-op stream operation)
+ (system:without-interrupts
+ (let ((end (sos.index stream)))
+ (unless (zerop end)
+ (let ((s (subseq (sos.buffer stream) 0 end)))
+ (setf (sos.index stream) 0)
+ (funcall (sos.output-fn stream) s))
+ (setf (sos.last-flush-time stream) (get-internal-real-time)))))
+ nil)
+ (:force-output
+ (log-stream-op stream operation)
+ (sos/misc-force-output stream)
+ nil)
(:charpos (sos.column stream))
(:line-length 75)
(:file-position nil)
@@ -223,6 +244,19 @@
(:close nil)
(t (format *terminal-io* "~&~Astream: ~S~%" stream operation))))
+(defun sos/misc-force-output (stream)
+ (system:without-interrupts
+ (unless (or (zerop (sos.index stream))
+ (loop with buffer = (sos.buffer stream)
+ for i from 0 below (sos.index stream)
+ always (char= (aref buffer i) #\newline)))
+ (let ((last (sos.last-flush-time stream))
+ (now (get-internal-real-time)))
+ (when (> (/ (- now last)
+ (coerce internal-time-units-per-second 'double-float))
+ 0.1)
+ (finish-output stream))))))
+
(defstruct (slime-input-stream
(:include string-stream
(lisp::in #'sis/in)
@@ -238,10 +272,10 @@
(index 0 :type kernel:index))
(defun sis/in (stream eof-errorp eof-value)
+ (finish-output (sis.sos stream))
(let ((index (sis.index stream))
(buffer (sis.buffer stream)))
(when (= index (length buffer))
- (force-output (sis.sos stream))
(let ((string (funcall (sis.input-fn stream))))
(cond ((zerop (length string))
(return-from sis/in
@@ -271,7 +305,8 @@
(:line-length nil)
(:get-command nil)
(:element-type 'base-char)
- (:close nil)))
+ (:close nil)
+ (:interactive-p t)))
;;;; Compilation Commands
@@ -298,7 +333,8 @@
(c::warning #'handle-notification-condition))
(funcall function))))
-(defimplementation swank-compile-file (filename load-p)
+(defimplementation swank-compile-file (filename load-p external-format)
+ (declare (ignore external-format))
(clear-xref-info filename)
(with-compilation-hooks ()
(let ((*buffer-name* nil)
@@ -1101,7 +1137,10 @@
(defun setf-definitions (name)
(let ((function (or (ext:info :setf :inverse name)
- (ext:info :setf :expander name))))
+ (ext:info :setf :expander name)
+ (and (symbolp name)
+ (fboundp `(setf ,name))
+ (fdefinition `(setf ,name))))))
(if function
(list (list `(setf ,name)
(function-location (coerce function 'function)))))))
@@ -1176,16 +1215,14 @@
(declare (ignore kind))
(if (or (boundp symbol) recorded-p)
(doc 'variable))))
+ (when (fboundp symbol)
+ (maybe-push
+ (cond ((macro-function symbol) :macro)
+ ((special-operator-p symbol) :special-operator)
+ ((genericp (fdefinition symbol)) :generic-function)
+ (t :function))
+ (doc 'function)))
(maybe-push
- :generic-function
- (if (and (fboundp symbol)
- (typep (fdefinition symbol) 'generic-function))
- (doc 'function)))
- (maybe-push
- :function (if (and (fboundp symbol)
- (not (typep (fdefinition symbol) 'generic-function)))
- (doc 'function)))
- (maybe-push
:setf (if (or (ext:info setf inverse symbol)
(ext:info setf expander symbol))
(doc 'setf)))
@@ -1236,19 +1273,16 @@
(list symbol))))
((:defined)
(ext:info :alien-type :definition symbol))
- (:unknown
- (return-from describe-definition
- (format nil "Unknown alien type: ~S" symbol))))))))
+ (:unknown :unkown))))))
;;;;; Argument lists
-(defimplementation arglist ((name symbol))
- (arglist (or (macro-function name)
- (symbol-function name))))
+(defimplementation arglist (fun)
+ (etypecase fun
+ (function (function-arglist fun))
+ (symbol (function-arglist (or (macro-function fun)
+ (symbol-function fun))))))
-(defimplementation arglist ((fun function))
- (function-arglist fun))
-
(defun function-arglist (fun)
(let ((arglist
(cond ((eval:interpreted-function-p fun)
@@ -1392,6 +1426,12 @@
(defimplementation macroexpand-all (form)
(walker:macroexpand-all form))
+(defimplementation compiler-macroexpand-1 (form &optional env)
+ (ext:compiler-macroexpand-1 form env))
+
+(defimplementation compiler-macroexpand (form &optional env)
+ (ext:compiler-macroexpand form env))
+
(defimplementation set-default-directory (directory)
(setf (ext:default-directory) (namestring directory))
;; Setting *default-pathname-defaults* to an absolute directory
@@ -1432,7 +1472,12 @@
(error (make-condition
'sldb-condition
:original-condition condition)))))
- (funcall debugger-loop-fn))))
+ (unwind-protect
+ (progn
+ #+(or)(sys:scrub-control-stack)
+ (funcall debugger-loop-fn))
+ #+(or)(sys:scrub-control-stack)
+ ))))
(defun frame-down (frame)
(handler-case (di:frame-down frame)
@@ -1662,9 +1707,12 @@
(values :initarg :values :reader breakpoint.values))
(:report (lambda (c stream) (princ (breakpoint.message c) stream))))
-(defimplementation condition-extras ((c breakpoint))
- ;; simply pop up the source buffer
- `((:short-frame-source 0)))
+(defimplementation condition-extras (condition)
+ (typecase condition
+ (breakpoint
+ ;; pop up the source buffer
+ `((:short-frame-source 0)))
+ (t '())))
(defun signal-breakpoint (breakpoint frame)
"Signal a breakpoint condition for BREAKPOINT in FRAME.
@@ -1817,7 +1865,7 @@
:key #'symbol-value)))
(format t ", type: ~A" type-symbol))))))
-(defimplementation inspect-for-emacs ((o t) (inspector cmucl-inspector))
+(defmethod inspect-for-emacs ((o t) (inspector cmucl-inspector))
(cond ((di::indirect-value-cell-p o)
(values (format nil "~A is a value cell." o)
`("Value: " (:value ,(c:value-cell-ref o)))))
@@ -1835,7 +1883,7 @@
(loop for value in parts for i from 0
append (label-value-line i value))))))
-(defmethod inspect-for-emacs :around ((o function) (inspector cmucl-inspector))
+(defmethod inspect-for-emacs ((o function) (inspector cmucl-inspector))
(declare (ignore inspector))
(let ((header (kernel:get-type o)))
(cond ((= header vm:function-header-type)
@@ -1863,6 +1911,16 @@
(t
(call-next-method)))))
+(defmethod inspect-for-emacs ((o kernel:funcallable-instance)
+ (i cmucl-inspector))
+ (declare (ignore i))
+ (values
+ (format nil "~A is a funcallable-instance." o)
+ (append (label-value-line*
+ (:function (kernel:%funcallable-instance-function o))
+ (:lexenv (kernel:%funcallable-instance-lexenv o))
+ (:layout (kernel:%funcallable-instance-layout o)))
+ (nth-value 1 (cmucl-inspect o)))))
(defmethod inspect-for-emacs ((o kernel:code-component) (_ cmucl-inspector))
(declare (ignore _))
@@ -1904,21 +1962,23 @@
(defmethod inspect-for-emacs ((o array) (inspector cmucl-inspector))
inspector
- (values (format nil "~A is an array." o)
- (label-value-line*
- (:header (describe-primitive-type o))
- (:rank (array-rank o))
- (:fill-pointer (kernel:%array-fill-pointer o))
- (:fill-pointer-p (kernel:%array-fill-pointer-p o))
- (:elements (kernel:%array-available-elements o))
- (:data (kernel:%array-data-vector o))
- (:displacement (kernel:%array-displacement o))
- (:displaced-p (kernel:%array-displaced-p o))
- (:dimensions (array-dimensions o)))))
+ (if (typep o 'simple-array)
+ (call-next-method)
+ (values (format nil "~A is an array." o)
+ (label-value-line*
+ (:header (describe-primitive-type o))
+ (:rank (array-rank o))
+ (:fill-pointer (kernel:%array-fill-pointer o))
+ (:fill-pointer-p (kernel:%array-fill-pointer-p o))
+ (:elements (kernel:%array-available-elements o))
+ (:data (kernel:%array-data-vector o))
+ (:displacement (kernel:%array-displacement o))
+ (:displaced-p (kernel:%array-displaced-p o))
+ (:dimensions (array-dimensions o))))))
-(defmethod inspect-for-emacs ((o vector) (inspector cmucl-inspector))
+(defmethod inspect-for-emacs ((o simple-vector) (inspector cmucl-inspector))
inspector
- (values (format nil "~A is a vector." o)
+ (values (format nil "~A is a simple-vector." o)
(append
(label-value-line*
(:header (describe-primitive-type o))
@@ -1986,14 +2046,17 @@
#+mp
(progn
- (defimplementation startup-multiprocessing ()
+ (defimplementation initialize-multiprocessing (continuation)
+ (mp::init-multi-processing)
+ (mp:make-process continuation :name "swank")
;; Threads magic: this never returns! But top-level becomes
;; available again.
- (mp::startup-idle-and-top-level-loops))
+ (unless mp::*idle-process*
+ (mp::startup-idle-and-top-level-loops)))
+
+ (defimplementation spawn (fn &key name)
+ (mp:make-process fn :name (or name "Anonymous")))
- (defimplementation spawn (fn &key (name "Anonymous"))
- (mp:make-process fn :name name))
-
(defvar *thread-id-counter* 0)
(defimplementation thread-id (thread)
@@ -2060,12 +2123,10 @@
;;; normal output.
;;;
-(defun swank-sym (name) (find-symbol (string name) :swank))
-(defun sending-safe-p () (symbol-value (swank-sym :*emacs-connection*)))
-
;; this should probably not be here, but where else?
-(defun eval-in-emacs (form nowait)
- (funcall (swank-sym :eval-in-emacs) form nowait))
+(defun background-message (message)
+ (funcall (find-symbol (string :background-message) :swank)
+ message))
(defun print-bytes (nbytes &optional stream)
"Print the number NBYTES to STREAM in KB, MB, or GB units."
@@ -2086,7 +2147,7 @@
(defun generation-stats ()
"Return a string describing the size distribution among the generations."
(let* ((alloc (loop for i below gc-generations
- collect (lisp::gencgc-stats i)))
+ collect (lisp::gencgc-stats i)))
(sum (coerce (reduce #'+ alloc) 'float)))
(format nil "~{~3F~^/~}"
(mapcar (lambda (size) (/ size sum))
@@ -2095,11 +2156,10 @@
(defvar *gc-start-time* 0)
(defun pre-gc-hook (bytes-in-use)
+ (setq *gc-start-time* (get-internal-real-time))
(let ((msg (format nil "[Commencing GC with ~A in use.]"
(print-bytes bytes-in-use))))
- (setq *gc-start-time* (get-internal-real-time))
- (when (sending-safe-p)
- (eval-in-emacs `(slime-background-message "%s" ,msg) t))))
+ (background-message msg)))
(defun post-gc-hook (bytes-retained bytes-freed trigger)
(declare (ignore trigger))
@@ -2111,8 +2171,7 @@
#+gencgc(generation-stats)
#-gencgc""
seconds)))
- (when (sending-safe-p)
- (eval-in-emacs `(slime-background-message "%s" ,msg) t))))
+ (background-message msg)))
(defun install-gc-hooks ()
(setq ext:*gc-notify-before* #'pre-gc-hook)
@@ -2180,6 +2239,11 @@
(t
fspec)))
+;;; Weak datastructures
+
+(defimplementation make-weak-key-hash-table (&rest args)
+ (apply #'make-hash-table :weak-p t args))
+
;; Local Variables:
;; pbook-heading-regexp: "^;;;\\(;+\\)"
;; pbook-commentary-regexp: "^;;;\\($\\|[^;]\\)"
Modified: trunk/thirdparty/emacs/slime/swank-corman.lisp
===================================================================
--- trunk/thirdparty/emacs/slime/swank-corman.lisp 2006-11-30 14:00:03 UTC (rev 2091)
+++ trunk/thirdparty/emacs/slime/swank-corman.lisp 2006-11-30 16:32:54 UTC (rev 2092)
@@ -238,10 +238,9 @@
(close socket))
(defimplementation accept-connection (socket
- &key (external-format :iso-latin-1-unix))
- (ecase external-format
- (:iso-latin-1-unix
- (sockets:make-socket-stream (sockets:accept-socket socket)))))
+ &key external-format buffering timeout)
+ (declare (ignore buffering timeout external-format))
+ (sockets:make-socket-stream (sockets:accept-socket socket)))
;;; Misc
@@ -366,7 +365,7 @@
(funcall fn)))
(defimplementation swank-compile-file (*compile-filename* load-p
- &optional external-format)
+ external-format)
(declare (ignore external-format))
(with-compilation-hooks ()
(let ((*buffer-name* nil))
@@ -385,6 +384,9 @@
;;;; Inspecting
+;; Hack to make swank.lisp load, at least
+(defclass file-stream ())
+
(defclass corman-inspector (inspector)
())
@@ -397,7 +399,7 @@
collect (funcall callback e)
collect ", ")))
-(defimplementation inspect-for-emacs ((class standard-class)
+(defmethod inspect-for-emacs ((class standard-class)
(inspector corman-inspector))
(declare (ignore inspector))
(values "A class."
@@ -436,7 +438,7 @@
'("#<N/A (class not finalized)>"))
(:newline))))
-(defimplementation inspect-for-emacs ((slot cons) (inspector corman-inspector))
+(defmethod inspect-for-emacs ((slot cons) (inspector corman-inspector))
;; Inspects slot definitions
(declare (ignore corman-inspector))
(if (eq (car slot) :name)
@@ -455,7 +457,7 @@
(:newline)))
(call-next-method)))
-(defimplementation inspect-for-emacs ((pathname pathnames::pathname-internal)
+(defmethod inspect-for-emacs ((pathname pathnames::pathname-internal)
inspector)
(declare (ignore inspector))
(values (if (wild-pathname-p pathname)
@@ -473,7 +475,7 @@
(not (probe-file pathname)))
(label-value-line "Truename" (truename pathname))))))
-(defimplementation inspect-for-emacs ((o t) (inspector corman-inspector))
+(defmethod inspect-for-emacs ((o t) (inspector corman-inspector))
(cond ((cl::structurep o) (inspect-structure o))
(t (call-next-method))))
Modified: trunk/thirdparty/emacs/slime/swank-ecl.lisp
===================================================================
--- trunk/thirdparty/emacs/slime/swank-ecl.lisp 2006-11-30 14:00:03 UTC (rev 2091)
+++ trunk/thirdparty/emacs/slime/swank-ecl.lisp 2006-11-30 16:32:54 UTC (rev 2092)
@@ -1,6 +1,10 @@
-;;;; -*- Mode: lisp; indent-tabs-mode: nil -*-
+;;;; -*- indent-tabs-mode: nil -*-
;;;
;;; swank-ecl.lisp --- SLIME backend for ECL.
+;;;
+;;; This code has been placed in the Public Domain. All warranties
+;;; are disclaimed.
+;;;
;;; Administrivia
@@ -15,11 +19,6 @@
:specializer-direct-methods
:compute-applicable-methods-using-classes))
-#+nil
-(ffi:clines "
-#include <unistd.h>
-#include <sys/types.h>")
-
;;;; TCP Server
@@ -45,11 +44,12 @@
(sb-bsd-sockets:socket-close socket))
(defimplementation accept-connection (socket
- &key (external-format :iso-latin-1-unix))
- (assert (eq external-format :iso-latin-1-unix))
- (make-socket-io-stream (accept socket) external-format))
+ &key external-format
+ buffering timeout)
+ (declare (ignore buffering timeout external-format))
+ (make-socket-io-stream (accept socket)))
-(defun make-socket-io-stream (socket external-format)
+(defun make-socket-io-stream (socket)
(sb-bsd-sockets:socket-make-stream socket
:output t
:input t
@@ -121,7 +121,7 @@
(funcall function)))
(defimplementation swank-compile-file (*compile-filename* load-p
- &optional external-format)
+ external-format)
(declare (ignore external-format))
(with-compilation-hooks ()
(let ((*buffer-name* nil))
@@ -164,7 +164,7 @@
(t :not-available)))))
:not-available))
-(defimplementation function-name ((f function))
+(defimplementation function-name (f)
(si:compiled-function-name f))
(defimplementation macroexpand-all (form)
Modified: trunk/thirdparty/emacs/slime/swank-gray.lisp
===================================================================
--- trunk/thirdparty/emacs/slime/swank-gray.lisp 2006-11-30 14:00:03 UTC (rev 2091)
+++ trunk/thirdparty/emacs/slime/swank-gray.lisp 2006-11-30 16:32:54 UTC (rev 2092)
@@ -12,72 +12,118 @@
(defclass slime-output-stream (fundamental-character-output-stream)
((output-fn :initarg :output-fn)
- (buffer :initform (make-string 512))
+ (buffer :initform (make-string 8000))
(fill-pointer :initform 0)
- (column :initform 0)))
+ (column :initform 0)
+ (last-flush-time :initform (get-internal-real-time))
+ (lock :initform (make-recursive-lock :name "buffer write lock"))))
(defmethod stream-write-char ((stream slime-output-stream) char)
- (with-slots (buffer fill-pointer column) stream
- (setf (schar buffer fill-pointer) char)
- (incf fill-pointer)
- (incf column)
- (when (char= #\newline char)
- (setf column 0))
- (when (= fill-pointer (length buffer))
- (force-output stream)))
+ (call-with-recursive-lock-held
+ (slot-value stream 'lock)
+ (lambda ()
+ (with-slots (buffer fill-pointer column) stream
+ (setf (schar buffer fill-pointer) char)
+ (incf fill-pointer)
+ (incf column)
+ (when (char= #\newline char)
+ (setf column 0)
+ (force-output stream))
+ (when (= fill-pointer (length buffer))
+ (finish-output stream)))))
char)
(defmethod stream-line-column ((stream slime-output-stream))
- (slot-value stream 'column))
+ (call-with-recursive-lock-held
+ (slot-value stream 'lock)
+ (lambda ()
+ (slot-value stream 'column))))
(defmethod stream-line-length ((stream slime-output-stream))
75)
+(defmethod stream-finish-output ((stream slime-output-stream))
+ (call-with-recursive-lock-held
+ (slot-value stream 'lock)
+ (lambda ()
+ (with-slots (buffer fill-pointer output-fn last-flush-time) stream
+ (let ((end fill-pointer))
+ (unless (zerop end)
+ (funcall output-fn (subseq buffer 0 end))
+ (setf fill-pointer 0)))
+ (setf last-flush-time (get-internal-real-time)))))
+ nil)
+
(defmethod stream-force-output ((stream slime-output-stream))
- (with-slots (buffer fill-pointer output-fn) stream
- (let ((end fill-pointer))
- (unless (zerop end)
- (funcall output-fn (subseq buffer 0 end))
- (setf fill-pointer 0))))
+ (call-with-recursive-lock-held
+ (slot-value stream 'lock)
+ (lambda ()
+ (with-slots (last-flush-time fill-pointer) stream
+ (let ((now (get-internal-real-time)))
+ (when (> (/ (- now last-flush-time)
+ (coerce internal-time-units-per-second 'double-float))
+ 0.2)
+ (finish-output stream))))))
nil)
+(defmethod stream-fresh-line ((stream slime-output-stream))
+ (call-with-recursive-lock-held
+ (slot-value stream 'lock)
+ (lambda ()
+ (with-slots (column) stream
+ (cond ((zerop column) nil)
+ (t (terpri stream) t))))))
+
(defclass slime-input-stream (fundamental-character-input-stream)
((output-stream :initarg :output-stream)
(input-fn :initarg :input-fn)
- (buffer :initform "") (index :initform 0)))
+ (buffer :initform "") (index :initform 0)
+ (lock :initform (make-lock :name "buffer read lock"))))
(defmethod stream-read-char ((s slime-input-stream))
- (with-slots (buffer index output-stream input-fn) s
- (when (= index (length buffer))
- (when output-stream
- (force-output output-stream))
- (let ((string (funcall input-fn)))
- (cond ((zerop (length string))
- (return-from stream-read-char :eof))
- (t
- (setf buffer string)
- (setf index 0)))))
- (assert (plusp (length buffer)))
- (prog1 (aref buffer index) (incf index))))
+ (call-with-lock-held
+ (slot-value s 'lock)
+ (lambda ()
+ (with-slots (buffer index output-stream input-fn) s
+ (when (= index (length buffer))
+ (when output-stream
+ (finish-output output-stream))
+ (let ((string (funcall input-fn)))
+ (cond ((zerop (length string))
+ (return-from stream-read-char :eof))
+ (t
+ (setf buffer string)
+ (setf index 0)))))
+ (assert (plusp (length buffer)))
+ (prog1 (aref buffer index) (incf index))))))
(defmethod stream-listen ((s slime-input-stream))
- (with-slots (buffer index) s
- (< index (length buffer))))
+ (call-with-lock-held
+ (slot-value s 'lock)
+ (lambda ()
+ (with-slots (buffer index) s
+ (< index (length buffer))))))
(defmethod stream-unread-char ((s slime-input-stream) char)
- (with-slots (buffer index) s
- (decf index)
- (cond ((eql (aref buffer index) char)
- (setf (aref buffer index) char))
- (t
- (warn "stream-unread-char: ignoring ~S (expected ~S)"
- char (aref buffer index)))))
+ (call-with-lock-held
+ (slot-value s 'lock)
+ (lambda ()
+ (with-slots (buffer index) s
+ (decf index)
+ (cond ((eql (aref buffer index) char)
+ (setf (aref buffer index) char))
+ (t
+ (warn "stream-unread-char: ignoring ~S (expected ~S)"
+ char (aref buffer index)))))))
nil)
(defmethod stream-clear-input ((s slime-input-stream))
- (with-slots (buffer index) s
- (setf buffer ""
- index 0))
+ (call-with-lock-held
+ (slot-value s 'lock)
+ (lambda ()
+ (with-slots (buffer index) s
+ (setf buffer ""
+ index 0))))
nil)
(defmethod stream-line-column ((s slime-input-stream))
@@ -96,9 +142,12 @@
;; We could make do with either of the two methods below.
(defmethod stream-read-char-no-hang ((s slime-input-stream))
- (with-slots (buffer index) s
- (when (< index (length buffer))
- (prog1 (aref buffer index) (incf index)))))
+ (call-with-lock-held
+ (slot-value s 'lock)
+ (lambda ()
+ (with-slots (buffer index) s
+ (when (< index (length buffer))
+ (prog1 (aref buffer index) (incf index)))))))
;; This CLISP extension is what listen_char actually calls. The
;; default method would call STREAM-READ-CHAR-NO-HANG, so it is a bit
Modified: trunk/thirdparty/emacs/slime/swank-lispworks.lisp
===================================================================
--- trunk/thirdparty/emacs/slime/swank-lispworks.lisp 2006-11-30 14:00:03 UTC (rev 2091)
+++ trunk/thirdparty/emacs/slime/swank-lispworks.lisp 2006-11-30 16:32:54 UTC (rev 2092)
@@ -1,4 +1,4 @@
-;;; -*- Mode: lisp; indent-tabs-mode: nil -*-
+;;; -*- indent-tabs-mode: nil -*-
;;;
;;; swank-lispworks.lisp --- LispWorks specific code for SLIME.
;;;
@@ -11,20 +11,9 @@
(in-package :swank-backend)
(eval-when (:compile-toplevel :load-toplevel :execute)
- (require "comm"))
+ (require "comm")
+ (import-from :stream *gray-stream-symbols* :swank-backend))
-(import
- '(stream:fundamental-character-output-stream
- stream:stream-write-char
- stream:stream-force-output
- stream:fundamental-character-input-stream
- stream:stream-read-char
- stream:stream-listen
- stream:stream-unread-char
- stream:stream-clear-input
- stream:stream-line-column
- ))
-
(import-swank-mop-symbols :clos '(:slot-definition-documentation
:eql-specializer
:eql-specializer-object
@@ -77,8 +66,8 @@
(comm::close-socket (socket-fd socket)))
(defimplementation accept-connection (socket
- &key (external-format :iso-latin-1-unix))
- (assert (eq external-format :iso-latin-1-unix))
+ &key external-format buffering timeout)
+ (declare (ignore buffering timeout external-format))
(let* ((fd (comm::get-fd-from-socket socket)))
(assert (/= fd -1))
(make-instance 'comm:socket-stream :socket fd :direction :io
@@ -90,6 +79,24 @@
(sys::set-signal-handler +sigint+
(make-sigint-handler mp:*current-process*)))
+;;; Coding Systems
+
+(defvar *external-format-to-coding-system*
+ '(((:latin-1 :eol-style :lf)
+ "latin-1-unix" "iso-latin-1-unix" "iso-8859-1-unix")
+ ((:latin-1)
+ "latin-1" "iso-latin-1" "iso-8859-1")
+ ((:utf-8) "utf-8")
+ ((:utf-8 :eol-style :lf) "utf-8-unix")
+ ((:euc-jp) "euc-jp")
+ ((:euc-jp :eol-style :lf) "euc-jp-unix")
+ ((:ascii) "us-ascii")
+ ((:ascii :eol-style :lf) "us-ascii-unix")))
+
+(defimplementation find-external-format (coding-system)
+ (car (rassoc-if (lambda (x) (member coding-system x :test #'equal))
+ *external-format-to-coding-system*)))
+
;;; Unix signals
(defun sigint-handler ()
@@ -366,9 +373,9 @@
(signal-error-data-base compiler::*error-database* ,location)
(signal-undefined-functions compiler::*unknown-functions* ,location)))))
-(defimplementation swank-compile-file (filename load-p)
+(defimplementation swank-compile-file (filename load-p external-format)
(with-swank-compilation-unit (filename)
- (compile-file filename :load load-p)))
+ (compile-file filename :load load-p :external-format external-format)))
(defvar *within-call-with-compilation-hooks* nil
"Whether COMPILE-FILE was called from within CALL-WITH-COMPILATION-HOOKS.")
@@ -378,7 +385,7 @@
(lw:defadvice (compile-file compile-file-and-collect-notes :around)
(pathname &rest rest)
- (prog1 (apply #'lw:call-next-advice pathname rest)
+ (multiple-value-prog1 (apply #'lw:call-next-advice pathname rest)
(when *within-call-with-compilation-hooks*
(maphash (lambda (unfun dspecs)
(dolist (dspec dspecs)
@@ -533,18 +540,18 @@
function names like \(SETF GET)."
(or (and (eq (symbol-package symbol)
(load-time-value (find-package :setf)))
- (let ((nregex::*regex-groupings* 0)
- (nregex::*regex-groups* (make-array 10))
+ (let ((slime-nregex::*regex-groupings* 0)
+ (slime-nregex::*regex-groups* (make-array 10))
(symbol-name (symbol-name symbol)))
(and (funcall (load-time-value
- (compile nil (nregex:regex-compile "^\"(.+)\" \"(.+)\"$")))
+ (compile nil (slime-nregex:regex-compile "^\"(.+)\" \"(.+)\"$")))
symbol-name)
(list 'setf
(intern (apply #'subseq symbol-name
- (aref nregex::*regex-groups* 2))
+ (aref slime-nregex::*regex-groups* 2))
(find-package
(apply #'subseq symbol-name
- (aref nregex::*regex-groups* 1))))))))
+ (aref slime-nregex::*regex-groups* 1))))))))
symbol))
(defun signal-undefined-functions (htab &optional filename)
@@ -631,15 +638,22 @@
(defimplementation make-default-inspector ()
(make-instance 'lispworks-inspector))
-(defimplementation inspect-for-emacs ((o t) (inspector lispworks-inspector))
+(defmethod inspect-for-emacs ((o t) (inspector lispworks-inspector))
(declare (ignore inspector))
(lispworks-inspect o))
-(defimplementation inspect-for-emacs ((o function)
- (inspector lispworks-inspector))
+(defmethod inspect-for-emacs ((o function)
+ (inspector lispworks-inspector))
(declare (ignore inspector))
(lispworks-inspect o))
+;; FIXME: slot-boundp-using-class in LW works with names so we can't
+;; use our method in swank.lisp.
+(defmethod inspect-for-emacs ((o standard-object)
+ (inspector lispworks-inspector))
+ (declare (ignore inspector))
+ (lispworks-inspect o))
+
(defun lispworks-inspect (o)
(multiple-value-bind (names values _getter _setter type)
(lw:get-inspector-values o nil)
@@ -677,8 +691,12 @@
;;; Multithreading
-(defimplementation startup-multiprocessing ()
- (mp:initialize-multiprocessing))
+(defimplementation initialize-multiprocessing (continuation)
+ (cond ((not mp::*multiprocessing*)
+ (push (list "Initialize SLIME" '() continuation)
+ mp:*initial-processes*)
+ (mp:initialize-multiprocessing))
+ (t (funcall continuation))))
(defimplementation spawn (fn &key name)
(let ((mp:*process-initial-bindings*
@@ -745,7 +763,7 @@
;;; Some intergration with the lispworks environment
-(defun swank-sym (name) (find-symbol (string name) (string :swank)))
+(defun swank-sym (name) (find-symbol (string name) :swank))
(defimplementation emacs-connected ()
(when (eq (eval (swank-sym :*communication-style*))
@@ -756,8 +774,7 @@
(defmethod env-internals:environment-display-notifier
(env &key restarts condition)
(declare (ignore restarts))
- (funcall (find-symbol (string :swank-debugger-hook) :swank)
- condition *debugger-hook*))
+ (funcall (swank-sym :swank-debugger-hook) condition *debugger-hook*))
(defmethod env-internals:environment-display-debugger (env)
*debug-io*)))
@@ -769,6 +786,5 @@
(force-output o)))))
(defmethod env-internals:confirm-p ((e slime-env) &optional msg &rest args)
- (let ((prompt (cond (msg (apply #'format nil msg args))
- (t ""))))
- (funcall (swank-sym :eval-in-emacs) `(y-or-n-p ,prompt))))
+ (apply (swank-sym :y-or-n-p-in-emacs) msg args))
+
Modified: trunk/thirdparty/emacs/slime/swank-loader.lisp
===================================================================
--- trunk/thirdparty/emacs/slime/swank-loader.lisp 2006-11-30 14:00:03 UTC (rev 2091)
+++ trunk/thirdparty/emacs/slime/swank-loader.lisp 2006-11-30 16:32:54 UTC (rev 2092)
@@ -8,56 +8,78 @@
;;; are disclaimed.
;;;
+;; If you want customize the source- or fasl-directory you can set
+;; swank-loader:*source-directory* resp. swank-loader:*fasl-directory*
+;; before loading this files. (you also need to create the
+;; swank-loader package.)
+;; E.g.:
+;;
+;; (make-package :swank-loader)
+;; (defparameter swank-loader::*fasl-directory* "/tmp/fasl/")
+;; (load ".../swank-loader.lisp")
+
+
(cl:defpackage :swank-loader
- (:use :common-lisp))
+ (:use :cl)
+ (:export :load-swank
+ :*source-directory*
+ :*fasl-directory*))
-(in-package :swank-loader)
+(cl:in-package :swank-loader)
-(defun make-swank-pathname (name &optional (type "lisp"))
- "Return a pathname with name component NAME in the Slime directory."
- (merge-pathnames (make-pathname :name name :type type)
- (or *compile-file-pathname*
- *load-pathname*
- *default-pathname-defaults*)))
+(defvar *source-directory*
+ (make-pathname :name nil :type nil
+ :defaults (or *load-pathname* *default-pathname-defaults*))
+ "The directory where to look for the source.")
-(defparameter *sysdep-pathnames*
- (mapcar #'make-swank-pathname
- (append
- '("nregex")
- #+cmu '("swank-source-path-parser" "swank-source-file-cache"
- "swank-cmucl")
- #+sbcl '("swank-sbcl" "swank-source-path-parser"
- "swank-source-file-cache" "swank-gray")
- #+openmcl '("metering" "swank-openmcl" "swank-gray")
- #+lispworks '("swank-lispworks" "swank-gray")
- #+allegro '("swank-allegro" "swank-gray")
- #+clisp '("xref" "metering" "swank-clisp" "swank-gray")
- #+armedbear '("swank-abcl")
- )))
+(defparameter *sysdep-files*
+ (append
+ '("nregex")
+ #+cmu '("swank-source-path-parser" "swank-source-file-cache" "swank-cmucl")
+ #+scl '("swank-source-path-parser" "swank-source-file-cache" "swank-scl")
+ #+sbcl '("swank-sbcl" "swank-source-path-parser"
+ "swank-source-file-cache" "swank-gray")
+ #+openmcl '("metering" "swank-openmcl" "swank-gray")
+ #+lispworks '("swank-lispworks" "swank-gray")
+ #+allegro '("swank-allegro" "swank-gray")
+ #+clisp '("xref" "metering" "swank-clisp" "swank-gray")
+ #+armedbear '("swank-abcl")
+ #+cormanlisp '("swank-corman" "swank-gray")
+ #+ecl '("swank-ecl" "swank-gray")
+ ))
(defparameter *implementation-features*
- '(:allegro :lispworks :sbcl :openmcl :cmu :clisp :ccl :corman :armedbear :gcl :ecl))
+ '(:allegro :lispworks :sbcl :openmcl :cmu :clisp :ccl :corman :cormanlisp
+ :armedbear :gcl :ecl :scl))
(defparameter *os-features*
- '(:macosx :linux :windows :mswindows :win32 :solaris :darwin :sunos :unix))
+ '(:macosx :linux :windows :mswindows :win32 :solaris :darwin :sunos :hpux
+ :unix))
(defparameter *architecture-features*
- '(:powerpc :ppc :x86 :x86-64 :i686 :pc386 :iapx386 :sparc))
+ '(:powerpc :ppc :x86 :x86-64 :amd64 :i686 :i586 :i486 :pc386 :iapx386
+ :sparc64 :sparc :hppa64 :hppa))
(defun lisp-version-string ()
- #+cmu (substitute #\- #\/ (lisp-implementation-version))
+ #+cmu (substitute-if #\_ (lambda (x) (find x " /"))
+ (lisp-implementation-version))
+ #+scl (lisp-implementation-version)
#+sbcl (lisp-implementation-version)
#+ecl (lisp-implementation-version)
- #+gcl (let ((s (lisp-implementation-version))) (subseq s 4))
#+openmcl (format nil "~d.~d"
- ccl::*openmcl-major-version*
+ ccl::*openmcl-major-version*
ccl::*openmcl-minor-version*)
#+lispworks (lisp-implementation-version)
- #+allegro excl::*common-lisp-version-number*
+ #+allegro (format nil
+ "~A~A~A"
+ excl::*common-lisp-version-number*
+ (if (eq 'h 'H) "A" "M") ; ANSI vs MoDeRn
+ (if (member :64bit *features*) "-64bit" ""))
#+clisp (let ((s (lisp-implementation-version)))
(subseq s 0 (position #\space s)))
- #+armedbear (lisp-implementation-version))
-
+ #+armedbear (lisp-implementation-version)
+ #+cormanlisp (lisp-implementation-version))
+
(defun unique-directory-name ()
"Return a name that can be used as a directory name that is
unique to a Lisp implementation, Lisp implementation version,
@@ -70,7 +92,7 @@
(t (apply #'warn fstring args)
"unknown"))))
(let ((lisp (maybe-warn (first-of *implementation-features*)
- "No implementation feature found in ~a."
+ "No implementation feature found in ~a."
*implementation-features*))
(os (maybe-warn (first-of *os-features*)
"No os feature found in ~a." *os-features*))
@@ -82,66 +104,106 @@
implementation version.")))
(format nil "~(~@{~a~^-~}~)" lisp version os arch))))
-(defparameter *swank-pathname* (make-swank-pathname "swank"))
-
(defun file-newer-p (new-file old-file)
"Returns true if NEW-FILE is newer than OLD-FILE."
(> (file-write-date new-file) (file-write-date old-file)))
-(defun binary-pathname (source-pathname)
+(defun slime-version-string ()
+ "Return a string identifying the SLIME version.
+Return nil if nothing appropriate is available."
+ (with-open-file (s (merge-pathnames "ChangeLog" *source-directory*)
+ :if-does-not-exist nil)
+ (and s (symbol-name (read s)))))
+
+(defun default-fasl-directory ()
+ (merge-pathnames
+ (make-pathname
+ :directory `(:relative ".slime" "fasl"
+ ,@(if (slime-version-string) (list (slime-version-string)))
+ ,(unique-directory-name)))
+ (user-homedir-pathname)))
+
+(defun binary-pathname (source-pathname binary-directory)
"Return the pathname where SOURCE-PATHNAME's binary should be compiled."
(let ((cfp (compile-file-pathname source-pathname)))
- (merge-pathnames (make-pathname
- :directory
- `(:relative ".slime" "fasl" ,(unique-directory-name))
- :name (pathname-name cfp)
- :type (pathname-type cfp))
- (user-homedir-pathname))))
+ (merge-pathnames (make-pathname :name (pathname-name cfp)
+ :type (pathname-type cfp))
+ binary-directory)))
-(defun compile-files-if-needed-serially (files)
+
+(defun handle-loadtime-error (condition binary-pathname)
+ (format *error-output*
+ "~%~<;; ~@;Error while loading: ~A~% Condition: ~A~%Aborting.~:>~%"
+ (list binary-pathname condition))
+ (when (equal (directory-namestring binary-pathname)
+ (directory-namestring (default-fasl-directory)))
+ (ignore-errors (delete-file binary-pathname)))
+ (abort))
+
+(defun compile-files-if-needed-serially (files fasl-directory)
"Compile each file in FILES if the source is newer than
-its corresponding binary, or the file preceding it was
+its corresponding binary, or the file preceding it was
recompiled."
(with-compilation-unit ()
(let ((needs-recompile nil))
(dolist (source-pathname files)
- (let ((binary-pathname (binary-pathname source-pathname)))
+ (let ((binary-pathname (binary-pathname source-pathname
+ fasl-directory)))
(handler-case
(progn
(when (or needs-recompile
(not (probe-file binary-pathname))
(file-newer-p source-pathname binary-pathname))
+ ;; need a to recompile source-pathname, so we'll
+ ;; need to recompile everything after this too.
+ (setq needs-recompile t)
(ensure-directories-exist binary-pathname)
(compile-file source-pathname :output-file binary-pathname
- :print nil :verbose t)
- (setq needs-recompile t))
+ :print nil
+ :verbose t))
(load binary-pathname :verbose t))
- #+(or)
- (error ()
- ;; If an error occurs compiling, load the source instead
- ;; so we can try to debug it.
- (load source-pathname))
- ))))))
+ ;; Fail as early as possible
+ (serious-condition (c)
+ (handle-loadtime-error c binary-pathname))))))))
-(compile-files-if-needed-serially
- (append (list (make-swank-pathname "swank-backend"))
- *sysdep-pathnames*
- (list *swank-pathname*)))
+#+(or cormanlisp ecl)
+(defun compile-files-if-needed-serially (files fasl-directory)
+ "Corman Lisp and ECL have trouble with compiled files."
+ (declare (ignore fasl-directory))
+ (dolist (file files)
+ (load file :verbose t)
+ (force-output)))
-(funcall (intern (string :warn-unimplemented-interfaces) :swank-backend))
-
(defun load-user-init-file ()
"Load the user init file, return NIL if it does not exist."
(load (merge-pathnames (user-homedir-pathname)
(make-pathname :name ".swank" :type "lisp"))
:if-does-not-exist nil))
-(export 'load-user-init-file)
-(defun load-site-init-file ()
+(defun load-site-init-file (directory)
(load (make-pathname :name "site-init" :type "lisp"
- :defaults *load-truename*)
+ :defaults directory)
:if-does-not-exist nil))
-(or (load-site-init-file)
- (load-user-init-file))
+(defun swank-source-files (source-directory)
+ (mapcar (lambda (name)
+ (make-pathname :name name :type "lisp"
+ :defaults source-directory))
+ `("swank-backend" ,@*sysdep-files* "swank")))
+(defvar *fasl-directory* (default-fasl-directory)
+ "The directory where fasl files should be placed.")
+
+(defun load-swank (&key
+ (source-directory *source-directory*)
+ (fasl-directory *fasl-directory*))
+ (compile-files-if-needed-serially (swank-source-files source-directory)
+ fasl-directory)
+ (set (read-from-string "swank::*swank-wire-protocol-version*")
+ (slime-version-string))
+ (funcall (intern (string :warn-unimplemented-interfaces) :swank-backend))
+ (load-site-init-file source-directory)
+ (load-user-init-file)
+ (funcall (intern (string :run-after-init-hook) :swank)))
+
+(load-swank)
Added: trunk/thirdparty/emacs/slime/swank-loader.x86f
===================================================================
--- trunk/thirdparty/emacs/slime/swank-loader.x86f 2006-11-30 14:00:03 UTC (rev 2091)
+++ trunk/thirdparty/emacs/slime/swank-loader.x86f 2006-11-30 16:32:54 UTC (rev 2092)
@@ -0,0 +1,66 @@
+FASL FILE output from /usr/home/hans/bknr-svn/thirdparty/emacs/slime/swank-loader.lisp.
+Compiled Wednesday, 11/15/06 07:15:22 am GMT on ibuprofen.huebner.org
+Compiler 1.1, Lisp 19c Release (19C)
+Targeted for Intel x86, FASL version 19C
+���Q&KERNEL%DEFPACKAGE&SWANK-LOADER&COMMON-LISPQUOTEQUOTEQUOTEQUOTEQUOTE&COMMON-LISPQUOTEQUOTEQUOTEQUOTE6RQ%IN-PACKAGEQUOTE&SWANK-LOADER6R?>#�B&lispNNAMENTYPE
MAKE-PATHNAME<*COMPILE-FILE-PATHNAME*MERGE-PATHNAMES<*LOAD-PATHNAME**DEFAULT-PATHNAME-DEFAULTS*Q&CCOMPILED-DEBUG-INFORQR($$-Q&
+EXTENSIONSINSTANCER($$-QSTRUCTURE-OBJECTR($$- Q
+DEBUG-INFOR ("$$-#($$$-%&DEFUN MAKE-SWANK-PATHNAME&&SWANK-LOADER'QCOMPILED-DEBUG-FUNCTIONR QDEBUG-FUNCTIONR (*$$-+(,$$
--Q&SWANK-LOADERR.MAKE-SWANK-PATHNAMENEXTERNAL+G2MG3�G4��1+&2$+$3NSTANDARD$'$$#�1
5$5-&NOPTIONAL+NAME�7+58$+94$'$$5#�1
:$A-/+NAMECTYPECOMMON-LISP�;+EA*<$$
OPTIONAL-ARGS$(>4$'$$A#�1
?(@1AB;
+�~�E��e���t��u�U�}���
+M�U��E�܃���}�5�E�C����k����P��
!�A�=�tH=�(t���%��u��`�
)�A�=�t#=�(t���ԋ-�x����t���
+N�
+N�
+QNABSOLUTER��QNABSOLUTER��QNABSOLUTER��QNABSOLUTER�rQNABSOLUTER�]QNABSOLUTER�QQNABSOLUTER�HQNABSOLUTER�:=?K/&(name &optional (type "lisp"))LFUNCTION &OPTIONALOPATHNAMEQ�/RJ?>S#B&nregexST&swank-source-path-parserU&swank-source-file-cacheV&swank-cmuclWXAPPEND</<.*SYSDEP-PATHNAMES*CONS%&DEFPARAMETER *SYSDEP-PATHNAMES*\'-&Top-Level Form]N TOP-LEVEL+_+P{ W`$+a4$'$$#x1
b(c1de;~�E��e��(�4�(��(�|�(;��(v��|�(�[�ÉP��@�(��(�=4�(t� ��u��u�܃���=���k����P��u�������}��u�V��܃����k����P��u�}��4�(��(�|�(;��(v��|�(�[�ÉP��@�(��(�=4�(t� �ˁ��(t>�_�v��$<u>��=�(�c����E�@�
!�A���(�M��E��������%�
+!���
+��QNABSOLUTER�lQNABSOLUTER�OQNRELATIVER�alloc_overflow_ebx�QNABSOLUTER��QNABSOLUTER��QNABSOLUTER��QNABSOLUTER�QNRELATIVER�alloc_overflow_ebxE=?n]&()oM�/R&BReturn a pathname with name component NAME in the Slime directory.qPROCLAIM<SPECIALZt#]1uv;? !"�q#$�q0�w]$$QSIMPLE-BYTE-FUNCTIONRQFUNCTIONR(z$$-{QFUNCALLABLE-INSTANCER{(}$$-~QBYTE-FUNCTION-OR-CLOSURER{~(�$$-�Q
BYTE-FUNCTIONR{~�(�$$-�(�$$-���8p8LSET-DEFVAR-SOURCE-LOCATION<ZQFILE-SOURCE-LOCATIONR QFORM-NUMBERSR (�$$-�(�$$-�$&@/usr/home/hans/bknr-svn/thirdparty/emacs/slime/swank-loader.lisp�1�r<s.*IMPLEMENTATION-FEATURES*�NALLEGRON LISPWORKSNSBCLNOPENMCLNCMUNCLISPNCCLNCORMANN ARMEDBEARNGCLNECL����$�1�s.
*OS-FEATURES*�NMACOSXNLINUXNWINDOWSN MSWINDOWSNWIN32NSOLARISNDARWINNSUNOSNUNIX ���$�1�#]1��; !"�q#$�q%&� '(�q#)�q*+� +,�q0��]$$���8?>�$]BLISP-IMPLEMENTATION-VERSION<
+SUBSTITUTE<%&DEFUN LISP-VERSION-STRING�'-.LISP-VERSION-STRING0+G0M�+;�$+�4$'$$$X1
�$"-�+�+"�$+�4$'$$"$]1
�(�1��;]~�E��e���u6�ԃ��1ɉj����P���-��/���u��`���
+MQNABSOLUTER�GQNABSOLUTER�)=?��oMSIMPLE-BASE-STRING��J?>�#&B�&&No implementation feature found in ~a.��&No os feature found in ~a.�.*ARCHITECTURE-FEATURES*&$No architecture feature found in ~a.��<&TDon't know how to get Lisp ~
+ implementation version.�&~(~@{~a~^-~}~)�FORMAT<
+*FEATURES*FIND<WARN<&unknown�%&DEFUN UNIQUE-DIRECTORY-NAME�'-.UNIQUE-DIRECTORY-NAME0+G6M�+���$+�4$'$$#�1
�$&-�+VALUE��+f&)�,�+�&+�3�$+�4$'$$&#�1
�#�-FLET.FIRST-OF��+F�FEATURES���+C��F ��$+�+�$'$#�#1
�#M-�.
+MAYBE-WARN��+ARGS��FSTRINGcVALUEC�+4�M
N" <
�$$$REST-ARG$(�+�$'$#M#1
�(�1��;&~�E��e������
�A�=����͋ԃ� �؉J����E���j����P�������4�(��(�|�(;��(v��|�(�[�ÉP��@�(��(�=4�(t� �ŋ̃� �q��Q��A����E�%�q�E�
�A�=���͋ԃ� �؉J����E�V�����P�������4�(��(�|�(;��(v��|�(�[�ÉP��@�(��(�=4�(t� �ŋ̃� �q��Q��A����E����E�!�X�����T�ŋ̃� �A����E������!�P�����*�4�(��(�|�(;��(v��|�(�[�ÉP��@�(��(�=4�(t� �ŋ̃� �q�%�Q��A����E����E�ԃ��)1ɉj����P��ŋ̃� �Q�-�Q��(�A����E�����(�=1�u�E��E�E�E�E�5��u��`��(��$<�<�Ë��(�[�]�V��v��$<�!�u��9�x������e���]�=��k����P��]�u����(u���(u���(�e��m�����}��(���]��A�x���(���U���R�E���$<���ˋ���(9�t�q��I��$<t��
+N��)��]�Nj�)�S��{��s���k����P��]��E�e��m���E����
+M�
+N�
+�
+N�
+�
+�
+�
+��
+���
+�
+�
+�QNABSOLUTER��QNABSOLUTER�_QNABSOLUTER�QNABSOLUTER��QNABSOLUTER��QNABSOLUTER��QNABSOLUTER��QNABSOLUTER�sQNABSOLUTER�WQNABSOLUTER�DQNABSOLUTER�5QNRELATIVER�alloc_overflow_ebx�QNABSOLUTER��QNABSOLUTER��QNABSOLUTER��QNABSOLUTER��QNABSOLUTER�}QNRELATIVER�alloc_overflow_ebxFQNABSOLUTER�QNABSOLUTER�QNABSOLUTER��QNABSOLUTER��QNABSOLUTER��QNRELATIVER�alloc_overflow_ebx�QNABSOLUTER�XQNABSOLUTER�KQNABSOLUTER�(=? �oMORBASE-STRINGNULL
��Jr<s�NPOWERPCNPPCNX86NX86-64NI686NPC386NIAPX386NSPARC��<��$�1���&�Return a name that can be used as a directory name that is
+unique to a Lisp implementation, Lisp implementation version,
+operating system, and hardware architecture.s.*SWANK-PATHNAME*/<&swank#]1 ;' !�q"#�$%&�q?'(0�q?)*+�q ,�q-.�/�0�!]$$��"8?>##�BFILE-WRITE-DATE<%&DEFUN FILE-NEWER-P$'-.FILE-NEWER-P0+G0MG1�G2��&+{'$
++$(4$'$$#�1
)$)-%+NEW-FILECOLD-FILEc*+4)
++$
++,4$'$$)#�1
-(.1/0;�~�E��e���uu�U�}��܃��U���k����P��U�܃��U����k����P����U������(u��(�M��E��������'�(�ꐐ��
+MQNRELATIVERQ&X86 2 GENERIC->R�lQNABSOLUTER�SQNABSOLUTER�3=?6%&(new-file old-file)7M8MEMBER:;�%<J?>=#�BCOMPILE-FILE-PATHNAME<�<NRELATIVE&.slime?&fasl@
PATHNAME-NAME<
PATHNAME-TYPE<N DIRECTORY<USER-HOMEDIR-PATHNAME<<%&DEFUN BINARY-PATHNAMEE'-.BINARY-PATHNAME0+
+G0MG1�G+�sH$+I4$'$$#�1
J$*-F+CFP�SOURCE-PATHNAMECK+:*
+
+�:
L$+M4$'$$*#�1
N(O1PQ;�~�E��e����i�U�܃��U���k����P��U�ԃ��1ɉj����P���=�5!�E��4�(��(� |�(;��(v��|�(�[�ÉP����@��x����@��p����@��M��H��@�(��(�=4�(t� �]��܃��U�%��k����P��U�܃��U�)��k����P��܃��-�}��51�M�K��
5�K�C�9��k����P��U��ԃ��=1ɉj����P����U��A��u��`�
+MQNABSOLUTER��QNABSOLUTER�jQNABSOLUTER�MQNABSOLUTER�AQNABSOLUTER�5QNABSOLUTER�,QNABSOLUTER�QNABSOLUTER��QNRELATIVER�alloc_overflow_ebx�QNABSOLUTER�qQNABSOLUTER�kQNABSOLUTER�eQNABSOLUTER�QQNABSOLUTER�4=?`F&(source-pathname)aMbPc�FdJ?>e#` BPARSE-UNKNOWN-TYPE-SPECIFIER<NOTE-UNDEFINED-REFERENCE<L*ABORTED-COMPILATION-UNITS*L*IN-COMPILATION-UNIT**UNDEFINED-WARNINGS**COMPILER-ERROR-COUNT**COMPILER-WARNING-COUNT**COMPILER-NOTE-COUNT*BPARSE-UNKNOWN-TYPEQ&
+CONDITIONSR n*HANDLER-CLUSTERS*F<ENSURE-DIRECTORIES-EXIST<NOUTPUT-FILENPRINTNVERBOSECOMPILE-FILE<LOAD<
+PROBE-FILE<%<
PRINT-SUMMARY<%&&DEFUN COMPILE-FILES-IF-NEEDED-SERIALLYx'-. COMPILE-FILES-IF-NEEDED-SERIALLY0+G51CG52cz+$(��{$+|4$'$$$#8 1
}$b-x0+G53MG54�~+���$+�4$'$#�#= 1
�#�-x+ CLISPC�+��$+�4$'$#�#B 1
�#�-�
G40y�NCLEANUP+�+%�
+�F�$+�+�$'$#�#B 1
�#
+-y+FILES��+��
+��'� �
+'RR�r�$+�+�$'$#
+#G 1
�#�-�
G0y�+@BINARY-PATHNAME�FILES�NEEDS-RECOMPILECSOURCE-PATHNAMEc�+���
+!� C #
+
]
�$+�+�$'$#�#Q 1
�#�-�
G31y��+�+��)2�$+�+�$'$#�#[ 1
�(
�1��;` ~�E��e��M�U��E��� �ŋ́��U��Q�A����E����ЋM��E�������ᐐ����~6�E��e������U�܃��U���k����P��=���u��`�@�=�(u��(�e��m����P�����O�����P��Ƌ
!�A�=��)=�(���'�(�4�(��(�|�(;��(v��|�(���@�H���(�=4�(t� �E���(�%�
��(�C����
��(�A��Y��S�1ҋ)�
��(�C����
��(�A��Y��S�1ҋ-�
��(�C����
��(�A��Y��S�1ҋ1�
��(�C����
��(�A��Y��S��'�(�!�
��(�C����
��(�A��Y��S�1ҋ�
��(�C����
��(�A��Y��S��4�(��(�|�(;��(v��|�(�@��(�=4�(t� �
9�H��
5�H���4�(��(�|�(;��(v��|�(�[�ÉP��@�(��(�=4�(t� �
=�A�=��C�4�(��(�|�(;��(v��|�(�R��(�=4�(t� �Z��B�=�
��(�C����
��(�A��Y��S����(�E����(�
��(��(�E��M��U��e��M����(��i�A��E����(�ŋ́��U�A����E�=��E�E���(�H����(����(�ŋ́��U��A����E�w������(�B��J��H��B������(���(�B��J��H��B������(���(�B��J��H��B������(���(�B��J��H��B������(���(�B��J��H��B������(���(�B��J��H��B������(���(�B��J��H��B������(�E�e��m���'�(�4�(��(�|�(;��(v��|�(���@�H���(�=4�(t� �E����(�E����(�
��(��(�E��M��U��e��MЋ��(��i�AQ�EЉ��(�ŋ́��U�A����E��;�E�E���(�H����(����(�͋ԁ��E��J����E�L����������U�]��M�E��M��U����(�
��(��(�]����(9�t!�B� �t
�J��H��B���9�u���(�͋ԁ��E��J����E���n����E�]��M���U�]��M�E��M��U����(�
��(��(�]����(9�t!�B� �t
�J��H��B���9�u���(�ŋ́��U��A����E�?�&�E�]��M���E��(�U��r�E��@��E��܃��U��A��k����P��Uܺ�(�
=�A�=���4�(��(�|�(;��(v��|�(�[��(�=4�(t� �S��C�=�
��(�B����
��(�A��Q��Z��}��(���܃��U܋E��k����P��܃��U��=I�u܋M�C��C��(�Q�C��C�'�(�U��k����P���E�'�(�܃��U܋=Q�'�(�Y��k����P�㛋��(�B��J��H��B������(�E��@�E��M���$<����=�(�r�����(�e��m���܃��U܋]��k����P����(uA�'�(=�(������܃��U��}܋a��k����P����(�����������(뽋R���x����tK�܃��e��k����P���(�e��m���
+
�
+M�
+�
+N�
+N�
+N�
+N�
+QNABSOLUTER� QNABSOLUTER� QNABSOLUTER��QNABSOLUTER��QNABSOLUTER�)QNABSOLUTER�QNABSOLUTER��QNABSOLUTER��QNABSOLUTER��QNABSOLUTER��QNABSOLUTER��QNABSOLUTER�~QNRELATIVER�alloc_overflow_ebxWQNABSOLUTER�#QNABSOLUTER�QNRELATIVERQUNWINDR��QNABSOLUTER��QNRELATIVERQUNWINDR�bQNABSOLUTER�OQNABSOLUTER��QNABSOLUTER��QNABSOLUTER�~QNRELATIVER�alloc_overflow_eaxQNABSOLUTER�QNABSOLUTER��QNABSOLUTER��QNABSOLUTER�RQNRELATIVER�alloc_overflow_edx+QNABSOLUTER��QNRELATIVER�alloc_overflow_ebx�QNABSOLUTER��QNABSOLUTER��QNRELATIVER�alloc_overflow_eaxuQNABSOLUTER�4QNABSOLUTER�QNABSOLUTER��QNABSOLUTER��QNABSOLUTER��QNABSOLUTER��QNRELATIVER�alloc_overflow_eaxPQNABSOLUTER�QNABSOLUTER�QNRELATIVERQ 2 GENERIC-+R��QNABSOLUTER��QNABSOLUTER��QNABSOLUTER��QNABSOLUTER��QNABSOLUTER�H=?�x& (lisp::c)�Mb9%UNDEFINED%���h����y&(files)�Mb��y�J?>�#�BD<&.swank�<<NIF-DOES-NOT-EXISTu<%&DEFUN LOAD-USER-INIT-FILE�'-.LOAD-USER-INIT-FILE0+G0M�+��$+�4$'$$#�1
�$&-�+�+&5�$+�4$'$$&#�1
�(�1��;�~�E��e������ԃ��1ɉj����P��U�܃���=�5�!�C��%��k����P����܃��U�)��k����P��=-��(�1��u��`�
+MQNABSOLUTER��QNABSOLUTER��QNABSOLUTER��QNABSOLUTER�bQNABSOLUTER�YQNABSOLUTER�SQNABSOLUTER�MQNABSOLUTER�GQNABSOLUTER�-=?��oM����J�<�$ �1�%<&0Returns true if NEW-FILE is newer than OLD-FILE.�Fd&FReturn the pathname where SOURCE-PATHNAME's binary should be compiled.�y�&zCompile each file in FILES if the source is newer than
+its corresponding binary, or the file preceding it was
+recompiled.�y</<&
swank-backend�ZINTERN<STRING<NWARN-UNIMPLEMENTED-INTERFACESN
SWANK-BACKEND FUNCTIONP<��&9Load the user init file, return NIL if it does not exist.#]1;V !"�q?#$%�q?&'(�q?)*+�q,??-.��/�?/剋�q///�/�`/���q?///�q0�?���]$$�� 8QEXPORTQUOTE.LOAD-USER-INIT-FILE6R?>
#�B*LOAD-TRUENAME*& site-initNDEFAULTS<�u<%&DEFUN LOAD-SITE-INIT-FILE'-.LOAD-SITE-INIT-FILE0+G0M+s$+4$'$$#�1
$"-++"L
+$+4$'$$"#�1
(1;�~�E��e���un�
�A�=�tc�܃���=�5�
!�K��
%�K�C�)��k����P��=-��(�1��u��`��
+M�
+NQNABSOLUTER��QNABSOLUTER�uQNABSOLUTER�`QNABSOLUTER�TQNABSOLUTER�KQNABSOLUTER�EQNABSOLUTER�?QNABSOLUTER�9QNABSOLUTER�$=?&o��'J'<�<#]1();? !0�q"�`�#�q0�*]$$��+8QDEBUG-SOURCER (-$$ -.NFILE�"&��0"
+=�1$+@\��k��
�
~Lu\Qo21 345�)5�5�5��5̣5�Q5�05� 5��5̿5̮5�v5�e5�B?>6@
\ No newline at end of file
Modified: trunk/thirdparty/emacs/slime/swank-openmcl.lisp
===================================================================
--- trunk/thirdparty/emacs/slime/swank-openmcl.lisp 2006-11-30 14:00:03 UTC (rev 2091)
+++ trunk/thirdparty/emacs/slime/swank-openmcl.lisp 2006-11-30 16:32:54 UTC (rev 2092)
@@ -52,18 +52,7 @@
(in-package :swank-backend)
-(import
- '(ccl:fundamental-character-output-stream
- ccl:stream-write-char
- ccl:stream-line-length
- ccl:stream-force-output
- ccl:fundamental-character-input-stream
- ccl:stream-read-char
- ccl:stream-listen
- ccl:stream-unread-char
- ccl:stream-clear-input
- ccl:stream-line-column
- ccl:stream-line-length))
+(import-from :ccl *gray-stream-symbols* :swank-backend)
(require 'xref)
@@ -76,6 +65,7 @@
cl:method
cl:standard-class
ccl::eql-specializer
+ openmcl-mop:finalize-inheritance
;; standard-class readers
openmcl-mop:class-default-initargs
openmcl-mop:class-direct-default-initargs
@@ -107,21 +97,60 @@
;; slot readers
openmcl-mop:slot-definition-allocation
ccl::slot-definition-documentation
+ openmcl-mop:slot-value-using-class
openmcl-mop:slot-definition-initargs
openmcl-mop:slot-definition-initform
openmcl-mop:slot-definition-initfunction
openmcl-mop:slot-definition-name
openmcl-mop:slot-definition-type
openmcl-mop:slot-definition-readers
- openmcl-mop:slot-definition-writers))
+ openmcl-mop:slot-definition-writers
+ openmcl-mop:slot-boundp-using-class))
(defun specializer-name (spec)
(etypecase spec
(cons spec)
- ((or structure-class swank-mop:standard-class built-in-class) (swank-mop:class-name spec))
- (swank-mop:eql-specializer `(eql ,(swank-mop:eql-specializer-object spec)))
- ))
+ (class (class-name spec))
+ (ccl::eql-specializer `(eql ,(ccl::eql-specializer-object spec)))))
+(defun swank-mop:compute-applicable-methods-using-classes (gf args)
+ (let* ((methods (ccl::%gf-methods gf))
+ (args-length (length args))
+ (bits (ccl::inner-lfun-bits gf))
+ arg-count res)
+ (when methods
+ (setq arg-count (length (ccl::%method-specializers (car methods))))
+ (unless (<= arg-count args-length)
+ (error "Too few args to ~s" gf))
+ (unless (or (logbitp ccl::$lfbits-rest-bit bits)
+ (logbitp ccl::$lfbits-restv-bit bits)
+ (logbitp ccl::$lfbits-keys-bit bits)
+ (<= args-length
+ (+ (ldb ccl::$lfbits-numreq bits) (ldb ccl::$lfbits-numopt bits))))
+ (error "Too many args to ~s" gf))
+ (let ((cpls (make-list arg-count)))
+ (declare (dynamic-extent cpls))
+ (do* ((args-tail args (cdr args-tail))
+ (cpls-tail cpls (cdr cpls-tail)))
+ ((null cpls-tail))
+ (setf (car cpls-tail)
+ (ccl::%class-precedence-list (car args-tail))))
+ (flet ((%method-applicable-p (method args cpls)
+ (do* ((specs (ccl::%method-specializers method) (ccl::%cdr specs))
+ (args args (ccl::%cdr args))
+ (cpls cpls (ccl::%cdr cpls)))
+ ((null specs) t)
+ (let ((spec (ccl::%car specs)))
+ (if (typep spec 'ccl::eql-specializer)
+ (unless (subtypep (ccl::%car args) (class-of (ccl::eql-specializer-object spec)))
+ (return nil))
+ (unless (ccl:memq spec (ccl::%car cpls))
+ (return nil)))))))
+ (dolist (m methods)
+ (if (%method-applicable-p m args cpls)
+ (push m res))))
+ (ccl::sort-methods res cpls (ccl::%gf-precedence-list gf))))))
+
;;; TCP Server
(defimplementation preferred-communication-style ()
@@ -137,20 +166,19 @@
(defimplementation close-socket (socket)
(close socket))
-(defimplementation accept-connection (socket
- &key (external-format :iso-latin-1-unix))
- (assert (eq external-format :iso-latin-1-unix))
+(defimplementation accept-connection (socket
+ &key external-format buffering timeout)
+ (declare (ignore buffering timeout external-format))
(ccl:accept-connection socket :wait t))
(defimplementation emacs-connected ()
(setq ccl::*interactive-abort-process* ccl::*current-process*))
(defimplementation make-stream-interactive (stream)
- nil)
+ (typecase stream
+ (ccl:fundamental-output-stream
+ (push stream ccl::*auto-flush-streams*))))
-(defmethod make-stream-interactive ((stream ccl:fundamental-output-stream))
- (push stream ccl::*auto-flush-streams*))
-
;;; Unix signals
(defimplementation call-without-interrupts (fn)
@@ -216,10 +244,13 @@
;;; Evaluation
-(defimplementation arglist ((fname symbol))
- (ccl:arglist fname))
+(defimplementation arglist (fname)
+ (arglist% fname))
-(defmethod arglist ((f function))
+(defmethod arglist% ((f symbol))
+ (ccl:arglist f))
+
+(defmethod arglist% ((f function))
(ccl:arglist (ccl:function-name f)))
(defimplementation function-name (function)
@@ -234,8 +265,10 @@
"Return the position in the source file of a compiler condition."
(+ 1
(or *buffer-offset* 0)
- (ccl::compiler-warning-stream-position condition)))
+ ;; alanr sometimes returned stream position nil.
+ (or (ccl::compiler-warning-stream-position condition) 0)))
+
(defun handle-compiler-warning (condition)
"Construct a compiler note for Emacs from a compiler warning
condition."
@@ -250,38 +283,41 @@
(make-location
(list :buffer *buffer-name*)
(list :position position t))
- (make-location
- (list :file (ccl::compiler-warning-file-name condition))
- (list :position position t)))))))
+ (if (ccl::compiler-warning-file-name condition)
+ (make-location
+ (list :file (namestring (truename (ccl::compiler-warning-file-name condition))))
+ (list :position position t))))))))
(defun temp-file-name ()
"Return a temporary file name to compile strings into."
(ccl:%get-cstring (#_tmpnam (ccl:%null-ptr))))
(defimplementation call-with-compilation-hooks (function)
- (handler-bind ((ccl::compiler-warning #'handle-compiler-warning))
+ (handler-bind ((ccl::compiler-warning 'handle-compiler-warning))
(funcall function)))
-(defimplementation swank-compile-file (filename load-p)
+(defimplementation swank-compile-file (filename load-p external-format)
+ (declare (ignore external-format))
(with-compilation-hooks ()
(let ((*buffer-name* nil)
(*buffer-offset* nil))
(compile-file filename :load load-p))))
(defimplementation frame-var-value (frame var)
- (map-backtrace
- #'(lambda(frame-number p context lfun pc)
- (when (= frame frame-number)
- (return-from frame-var-value
- (multiple-value-bind (total vsp parent-vsp)
- (ccl::count-values-in-frame p context)
- (loop for count below total
- with varcount = -1
- for (value nil name) = (multiple-value-list (ccl::nth-value-in-frame p count context lfun pc vsp parent-vsp))
- when name do (incf varcount)
- until (= varcount var)
- finally (return value))
- ))))))
+ (block frame-var-value
+ (map-backtrace
+ #'(lambda(frame-number p context lfun pc)
+ (when (= frame frame-number)
+ (return-from frame-var-value
+ (multiple-value-bind (total vsp parent-vsp)
+ (ccl::count-values-in-frame p context)
+ (loop for count below total
+ with varcount = -1
+ for (value nil name) = (multiple-value-list (ccl::nth-value-in-frame p count context lfun pc vsp parent-vsp))
+ when name do (incf varcount)
+ until (= varcount var)
+ finally (return value))
+ )))))))
(defun xref-locations (relation name &optional (inverse nil))
(loop for xref in (if inverse
@@ -430,7 +466,15 @@
(ccl::frame-supplied-args p lfun pc nil context)
(declare (ignore count nclosed))
(let ((result nil))
- (loop for var in args
+ (loop named loop
+ for var = (cond
+ ((null args)
+ (return-from loop))
+ ((atom args)
+ (prog1
+ args
+ (setf args nil)))
+ (t (pop args)))
for type in types
for name in names
do
@@ -465,45 +509,46 @@
(princ frame stream))
(defimplementation frame-locals (index)
- (map-backtrace
- (lambda (frame-number p context lfun pc)
- (when (= frame-number index)
- (multiple-value-bind (count vsp parent-vsp)
- (ccl::count-values-in-frame p context)
- (let (result)
- (dotimes (i count)
- (multiple-value-bind (var type name)
- (ccl::nth-value-in-frame p i context lfun pc vsp parent-vsp)
- (declare (ignore type))
- (when name
- (push (list
- :name name
- :id 0
- :value var)
- result))))
- (return-from frame-locals (nreverse result))))))))
+ (block frame-locals
+ (map-backtrace
+ (lambda (frame-number p context lfun pc)
+ (when (= frame-number index)
+ (multiple-value-bind (count vsp parent-vsp)
+ (ccl::count-values-in-frame p context)
+ (let (result)
+ (dotimes (i count)
+ (multiple-value-bind (var type name)
+ (ccl::nth-value-in-frame p i context lfun pc vsp parent-vsp)
+ (declare (ignore type))
+ (when name
+ (push (list
+ :name name
+ :id 0
+ :value var)
+ result))))
+ (return-from frame-locals (nreverse result)))))))))
(defimplementation frame-catch-tags (index &aux my-frame)
- (map-backtrace
- (lambda (frame-number p context lfun pc)
- (declare (ignore pc lfun))
- (if (= frame-number index)
- (setq my-frame p)
- (when my-frame
- (return-from frame-catch-tags
- (loop for catch = (ccl::%catch-top (ccl::%current-tcr)) then (ccl::next-catch catch)
- while catch
- for csp = (ccl::uvref catch 3) ; ppc32::catch-frame.csp-cell) defined in arch.lisp
- for tag = (ccl::uvref catch 0) ; ppc32::catch-frame.catch-tag-cell)
- until (ccl::%stack< p csp context)
- do (print "-") (print catch) (terpri) (describe tag)
- when (ccl::%stack< my-frame csp context)
- collect (cond
- ((symbolp tag)
- tag)
- ((and (listp tag)
- (typep (car tag) 'restart))
- `(:restart ,(restart-name (car tag))))))))))))
+ (block frame-catch-tags
+ (map-backtrace
+ (lambda (frame-number p context lfun pc)
+ (declare (ignore pc lfun))
+ (if (= frame-number index)
+ (setq my-frame p)
+ (when my-frame
+ (return-from frame-catch-tags
+ (loop for catch = (ccl::%catch-top (ccl::%current-tcr)) then (ccl::next-catch catch)
+ while catch
+ for csp = (ccl::uvref catch 3) ; ppc32::catch-frame.csp-cell) defined in arch.lisp
+ for tag = (ccl::uvref catch 0) ; ppc32::catch-frame.catch-tag-cell)
+ until (ccl::%stack< p csp context)
+ when (ccl::%stack< my-frame csp context)
+ collect (cond
+ ((symbolp tag)
+ tag)
+ ((and (listp tag)
+ (typep (car tag) 'restart))
+ `(:restart ,(restart-name (car tag)))))))))))))
(defimplementation disassemble-frame (the-frame-number)
(let ((function-to-disassemble nil))
@@ -551,7 +596,7 @@
(defun function-source-location (function)
(multiple-value-bind (info name) (ccl::edit-definition-p function)
- (cond ((not info) (list :error "No source info available for ~A" function))
+ (cond ((not info) (list :error (format nil "No source info available for ~A" function)))
((typep (caar info) 'ccl::method)
`(:location
(:file ,(remove-filename-quoting (namestring (translate-logical-pathname (cdr (car info))) )))
@@ -568,32 +613,34 @@
function in a debugger frame. In OpenMCL, we are not able to
find the precise position of the frame, but we do attempt to give
at least the filename containing it."
- (map-backtrace
- (lambda (frame-number p context lfun pc)
- (declare (ignore p context pc))
- (when (and (= frame-number index) lfun)
- (return-from frame-source-location-for-emacs
- (function-source-location lfun))))))
+ (block frame-source-location-for-emacs
+ (map-backtrace
+ (lambda (frame-number p context lfun pc)
+ (declare (ignore p context pc))
+ (when (and (= frame-number index) lfun)
+ (return-from frame-source-location-for-emacs
+ (function-source-location lfun)))))))
(defimplementation eval-in-frame (form index)
- (map-backtrace
- (lambda (frame-number p context lfun pc)
- (when (= frame-number index)
- (multiple-value-bind (count vsp parent-vsp)
- (ccl::count-values-in-frame p context)
- (let ((bindings nil))
- (dotimes (i count)
- (multiple-value-bind (var type name)
- (ccl::nth-value-in-frame p i context lfun pc vsp parent-vsp)
- (declare (ignore type))
- (when name
- (push (list name `',var) bindings))
- ))
- (return-from eval-in-frame
- (eval `(let ,bindings
- (declare (ignorable ,@(mapcar 'car bindings)))
- ,form)))
- ))))))
+ (block eval-in-frame
+ (map-backtrace
+ (lambda (frame-number p context lfun pc)
+ (when (= frame-number index)
+ (multiple-value-bind (count vsp parent-vsp)
+ (ccl::count-values-in-frame p context)
+ (let ((bindings nil))
+ (dotimes (i count)
+ (multiple-value-bind (var type name)
+ (ccl::nth-value-in-frame p i context lfun pc vsp parent-vsp)
+ (declare (ignore type))
+ (when name
+ (push (list name `',var) bindings))
+ ))
+ (return-from eval-in-frame
+ (eval `(let ,bindings
+ (declare (ignorable ,@(mapcar 'car bindings)))
+ ,form)))
+ )))))))
(defimplementation return-from-frame (index form)
(let ((values (multiple-value-list (eval-in-frame form index))))
@@ -643,6 +690,23 @@
(:class
(describe (find-class symbol)))))
+(defimplementation toggle-trace (spec)
+ "We currently ignore just about everything."
+ (ecase (car spec)
+ (setf
+ (ccl::%trace spec))
+ (:defmethod
+ (ccl::%trace (second spec)))
+ (:defgeneric
+ (ccl::%trace (second spec)))
+ (:call
+ (toggle-trace (third spec)))
+ ;; mb: FIXME: shouldn't we warn that we're not doing anything for
+ ;; these two?
+ (:labels nil)
+ (:flet nil))
+ t)
+
;;; XREF
(defimplementation list-callers (symbol)
@@ -675,13 +739,13 @@
(defimplementation make-default-inspector ()
(make-instance 'openmcl-inspector))
-(defmethod describe-primitive-type (thing)
+(defimplementation describe-primitive-type (thing)
(let ((typecode (ccl::typecode thing)))
(if (gethash typecode *value2tag*)
(string (gethash typecode *value2tag*))
(string (nth typecode '(tag-fixnum tag-list tag-misc tag-imm))))))
-(defimplementation inspect-for-emacs ((o t) (inspector openmcl-inspector))
+(defmethod inspect-for-emacs ((o t) (inspector openmcl-inspector))
(declare (ignore inspector))
(let* ((i (inspector::make-inspector o))
(count (inspector::compute-line-count i))
@@ -730,6 +794,38 @@
collect `(:value ,(ccl::uvref object index))
collect `(:newline)))))
+(defun closure-closed-over-values (closure)
+ (let ((howmany (nth-value 8 (ccl::function-args (ccl::closure-function closure)))))
+ (loop for n below howmany
+ collect
+ (let* ((value (ccl::%svref closure (+ 1 (- howmany n))))
+ (map (car (ccl::function-symbol-map (ccl::closure-function closure))))
+ (label (or (and map (svref map n)) n))
+ (cellp (ccl::closed-over-value-p value)))
+ (list label (if cellp (ccl::closed-over-value value) value))))))
+
+(defmethod inspect-for-emacs ((c ccl::compiled-lexical-closure) (inspector t))
+ (declare (ignore inspector))
+ (values
+ (format nil "A closure: ~a" c)
+ `(,@(if (arglist c)
+ (list "Its argument list is: "
+ (funcall (intern "INSPECTOR-PRINC" 'swank) (arglist c)))
+ ;; FIXME inspector-princ should load earlier
+ (list "A function of no arguments"))
+ (:newline)
+ ,@(when (documentation c t)
+ `("Documentation:" (:newline) ,(documentation c t) (:newline)))
+ ,(format nil "Closed over ~a values" (length (closure-closed-over-values c)))
+ (:newline)
+ ,@(loop for (name value) in (closure-closed-over-values c)
+ for count from 1
+ append
+ (label-value-line* ((format nil "~2,' d) ~a" count (string name)) value))))))
+
+
+
+
;;; Multiprocessing
(defvar *known-processes* '() ; FIXME: leakage. -luke
@@ -746,8 +842,6 @@
(defimplementation spawn (fn &key name)
(ccl:process-run-function (or name "Anonymous (Swank)") fn))
-(defimplementation startup-multiprocessing ())
-
(defimplementation thread-id (thread)
(ccl::process-serial-number thread))
@@ -827,3 +921,12 @@
(defimplementation quit-lisp ()
(ccl::quit))
+
+;;; Weak datastructures
+
+(defimplementation make-weak-key-hash-table (&rest args)
+ (apply #'make-hash-table :weak :key args))
+
+(defimplementation make-weak-value-hash-table (&rest args)
+ (apply #'make-hash-table :weak :value args))
+
Modified: trunk/thirdparty/emacs/slime/swank-sbcl.lisp
===================================================================
--- trunk/thirdparty/emacs/slime/swank-sbcl.lisp 2006-11-30 14:00:03 UTC (rev 2091)
+++ trunk/thirdparty/emacs/slime/swank-sbcl.lisp 2006-11-30 16:32:54 UTC (rev 2092)
@@ -4,49 +4,56 @@
;;;
;;; Created 2003, Daniel Barlow <dan(a)metacircles.com>
;;;
-;;; This code has been placed in the Public Domain. All warranties are
+;;; This code has been placed in the Public Domain. All warranties are
;;; disclaimed.
;;; Requires the SB-INTROSPECT contrib.
;;; Administrivia
+(in-package :swank-backend)
+
(eval-when (:compile-toplevel :load-toplevel :execute)
(require 'sb-bsd-sockets)
(require 'sb-introspect)
(require 'sb-posix))
-(in-package :swank-backend)
-(declaim (optimize (debug 2)))
+(declaim (optimize (debug 2) (sb-c:insert-step-conditions 0)))
-(import
- '(sb-gray:fundamental-character-output-stream
- sb-gray:stream-write-char
- sb-gray:stream-line-length
- sb-gray:stream-force-output
- sb-gray:fundamental-character-input-stream
- sb-gray:stream-read-char
- sb-gray:stream-listen
- sb-gray:stream-unread-char
- sb-gray:stream-clear-input
- sb-gray:stream-line-column
- sb-gray:stream-line-length))
+(import-from :sb-gray *gray-stream-symbols* :swank-backend)
+;;; backwards compability tests
+
+(eval-when (:compile-toplevel :load-toplevel :execute)
+ ;; Generate a form suitable for testing for stepper support (0.9.17)
+ ;; with #+.
+ (defun sbcl-with-new-stepper-p ()
+ (if (find-symbol "ENABLE-STEPPING" "SB-IMPL")
+ '(and)
+ '(or)))
+ ;; Ditto for weak hash-tables
+ (defun sbcl-with-weak-hash-tables ()
+ (if (find-symbol "HASH-TABLE-WEAKNESS" "SB-EXT")
+ '(and)
+ '(or))))
+
;;; swank-mop
(import-swank-mop-symbols :sb-mop '(:slot-definition-documentation))
(defun swank-mop:slot-definition-documentation (slot)
- (sb-pcl::documentation slot t))
+ (sb-pcl::documentation slot t))
;;; TCP Server
(defimplementation preferred-communication-style ()
- (if (and (member :sb-thread *features*)
- (not (sb-alien:extern-alien "linux_no_threads_p" sb-alien:boolean)))
- :spawn
- :fd-handler))
-
+ (cond
+ ;; fixme: when SBCL/win32 gains better select() support, remove
+ ;; this.
+ ((member :win32 *features*) nil)
+ ((member :sb-thread *features*) :spawn)
+ (t :fd-handler)))
+
(defun resolve-hostname (name)
(car (sb-bsd-sockets:host-ent-addresses
(sb-bsd-sockets:get-host-by-name name))))
@@ -67,9 +74,13 @@
(sb-sys:invalidate-descriptor (socket-fd socket))
(sb-bsd-sockets:socket-close socket))
-(defimplementation accept-connection (socket
- &key (external-format :iso-latin-1-unix))
- (make-socket-io-stream (accept socket) external-format))
+(defimplementation accept-connection (socket &key
+ external-format
+ buffering timeout)
+ (declare (ignore timeout))
+ (make-socket-io-stream (accept socket)
+ (or external-format :iso-latin-1-unix)
+ (or buffering :full)))
(defvar *sigio-handlers* '()
"List of (key . fn) pairs to be called on SIGIO.")
@@ -98,14 +109,14 @@
(defimplementation remove-sigio-handlers (socket)
(let ((fd (socket-fd socket)))
(setf *sigio-handlers* (delete fd *sigio-handlers* :key #'car))
- (sb-sys:invalidate-descriptor fd))
+ (sb-sys:invalidate-descriptor fd))
(close socket))
(defimplementation add-fd-handler (socket fn)
(declare (type function fn))
(let ((fd (socket-fd socket)))
(format *debug-io* "; Adding fd handler: ~S ~%" fd)
- (sb-sys:add-fd-handler fd :input (lambda (_)
+ (sb-sys:add-fd-handler fd :input (lambda (_)
_
(funcall fn)))))
@@ -118,26 +129,35 @@
(sb-bsd-sockets:socket (sb-bsd-sockets:socket-file-descriptor socket))
(file-stream (sb-sys:fd-stream-fd socket))))
-(defun make-socket-io-stream (socket external-format)
- (let ((encoding (ecase external-format
- (:iso-latin-1-unix :iso-8859-1)
- #+sb-unicode
- (:utf-8-unix :utf-8))))
- (sb-bsd-sockets:socket-make-stream socket
- :output t
- :input t
- :element-type 'character
- #+sb-unicode :external-format
- #+sb-unicode encoding
- )))
+(defvar *external-format-to-coding-system*
+ '((:iso-8859-1
+ "latin-1" "latin-1-unix" "iso-latin-1-unix"
+ "iso-8859-1" "iso-8859-1-unix")
+ (:utf-8 "utf-8" "utf-8-unix")
+ (:euc-jp "euc-jp" "euc-jp-unix")
+ (:us-ascii "us-ascii" "us-ascii-unix")))
+(defimplementation find-external-format (coding-system)
+ (car (rassoc-if (lambda (x) (member coding-system x :test #'equal))
+ *external-format-to-coding-system*)))
+
+(defun make-socket-io-stream (socket external-format buffering)
+ (sb-bsd-sockets:socket-make-stream socket
+ :output t
+ :input t
+ :element-type 'character
+ :buffering buffering
+ #+sb-unicode :external-format
+ #+sb-unicode external-format
+ ))
+
(defun accept (socket)
"Like socket-accept, but retry on EAGAIN."
- (loop (handler-case
+ (loop (handler-case
(return (sb-bsd-sockets:socket-accept socket))
(sb-bsd-sockets:interrupted-error ()))))
-(defmethod call-without-interrupts (fn)
+(defimplementation call-without-interrupts (fn)
(declare (type function fn))
(sb-sys:without-interrupts (funcall fn)))
@@ -189,9 +209,9 @@
(read stream t nil t))))
(values))
-(defvar *shebang-readtable*
+(defvar *shebang-readtable*
(let ((*readtable* (copy-readtable nil)))
- (set-dispatch-macro-character #\# #\!
+ (set-dispatch-macro-character #\# #\!
(lambda (s c n) (shebang-reader s c n))
*readtable*)
*readtable*))
@@ -215,7 +235,7 @@
(defvar *debootstrap-packages* t)
(defun call-with-debootstrapping (fun)
- (handler-bind ((sb-int:bootstrap-package-not-found
+ (handler-bind ((sb-int:bootstrap-package-not-found
#'sb-int:debootstrap-package))
(funcall fun)))
@@ -223,7 +243,7 @@
`(call-with-debootstrapping (lambda () ,@body)))
(defimplementation call-with-syntax-hooks (fn)
- (cond ((and *debootstrap-packages*
+ (cond ((and *debootstrap-packages*
(sbcl-package-p *package*))
(with-debootstrapping (funcall fn)))
(t
@@ -236,10 +256,11 @@
;;; Utilities
-(defimplementation arglist ((fname t))
+(defimplementation arglist (fname)
(sb-introspect:function-arglist fname))
-(defimplementation function-name ((f function))
+(defimplementation function-name (f)
+ (check-type f function)
(sb-impl::%fun-name f))
(defvar *buffer-name* nil)
@@ -290,7 +311,7 @@
(list :error "No error location available")))
(defun locate-compiler-note (file source-path source)
- (cond ((and (pathnamep file) *buffer-name*)
+ (cond ((and (not (eq file :lisp)) *buffer-name*)
;; Compiling from a buffer
(let ((position (+ *buffer-offset*
(source-path-string-position
@@ -301,14 +322,14 @@
;; Compiling from a file
(make-location (list :file (namestring file))
(list :position
- (1+ (source-path-file-position
+ (1+ (source-path-file-position
source-path file)))))
((and (eq file :lisp) (stringp source))
;; Compiling macro generated code
(make-location (list :source-form source)
(list :position 1)))
(t
- (error "unhandled case"))))
+ (error "unhandled case in compiler note ~S ~S ~S" file source-path source))))
(defun brief-compiler-message-for-emacs (condition)
"Briefly describe a compiler error for Emacs.
@@ -357,10 +378,11 @@
(defvar *trap-load-time-warnings* nil)
-(defimplementation swank-compile-file (filename load-p)
+(defimplementation swank-compile-file (filename load-p external-format)
(handler-case
(let ((output-file (with-compilation-hooks ()
- (compile-file filename))))
+ (compile-file filename
+ :external-format external-format))))
(when output-file
;; Cache the latest source file for definition-finding.
(source-cache-get filename (file-write-date filename))
@@ -370,245 +392,169 @@
;;;; compile-string
-;;; We patch sb-c::debug-source-for-info so that we can dump our own
-;;; bits of source info. Our *user-source-info* is stored in the
-;;; debug-source-info slot.
+;;; We copy the string to a temporary file in order to get adequate
+;;; semantics for :COMPILE-TOPLEVEL and :LOAD-TOPLEVEL EVAL-WHEN forms
+;;; which the previous approach using
+;;; (compile nil `(lambda () ,(read-from-string string)))
+;;; did not provide.
-(defvar *real-debug-source-for-info*)
-(defvar *user-source-info*)
-
-(defun debug-source-for-info-advice (info)
- (destructuring-bind (source) (funcall *real-debug-source-for-info* info)
- (when (boundp '*user-source-info*)
- (setf (sb-c::debug-source-info source) *user-source-info*))
- (list source)))
+(sb-alien:define-alien-routine "tmpnam" sb-alien:c-string
+ (dest (* sb-alien:c-string)))
-(defun install-debug-source-patch ()
- (unless (boundp '*real-debug-source-for-info*)
- (setq *real-debug-source-for-info* #'sb-c::debug-source-for-info))
- (sb-ext:without-package-locks
- (setf (symbol-function 'sb-c::debug-source-for-info)
- #'debug-source-for-info-advice)))
+(defun temp-file-name ()
+ "Return a temporary file name to compile strings into."
+ (concatenate 'string (tmpnam nil) ".lisp"))
(defimplementation swank-compile-string (string &key buffer position directory)
(declare (ignore directory))
- (install-debug-source-patch)
- (call/temp-file
- string
- (lambda (filename)
- (let ((*user-source-info* (list :emacs-buffer buffer :emacs-string string
- :emacs-position position))
- (*buffer-name* buffer)
- (*buffer-offset* position)
- (*buffer-substring* string))
- (let ((fasl (with-compilation-hooks ()
- (compile-file filename))))
- (load fasl)
- (delete-file fasl))))))
+ (let ((*buffer-name* buffer)
+ (*buffer-offset* position)
+ (*buffer-substring* string)
+ (filename (temp-file-name)))
+ (flet ((compile-it (fn)
+ (with-compilation-hooks ()
+ (with-compilation-unit
+ (:source-plist (list :emacs-buffer buffer
+ :emacs-string string
+ :emacs-position position))
+ (funcall fn (compile-file filename))))))
+ (with-open-file (s filename :direction :output :if-exists :error)
+ (write-string string s))
+ (unwind-protect
+ (if *trap-load-time-warnings*
+ (compile-it #'load)
+ (load (compile-it #'identity)))
+ (ignore-errors
+ (delete-file filename)
+ (delete-file (compile-file-pathname filename)))))))
-(defun call/temp-file (string fun)
- (let ((filename (temp-file-name)))
- (unwind-protect
- (with-open-file (s filename :direction :output :if-exists :error)
- (write-string string s)
- (finish-output s)
- (funcall fun filename))
- (when (probe-file filename)
- (delete-file filename)))))
-
-(defun temp-file-name ()
- "Return a temporary file name to compile strings into."
- (sb-alien:alien-funcall
- (sb-alien:extern-alien
- "tmpnam"
- (function sb-alien:c-string sb-alien:system-area-pointer))
- (sb-sys:int-sap 0)))
-
;;;; Definitions
(defvar *debug-definition-finding* nil
"When true don't handle errors while looking for definitions.
This is useful when debugging the definition-finding code.")
+(defparameter *definition-types*
+ '(:variable defvar
+ :constant defconstant
+ :type deftype
+ :symbol-macro define-symbol-macro
+ :macro defmacro
+ :compiler-macro define-compiler-macro
+ :function defun
+ :generic-function defgeneric
+ :method defmethod
+ :setf-expander define-setf-expander
+ :structure defstruct
+ :condition define-condition
+ :class defclass
+ :method-combination define-method-combination
+ :package defpackage
+ :transform :deftransform
+ :optimizer :defoptimizer
+ :vop :define-vop
+ :source-transform :define-source-transform)
+ "Map SB-INTROSPECT definition type names to Slime-friendly forms")
+
(defimplementation find-definitions (name)
- (append (function-definitions name)
- (compiler-definitions name)))
+ (loop for type in *definition-types* by #'cddr
+ for locations = (sb-introspect:find-definition-sources-by-name
+ name type)
+ append (loop for source-location in locations collect
+ (make-source-location-specification type name
+ source-location))))
-;;;;; Function definitions
+(defun make-source-location-specification (type name source-location)
+ (list (list* (getf *definition-types* type)
+ name
+ (sb-introspect::definition-source-description source-location))
+ (if *debug-definition-finding*
+ (make-definition-source-location source-location type name)
+ (handler-case (make-definition-source-location source-location
+ type name)
+ (error (e)
+ (list :error (format nil "Error: ~A" e)))))))
-(defun function-definitions (name)
- (flet ((loc (fn name) (safe-function-source-location fn name)))
- (append
- (cond ((and (symbolp name) (macro-function name))
- (list (list `(defmacro ,name)
- (loc (macro-function name) name))))
- ((fboundp name)
- (let ((fn (fdefinition name)))
- (typecase fn
- (generic-function
- (cons (list `(defgeneric ,name) (loc fn name))
- (method-definitions fn)))
- (t
- (list (list `(function ,name) (loc fn name))))))))
- (when (compiler-macro-function name)
- (list (list `(define-compiler-macro ,name)
- (loc (compiler-macro-function name) name)))))))
+(defun make-definition-source-location (definition-source type name)
+ (with-struct (sb-introspect::definition-source-
+ pathname form-path character-offset plist
+ file-write-date)
+ definition-source
+ (destructuring-bind (&key emacs-buffer emacs-position
+ emacs-string &allow-other-keys)
+ plist
+ (cond
+ (emacs-buffer
+ (let ((pos (if form-path
+ (with-debootstrapping
+ (source-path-string-position
+ form-path emacs-string))
+ character-offset)))
+ (make-location `(:buffer ,emacs-buffer)
+ `(:position ,(+ pos emacs-position))
+ `(:snippet ,emacs-string))))
+ ((not pathname)
+ `(:error ,(format nil "Source of ~A ~A not found"
+ (string-downcase type) name)))
+ (t
+ (let* ((namestring (namestring (translate-logical-pathname pathname)))
+ (*readtable* (guess-readtable-for-filename namestring))
+ (pos (1+ (with-debootstrapping
+ ;; Some internal functions have no source path
+ ;; or offset available, just the file (why?).
+ ;; In these cases we can at least try to open
+ ;; the right file.
+ (if form-path
+ (source-path-file-position form-path
+ pathname)
+ 0))))
+ (snippet (source-hint-snippet namestring
+ file-write-date pos)))
+ (make-location `(:file ,namestring)
+ `(:position ,pos)
+ `(:snippet ,snippet))))))))
-;;;; function -> soucre location translation
+(defun source-hint-snippet (filename write-date position)
+ (let ((source (get-source-code filename write-date)))
+ (with-input-from-string (s source)
+ (read-snippet s position))))
-;;; Here we try to find the source locations for function objects. We
-;;; have to special case functions which were compiled with C-c C-c.
-;;; For the other functions we used the toplevel form number as
-;;; returned by the sb-introspect package to find the offset in the
-;;; source file. (If the function has debug-blocks, we should search
-;;; the position of the first code-location; for some reason, that
-;;; doesn't seem to work.)
-
(defun function-source-location (function &optional name)
- "Try to find the canonical source location of FUNCTION."
(declare (type function function))
- (if (function-from-emacs-buffer-p function)
- (find-temp-function-source-location function)
- (find-function-source-location function)))
+ (let ((location (sb-introspect:find-definition-source function)))
+ (make-definition-source-location location :function name)))
(defun safe-function-source-location (fun name)
(if *debug-definition-finding*
(function-source-location fun name)
(handler-case (function-source-location fun name)
- (error (e)
+ (error (e)
(list :error (format nil "Error: ~A" e))))))
-(defun find-function-source-location (function)
- (cond #+(or) ;; doesn't work for unknown reasons
- ((function-has-start-location-p function)
- (code-location-source-location (function-start-location function)))
- ((not (function-source-filename function))
- (error "Source filename not recorded for ~A" function))
- (t
- (let* ((pos (function-source-position function))
- (snippet (function-hint-snippet function pos)))
- (make-location `(:file ,(function-source-filename function))
- `(:position ,pos)
- `(:snippet ,snippet))))))
-
-(defun function-source-position (function)
- ;; We only consider the toplevel form number here.
- (let* ((tlf (function-toplevel-form-number function))
- (filename (function-source-filename function))
- (*readtable* (guess-readtable-for-filename filename)))
- (with-debootstrapping
- (source-path-file-position (list tlf) filename))))
-
-(defun function-source-filename (function)
- (ignore-errors
- (namestring
- (truename
- (sb-introspect:definition-source-pathname
- (sb-introspect:find-definition-source function))))))
-
-(defun function-source-write-date (function)
- (definition-source-file-write-date
- (sb-introspect:find-definition-source function)))
-
-(defun function-toplevel-form-number (function)
- (car
- (sb-introspect:definition-source-form-path
- (sb-introspect:find-definition-source function))))
-
-(defun function-hint-snippet (function position)
- (let ((source (get-source-code (function-source-filename function)
- (function-source-write-date function))))
- (with-input-from-string (s source)
- (read-snippet s position))))
-
-(defun function-has-start-location-p (function)
- (ignore-errors (function-start-location function)))
-
-(defun function-start-location (function)
- (let ((dfun (sb-di:fun-debug-fun function)))
- (and dfun (sb-di:debug-fun-start-location dfun))))
-
-(defun find-temp-function-source-location (function)
- (let ((info (function-debug-source-info function)))
- (with-struct (sb-introspect::definition-source-
- form-path character-offset)
- (sb-introspect:find-definition-source function)
- (destructuring-bind (&key emacs-buffer emacs-position emacs-string) info
- (let ((pos (if form-path
- (with-debootstrapping
- (source-path-string-position
- form-path emacs-string))
- character-offset)))
- (make-location `(:buffer ,emacs-buffer)
- `(:position ,(+ pos emacs-position))
- `(:snippet ,emacs-string)))))))
-
-;; FIXME: Symbol doesn't exist in released SBCL (0.8.20) yet.
-(defun definition-source-file-write-date (def)
- (let ((sym (find-symbol "DEFINITION-SOURCE-FILE-WRITE-DATE"
- (find-package "SB-INTROSPECT"))))
- (when sym (funcall sym def))))
-
-(defun method-definitions (gf)
- (let ((methods (sb-mop:generic-function-methods gf))
- (name (sb-mop:generic-function-name gf)))
- (loop for method in methods
- collect (list `(method ,name ,(sb-pcl::unparse-specializers method))
- (method-source-location method)))))
-
-(defun method-source-location (method)
- (safe-function-source-location (or (sb-pcl::method-fast-function method)
- (sb-pcl:method-function method))
- nil))
-
-;;;;; Compiler definitions
-
-(defun compiler-definitions (name)
- (let ((fun-info (sb-int:info :function :info name)))
- (when fun-info
- (append (transform-definitions fun-info name)
- (optimizer-definitions fun-info name)))))
-
-(defun transform-definitions (fun-info name)
- (loop for xform in (sb-c::fun-info-transforms fun-info)
- for loc = (safe-function-source-location
- (sb-c::transform-function xform) name)
- for typespec = (sb-kernel:type-specifier (sb-c::transform-type xform))
- for note = (sb-c::transform-note xform)
- for spec = (if (consp typespec)
- `(sb-c:deftransform ,(second typespec) ,note)
- `(sb-c:deftransform ,note))
- collect `(,spec ,loc)))
-
-(defun optimizer-definitions (fun-info fun-name)
- (let ((otypes '((sb-c::fun-info-derive-type . sb-c:derive-type)
- (sb-c::fun-info-ltn-annotate . sb-c:ltn-annotate)
- (sb-c::fun-info-ltn-annotate . sb-c:ltn-annotate)
- (sb-c::fun-info-optimizer . sb-c:optimizer))))
- (loop for (reader . name) in otypes
- for fn = (funcall reader fun-info)
- when fn collect `((sb-c:defoptimizer ,name)
- ,(safe-function-source-location fn fun-name)))))
-
(defimplementation describe-symbol-for-emacs (symbol)
"Return a plist describing SYMBOL.
Return NIL if the symbol is unbound."
(let ((result '()))
- (labels ((doc (kind)
- (or (documentation symbol kind) :not-documented))
- (maybe-push (property value)
- (when value
- (setf result (list* property value result)))))
+ (flet ((doc (kind)
+ (or (documentation symbol kind) :not-documented))
+ (maybe-push (property value)
+ (when value
+ (setf result (list* property value result)))))
(maybe-push
:variable (multiple-value-bind (kind recorded-p)
(sb-int:info :variable :kind symbol)
(declare (ignore kind))
(if (or (boundp symbol) recorded-p)
(doc 'variable))))
+ (when (fboundp symbol)
+ (maybe-push
+ (cond ((macro-function symbol) :macro)
+ ((special-operator-p symbol) :special-operator)
+ ((typep (fdefinition symbol) 'generic-function)
+ :generic-function)
+ (t :function))
+ (doc 'function)))
(maybe-push
- :function (if (fboundp symbol)
- (doc 'function)))
- (maybe-push
:setf (if (or (sb-int:info :setf :inverse symbol)
(sb-int:info :setf :expander symbol))
(doc 'setf)))
@@ -633,12 +579,30 @@
(defimplementation list-callers (symbol)
(let ((fn (fdefinition symbol)))
- (mapcar #'function-dspec (sb-introspect:find-function-callers fn))))
+ (sanitize-xrefs
+ (mapcar #'function-dspec (sb-introspect:find-function-callers fn)))))
(defimplementation list-callees (symbol)
(let ((fn (fdefinition symbol)))
- (mapcar #'function-dspec (sb-introspect:find-function-callees fn))))
+ (sanitize-xrefs
+ (mapcar #'function-dspec (sb-introspect:find-function-callees fn)))))
+(defun sanitize-xrefs (x)
+ (remove-duplicates
+ (remove-if (lambda (f)
+ (member f (ignored-xref-function-names)))
+ x
+ :key #'car)
+ :test (lambda (a b)
+ (and (eq (first a) (first b))
+ (equal (second a) (second b))))))
+
+(defun ignored-xref-function-names ()
+ #-#.(swank-backend::sbcl-with-new-stepper-p)
+ '(nil sb-c::step-form sb-c::step-values)
+ #+#.(swank-backend::sbcl-with-new-stepper-p)
+ '(nil))
+
(defun function-dspec (fn)
"Describe where the function FN was defined.
Return a list of the form (NAME LOCATION)."
@@ -656,20 +620,51 @@
(defvar *sldb-stack-top*)
+(defimplementation install-debugger-globally (function)
+ (setq sb-ext:*invoke-debugger-hook* function))
+
+#+#.(swank-backend::sbcl-with-new-stepper-p)
+(defimplementation condition-extras (condition)
+ (when (typep condition 'sb-impl::step-form-condition)
+ `((:short-frame-source 0))))
+
(defimplementation call-with-debugging-environment (debugger-loop-fn)
(declare (type function debugger-loop-fn))
(let* ((*sldb-stack-top* (or sb-debug:*stack-top-hint* (sb-di:top-frame)))
(sb-debug:*stack-top-hint* nil))
- (handler-bind ((sb-di:debug-condition
+ (handler-bind ((sb-di:debug-condition
(lambda (condition)
(signal (make-condition
'sldb-condition
:original-condition condition)))))
(funcall debugger-loop-fn))))
+#+#.(swank-backend::sbcl-with-new-stepper-p)
+(progn
+ (defimplementation activate-stepping (frame)
+ (declare (ignore frame))
+ (sb-impl::enable-stepping))
+ (defimplementation sldb-stepper-condition-p (condition)
+ (typep condition 'sb-ext:step-form-condition))
+ (defimplementation sldb-step-into ()
+ (invoke-restart 'sb-ext:step-into))
+ (defimplementation sldb-step-next ()
+ (invoke-restart 'sb-ext:step-next))
+ (defimplementation sldb-step-out ()
+ (invoke-restart 'sb-ext:step-out)))
+
(defimplementation call-with-debugger-hook (hook fun)
- (let ((sb-ext:*invoke-debugger-hook* hook))
- (funcall fun)))
+ (let ((sb-ext:*invoke-debugger-hook* hook)
+ #+#.(swank-backend::sbcl-with-new-stepper-p)
+ (sb-ext:*stepper-hook*
+ (lambda (condition)
+ (typecase condition
+ (sb-ext:step-form-condition
+ (let ((sb-debug:*stack-top-hint* (sb-di::find-stepped-frame)))
+ (sb-impl::invoke-debugger condition)))))))
+ (handler-bind (#+#.(swank-backend::sbcl-with-new-stepper-p)
+ (sb-ext:step-condition #'sb-impl::invoke-stepper))
+ (funcall fun))))
(defun nth-frame (index)
(do ((frame *sldb-stack-top* (sb-di:frame-down frame))
@@ -687,26 +682,7 @@
collect f)))
(defimplementation print-frame (frame stream)
- (macrolet ((printer-form ()
- ;; MEGAKLUDGE: As SBCL 0.8.20.1 fixed its debug IO style
- ;; our usage of unexported interfaces came back to haunt
- ;; us. And since we still use the same interfaces it will
- ;; haunt us again.
- (let ((print-sym (find-symbol "PRINT-FRAME-CALL" :sb-debug)))
- (if (fboundp print-sym)
- (let* ((args (sb-introspect:function-arglist print-sym))
- (key-pos (position '&key args)))
- (cond ((eql 2 key-pos)
- `(,print-sym frame stream))
- ((eql 1 key-pos)
- `(let ((*standard-output* stream))
- (,print-sym frame)))
- (t
- (error "*THWAP* SBCL changes internals ~
- again!"))))
- (error "You're in a twisty little maze of unsupported
- SBCL interfaces, all different.")))))
- (printer-form)))
+ (sb-debug::print-frame-call frame stream))
;;;; Code-location -> source-location translation
@@ -717,36 +693,49 @@
;;; source-location of the corresponding function.
(defun code-location-source-location (code-location)
- (let ((dsource (sb-di:code-location-debug-source code-location)))
- (ecase (sb-di:debug-source-from dsource)
- (:file (file-source-location code-location))
- (:lisp (lisp-source-location code-location)))))
+ (let* ((dsource (sb-di:code-location-debug-source code-location))
+ (plist (sb-c::debug-source-plist dsource)))
+ (if (getf plist :emacs-buffer)
+ (emacs-buffer-source-location code-location plist)
+ (ecase (sb-di:debug-source-from dsource)
+ (:file (file-source-location code-location))
+ (:lisp (lisp-source-location code-location))))))
+;;; FIXME: The naming policy of source-location functions is a bit
+;;; fuzzy: we have FUNCTION-SOURCE-LOCATION which returns the
+;;; source-location for a function, and we also have FILE-SOURCE-LOCATION &co
+;;; which returns the source location for a _code-location_.
+;;;
+;;; Maybe these should be named code-location-file-source-location,
+;;; etc, turned into generic functions, or something. In the very
+;;; least the names should indicate the main entry point vs. helper
+;;; status.
+
(defun file-source-location (code-location)
- (cond ((code-location-has-debug-block-info-p code-location)
- (if (code-location-from-emacs-buffer-p code-location)
- (temp-file-source-location code-location)
- (source-file-source-location code-location)))
- (t
- (let ((fun (code-location-debug-fun-fun code-location)))
- (cond (fun (function-source-location fun))
- (t (error "Cannot find source location for: ~A "
- code-location)))))))
+ (if (code-location-has-debug-block-info-p code-location)
+ (source-file-source-location code-location)
+ (fallback-source-location code-location)))
+(defun fallback-source-location (code-location)
+ (let ((fun (code-location-debug-fun-fun code-location)))
+ (cond (fun (function-source-location fun))
+ (t (abort-request "Cannot find source location for: ~A " code-location)))))
+
(defun lisp-source-location (code-location)
- (let ((source (with-output-to-string (*standard-output*)
- (print-code-location-source-form code-location 100))))
+ (let ((source (prin1-to-string
+ (sb-debug::code-location-source-form code-location 100))))
(make-location `(:source-form ,source) '(:position 0))))
-(defun temp-file-source-location (code-location)
- (let ((info (code-location-debug-source-info code-location)))
- (destructuring-bind (&key emacs-buffer emacs-position emacs-string) info
- (let* ((pos (string-source-position code-location emacs-string))
- (snipped (with-input-from-string (s emacs-string)
- (read-snippet s pos))))
- (make-location `(:buffer ,emacs-buffer)
- `(:position ,(+ emacs-position pos))
- `(:snippet ,snipped))))))
+(defun emacs-buffer-source-location (code-location plist)
+ (if (code-location-has-debug-block-info-p code-location)
+ (destructuring-bind (&key emacs-buffer emacs-position emacs-string) plist
+ (let* ((pos (string-source-position code-location emacs-string))
+ (snipped (with-input-from-string (s emacs-string)
+ (read-snippet s pos))))
+ (make-location `(:buffer ,emacs-buffer)
+ `(:position ,(+ emacs-position pos))
+ `(:snippet ,snipped))))
+ (fallback-source-location code-location)))
(defun source-file-source-location (code-location)
(let* ((code-date (code-location-debug-source-created code-location))
@@ -759,38 +748,18 @@
`(:position ,(1+ pos))
`(:snippet ,snippet))))))
-(defun code-location-debug-source-info (code-location)
- (sb-c::debug-source-info (sb-di::code-location-debug-source code-location)))
-
(defun code-location-debug-source-name (code-location)
(sb-c::debug-source-name (sb-di::code-location-debug-source code-location)))
(defun code-location-debug-source-created (code-location)
- (sb-c::debug-source-created
+ (sb-c::debug-source-created
(sb-di::code-location-debug-source code-location)))
(defun code-location-debug-fun-fun (code-location)
(sb-di:debug-fun-fun (sb-di:code-location-debug-fun code-location)))
-(defun code-location-from-emacs-buffer-p (code-location)
- (info-from-emacs-buffer-p (code-location-debug-source-info code-location)))
-
-(defun function-from-emacs-buffer-p (function)
- (info-from-emacs-buffer-p (function-debug-source-info function)))
-
-(defun function-debug-source-info (function)
- (let* ((comp (sb-di::compiled-debug-fun-component
- (sb-di::fun-debug-fun function))))
- (sb-c::debug-source-info (car (sb-c::debug-info-source
- (sb-kernel:%code-debug-info comp))))))
-
-(defun info-from-emacs-buffer-p (info)
- (and info
- (consp info)
- (eq :emacs-buffer (car info))))
-
(defun code-location-has-debug-block-info-p (code-location)
- (handler-case
+ (handler-case
(progn (sb-di:code-location-debug-block code-location)
t)
(sb-di:no-debug-blocks () nil)))
@@ -814,38 +783,14 @@
;;; source-path-file-position and friends are in swank-source-path-parser
-(defun print-code-location-source-form (code-location context)
- (macrolet ((printer-form ()
- ;; KLUDGE: These are both unexported interfaces, used
- ;; by different versions of SBCL. ...sooner or later
- ;; this will change again: hopefully by then we have
- ;; figured out the interface we want to drive the
- ;; debugger with and requested it from the SBCL
- ;; folks.
- (let ((print-code-sym
- (find-symbol "PRINT-CODE-LOCATION-SOURCE-FORM"
- :sb-debug))
- (code-sym
- (find-symbol "CODE-LOCATION-SOURCE-FORM"
- :sb-debug)))
- (cond ((fboundp print-code-sym)
- `(,print-code-sym code-location context))
- ((fboundp code-sym)
- `(prin1 (,code-sym code-location context)))
- (t
- (error
- "*THWAP* SBCL changes its debugger interface ~
- again!"))))))
- (printer-form)))
-
(defun safe-source-location-for-emacs (code-location)
(if *debug-definition-finding*
(code-location-source-location code-location)
(handler-case (code-location-source-location code-location)
(error (c) (list :error (format nil "~A" c))))))
-
+
(defimplementation frame-source-location-for-emacs (index)
- (safe-source-location-for-emacs
+ (safe-source-location-for-emacs
(sb-di:frame-code-location (nth-frame index))))
(defun frame-debug-vars (frame)
@@ -877,7 +822,7 @@
(defimplementation eval-in-frame (form index)
(let ((frame (nth-frame index)))
(funcall (the function
- (sb-di:preprocess-for-eval form
+ (sb-di:preprocess-for-eval form
(sb-di:frame-code-location frame)))
frame)))
@@ -892,7 +837,14 @@
(sb-di::frame-catches frame))))
(cond (probe (throw (car probe) (eval-in-frame form index)))
(t (format nil "Cannot return from frame: ~S" frame)))))
-
+
+;; FIXME: this implementation doesn't unwind the stack before
+;; re-invoking the function, but it's better than no implementation at
+;; all.
+(defimplementation restart-frame (index)
+ (let ((frame (nth-frame index)))
+ (return-from-frame index (sb-debug::frame-call-as-list frame))))
+
;;;;; reference-conditions
(defimplementation format-sldb-condition (condition)
@@ -967,26 +919,26 @@
(:code (sb-kernel:fun-code-header o)))))
((= header sb-vm:closure-header-widetag)
(values "A closure."
- (append
+ (append
(label-value-line :function (sb-kernel:%closure-fun o))
`("Closed over values:" (:newline))
(loop for i below (1- (sb-kernel:get-closure-length o))
- append (label-value-line
+ append (label-value-line
i (sb-kernel:%closure-index-ref o i))))))
(t (call-next-method o)))))
(defmethod inspect-for-emacs ((o sb-kernel:code-component) (_ sbcl-inspector))
(declare (ignore _))
(values (format nil "~A is a code data-block." o)
- (append
- (label-value-line*
+ (append
+ (label-value-line*
(:code-size (sb-kernel:%code-code-size o))
(:entry-points (sb-kernel:%code-entry-points o))
(:debug-info (sb-kernel:%code-debug-info o))
- (:trace-table-offset (sb-kernel:code-header-ref
+ (:trace-table-offset (sb-kernel:code-header-ref
o sb-vm:code-trace-table-offset-slot)))
`("Constants:" (:newline))
- (loop for i from sb-vm:code-constants-offset
+ (loop for i from sb-vm:code-constants-offset
below (sb-kernel:get-header-data o)
append (label-value-line i (sb-kernel:code-header-ref o i)))
`("Code:" (:newline)
@@ -994,8 +946,8 @@
(cond ((sb-kernel:%code-debug-info o)
(sb-disassem:disassemble-code-component o :stream s))
(t
- (sb-disassem:disassemble-memory
- (sb-disassem::align
+ (sb-disassem:disassemble-memory
+ (sb-disassem::align
(+ (logandc2 (sb-kernel:get-lisp-obj-address o)
sb-vm:lowtag-mask)
(* sb-vm:code-constants-offset
@@ -1004,6 +956,12 @@
(ash (sb-kernel:%code-code-size o) sb-vm:word-shift)
:stream s))))))))
+(defmethod inspect-for-emacs ((o sb-ext:weak-pointer) (inspector sbcl-inspector))
+ (declare (ignore inspector))
+ (values "A weak pointer."
+ (label-value-line*
+ (:value (sb-ext:weak-pointer-value o)))))
+
(defmethod inspect-for-emacs ((o sb-kernel:fdefn) (inspector sbcl-inspector))
(declare (ignore inspector))
(values "A fdefn object."
@@ -1011,12 +969,12 @@
(:name (sb-kernel:fdefn-name o))
(:function (sb-kernel:fdefn-fun o)))))
-(defmethod inspect-for-emacs :around ((o generic-function)
+(defmethod inspect-for-emacs :around ((o generic-function)
(inspector sbcl-inspector))
(declare (ignore inspector))
(multiple-value-bind (title contents) (call-next-method)
(values title
- (append
+ (append
contents
(label-value-line*
(:pretty-arglist (sb-pcl::generic-function-pretty-arglist o))
@@ -1026,41 +984,66 @@
;;;; Multiprocessing
-#+sb-thread
+#+(and sb-thread
+ #.(cl:if (cl:find-symbol "THREAD-NAME" "SB-THREAD") '(and) '(or)))
(progn
+ (defvar *thread-id-counter* 0)
+
+ (defvar *thread-id-counter-lock*
+ (sb-thread:make-mutex :name "thread id counter lock"))
+
+ (defun next-thread-id ()
+ (sb-thread:with-mutex (*thread-id-counter-lock*)
+ (incf *thread-id-counter*)))
+
+ (defparameter *thread-id-map* (make-hash-table))
+
+ ;; This should be a thread -> id map but as weak keys are not
+ ;; supported it is id -> map instead.
+ (defvar *thread-id-map-lock*
+ (sb-thread:make-mutex :name "thread id map lock"))
+
(defimplementation spawn (fn &key name)
- (declare (ignore name))
- (sb-thread:make-thread fn))
+ (sb-thread:make-thread fn :name name))
- (defimplementation startup-multiprocessing ())
-
(defimplementation thread-id (thread)
- thread)
+ (block thread-id
+ (sb-thread:with-mutex (*thread-id-map-lock*)
+ (loop for id being the hash-key in *thread-id-map*
+ using (hash-value thread-pointer)
+ do
+ (let ((maybe-thread (sb-ext:weak-pointer-value thread-pointer)))
+ (cond ((null maybe-thread)
+ ;; the value is gc'd, remove it manually
+ (remhash id *thread-id-map*))
+ ((eq thread maybe-thread)
+ (return-from thread-id id)))))
+ ;; lazy numbering
+ (let ((id (next-thread-id)))
+ (setf (gethash id *thread-id-map*) (sb-ext:make-weak-pointer thread))
+ id))))
(defimplementation find-thread (id)
- (if (member id (all-threads))
- id))
-
+ (sb-thread:with-mutex (*thread-id-map-lock*)
+ (let ((thread-pointer (gethash id *thread-id-map*)))
+ (if thread-pointer
+ (let ((maybe-thread (sb-ext:weak-pointer-value thread-pointer)))
+ (if maybe-thread
+ maybe-thread
+ ;; the value is gc'd, remove it manually
+ (progn
+ (remhash id *thread-id-map*)
+ nil)))
+ nil))))
+
(defimplementation thread-name (thread)
- (format nil "Thread ~D" thread))
+ ;; sometimes the name is not a string (e.g. NIL)
+ (princ-to-string (sb-thread:thread-name thread)))
- (defun %thread-state-slot (thread)
- (sb-sys:without-gcing
- (sb-kernel:make-lisp-obj
- (sb-sys:sap-int
- (sb-sys:sap-ref-sap (sb-thread::thread-sap-from-id thread)
- (* sb-vm::thread-state-slot
- sb-vm::n-word-bytes))))))
-
- (defun %thread-state (thread)
- (ecase (%thread-state-slot thread)
- (0 :running)
- (1 :stopping)
- (2 :stopped)
- (3 :dead)))
-
(defimplementation thread-status (thread)
- (string (%thread-state thread)))
+ (if (sb-thread:thread-alive-p thread)
+ "RUNNING"
+ "STOPPED"))
(defimplementation make-lock (&key name)
(sb-thread:make-mutex :name name))
@@ -1069,17 +1052,19 @@
(declare (type function function))
(sb-thread:with-mutex (lock) (funcall function)))
+ (defimplementation make-recursive-lock (&key name)
+ (sb-thread:make-mutex :name name))
+
+ (defimplementation call-with-recursive-lock-held (lock function)
+ (declare (type function function))
+ (sb-thread:with-recursive-lock (lock) (funcall function)))
+
(defimplementation current-thread ()
- (sb-thread:current-thread-id))
+ sb-thread:*current-thread*)
(defimplementation all-threads ()
- (let ((pids (sb-sys:without-gcing
- (sb-thread::mapcar-threads
- (lambda (sap)
- (sb-sys:sap-ref-32 sap (* sb-vm:n-word-bytes
- sb-vm::thread-pid-slot)))))))
- (remove :dead pids :key #'%thread-state)))
-
+ (sb-thread:list-all-threads))
+
(defimplementation interrupt-thread (thread fn)
(sb-thread:interrupt-thread thread fn))
@@ -1087,13 +1072,13 @@
(sb-thread:terminate-thread thread))
(defimplementation thread-alive-p (thread)
- (ignore-errors (sb-thread:interrupt-thread thread (lambda ())) t))
+ (sb-thread:thread-alive-p thread))
(defvar *mailbox-lock* (sb-thread:make-mutex :name "mailbox lock"))
(defvar *mailboxes* (list))
(declaim (type list *mailboxes*))
- (defstruct (mailbox (:conc-name mailbox.))
+ (defstruct (mailbox (:conc-name mailbox.))
thread
(mutex (sb-thread:make-mutex))
(waitqueue (sb-thread:make-waitqueue))
@@ -1116,7 +1101,7 @@
(sb-thread:condition-broadcast (mailbox.waitqueue mbox)))))
(defimplementation receive ()
- (let* ((mbox (mailbox (sb-thread:current-thread-id)))
+ (let* ((mbox (mailbox (current-thread)))
(mutex (mailbox.mutex mbox)))
(sb-thread:with-mutex (mutex)
(loop
@@ -1125,14 +1110,41 @@
(t (sb-thread:condition-wait (mailbox.waitqueue mbox)
mutex))))))))
+
+;;; Auto-flush streams
+
+ ;; XXX race conditions
+ (defvar *auto-flush-streams* '())
+
+ (defvar *auto-flush-thread* nil)
+
+ (defimplementation make-stream-interactive (stream)
+ (setq *auto-flush-streams* (adjoin stream *auto-flush-streams*))
+ (unless *auto-flush-thread*
+ (setq *auto-flush-thread*
+ (sb-thread:make-thread #'flush-streams
+ :name "auto-flush-thread"))))
+
+ (defun flush-streams ()
+ (loop
+ (setq *auto-flush-streams*
+ (remove-if (lambda (x)
+ (not (and (open-stream-p x)
+ (output-stream-p x))))
+ *auto-flush-streams*))
+ (mapc #'finish-output *auto-flush-streams*)
+ (sleep 0.15)))
+
)
(defimplementation quit-lisp ()
#+sb-thread
(dolist (thread (remove (current-thread) (all-threads)))
- (ignore-errors (sb-thread:terminate-thread thread)))
+ (ignore-errors (sb-thread:interrupt-thread
+ thread (lambda () (sb-ext:quit :recklessly-p t)))))
(sb-ext:quit))
+
;;Trace implementations
;;In SBCL, we have:
@@ -1161,7 +1173,7 @@
(defimplementation toggle-trace (spec)
(ecase (car spec)
- ((setf)
+ ((setf)
(toggle-trace-aux spec))
((:defmethod)
(toggle-trace-aux `(sb-pcl::fast-method ,@(rest (process-fspec spec)))))
@@ -1170,3 +1182,17 @@
((:call)
(destructuring-bind (caller callee) (cdr spec)
(toggle-trace-aux callee :wherein (list (process-fspec caller)))))))
+
+;;; Weak datastructures
+
+(defimplementation make-weak-key-hash-table (&rest args)
+ #+#.(swank-backend::sbcl-with-weak-hash-tables)
+ (apply #'make-hash-table :weakness :key args)
+ #-#.(swank-backend::sbcl-with-weak-hash-tables)
+ (apply #'make-hash-table args))
+
+(defimplementation make-weak-value-hash-table (&rest args)
+ #+#.(swank-backend::sbcl-with-weak-hash-tables)
+ (apply #'make-hash-table :weakness :value args)
+ #-#.(swank-backend::sbcl-with-weak-hash-tables)
+ (apply #'make-hash-table args))
Modified: trunk/thirdparty/emacs/slime/swank-scl.lisp
===================================================================
--- trunk/thirdparty/emacs/slime/swank-scl.lisp 2006-11-30 14:00:03 UTC (rev 2091)
+++ trunk/thirdparty/emacs/slime/swank-scl.lisp 2006-11-30 16:32:54 UTC (rev 2092)
@@ -12,27 +12,11 @@
;;; swank-mop
-(import-swank-mop-symbols :clos '(:slot-definition-documentation
- :eql-specializer
- :eql-specializer-object))
+(import-swank-mop-symbols :clos '(:slot-definition-documentation))
(defun swank-mop:slot-definition-documentation (slot)
- (slot-value slot 'documentation))
+ (documentation slot t))
-(defun swank-mop:specializer-direct-methods (obj)
- (declare (ignore obj))
- nil)
-
-(deftype swank-mop:eql-specializer ()
- '(or kernel:member-type kernel:numeric-type))
-
-(defun swank-mop:eql-specializer-object (obj)
- (etypecase obj
- (kernel:numeric-type
- (kernel:type-specifier obj))
- (kernel:member-type
- (first (kernel:member-type-members obj)))))
-
;;;; TCP server
;;;
@@ -52,11 +36,25 @@
(defimplementation close-socket (socket)
(ext:close-socket (socket-fd socket)))
-(defimplementation accept-connection (socket &key external-format)
- (let ((external-format (or external-format :iso-latin-1-unix)))
- (make-socket-io-stream (ext:accept-tcp-connection socket)
- external-format)))
+(defimplementation accept-connection (socket
+ &key external-format buffering timeout)
+ (let ((external-format (or external-format :default))
+ (buffering (or buffering :full))
+ (fd (socket-fd socket)))
+ (loop
+ (let ((ready (sys:wait-until-fd-usable fd :input timeout)))
+ (unless ready
+ (error "Timeout accepting connection on socket: ~S~%" socket)))
+ (let ((new-fd (ignore-errors (ext:accept-tcp-connection fd))))
+ (when new-fd
+ (return (make-socket-io-stream new-fd external-format buffering)))))))
+(defimplementation set-stream-timeout (stream timeout)
+ (check-type timeout (or null real))
+ (if (fboundp 'ext::stream-timeout)
+ (setf (ext::stream-timeout stream) timeout)
+ (setf (slot-value (slot-value stream 'cl::stream) 'cl::timeout) timeout)))
+
;;;;; Sockets
(defun socket-fd (socket)
@@ -70,17 +68,27 @@
(let ((hostent (ext:lookup-host-entry hostname)))
(car (ext:host-entry-addr-list hostent))))
-(defun find-external-format (coding-system)
- (case coding-system
- (:iso-latin-1-unix :iso-8859-1)
- (:utf-8-unix :utf-8)
- (t coding-system)))
+(defvar *external-format-to-coding-system*
+ '((:iso-8859-1
+ "latin-1" "latin-1-unix" "iso-latin-1-unix"
+ "iso-8859-1" "iso-8859-1-unix")
+ (:utf-8 "utf-8" "utf-8-unix")
+ (:euc-jp "euc-jp" "euc-jp-unix")))
-(defun make-socket-io-stream (fd external-format)
+(defimplementation find-external-format (coding-system)
+ (car (rassoc-if (lambda (x) (member coding-system x :test #'equal))
+ *external-format-to-coding-system*)))
+
+(defun make-socket-io-stream (fd external-format buffering)
"Create a new input/output fd-stream for 'fd."
- (let ((external-format (find-external-format external-format)))
- (sys:make-fd-stream fd :input t :output t :element-type 'base-char
- :external-format external-format)))
+ (let* ((stream (sys:make-fd-stream fd :input t :output t
+ :element-type 'base-char
+ :buffering buffering
+ :external-format external-format)))
+ ;; Ignore character conversion errors. Without this the communication
+ ;; channel is prone to lockup if a character conversion error occurs.
+ (setf (cl::stream-character-conversion-error-value stream) #\?)
+ stream))
;;;; Stream handling
@@ -188,6 +196,7 @@
(dotimes (i copy)
(declare (type kernel:index i))
(setf (aref buffer (+ start i)) (aref input-buffer (+ index i))))
+ (setf (slot-value stream 'index) (+ index copy))
(incf (slot-value stream 'position) copy)
copy)
(waitp
@@ -202,7 +211,8 @@
(t
(setf (slot-value stream 'buffer) new-input)
(setf (slot-value stream 'index) 0)
- (ext:stream-read-chars stream buffer start requested waitp))))))
+ (ext:stream-read-chars stream buffer
+ start requested waitp))))))
(t
0))))
@@ -297,9 +307,11 @@
;;; usage this reduces consing. As the string grows larger then grow to
;;; reduce the cost of copying strings around.
;;;
-(defmethod ext:stream-write-chars ((stream slime-output-stream) string start end)
+(defmethod ext:stream-write-chars ((stream slime-output-stream)
+ string start end waitp)
(declare (simple-string string)
- (type kernel:index start end))
+ (type kernel:index start end)
+ (ignore waitp))
(declare (optimize (speed 3)))
(unless (ext:stream-open-p stream)
(error 'kernel:simple-stream-error
@@ -326,7 +338,7 @@
(let ((column (slot-value stream 'column)))
(declare (type kernel:index column))
(+ column (- end start))))))))
- string)
+ (- end start))
;;;
@@ -365,21 +377,17 @@
(c::warning #'handle-notification-condition))
(funcall function))))
-(defimplementation swank-compile-file (filename load-p
- &optional external-format)
- (let ((external-format (if external-format
- (find-external-format external-format)
- :default)))
- (with-compilation-hooks ()
- (let ((*buffer-name* nil)
- (ext:*ignore-extra-close-parentheses* nil))
- (multiple-value-bind (output-file warnings-p failure-p)
- (compile-file filename :external-format external-format)
- (unless failure-p
- ;; Cache the latest source file for definition-finding.
- (source-cache-get filename (file-write-date filename))
- (when load-p (load output-file)))
- (values output-file warnings-p failure-p))))))
+(defimplementation swank-compile-file (filename load-p external-format)
+ (with-compilation-hooks ()
+ (let ((*buffer-name* nil)
+ (ext:*ignore-extra-close-parentheses* nil))
+ (multiple-value-bind (output-file warnings-p failure-p)
+ (compile-file filename :external-format external-format)
+ (unless failure-p
+ ;; Cache the latest source file for definition-finding.
+ (source-cache-get filename (file-write-date filename))
+ (when load-p (load output-file)))
+ (values output-file warnings-p failure-p)))))
(defimplementation swank-compile-string (string &key buffer position directory)
(declare (ignore directory))
@@ -1158,21 +1166,17 @@
(list symbol))))
((:defined)
(ext:info :alien-type :definition symbol))
- (:unknown
- (return-from describe-definition
- (format nil "Unknown alien type: ~S" symbol))))))))
+ (:unknown :unknown))))))
;;;;; Argument lists
-(defimplementation arglist ((name symbol))
- (cond ((and (symbolp name) (macro-function name))
- (arglist (macro-function name)))
- ((fboundp name)
- (arglist (fdefinition name)))
- (t
- :not-available)))
+(defimplementation arglist (fun)
+ (etypecase fun
+ (function (function-arglist fun))
+ (symbol (function-arglist (or (macro-function fun)
+ (symbol-function fun))))))
-(defimplementation arglist ((fun function))
+(defun function-arglist (fun)
(flet ((compiled-function-arglist (x)
(let ((args (kernel:%function-arglist x)))
(if args
@@ -1418,7 +1422,7 @@
(mapcar #'car (di:frame-catches (nth-frame index))))
(defimplementation return-from-frame (index form)
- (let ((sym (find-symbol (string 'find-debug-tag-for-frame)
+ (let ((sym (find-symbol (symbol-name '#:find-debug-tag-for-frame)
:debug-internals)))
(if sym
(let* ((frame (nth-frame index))
@@ -1563,7 +1567,8 @@
(list (1st sc)))))))))
(defun mv-function-end-breakpoint-values (sigcontext)
- (let ((sym (find-symbol "FUNCTION-END-BREAKPOINT-VALUES/STANDARD" :di)))
+ (let ((sym (find-symbol (symbol-name '#:function-end-breakpoint-values/standard)
+ :debug-internals)))
(cond (sym (funcall sym sigcontext))
(t (di::get-function-end-breakpoint-values sigcontext)))))
@@ -1577,6 +1582,7 @@
(values :initarg :values :reader breakpoint.values))
(:report (lambda (c stream) (princ (breakpoint.message c) stream))))
+#+nil
(defimplementation condition-extras ((c breakpoint))
;; simply pop up the source buffer
`((:short-frame-source 0)))
@@ -1733,7 +1739,7 @@
:key #'symbol-value)))
(format t ", type: ~A" type-symbol))))))
-(defimplementation inspect-for-emacs ((o t) (inspector scl-inspector))
+(defmethod inspect-for-emacs ((o t) (inspector scl-inspector))
(cond ((di::indirect-value-cell-p o)
(values (format nil "~A is a value cell." o)
`("Value: " (:value ,(c:value-cell-ref o)))))
@@ -1743,7 +1749,8 @@
(scl-inspect o))))
(defun scl-inspect (o)
- (destructuring-bind (text labeledp . parts) (inspect::describe-parts o)
+ (destructuring-bind (text labeledp . parts)
+ (inspect::describe-parts o)
(values (format nil "~A~%" text)
(if labeledp
(loop for (label . value) in parts
@@ -1751,7 +1758,7 @@
(loop for value in parts for i from 0
append (label-value-line i value))))))
-(defmethod inspect-for-emacs :around ((o function) (inspector scl-inspector))
+(defmethod inspect-for-emacs ((o function) (inspector scl-inspector))
(declare (ignore inspector))
(let ((header (kernel:get-type o)))
(cond ((= header vm:function-header-type)
@@ -1771,7 +1778,8 @@
(append
(label-value-line "Function" (kernel:%closure-function o))
`("Environment:" (:newline))
- (loop for i from 0 below (1- (kernel:get-closure-length o))
+ (loop for i from 0 below (- (kernel:get-closure-length o)
+ (1- vm:closure-info-offset))
append (label-value-line
i (kernel:%closure-index-ref o i))))))
((eval::interpreted-function-p o)
@@ -1820,19 +1828,25 @@
(defmethod inspect-for-emacs ((o array) (inspector scl-inspector))
inspector
- (values (format nil "~A is an array." o)
- (label-value-line*
- (:header (describe-primitive-type o))
- (:rank (array-rank o))
- (:fill-pointer (kernel:%array-fill-pointer o))
- (:fill-pointer-p (kernel:%array-fill-pointer-p o))
- (:elements (kernel:%array-available-elements o))
- (:data (kernel:%array-data-vector o))
- (:displacement (kernel:%array-displacement o))
- (:displaced-p (kernel:%array-displaced-p o))
- (:dimensions (array-dimensions o)))))
+ (cond ((kernel:array-header-p o)
+ (values (format nil "~A is an array." o)
+ (label-value-line*
+ (:header (describe-primitive-type o))
+ (:rank (array-rank o))
+ (:fill-pointer (kernel:%array-fill-pointer o))
+ (:fill-pointer-p (kernel:%array-fill-pointer-p o))
+ (:elements (kernel:%array-available-elements o))
+ (:data (kernel:%array-data-vector o))
+ (:displacement (kernel:%array-displacement o))
+ (:displaced-p (kernel:%array-displaced-p o))
+ (:dimensions (array-dimensions o)))))
+ (t
+ (values (format nil "~A is an simple-array." o)
+ (label-value-line*
+ (:header (describe-primitive-type o))
+ (:length (length o)))))))
-(defmethod inspect-for-emacs ((o vector) (inspector scl-inspector))
+(defmethod inspect-for-emacs ((o simple-vector) (inspector scl-inspector))
inspector
(values (format nil "~A is a vector." o)
(append
@@ -1901,8 +1915,8 @@
;;;; Multiprocessing
-(defimplementation spawn (fn &key (name "Anonymous"))
- (thread:thread-create fn :name name))
+(defimplementation spawn (fn &key name)
+ (thread:thread-create fn :name (or name "Anonymous")))
(defvar *thread-id-counter* 0)
(defvar *thread-id-counter-lock* (thread:make-lock "Thread ID counter"))
@@ -1914,10 +1928,11 @@
(incf *thread-id-counter*)))))
(defimplementation find-thread (id)
- (thread:map-over-threads
- #'(lambda (thread)
- (when (eql (getf (thread:thread-plist thread) 'id) id)
- (return-from find-thread thread)))))
+ (block find-thread
+ (thread:map-over-threads
+ #'(lambda (thread)
+ (when (eql (getf (thread:thread-plist thread) 'id) id)
+ (return-from find-thread thread))))))
(defimplementation thread-name (thread)
(princ-to-string (thread:thread-name thread)))
@@ -1955,9 +1970,9 @@
(defvar *mailbox-lock* (thread:make-lock "Mailbox lock"))
(defstruct (mailbox)
- (lock (thread:make-lock "Thread mailbox" :type :error-check)
+ (lock (thread:make-lock "Thread mailbox" :type :error-check
+ :interruptible nil)
:type thread:error-check-lock)
- (cond-var (thread:make-cond-var "Thread mailbox") :type thread:cond-var)
(queue '() :type list))
(defun mailbox (thread)
@@ -1968,22 +1983,31 @@
(defimplementation send (thread message)
(let* ((mbox (mailbox thread))
- (lock (mailbox-lock mbox))
- (cond-var (mailbox-cond-var mbox)))
- (thread:with-lock-held (lock "Mailbox Send")
- (setf (mailbox-queue mbox) (nconc (mailbox-queue mbox) (list message)))
- (thread:cond-var-broadcast cond-var))
+ (lock (mailbox-lock mbox)))
+ (sys:without-interrupts
+ (thread:with-lock-held (lock "Mailbox Send")
+ (setf (mailbox-queue mbox) (nconc (mailbox-queue mbox)
+ (list message)))))
+ (mp:process-wakeup thread)
message))
(defimplementation receive ()
(let* ((mbox (mailbox thread:*thread*))
- (lock (mailbox-lock mbox))
- (cond-var (mailbox-cond-var mbox)))
- (thread:with-lock-held (lock "Mailbox Receive")
- (loop
- (when (mailbox-queue mbox)
- (return (pop (mailbox-queue mbox))))
- (thread:cond-var-timedwait cond-var lock 10 "Mailbox receive wait")))))
+ (lock (mailbox-lock mbox)))
+ (loop
+ (mp:process-wait-with-timeout "Mailbox read wait" 1
+ #'(lambda () (mailbox-queue mbox)))
+ (multiple-value-bind (message winp)
+ (sys:without-interrupts
+ (mp:with-lock-held (lock "Mailbox read")
+ (let ((queue (mailbox-queue mbox)))
+ (cond (queue
+ (setf (mailbox-queue mbox) (cdr queue))
+ (values (car queue) t))
+ (t
+ (values nil nil))))))
+ (when winp
+ (return message))))))
Modified: trunk/thirdparty/emacs/slime/swank-source-file-cache.lisp
===================================================================
--- trunk/thirdparty/emacs/slime/swank-source-file-cache.lisp 2006-11-30 14:00:03 UTC (rev 2091)
+++ trunk/thirdparty/emacs/slime/swank-source-file-cache.lisp 2006-11-30 16:32:54 UTC (rev 2092)
@@ -16,6 +16,9 @@
;;; whole file inside Lisp. That way we will still have the matching
;;; version even if the file is later modified on disk. If the file is
;;; later recompiled and reloaded then we replace our cache entry.
+;;;
+;;; This code has been placed in the Public Domain. All warranties
+;;; are disclaimed.
(in-package :swank-backend)
@@ -38,8 +41,10 @@
(defimplementation buffer-first-change (filename)
"Load a file into the cache when the user modifies its buffer.
This is a win if the user then saves the file and tries to M-. into it."
- (unless (source-cached-p filename)
- (ignore-errors (source-cache-get filename (file-write-date filename)))))
+ (unless (or (source-cached-p filename)
+ (not (ignore-errors (probe-file filename))))
+ (ignore-errors
+ (source-cache-get filename (file-write-date filename)))))
(defun get-source-code (filename code-date)
"Return the source code for FILENAME as written on DATE in a string.
@@ -72,7 +77,10 @@
(defun read-file (filename)
"Return the entire contents of FILENAME as a string."
- (with-open-file (s filename :direction :input)
+ (with-open-file (s filename :direction :input
+ :external-format (or (guess-external-format filename)
+ (find-external-format "latin-1")
+ :default))
(let ((string (make-string (file-length s))))
(read-sequence string s)
string)))
Modified: trunk/thirdparty/emacs/slime/swank-source-path-parser.lisp
===================================================================
--- trunk/thirdparty/emacs/slime/swank-source-path-parser.lisp 2006-11-30 14:00:03 UTC (rev 2091)
+++ trunk/thirdparty/emacs/slime/swank-source-path-parser.lisp 2006-11-30 16:32:54 UTC (rev 2092)
@@ -17,6 +17,9 @@
;;; We use a special readtable to get the positions of the subforms.
;;; The readtable stores the start and end position for each subform in
;;; hashtable for later retrieval.
+;;;
+;;; This code has been placed in the Public Domain. All warranties
+;;; are disclaimed.
;;; Taken from swank-cmucl.lisp, by Helmut Eller
@@ -53,25 +56,33 @@
(when fn
(set-macro-character char (make-source-recorder fn source-map)
term tab)))))
+ (suppress-sharp-dot tab)
tab))
-(defvar *source-map* nil
- "The hashtable table used for source position recording.")
+(defun suppress-sharp-dot (readtable)
+ (when (get-macro-character #\# readtable)
+ (let ((sharp-dot (get-dispatch-macro-character #\# #\. readtable)))
+ (set-dispatch-macro-character #\# #\. (lambda (&rest args)
+ (let ((*read-suppress* t))
+ (apply sharp-dot args))
+ (if *read-suppress*
+ (values)
+ (list (gensym "#."))))
+ readtable))))
(defun read-and-record-source-map (stream)
"Read the next object from STREAM.
Return the object together with a hashtable that maps
subexpressions of the object to stream positions."
- (let* ((*source-map* (make-hash-table :test #'eq))
- (*readtable* (make-source-recording-readtable *readtable*
- *source-map*))
+ (let* ((source-map (make-hash-table :test #'eq))
+ (*readtable* (make-source-recording-readtable *readtable* source-map))
(start (file-position stream))
(form (read stream))
(end (file-position stream)))
;; ensure that at least FORM is in the source-map
- (unless (gethash form *source-map*)
- (push (cons start end) (gethash form *source-map*)))
- (values form *source-map*)))
+ (unless (gethash form source-map)
+ (push (cons start end) (gethash form source-map)))
+ (values form source-map)))
(defun read-source-form (n stream)
"Read the Nth toplevel form number with source location recording.
@@ -79,7 +90,8 @@
(let ((*read-suppress* t))
(dotimes (i n)
(read stream)))
- (let ((*read-suppress* nil))
+ (let ((*read-suppress* nil)
+ (*read-eval* nil))
(read-and-record-source-map stream)))
(defun source-path-stream-position (path stream)
Added: trunk/thirdparty/emacs/slime/swank-version.el
===================================================================
--- trunk/thirdparty/emacs/slime/swank-version.el 2006-11-30 14:00:03 UTC (rev 2091)
+++ trunk/thirdparty/emacs/slime/swank-version.el 2006-11-30 16:32:54 UTC (rev 2092)
@@ -0,0 +1,6 @@
+;;; This is the value for *swank-wire-protocol-version*. NB: This file
+;;; will be loaded by BOTH emacs and lisp, so the syntax used must
+;;; remain compatable between the two dialects. You can assume that
+;;; cl:*package* will be bound to (find-package :SWANK).
+
+(setf *swank-wire-protocol-version* 1)
Modified: trunk/thirdparty/emacs/slime/swank.asd
===================================================================
--- trunk/thirdparty/emacs/slime/swank.asd 2006-11-30 14:00:03 UTC (rev 2091)
+++ trunk/thirdparty/emacs/slime/swank.asd 2006-11-30 16:32:54 UTC (rev 2092)
@@ -15,7 +15,14 @@
;; (PORT can be zero to mean "any available port".)
;; Then the Swank server is running on localhost:ACTUAL-PORT. You can
;; use `M-x slime-connect' to connect Emacs to it.
+;;
+;; This code has been placed in the Public Domain. All warranties
+;; are disclaimed.
(asdf:defsystem :swank
:components ((:file "swank-loader")))
+(defpackage :swank-loader)
+(defparameter swank-loader::*source-directory*
+ (asdf:component-pathname (asdf:find-system :swank)))
+
Modified: trunk/thirdparty/emacs/slime/swank.lisp
===================================================================
--- trunk/thirdparty/emacs/slime/swank.lisp 2006-11-30 14:00:03 UTC (rev 2091)
+++ trunk/thirdparty/emacs/slime/swank.lisp 2006-11-30 16:32:54 UTC (rev 2092)
@@ -1,4 +1,4 @@
-;;; -*- Mode: lisp; outline-regexp: ";;;;;*"; indent-tabs-mode: nil -*-;;;
+;;; -*- outline-regexp:";;;;;*" indent-tabs-mode:nil coding:latin-1-unix -*-
;;;
;;; This code has been placed in the Public Domain. All warranties
;;; are disclaimed.
@@ -21,11 +21,14 @@
#:ed-in-emacs
#:print-indentation-lossage
#:swank-debugger-hook
+ #:run-after-init-hook
;; These are user-configurable variables:
#:*communication-style*
+ #:*dont-close*
#:*log-events*
#:*log-output*
#:*use-dedicated-output-stream*
+ #:*dedicated-output-stream-port*
#:*configure-emacs-indentation*
#:*readtable-alist*
#:*globally-redirect-io*
@@ -53,6 +56,7 @@
(in-package :swank)
+
;;;; Top-level variables, constants, macros
(defconstant cl-package (find-package :cl)
@@ -62,11 +66,11 @@
"The KEYWORD package.")
(defvar *canonical-package-nicknames*
- '(("COMMON-LISP-USER" . "CL-USER"))
+ `((:common-lisp-user . :cl-user))
"Canonical package names to use instead of shortest name/nickname.")
(defvar *auto-abbreviate-dotted-packages* t
- "Automatically abbreviate dotted package names to their last component when T.")
+ "Abbreviate dotted package names to their last component if T.")
(defvar *swank-io-package*
(let ((package (make-package :swank-io-package :use '())))
@@ -127,7 +131,6 @@
(eval-when (:compile-toplevel :load-toplevel :execute)
(export ',name :swank))))
-(declaim (ftype (function () nil) missing-arg))
(defun missing-arg ()
"A function that the compiler knows will never to return a value.
You can use (MISSING-ARG) as the initform for defstruct slots that
@@ -135,6 +138,7 @@
include some arbitrary initial value like NIL."
(error "A required &KEY or &OPTIONAL argument was not supplied."))
+
;;;; Hooks
;;;
;;; We use Emacs-like `add-hook' and `run-hook' utilities to support
@@ -163,6 +167,13 @@
(defvar *pre-reply-hook* '()
"Hook run (without arguments) immediately before replying to an RPC.")
+(defvar *after-init-hook* '()
+ "Hook run after user init files are loaded.")
+
+(defun run-after-init-hook ()
+ (run-hook *after-init-hook*))
+
+
;;;; Connections
;;;
;;; Connection structures represent the network connections between
@@ -171,8 +182,6 @@
;;; used solely to pipe user-output to Emacs (an optimization).
;;;
-(defvar *coding-system* ':iso-latin-1-unix)
-
(defstruct (connection
(:conc-name connection.)
(:print-function print-connection))
@@ -217,9 +226,7 @@
;; The communication style used.
(communication-style nil :type (member nil :spawn :sigio :fd-handler))
;; The coding system for network streams.
- (external-format *coding-system* :type (member :iso-latin-1-unix
- :emacs-mule-unix
- :utf-8-unix)))
+ (coding-system ))
(defun print-connection (conn stream depth)
(declare (ignore depth))
@@ -248,16 +255,25 @@
"Return the value of *SWANK-STATE-STACK*."
*swank-state-stack*)
-(define-condition slime-protocol-error (error)
- ((condition :initarg :condition :reader slime-protocol-error.condition))
+;; A conditions to include backtrace information
+(define-condition swank-error (error)
+ ((condition :initarg :condition :reader swank-error.condition)
+ (backtrace :initarg :backtrace :reader swank-error.backtrace))
(:report (lambda (condition stream)
- (format stream "~A" (slime-protocol-error.condition condition)))))
+ (princ (swank-error.condition condition) stream))))
+(defun make-swank-error (condition)
+ (let ((bt (ignore-errors
+ (call-with-debugging-environment
+ (lambda ()(backtrace 0 nil))))))
+ (make-condition 'swank-error :condition condition :backtrace bt)))
+
(add-hook *new-connection-hook* 'notify-backend-of-connection)
(defun notify-backend-of-connection (connection)
(declare (ignore connection))
(emacs-connected))
+
;;;; Helper macros
(defmacro with-io-redirection ((connection) &body body)
@@ -276,10 +292,8 @@
(defun call-with-connection (connection fun)
(let ((*emacs-connection* connection))
- (catch 'slime-toplevel
- (with-io-redirection (*emacs-connection*)
- (let ((*debugger-hook* #'swank-debugger-hook))
- (funcall fun))))))
+ (with-io-redirection (*emacs-connection*)
+ (call-with-debugger-hook #'swank-debugger-hook fun))))
(defmacro without-interrupts (&body body)
`(call-without-interrupts (lambda () ,@body)))
@@ -318,35 +332,114 @@
(defvar *log-events* nil)
(defvar *log-output* *error-output*)
+(defvar *event-history* (make-array 40 :initial-element nil)
+ "A ring buffer to record events for better error messages.")
+(defvar *event-history-index* 0)
+(defvar *enable-event-history* t)
(defun log-event (format-string &rest args)
"Write a message to *terminal-io* when *log-events* is non-nil.
Useful for low level debugging."
+ (when *enable-event-history*
+ (setf (aref *event-history* *event-history-index*)
+ (format nil "~?" format-string args))
+ (setf *event-history-index*
+ (mod (1+ *event-history-index*) (length *event-history*))))
(when *log-events*
(apply #'format *log-output* format-string args)
(force-output *log-output*)))
+(defun event-history-to-list ()
+ "Return the list of events (older events first)."
+ (let ((arr *event-history*)
+ (idx *event-history-index*))
+ (concatenate 'list (subseq arr idx) (subseq arr 0 idx))))
+
+(defun dump-event-history (stream)
+ (dolist (e (event-history-to-list))
+ (dump-event e stream)))
+
+(defun dump-event (event stream)
+ (cond ((stringp event)
+ (write-string (escape-non-ascii event) stream))
+ ((null event))
+ (t (format stream "Unexpected event: ~A~%" event))))
+
+(defun escape-non-ascii (string)
+ "Return a string like STRING but with non-ascii chars escaped."
+ (cond ((ascii-string-p string) string)
+ (t (with-output-to-string (out)
+ (loop for c across string do
+ (cond ((ascii-char-p c) (write-char c out))
+ (t (format out "\\x~4,'0X" (char-code c)))))))))
+
+(defun ascii-string-p (o)
+ (and (stringp o)
+ (every #'ascii-char-p o)))
+
+(defun ascii-char-p (c)
+ (<= (char-code c) 127))
+
+(defmacro do-symbols* ((var &optional (package '*package*) result-form) &body body)
+ "Just like do-symbols, but makes sure a symbol is visited only once."
+ (let ((seen-ht (gensym "SEEN-HT")))
+ `(let ((,seen-ht (make-hash-table :test #'eq)))
+ (do-symbols (,var ,package ,result-form)
+ (unless (gethash ,var ,seen-ht)
+ (setf (gethash ,var ,seen-ht) t)
+ ,@body)))))
+
+
;;;; TCP Server
-(defvar *use-dedicated-output-stream* t)
+(defvar *use-dedicated-output-stream* nil
+ "When T swank will attempt to create a second connection to
+ Emacs which is used just to send output.")
+
+(defvar *dedicated-output-stream-port* 0
+ "Which port we should use for the dedicated output stream.")
+
(defvar *communication-style* (preferred-communication-style))
+(defvar *dont-close* nil
+ "Default value of :dont-close argument to start-server and
+ create-server.")
+
+(defvar *dedicated-output-stream-buffering*
+ (if (eq *communication-style* :spawn) :full :none)
+ "The buffering scheme that should be used for the output stream.
+Valid values are :none, :line, and :full.")
+
+(defvar *coding-system* "iso-latin-1-unix")
+
(defun start-server (port-file &key (style *communication-style*)
- dont-close (external-format *coding-system*))
+ (dont-close *dont-close*)
+ (coding-system *coding-system*))
"Start the server and write the listen port number to PORT-FILE.
This is the entry point for Emacs."
- (setup-server 0 (lambda (port) (announce-server-port port-file port))
- style dont-close external-format))
+ (flet ((start-server-aux ()
+ (setup-server 0 (lambda (port)
+ (announce-server-port port-file port))
+ style dont-close
+ (find-external-format-or-lose coding-system))))
+ (if (eq style :spawn)
+ (initialize-multiprocessing #'start-server-aux)
+ (start-server-aux))))
(defun create-server (&key (port default-server-port)
(style *communication-style*)
- dont-close (external-format *coding-system*))
+ (dont-close *dont-close*)
+ (coding-system *coding-system*))
"Start a SWANK server on PORT running in STYLE.
If DONT-CLOSE is true then the listen socket will accept multiple
connections, otherwise it will be closed after the first."
(setup-server port #'simple-announce-function style dont-close
- external-format))
+ (find-external-format-or-lose coding-system)))
+(defun find-external-format-or-lose (coding-system)
+ (or (find-external-format coding-system)
+ (error "Unsupported coding system: ~s" coding-system)))
+
(defun create-swank-server (&optional (port default-server-port)
(style *communication-style*)
(announce-fn #'simple-announce-function)
@@ -364,32 +457,42 @@
(serve-connection socket style dont-close external-format)))
(ecase style
(:spawn
- (spawn (lambda () (loop do (serve) while dont-close))
+ (spawn (lambda () (loop do (ignore-errors (serve)) while dont-close))
:name "Swank"))
((:fd-handler :sigio)
(add-fd-handler socket (lambda () (serve))))
- ((nil)
- (unwind-protect (loop do (serve) while dont-close)
- (close-socket socket))))
+ ((nil) (loop do (serve) while dont-close)))
port)))
(defun serve-connection (socket style dont-close external-format)
- (let ((client (accept-authenticated-connection
- socket :external-format external-format)))
- (unless dont-close
- (close-socket socket))
- (let ((connection (create-connection client style external-format)))
- (run-hook *new-connection-hook* connection)
- (push connection *connections*)
- (serve-requests connection))))
+ (let ((closed-socket-p nil))
+ (unwind-protect
+ (let ((client (accept-authenticated-connection
+ socket :external-format external-format)))
+ (unless dont-close
+ (close-socket socket)
+ (setf closed-socket-p t))
+ (let ((connection (create-connection client style)))
+ (run-hook *new-connection-hook* connection)
+ (push connection *connections*)
+ (serve-requests connection)))
+ (unless (or dont-close closed-socket-p)
+ (close-socket socket)))))
(defun accept-authenticated-connection (&rest args)
(let ((new (apply #'accept-connection args))
- (secret (slime-secret)))
- (when secret
- (unless (string= (decode-message new) secret)
- (close new)
- (error "Incoming connection doesn't know the password.")))
+ (success nil))
+ (unwind-protect
+ (let ((secret (slime-secret)))
+ (when secret
+ (set-stream-timeout new 20)
+ (let ((first-val (decode-message new)))
+ (unless (and (stringp first-val) (string= first-val secret))
+ (error "Incoming connection doesn't know the password."))))
+ (set-stream-timeout new nil)
+ (setf success t))
+ (unless success
+ (close new :abort t)))
new))
(defun slime-secret ()
@@ -414,7 +517,8 @@
(defun simple-announce-function (port)
(when *swank-debug-p*
- (format *debug-io* "~&;; Swank started at port: ~D.~%" port)))
+ (format *debug-io* "~&;; Swank started at port: ~D.~%" port)
+ (force-output *debug-io*)))
(defun open-streams (connection)
"Return the 4 streams for IO redirection:
@@ -440,8 +544,7 @@
stream (or NIL if none was created)."
(if *use-dedicated-output-stream*
(let ((stream (open-dedicated-output-stream
- (connection.socket-io connection)
- (connection.external-format connection))))
+ (connection.socket-io connection))))
(values (lambda (string)
(write-string string stream)
(force-output stream))
@@ -450,34 +553,47 @@
(with-connection (connection)
(with-simple-restart
(abort "Abort sending output to Emacs.")
- (send-to-emacs `(:read-output ,string)))))
+ (send-to-emacs `(:write-string ,string)))))
nil)))
-(defun open-dedicated-output-stream (socket-io external-format)
+(defun open-dedicated-output-stream (socket-io)
"Open a dedicated output connection to the Emacs on SOCKET-IO.
Return an output stream suitable for writing program output.
This is an optimized way for Lisp to deliver output to Emacs."
- (let* ((socket (create-socket *loopback-interface* 0))
- (port (local-port socket)))
- (encode-message `(:open-dedicated-output-stream ,port) socket-io)
- (accept-authenticated-connection
- socket :external-format external-format)))
+ (let ((socket (create-socket *loopback-interface*
+ *dedicated-output-stream-port*)))
+ (unwind-protect
+ (let ((port (local-port socket)))
+ (encode-message `(:open-dedicated-output-stream ,port) socket-io)
+ (let ((dedicated (accept-authenticated-connection
+ socket
+ :external-format
+ (or (ignore-errors
+ (stream-external-format socket-io))
+ :default)
+ :buffering *dedicated-output-stream-buffering*
+ :timeout 30)))
+ (close-socket socket)
+ (setf socket nil)
+ dedicated))
+ (when socket
+ (close-socket socket)))))
(defun handle-request (connection)
- "Read and process one request. The processing is done in the extend
+ "Read and process one request. The processing is done in the extent
of the toplevel restart."
(assert (null *swank-state-stack*))
- (let ((*swank-state-stack* '(:handle-request))
- (*debugger-hook* nil))
+ (let ((*swank-state-stack* '(:handle-request)))
(with-connection (connection)
- (with-simple-restart (abort "Abort handling SLIME request.")
+ (with-simple-restart (abort-request "Abort handling SLIME request.")
(read-from-emacs)))))
(defun current-socket-io ()
(connection.socket-io *emacs-connection*))
-(defun close-connection (c &optional condition)
+(defun close-connection (c &optional condition backtrace)
+ (format *debug-io* "~&;; swank:close-connection: ~A~%" condition)
(let ((cleanup (connection.cleanup c)))
(when cleanup
(funcall cleanup c)))
@@ -486,21 +602,43 @@
(close (connection.dedicated-output c)))
(setf *connections* (remove c *connections*))
(run-hook *connection-closed-hook* c)
- (when condition
- (format *debug-io* "~&;; Connection to Emacs lost.~%;; [~A]~%" condition)
+ (when (and condition (not (typep condition 'end-of-file)))
+ (finish-output *debug-io*)
+ (format *debug-io* "~&;; Event history start:~%")
+ (dump-event-history *debug-io*)
+ (format *debug-io* ";; Event history end.~%~
+ ;; Backtrace:~%~{~A~%~}~
+ ;; Connection to Emacs lost. [~%~
+ ;; condition: ~A~%~
+ ;; type: ~S~%~
+ ;; encoding: ~A style: ~S dedicated: ~S]~%"
+ backtrace
+ (escape-non-ascii (safe-condition-message condition) )
+ (type-of condition)
+ (ignore-errors (stream-external-format (connection.socket-io c)))
+ (connection.communication-style c)
+ *use-dedicated-output-stream*)
(finish-output *debug-io*)))
(defmacro with-reader-error-handler ((connection) &body body)
- `(handler-case (progn ,@body)
- (slime-protocol-error (e)
- (close-connection ,connection e))))
+ (let ((con (gensym)))
+ `(let ((,con ,connection))
+ (handler-case
+ (progn ,@body)
+ (swank-error (e)
+ (close-connection ,con
+ (swank-error.condition e)
+ (swank-error.backtrace e)))))))
-(defun simple-break ()
+(defslimefun simple-break ()
(with-simple-restart (continue "Continue from interrupt.")
- (let ((*debugger-hook* #'swank-debugger-hook))
- (invoke-debugger
- (make-condition 'simple-error
- :format-control "Interrupt from Emacs")))))
+ (call-with-debugger-hook
+ #'swank-debugger-hook
+ (lambda ()
+ (invoke-debugger
+ (make-condition 'simple-error
+ :format-control "Interrupt from Emacs")))))
+ nil)
;;;;;; Thread based communication
@@ -519,12 +657,15 @@
(defun repl-thread (connection)
(let ((thread (connection.repl-thread connection)))
- (if (thread-alive-p thread)
- thread
- (setf (connection.repl-thread connection)
- (spawn-repl-thread connection "new-repl-thread")))))
+ (when (not thread)
+ (log-event "ERROR: repl-thread is nil"))
+ (assert thread)
+ (cond ((thread-alive-p thread)
+ thread)
+ (t
+ (setf (connection.repl-thread connection)
+ (spawn-repl-thread connection "new-repl-thread"))))))
-
(defun find-worker-thread (id)
(etypecase id
((member t)
@@ -582,9 +723,8 @@
(encode-message `(,(car event) ,(thread-id thread) ,@args) socket-io))
((:read-string thread &rest args)
(encode-message `(:read-string ,(thread-id thread) ,@args) socket-io))
- ((:evaluate-in-emacs string thread &rest args)
- (encode-message `(:evaluate-in-emacs ,string ,(thread-id thread) ,@args)
- socket-io))
+ ((:y-or-n-p thread &rest args)
+ (encode-message `(:y-or-n-p ,(thread-id thread) ,@args) socket-io))
((:read-aborted thread &rest args)
(encode-message `(:read-aborted ,(thread-id thread) ,@args) socket-io))
((:emacs-return-string thread-id tag string)
@@ -593,46 +733,62 @@
(encode-message `(:eval ,(thread-id thread) ,@args) socket-io))
((:emacs-return thread-id tag value)
(send (find-thread thread-id) `(take-input ,tag ,value)))
- (((:read-output :new-package :new-features :ed :%apply :indentation-update
- :eval-no-wait)
+ (((:write-string :presentation-start :presentation-end
+ :new-package :new-features :ed :%apply :indentation-update
+ :eval-no-wait :background-message)
&rest _)
(declare (ignore _))
(encode-message event socket-io))))
(defun spawn-threads-for-connection (connection)
- (let* ((socket-io (connection.socket-io connection))
- (control-thread (spawn (lambda ()
- (let ((*debugger-hook* nil))
- (dispatch-loop socket-io connection)))
- :name "control-thread")))
- (setf (connection.control-thread connection) control-thread)
- (let ((reader-thread (spawn (lambda ()
- (let ((*debugger-hook* nil))
- (read-loop control-thread socket-io
- connection)))
- :name "reader-thread"))
- (repl-thread (spawn-repl-thread connection "repl-thread")))
- (setf (connection.reader-thread connection) reader-thread)
- (setf (connection.repl-thread connection) repl-thread)
- connection)))
+ (macrolet ((without-debugger-hook (&body body)
+ `(call-with-debugger-hook nil (lambda () ,@body))))
+ (let* ((socket-io (connection.socket-io connection))
+ (control-thread (spawn (lambda ()
+ (without-debugger-hook
+ (dispatch-loop socket-io connection)))
+ :name "control-thread")))
+ (setf (connection.control-thread connection) control-thread)
+ (let ((reader-thread (spawn (lambda ()
+ (let ((go (receive)))
+ (assert (eq go 'accept-input)))
+ (without-debugger-hook
+ (read-loop control-thread socket-io
+ connection)))
+ :name "reader-thread"))
+ (repl-thread (spawn-repl-thread connection "repl-thread")))
+ (setf (connection.repl-thread connection) repl-thread)
+ (setf (connection.reader-thread connection) reader-thread)
+ (send reader-thread 'accept-input)
+ connection))))
(defun cleanup-connection-threads (connection)
(let ((threads (list (connection.repl-thread connection)
(connection.reader-thread connection)
(connection.control-thread connection))))
(dolist (thread threads)
- (unless (equal (current-thread) thread)
+ (when (and thread
+ (thread-alive-p thread)
+ (not (equal (current-thread) thread)))
(kill-thread thread)))))
(defun repl-loop (connection)
- (with-connection (connection)
- (loop (handle-request connection))))
+ (loop (handle-request connection)))
(defun process-available-input (stream fn)
- (loop while (and (open-stream-p stream)
- (listen stream))
+ (loop while (input-available-p stream)
do (funcall fn)))
+(defun input-available-p (stream)
+ ;; return true iff we can read from STREAM without waiting or if we
+ ;; hit EOF
+ (let ((c (read-char-no-hang stream nil :eof)))
+ (cond ((not c) nil)
+ ((eq c :eof) t)
+ (t
+ (unread-char c stream)
+ t))))
+
;;;;;; Signal driven IO
(defun install-sigio-handler (connection)
@@ -660,15 +816,17 @@
(process-available-input
client (lambda () (handle-request connection)))))
((eq (car *swank-state-stack*) :read-next-form))
- (t (process-available-input client #'read-from-emacs)))))
- (setq *debugger-hook*
- (lambda (c h)
- (with-reader-error-handler (connection)
- (block debugger
- (with-connection (connection)
- (swank-debugger-hook c h)
- (return-from debugger))
- (abort)))))
+ (t
+ (process-available-input client #'read-from-emacs)))))
+ ;;;; handle sigint
+ ;;(install-debugger-globally
+ ;; (lambda (c h)
+ ;; (with-reader-error-handler (connection)
+ ;; (block debugger
+ ;; (with-connection (connection)
+ ;; (swank-debugger-hook c h)
+ ;; (return-from debugger))
+ ;; (abort)))))
(add-fd-handler client #'handler)
(handler))))
@@ -678,8 +836,12 @@
;;;;;; Simple sequential IO
(defun simple-serve-requests (connection)
- (with-reader-error-handler (connection)
- (loop (handle-request connection))))
+ (unwind-protect
+ (with-simple-restart (close-connection "Close SLIME connection")
+ (with-reader-error-handler (connection)
+ (loop
+ (handle-request connection))))
+ (close-connection connection)))
(defun read-from-socket-io ()
(let ((event (decode-message (current-socket-io))))
@@ -705,15 +867,17 @@
(encode-message o (current-socket-io)))))
(destructure-case event
(((:debug-activate :debug :debug-return :read-string :read-aborted
- :eval)
+ :y-or-n-p :eval)
thread &rest args)
(declare (ignore thread))
(send `(,(car event) 0 ,@args)))
((:return thread &rest args)
(declare (ignore thread))
(send `(:return ,@args)))
- (((:read-output :new-package :new-features :debug-condition
- :indentation-update :ed :%apply :eval-no-wait)
+ (((:write-string :new-package :new-features :debug-condition
+ :presentation-start :presentation-end
+ :indentation-update :ed :%apply :eval-no-wait
+ :background-message)
&rest _)
(declare (ignore _))
(send event)))))
@@ -726,35 +890,39 @@
(connection.user-input connection) in)
connection))
-(defun create-connection (socket-io style external-format)
- (let ((c (ecase style
- (:spawn
- (make-connection :socket-io socket-io
- :read #'read-from-control-thread
- :send #'send-to-control-thread
- :serve-requests #'spawn-threads-for-connection
- :cleanup #'cleanup-connection-threads))
- (:sigio
- (make-connection :socket-io socket-io
- :read #'read-from-socket-io
- :send #'send-to-socket-io
- :serve-requests #'install-sigio-handler
- :cleanup #'deinstall-sigio-handler))
- (:fd-handler
- (make-connection :socket-io socket-io
- :read #'read-from-socket-io
- :send #'send-to-socket-io
- :serve-requests #'install-fd-handler
- :cleanup #'deinstall-fd-handler))
- ((nil)
- (make-connection :socket-io socket-io
- :read #'read-from-socket-io
- :send #'send-to-socket-io
- :serve-requests #'simple-serve-requests)))))
- (setf (connection.communication-style c) style)
- (setf (connection.external-format c) external-format)
- (initialize-streams-for-connection c)
- c))
+(defun create-connection (socket-io style)
+ (let ((success nil))
+ (unwind-protect
+ (let ((c (ecase style
+ (:spawn
+ (make-connection :socket-io socket-io
+ :read #'read-from-control-thread
+ :send #'send-to-control-thread
+ :serve-requests #'spawn-threads-for-connection
+ :cleanup #'cleanup-connection-threads))
+ (:sigio
+ (make-connection :socket-io socket-io
+ :read #'read-from-socket-io
+ :send #'send-to-socket-io
+ :serve-requests #'install-sigio-handler
+ :cleanup #'deinstall-sigio-handler))
+ (:fd-handler
+ (make-connection :socket-io socket-io
+ :read #'read-from-socket-io
+ :send #'send-to-socket-io
+ :serve-requests #'install-fd-handler
+ :cleanup #'deinstall-fd-handler))
+ ((nil)
+ (make-connection :socket-io socket-io
+ :read #'read-from-socket-io
+ :send #'send-to-socket-io
+ :serve-requests #'simple-serve-requests)))))
+ (setf (connection.communication-style c) style)
+ (initialize-streams-for-connection c)
+ (setf success t)
+ c)
+ (unless success
+ (close socket-io :abort t)))))
;;;; IO to Emacs
@@ -784,12 +952,18 @@
(defvar *globally-redirect-io* nil
"When non-nil globally redirect all standard streams to Emacs.")
-(defmacro setup-stream-indirection (stream-var)
+;;;;; Global redirection setup
+
+(defvar *saved-global-streams* '()
+ "A plist to save and restore redirected stream objects.
+E.g. the value for '*standard-output* holds the stream object
+for *standard-output* before we install our redirection.")
+
+(defun setup-stream-indirection (stream-var &optional stream)
"Setup redirection scaffolding for a global stream variable.
Supposing (for example) STREAM-VAR is *STANDARD-INPUT*, this macro:
-1. Saves the value of *STANDARD-INPUT* in a variable called
-*REAL-STANDARD-INPUT*.
+1. Saves the value of *STANDARD-INPUT* in `*SAVED-GLOBAL-STREAMS*'.
2. Creates *CURRENT-STANDARD-INPUT*, initially with the same value as
*STANDARD-INPUT*.
@@ -801,50 +975,48 @@
effective global value for *STANDARD-INPUT*. This way we can assign
the effective global value even when *STANDARD-INPUT* is shadowed by a
dynamic binding."
- (let ((real-stream-var (prefixed-var "REAL" stream-var))
- (current-stream-var (prefixed-var "CURRENT" stream-var)))
- `(progn
- ;; Save the real stream value for the future.
- (defvar ,real-stream-var ,stream-var)
- ;; Define a new variable for the effective stream.
- ;; This can be reassigned.
- (defvar ,current-stream-var ,stream-var)
- ;; Assign the real binding as a synonym for the current one.
- (setq ,stream-var (make-synonym-stream ',current-stream-var)))))
+ (let ((current-stream-var (prefixed-var '#:current stream-var))
+ (stream (or stream (symbol-value stream-var))))
+ ;; Save the real stream value for the future.
+ (setf (getf *saved-global-streams* stream-var) stream)
+ ;; Define a new variable for the effective stream.
+ ;; This can be reassigned.
+ (proclaim `(special ,current-stream-var))
+ (set current-stream-var stream)
+ ;; Assign the real binding as a synonym for the current one.
+ (set stream-var (make-synonym-stream current-stream-var))))
-(eval-when (:compile-toplevel :load-toplevel :execute)
- (defun prefixed-var (prefix variable-symbol)
- "(PREFIXED-VAR \"FOO\" '*BAR*) => SWANK::*FOO-BAR*"
- (let ((basename (subseq (symbol-name variable-symbol) 1)))
- (intern (format nil "*~A-~A" prefix basename) :swank))))
+(defun prefixed-var (prefix variable-symbol)
+ "(PREFIXED-VAR \"FOO\" '*BAR*) => SWANK::*FOO-BAR*"
+ (let ((basename (subseq (symbol-name variable-symbol) 1)))
+ (intern (format nil "*~A-~A" (string prefix) basename) :swank)))
-;;;;; Global redirection setup
-
-(setup-stream-indirection *standard-output*)
-(setup-stream-indirection *error-output*)
-(setup-stream-indirection *trace-output*)
-(setup-stream-indirection *standard-input*)
-(setup-stream-indirection *debug-io*)
-(setup-stream-indirection *query-io*)
-(setup-stream-indirection *terminal-io*)
-
-(defparameter *standard-output-streams*
+(defvar *standard-output-streams*
'(*standard-output* *error-output* *trace-output*)
"The symbols naming standard output streams.")
-(defparameter *standard-input-streams*
+(defvar *standard-input-streams*
'(*standard-input*)
"The symbols naming standard input streams.")
-(defparameter *standard-io-streams*
+(defvar *standard-io-streams*
'(*debug-io* *query-io* *terminal-io*)
"The symbols naming standard io streams.")
+(defun init-global-stream-redirection ()
+ (when *globally-redirect-io*
+ (mapc #'setup-stream-indirection
+ (append *standard-output-streams*
+ *standard-input-streams*
+ *standard-io-streams*))))
+
+(add-hook *after-init-hook* 'init-global-stream-redirection)
+
(defun globally-redirect-io-to-connection (connection)
"Set the standard I/O streams to redirect to CONNECTION.
Assigns *CURRENT-<STREAM>* for all standard streams."
(dolist (o *standard-output-streams*)
- (set (prefixed-var "CURRENT" o)
+ (set (prefixed-var '#:current o)
(connection.user-output connection)))
;; FIXME: If we redirect standard input to Emacs then we get the
;; regular Lisp top-level trying to read from our REPL.
@@ -857,10 +1029,10 @@
;; Meanwhile we just leave *standard-input* alone.
#+NIL
(dolist (i *standard-input-streams*)
- (set (prefixed-var "CURRENT" i)
+ (set (prefixed-var '#:current i)
(connection.user-input connection)))
(dolist (io *standard-io-streams*)
- (set (prefixed-var "CURRENT" io)
+ (set (prefixed-var '#:current io)
(connection.user-io connection))))
(defun revert-global-io-redirection ()
@@ -868,8 +1040,8 @@
(dolist (stream-var (append *standard-output-streams*
*standard-input-streams*
*standard-io-streams*))
- (set (prefixed-var "CURRENT" stream-var)
- (symbol-value (prefixed-var "REAL" stream-var)))))
+ (set (prefixed-var '#:current stream-var)
+ (getf *saved-global-streams* stream-var))))
;;;;; Global redirection hooks
@@ -924,20 +1096,16 @@
(receive))
(defun decode-message (stream)
- "Read an S-expression from STREAM using the SLIME protocol.
-If a protocol error occurs then a SLIME-PROTOCOL-ERROR is signalled."
+ "Read an S-expression from STREAM using the SLIME protocol."
(let ((*swank-state-stack* (cons :read-next-form *swank-state-stack*)))
- (handler-case
- (let* ((length (decode-message-length stream))
- (string (make-string length))
- (pos (read-sequence string stream)))
- (assert (= pos length) ()
- "Short read: length=~D pos=~D" length pos)
- (let ((form (read-form string)))
- (log-event "READ: ~A~%" string)
- form))
- (serious-condition (c)
- (error (make-condition 'slime-protocol-error :condition c))))))
+ (handler-bind ((error (lambda (c) (error (make-swank-error c)))))
+ (let* ((length (decode-message-length stream))
+ (string (make-string length))
+ (pos (read-sequence string stream)))
+ (assert (= pos length) ()
+ "Short read: length=~D pos=~D" length pos)
+ (log-event "READ: ~S~%" string)
+ (read-form string)))))
(defun decode-message-length (stream)
(let ((buffer (make-string 6)))
@@ -965,12 +1133,13 @@
(defun encode-message (message stream)
(let* ((string (prin1-to-string-for-emacs message))
- (length (1+ (length string))))
+ (length (length string)))
(log-event "WRITE: ~A~%" string)
- (format stream "~6,'0x" length)
+ (let ((*print-pretty* nil))
+ (format stream "~6,'0x" length))
(write-string string stream)
- (terpri stream)
- (force-output stream)))
+ ;;(terpri stream)
+ (finish-output stream)))
(defun prin1-to-string-for-emacs (object)
(with-standard-io-syntax
@@ -982,7 +1151,7 @@
(defun force-user-output ()
(force-output (connection.user-io *emacs-connection*))
- (force-output (connection.user-output *emacs-connection*)))
+ (finish-output (connection.user-output *emacs-connection*)))
(defun clear-user-input ()
(clear-input (connection.user-input *emacs-connection*)))
@@ -1005,54 +1174,94 @@
(unless ok
(send-to-emacs `(:read-aborted ,(current-thread) ,tag)))))))
+(defun y-or-n-p-in-emacs (format-string &rest arguments)
+ "Like y-or-n-p, but ask in the Emacs minibuffer."
+ (let ((tag (incf *read-input-catch-tag*))
+ (question (apply #'format nil format-string arguments)))
+ (force-output)
+ (send-to-emacs `(:y-or-n-p ,(current-thread) ,tag ,question))
+ (catch (intern-catch-tag tag)
+ (loop (read-from-emacs)))))
+
(defslimefun take-input (tag input)
"Return the string INPUT to the continuation TAG."
(throw (intern-catch-tag tag) input))
-(defun evaluate-in-emacs (string)
- (let ((tag (incf *read-input-catch-tag*)))
- (force-output)
- (send-to-emacs `(:evaluate-in-emacs ,string ,(current-thread) ,tag))
- (let ((ok nil))
- (unwind-protect
- (prog1 (catch (intern-catch-tag tag)
- (loop (read-from-emacs)))
- (setq ok t))
- (unless ok
- (send-to-emacs `(:read-aborted ,(current-thread) ,tag)))))))
+(defun process-form-for-emacs (form)
+ "Returns a string which emacs will read as equivalent to
+FORM. FORM can contain lists, strings, characters, symbols and
+numbers.
+Characters are converted emacs' ?<char> notaion, strings are left
+as they are (except for espacing any nested \" chars, numbers are
+printed in base 10 and symbols are printed as their symbol-nome
+converted to lower case."
+ (etypecase form
+ (string (format nil "~S" form))
+ (cons (format nil "(~A . ~A)"
+ (process-form-for-emacs (car form))
+ (process-form-for-emacs (cdr form))))
+ (character (format nil "?~C" form))
+ (symbol (string-downcase (symbol-name form)))
+ (number (let ((*print-base* 10))
+ (princ-to-string form)))))
+
(defun eval-in-emacs (form &optional nowait)
"Eval FORM in Emacs."
- (destructuring-bind (fun &rest args) form
- (let ((fun (string-downcase (string fun))))
- (cond (nowait
- (send-to-emacs `(:eval-no-wait ,fun ,args)))
- (t
- (force-output)
- (let* ((tag (incf *read-input-catch-tag*)))
- (send-to-emacs `(:eval ,(current-thread) ,tag ,fun ,args))
- (receive-eval-result tag)))))))
+ (cond (nowait
+ (send-to-emacs `(:eval-no-wait ,(process-form-for-emacs form))))
+ (t
+ (force-output)
+ (let* ((tag (incf *read-input-catch-tag*))
+ (value (catch (intern-catch-tag tag)
+ (send-to-emacs
+ `(:eval ,(current-thread) ,tag
+ ,(process-form-for-emacs form)))
+ (loop (read-from-emacs)))))
+ (destructure-case value
+ ((:ok value) value)
+ ((:abort) (abort)))))))
-(defun receive-eval-result (tag)
- (let ((value (catch (intern-catch-tag tag)
- (loop (read-from-emacs)))))
- (destructure-case value
- ((:ok value) value)
- ((:abort) (abort)))))
-
+(defvar *swank-wire-protocol-version* nil
+ "The version of the swank/slime communication protocol.")
+
(defslimefun connection-info ()
- "Return a list of the form:
-\(PID IMPLEMENTATION-TYPE IMPLEMENTATION-NAME FEATURES
- COMMUNICATION-STYLE IMPLEMENTATION-VERSION MACHINE-INSTANCE)."
+ "Return a key-value list of the form:
+\(&key PID STYLE LISP-IMPLEMENTATION MACHINE FEATURES PACKAGE VERSION)
+PID: is the process-id of Lisp process (or nil, depending on the STYLE)
+STYLE: the communication style
+LISP-IMPLEMENTATION: a list (&key TYPE NAME VERSION)
+FEATURES: a list of keywords
+PACKAGE: a list (&key NAME PROMPT)
+VERSION: the protocol version"
(setq *slime-features* *features*)
- (list (getpid)
- (lisp-implementation-type)
- (lisp-implementation-type-name)
- (features-for-emacs)
- (connection.communication-style *emacs-connection*)
- (lisp-implementation-version)
- (machine-instance)))
+ `(:pid ,(getpid) :style ,(connection.communication-style *emacs-connection*)
+ :lisp-implementation (:type ,(lisp-implementation-type)
+ :name ,(lisp-implementation-type-name)
+ :version ,(lisp-implementation-version))
+ :machine (:instance ,(machine-instance)
+ :type ,(machine-type)
+ :version ,(machine-version))
+ :features ,(features-for-emacs)
+ :package (:name ,(package-name *package*)
+ :prompt ,(package-string-for-prompt *package*))
+ :version ,*swank-wire-protocol-version*))
+(defslimefun io-speed-test (&optional (n 5000) (m 1))
+ (let* ((s *standard-output*)
+ (*trace-output* (make-broadcast-stream s *log-output*)))
+ (time (progn
+ (dotimes (i n)
+ (format s "~D abcdefghijklm~%" i)
+ (when (zerop (mod n m))
+ (force-output s)))
+ (finish-output s)
+ (when *emacs-connection*
+ (eval-in-emacs '(message "done.")))))
+ (terpri *trace-output*)
+ (finish-output *trace-output*)
+ nil))
+
;;;; Reading and printing
@@ -1089,6 +1298,19 @@
(let ((*readtable* *buffer-readtable*))
(call-with-syntax-hooks fun)))))
+(defun to-string (object)
+ "Write OBJECT in the *BUFFER-PACKAGE*.
+The result may not be readable. Handles problems with PRINT-OBJECT methods
+gracefully."
+ (with-buffer-syntax ()
+ (let ((*print-readably* nil))
+ (handler-case
+ (prin1-to-string object)
+ (error ()
+ (with-output-to-string (s)
+ (print-unreadable-object (object s :type t :identity t)
+ (princ "<<error printing object>>" s))))))))
+
(defun from-string (string)
"Read string in the *BUFFER-PACKAGE*"
(with-buffer-syntax ()
@@ -1104,28 +1326,55 @@
(internp (search "::" string)))
(values symbol package internp)))
-;; FIXME: Escape chars are ignored
-(defun casify (string)
- "Convert string accoring to readtable-case."
+(defun tokenize-symbol-thoroughly (string)
+ "This version of tokenize-symbol handles escape characters."
+ (let ((package nil)
+ (token (make-array (length string) :element-type 'character
+ :fill-pointer 0))
+ (backslash nil)
+ (vertical nil)
+ (internp nil))
+ (loop for char across string
+ do (cond
+ (backslash
+ (vector-push-extend char token)
+ (setq backslash nil))
+ ((char= char #\\) ; Quotes next character, even within |...|
+ (setq backslash t))
+ ((char= char #\|)
+ (setq vertical t))
+ (vertical
+ (vector-push-extend char token))
+ ((char= char #\:)
+ (if package
+ (setq internp t)
+ (setq package token
+ token (make-array (length string)
+ :element-type 'character
+ :fill-pointer 0))))
+ (t
+ (vector-push-extend (casify-char char) token))))
+ (values token package internp)))
+
+(defun casify-char (char)
+ "Convert CHAR accoring to readtable-case."
(ecase (readtable-case *readtable*)
- (:preserve string)
- (:upcase (string-upcase string))
- (:downcase (string-downcase string))
- (:invert (multiple-value-bind (lower upper) (determine-case string)
- (cond ((and lower upper) string)
- (lower (string-upcase string))
- (upper (string-downcase string))
- (t string))))))
+ (:preserve char)
+ (:upcase (char-upcase char))
+ (:downcase (char-downcase char))
+ (:invert (if (upper-case-p char)
+ (char-downcase char)
+ (char-upcase char)))))
(defun parse-symbol (string &optional (package *package*))
"Find the symbol named STRING.
Return the symbol and a flag indicating whether the symbols was found."
- (multiple-value-bind (sname pname) (tokenize-symbol string)
+ (multiple-value-bind (sname pname) (tokenize-symbol-thoroughly string)
(let ((package (cond ((string= pname "") keyword-package)
- (pname (find-package (casify pname)))
+ (pname (find-package pname))
(t package))))
(if package
- (find-symbol (casify sname) package)
+ (find-symbol sname package)
(values nil nil)))))
(defun parse-symbol-or-lose (string &optional (package *package*))
@@ -1141,17 +1390,14 @@
(multiple-value-bind (name pos)
(if (zerop (length string))
(values :|| 0)
- (let ((*package* keyword-package))
+ (let ((*package* *swank-io-package*))
(ignore-errors (read-from-string string))))
- (if (and (or (keywordp name) (stringp name))
- (= (length string) pos))
- (find-package name))))
+ (and name
+ (or (symbolp name)
+ (stringp name))
+ (= (length string) pos)
+ (find-package name))))
-(defun to-string (string)
- "Write string in the *BUFFER-PACKAGE*."
- (with-buffer-syntax ()
- (prin1-to-string string)))
-
(defun guess-package-from-string (name &optional (default-package *package*))
(or (and name
(or (parse-package name)
@@ -1184,38 +1430,54 @@
;;;; Arglists
-(defslimefun arglist-for-echo-area (names)
+(defun find-valid-operator-name (names)
+ "As a secondary result, returns its index."
+ (let ((index
+ (position-if (lambda (name)
+ (or (consp name)
+ (valid-operator-name-p name)))
+ names)))
+ (if index
+ (values (elt names index) index)
+ (values nil nil))))
+
+(defslimefun arglist-for-echo-area (names &key print-right-margin
+ print-lines arg-indices)
"Return the arglist for the first function, macro, or special-op in NAMES."
(handler-case
(with-buffer-syntax ()
- (let ((name (find-if #'valid-operator-name-p names)))
- (if name (format-arglist-for-echo-area (parse-symbol name) name))))
+ (multiple-value-bind (name which)
+ (find-valid-operator-name names)
+ (when which
+ (let ((arg-index (and arg-indices (elt arg-indices which))))
+ (multiple-value-bind (form operator-name)
+ (operator-designator-to-form name)
+ (let ((*print-right-margin* print-right-margin))
+ (format-arglist-for-echo-area
+ form operator-name
+ :print-right-margin print-right-margin
+ :print-lines print-lines
+ :highlight (and arg-index
+ (not (zerop arg-index))
+ ;; don't highlight the operator
+ arg-index))))))))
(error (cond)
(format nil "ARGLIST: ~A" cond))))
-(defun format-arglist-for-echo-area (symbol name)
- "Return SYMBOL's arglist as string for display in the echo area.
-Use the string NAME as operator name."
- (let ((arglist (arglist symbol)))
- (etypecase arglist
- ((member :not-available)
- nil)
- (list
- (let ((enriched-arglist
- (if (extra-keywords symbol)
- ;; When there are extra keywords, we decode the
- ;; arglist, merge in the keywords and encode it
- ;; again.
- (let ((decoded-arglist (decode-arglist arglist)))
- (enrich-decoded-arglist-with-extra-keywords
- decoded-arglist (list symbol))
- (encode-arglist decoded-arglist))
- ;; Otherwise, just use the original arglist.
- ;; This works better for implementation-specific
- ;; lambda-list-keywords like CMUCL's &parse-body.
- arglist)))
- (arglist-to-string (cons name enriched-arglist)
- (symbol-package symbol)))))))
+(defun operator-designator-to-form (name)
+ (etypecase name
+ (cons
+ (destructure-case name
+ ((:make-instance class-name operator-name &rest args)
+ (let ((parsed-operator-name (parse-symbol operator-name)))
+ (values `(,parsed-operator-name ,@args ',(parse-symbol class-name))
+ operator-name)))
+ ((:defmethod generic-name)
+ (values `(defmethod ,(parse-symbol generic-name))
+ 'defmethod))))
+ (string
+ (values `(,(parse-symbol name))
+ name))))
(defun clean-arglist (arglist)
"Remove &whole, &enviroment, and &aux elements from ARGLIST."
@@ -1226,47 +1488,115 @@
'())
(t (cons (car arglist) (clean-arglist (cdr arglist))))))
-(defun arglist-to-string (arglist package)
- "Print the list ARGLIST for display in the echo area.
-The argument name are printed without package qualifiers and
-pretty printing of (function foo) as #'foo is suppressed."
- (setq arglist (clean-arglist arglist))
- (etypecase arglist
- (null "()")
- (cons
- (with-output-to-string (*standard-output*)
- (with-standard-io-syntax
- (let ((*package* package) (*print-case* :downcase)
- (*print-pretty* t) (*print-circle* nil) (*print-readably* nil)
- (*print-level* 10) (*print-length* 20))
- (pprint-logical-block (nil nil :prefix "(" :suffix ")")
- (loop
- (let ((arg (pop arglist)))
- (etypecase arg
- (symbol (princ arg))
- (string (princ arg))
- (cons (pprint-logical-block (nil nil :prefix "(" :suffix ")")
- (princ (car arg))
- (unless (null (cdr arg))
- (write-char #\space))
- (pprint-fill *standard-output* (cdr arg) nil))))
- (when (null arglist) (return))
- (write-char #\space)
- (pprint-newline :fill))))))))))
+(defstruct (arglist (:conc-name arglist.) (:predicate arglist-p))
+ provided-args ; list of the provided actual arguments
+ required-args ; list of the required arguments
+ optional-args ; list of the optional arguments
+ key-p ; whether &key appeared
+ keyword-args ; list of the keywords
+ rest ; name of the &rest or &body argument (if any)
+ body-p ; whether the rest argument is a &body
+ allow-other-keys-p ; whether &allow-other-keys appeared
+ aux-args ; list of &aux variables
+ known-junk ; &whole, &environment
+ unknown-junk) ; unparsed stuff
-(defun test-print-arglist (list string)
- (string= (arglist-to-string list (find-package :swank)) string))
+(defun print-arglist (arglist &key operator highlight)
+ (let ((index 0)
+ (need-space nil))
+ (labels ((print-arg (arg)
+ (typecase arg
+ (arglist ; destructuring pattern
+ (print-arglist arg))
+ (optional-arg
+ (princ (encode-optional-arg arg)))
+ (keyword-arg
+ (let ((enc-arg (encode-keyword-arg arg)))
+ (etypecase enc-arg
+ (symbol (princ enc-arg))
+ ((cons symbol)
+ (pprint-logical-block (nil nil :prefix "(" :suffix ")")
+ (princ (car enc-arg))
+ (write-char #\space)
+ (pprint-fill *standard-output* (cdr enc-arg) nil)))
+ ((cons cons)
+ (pprint-logical-block (nil nil :prefix "(" :suffix ")")
+ (pprint-logical-block (nil nil :prefix "(" :suffix ")")
+ (prin1 (caar enc-arg))
+ (write-char #\space)
+ (print-arg (keyword-arg.arg-name arg)))
+ (unless (null (cdr enc-arg))
+ (write-char #\space))
+ (pprint-fill *standard-output* (cdr enc-arg) nil))))))
+ (t ; required formal or provided actual arg
+ (princ arg))))
+ (print-space ()
+ (ecase need-space
+ ((nil))
+ ((:miser)
+ (write-char #\space)
+ (pprint-newline :miser))
+ ((t)
+ (write-char #\space)
+ (pprint-newline :fill)))
+ (setq need-space t))
+ (print-with-space (obj)
+ (print-space)
+ (print-arg obj))
+ (print-with-highlight (arg &optional (index-ok-p #'=))
+ (print-space)
+ (cond
+ ((and highlight (funcall index-ok-p index highlight))
+ (princ "===> ")
+ (print-arg arg)
+ (princ " <==="))
+ (t
+ (print-arg arg)))
+ (incf index)))
+ (pprint-logical-block (nil nil :prefix "(" :suffix ")")
+ (when operator
+ (print-with-highlight operator)
+ (setq need-space :miser))
+ (mapc #'print-with-highlight
+ (arglist.provided-args arglist))
+ (mapc #'print-with-highlight
+ (arglist.required-args arglist))
+ (when (arglist.optional-args arglist)
+ (print-with-space '&optional)
+ (mapc #'print-with-highlight
+ (arglist.optional-args arglist)))
+ (when (arglist.key-p arglist)
+ (print-with-space '&key)
+ (mapc #'print-with-space
+ (arglist.keyword-args arglist)))
+ (when (arglist.allow-other-keys-p arglist)
+ (print-with-space '&allow-other-keys))
+ (cond ((not (arglist.rest arglist)))
+ ((arglist.body-p arglist)
+ (print-with-space '&body)
+ (print-with-highlight (arglist.rest arglist) #'<=))
+ (t
+ (print-with-space '&rest)
+ (print-with-highlight (arglist.rest arglist) #'<=)))
+ (mapc #'print-with-space
+ (arglist.unknown-junk arglist))))))
-;; Should work:
-(progn
- (assert (test-print-arglist '(function cons) "(function cons)"))
- (assert (test-print-arglist '(quote cons) "(quote cons)"))
- (assert (test-print-arglist '(&key (function #'+)) "(&key (function #'+))"))
- (assert (test-print-arglist '(&whole x y z) "(y z)"))
- (assert (test-print-arglist '(x &aux y z) "(x)"))
- (assert (test-print-arglist '(x &environment env y) "(x y)")))
-;; Expected failure:
-;; (assert (test-print-arglist '(&key ((function f))) "(&key ((function f)))"))
+(defun decoded-arglist-to-string (arglist package
+ &key operator print-right-margin
+ print-lines highlight)
+ "Print the decoded ARGLIST for display in the echo area. The
+argument name are printed without package qualifiers and pretty
+printing of (function foo) as #'foo is suppressed. If HIGHLIGHT is
+non-nil, it must be the index of an argument; highlight this argument.
+If OPERATOR is non-nil, put it in front of the arglist."
+ (with-output-to-string (*standard-output*)
+ (with-standard-io-syntax
+ (let ((*package* package) (*print-case* :downcase)
+ (*print-pretty* t) (*print-circle* nil) (*print-readably* nil)
+ (*print-level* 10) (*print-length* 20)
+ (*print-right-margin* print-right-margin)
+ (*print-lines* print-lines))
+ (print-arglist arglist :operator operator :highlight highlight)))))
(defslimefun variable-desc-for-echo-area (variable-name)
"Return a short description of VARIABLE-NAME, or NIL."
@@ -1277,6 +1607,17 @@
(*print-length* 10) (*print-circle* t))
(format nil "~A => ~A" sym (symbol-value sym)))))))
+(defun decode-required-arg (arg)
+ "ARG can be a symbol or a destructuring pattern."
+ (etypecase arg
+ (symbol arg)
+ (list (decode-arglist arg))))
+
+(defun encode-required-arg (arg)
+ (etypecase arg
+ (symbol arg)
+ (arglist (encode-arglist arg))))
+
(defstruct (keyword-arg
(:conc-name keyword-arg.)
(:constructor make-keyword-arg (keyword arg-name default-arg)))
@@ -1294,29 +1635,40 @@
((and (consp arg)
(consp (car arg)))
(make-keyword-arg (caar arg)
- (cadar arg)
+ (decode-required-arg (cadar arg))
(cadr arg)))
((consp arg)
(make-keyword-arg (intern (symbol-name (car arg)) keyword-package)
(car arg)
(cadr arg)))
(t
- (error "Bad keyword item of formal argument list"))))
+ (abort-request "Bad keyword item of formal argument list"))))
(defun encode-keyword-arg (arg)
- (if (eql (intern (symbol-name (keyword-arg.arg-name arg))
- keyword-package)
- (keyword-arg.keyword arg))
- (if (keyword-arg.default-arg arg)
- (list (keyword-arg.arg-name arg)
- (keyword-arg.default-arg arg))
- (keyword-arg.arg-name arg))
- (let ((keyword/name (list (keyword-arg.arg-name arg)
- (keyword-arg.keyword arg))))
- (if (keyword-arg.default-arg arg)
- (list keyword/name
- (keyword-arg.default-arg arg))
- (list keyword/name)))))
+ (cond
+ ((arglist-p (keyword-arg.arg-name arg))
+ ;; Destructuring pattern
+ (let ((keyword/name (list (keyword-arg.keyword arg)
+ (encode-required-arg
+ (keyword-arg.arg-name arg)))))
+ (if (keyword-arg.default-arg arg)
+ (list keyword/name
+ (keyword-arg.default-arg arg))
+ (list keyword/name))))
+ ((eql (intern (symbol-name (keyword-arg.arg-name arg))
+ keyword-package)
+ (keyword-arg.keyword arg))
+ (if (keyword-arg.default-arg arg)
+ (list (keyword-arg.arg-name arg)
+ (keyword-arg.default-arg arg))
+ (keyword-arg.arg-name arg)))
+ (t
+ (let ((keyword/name (list (keyword-arg.keyword arg)
+ (keyword-arg.arg-name arg))))
+ (if (keyword-arg.default-arg arg)
+ (list keyword/name
+ (keyword-arg.default-arg arg))
+ (list keyword/name))))))
(progn
(assert (equalp (decode-keyword-arg 'x)
@@ -1339,11 +1691,14 @@
Return an OPTIONAL-ARG structure."
(etypecase arg
(symbol (make-optional-arg arg nil))
- (list (make-optional-arg (car arg) (cadr arg)))))
+ (list (make-optional-arg (decode-required-arg (car arg))
+ (cadr arg)))))
(defun encode-optional-arg (optional-arg)
- (if (optional-arg.default-arg optional-arg)
- (list (optional-arg.arg-name optional-arg)
+ (if (or (optional-arg.default-arg optional-arg)
+ (arglist-p (optional-arg.arg-name optional-arg)))
+ (list (encode-required-arg
+ (optional-arg.arg-name optional-arg))
(optional-arg.default-arg optional-arg))
(optional-arg.arg-name optional-arg)))
@@ -1353,14 +1708,7 @@
(assert (equalp (decode-optional-arg '(x t))
(make-optional-arg 'x t))))
-(defstruct (arglist (:conc-name arglist.))
- required-args ; list of the required arguments
- optional-args ; list of the optional arguments
- key-p ; whether &key appeared
- keyword-args ; list of the keywords
- rest ; name of the &rest or &body argument (if any)
- body-p ; whether the rest argument is a &body
- allow-other-keys-p) ; whether &allow-other-keys appeared
+(define-modify-macro nreversef () nreverse "Reverse the list in PLACE.")
(defun decode-arglist (arglist)
"Parse the list ARGLIST and return an ARGLIST structure."
@@ -1368,15 +1716,25 @@
(result (make-arglist)))
(dolist (arg arglist)
(cond
+ ((eql mode '&unknown-junk)
+ ;; don't leave this mode -- we don't know how the arglist
+ ;; after unknown lambda-list keywords is interpreted
+ (push arg (arglist.unknown-junk result)))
((eql arg '&allow-other-keys)
(setf (arglist.allow-other-keys-p result) t))
((eql arg '&key)
(setf (arglist.key-p result) t
mode arg))
+ ((member arg '(&optional &rest &body &aux))
+ (setq mode arg))
+ ((member arg '(&whole &environment))
+ (setq mode arg)
+ (push arg (arglist.known-junk result)))
((member arg lambda-list-keywords)
- (setq mode arg))
+ (setq mode '&unknown-junk)
+ (push arg (arglist.unknown-junk result)))
(t
- (case mode
+ (ecase mode
(&key
(push (decode-keyword-arg arg)
(arglist.keyword-args result)))
@@ -1388,20 +1746,25 @@
(arglist.rest result) arg))
(&rest
(setf (arglist.rest result) arg))
+ (&aux
+ (push (decode-optional-arg arg)
+ (arglist.aux-args result)))
((nil)
- (push arg (arglist.required-args result)))
+ (push (decode-required-arg arg)
+ (arglist.required-args result)))
((&whole &environment)
- (setf mode nil))))))
- (setf (arglist.required-args result)
- (nreverse (arglist.required-args result)))
- (setf (arglist.optional-args result)
- (nreverse (arglist.optional-args result)))
- (setf (arglist.keyword-args result)
- (nreverse (arglist.keyword-args result)))
+ (setf mode nil)
+ (push arg (arglist.known-junk result)))))))
+ (nreversef (arglist.required-args result))
+ (nreversef (arglist.optional-args result))
+ (nreversef (arglist.keyword-args result))
+ (nreversef (arglist.aux-args result))
+ (nreversef (arglist.known-junk result))
+ (nreversef (arglist.unknown-junk result))
result))
(defun encode-arglist (decoded-arglist)
- (append (arglist.required-args decoded-arglist)
+ (append (mapcar #'encode-required-arg (arglist.required-args decoded-arglist))
(when (arglist.optional-args decoded-arglist)
'(&optional))
(mapcar #'encode-optional-arg (arglist.optional-args decoded-arglist))
@@ -1415,7 +1778,11 @@
((arglist.body-p decoded-arglist)
`(&body ,(arglist.rest decoded-arglist)))
(t
- `(&rest ,(arglist.rest decoded-arglist))))))
+ `(&rest ,(arglist.rest decoded-arglist))))
+ (when (arglist.aux-args decoded-arglist)
+ `(&aux ,(arglist.aux-args decoded-arglist)))
+ (arglist.known-junk decoded-arglist)
+ (arglist.unknown-junk decoded-arglist)))
(defun arglist-keywords (arglist)
"Return the list of keywords in ARGLIST.
@@ -1444,61 +1811,73 @@
(methods-keywords
(swank-mop:generic-function-methods generic-function)))
-(defun applicable-methods-keywords (generic-function classes)
+(defun applicable-methods-keywords (generic-function arguments)
"Collect all keywords in the methods of GENERIC-FUNCTION that are
applicable for argument of CLASSES. As a secondary value, return
whether &allow-other-keys appears somewhere."
- (methods-keywords
- (swank-mop:compute-applicable-methods-using-classes
- generic-function classes)))
+ (methods-keywords
+ (multiple-value-bind (amuc okp)
+ (swank-mop:compute-applicable-methods-using-classes
+ generic-function (mapcar #'class-of arguments))
+ (if okp
+ amuc
+ (compute-applicable-methods generic-function arguments)))))
-(defun arglist-to-template-string (arglist package)
- "Print the list ARGLIST for insertion as a template for a function call."
- (decoded-arglist-to-template-string
- (decode-arglist arglist) package))
-
(defun decoded-arglist-to-template-string (decoded-arglist package &key (prefix "(") (suffix ")"))
(with-output-to-string (*standard-output*)
(with-standard-io-syntax
(let ((*package* package) (*print-case* :downcase)
(*print-pretty* t) (*print-circle* nil) (*print-readably* nil)
(*print-level* 10) (*print-length* 20))
- (pprint-logical-block (nil nil :prefix prefix :suffix suffix)
- (print-decoded-arglist-as-template decoded-arglist))))))
+ (print-decoded-arglist-as-template decoded-arglist
+ :prefix prefix
+ :suffix suffix)))))
-(defun print-decoded-arglist-as-template (decoded-arglist)
- (let ((first-p t))
- (flet ((space ()
- (unless first-p
- (write-char #\space)
- (pprint-newline :fill))
- (setq first-p nil)))
- (dolist (arg (arglist.required-args decoded-arglist))
- (space)
- (princ arg))
- (dolist (arg (arglist.optional-args decoded-arglist))
- (space)
- (format t "[~A]" (optional-arg.arg-name arg)))
- (dolist (keyword-arg (arglist.keyword-args decoded-arglist))
- (space)
- (let ((arg-name (keyword-arg.arg-name keyword-arg))
- (keyword (keyword-arg.keyword keyword-arg)))
- (format t "~W ~A"
- (if (keywordp keyword) keyword `',keyword)
- arg-name)))
- (when (and (arglist.rest decoded-arglist)
- (or (not (arglist.keyword-args decoded-arglist))
- (arglist.allow-other-keys-p decoded-arglist)))
- (if (arglist.body-p decoded-arglist)
- (pprint-newline :mandatory)
- (space))
- (format t "~A..." (arglist.rest decoded-arglist)))))
- (pprint-newline :fill))
+(defun print-decoded-arglist-as-template (decoded-arglist &key
+ (prefix "(") (suffix ")"))
+ (pprint-logical-block (nil nil :prefix prefix :suffix suffix)
+ (let ((first-p t))
+ (flet ((space ()
+ (unless first-p
+ (write-char #\space)
+ (pprint-newline :fill))
+ (setq first-p nil))
+ (print-arg-or-pattern (arg)
+ (etypecase arg
+ (symbol (princ arg))
+ (string (princ arg))
+ (list (princ arg))
+ (arglist (print-decoded-arglist-as-template arg)))))
+ (dolist (arg (arglist.required-args decoded-arglist))
+ (space)
+ (print-arg-or-pattern arg))
+ (dolist (arg (arglist.optional-args decoded-arglist))
+ (space)
+ (princ "[")
+ (print-arg-or-pattern (optional-arg.arg-name arg))
+ (princ "]"))
+ (dolist (keyword-arg (arglist.keyword-args decoded-arglist))
+ (space)
+ (let ((arg-name (keyword-arg.arg-name keyword-arg))
+ (keyword (keyword-arg.keyword keyword-arg)))
+ (format t "~W "
+ (if (keywordp keyword) keyword `',keyword))
+ (print-arg-or-pattern arg-name)))
+ (when (and (arglist.rest decoded-arglist)
+ (or (not (arglist.keyword-args decoded-arglist))
+ (arglist.allow-other-keys-p decoded-arglist)))
+ (if (arglist.body-p decoded-arglist)
+ (pprint-newline :mandatory)
+ (space))
+ (format t "~A..." (arglist.rest decoded-arglist)))))
+ (pprint-newline :fill)))
(defgeneric extra-keywords (operator &rest args)
(:documentation "Return a list of extra keywords of OPERATOR (a
-symbol) when applied to the (unevaluated) ARGS. As a secondary value,
-return whether other keys are allowed."))
+symbol) when applied to the (unevaluated) ARGS.
+As a secondary value, return whether other keys are allowed.
+As a tertiary value, return the initial sublist of ARGS that was needed
+to determine the extra keywords."))
(defmethod extra-keywords (operator &rest args)
;; default method
@@ -1508,76 +1887,240 @@
(generic-function-keywords symbol-function)
nil)))
+(defun class-from-class-name-form (class-name-form)
+ (when (and (listp class-name-form)
+ (= (length class-name-form) 2)
+ (eq (car class-name-form) 'quote))
+ (let* ((class-name (cadr class-name-form))
+ (class (find-class class-name nil)))
+ (when (and class
+ (not (swank-mop:class-finalized-p class)))
+ ;; Try to finalize the class, which can fail if
+ ;; superclasses are not defined yet
+ (handler-case (swank-mop:finalize-inheritance class)
+ (program-error (c)
+ (declare (ignore c)))))
+ class)))
+
+(defun extra-keywords/slots (class)
+ (multiple-value-bind (slots allow-other-keys-p)
+ (if (swank-mop:class-finalized-p class)
+ (values (swank-mop:class-slots class) nil)
+ (values (swank-mop:class-direct-slots class) t))
+ (let ((slot-init-keywords
+ (loop for slot in slots append
+ (mapcar (lambda (initarg)
+ (make-keyword-arg
+ initarg
+ (swank-mop:slot-definition-name slot)
+ (swank-mop:slot-definition-initform slot)))
+ (swank-mop:slot-definition-initargs slot)))))
+ (values slot-init-keywords allow-other-keys-p))))
+
+(defun extra-keywords/make-instance (operator &rest args)
+ (declare (ignore operator))
+ (unless (null args)
+ (let* ((class-name-form (car args))
+ (class (class-from-class-name-form class-name-form)))
+ (when class
+ (multiple-value-bind (slot-init-keywords class-aokp)
+ (extra-keywords/slots class)
+ (multiple-value-bind (allocate-instance-keywords ai-aokp)
+ (applicable-methods-keywords
+ #'allocate-instance (list class))
+ (multiple-value-bind (initialize-instance-keywords ii-aokp)
+ (applicable-methods-keywords
+ #'initialize-instance (list (swank-mop:class-prototype class)))
+ (multiple-value-bind (shared-initialize-keywords si-aokp)
+ (applicable-methods-keywords
+ #'shared-initialize (list (swank-mop:class-prototype class) t))
+ (values (append slot-init-keywords
+ allocate-instance-keywords
+ initialize-instance-keywords
+ shared-initialize-keywords)
+ (or class-aokp ai-aokp ii-aokp si-aokp)
+ (list class-name-form))))))))))
+
+(defun extra-keywords/change-class (operator &rest args)
+ (declare (ignore operator))
+ (unless (null args)
+ (let* ((class-name-form (car args))
+ (class (class-from-class-name-form class-name-form)))
+ (when class
+ (multiple-value-bind (slot-init-keywords class-aokp)
+ (extra-keywords/slots class)
+ (declare (ignore class-aokp))
+ (multiple-value-bind (shared-initialize-keywords si-aokp)
+ (applicable-methods-keywords
+ #'shared-initialize (list (swank-mop:class-prototype class) t))
+ ;; FIXME: much as it would be nice to include the
+ ;; applicable keywords from
+ ;; UPDATE-INSTANCE-FOR-DIFFERENT-CLASS, I don't really see
+ ;; how to do it: so we punt, always declaring
+ ;; &ALLOW-OTHER-KEYS.
+ (declare (ignore si-aokp))
+ (values (append slot-init-keywords shared-initialize-keywords)
+ t
+ (list class-name-form))))))))
+
+(defmacro multiple-value-or (&rest forms)
+ (if (null forms)
+ nil
+ (let ((first (first forms))
+ (rest (rest forms)))
+ `(let* ((values (multiple-value-list ,first))
+ (primary-value (first values)))
+ (if primary-value
+ (values-list values)
+ (multiple-value-or ,@rest))))))
+
(defmethod extra-keywords ((operator (eql 'make-instance))
&rest args)
- (unless (null args)
- (let ((class-name-form (car args)))
- (when (and (listp class-name-form)
- (= (length class-name-form) 2)
- (eq (car class-name-form) 'quote))
- (let* ((class-name (cadr class-name-form))
- (class (find-class class-name nil)))
- (unless (swank-mop:class-finalized-p class)
- ;; Try to finalize the class, which can fail if
- ;; superclasses are not defined yet
- (handler-case (swank-mop:finalize-inheritance class)
- (program-error (c)
- (declare (ignore c)))))
- (when class
- ;; We have the case (make-instance 'CLASS ...)
- ;; with a known CLASS.
- (multiple-value-bind (slots allow-other-keys-p)
- (if (swank-mop:class-finalized-p class)
- (values (swank-mop:class-slots class) nil)
- (values (swank-mop:class-direct-slots class) t))
- (let ((slot-init-keywords
- (loop for slot in slots append
- (mapcar (lambda (initarg)
- (make-keyword-arg
- initarg
- initarg ; FIXME
- (swank-mop:slot-definition-initform slot)))
- (swank-mop:slot-definition-initargs slot))))
- (initialize-instance-keywords
- (applicable-methods-keywords #'initialize-instance
- (list class))))
- (return-from extra-keywords
- (values (append slot-init-keywords
- initialize-instance-keywords)
- allow-other-keys-p)))))))))
- (call-next-method))
+ (multiple-value-or (apply #'extra-keywords/make-instance operator args)
+ (call-next-method)))
+(defmethod extra-keywords ((operator (eql 'make-condition))
+ &rest args)
+ (multiple-value-or (apply #'extra-keywords/make-instance operator args)
+ (call-next-method)))
+
+(defmethod extra-keywords ((operator (eql 'error))
+ &rest args)
+ (multiple-value-or (apply #'extra-keywords/make-instance operator args)
+ (call-next-method)))
+
+(defmethod extra-keywords ((operator (eql 'signal))
+ &rest args)
+ (multiple-value-or (apply #'extra-keywords/make-instance operator args)
+ (call-next-method)))
+
+(defmethod extra-keywords ((operator (eql 'warn))
+ &rest args)
+ (multiple-value-or (apply #'extra-keywords/make-instance operator args)
+ (call-next-method)))
+
+(defmethod extra-keywords ((operator (eql 'cerror))
+ &rest args)
+ (multiple-value-bind (keywords aok determiners)
+ (apply #'extra-keywords/make-instance operator
+ (cdr args))
+ (if keywords
+ (values keywords aok
+ (cons (car args) determiners))
+ (call-next-method))))
+
+(defmethod extra-keywords ((operator (eql 'change-class))
+ &rest args)
+ (multiple-value-bind (keywords aok determiners)
+ (apply #'extra-keywords/change-class operator (cdr args))
+ (if keywords
+ (values keywords aok
+ (cons (car args) determiners))
+ (call-next-method))))
+
+(defun enrich-decoded-arglist-with-keywords (decoded-arglist keywords allow-other-keys-p)
+ "Modify DECODED-ARGLIST using KEYWORDS and ALLOW-OTHER-KEYS-P."
+ (when keywords
+ (setf (arglist.key-p decoded-arglist) t)
+ (setf (arglist.keyword-args decoded-arglist)
+ (remove-duplicates
+ (append (arglist.keyword-args decoded-arglist)
+ keywords)
+ :key #'keyword-arg.keyword)))
+ (setf (arglist.allow-other-keys-p decoded-arglist)
+ (or (arglist.allow-other-keys-p decoded-arglist)
+ allow-other-keys-p)))
+
(defun enrich-decoded-arglist-with-extra-keywords (decoded-arglist form)
- (multiple-value-bind (extra-keywords extra-aok)
+ "Determine extra keywords from the function call FORM, and modify
+DECODED-ARGLIST to include them. As a secondary return value, return
+the initial sublist of ARGS that was needed to determine the extra
+keywords. As a tertiary return value, return whether any enrichment
+was done."
+ (multiple-value-bind (extra-keywords extra-aok determining-args)
(apply #'extra-keywords form)
;; enrich the list of keywords with the extra keywords
- (when extra-keywords
- (setf (arglist.key-p decoded-arglist) t)
- (setf (arglist.keyword-args decoded-arglist)
- (remove-duplicates
- (append (arglist.keyword-args decoded-arglist)
- extra-keywords)
- :key #'keyword-arg.keyword)))
- (setf (arglist.allow-other-keys-p decoded-arglist)
- (or (arglist.allow-other-keys-p decoded-arglist) extra-aok)))
- decoded-arglist)
+ (enrich-decoded-arglist-with-keywords decoded-arglist
+ extra-keywords extra-aok)
+ (values decoded-arglist
+ determining-args
+ (or extra-keywords extra-aok))))
+(defgeneric compute-enriched-decoded-arglist (operator-form argument-forms)
+ (:documentation
+ "Return three values: DECODED-ARGLIST, DETERMINING-ARGS, and
+ANY-ENRICHMENT, just like enrich-decoded-arglist-with-extra-keywords.
+If the arglist is not available, return :NOT-AVAILABLE."))
+
+(defmethod compute-enriched-decoded-arglist (operator-form argument-forms)
+ (let ((arglist (arglist operator-form)))
+ (etypecase arglist
+ ((member :not-available)
+ :not-available)
+ (list
+ (let ((decoded-arglist (decode-arglist arglist)))
+ (enrich-decoded-arglist-with-extra-keywords decoded-arglist
+ (cons operator-form
+ argument-forms)))))))
+
+(defmethod compute-enriched-decoded-arglist ((operator-form (eql 'with-open-file))
+ argument-forms)
+ (declare (ignore argument-forms))
+ (multiple-value-bind (decoded-arglist determining-args)
+ (call-next-method)
+ (let ((first-arg (first (arglist.required-args decoded-arglist)))
+ (open-arglist (compute-enriched-decoded-arglist 'open nil)))
+ (when (and (arglist-p first-arg) (arglist-p open-arglist))
+ (enrich-decoded-arglist-with-keywords
+ first-arg
+ (arglist.keyword-args open-arglist)
+ nil)))
+ (values decoded-arglist determining-args t)))
+
+(defmethod compute-enriched-decoded-arglist ((operator-form (eql 'apply))
+ argument-forms)
+ (let ((function-name-form (car argument-forms)))
+ (when (and (listp function-name-form)
+ (= (length function-name-form) 2)
+ (member (car function-name-form) '(quote function)))
+ (let ((function-name (cadr function-name-form)))
+ (when (valid-operator-symbol-p function-name)
+ (let ((function-arglist
+ (compute-enriched-decoded-arglist function-name
+ (cdr argument-forms))))
+ (return-from compute-enriched-decoded-arglist
+ (values (make-arglist :required-args
+ (list 'function)
+ :optional-args
+ (append
+ (mapcar #'(lambda (arg)
+ (make-optional-arg arg nil))
+ (arglist.required-args function-arglist))
+ (arglist.optional-args function-arglist))
+ :key-p
+ (arglist.key-p function-arglist)
+ :keyword-args
+ (arglist.keyword-args function-arglist)
+ :rest
+ 'args
+ :allow-other-keys-p
+ (arglist.allow-other-keys-p function-arglist))
+ (list function-name-form)
+ t)))))))
+ (call-next-method))
+
(defslimefun arglist-for-insertion (name)
(with-buffer-syntax ()
(let ((symbol (parse-symbol name)))
(cond
((and symbol
(valid-operator-name-p name))
- (let ((arglist (arglist symbol)))
- (etypecase arglist
- ((member :not-available)
- :not-available)
- (list
- (let ((decoded-arglist (decode-arglist arglist)))
- (enrich-decoded-arglist-with-extra-keywords decoded-arglist
- (list symbol))
- (decoded-arglist-to-template-string decoded-arglist
- *buffer-package*))))))
+ (let ((decoded-arglist
+ (compute-enriched-decoded-arglist symbol nil)))
+ (if (eql decoded-arglist :not-available)
+ :not-available
+ (decoded-arglist-to-template-string decoded-arglist
+ *buffer-package*))))
(t
:not-available)))))
@@ -1605,36 +2148,270 @@
(arglist.keyword-args decoded-arglist)
:key #'keyword-arg.keyword))))
+(defgeneric form-completion (operator-form argument-forms &key remove-args))
+
+(defmethod form-completion (operator-form argument-forms &key (remove-args t))
+ (when (and (symbolp operator-form)
+ (valid-operator-symbol-p operator-form))
+ (multiple-value-bind (decoded-arglist determining-args any-enrichment)
+ (compute-enriched-decoded-arglist operator-form argument-forms)
+ (etypecase decoded-arglist
+ ((member :not-available)
+ :not-available)
+ (arglist
+ (cond
+ (remove-args
+ ;; get rid of formal args already provided
+ (remove-actual-args decoded-arglist argument-forms))
+ (t
+ ;; replace some formal args by determining actual args
+ (remove-actual-args decoded-arglist determining-args)
+ (setf (arglist.provided-args decoded-arglist)
+ determining-args)))
+ (return-from form-completion
+ (values decoded-arglist any-enrichment))))))
+ :not-available)
+
+(defmethod form-completion ((operator-form (eql 'defmethod))
+ argument-forms &key (remove-args t))
+ (when (and (listp argument-forms)
+ (not (null argument-forms)) ;have generic function name
+ (notany #'listp (rest argument-forms))) ;don't have arglist yet
+ (let* ((gf-name (first argument-forms))
+ (gf (and (or (symbolp gf-name)
+ (and (listp gf-name)
+ (eql (first gf-name) 'setf)))
+ (fboundp gf-name)
+ (fdefinition gf-name))))
+ (when (typep gf 'generic-function)
+ (let ((arglist (arglist gf)))
+ (etypecase arglist
+ ((member :not-available))
+ (list
+ (return-from form-completion
+ (values (make-arglist :provided-args (if remove-args
+ nil
+ (list gf-name))
+ :required-args (list arglist)
+ :rest "body" :body-p t)
+ t))))))))
+ (call-next-method))
+
+(defun read-incomplete-form-from-string (form-string)
+ (with-buffer-syntax ()
+ (handler-case
+ (read-from-string form-string)
+ (reader-error (c)
+ (declare (ignore c))
+ nil)
+ (stream-error (c)
+ (declare (ignore c))
+ nil))))
+
(defslimefun complete-form (form-string)
"Read FORM-STRING in the current buffer package, then complete it
by adding a template for the missing arguments."
+ (let ((form (read-incomplete-form-from-string form-string)))
+ (when (consp form)
+ (let ((operator-form (first form))
+ (argument-forms (rest form)))
+ (let ((form-completion
+ (form-completion operator-form argument-forms)))
+ (unless (eql form-completion :not-available)
+ (return-from complete-form
+ (decoded-arglist-to-template-string form-completion
+ *buffer-package*
+ :prefix ""))))))
+ :not-available))
+
+(defun format-arglist-for-echo-area (form operator-name
+ &key print-right-margin print-lines
+ highlight)
+ "Return the arglist for FORM as a string."
+ (when (consp form)
+ (destructuring-bind (operator-form &rest argument-forms)
+ form
+ (let ((form-completion
+ (form-completion operator-form argument-forms
+ :remove-args nil)))
+ (unless (eql form-completion :not-available)
+ (return-from format-arglist-for-echo-area
+ (decoded-arglist-to-string
+ form-completion
+ *package*
+ :operator operator-name
+ :print-right-margin print-right-margin
+ :print-lines print-lines
+ :highlight highlight))))))
+ nil)
+
+(defun keywords-of-operator (operator)
+ "Return a list of KEYWORD-ARGs that OPERATOR accepts.
+This function is useful for writing EXTRA-KEYWORDS methods for
+user-defined functions which are declared &ALLOW-OTHER-KEYS and which
+forward keywords to OPERATOR."
+ (let ((arglist (form-completion operator nil
+ :remove-args nil)))
+ (unless (eql arglist :not-available)
+ (values
+ (arglist.keyword-args arglist)
+ (arglist.allow-other-keys-p arglist)))))
+
+(defun arglist-ref (decoded-arglist operator &rest indices)
+ (cond
+ ((null indices) decoded-arglist)
+ ((not (arglist-p decoded-arglist)) nil)
+ (t
+ (let ((index (first indices))
+ (args (append (and operator
+ (list operator))
+ (arglist.required-args decoded-arglist)
+ (arglist.optional-args decoded-arglist))))
+ (when (< index (length args))
+ (let ((arg (elt args index)))
+ (apply #'arglist-ref arg nil (rest indices))))))))
+
+(defslimefun completions-for-keyword (names keyword-string arg-indices)
(with-buffer-syntax ()
- (handler-case
- (let ((form (read-from-string form-string)))
- (when (consp form)
- (let ((operator-form (first form))
- (argument-forms (rest form)))
- (when (and (symbolp operator-form)
- (valid-operator-symbol-p operator-form))
- (let ((arglist (arglist operator-form)))
- (etypecase arglist
- ((member :not-available)
- :not-available)
- (list
- (let ((decoded-arglist (decode-arglist arglist)))
- (enrich-decoded-arglist-with-extra-keywords decoded-arglist form)
- ;; get rid of formal args already provided
- (remove-actual-args decoded-arglist argument-forms)
- (return-from complete-form
- (decoded-arglist-to-template-string decoded-arglist
- *buffer-package*
- :prefix "")))))))))
- :not-available)
- (reader-error (c)
- (declare (ignore c))
- :not-available))))
+ (multiple-value-bind (name index)
+ (find-valid-operator-name names)
+ (when name
+ (let* ((form (operator-designator-to-form name))
+ (operator-form (first form))
+ (argument-forms (rest form))
+ (arglist
+ (form-completion operator-form argument-forms
+ :remove-args nil)))
+ (unless (eql arglist :not-available)
+ (let* ((indices (butlast (reverse (last arg-indices (1+ index)))))
+ (arglist (apply #'arglist-ref arglist operator-form indices)))
+ (when (and arglist (arglist-p arglist))
+ ;; It would be possible to complete keywords only if we
+ ;; are in a keyword position, but it is not clear if we
+ ;; want that.
+ (let* ((keywords
+ (mapcar #'keyword-arg.keyword
+ (arglist.keyword-args arglist)))
+ (keyword-name
+ (tokenize-symbol keyword-string))
+ (matching-keywords
+ (find-matching-symbols-in-list keyword-name keywords
+ #'compound-prefix-match))
+ (converter (completion-output-symbol-converter keyword-string))
+ (strings
+ (mapcar converter
+ (mapcar #'symbol-name matching-keywords)))
+ (completion-set
+ (format-completion-set strings nil "")))
+ (list completion-set
+ (longest-completion completion-set)))))))))))
+
+(defun arglist-to-string (arglist package &key print-right-margin highlight)
+ (decoded-arglist-to-string (decode-arglist arglist)
+ package
+ :print-right-margin print-right-margin
+ :highlight highlight))
+
+(defun test-print-arglist ()
+ (flet ((test (list string)
+ (let* ((p (find-package :swank))
+ (actual (arglist-to-string list p)))
+ (unless (string= actual string)
+ (warn "Test failed: ~S => ~S~% Expected: ~S"
+ list actual string)))))
+ (test '(function cons) "(function cons)")
+ (test '(quote cons) "(quote cons)")
+ (test '(&key (function #'+)) "(&key (function #'+))")
+ (test '(&whole x y z) "(y z)")
+ (test '(x &aux y z) "(x)")
+ (test '(x &environment env y) "(x y)")
+ (test '(&key ((function f))) "(&key ((function f)))")))
+
+(test-print-arglist)
+
+;;;; Recording and accessing results of computations
+
+(defvar *record-repl-results* t
+ "Non-nil means that REPL results are saved for later lookup.")
+
+(defvar *object-to-presentation-id*
+ (make-weak-key-hash-table :test 'eq)
+ "Store the mapping of objects to numeric identifiers")
+
+(defvar *presentation-id-to-object*
+ (make-weak-value-hash-table :test 'eql)
+ "Store the mapping of numeric identifiers to objects")
+
+(defun clear-presentation-tables ()
+ (clrhash *object-to-presentation-id*)
+ (clrhash *presentation-id-to-object*))
+
+(defvar *presentation-counter* 0 "identifier counter")
+
+(defvar *nil-surrogate* (make-symbol "nil-surrogate"))
+
+;; XXX thread safety? [2006-09-13] mb: not in the slightest (fwiw the
+;; rest of slime isn't thread safe either), do we really care?
+(defun save-presented-object (object)
+ "Save OBJECT and return the assigned id.
+If OBJECT was saved previously return the old id."
+ (let ((object (if (null object) *nil-surrogate* object)))
+ ;; We store *nil-surrogate* instead of nil, to distinguish it from
+ ;; an object that was garbage collected.
+ (or (gethash object *object-to-presentation-id*)
+ (let ((id (incf *presentation-counter*)))
+ (setf (gethash id *presentation-id-to-object*) object)
+ (setf (gethash object *object-to-presentation-id*) id)
+ id))))
+
+(defun lookup-presented-object (id)
+ "Retrieve the object corresponding to ID.
+The secondary value indicates the absence of an entry."
+ (etypecase id
+ (integer
+ ;;
+ (multiple-value-bind (object foundp)
+ (gethash id *presentation-id-to-object*)
+ (cond
+ ((eql object *nil-surrogate*)
+ ;; A stored nil object
+ (values nil t))
+ ((null object)
+ ;; Object that was replaced by nil in the weak hash table
+ ;; when the object was garbage collected.
+ (values nil nil))
+ (t
+ (values object foundp)))))
+ (cons
+ (destructure-case id
+ ((:frame-var frame index)
+ (handler-case
+ (frame-var-value frame index)
+ (t (condition)
+ (declare (ignore condition))
+ (values nil nil))
+ (:no-error (value)
+ (values value t))))
+ ((:inspected-part part-index)
+ (declare (special *inspectee-parts*))
+ (if (< part-index (length *inspectee-parts*))
+ (values (inspector-nth-part part-index) t)
+ (values nil nil)))))))
+
+(defslimefun get-repl-result (id)
+ "Get the result of the previous REPL evaluation with ID."
+ (multiple-value-bind (object foundp) (lookup-presented-object id)
+ (cond (foundp object)
+ (t (abort-request "Attempt to access unrecorded object (id ~D)." id)))))
+
+(defslimefun clear-repl-results ()
+ "Forget the results of all previous REPL evaluations."
+ (clear-presentation-tables)
+ t)
+
+
;;;; Evaluation
(defvar *pending-continuations* '()
@@ -1646,8 +2423,6 @@
(or (guess-package-from-string string nil)
*package*))
-(defvar *current-id* nil)
-
(defun eval-for-emacs (form buffer-package id)
"Bind *BUFFER-PACKAGE* BUFFER-PACKAGE and evaluate FORM.
Return the result to the continuation ID.
@@ -1655,37 +2430,49 @@
(call-with-debugger-hook
#'swank-debugger-hook
(lambda ()
- (let (ok result)
+ (let (ok result reason)
(unwind-protect
(let ((*buffer-package* (guess-buffer-package buffer-package))
(*buffer-readtable* (guess-buffer-readtable buffer-package))
- (*pending-continuations* (cons id *pending-continuations*))
- (*current-id* id))
+ (*pending-continuations* (cons id *pending-continuations*)))
(check-type *buffer-package* package)
(check-type *buffer-readtable* readtable)
- (setq result (eval form))
- (force-output)
- (run-hook *pre-reply-hook*)
- (setq ok t))
+ ;; APPLY would be cleaner than EVAL.
+ ;;(setq result (apply (car form) (cdr form)))
+ (handler-case
+ (progn
+ (setq result (eval form))
+ (run-hook *pre-reply-hook*)
+ (finish-output)
+ (setq ok t))
+ (request-abort (c)
+ (setf ok nil
+ reason (list (slot-value c 'swank-backend::reason))))))
(force-user-output)
(send-to-emacs `(:return ,(current-thread)
- ,(if ok `(:ok ,result) '(:abort))
+ ,(if ok
+ `(:ok ,result)
+ `(:abort ,@reason))
,id)))))))
+(defvar *echo-area-prefix* "=> "
+ "A prefix that `format-values-for-echo-area' should use.")
+
(defun format-values-for-echo-area (values)
(with-buffer-syntax ()
(let ((*print-readably* nil))
(cond ((null values) "; No value")
((and (null (cdr values)) (integerp (car values)))
(let ((i (car values)))
- (format nil "~D (#x~X, #o~O, #b~B)" i i i i)))
- (t (format nil "~{~S~^, ~}" values))))))
+ (format nil "~A~D (#x~X, #o~O, #b~B)"
+ *echo-area-prefix* i i i i)))
+ (t (format nil "~A~{~S~^, ~}" *echo-area-prefix* values))))))
(defslimefun interactive-eval (string)
(with-buffer-syntax ()
(let ((values (multiple-value-list (eval (from-string string)))))
(fresh-line)
- (force-output)
+ (finish-output)
(format-values-for-echo-area values))))
(defslimefun eval-and-grab-output (string)
@@ -1696,6 +2483,7 @@
(list (get-output-stream-string s)
(format nil "~{~S~^~%~}" values)))))
+;;; XXX do we need this stuff? What is it good for?
(defvar *slime-repl-advance-history* nil
"In the dynamic scope of a single form typed at the repl, is set to nil to
prevent the repl from advancing the history - * ** *** etc.")
@@ -1738,34 +2526,41 @@
(let ((form (read stream nil stream)))
(when (eq form stream)
(fresh-line)
- (force-output)
+ (finish-output)
(return (values values -)))
(setq - form)
(if *slime-repl-eval-hooks*
- (loop for hook in *slime-repl-eval-hooks*
- for res = (catch *slime-repl-eval-hook-pass* (multiple-value-list (funcall hook form)))
- until (not (eq res *slime-repl-eval-hook-pass*))
- finally
- (if (eq res *slime-repl-eval-hook-pass*)
- (setq values (multiple-value-list (eval form)))
- (setq values res)))
- (setq values (multiple-value-list (eval form))))
- (force-output)))))
+ (setq values (run-repl-eval-hooks form))
+ (setq values (multiple-value-list (eval form))))
+ (finish-output)))))
(when (and package-update-p (not (eq *package* *buffer-package*)))
(send-to-emacs
(list :new-package (package-name *package*)
(package-string-for-prompt *package*))))))
+(defun run-repl-eval-hooks (form)
+ (loop for hook in *slime-repl-eval-hooks*
+ for res = (catch *slime-repl-eval-hook-pass*
+ (multiple-value-list (funcall hook form)))
+ until (not (eq res *slime-repl-eval-hook-pass*))
+ finally (return
+ (if (eq res *slime-repl-eval-hook-pass*)
+ (multiple-value-list (eval form))
+ res))))
+
(defun package-string-for-prompt (package)
"Return the shortest nickname (or canonical name) of PACKAGE."
- (or (canonical-package-nickname package)
- (auto-abbreviated-package-name package)
- (shortest-package-nickname package)))
+ (princ-to-string
+ (make-symbol
+ (or (canonical-package-nickname package)
+ (auto-abbreviated-package-name package)
+ (shortest-package-nickname package)))))
(defun canonical-package-nickname (package)
"Return the canonical package nickname, if any, of PACKAGE."
- (cdr (assoc (package-name package) *canonical-package-nicknames*
- :test #'string=)))
+ (let ((name (cdr (assoc (package-name package) *canonical-package-nicknames*
+ :test #'string=))))
+ (and name (string name))))
(defun auto-abbreviated-package-name (package)
"Return an abbreviated 'name' for PACKAGE.
@@ -1826,13 +2621,12 @@
(let ((p (setq *package* (guess-package-from-string package))))
(list (package-name p) (package-string-for-prompt p))))
+(defun make-presentations-result (values)
+ ;; overridden in present.lisp
+ `(:present ,(loop for x in values
+ collect (cons (prin1-to-string x)
+ (save-presented-object x)))))
-(defvar *record-repl-results* t
- "Non-nil means that REPL results are saved in *REPL-RESULTS*.")
-
-(defparameter *repl-results* '()
- "Association list of old repl results.")
-
(defslimefun listener-eval (string)
(clear-user-input)
(with-buffer-syntax ()
@@ -1842,56 +2636,41 @@
(unless (or (and (eq values nil) (eq last-form nil))
(eq *slime-repl-advance-history* nil))
(setq *** ** ** * * (car values)
- /// // // / / values)
- (when *record-repl-results*
- (add-repl-result *current-id* *)))
+ /// // // / / values))
(setq +++ ++ ++ + + last-form)
- (if (eq *slime-repl-suppress-output* t)
- ""
- (cond ((null values) "; No value")
- (t
- (format nil "~{~S~^~%~}" values))))))))
+ (cond ((eq *slime-repl-suppress-output* t) '(:suppress-output))
+ (*record-repl-results*
+ (make-presentations-result values))
+ (t
+ `(:values ,(mapcar #'prin1-to-string values))))))))
-(defun add-repl-result (id val)
- (push (cons id val) *repl-results*)
- t)
-
-(defslimefun get-repl-result (id)
- "Get the result of the previous REPL evaluation with ID."
- (let ((previous-output (assoc id *repl-results*)))
- (when (null previous-output)
- (if *record-repl-results*
- (error "Attempt to access no longer existing result (number ~D)." id)
- (error "Attempt to access unrecorded result (number ~D). ~&See ~S."
- id '*record-repl-results*)))
- (cdr previous-output)))
-
-(defslimefun clear-last-repl-result ()
- "Forget the result of the previous REPL evaluation."
- (pop *repl-results*)
- t)
-
-(defslimefun clear-repl-results ()
- "Forget the results of all previous REPL evaluations."
- (setf *repl-results* '()))
- t)
-
(defslimefun ed-in-emacs (&optional what)
"Edit WHAT in Emacs.
WHAT can be:
- A filename (string),
- A list (FILENAME LINE [COLUMN]),
- A function name (symbol),
- nil."
- (let ((target
- (cond ((and (listp what) (pathnamep (first what)))
- (cons (canonicalize-filename (car what)) (cdr what)))
- ((pathnamep what)
- (canonicalize-filename what))
- (t what))))
- (send-oob-to-emacs `(:ed ,target))))
+ A pathname or a string,
+ A list (PATHNAME-OR-STRING LINE [COLUMN]),
+ A function name (symbol or cons),
+ NIL.
+Returns true if it actually called emacs, or NIL if not."
+ (flet ((pathname-or-string-p (thing)
+ (or (pathnamep thing) (typep thing 'string))))
+ (let ((target
+ (cond ((and (listp what) (pathname-or-string-p (first what)))
+ (cons (canonicalize-filename (car what)) (cdr what)))
+ ((pathname-or-string-p what)
+ (canonicalize-filename what))
+ ((symbolp what) what)
+ ((consp what) what)
+ (t (return-from ed-in-emacs nil)))))
+ (cond
+ (*emacs-connection* (send-oob-to-emacs `(:ed ,target)))
+ ((default-connection)
+ (with-connection ((default-connection))
+ (send-oob-to-emacs `(:ed ,target))))
+ (t nil)))))
+
(defslimefun value-for-editing (form)
"Return a readable value of FORM for editing in Emacs.
FORM is expected, but not required, to be SETF'able."
@@ -1903,9 +2682,19 @@
"Set the value of a setf'able FORM to VALUE.
FORM and VALUE are both strings from Emacs."
(with-buffer-syntax ()
- (eval `(setf ,(read-from-string form) ,(read-from-string (concatenate 'string "`" value))))
+ (eval `(setf ,(read-from-string form)
+ ,(read-from-string (concatenate 'string "`" value))))
t))
+(defun background-message (format-string &rest args)
+ "Display a message in Emacs' echo area.
+
+Use this function for informative messages only. The message may even
+be dropped, if we are too busy with other things."
+ (when *emacs-connection*
+ (send-to-emacs `(:background-message
+ ,(apply #'format nil format-string args)))))
+
;;;; Debugger
@@ -1928,7 +2717,7 @@
(defun install-debugger (connection)
(declare (ignore connection))
(when *global-debugger*
- (setq *debugger-hook* #'swank-debugger-hook)))
+ (install-debugger-globally #'swank-debugger-hook)))
;;;;; Debugger loop
;;;
@@ -1947,8 +2736,11 @@
"The list of currenlty active restarts.")
(defvar *sldb-stepping-p* nil
- "True when during execution of a stepp command.")
+ "True during execution of a step command.")
+(defvar *sldb-quit-restart* 'abort-request
+ "What restart should swank attempt to invoke when the user sldb-quits.")
+
(defun debug-in-emacs (condition)
(let ((*swank-debugger-condition* condition)
(*sldb-restarts* (compute-restarts condition))
@@ -2082,12 +2874,13 @@
(continue))
(defslimefun throw-to-toplevel ()
- "Use THROW to abort an RPC from Emacs.
+ "Invoke the ABORT-REQUEST restart abort an RPC from Emacs.
If we are not evaluating an RPC then ABORT instead."
- (ignore-errors (throw 'slime-toplevel nil))
- ;; If we get here then there was no catch. Try aborting as a fallback.
- ;; That makes the 'q' command in SLDB safer to use with threads.
- (abort))
+ (let ((restart (find-restart *sldb-quit-restart*)))
+ (cond (restart (invoke-restart restart))
+ (t (format nil
+ "Restart not found: ~a"
+ *sldb-quit-restart*)))))
(defslimefun invoke-nth-restart-for-emacs (sldb-level n)
"Invoke the Nth available restart.
@@ -2133,14 +2926,22 @@
(with-buffer-syntax ()
(sldb-break-at-start (read-from-string name))))
-(defslimefun sldb-step (frame)
- (cond ((find-restart 'continue)
+(defmacro define-stepper-function (name backend-function-name)
+ `(defslimefun ,name (frame)
+ (cond ((sldb-stepper-condition-p *swank-debugger-condition*)
+ (setq *sldb-stepping-p* t)
+ (,backend-function-name))
+ ((find-restart 'continue)
(activate-stepping frame)
(setq *sldb-stepping-p* t)
(continue))
(t
- (error "No continue restart."))))
+ (error "Not currently single-stepping, and no continue restart available.")))))
+(define-stepper-function sldb-step sldb-step-into)
+(define-stepper-function sldb-next sldb-step-next)
+(define-stepper-function sldb-out sldb-step-out)
+
;;;; Compilation Commands.
@@ -2195,7 +2996,11 @@
Record compiler notes signalled as `compiler-condition's."
(with-buffer-syntax ()
(let ((*compile-print* nil))
- (swank-compiler (lambda () (swank-compile-file filename load-p))))))
+ (swank-compiler
+ (lambda ()
+ (swank-compile-file filename load-p
+ (or (guess-external-format filename)
+ :default)))))))
(defslimefun compile-string-for-emacs (string buffer position directory)
"Compile STRING (exerpted from BUFFER at POSITION).
@@ -2220,17 +3025,19 @@
(defslimefun list-all-systems-in-central-registry ()
"Returns a list of all systems in ASDF's central registry."
- (loop for dir in (asdf-central-registry)
- for defaults = (eval dir)
- when defaults
- nconc (mapcar #'file-namestring
- (directory
- (make-pathname :defaults defaults
- :version :newest
- :type "asd"
- :name :wild
- :case :local)))))
-
+ (delete-duplicates
+ (loop for dir in (asdf-central-registry)
+ for defaults = (eval dir)
+ when defaults
+ nconc (mapcar #'file-namestring
+ (directory
+ (make-pathname :defaults defaults
+ :version :newest
+ :type "asd"
+ :name :wild
+ :case :local))))
+ :test #'string=))
+
(defun file-newer-p (new-file old-file)
"Returns true if NEW-FILE is newer than OLD-FILE."
(> (file-write-date new-file) (file-write-date old-file)))
@@ -2269,7 +3076,6 @@
(*print-length* . nil)))
(defun apply-macro-expander (expander string)
- (declare (type function expander))
(with-buffer-syntax ()
(with-bindings *macroexpand-printer-bindings*
(prin1-to-string (funcall expander (from-string string))))))
@@ -2283,6 +3089,12 @@
(defslimefun swank-macroexpand-all (string)
(apply-macro-expander #'macroexpand-all string))
+(defslimefun swank-compiler-macroexpand-1 (string)
+ (apply-macro-expander #'compiler-macroexpand-1 string))
+
+(defslimefun swank-compiler-macroexpand (string)
+ (apply-macro-expander #'compiler-macroexpand string))
+
(defslimefun disassemble-symbol (name)
(with-buffer-syntax ()
(with-output-to-string (*standard-output*)
@@ -2326,44 +3138,55 @@
"Return the set of completion-candidates as strings."
(multiple-value-bind (name package-name package internal-p)
(parse-completion-arguments string default-package-name)
- (let* ((symbols (and package
- (find-matching-symbols name
- package
- (and (not internal-p)
- package-name)
- matchp)))
- (packs (and (not package-name)
- (find-matching-packages name matchp)))
- (converter (output-case-converter name))
- (strings
- (mapcar converter
- (nconc (mapcar #'symbol-name symbols) packs))))
- (format-completion-set strings internal-p package-name))))
+ (let* ((symbols (mapcar (completion-output-symbol-converter name)
+ (and package
+ (mapcar #'symbol-name
+ (find-matching-symbols name
+ package
+ (and (not internal-p)
+ package-name)
+ matchp)))))
+ (packs (mapcar (completion-output-package-converter name)
+ (and (not package-name)
+ (find-matching-packages name matchp)))))
+ (format-completion-set (nconc symbols packs) internal-p package-name))))
(defun find-matching-symbols (string package external test)
"Return a list of symbols in PACKAGE matching STRING.
TEST is called with two strings. If EXTERNAL is true, only external
symbols are returned."
(let ((completions '())
- (converter (output-case-converter string)))
+ (converter (completion-output-symbol-converter string)))
(flet ((symbol-matches-p (symbol)
(and (or (not external)
(symbol-external-p symbol package))
(funcall test string
(funcall converter (symbol-name symbol))))))
- (do-symbols (symbol package)
+ (do-symbols* (symbol package)
(when (symbol-matches-p symbol)
(push symbol completions))))
+ completions))
+
+(defun find-matching-symbols-in-list (string list test)
+ "Return a list of symbols in LIST matching STRING.
+TEST is called with two strings."
+ (let ((completions '())
+ (converter (completion-output-symbol-converter string)))
+ (flet ((symbol-matches-p (symbol)
+ (funcall test string
+ (funcall converter (symbol-name symbol)))))
+ (dolist (symbol list)
+ (when (symbol-matches-p symbol)
+ (push symbol completions))))
(remove-duplicates completions)))
(defun symbol-external-p (symbol &optional (package (symbol-package symbol)))
"True if SYMBOL is external in PACKAGE.
If PACKAGE is not specified, the home package of SYMBOL is used."
- (multiple-value-bind (_ status)
- (find-symbol (symbol-name symbol) (or package (symbol-package symbol)))
- (declare (ignore _))
- (eq status :external)))
-
+ (and package
+ (eq (nth-value 1 (find-symbol (symbol-name symbol) package))
+ :external)))
+
(defun find-matching-packages (name matcher)
"Return a list of package names matching NAME with MATCHER.
MATCHER is a two-argument predicate."
@@ -2371,7 +3194,9 @@
(remove-if-not (lambda (x) (funcall matcher to-match x))
(mapcar (lambda (pkgname)
(concatenate 'string pkgname ":"))
- (mapcar #'package-name (list-all-packages))))))
+ (loop for package in (list-all-packages)
+ collect (package-name package)
+ append (package-nicknames package))))))
(defun parse-completion-arguments (string default-package-name)
"Parse STRING as a symbol designator.
@@ -2414,20 +3239,44 @@
(values (concatenate 'string prefix string)
(length prefix))))
-(defun output-case-converter (input)
- "Return a function to case convert strings for output.
+(defun completion-output-case-converter (input &optional with-escaping-p)
+ "Return a function to convert strings for the completion output.
INPUT is used to guess the preferred case."
(ecase (readtable-case *readtable*)
- (:upcase (if (some #'lower-case-p input) #'string-downcase #'identity))
+ (:upcase (cond ((or with-escaping-p
+ (every #'upper-case-p input))
+ #'identity)
+ (t #'string-downcase)))
(:invert (lambda (output)
(multiple-value-bind (lower upper) (determine-case output)
(cond ((and lower upper) output)
(lower (string-upcase output))
(upper (string-downcase output))
(t output)))))
- (:downcase (if (some #'upper-case-p input) #'string-upcase #'identity))
+ (:downcase (cond ((or with-escaping-p
+ (every #'lower-case-p input))
+ #'identity)
+ (t #'string-upcase)))
(:preserve #'identity)))
+(defun completion-output-package-converter (input)
+ "Return a function to convert strings for the completion output.
+INPUT is used to guess the preferred case."
+ (completion-output-case-converter input))
+
+(defun completion-output-symbol-converter (input)
+ "Return a function to convert strings for the completion output.
+INPUT is used to guess the preferred case. Escape symbols when needed."
+ (let ((case-converter (completion-output-case-converter input))
+ (case-converter-with-escaping (completion-output-case-converter input t)))
+ (lambda (str)
+ (if (some (lambda (el)
+ (member el '(#\: #\. #\ #\Newline #\Tab)))
+ str)
+ (concatenate 'string "|" (funcall case-converter-with-escaping str) "|")
+ (funcall case-converter str)))))
+
+
(defun determine-case (string)
"Return two booleans LOWER and UPPER indicating whether STRING
contains lower or upper case characters."
@@ -2498,8 +3347,10 @@
For example:
\(transpose-lists '((ONE TWO THREE) (1 2)))
=> ((ONE 1) (TWO 2))"
- ;; A cute function from PAIP p.574
- (if lists (apply #'mapcar #'list lists)))
+ (cond ((null lists) '())
+ ((some #'null lists) '())
+ (t (cons (mapcar #'car lists)
+ (transpose-lists (mapcar #'cdr lists))))))
;;;;; Completion Tests
@@ -2524,7 +3375,7 @@
;;;; Fuzzy completion
-(defslimefun fuzzy-completions (string default-package-name &optional limit)
+(defslimefun fuzzy-completions (string default-package-name &key limit time-limit-in-msec)
"Return an (optionally limited to LIMIT best results) list of
fuzzy completions for a symbol designator STRING. The list will
be sorted by score, most likely match first.
@@ -2550,7 +3401,13 @@
FOO - Symbols accessible in the buffer package.
PKG:FOO - Symbols external in package PKG.
PKG::FOO - Symbols accessible in package PKG."
- (fuzzy-completion-set string default-package-name limit))
+ ;; We may send this as elisp [] arrays to spare a coerce here,
+ ;; but then the network serialization were slower by handling arrays.
+ ;; Instead we limit the number of completions that is transferred
+ ;; (the limit is set from emacs).
+ (coerce (fuzzy-completion-set string default-package-name
+ :limit limit :time-limit-in-msec time-limit-in-msec)
+ 'list))
(defun convert-fuzzy-completion-result (result converter
internal-p package-name)
@@ -2562,12 +3419,14 @@
(destructuring-bind (symbol-or-name score chunks) result
(multiple-value-bind (name added-length)
(format-completion-result
- (funcall converter
- (if (symbolp symbol-or-name)
- (symbol-name symbol-or-name)
- symbol-or-name))
+ (if converter
+ (funcall converter
+ (if (symbolp symbol-or-name)
+ (symbol-name symbol-or-name)
+ symbol-or-name))
+ symbol-or-name)
internal-p package-name)
- (list name score
+ (list name score
(mapcar
#'(lambda (chunk)
;; fix up chunk positions to account for possible
@@ -2599,62 +3458,95 @@
)))
collect flag)))))
-(defun fuzzy-completion-set (string default-package-name &optional limit)
+(defun fuzzy-completion-set (string default-package-name &key limit time-limit-in-msec)
"Prepares list of completion obajects, sorted by SCORE, of fuzzy
completions of STRING in DEFAULT-PACKAGE-NAME. If LIMIT is set,
only the top LIMIT results will be returned."
+ (declare (type (or null (integer 0 #.(1- most-positive-fixnum))) limit time-limit-in-msec))
(multiple-value-bind (name package-name package internal-p)
(parse-completion-arguments string default-package-name)
- (let* ((symbols (and package
- (fuzzy-find-matching-symbols name
- package
- (and (not internal-p)
- package-name))))
- (packs (and (not package-name)
- (fuzzy-find-matching-packages name)))
- (converter (output-case-converter name))
- (results
- (sort (mapcar #'(lambda (result)
- (convert-fuzzy-completion-result
- result converter internal-p package-name))
- (nconc symbols packs))
- #'> :key #'second)))
- (when (and limit
- (> limit 0)
- (< limit (length results)))
- (setf (cdr (nthcdr (1- limit) results)) nil))
- results)))
+ (flet ((convert (vector &optional converter)
+ (when vector
+ (loop for idx :upfrom 0
+ while (< idx (length vector))
+ for el = (aref vector idx)
+ do (setf (aref vector idx) (convert-fuzzy-completion-result
+ el converter internal-p package-name))))))
+ (let* ((symbols (and package
+ (fuzzy-find-matching-symbols name
+ package
+ (and (not internal-p)
+ package-name)
+ :time-limit-in-msec time-limit-in-msec
+ :return-converted-p nil)))
+ (packs (and (not package-name)
+ (fuzzy-find-matching-packages name)))
+ (results))
+ (convert symbols (completion-output-symbol-converter string))
+ (convert packs)
+ (setf results (sort (concatenate 'vector symbols packs) #'> :key #'second))
+ (when (and limit
+ (> limit 0)
+ (< limit (length results)))
+ (if (array-has-fill-pointer-p results)
+ (setf (fill-pointer results) limit)
+ (setf results (make-array limit :displaced-to results))))
+ results))))
-(defun fuzzy-find-matching-symbols (string package external)
+(defun fuzzy-find-matching-symbols (string package external &key time-limit-in-msec return-converted-p)
"Return a list of symbols in PACKAGE matching STRING using the
fuzzy completion algorithm. If EXTERNAL is true, only external
symbols are returned."
- (let ((completions '())
- (converter (output-case-converter string)))
- (flet ((symbol-match (symbol)
+ (let ((completions (make-array 256 :adjustable t :fill-pointer 0))
+ (time-limit (if time-limit-in-msec
+ (ceiling (/ time-limit-in-msec 1000))
+ 0))
+ (utime-at-start (get-universal-time))
+ (count 0)
+ (converter (completion-output-symbol-converter string)))
+ (declare (type (integer 0 #.(1- most-positive-fixnum)) count time-limit)
+ (type function converter))
+ (flet ((symbol-match (symbol converted)
(and (or (not external)
(symbol-external-p symbol package))
- (compute-highest-scoring-completion
- string (funcall converter (symbol-name symbol)) #'char=))))
- (do-symbols (symbol package)
- (multiple-value-bind (result score) (symbol-match symbol)
- (when result
- (push (list symbol score result) completions)))))
- (remove-duplicates completions :key #'first)))
+ (compute-highest-scoring-completion
+ string converted))))
+ (block loop
+ (do-symbols* (symbol package)
+ (incf count)
+ (when (and (not (zerop time-limit))
+ (zerop (mod count 256)) ; ease up on calling get-universal-time like crazy
+ (>= (- (get-universal-time) utime-at-start) time-limit))
+ (return-from loop))
+ (let* ((converted (funcall converter (symbol-name symbol)))
+ (result (if return-converted-p converted symbol)))
+ (if (string= "" string)
+ (when (or (and external (symbol-external-p symbol package))
+ (not external))
+ (vector-push-extend (list result 0.0 (list (list 0 ""))) completions))
+ (multiple-value-bind (match-result score) (symbol-match symbol converted)
+ (when match-result
+ (vector-push-extend (list result score match-result) completions)))))))
+ completions)))
(defun fuzzy-find-matching-packages (name)
"Return a list of package names matching NAME using the fuzzy
completion algorithm."
- (let ((converter (output-case-converter name)))
+ (let ((converter (completion-output-package-converter name))
+ (completions (make-array 32 :adjustable t :fill-pointer 0)))
+ (declare (optimize (speed 3))
+ (type function converter))
(loop for package in (list-all-packages)
for package-name = (concatenate 'string
(funcall converter
(package-name package))
":")
for (result score) = (multiple-value-list
- (compute-highest-scoring-completion
- name package-name #'char=))
- if result collect (list package-name score result))))
+ (compute-highest-scoring-completion
+ name package-name))
+ when result do
+ (vector-push-extend (list package-name score result) completions))
+ completions))
(defslimefun fuzzy-completion-selected (original-string completion)
"This function is called by Slime when a fuzzy completion is
@@ -2680,37 +3572,38 @@
Most natural language searches and symbols do not have this
problem -- this is only here as a safeguard.")
+(declaim (fixnum *fuzzy-recursion-soft-limit*))
-(defun compute-highest-scoring-completion (short full test)
+(defun compute-highest-scoring-completion (short full)
"Finds the highest scoring way to complete the abbreviation
-SHORT onto the string FULL, using TEST as a equality function for
+SHORT onto the string FULL, using CHAR= as a equality function for
letters. Returns two values: The first being the completion
chunks of the high scorer, and the second being the score."
(let* ((scored-results
(mapcar #'(lambda (result)
(cons (score-completion result short full) result))
- (compute-most-completions short full test)))
+ (compute-most-completions short full)))
(winner (first (sort scored-results #'> :key #'first))))
(values (rest winner) (first winner))))
-(defun compute-most-completions (short full test)
+(defun compute-most-completions (short full)
"Finds most possible ways to complete FULL with the letters in SHORT.
Calls RECURSIVELY-COMPUTE-MOST-COMPLETIONS recursively. Returns
a list of (&rest CHUNKS), where each CHUNKS is a description of
how a completion matches."
(let ((*all-chunks* nil))
(declare (special *all-chunks*))
- (recursively-compute-most-completions short full test 0 0 nil nil nil t)
+ (recursively-compute-most-completions short full 0 0 nil nil nil t)
*all-chunks*))
(defun recursively-compute-most-completions
- (short full test
+ (short full
short-index initial-full-index
chunks current-chunk current-chunk-pos
recurse-p)
"Recursively (if RECURSE-P is true) find /most/ possible ways
-to fuzzily map the letters in SHORT onto FULL, with TEST being a
-function to determine if two letters match.
+to fuzzily map the letters in SHORT onto FULL, using CHAR= to
+determine if two letters match.
A chunk is a list of elements that have matched consecutively.
When consecutive matches stop, it is coerced into a string,
@@ -2726,7 +3619,10 @@
Once a word has been completely matched, the chunks are pushed
onto the special variable *ALL-CHUNKS* and the function returns."
- (declare (special *all-chunks*))
+ (declare ;;(optimize speed)
+ (fixnum short-index initial-full-index)
+ (simple-string short full)
+ (special *all-chunks*))
(flet ((short-cur ()
"Returns the next letter from the abbreviation, or NIL
if all have been used."
@@ -2755,13 +3651,13 @@
((= pos (length full)))
(let ((cur-char (aref full pos)))
(if (and (short-cur)
- (funcall test cur-char (short-cur)))
+ (char= cur-char (short-cur)))
(progn
(when recurse-p
;; Try other possibilities, limiting insanely deep
;; recursion somewhat.
(recursively-compute-most-completions
- short full test short-index (1+ pos)
+ short full short-index (1+ pos)
chunks current-chunk current-chunk-pos
(not (> (length *all-chunks*)
*fuzzy-recursion-soft-limit*))))
@@ -2878,6 +3774,48 @@
max-len (highlight-completion result sym) score result))))
+;;;; Completion for character names
+
+(defslimefun completions-for-character (prefix)
+ (let ((completion-set
+ (sort
+ (character-completion-set prefix
+ #'compound-prefix-match/ci/underscores)
+ #'string<)))
+ (list completion-set (longest-completion/underscores completion-set))))
+
+(defun compound-prefix-match/ci/underscores (prefix target)
+ "Like compound-prefix-match, but case-insensitive, and using the underscore,
+not the hyphen, as a delimiter."
+ (declare (type simple-string prefix target))
+ (loop for ch across prefix
+ with tpos = 0
+ always (and (< tpos (length target))
+ (if (char= ch #\_)
+ (setf tpos (position #\_ target :start tpos))
+ (char-equal ch (aref target tpos))))
+ do (incf tpos)))
+
+(defun longest-completion/underscores (completions)
+ "Return the longest prefix for all COMPLETIONS.
+COMPLETIONS is a list of strings."
+ (untokenize-completion/underscores
+ (mapcar #'longest-common-prefix
+ (transpose-lists (mapcar #'tokenize-completion/underscores
+ completions)))))
+
+(defun tokenize-completion/underscores (string)
+ "Return all substrings of STRING delimited by #\_."
+ (loop with end
+ for start = 0 then (1+ end)
+ until (> start (length string))
+ do (setq end (or (position #\_ string :start start) (length string)))
+ collect (subseq string start end)))
+
+(defun untokenize-completion/underscores (tokens)
+ (format nil "~{~A~^_~}" tokens))
+
+
;;;; Documentation
(defslimefun apropos-list-for-emacs (name &optional external-only
@@ -2913,7 +3851,6 @@
"Like (mapcar FN . LISTS) but only call FN on objects satisfying TEST.
Example:
\(map-if #'oddp #'- '(1 2 3 4 5)) => (-1 2 -3 4 -5)"
- (declare (type function test fn))
(apply #'mapcar
(lambda (x) (if (funcall test x) (funcall fn x) x))
lists))
@@ -2921,24 +3858,26 @@
(defun listify (f)
"Return a function like F, but which returns any non-null value
wrapped in a list."
- (declare (type function f))
(lambda (x)
(let ((y (funcall f x)))
(and y (list y)))))
-(defun present-symbol-before-p (a b)
- "Return true if A belongs before B in a printed summary of symbols.
+(defun present-symbol-before-p (x y)
+ "Return true if X belongs before Y in a printed summary of symbols.
Sorted alphabetically by package name and then symbol name, except
that symbols accessible in the current package go first."
+ (declare (type symbol x y))
(flet ((accessible (s)
- (find-symbol (symbol-name s) *buffer-package*)))
- (cond ((and (accessible a) (accessible b))
- (string< (symbol-name a) (symbol-name b)))
- ((accessible a) t)
- ((accessible b) nil)
- (t
- (string< (package-name (symbol-package a))
- (package-name (symbol-package b)))))))
+ ;; Test breaks on NIL for package that does not inherit it
+ (eq (find-symbol (symbol-name s) *buffer-package*) s)))
+ (let ((ax (accessible x)) (ay (accessible y)))
+ (cond ((and ax ay) (string< (symbol-name x) (symbol-name y)))
+ (ax t)
+ (ay nil)
+ (t (let ((px (symbol-package x)) (py (symbol-package y)))
+ (if (eq px py)
+ (string< (symbol-name x) (symbol-name y))
+ (string< (package-name px) (package-name py)))))))))
(let ((regex-hash (make-hash-table :test #'equal)))
(defun compiled-regex (regex-string)
@@ -2946,7 +3885,7 @@
(setf (gethash regex-string regex-hash)
(if (zerop (length regex-string))
(lambda (s) (check-type s string) t)
- (compile nil (nregex:regex-compile regex-string)))))))
+ (compile nil (slime-nregex:regex-compile regex-string)))))))
(defun apropos-matcher (string case-sensitive package external-only)
(let* ((case-modifier (if case-sensitive #'string #'string-upcase))
@@ -3064,7 +4003,7 @@
(format nil "~S is now unprofiled." fname))
(t
(profile fname)
- (format nil "~S is now profiled." fname)))))
+ (format nil "~S is now profiled." fname)))))
;;;; Source Locations
@@ -3090,7 +4029,7 @@
(push e (cdr probe))
(push (cons k (list e)) alist))))
alist))
-
+
(defun location-position< (pos1 pos2)
(cond ((and (position-p pos1) (position-p pos2))
(< (position-pos pos1)
@@ -3099,7 +4038,7 @@
(defun partition (list test key)
(declare (type function test key))
- (loop for e in list
+ (loop for e in list
if (funcall test (funcall key e)) collect e into yes
else collect e into no
finally (return (values yes no))))
@@ -3120,10 +4059,10 @@
(defun group-xrefs (xrefs)
"Group XREFS, a list of the form ((DSPEC LOCATION) ...) by location.
The result is a list of the form ((LOCATION . ((DSPEC . LOCATION) ...)) ...)."
- (multiple-value-bind (resolved errors)
+ (multiple-value-bind (resolved errors)
(partition xrefs #'location-valid-p #'xref.location)
(let ((alist (alistify resolved #'xref-buffer #'equal)))
- (append
+ (append
(loop for (buffer . list) in alist
collect (cons (second buffer)
(mapcar (lambda (xref)
@@ -3131,8 +4070,8 @@
(xref.location xref)))
(sort list #'location-position<
:key #'xref-position))))
- (if errors
- (list (cons "Unresolved"
+ (if errors
+ (list (cons "Unresolved"
(mapcar (lambda (xref)
(cons (to-string (xref.dspec xref))
(xref.location xref)))
@@ -3224,9 +4163,13 @@
((and (eq fast slow) (> n 0)) (return nil))
((not (consp (cdr fast))) (return (values (1+ n) (cdr fast)))))))
+(defvar *slime-inspect-contents-limit* nil "How many elements of
+ a hash table or array to show by default. If table has more than
+ this then offer actions to view more. Set to nil for no limit." )
+
(defmethod inspect-for-emacs ((ht hash-table) inspector)
(declare (ignore inspector))
- (values "A hash table."
+ (values (prin1-to-string ht)
(append
(label-value-line*
("Count" (hash-table-count ht))
@@ -3235,10 +4178,43 @@
("Rehash size" (hash-table-rehash-size ht))
("Rehash threshold" (hash-table-rehash-threshold ht)))
'("Contents: " (:newline))
+ (if (and *slime-inspect-contents-limit*
+ (>= (hash-table-count ht) *slime-inspect-contents-limit*))
+ (inspect-bigger-piece-actions ht (hash-table-count ht))
+ nil)
(loop for key being the hash-keys of ht
- for value being the hash-values of ht
- append `((:value ,key) " = " (:value ,value) (:newline))))))
+ for value being the hash-values of ht
+ repeat (or *slime-inspect-contents-limit* most-positive-fixnum)
+ append `((:value ,key) " = " (:value ,value) (:newline))))))
+(defmethod inspect-bigger-piece-actions (thing size)
+ (append
+ (if (> size *slime-inspect-contents-limit*)
+ (list (inspect-show-more-action thing)
+ '(:newline))
+ nil)
+ (list (inspect-whole-thing-action thing size)
+ '(:newline))))
+
+(defmethod inspect-whole-thing-action (thing size)
+ `(:action ,(format nil "Inspect all ~a elements."
+ size)
+ ,(lambda()
+ (let ((*slime-inspect-contents-limit* nil))
+ (values
+ (swank::inspect-object thing)
+ :replace)))))
+
+(defmethod inspect-show-more-action (thing)
+ `(:action ,(format nil "~a elements shown. Prompt for how many to inspect..."
+ *slime-inspect-contents-limit* )
+ ,(lambda()
+ (let ((*slime-inspect-contents-limit*
+ (progn (format t "How many elements should be shown? ") (read))))
+ (values
+ (swank::inspect-object thing)
+ :replace)))))
+
(defmethod inspect-for-emacs ((array array) inspector)
(declare (ignore inspector))
(values "An array."
@@ -3251,7 +4227,11 @@
(when (array-has-fill-pointer-p array)
(label-value-line "Fill pointer" (fill-pointer array)))
'("Contents:" (:newline))
- (loop for i below (array-total-size array)
+ (if (and *slime-inspect-contents-limit*
+ (>= (array-total-size array) *slime-inspect-contents-limit*))
+ (inspect-bigger-piece-actions array (length array))
+ nil)
+ (loop for i below (or *slime-inspect-contents-limit* (array-total-size array))
append (label-value-line i (row-major-aref array i))))))
(defmethod inspect-for-emacs ((char character) inspector)
@@ -3290,10 +4270,10 @@
;;
;; Value
(cond ((boundp symbol)
- (label-value-line (if (constantp symbol)
- "It is a constant of value"
- "It is a global variable bound to")
- (symbol-value symbol)))
+ (label-value-line (if (constantp symbol)
+ "It is a constant of value"
+ "It is a global variable bound to")
+ (symbol-value symbol)))
(t '("It is unbound." (:newline))))
(docstring-ispec "Documentation" symbol 'variable)
(multiple-value-bind (expansion definedp) (macroexpand symbol)
@@ -3325,9 +4305,11 @@
" to the package: "
(:value ,package ,(package-name package))
,@(if (eq :internal status)
- `((:action " [export it]"
+ `(" "
+ (:action "[export it]"
,(lambda () (export symbol package)))))
- (:action " [unintern it]"
+ " "
+ (:action "[unintern it]"
,(lambda () (unintern symbol package)))
(:newline))
'("It is a non-interned symbol." (:newline)))
@@ -3339,7 +4321,8 @@
(if (find-class symbol nil)
`("It names the class "
(:value ,(find-class symbol) ,(string symbol))
- (:action " [remove]"
+ " "
+ (:action "[remove]"
,(lambda () (setf (find-class symbol) nil)))
(:newline)))
;;
@@ -3384,29 +4367,19 @@
(defmethod inspect-for-emacs ((o standard-object) inspector)
(declare (ignore inspector))
- (values "An object."
- `("Class: " (:value ,(class-of o))
- (:newline)
- "Slots:" (:newline)
- ,@(loop
- with direct-slots = (swank-mop:class-direct-slots (class-of o))
- for slot in (swank-mop:class-slots (class-of o))
- for slot-def = (or (find-if (lambda (a)
- ;; find the direct slot
- ;; with the same name
- ;; as SLOT (an
- ;; effective slot).
- (eql (swank-mop:slot-definition-name a)
- (swank-mop:slot-definition-name slot)))
- direct-slots)
- slot)
- collect `(:value ,slot-def ,(inspector-princ (swank-mop:slot-definition-name slot-def)))
- collect " = "
- if (slot-boundp o (swank-mop:slot-definition-name slot-def))
- collect `(:value ,(slot-value o (swank-mop:slot-definition-name slot-def)))
- else
- collect "#<unbound>"
- collect '(:newline)))))
+ (let ((c (class-of o)))
+ (values "An object."
+ `("Class: " (:value ,c) (:newline)
+ "Slots:" (:newline)
+ ,@(loop for slotd in (swank-mop:class-slots c)
+ for name = (swank-mop:slot-definition-name slotd)
+ collect `(:value ,slotd ,(string name))
+ collect " = "
+ collect (if (slot-boundp-using-class-for-inspector c o slotd)
+ `(:value ,(slot-value-using-class-for-inspector
+ c o slotd))
+ "#<unbound>")
+ collect '(:newline))))))
(defvar *gf-method-getter* 'methods-by-applicability
"This function is called to get the methods of a generic function.
@@ -3443,8 +4416,42 @@
maxlen
(length doc))))
+(defgeneric slot-value-using-class-for-inspector (class object slot)
+ (:method (class object slot)
+ (swank-mop:slot-value-using-class class object slot)))
+
+(defgeneric slot-boundp-using-class-for-inspector (class object slot)
+ (:method (class object slot)
+ (swank-mop:slot-boundp-using-class class object slot)))
+
+(defgeneric all-slots-for-inspector (object inspector)
+ (:method ((object standard-object) inspector)
+ (declare (ignore inspector))
+ (append '("------------------------------" (:newline)
+ "All Slots:" (:newline))
+ (loop
+ with class = (class-of object)
+ with direct-slots = (swank-mop:class-direct-slots (class-of object))
+ for slot in (swank-mop:class-slots (class-of object))
+ for slot-def = (or (find-if (lambda (a)
+ ;; find the direct slot
+ ;; with the same name
+ ;; as SLOT (an
+ ;; effective slot).
+ (eql (swank-mop:slot-definition-name a)
+ (swank-mop:slot-definition-name slot)))
+ direct-slots)
+ slot)
+ collect `(:value ,slot-def ,(inspector-princ (swank-mop:slot-definition-name slot-def)))
+ collect " = "
+ if (slot-boundp-using-class-for-inspector class object slot)
+ collect `(:value ,(slot-value-using-class-for-inspector
+ (class-of object) object slot))
+ else
+ collect "#<unbound>"
+ collect '(:newline)))))
+
(defmethod inspect-for-emacs ((gf standard-generic-function) inspector)
- (declare (ignore inspector))
(flet ((lv (label value) (label-value-line label value)))
(values
"A generic function."
@@ -3460,14 +4467,16 @@
`((:value ,method ,(inspector-princ
;; drop the name of the GF
(cdr (method-for-inspect-value method))))
- (:action " [remove method]"
+ " "
+ (:action "[remove method]"
,(let ((m method)) ; LOOP reassigns method
(lambda ()
(remove-method gf m))))
- (:newline)))))))
+ (:newline)))
+ `((:newline))
+ (all-slots-for-inspector gf inspector)))))
(defmethod inspect-for-emacs ((method standard-method) inspector)
- (declare (ignore inspector))
(values "A method."
`("Method defined on the generic function "
(:value ,(swank-mop:method-generic-function method)
@@ -3483,10 +4492,11 @@
(:newline)
"Qualifiers: " (:value ,(swank-mop:method-qualifiers method))
(:newline)
- "Method function: " (:value ,(swank-mop:method-function method)))))
+ "Method function: " (:value ,(swank-mop:method-function method))
+ (:newline)
+ ,@(all-slots-for-inspector method inspector))))
(defmethod inspect-for-emacs ((class standard-class) inspector)
- (declare (ignore inspector))
(values "A class."
`("Name: " (:value ,(class-name class))
(:newline)
@@ -3508,8 +4518,9 @@
(swank-mop:slot-definition-name slot)))))
'("#<N/A (class not finalized)>"))
(:newline)
- ,@(when (documentation class t)
- `("Documentation:" (:newline) ,(documentation class t) (:newline)))
+ ,@(let ((doc (documentation class t)))
+ (when doc
+ `("Documentation:" (:newline) ,(inspector-princ doc) (:newline))))
"Sub classes: "
,@(common-seperated-spec (swank-mop:class-direct-subclasses class)
(lambda (sub)
@@ -3540,11 +4551,12 @@
collect '(:newline))))
"Prototype: " ,(if (swank-mop:class-finalized-p class)
`(:value ,(swank-mop:class-prototype class))
- '"#<N/A (class not finalized)>"))))
+ '"#<N/A (class not finalized)>")
+ (:newline)
+ ,@(all-slots-for-inspector class inspector))))
(defmethod inspect-for-emacs ((slot swank-mop:standard-slot-definition) inspector)
- (declare (ignore inspector))
- (values "A slot."
+ (values "A slot."
`("Name: " (:value ,(swank-mop:slot-definition-name slot))
(:newline)
,@(when (swank-mop:slot-definition-documentation slot)
@@ -3555,8 +4567,9 @@
"Init form: " ,(if (swank-mop:slot-definition-initfunction slot)
`(:value ,(swank-mop:slot-definition-initform slot))
"#<unspecified>") (:newline)
- "Init function: " (:value ,(swank-mop:slot-definition-initfunction slot))
- (:newline))))
+ "Init function: " (:value ,(swank-mop:slot-definition-initfunction slot))
+ (:newline)
+ ,@(all-slots-for-inspector slot inspector))))
(defmethod inspect-for-emacs ((package package) inspector)
(declare (ignore inspector))
@@ -3625,11 +4638,12 @@
(label-value-line*
("Namestring" (namestring pathname))
("Physical pathname: " (translate-logical-pathname pathname)))
- `("Host: " (pathname-host pathname)
- " (" (:value ,(logical-pathname-translations
- (pathname-host pathname)))
- "other translations)"
- (:newline))
+ `("Host: "
+ ,(pathname-host pathname)
+ " (" (:value ,(logical-pathname-translations
+ (pathname-host pathname)))
+ "other translations)"
+ (:newline))
(label-value-line*
("Directory" (pathname-directory pathname))
("Name" (pathname-name pathname))
@@ -3642,6 +4656,26 @@
(declare (ignore inspector))
(values "A number." `("Value: " ,(princ-to-string n))))
+(defun format-iso8601-time (time-value &optional include-timezone-p)
+ "Formats a universal time TIME-VALUE in ISO 8601 format, with
+ the time zone included if INCLUDE-TIMEZONE-P is non-NIL"
+ ;; Taken from http://www.pvv.ntnu.no/~nsaa/ISO8601.html
+ ;; Thanks, Nikolai Sandved and Thomas Russ!
+ (flet ((format-iso8601-timezone (zone)
+ (if (zerop zone)
+ "Z"
+ (multiple-value-bind (h m) (truncate (abs zone) 1.0)
+ ;; Tricky. Sign of time zone is reversed in ISO 8601
+ ;; relative to Common Lisp convention!
+ (format nil "~:[+~;-~]~2,'0D:~2,'0D"
+ (> zone 0) h (round (* 60 m)))))))
+ (multiple-value-bind (second minute hour day month year dow dst zone)
+ (decode-universal-time time-value)
+ (declare (ignore dow dst))
+ (format nil "~4,'0D-~2,'0D-~2,'0DT~2,'0D:~2,'0D:~2,'0D~:[~*~;~A~]"
+ year month day hour minute second
+ include-timezone-p (format-iso8601-timezone zone)))))
+
(defmethod inspect-for-emacs ((i integer) inspector)
(declare (ignore inspector))
(values "A number."
@@ -3654,10 +4688,7 @@
(label-value-line "Length" (integer-length i))
(ignore-errors
(list "As time: "
- (multiple-value-bind (sec min hour date month year)
- (decode-universal-time i)
- (format nil "~4,'0D-~2,'0D-~2,'0DT~2,'0D:~2,'0D:~2,'0DZ"
- year month date hour min sec)))))))
+ (format-iso8601-time i t))))))
(defmethod inspect-for-emacs ((c complex) inspector)
(declare (ignore inspector))
@@ -3687,6 +4718,44 @@
(label-value-line "Digits" (float-digits f))
(label-value-line "Precision" (float-precision f))))))
+(defmethod inspect-for-emacs ((stream file-stream) inspector)
+ (declare (ignore inspector))
+ (multiple-value-bind (title content)
+ (call-next-method)
+ (declare (ignore title))
+ (values "A file stream."
+ (append
+ `("Pathname: "
+ (:value ,(pathname stream))
+ (:newline) " "
+ (:action "[visit file and show current position]"
+ ,(let ((pathname (pathname stream))
+ (position (file-position stream)))
+ (lambda ()
+ (ed-in-emacs `(,pathname :charpos ,position)))))
+ (:newline))
+ content))))
+
+(defmethod inspect-for-emacs ((condition stream-error) inspector)
+ (declare (ignore inspector))
+ (multiple-value-bind (title content)
+ (call-next-method)
+ (let ((stream (stream-error-stream condition)))
+ (if (typep stream 'file-stream)
+ (values "A stream error."
+ (append
+ `("Pathname: "
+ (:value ,(pathname stream))
+ (:newline) " "
+ (:action "[visit file and show current position]"
+ ,(let ((pathname (pathname stream))
+ (position (file-position stream)))
+ (lambda ()
+ (ed-in-emacs `(,pathname :charpos ,position)))))
+ (:newline))
+ content))
+ (values title content)))))
+
(defvar *inspectee*)
(defvar *inspectee-parts*)
(defvar *inspectee-actions*)
@@ -3702,11 +4771,12 @@
*inspectee-actions* (make-array 10 :adjustable t :fill-pointer 0)
*inspector-history* (make-array 10 :adjustable t :fill-pointer 0)))
-(defslimefun init-inspector (string)
+(defslimefun init-inspector (string &optional (reset t))
(with-buffer-syntax ()
- (reset-inspector)
+ (when reset
+ (reset-inspector))
(inspect-object (eval (read-from-string string)))))
-
+
(defun print-part-to-string (value)
(let ((string (to-string value))
(pos (position value *inspector-history*)))
@@ -3752,7 +4822,8 @@
(inspect-for-emacs object inspector)
(list :title title
:type (to-string (type-of object))
- :content (inspector-content-for-emacs content)))))
+ :content (inspector-content-for-emacs content)
+ :id (assign-index object *inspectee-parts*)))))
(defslimefun inspector-nth-part (index)
(aref *inspectee-parts* index))
@@ -3761,9 +4832,11 @@
(with-buffer-syntax ()
(inspect-object (inspector-nth-part index))))
-(defslimefun inspector-call-nth-action (index)
- (funcall (aref *inspectee-actions* index))
- (inspect-object (pop *inspector-stack*)))
+(defslimefun inspector-call-nth-action (index &rest args)
+ (multiple-value-bind (value replace) (apply (aref *inspectee-actions* index) args)
+ (if (eq replace :replace)
+ value
+ (inspect-object (pop *inspector-stack*)))))
(defslimefun inspector-pop ()
"Drop the inspector stack and inspect the second element. Return
@@ -3782,6 +4855,9 @@
nil)
(t (inspect-object (aref *inspector-history* (1+ position))))))))
+(defslimefun inspector-reinspect ()
+ (inspect-object *inspectee*))
+
(defslimefun quit-inspector ()
(reset-inspector)
nil)
@@ -3791,6 +4867,11 @@
(with-buffer-syntax ()
(describe-to-string *inspectee*)))
+(defslimefun pprint-inspector-part (index)
+ "Pretty-print the currently inspected object."
+ (with-buffer-syntax ()
+ (swank-pprint (list (inspector-nth-part index)))))
+
(defslimefun inspect-in-frame (string index)
(with-buffer-syntax ()
(reset-inspector)
@@ -3818,7 +4899,8 @@
"Return a list ((NAME DESCRIPTION) ...) of all threads."
(setq *thread-list* (all-threads))
(loop for thread in *thread-list*
- collect (list (thread-name thread)
+ for name = (thread-name thread)
+ collect (list (if (symbolp name) (symbol-name name) name)
(thread-status thread)
(thread-id thread))))
@@ -3903,7 +4985,8 @@
after each command.")
(defslimefun update-indentation-information ()
- (perform-indentation-update *emacs-connection* t))
+ (perform-indentation-update *emacs-connection* t)
+ nil)
;; This function is for *PRE-REPLY-HOOK*.
(defun sync-indentation-to-emacs ()
@@ -3977,7 +5060,7 @@
(defun macro-indentation (arglist)
(if (well-formed-list-p arglist)
- (position '&body (clean-arglist arglist))
+ (position '&body (remove '&optional (clean-arglist arglist)))
nil))
(defun well-formed-list-p (list)
@@ -4013,6 +5096,114 @@
(add-hook *pre-reply-hook* 'sync-indentation-to-emacs)
-;; Local Variables:
-;; eval: (font-lock-add-keywords 'lisp-mode '(("(\\(defslimefun\\)\\s +\\(\\(\\w\\|\\s_\\)+\\)" (1 font-lock-keyword-face) (2 font-lock-function-name-face))))
-;; End:
+
+;;;; Presentation menu protocol
+;;
+;; To define a menu for a type of object, define a method
+;; menu-choices-for-presentation on that object type. This function
+;; should return a list of two element lists where the first element is
+;; the name of the menu action and the second is a function that will be
+;; called if the menu is chosen. The function will be called with 3
+;; arguments:
+;;
+;; choice: The string naming the action from above
+;;
+;; object: The object
+;;
+;; id: The presentation id of the object
+;;
+;; You might want append (when (next-method-p) (call-next-method)) to
+;; pick up the Menu actions of superclasses.
+;;
+
+(defvar *presentation-active-menu* nil)
+
+(defun menu-choices-for-presentation-id (id)
+ (multiple-value-bind (ob presentp) (lookup-presented-object id)
+ (cond ((not presentp) 'not-present)
+ (t
+ (let ((menu-and-actions (menu-choices-for-presentation ob)))
+ (setq *presentation-active-menu* (cons id menu-and-actions))
+ (mapcar 'car menu-and-actions))))))
+
+(defun swank-ioify (thing)
+ (cond ((keywordp thing) thing)
+ ((and (symbolp thing)(not (find #\: (symbol-name thing))))
+ (intern (symbol-name thing) 'swank-io-package))
+ ((consp thing) (cons (swank-ioify (car thing)) (swank-ioify (cdr thing))))
+ (t thing)))
+
+(defun execute-menu-choice-for-presentation-id (id count item)
+ (let ((ob (lookup-presented-object id)))
+ (assert (equal id (car *presentation-active-menu*)) ()
+ "Bug: Execute menu call for id ~a but menu has id ~a"
+ id (car *presentation-active-menu*))
+ (let ((action (second (nth (1- count) (cdr *presentation-active-menu*)))))
+ (swank-ioify (funcall action item ob id)))))
+
+;; Default method
+(defmethod menu-choices-for-presentation (ob)
+ (declare (ignore ob))
+ nil)
+
+;; Pathname
+(defmethod menu-choices-for-presentation ((ob pathname))
+ (let* ((file-exists (ignore-errors (probe-file ob)))
+ (lisp-type (make-pathname :type "lisp"))
+ (source-file (and (not (member (pathname-type ob) '("lisp" "cl") :test 'equal))
+ (let ((source (merge-pathnames lisp-type ob)))
+ (and (ignore-errors (probe-file source))
+ source))))
+ (fasl-file (and file-exists
+ (equal (ignore-errors
+ (namestring
+ (truename
+ (compile-file-pathname
+ (merge-pathnames lisp-type ob)))))
+ (namestring (truename ob))))))
+ (remove nil
+ (list*
+ (and (and file-exists (not fasl-file))
+ (list "Edit this file"
+ (lambda(choice object id)
+ (declare (ignore choice id))
+ (ed-in-emacs (namestring (truename object)))
+ nil)))
+ (and file-exists
+ (list "Dired containing directory"
+ (lambda (choice object id)
+ (declare (ignore choice id))
+ (ed-in-emacs (namestring
+ (truename
+ (merge-pathnames
+ (make-pathname :name "" :type "") object))))
+ nil)))
+ (and fasl-file
+ (list "Load this fasl file"
+ (lambda (choice object id)
+ (declare (ignore choice id object))
+ (load ob)
+ nil)))
+ (and fasl-file
+ (list "Delete this fasl file"
+ (lambda (choice object id)
+ (declare (ignore choice id object))
+ (let ((nt (namestring (truename ob))))
+ (when (y-or-n-p-in-emacs "Delete ~a? " nt)
+ (delete-file nt)))
+ nil)))
+ (and source-file
+ (list "Edit lisp source file"
+ (lambda (choice object id)
+ (declare (ignore choice id object))
+ (ed-in-emacs (namestring (truename source-file)))
+ nil)))
+ (and source-file
+ (list "Load lisp source file"
+ (lambda(choice object id)
+ (declare (ignore choice id object))
+ (load source-file)
+ nil)))
+ (and (next-method-p) (call-next-method))))))
+
+;;; swank.lisp ends here
Modified: trunk/thirdparty/emacs/slime/test-all.sh
===================================================================
--- trunk/thirdparty/emacs/slime/test-all.sh 2006-11-30 14:00:03 UTC (rev 2091)
+++ trunk/thirdparty/emacs/slime/test-all.sh 2006-11-30 16:32:54 UTC (rev 2092)
@@ -1,5 +1,8 @@
#!/bin/sh
+# This code has been placed in the Public Domain. All warranties
+# are disclaimed.
+
trap EXIT
for emacs in xemacs ; do # emacs-20.7 emacs-21.3.50 xemacs ; do
Modified: trunk/thirdparty/emacs/slime/test.sh
===================================================================
--- trunk/thirdparty/emacs/slime/test.sh 2006-11-30 14:00:03 UTC (rev 2091)
+++ trunk/thirdparty/emacs/slime/test.sh 2006-11-30 16:32:54 UTC (rev 2092)
@@ -1,6 +1,6 @@
#!/bin/sh
-# Run the SLIME test suite in batch mode, saving the results to a file.
+# Run the SLIME test suite inside screen, saving the results to a file.
# This script's exit status is the number of tests failed. If no tests
# fail then no output is printed. If at least one test fails then a
@@ -9,42 +9,74 @@
# If something unexpected fails, you might get an exit code like 127
# or 255 instead. Sorry.
-if [ $# != 4 ]; then
- echo "Usage: $0 <emacs> <lisp> <dribble-file> <results-file>"
+# This code has been placed in the Public Domain. All warranties
+# are disclaimed.
+
+function usage () {
+ echo "Usage: $name [-v] [-r] <emacs> <lisp>"
exit 1
-fi
+}
-emacs=$1; lisp=$2; dribble=$3; results=$4
-slimedir=$(dirname $0)
+name=$0
+while getopts vr opt; do
+ case $opt in
+ v) verbose=true;;
+ r) dump_results=true;;
+ *) usage;;
+ esac
+done
+
+shift $((OPTIND - 1))
+[ $# = 2 ] || usage
+
+emacs=$1; lisp=$2;
+
# Move the code into a directory in /tmp, so that we can compile it
# for the current lisp.
+slimedir=$(dirname $name)
testdir=/tmp/slime-test.$$
+results=$testdir/results
+dribble=$testdir/dribble
+statusfile=$testdir/status
+
test -d $testdir && rm -r $testdir
+
trap "rm -r $testdir" EXIT # remove temporary directory on exit
mkdir $testdir
cp $slimedir/*.el $slimedir/*.lisp ChangeLog $testdir
+mkfifo $dribble
-# you can remove "--batch" to get an emacs window for troubleshooting.
-$emacs --no-site-file --no-init-file \
- --eval "(setq debug-on-quit t)" \
- --eval "(setq max-lisp-eval-depth 1000)" \
- --eval "(setq load-path (cons \"$testdir\" load-path))" \
- --eval "(require 'slime)" \
- --eval "(setq inferior-lisp-program \"$lisp\")" \
- --eval "(slime-batch-test \"${results}\")" \
- &> $dribble \
+session=slime-screen.$$
-status=$?
+screen -S $session -m -D bash -c "$emacs -nw -q -no-site-file --no-site-file \
+ --eval '(setq debug-on-quit t)' \
+ --eval '(setq max-lisp-eval-depth 1000)' \
+ --eval '(setq load-path (cons \"$testdir\" load-path))' \
+ --eval '(require (quote slime))' \
+ --eval '(setq inferior-lisp-program \"$lisp\")' \
+ --eval '(slime-batch-test \"$results\")' > $dribble;\
+ echo \$? > $statusfile" &
-if [ -f "$results" ]; then
- echo $status "test(s) failed."
+screenpid=$!
+
+if [ "$verbose" = true ]; then
+ cat $dribble &
else
+ cat $dribble > /dev/null &
+fi;
+
+trap "screen -S $session -X quit" SIGINT
+wait $screenpid
+
+if [ -f "$statusfile" ]; then
+ [ "$dump_results" = true ] && cat $results;
+ echo $(cat $statusfile) "test(s) failed."
+else
# Tests crashed
echo crashed
fi
exit $status
-
1
0

[bknr-cvs] r2091 - in branches: . grin grin/bknr grin/bknr/base grin/thirdparty
by bknr@bknr.net 30 Nov '06
by bknr@bknr.net 30 Nov '06
30 Nov '06
Author: hhubner
Date: 2006-11-30 09:00:03 -0500 (Thu, 30 Nov 2006)
New Revision: 2091
Added:
branches/grin/
branches/grin/bknr/base/
branches/grin/bknr/base/sysclasses/
branches/grin/thirdparty/
branches/grin/thirdparty/cxml/
Removed:
branches/grin/bknr/base/
branches/grin/bknr/base/sysclasses/
branches/grin/thirdparty/
branches/grin/thirdparty/cxml/
Log:
Add grin branch
Copied: branches/grin (from rev 1738, trunk)
Copied: branches/grin/bknr/base (from rev 1753, trunk/bknr/base)
Copied: branches/grin/bknr/base/sysclasses (from rev 1768, trunk/bknr/base/sysclasses)
Copied: branches/grin/thirdparty (from rev 1753, trunk/thirdparty)
Copied: branches/grin/thirdparty/cxml (from rev 1754, trunk/thirdparty/cxml)
1
0
Author: hhubner
Date: 2006-11-30 08:59:52 -0500 (Thu, 30 Nov 2006)
New Revision: 2090
Removed:
branches/grin/
Log:
remove obsolete branch
1
0
Author: hhubner
Date: 2006-11-30 08:44:21 -0500 (Thu, 30 Nov 2006)
New Revision: 2089
Removed:
branches/trunk/
Log:
not really
1
0