r11859: Canonicalize whitespace
[xmlutils.git] / pxml0.cl
1 #+lispworks
2 (eval-when (:compile-toplevel :load-toplevel :execute)
3   (hcl:toggle-source-debugging nil)
4   (setq system:*stack-overflow-behaviour* :warn)
5   (declaim (optimize (debug 0))))
6 ;;
7 ;; copyright (c) 1986-2000 Franz Inc, Berkeley, CA
8 ;;
9 ;; This code is free software; you can redistribute it and/or
10 ;; modify it under the terms of the version 2.1 of
11 ;; the GNU Lesser General Public License as published by
12 ;; the Free Software Foundation, as clarified by the AllegroServe
13 ;; prequel found in license-allegroserve.txt.
14 ;;
15 ;; This code is distributed in the hope that it will be useful,
16 ;; but without any warranty; without even the implied warranty of
17 ;; merchantability or fitness for a particular purpose.  See the GNU
18 ;; Lesser General Public License for more details.
19 ;;
20 ;; Version 2.1 of the GNU Lesser General Public License is in the file
21 ;; license-lgpl.txt that was distributed with this file.
22 ;; If it is not present, you can access it from
23 ;; http://www.gnu.org/copyleft/lesser.txt (until superseded by a newer
24 ;; version) or write to the Free Software Foundation, Inc., 59 Temple Place,
25 ;; Suite 330, Boston, MA  02111-1307  USA
26 ;;
27 ;; pxml.cl - parse xml
28 ;;
29 ;; Change Log
30 ;;
31 ;; 12/05/00 changes to allow using in ANSI mode lisp
32 ;; 12/20/00 namespace example fix; correct whitespace bug when
33 ;;          looking for xml? tag in external entity files
34 ;;
35
36 (defpackage net.xml.parser
37   (:use :cl #+allegro :clos :excl :net.uri #+allegro :mp #-allegro :acl-mp)
38   (:export
39    #:parse-xml)
40   )
41
42 (in-package :net.xml.parser)
43
44 (unless (fboundp 'pxml-dribble-bug-hook)
45   (let ((pxml-version-strings nil))
46     (defun pxml-dribble-bug-hook (stream-or-string)
47       (if (stringp stream-or-string)
48           (push stream-or-string pxml-version-strings)
49         (loop for string in (reverse pxml-version-strings)
50             do (write-string string stream-or-string)
51                (terpri stream-or-string))))
52     #+excl
53     (push 'pxml-dribble-bug-hook excl:*dribble-bug-hooks*)))
54
55 (funcall 'pxml-dribble-bug-hook "$Id$")
56
57 (defun xml-char-p (char)
58   (declare (optimize (speed 3) (safety 1)))
59   (let ((code (char-code char)))
60     (if* (eq code #x9) then t
61      elseif (eq code #xA) then t
62      elseif (eq code #xD) then t
63      elseif (<= #x20 code #xD7FF) then t
64      elseif (<= #xE000 code #xFFFD) then t
65        else nil)))
66
67 (defun xml-space-p (char)
68   (declare (optimize (speed 3) (safety 1)))
69   (let ((code (char-code char)))
70     (or (eq code #x20)
71         (eq code #x9)
72         (eq code #xD)
73         (eq code #xA))))
74
75 #+unused
76 (defmacro xml-eql-char-p (char)
77   `(eq ,char #\=))
78
79 (defun xml-base-char-p (char)
80   (declare (optimize (speed 3) (safety 1)))
81   (let ((code (char-code char)))
82     (or (<= #x0041 code #x005A) (<= #x0061 code #x007A)
83         (<= #x00C0 code #x00D6) (<= #x00D8 code #x00F6)
84         (<= #x00F8 code #x00FF) (<= #x0100 code #x0131)
85         (<= #x0134 code #x013E) (<= #x0141 code #x0148)
86         (<= #x014A code #x017E) (<= #x0180 code #x01C3)
87         (<= #x01CD code #x01F0) (<= #x01F4 code #x01F5)
88         (<= #x01FA code #x0217) (<= #x0250 code #x02A8)
89         (<= #x02BB code #x02C1) (= code #x0386) (<= #x0388 code #x038A)
90         (= code #x038C) (<= #x038E code #x03A1) (<= #x03A3 code #x03CE)
91         (<= #x03D0 code #x03D6) (= code #x03DA) (= code #x03DC) (= code #x03DE)
92         (= code #x03E0) (<= #x03E2 code #x03F3) (<= #x0401 code #x040C)
93         (<= #x040E code #x044F) (<= #x0451 code #x045C)
94         (<= #x045E code #x0481) (<= #x0490 code #x04C4)
95         (<= #x04C7 code #x04C8) (<= #x04CB code #x04CC)
96         (<= #x04D0 code #x04EB) (<= #x04EE code #x04F5)
97         (<= #x04F8 code #x04F9) (<= #x0531 code #x0556) (= code #x0559)
98         (<= #x0561 code #x0586) (<= #x05D0 code #x05EA)
99         (<= #x05F0 code #x05F2) (<= #x0621 code #x063A)
100         (<= #x0641 code #x064A) (<= #x0671 code #x06B7)
101         (<= #x06BA code #x06BE) (<= #x06C0 code #x06CE)
102         (<= #x06D0 code #x06D3) (= code #x06D5) (<= #x06E5 code #x06E6)
103         (<= #x0905 code #x0939) (= code #x093D) (<= #x0958 code #x0961)
104         (<= #x0985 code #x098C) (<= #x098F code #x0990)
105         (<= #x0993 code #x09A8) (<= #x09AA code #x09B0) (= code #x09B2)
106         (<= #x09B6 code #x09B9) (<= #x09DC code #x09DD)
107         (<= #x09DF code #x09E1) (<= #x09F0 code #x09F1)
108         (<= #x0A05 code #x0A0A) (<= #x0A0F code #x0A10)
109         (<= #x0A13 code #x0A28) (<= #x0A2A code #x0A30)
110         (<= #x0A32 code #x0A33) (<= #x0A35 code #x0A36)
111         (<= #x0A38 code #x0A39) (<= #x0A59 code #x0A5C) (= code #x0A5E)
112         (<= #x0A72 code #x0A74) (<= #x0A85 code #x0A8B) (= code #x0A8D)
113         (<= #x0A8F code #x0A91) (<= #x0A93 code #x0AA8)
114         (<= #x0AAA code #x0AB0) (<= #x0AB2 code #x0AB3)
115         (<= #x0AB5 code #x0AB9) (<= #x0ABD code #x0AE0)
116         (<= #x0B05 code #x0B0C) (<= #x0B0F code #x0B10)
117         (<= #x0B13 code #x0B28) (<= #x0B2A code #x0B30)
118         (<= #x0B32 code #x0B33) (<= #x0B36 code #x0B39) (= code #x0B3D)
119         (<= #x0B5C code #x0B5D) (<= #x0B5F code #x0B61)
120         (<= #x0B85 code #x0B8A) (<= #x0B8E code #x0B90)
121         (<= #x0B92 code #x0B95) (<= #x0B99 code #x0B9A) (= code #x0B9C)
122         (<= #x0B9E code #x0B9F) (<= #x0BA3 code #x0BA4)
123         (<= #x0BA8 code #x0BAA) (<= #x0BAE code #x0BB5)
124         (<= #x0BB7 code #x0BB9) (<= #x0C05 code #x0C0C)
125         (<= #x0C0E code #x0C10) (<= #x0C12 code #x0C28)
126         (<= #x0C2A code #x0C33) (<= #x0C35 code #x0C39)
127         (<= #x0C60 code #x0C61) (<= #x0C85 code #x0C8C)
128         (<= #x0C8E code #x0C90) (<= #x0C92 code #x0CA8)
129         (<= #x0CAA code #x0CB3) (<= #x0CB5 code #x0CB9) (= code #x0CDE)
130         (<= #x0CE0 code #x0CE1) (<= #x0D05 code #x0D0C)
131         (<= #x0D0E code #x0D10) (<= #x0D12 code #x0D28)
132         (<= #x0D2A code #x0D39) (<= #x0D60 code #x0D61)
133         (<= #x0E01 code #x0E2E) (= code #x0E30) (<= #x0E32 code #x0E33)
134         (<= #x0E40 code #x0E45) (<= #x0E81 code #x0E82) (= code #x0E84)
135         (<= #x0E87 code #x0E88) (= code #x0E8A) (= code #x0E8D)
136         (<= #x0E94 code #x0E97) (<= #x0E99 code #x0E9F)
137         (<= #x0EA1 code #x0EA3) (= code #x0EA5) (= code #x0EA7)
138         (<= #x0EAA code #x0EAB) (<= #x0EAD code #x0EAE) (= code #x0EB0)
139         (<= #x0EB2 code #x0EB3) (= code #x0EBD) (<= #x0EC0 code #x0EC4)
140         (<= #x0F40 code #x0F47) (<= #x0F49 code #x0F69)
141         (<= #x10A0 code #x10C5) (<= #x10D0 code #x10F6) (= code #x1100)
142         (<= #x1102 code #x1103) (<= #x1105 code #x1107) (= code #x1109)
143         (<= #x110B code #x110C) (<= #x110E code #x1112) (= code #x113C)
144         (= code #x113E) (= code #x1140) (= code #x114C) (= code #x114E) (= code #x1150)
145         (<= #x1154 code #x1155) (= code #x1159) (<= #x115F code #x1161)
146         (= code #x1163) (= code #x1165) (= code #x1167) (= code #x1169)
147         (<= #x116D code #x116E) (<= #x1172 code #x1173) (= code #x1175)
148         (= code #x119E) (= code #x11A8) (= code #x11AB) (<= #x11AE code #x11AF)
149         (<= #x11B7 code #x11B8) (= code #x11BA) (<= #x11BC code #x11C2)
150         (= code #x11EB) (= code #x11F0) (= code #x11F9) (<= #x1E00 code #x1E9B)
151         (<= #x1EA0 code #x1EF9) (<= #x1F00 code #x1F15)
152         (<= #x1F18 code #x1F1D) (<= #x1F20 code #x1F45)
153         (<= #x1F48 code #x1F4D) (<= #x1F50 code #x1F57) (= code #x1F59)
154         (= code #x1F5B) (= code #x1F5D) (<= #x1F5F code #x1F7D)
155         (<= #x1F80 code #x1FB4) (<= #x1FB6 code #x1FBC) (= code #x1FBE)
156         (<= #x1FC2 code #x1FC4) (<= #x1FC6 code #x1FCC)
157         (<= #x1FD0 code #x1FD3) (<= #x1FD6 code #x1FDB)
158         (<= #x1FE0 code #x1FEC) (<= #x1FF2 code #x1FF4)
159         (<= #x1FF6 code #x1FFC) (= code #x2126) (<= #x212A code #x212B)
160         (= code #x212E) (<= #x2180 code #x2182) (<= #x3041 code #x3094)
161         (<= #x30A1 code #x30FA) (<= #x3105 code #x312C)
162         (<= #xAC00 code #xD7A3)
163         )))
164
165 (defun xml-ideographic-p (char)
166   (declare (optimize (speed 3) (safety 1)))
167   (let ((code (char-code char)))
168     (or (<= #x4E00 code #x9FA5) (= code #x3007) (<= #x3021 code #x3029))))
169
170 (defun xml-combining-char-p (char)
171   (declare (optimize (speed 3) (safety 1)))
172   (let ((code (char-code char)))
173     (or (<= #x0300 code #x0345) (<= #x0360 code #x0361)
174         (<= #x0483 code #x0486) (<= #x0591 code #x05A1)
175         (<= #x05A3 code #x05B9) (<= #x05BB code #x05BD) (= code #x05BF)
176         (<= #x05C1 code #x05C2) (= code #x05C4) (<= #x064B code #x0652)
177         (= code #x0670) (<= #x06D6 code #x06DC) (<= #x06DD code #x06DF)
178         (<= #x06E0 code #x06E4) (<= #x06E7 code #x06E8)
179         (<= #x06EA code #x06ED) (<= #x0901 code #x0903) (= code #x093C)
180         (<= #x093E code #x094C) (= code #x094D) (<= #x0951 code #x0954)
181         (<= #x0962 code #x0963) (<= #x0981 code #x0983) (= code #x09BC)
182         (<= #x09BE code #x09BF) (<= #x09C0 code #x09C4)
183         (<= #x09C7 code #x09C8) (<= #x09CB code #x09CD) (= code #x09D7)
184         (<= #x09E2 code #x09E3) (= code #x0A02) (= code #x0A3C) (= code #x0A3E)
185         (= code #x0A3F) (<= #x0A40 code #x0A42) (<= #x0A47 code #x0A48)
186         (<= #x0A4B code #x0A4D) (<= #x0A70 code #x0A71)
187         (<= #x0A81 code #x0A83) (= code #x0ABC) (<= #x0ABE code #x0AC5)
188         (<= #x0AC7 code #x0AC9) (<= #x0ACB code #x0ACD)
189         (<= #x0B01 code #x0B03) (= code #x0B3C) (<= #x0B3E code #x0B43)
190         (<= #x0B47 code #x0B48) (<= #x0B4B code #x0B4D)
191         (<= #x0B56 code #x0B57) (<= #x0B82 code #x0B83)
192         (<= #x0BBE code #x0BC2) (<= #x0BC6 code #x0BC8)
193         (<= #x0BCA code #x0BCD) (= code #x0BD7) (<= #x0C01 code #x0C03)
194         (<= #x0C3E code #x0C44) (<= #x0C46 code #x0C48)
195         (<= #x0C4A code #x0C4D) (<= #x0C55 code #x0C56)
196         (<= #x0C82 code #x0C83) (<= #x0CBE code #x0CC4)
197         (<= #x0CC6 code #x0CC8) (<= #x0CCA code #x0CCD)
198         (<= #x0CD5 code #x0CD6) (<= #x0D02 code #x0D03)
199         (<= #x0D3E code #x0D43) (<= #x0D46 code #x0D48)
200         (<= #x0D4A code #x0D4D) (= code #x0D57) (= code #x0E31)
201         (<= #x0E34 code #x0E3A) (<= #x0E47 code #x0E4E) (= code #x0EB1)
202         (<= #x0EB4 code #x0EB9) (<= #x0EBB code #x0EBC)
203         (<= #x0EC8 code #x0ECD) (<= #x0F18 code #x0F19) (= code #x0F35)
204         (= code #x0F37) (= code #x0F39) (= code #x0F3E) (= code #x0F3F)
205         (<= #x0F71 code #x0F84) (<= #x0F86 code #x0F8B)
206         (<= #x0F90 code #x0F95) (= code #x0F97) (<= #x0F99 code #x0FAD)
207         (<= #x0FB1 code #x0FB7) (= code #x0FB9) (<= #x20D0 code #x20DC)
208         (= code #x20E1) (<= #x302A code #x302F) (= code #x3099) (= code #x309A)
209         )))
210
211 (defun xml-digit-p (char)
212   (declare (optimize (speed 3) (safety 1)))
213   (let ((code (char-code char)))
214     (or (<= #x0030 code #x0039) (<= #x0660 code #x0669)
215         (<= #x06F0 code #x06F9) (<= #x0966 code #x096F)
216         (<= #x09E6 code #x09EF) (<= #x0A66 code #x0A6F)
217         (<= #x0AE6 code #x0AEF) (<= #x0B66 code #x0B6F)
218         (<= #x0BE7 code #x0BEF) (<= #x0C66 code #x0C6F)
219         (<= #x0CE6 code #x0CEF) (<= #x0D66 code #x0D6F)
220         (<= #x0E50 code #x0E59) (<= #x0ED0 code #x0ED9)
221         (<= #x0F20 code #x0F29)
222         )))
223
224 (defun xml-extender-p (char)
225   (declare (optimize (speed 3) (safety 1)))
226   (let ((code (char-code char)))
227     (or (= code #x00B7) (= code #x02D0) (= code #x02D1) (= code #x0387) (= code #x0640)
228         (= code #x0E46) (= code #x0EC6) (= code #x3005) (<= #x3031 code #x3035)
229         (<= #x309D code #x309E) (<= #x30FC code #x30FE)
230         )))
231
232 (defmacro xml-letter-p (char)
233   `(or (xml-base-char-p ,char) (xml-ideographic-p ,char)))
234
235 (defmacro xml-name-char-p (char)
236   `(or (xml-letter-p ,char) (xml-digit-p ,char) (eq ,char #\.)
237        (eq ,char #\-) (eq ,char #\_) (eq ,char #\:)
238        (xml-combining-char-p ,char) (xml-extender-p ,char)))
239
240 (defmacro xml-name-start-char-p (char)
241   `(or (xml-letter-p ,char)
242        (eq #\_ ,char) (eq #\: ,char)
243        ))
244