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