annotate mcabber/libjabber/xmltok_impl_c.h @ 522:fdd1637db7f3

Update documentation
author Mikael Berthe <mikael@lilotux.net>
date Sat, 19 Nov 2005 16:54:42 +0100
parents 33b8e801ffa6
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1 /*
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2 The contents of this file are subject to the Mozilla Public License
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3 Version 1.1 (the "License"); you may not use this file except in
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
4 compliance with the License. You may obtain a copy of the License at
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
5 http://www.mozilla.org/MPL/
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
6
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
7 Software distributed under the License is distributed on an "AS IS"
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
8 basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
9 License for the specific language governing rights and limitations
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
10 under the License.
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
11
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
12 The Original Code is expat.
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
13
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
14 The Initial Developer of the Original Code is James Clark.
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
15 Portions created by James Clark are Copyright (C) 1998, 1999
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
16 James Clark. All Rights Reserved.
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
17
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
18 Contributor(s):
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
19
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
20 Alternatively, the contents of this file may be used under the terms
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
21 of the GNU General Public License (the "GPL"), in which case the
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
22 provisions of the GPL are applicable instead of those above. If you
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
23 wish to allow use of your version of this file only under the terms of
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
24 the GPL and not to allow others to use your version of this file under
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
25 the MPL, indicate your decision by deleting the provisions above and
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
26 replace them with the notice and other provisions required by the
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
27 GPL. If you do not delete the provisions above, a recipient may use
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
28 your version of this file under either the MPL or the GPL.
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
29 */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
30
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
31 #ifndef IS_INVALID_CHAR
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
32 #define IS_INVALID_CHAR(enc, ptr, n) (0)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
33 #endif
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
34
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
35 #define INVALID_LEAD_CASE(n, ptr, nextTokPtr) \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
36 case BT_LEAD ## n: \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
37 if (end - ptr < n) \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
38 return XML_TOK_PARTIAL_CHAR; \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
39 if (IS_INVALID_CHAR(enc, ptr, n)) { \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
40 *(nextTokPtr) = (ptr); \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
41 return XML_TOK_INVALID; \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
42 } \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
43 ptr += n; \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
44 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
45
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
46 #define INVALID_CASES(ptr, nextTokPtr) \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
47 INVALID_LEAD_CASE(2, ptr, nextTokPtr) \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
48 INVALID_LEAD_CASE(3, ptr, nextTokPtr) \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
49 INVALID_LEAD_CASE(4, ptr, nextTokPtr) \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
50 case BT_NONXML: \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
51 case BT_MALFORM: \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
52 case BT_TRAIL: \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
53 *(nextTokPtr) = (ptr); \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
54 return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
55
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
56 #define CHECK_NAME_CASE(n, enc, ptr, end, nextTokPtr) \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
57 case BT_LEAD ## n: \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
58 if (end - ptr < n) \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
59 return XML_TOK_PARTIAL_CHAR; \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
60 if (!IS_NAME_CHAR(enc, ptr, n)) { \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
61 *nextTokPtr = ptr; \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
62 return XML_TOK_INVALID; \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
63 } \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
64 ptr += n; \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
65 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
66
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
67 #define CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
68 case BT_NONASCII: \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
69 if (!IS_NAME_CHAR_MINBPC(enc, ptr)) { \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
70 *nextTokPtr = ptr; \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
71 return XML_TOK_INVALID; \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
72 } \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
73 case BT_NMSTRT: \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
74 case BT_HEX: \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
75 case BT_DIGIT: \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
76 case BT_NAME: \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
77 case BT_MINUS: \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
78 ptr += MINBPC(enc); \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
79 break; \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
80 CHECK_NAME_CASE(2, enc, ptr, end, nextTokPtr) \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
81 CHECK_NAME_CASE(3, enc, ptr, end, nextTokPtr) \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
82 CHECK_NAME_CASE(4, enc, ptr, end, nextTokPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
83
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
84 #define CHECK_NMSTRT_CASE(n, enc, ptr, end, nextTokPtr) \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
85 case BT_LEAD ## n: \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
86 if (end - ptr < n) \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
87 return XML_TOK_PARTIAL_CHAR; \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
88 if (!IS_NMSTRT_CHAR(enc, ptr, n)) { \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
89 *nextTokPtr = ptr; \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
90 return XML_TOK_INVALID; \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
91 } \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
92 ptr += n; \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
93 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
94
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
95 #define CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
96 case BT_NONASCII: \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
97 if (!IS_NMSTRT_CHAR_MINBPC(enc, ptr)) { \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
98 *nextTokPtr = ptr; \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
99 return XML_TOK_INVALID; \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
100 } \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
101 case BT_NMSTRT: \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
102 case BT_HEX: \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
103 ptr += MINBPC(enc); \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
104 break; \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
105 CHECK_NMSTRT_CASE(2, enc, ptr, end, nextTokPtr) \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
106 CHECK_NMSTRT_CASE(3, enc, ptr, end, nextTokPtr) \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
107 CHECK_NMSTRT_CASE(4, enc, ptr, end, nextTokPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
108
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
109 #ifndef PREFIX
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
110 #define PREFIX(ident) ident
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
111 #endif
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
112
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
113 /* ptr points to character following "<!-" */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
114
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
115 static
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
116 int PREFIX(scanComment)(const ENCODING *enc, const char *ptr, const char *end,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
117 const char **nextTokPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
118 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
119 if (ptr != end) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
120 if (!CHAR_MATCHES(enc, ptr, '-')) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
121 *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
122 return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
123 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
124 ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
125 while (ptr != end) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
126 switch (BYTE_TYPE(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
127 INVALID_CASES(ptr, nextTokPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
128 case BT_MINUS:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
129 if ((ptr += MINBPC(enc)) == end)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
130 return XML_TOK_PARTIAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
131 if (CHAR_MATCHES(enc, ptr, '-')) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
132 if ((ptr += MINBPC(enc)) == end)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
133 return XML_TOK_PARTIAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
134 if (!CHAR_MATCHES(enc, ptr, '>')) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
135 *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
136 return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
137 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
138 *nextTokPtr = ptr + MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
139 return XML_TOK_COMMENT;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
140 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
141 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
142 default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
143 ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
144 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
145 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
146 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
147 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
148 return XML_TOK_PARTIAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
149 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
150
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
151 /* ptr points to character following "<!" */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
152
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
153 static
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
154 int PREFIX(scanDecl)(const ENCODING *enc, const char *ptr, const char *end,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
155 const char **nextTokPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
156 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
157 if (ptr == end)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
158 return XML_TOK_PARTIAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
159 switch (BYTE_TYPE(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
160 case BT_MINUS:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
161 return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
162 case BT_LSQB:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
163 *nextTokPtr = ptr + MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
164 return XML_TOK_COND_SECT_OPEN;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
165 case BT_NMSTRT:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
166 case BT_HEX:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
167 ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
168 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
169 default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
170 *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
171 return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
172 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
173 while (ptr != end) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
174 switch (BYTE_TYPE(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
175 case BT_PERCNT:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
176 if (ptr + MINBPC(enc) == end)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
177 return XML_TOK_PARTIAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
178 /* don't allow <!ENTITY% foo "whatever"> */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
179 switch (BYTE_TYPE(enc, ptr + MINBPC(enc))) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
180 case BT_S: case BT_CR: case BT_LF: case BT_PERCNT:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
181 *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
182 return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
183 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
184 /* fall through */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
185 case BT_S: case BT_CR: case BT_LF:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
186 *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
187 return XML_TOK_DECL_OPEN;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
188 case BT_NMSTRT:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
189 case BT_HEX:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
190 ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
191 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
192 default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
193 *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
194 return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
195 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
196 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
197 return XML_TOK_PARTIAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
198 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
199
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
200 static
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
201 int PREFIX(checkPiTarget)(const ENCODING *enc, const char *ptr, const char *end, int *tokPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
202 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
203 int upper = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
204 *tokPtr = XML_TOK_PI;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
205 if (end - ptr != MINBPC(enc)*3)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
206 return 1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
207 switch (BYTE_TO_ASCII(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
208 case 'x':
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
209 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
210 case 'X':
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
211 upper = 1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
212 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
213 default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
214 return 1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
215 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
216 ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
217 switch (BYTE_TO_ASCII(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
218 case 'm':
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
219 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
220 case 'M':
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
221 upper = 1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
222 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
223 default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
224 return 1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
225 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
226 ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
227 switch (BYTE_TO_ASCII(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
228 case 'l':
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
229 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
230 case 'L':
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
231 upper = 1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
232 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
233 default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
234 return 1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
235 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
236 if (upper)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
237 return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
238 *tokPtr = XML_TOK_XML_DECL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
239 return 1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
240 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
241
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
242 /* ptr points to character following "<?" */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
243
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
244 static
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
245 int PREFIX(scanPi)(const ENCODING *enc, const char *ptr, const char *end,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
246 const char **nextTokPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
247 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
248 int tok;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
249 const char *target = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
250 if (ptr == end)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
251 return XML_TOK_PARTIAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
252 switch (BYTE_TYPE(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
253 CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
254 default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
255 *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
256 return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
257 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
258 while (ptr != end) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
259 switch (BYTE_TYPE(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
260 CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
261 case BT_S: case BT_CR: case BT_LF:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
262 if (!PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
263 *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
264 return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
265 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
266 ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
267 while (ptr != end) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
268 switch (BYTE_TYPE(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
269 INVALID_CASES(ptr, nextTokPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
270 case BT_QUEST:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
271 ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
272 if (ptr == end)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
273 return XML_TOK_PARTIAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
274 if (CHAR_MATCHES(enc, ptr, '>')) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
275 *nextTokPtr = ptr + MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
276 return tok;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
277 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
278 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
279 default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
280 ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
281 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
282 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
283 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
284 return XML_TOK_PARTIAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
285 case BT_QUEST:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
286 if (!PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
287 *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
288 return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
289 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
290 ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
291 if (ptr == end)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
292 return XML_TOK_PARTIAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
293 if (CHAR_MATCHES(enc, ptr, '>')) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
294 *nextTokPtr = ptr + MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
295 return tok;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
296 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
297 /* fall through */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
298 default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
299 *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
300 return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
301 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
302 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
303 return XML_TOK_PARTIAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
304 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
305
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
306
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
307 static
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
308 int PREFIX(scanCdataSection)(const ENCODING *enc, const char *ptr, const char *end,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
309 const char **nextTokPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
310 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
311 int i;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
312 /* CDATA[ */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
313 if (end - ptr < 6 * MINBPC(enc))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
314 return XML_TOK_PARTIAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
315 for (i = 0; i < 6; i++, ptr += MINBPC(enc)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
316 if (!CHAR_MATCHES(enc, ptr, "CDATA["[i])) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
317 *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
318 return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
319 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
320 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
321 *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
322 return XML_TOK_CDATA_SECT_OPEN;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
323 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
324
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
325 static
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
326 int PREFIX(cdataSectionTok)(const ENCODING *enc, const char *ptr, const char *end,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
327 const char **nextTokPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
328 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
329 if (ptr == end)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
330 return XML_TOK_NONE;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
331 if (MINBPC(enc) > 1) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
332 size_t n = end - ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
333 if (n & (MINBPC(enc) - 1)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
334 n &= ~(MINBPC(enc) - 1);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
335 if (n == 0)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
336 return XML_TOK_PARTIAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
337 end = ptr + n;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
338 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
339 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
340 switch (BYTE_TYPE(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
341 case BT_RSQB:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
342 ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
343 if (ptr == end)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
344 return XML_TOK_PARTIAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
345 if (!CHAR_MATCHES(enc, ptr, ']'))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
346 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
347 ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
348 if (ptr == end)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
349 return XML_TOK_PARTIAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
350 if (!CHAR_MATCHES(enc, ptr, '>')) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
351 ptr -= MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
352 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
353 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
354 *nextTokPtr = ptr + MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
355 return XML_TOK_CDATA_SECT_CLOSE;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
356 case BT_CR:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
357 ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
358 if (ptr == end)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
359 return XML_TOK_PARTIAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
360 if (BYTE_TYPE(enc, ptr) == BT_LF)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
361 ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
362 *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
363 return XML_TOK_DATA_NEWLINE;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
364 case BT_LF:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
365 *nextTokPtr = ptr + MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
366 return XML_TOK_DATA_NEWLINE;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
367 INVALID_CASES(ptr, nextTokPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
368 default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
369 ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
370 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
371 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
372 while (ptr != end) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
373 switch (BYTE_TYPE(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
374 #define LEAD_CASE(n) \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
375 case BT_LEAD ## n: \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
376 if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) { \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
377 *nextTokPtr = ptr; \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
378 return XML_TOK_DATA_CHARS; \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
379 } \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
380 ptr += n; \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
381 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
382 LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
383 #undef LEAD_CASE
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
384 case BT_NONXML:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
385 case BT_MALFORM:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
386 case BT_TRAIL:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
387 case BT_CR:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
388 case BT_LF:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
389 case BT_RSQB:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
390 *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
391 return XML_TOK_DATA_CHARS;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
392 default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
393 ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
394 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
395 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
396 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
397 *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
398 return XML_TOK_DATA_CHARS;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
399 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
400
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
401 /* ptr points to character following "</" */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
402
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
403 static
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
404 int PREFIX(scanEndTag)(const ENCODING *enc, const char *ptr, const char *end,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
405 const char **nextTokPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
406 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
407 if (ptr == end)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
408 return XML_TOK_PARTIAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
409 switch (BYTE_TYPE(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
410 CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
411 default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
412 *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
413 return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
414 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
415 while (ptr != end) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
416 switch (BYTE_TYPE(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
417 CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
418 case BT_S: case BT_CR: case BT_LF:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
419 for (ptr += MINBPC(enc); ptr != end; ptr += MINBPC(enc)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
420 switch (BYTE_TYPE(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
421 case BT_S: case BT_CR: case BT_LF:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
422 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
423 case BT_GT:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
424 *nextTokPtr = ptr + MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
425 return XML_TOK_END_TAG;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
426 default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
427 *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
428 return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
429 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
430 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
431 return XML_TOK_PARTIAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
432 #ifdef XML_NS
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
433 case BT_COLON:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
434 /* no need to check qname syntax here, since end-tag must match exactly */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
435 ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
436 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
437 #endif
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
438 case BT_GT:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
439 *nextTokPtr = ptr + MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
440 return XML_TOK_END_TAG;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
441 default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
442 *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
443 return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
444 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
445 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
446 return XML_TOK_PARTIAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
447 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
448
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
449 /* ptr points to character following "&#X" */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
450
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
451 static
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
452 int PREFIX(scanHexCharRef)(const ENCODING *enc, const char *ptr, const char *end,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
453 const char **nextTokPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
454 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
455 if (ptr != end) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
456 switch (BYTE_TYPE(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
457 case BT_DIGIT:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
458 case BT_HEX:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
459 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
460 default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
461 *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
462 return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
463 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
464 for (ptr += MINBPC(enc); ptr != end; ptr += MINBPC(enc)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
465 switch (BYTE_TYPE(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
466 case BT_DIGIT:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
467 case BT_HEX:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
468 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
469 case BT_SEMI:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
470 *nextTokPtr = ptr + MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
471 return XML_TOK_CHAR_REF;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
472 default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
473 *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
474 return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
475 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
476 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
477 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
478 return XML_TOK_PARTIAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
479 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
480
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
481 /* ptr points to character following "&#" */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
482
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
483 static
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
484 int PREFIX(scanCharRef)(const ENCODING *enc, const char *ptr, const char *end,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
485 const char **nextTokPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
486 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
487 if (ptr != end) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
488 if (CHAR_MATCHES(enc, ptr, 'x'))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
489 return PREFIX(scanHexCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
490 switch (BYTE_TYPE(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
491 case BT_DIGIT:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
492 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
493 default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
494 *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
495 return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
496 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
497 for (ptr += MINBPC(enc); ptr != end; ptr += MINBPC(enc)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
498 switch (BYTE_TYPE(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
499 case BT_DIGIT:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
500 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
501 case BT_SEMI:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
502 *nextTokPtr = ptr + MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
503 return XML_TOK_CHAR_REF;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
504 default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
505 *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
506 return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
507 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
508 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
509 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
510 return XML_TOK_PARTIAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
511 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
512
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
513 /* ptr points to character following "&" */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
514
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
515 static
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
516 int PREFIX(scanRef)(const ENCODING *enc, const char *ptr, const char *end,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
517 const char **nextTokPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
518 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
519 if (ptr == end)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
520 return XML_TOK_PARTIAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
521 switch (BYTE_TYPE(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
522 CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
523 case BT_NUM:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
524 return PREFIX(scanCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
525 default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
526 *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
527 return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
528 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
529 while (ptr != end) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
530 switch (BYTE_TYPE(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
531 CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
532 case BT_SEMI:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
533 *nextTokPtr = ptr + MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
534 return XML_TOK_ENTITY_REF;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
535 default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
536 *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
537 return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
538 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
539 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
540 return XML_TOK_PARTIAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
541 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
542
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
543 /* ptr points to character following first character of attribute name */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
544
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
545 static
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
546 int PREFIX(scanAtts)(const ENCODING *enc, const char *ptr, const char *end,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
547 const char **nextTokPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
548 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
549 #ifdef XML_NS
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
550 int hadColon = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
551 #endif
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
552 while (ptr != end) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
553 switch (BYTE_TYPE(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
554 CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
555 #ifdef XML_NS
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
556 case BT_COLON:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
557 if (hadColon) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
558 *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
559 return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
560 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
561 hadColon = 1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
562 ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
563 if (ptr == end)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
564 return XML_TOK_PARTIAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
565 switch (BYTE_TYPE(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
566 CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
567 default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
568 *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
569 return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
570 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
571 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
572 #endif
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
573 case BT_S: case BT_CR: case BT_LF:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
574 for (;;) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
575 int t;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
576
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
577 ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
578 if (ptr == end)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
579 return XML_TOK_PARTIAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
580 t = BYTE_TYPE(enc, ptr);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
581 if (t == BT_EQUALS)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
582 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
583 switch (t) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
584 case BT_S:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
585 case BT_LF:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
586 case BT_CR:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
587 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
588 default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
589 *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
590 return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
591 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
592 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
593 /* fall through */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
594 case BT_EQUALS:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
595 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
596 int open;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
597 #ifdef XML_NS
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
598 hadColon = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
599 #endif
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
600 for (;;) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
601
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
602 ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
603 if (ptr == end)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
604 return XML_TOK_PARTIAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
605 open = BYTE_TYPE(enc, ptr);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
606 if (open == BT_QUOT || open == BT_APOS)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
607 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
608 switch (open) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
609 case BT_S:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
610 case BT_LF:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
611 case BT_CR:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
612 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
613 default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
614 *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
615 return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
616 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
617 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
618 ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
619 /* in attribute value */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
620 for (;;) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
621 int t;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
622 if (ptr == end)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
623 return XML_TOK_PARTIAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
624 t = BYTE_TYPE(enc, ptr);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
625 if (t == open)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
626 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
627 switch (t) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
628 INVALID_CASES(ptr, nextTokPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
629 case BT_AMP:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
630 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
631 int tok = PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, &ptr);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
632 if (tok <= 0) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
633 if (tok == XML_TOK_INVALID)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
634 *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
635 return tok;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
636 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
637 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
638 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
639 case BT_LT:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
640 *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
641 return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
642 default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
643 ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
644 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
645 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
646 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
647 ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
648 if (ptr == end)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
649 return XML_TOK_PARTIAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
650 switch (BYTE_TYPE(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
651 case BT_S:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
652 case BT_CR:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
653 case BT_LF:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
654 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
655 case BT_SOL:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
656 goto sol;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
657 case BT_GT:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
658 goto gt;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
659 default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
660 *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
661 return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
662 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
663 /* ptr points to closing quote */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
664 for (;;) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
665 ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
666 if (ptr == end)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
667 return XML_TOK_PARTIAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
668 switch (BYTE_TYPE(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
669 CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
670 case BT_S: case BT_CR: case BT_LF:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
671 continue;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
672 case BT_GT:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
673 gt:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
674 *nextTokPtr = ptr + MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
675 return XML_TOK_START_TAG_WITH_ATTS;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
676 case BT_SOL:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
677 sol:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
678 ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
679 if (ptr == end)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
680 return XML_TOK_PARTIAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
681 if (!CHAR_MATCHES(enc, ptr, '>')) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
682 *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
683 return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
684 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
685 *nextTokPtr = ptr + MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
686 return XML_TOK_EMPTY_ELEMENT_WITH_ATTS;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
687 default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
688 *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
689 return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
690 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
691 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
692 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
693 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
694 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
695 default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
696 *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
697 return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
698 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
699 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
700 return XML_TOK_PARTIAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
701 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
702
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
703 /* ptr points to character following "<" */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
704
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
705 static
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
706 int PREFIX(scanLt)(const ENCODING *enc, const char *ptr, const char *end,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
707 const char **nextTokPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
708 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
709 #ifdef XML_NS
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
710 int hadColon;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
711 #endif
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
712 if (ptr == end)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
713 return XML_TOK_PARTIAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
714 switch (BYTE_TYPE(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
715 CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
716 case BT_EXCL:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
717 if ((ptr += MINBPC(enc)) == end)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
718 return XML_TOK_PARTIAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
719 switch (BYTE_TYPE(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
720 case BT_MINUS:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
721 return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
722 case BT_LSQB:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
723 return PREFIX(scanCdataSection)(enc, ptr + MINBPC(enc), end, nextTokPtr);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
724 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
725 *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
726 return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
727 case BT_QUEST:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
728 return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
729 case BT_SOL:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
730 return PREFIX(scanEndTag)(enc, ptr + MINBPC(enc), end, nextTokPtr);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
731 default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
732 *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
733 return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
734 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
735 #ifdef XML_NS
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
736 hadColon = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
737 #endif
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
738 /* we have a start-tag */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
739 while (ptr != end) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
740 switch (BYTE_TYPE(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
741 CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
742 #ifdef XML_NS
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
743 case BT_COLON:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
744 if (hadColon) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
745 *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
746 return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
747 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
748 hadColon = 1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
749 ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
750 if (ptr == end)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
751 return XML_TOK_PARTIAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
752 switch (BYTE_TYPE(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
753 CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
754 default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
755 *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
756 return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
757 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
758 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
759 #endif
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
760 case BT_S: case BT_CR: case BT_LF:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
761 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
762 ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
763 while (ptr != end) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
764 switch (BYTE_TYPE(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
765 CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
766 case BT_GT:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
767 goto gt;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
768 case BT_SOL:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
769 goto sol;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
770 case BT_S: case BT_CR: case BT_LF:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
771 ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
772 continue;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
773 default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
774 *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
775 return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
776 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
777 return PREFIX(scanAtts)(enc, ptr, end, nextTokPtr);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
778 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
779 return XML_TOK_PARTIAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
780 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
781 case BT_GT:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
782 gt:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
783 *nextTokPtr = ptr + MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
784 return XML_TOK_START_TAG_NO_ATTS;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
785 case BT_SOL:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
786 sol:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
787 ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
788 if (ptr == end)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
789 return XML_TOK_PARTIAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
790 if (!CHAR_MATCHES(enc, ptr, '>')) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
791 *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
792 return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
793 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
794 *nextTokPtr = ptr + MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
795 return XML_TOK_EMPTY_ELEMENT_NO_ATTS;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
796 default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
797 *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
798 return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
799 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
800 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
801 return XML_TOK_PARTIAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
802 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
803
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
804 static
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
805 int PREFIX(contentTok)(const ENCODING *enc, const char *ptr, const char *end,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
806 const char **nextTokPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
807 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
808 if (ptr == end)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
809 return XML_TOK_NONE;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
810 if (MINBPC(enc) > 1) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
811 size_t n = end - ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
812 if (n & (MINBPC(enc) - 1)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
813 n &= ~(MINBPC(enc) - 1);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
814 if (n == 0)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
815 return XML_TOK_PARTIAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
816 end = ptr + n;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
817 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
818 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
819 switch (BYTE_TYPE(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
820 case BT_LT:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
821 return PREFIX(scanLt)(enc, ptr + MINBPC(enc), end, nextTokPtr);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
822 case BT_AMP:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
823 return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
824 case BT_CR:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
825 ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
826 if (ptr == end)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
827 return XML_TOK_TRAILING_CR;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
828 if (BYTE_TYPE(enc, ptr) == BT_LF)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
829 ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
830 *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
831 return XML_TOK_DATA_NEWLINE;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
832 case BT_LF:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
833 *nextTokPtr = ptr + MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
834 return XML_TOK_DATA_NEWLINE;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
835 case BT_RSQB:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
836 ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
837 if (ptr == end)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
838 return XML_TOK_TRAILING_RSQB;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
839 if (!CHAR_MATCHES(enc, ptr, ']'))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
840 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
841 ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
842 if (ptr == end)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
843 return XML_TOK_TRAILING_RSQB;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
844 if (!CHAR_MATCHES(enc, ptr, '>')) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
845 ptr -= MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
846 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
847 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
848 *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
849 return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
850 INVALID_CASES(ptr, nextTokPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
851 default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
852 ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
853 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
854 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
855 while (ptr != end) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
856 switch (BYTE_TYPE(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
857 #define LEAD_CASE(n) \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
858 case BT_LEAD ## n: \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
859 if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) { \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
860 *nextTokPtr = ptr; \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
861 return XML_TOK_DATA_CHARS; \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
862 } \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
863 ptr += n; \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
864 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
865 LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
866 #undef LEAD_CASE
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
867 case BT_RSQB:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
868 if (ptr + MINBPC(enc) != end) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
869 if (!CHAR_MATCHES(enc, ptr + MINBPC(enc), ']')) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
870 ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
871 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
872 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
873 if (ptr + 2*MINBPC(enc) != end) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
874 if (!CHAR_MATCHES(enc, ptr + 2*MINBPC(enc), '>')) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
875 ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
876 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
877 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
878 *nextTokPtr = ptr + 2*MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
879 return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
880 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
881 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
882 /* fall through */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
883 case BT_AMP:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
884 case BT_LT:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
885 case BT_NONXML:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
886 case BT_MALFORM:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
887 case BT_TRAIL:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
888 case BT_CR:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
889 case BT_LF:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
890 *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
891 return XML_TOK_DATA_CHARS;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
892 default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
893 ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
894 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
895 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
896 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
897 *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
898 return XML_TOK_DATA_CHARS;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
899 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
900
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
901 /* ptr points to character following "%" */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
902
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
903 static
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
904 int PREFIX(scanPercent)(const ENCODING *enc, const char *ptr, const char *end,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
905 const char **nextTokPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
906 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
907 if (ptr == end)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
908 return XML_TOK_PARTIAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
909 switch (BYTE_TYPE(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
910 CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
911 case BT_S: case BT_LF: case BT_CR: case BT_PERCNT:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
912 *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
913 return XML_TOK_PERCENT;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
914 default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
915 *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
916 return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
917 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
918 while (ptr != end) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
919 switch (BYTE_TYPE(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
920 CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
921 case BT_SEMI:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
922 *nextTokPtr = ptr + MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
923 return XML_TOK_PARAM_ENTITY_REF;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
924 default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
925 *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
926 return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
927 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
928 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
929 return XML_TOK_PARTIAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
930 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
931
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
932 static
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
933 int PREFIX(scanPoundName)(const ENCODING *enc, const char *ptr, const char *end,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
934 const char **nextTokPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
935 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
936 if (ptr == end)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
937 return XML_TOK_PARTIAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
938 switch (BYTE_TYPE(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
939 CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
940 default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
941 *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
942 return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
943 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
944 while (ptr != end) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
945 switch (BYTE_TYPE(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
946 CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
947 case BT_CR: case BT_LF: case BT_S:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
948 case BT_RPAR: case BT_GT: case BT_PERCNT: case BT_VERBAR:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
949 *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
950 return XML_TOK_POUND_NAME;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
951 default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
952 *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
953 return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
954 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
955 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
956 return XML_TOK_PARTIAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
957 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
958
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
959 static
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
960 int PREFIX(scanLit)(int open, const ENCODING *enc,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
961 const char *ptr, const char *end,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
962 const char **nextTokPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
963 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
964 while (ptr != end) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
965 int t = BYTE_TYPE(enc, ptr);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
966 switch (t) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
967 INVALID_CASES(ptr, nextTokPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
968 case BT_QUOT:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
969 case BT_APOS:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
970 ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
971 if (t != open)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
972 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
973 if (ptr == end)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
974 return XML_TOK_PARTIAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
975 *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
976 switch (BYTE_TYPE(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
977 case BT_S: case BT_CR: case BT_LF:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
978 case BT_GT: case BT_PERCNT: case BT_LSQB:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
979 return XML_TOK_LITERAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
980 default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
981 return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
982 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
983 default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
984 ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
985 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
986 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
987 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
988 return XML_TOK_PARTIAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
989 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
990
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
991 static
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
992 int PREFIX(prologTok)(const ENCODING *enc, const char *ptr, const char *end,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
993 const char **nextTokPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
994 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
995 int tok;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
996 if (ptr == end)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
997 return XML_TOK_NONE;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
998 if (MINBPC(enc) > 1) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
999 size_t n = end - ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1000 if (n & (MINBPC(enc) - 1)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1001 n &= ~(MINBPC(enc) - 1);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1002 if (n == 0)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1003 return XML_TOK_PARTIAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1004 end = ptr + n;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1005 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1006 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1007 switch (BYTE_TYPE(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1008 case BT_QUOT:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1009 return PREFIX(scanLit)(BT_QUOT, enc, ptr + MINBPC(enc), end, nextTokPtr);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1010 case BT_APOS:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1011 return PREFIX(scanLit)(BT_APOS, enc, ptr + MINBPC(enc), end, nextTokPtr);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1012 case BT_LT:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1013 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1014 ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1015 if (ptr == end)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1016 return XML_TOK_PARTIAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1017 switch (BYTE_TYPE(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1018 case BT_EXCL:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1019 return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1020 case BT_QUEST:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1021 return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1022 case BT_NMSTRT:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1023 case BT_HEX:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1024 case BT_NONASCII:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1025 case BT_LEAD2:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1026 case BT_LEAD3:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1027 case BT_LEAD4:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1028 *nextTokPtr = ptr - MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1029 return XML_TOK_INSTANCE_START;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1030 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1031 *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1032 return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1033 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1034 case BT_CR:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1035 if (ptr + MINBPC(enc) == end)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1036 return XML_TOK_TRAILING_CR;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1037 /* fall through */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1038 case BT_S: case BT_LF:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1039 for (;;) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1040 ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1041 if (ptr == end)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1042 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1043 switch (BYTE_TYPE(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1044 case BT_S: case BT_LF:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1045 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1046 case BT_CR:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1047 /* don't split CR/LF pair */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1048 if (ptr + MINBPC(enc) != end)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1049 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1050 /* fall through */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1051 default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1052 *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1053 return XML_TOK_PROLOG_S;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1054 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1055 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1056 *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1057 return XML_TOK_PROLOG_S;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1058 case BT_PERCNT:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1059 return PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1060 case BT_COMMA:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1061 *nextTokPtr = ptr + MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1062 return XML_TOK_COMMA;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1063 case BT_LSQB:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1064 *nextTokPtr = ptr + MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1065 return XML_TOK_OPEN_BRACKET;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1066 case BT_RSQB:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1067 ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1068 if (ptr == end)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1069 return XML_TOK_PARTIAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1070 if (CHAR_MATCHES(enc, ptr, ']')) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1071 if (ptr + MINBPC(enc) == end)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1072 return XML_TOK_PARTIAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1073 if (CHAR_MATCHES(enc, ptr + MINBPC(enc), '>')) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1074 *nextTokPtr = ptr + 2*MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1075 return XML_TOK_COND_SECT_CLOSE;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1076 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1077 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1078 *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1079 return XML_TOK_CLOSE_BRACKET;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1080 case BT_LPAR:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1081 *nextTokPtr = ptr + MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1082 return XML_TOK_OPEN_PAREN;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1083 case BT_RPAR:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1084 ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1085 if (ptr == end)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1086 return XML_TOK_PARTIAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1087 switch (BYTE_TYPE(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1088 case BT_AST:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1089 *nextTokPtr = ptr + MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1090 return XML_TOK_CLOSE_PAREN_ASTERISK;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1091 case BT_QUEST:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1092 *nextTokPtr = ptr + MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1093 return XML_TOK_CLOSE_PAREN_QUESTION;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1094 case BT_PLUS:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1095 *nextTokPtr = ptr + MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1096 return XML_TOK_CLOSE_PAREN_PLUS;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1097 case BT_CR: case BT_LF: case BT_S:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1098 case BT_GT: case BT_COMMA: case BT_VERBAR:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1099 case BT_RPAR:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1100 *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1101 return XML_TOK_CLOSE_PAREN;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1102 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1103 *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1104 return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1105 case BT_VERBAR:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1106 *nextTokPtr = ptr + MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1107 return XML_TOK_OR;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1108 case BT_GT:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1109 *nextTokPtr = ptr + MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1110 return XML_TOK_DECL_CLOSE;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1111 case BT_NUM:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1112 return PREFIX(scanPoundName)(enc, ptr + MINBPC(enc), end, nextTokPtr);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1113 #define LEAD_CASE(n) \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1114 case BT_LEAD ## n: \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1115 if (end - ptr < n) \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1116 return XML_TOK_PARTIAL_CHAR; \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1117 if (IS_NMSTRT_CHAR(enc, ptr, n)) { \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1118 ptr += n; \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1119 tok = XML_TOK_NAME; \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1120 break; \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1121 } \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1122 if (IS_NAME_CHAR(enc, ptr, n)) { \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1123 ptr += n; \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1124 tok = XML_TOK_NMTOKEN; \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1125 break; \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1126 } \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1127 *nextTokPtr = ptr; \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1128 return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1129 LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1130 #undef LEAD_CASE
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1131 case BT_NMSTRT:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1132 case BT_HEX:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1133 tok = XML_TOK_NAME;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1134 ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1135 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1136 case BT_DIGIT:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1137 case BT_NAME:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1138 case BT_MINUS:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1139 #ifdef XML_NS
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1140 case BT_COLON:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1141 #endif
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1142 tok = XML_TOK_NMTOKEN;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1143 ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1144 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1145 case BT_NONASCII:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1146 if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1147 ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1148 tok = XML_TOK_NAME;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1149 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1150 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1151 if (IS_NAME_CHAR_MINBPC(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1152 ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1153 tok = XML_TOK_NMTOKEN;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1154 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1155 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1156 /* fall through */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1157 default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1158 *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1159 return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1160 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1161 while (ptr != end) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1162 switch (BYTE_TYPE(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1163 CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1164 case BT_GT: case BT_RPAR: case BT_COMMA:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1165 case BT_VERBAR: case BT_LSQB: case BT_PERCNT:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1166 case BT_S: case BT_CR: case BT_LF:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1167 *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1168 return tok;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1169 #ifdef XML_NS
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1170 case BT_COLON:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1171 ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1172 switch (tok) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1173 case XML_TOK_NAME:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1174 if (ptr == end)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1175 return XML_TOK_PARTIAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1176 tok = XML_TOK_PREFIXED_NAME;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1177 switch (BYTE_TYPE(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1178 CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1179 default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1180 tok = XML_TOK_NMTOKEN;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1181 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1182 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1183 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1184 case XML_TOK_PREFIXED_NAME:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1185 tok = XML_TOK_NMTOKEN;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1186 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1187 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1188 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1189 #endif
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1190 case BT_PLUS:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1191 if (tok == XML_TOK_NMTOKEN) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1192 *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1193 return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1194 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1195 *nextTokPtr = ptr + MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1196 return XML_TOK_NAME_PLUS;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1197 case BT_AST:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1198 if (tok == XML_TOK_NMTOKEN) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1199 *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1200 return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1201 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1202 *nextTokPtr = ptr + MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1203 return XML_TOK_NAME_ASTERISK;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1204 case BT_QUEST:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1205 if (tok == XML_TOK_NMTOKEN) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1206 *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1207 return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1208 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1209 *nextTokPtr = ptr + MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1210 return XML_TOK_NAME_QUESTION;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1211 default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1212 *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1213 return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1214 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1215 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1216 return XML_TOK_PARTIAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1217 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1218
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1219 static
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1220 int PREFIX(attributeValueTok)(const ENCODING *enc, const char *ptr, const char *end,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1221 const char **nextTokPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1222 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1223 const char *start;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1224 if (ptr == end)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1225 return XML_TOK_NONE;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1226 start = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1227 while (ptr != end) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1228 switch (BYTE_TYPE(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1229 #define LEAD_CASE(n) \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1230 case BT_LEAD ## n: ptr += n; break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1231 LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1232 #undef LEAD_CASE
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1233 case BT_AMP:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1234 if (ptr == start)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1235 return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1236 *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1237 return XML_TOK_DATA_CHARS;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1238 case BT_LT:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1239 /* this is for inside entity references */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1240 *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1241 return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1242 case BT_LF:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1243 if (ptr == start) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1244 *nextTokPtr = ptr + MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1245 return XML_TOK_DATA_NEWLINE;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1246 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1247 *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1248 return XML_TOK_DATA_CHARS;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1249 case BT_CR:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1250 if (ptr == start) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1251 ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1252 if (ptr == end)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1253 return XML_TOK_TRAILING_CR;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1254 if (BYTE_TYPE(enc, ptr) == BT_LF)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1255 ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1256 *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1257 return XML_TOK_DATA_NEWLINE;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1258 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1259 *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1260 return XML_TOK_DATA_CHARS;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1261 case BT_S:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1262 if (ptr == start) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1263 *nextTokPtr = ptr + MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1264 return XML_TOK_ATTRIBUTE_VALUE_S;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1265 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1266 *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1267 return XML_TOK_DATA_CHARS;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1268 default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1269 ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1270 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1271 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1272 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1273 *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1274 return XML_TOK_DATA_CHARS;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1275 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1276
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1277 static
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1278 int PREFIX(entityValueTok)(const ENCODING *enc, const char *ptr, const char *end,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1279 const char **nextTokPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1280 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1281 const char *start;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1282 if (ptr == end)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1283 return XML_TOK_NONE;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1284 start = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1285 while (ptr != end) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1286 switch (BYTE_TYPE(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1287 #define LEAD_CASE(n) \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1288 case BT_LEAD ## n: ptr += n; break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1289 LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1290 #undef LEAD_CASE
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1291 case BT_AMP:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1292 if (ptr == start)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1293 return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1294 *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1295 return XML_TOK_DATA_CHARS;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1296 case BT_PERCNT:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1297 if (ptr == start)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1298 return PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1299 *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1300 return XML_TOK_DATA_CHARS;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1301 case BT_LF:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1302 if (ptr == start) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1303 *nextTokPtr = ptr + MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1304 return XML_TOK_DATA_NEWLINE;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1305 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1306 *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1307 return XML_TOK_DATA_CHARS;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1308 case BT_CR:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1309 if (ptr == start) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1310 ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1311 if (ptr == end)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1312 return XML_TOK_TRAILING_CR;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1313 if (BYTE_TYPE(enc, ptr) == BT_LF)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1314 ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1315 *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1316 return XML_TOK_DATA_NEWLINE;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1317 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1318 *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1319 return XML_TOK_DATA_CHARS;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1320 default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1321 ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1322 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1323 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1324 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1325 *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1326 return XML_TOK_DATA_CHARS;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1327 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1328
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1329 static
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1330 int PREFIX(isPublicId)(const ENCODING *enc, const char *ptr, const char *end,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1331 const char **badPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1332 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1333 ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1334 end -= MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1335 for (; ptr != end; ptr += MINBPC(enc)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1336 switch (BYTE_TYPE(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1337 case BT_DIGIT:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1338 case BT_HEX:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1339 case BT_MINUS:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1340 case BT_APOS:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1341 case BT_LPAR:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1342 case BT_RPAR:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1343 case BT_PLUS:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1344 case BT_COMMA:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1345 case BT_SOL:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1346 case BT_EQUALS:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1347 case BT_QUEST:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1348 case BT_CR:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1349 case BT_LF:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1350 case BT_SEMI:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1351 case BT_EXCL:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1352 case BT_AST:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1353 case BT_PERCNT:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1354 case BT_NUM:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1355 #ifdef XML_NS
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1356 case BT_COLON:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1357 #endif
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1358 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1359 case BT_S:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1360 if (CHAR_MATCHES(enc, ptr, '\t')) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1361 *badPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1362 return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1363 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1364 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1365 case BT_NAME:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1366 case BT_NMSTRT:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1367 if (!(BYTE_TO_ASCII(enc, ptr) & ~0x7f))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1368 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1369 default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1370 switch (BYTE_TO_ASCII(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1371 case 0x24: /* $ */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1372 case 0x40: /* @ */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1373 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1374 default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1375 *badPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1376 return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1377 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1378 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1379 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1380 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1381 return 1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1382 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1383
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1384 /* This must only be called for a well-formed start-tag or empty element tag.
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1385 Returns the number of attributes. Pointers to the first attsMax attributes
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1386 are stored in atts. */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1387
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1388 static
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1389 int PREFIX(getAtts)(const ENCODING *enc, const char *ptr,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1390 int attsMax, ATTRIBUTE *atts)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1391 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1392 enum { other, inName, inValue } state = inName;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1393 int nAtts = 0;
348
f50d8b8c512b libjabber: `open' could be used uninitialized in xmltok_impl_c.h
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
1394 int open = 0;
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1395
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1396 for (ptr += MINBPC(enc);; ptr += MINBPC(enc)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1397 switch (BYTE_TYPE(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1398 #define START_NAME \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1399 if (state == other) { \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1400 if (nAtts < attsMax) { \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1401 atts[nAtts].name = ptr; \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1402 atts[nAtts].normalized = 1; \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1403 } \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1404 state = inName; \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1405 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1406 #define LEAD_CASE(n) \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1407 case BT_LEAD ## n: START_NAME ptr += (n - MINBPC(enc)); break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1408 LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1409 #undef LEAD_CASE
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1410 case BT_NONASCII:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1411 case BT_NMSTRT:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1412 case BT_HEX:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1413 START_NAME
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1414 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1415 #undef START_NAME
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1416 case BT_QUOT:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1417 if (state != inValue) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1418 if (nAtts < attsMax)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1419 atts[nAtts].valuePtr = ptr + MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1420 state = inValue;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1421 open = BT_QUOT;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1422 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1423 else if (open == BT_QUOT) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1424 state = other;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1425 if (nAtts < attsMax)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1426 atts[nAtts].valueEnd = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1427 nAtts++;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1428 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1429 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1430 case BT_APOS:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1431 if (state != inValue) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1432 if (nAtts < attsMax)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1433 atts[nAtts].valuePtr = ptr + MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1434 state = inValue;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1435 open = BT_APOS;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1436 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1437 else if (open == BT_APOS) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1438 state = other;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1439 if (nAtts < attsMax)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1440 atts[nAtts].valueEnd = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1441 nAtts++;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1442 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1443 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1444 case BT_AMP:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1445 if (nAtts < attsMax)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1446 atts[nAtts].normalized = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1447 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1448 case BT_S:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1449 if (state == inName)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1450 state = other;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1451 else if (state == inValue
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1452 && nAtts < attsMax
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1453 && atts[nAtts].normalized
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1454 && (ptr == atts[nAtts].valuePtr
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1455 || BYTE_TO_ASCII(enc, ptr) != ' '
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1456 || BYTE_TO_ASCII(enc, ptr + MINBPC(enc)) == ' '
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1457 || BYTE_TYPE(enc, ptr + MINBPC(enc)) == open))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1458 atts[nAtts].normalized = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1459 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1460 case BT_CR: case BT_LF:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1461 /* This case ensures that the first attribute name is counted
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1462 Apart from that we could just change state on the quote. */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1463 if (state == inName)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1464 state = other;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1465 else if (state == inValue && nAtts < attsMax)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1466 atts[nAtts].normalized = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1467 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1468 case BT_GT:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1469 case BT_SOL:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1470 if (state != inValue)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1471 return nAtts;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1472 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1473 default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1474 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1475 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1476 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1477 /* not reached */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1478 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1479
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1480 static
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1481 int PREFIX(charRefNumber)(const ENCODING *enc, const char *ptr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1482 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1483 int result = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1484 /* skip &# */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1485 ptr += 2*MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1486 if (CHAR_MATCHES(enc, ptr, 'x')) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1487 for (ptr += MINBPC(enc); !CHAR_MATCHES(enc, ptr, ';'); ptr += MINBPC(enc)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1488 int c = BYTE_TO_ASCII(enc, ptr);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1489 switch (c) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1490 case '0': case '1': case '2': case '3': case '4':
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1491 case '5': case '6': case '7': case '8': case '9':
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1492 result <<= 4;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1493 result |= (c - '0');
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1494 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1495 case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1496 result <<= 4;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1497 result += 10 + (c - 'A');
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1498 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1499 case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1500 result <<= 4;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1501 result += 10 + (c - 'a');
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1502 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1503 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1504 if (result >= 0x110000)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1505 return -1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1506 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1507 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1508 else {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1509 for (; !CHAR_MATCHES(enc, ptr, ';'); ptr += MINBPC(enc)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1510 int c = BYTE_TO_ASCII(enc, ptr);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1511 result *= 10;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1512 result += (c - '0');
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1513 if (result >= 0x110000)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1514 return -1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1515 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1516 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1517 return checkCharRefNumber(result);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1518 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1519
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1520 static
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1521 int PREFIX(predefinedEntityName)(const ENCODING *enc, const char *ptr, const char *end)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1522 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1523 switch ((end - ptr)/MINBPC(enc)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1524 case 2:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1525 if (CHAR_MATCHES(enc, ptr + MINBPC(enc), 't')) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1526 switch (BYTE_TO_ASCII(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1527 case 'l':
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1528 return '<';
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1529 case 'g':
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1530 return '>';
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1531 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1532 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1533 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1534 case 3:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1535 if (CHAR_MATCHES(enc, ptr, 'a')) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1536 ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1537 if (CHAR_MATCHES(enc, ptr, 'm')) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1538 ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1539 if (CHAR_MATCHES(enc, ptr, 'p'))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1540 return '&';
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1541 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1542 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1543 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1544 case 4:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1545 switch (BYTE_TO_ASCII(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1546 case 'q':
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1547 ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1548 if (CHAR_MATCHES(enc, ptr, 'u')) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1549 ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1550 if (CHAR_MATCHES(enc, ptr, 'o')) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1551 ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1552 if (CHAR_MATCHES(enc, ptr, 't'))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1553 return '"';
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1554 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1555 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1556 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1557 case 'a':
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1558 ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1559 if (CHAR_MATCHES(enc, ptr, 'p')) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1560 ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1561 if (CHAR_MATCHES(enc, ptr, 'o')) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1562 ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1563 if (CHAR_MATCHES(enc, ptr, 's'))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1564 return '\'';
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1565 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1566 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1567 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1568 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1569 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1570 return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1571 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1572
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1573 static
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1574 int PREFIX(sameName)(const ENCODING *enc, const char *ptr1, const char *ptr2)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1575 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1576 for (;;) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1577 switch (BYTE_TYPE(enc, ptr1)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1578 #define LEAD_CASE(n) \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1579 case BT_LEAD ## n: \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1580 if (*ptr1++ != *ptr2++) \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1581 return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1582 LEAD_CASE(4) LEAD_CASE(3) LEAD_CASE(2)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1583 #undef LEAD_CASE
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1584 /* fall through */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1585 if (*ptr1++ != *ptr2++)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1586 return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1587 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1588 case BT_NONASCII:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1589 case BT_NMSTRT:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1590 #ifdef XML_NS
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1591 case BT_COLON:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1592 #endif
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1593 case BT_HEX:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1594 case BT_DIGIT:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1595 case BT_NAME:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1596 case BT_MINUS:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1597 if (*ptr2++ != *ptr1++)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1598 return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1599 if (MINBPC(enc) > 1) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1600 if (*ptr2++ != *ptr1++)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1601 return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1602 if (MINBPC(enc) > 2) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1603 if (*ptr2++ != *ptr1++)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1604 return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1605 if (MINBPC(enc) > 3) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1606 if (*ptr2++ != *ptr1++)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1607 return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1608 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1609 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1610 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1611 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1612 default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1613 if (MINBPC(enc) == 1 && *ptr1 == *ptr2)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1614 return 1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1615 switch (BYTE_TYPE(enc, ptr2)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1616 case BT_LEAD2:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1617 case BT_LEAD3:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1618 case BT_LEAD4:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1619 case BT_NONASCII:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1620 case BT_NMSTRT:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1621 #ifdef XML_NS
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1622 case BT_COLON:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1623 #endif
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1624 case BT_HEX:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1625 case BT_DIGIT:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1626 case BT_NAME:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1627 case BT_MINUS:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1628 return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1629 default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1630 return 1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1631 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1632 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1633 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1634 /* not reached */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1635 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1636
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1637 static
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1638 int PREFIX(nameMatchesAscii)(const ENCODING *enc, const char *ptr1, const char *ptr2)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1639 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1640 for (; *ptr2; ptr1 += MINBPC(enc), ptr2++) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1641 if (!CHAR_MATCHES(enc, ptr1, *ptr2))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1642 return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1643 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1644 switch (BYTE_TYPE(enc, ptr1)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1645 case BT_LEAD2:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1646 case BT_LEAD3:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1647 case BT_LEAD4:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1648 case BT_NONASCII:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1649 case BT_NMSTRT:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1650 #ifdef XML_NS
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1651 case BT_COLON:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1652 #endif
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1653 case BT_HEX:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1654 case BT_DIGIT:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1655 case BT_NAME:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1656 case BT_MINUS:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1657 return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1658 default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1659 return 1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1660 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1661 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1662
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1663 static
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1664 int PREFIX(nameLength)(const ENCODING *enc, const char *ptr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1665 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1666 const char *start = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1667 for (;;) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1668 switch (BYTE_TYPE(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1669 #define LEAD_CASE(n) \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1670 case BT_LEAD ## n: ptr += n; break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1671 LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1672 #undef LEAD_CASE
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1673 case BT_NONASCII:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1674 case BT_NMSTRT:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1675 #ifdef XML_NS
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1676 case BT_COLON:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1677 #endif
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1678 case BT_HEX:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1679 case BT_DIGIT:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1680 case BT_NAME:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1681 case BT_MINUS:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1682 ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1683 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1684 default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1685 return ptr - start;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1686 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1687 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1688 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1689
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1690 static
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1691 const char *PREFIX(skipS)(const ENCODING *enc, const char *ptr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1692 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1693 for (;;) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1694 switch (BYTE_TYPE(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1695 case BT_LF:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1696 case BT_CR:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1697 case BT_S:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1698 ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1699 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1700 default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1701 return ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1702 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1703 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1704 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1705
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1706 static
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1707 void PREFIX(updatePosition)(const ENCODING *enc,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1708 const char *ptr,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1709 const char *end,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1710 POSITION *pos)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1711 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1712 while (ptr != end) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1713 switch (BYTE_TYPE(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1714 #define LEAD_CASE(n) \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1715 case BT_LEAD ## n: \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1716 ptr += n; \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1717 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1718 LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1719 #undef LEAD_CASE
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1720 case BT_LF:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1721 pos->columnNumber = (unsigned)-1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1722 pos->lineNumber++;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1723 ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1724 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1725 case BT_CR:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1726 pos->lineNumber++;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1727 ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1728 if (ptr != end && BYTE_TYPE(enc, ptr) == BT_LF)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1729 ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1730 pos->columnNumber = (unsigned)-1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1731 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1732 default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1733 ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1734 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1735 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1736 pos->columnNumber++;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1737 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1738 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1739
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1740 #undef DO_LEAD_CASE
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1741 #undef MULTIBYTE_CASES
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1742 #undef INVALID_CASES
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1743 #undef CHECK_NAME_CASE
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1744 #undef CHECK_NAME_CASES
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1745 #undef CHECK_NMSTRT_CASE
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1746 #undef CHECK_NMSTRT_CASES