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