xref: /btstack/3rd-party/yxml/yxml.c (revision c1ab6cc1beb14b16b46e74a3723644016d8c3cc7)
1ed573b14SMatthias Ringwald /* THIS FILE IS AUTOMATICALLY GENERATED, DO NOT EDIT! */
2ed573b14SMatthias Ringwald 
3ed573b14SMatthias Ringwald /* Copyright (c) 2013-2014 Yoran Heling
4ed573b14SMatthias Ringwald 
5ed573b14SMatthias Ringwald   Permission is hereby granted, free of charge, to any person obtaining
6ed573b14SMatthias Ringwald   a copy of this software and associated documentation files (the
7ed573b14SMatthias Ringwald   "Software"), to deal in the Software without restriction, including
8ed573b14SMatthias Ringwald   without limitation the rights to use, copy, modify, merge, publish,
9ed573b14SMatthias Ringwald   distribute, sublicense, and/or sell copies of the Software, and to
10ed573b14SMatthias Ringwald   permit persons to whom the Software is furnished to do so, subject to
11ed573b14SMatthias Ringwald   the following conditions:
12ed573b14SMatthias Ringwald 
13ed573b14SMatthias Ringwald   The above copyright notice and this permission notice shall be included
14ed573b14SMatthias Ringwald   in all copies or substantial portions of the Software.
15ed573b14SMatthias Ringwald 
16ed573b14SMatthias Ringwald   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17ed573b14SMatthias Ringwald   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18ed573b14SMatthias Ringwald   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
19ed573b14SMatthias Ringwald   IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
20ed573b14SMatthias Ringwald   CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
21ed573b14SMatthias Ringwald   TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
22ed573b14SMatthias Ringwald   SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23ed573b14SMatthias Ringwald */
24ed573b14SMatthias Ringwald 
25ed573b14SMatthias Ringwald #include <yxml.h>
26ed573b14SMatthias Ringwald #include <string.h>
27ed573b14SMatthias Ringwald 
28ed573b14SMatthias Ringwald typedef enum {
29ed573b14SMatthias Ringwald 	YXMLS_string,
30ed573b14SMatthias Ringwald 	YXMLS_attr0,
31ed573b14SMatthias Ringwald 	YXMLS_attr1,
32ed573b14SMatthias Ringwald 	YXMLS_attr2,
33ed573b14SMatthias Ringwald 	YXMLS_attr3,
34ed573b14SMatthias Ringwald 	YXMLS_attr4,
35ed573b14SMatthias Ringwald 	YXMLS_cd0,
36ed573b14SMatthias Ringwald 	YXMLS_cd1,
37ed573b14SMatthias Ringwald 	YXMLS_cd2,
38ed573b14SMatthias Ringwald 	YXMLS_comment0,
39ed573b14SMatthias Ringwald 	YXMLS_comment1,
40ed573b14SMatthias Ringwald 	YXMLS_comment2,
41ed573b14SMatthias Ringwald 	YXMLS_comment3,
42ed573b14SMatthias Ringwald 	YXMLS_comment4,
43ed573b14SMatthias Ringwald 	YXMLS_dt0,
44ed573b14SMatthias Ringwald 	YXMLS_dt1,
45ed573b14SMatthias Ringwald 	YXMLS_dt2,
46ed573b14SMatthias Ringwald 	YXMLS_dt3,
47ed573b14SMatthias Ringwald 	YXMLS_dt4,
48ed573b14SMatthias Ringwald 	YXMLS_elem0,
49ed573b14SMatthias Ringwald 	YXMLS_elem1,
50ed573b14SMatthias Ringwald 	YXMLS_elem2,
51ed573b14SMatthias Ringwald 	YXMLS_elem3,
52ed573b14SMatthias Ringwald 	YXMLS_enc0,
53ed573b14SMatthias Ringwald 	YXMLS_enc1,
54ed573b14SMatthias Ringwald 	YXMLS_enc2,
55ed573b14SMatthias Ringwald 	YXMLS_enc3,
56ed573b14SMatthias Ringwald 	YXMLS_etag0,
57ed573b14SMatthias Ringwald 	YXMLS_etag1,
58ed573b14SMatthias Ringwald 	YXMLS_etag2,
59ed573b14SMatthias Ringwald 	YXMLS_init,
60ed573b14SMatthias Ringwald 	YXMLS_le0,
61ed573b14SMatthias Ringwald 	YXMLS_le1,
62ed573b14SMatthias Ringwald 	YXMLS_le2,
63ed573b14SMatthias Ringwald 	YXMLS_le3,
64ed573b14SMatthias Ringwald 	YXMLS_lee1,
65ed573b14SMatthias Ringwald 	YXMLS_lee2,
66ed573b14SMatthias Ringwald 	YXMLS_leq0,
67ed573b14SMatthias Ringwald 	YXMLS_misc0,
68ed573b14SMatthias Ringwald 	YXMLS_misc1,
69ed573b14SMatthias Ringwald 	YXMLS_misc2,
70ed573b14SMatthias Ringwald 	YXMLS_misc2a,
71ed573b14SMatthias Ringwald 	YXMLS_misc3,
72ed573b14SMatthias Ringwald 	YXMLS_pi0,
73ed573b14SMatthias Ringwald 	YXMLS_pi1,
74ed573b14SMatthias Ringwald 	YXMLS_pi2,
75ed573b14SMatthias Ringwald 	YXMLS_pi3,
76ed573b14SMatthias Ringwald 	YXMLS_pi4,
77ed573b14SMatthias Ringwald 	YXMLS_std0,
78ed573b14SMatthias Ringwald 	YXMLS_std1,
79ed573b14SMatthias Ringwald 	YXMLS_std2,
80ed573b14SMatthias Ringwald 	YXMLS_std3,
81ed573b14SMatthias Ringwald 	YXMLS_ver0,
82ed573b14SMatthias Ringwald 	YXMLS_ver1,
83ed573b14SMatthias Ringwald 	YXMLS_ver2,
84ed573b14SMatthias Ringwald 	YXMLS_ver3,
85ed573b14SMatthias Ringwald 	YXMLS_xmldecl0,
86ed573b14SMatthias Ringwald 	YXMLS_xmldecl1,
87ed573b14SMatthias Ringwald 	YXMLS_xmldecl2,
88ed573b14SMatthias Ringwald 	YXMLS_xmldecl3,
89ed573b14SMatthias Ringwald 	YXMLS_xmldecl4,
90ed573b14SMatthias Ringwald 	YXMLS_xmldecl5,
91ed573b14SMatthias Ringwald 	YXMLS_xmldecl6,
92ed573b14SMatthias Ringwald 	YXMLS_xmldecl7,
93ed573b14SMatthias Ringwald 	YXMLS_xmldecl8,
94ed573b14SMatthias Ringwald 	YXMLS_xmldecl9
95ed573b14SMatthias Ringwald } yxml_state_t;
96ed573b14SMatthias Ringwald 
97ed573b14SMatthias Ringwald 
98ed573b14SMatthias Ringwald #define yxml_isChar(c) 1
99ed573b14SMatthias Ringwald /* 0xd should be part of SP, too, but yxml_parse() already normalizes that into 0xa */
100ed573b14SMatthias Ringwald #define yxml_isSP(c) (c == 0x20 || c == 0x09 || c == 0x0a)
101ed573b14SMatthias Ringwald #define yxml_isAlpha(c) ((c|32)-'a' < 26)
102ed573b14SMatthias Ringwald #define yxml_isNum(c) (c-'0' < 10)
103ed573b14SMatthias Ringwald #define yxml_isHex(c) (yxml_isNum(c) || (c|32)-'a' < 6)
104ed573b14SMatthias Ringwald #define yxml_isEncName(c) (yxml_isAlpha(c) || yxml_isNum(c) || c == '.' || c == '_' || c == '-')
105ed573b14SMatthias Ringwald #define yxml_isNameStart(c) (yxml_isAlpha(c) || c == ':' || c == '_' || c >= 128)
106ed573b14SMatthias Ringwald #define yxml_isName(c) (yxml_isNameStart(c) || yxml_isNum(c) || c == '-' || c == '.')
107ed573b14SMatthias Ringwald /* XXX: The valid characters are dependent on the quote char, hence the access to x->quote */
108ed573b14SMatthias Ringwald #define yxml_isAttValue(c) (yxml_isChar(c) && c != x->quote && c != '<' && c != '&')
109ed573b14SMatthias Ringwald /* Anything between '&' and ';', the yxml_ref* functions will do further
110ed573b14SMatthias Ringwald  * validation. Strictly speaking, this is "yxml_isName(c) || c == '#'", but
111ed573b14SMatthias Ringwald  * this parser doesn't understand entities with '.', ':', etc, anwyay.  */
112ed573b14SMatthias Ringwald #define yxml_isRef(c) (yxml_isNum(c) || yxml_isAlpha(c) || c == '#')
113ed573b14SMatthias Ringwald 
114ed573b14SMatthias Ringwald #define INTFROM5CHARS(a, b, c, d, e) ((((uint64_t)(a))<<32) | (((uint64_t)(b))<<24) | (((uint64_t)(c))<<16) | (((uint64_t)(d))<<8) | (uint64_t)(e))
115ed573b14SMatthias Ringwald 
116ed573b14SMatthias Ringwald 
117ed573b14SMatthias Ringwald /* Set the given char value to ch (0<=ch<=255).
118ed573b14SMatthias Ringwald  * This can't be done with simple assignment because char may be signed, and
119ed573b14SMatthias Ringwald  * unsigned-to-signed overflow is implementation defined in C. This function
120ed573b14SMatthias Ringwald  * /looks/ inefficient, but gcc compiles it down to a single movb instruction
121ed573b14SMatthias Ringwald  * on x86, even with -O0. */
122ed573b14SMatthias Ringwald static inline void yxml_setchar(char *dest, unsigned ch) {
123ed573b14SMatthias Ringwald 	unsigned char _ch = ch;
124ed573b14SMatthias Ringwald 	memcpy(dest, &_ch, 1);
125ed573b14SMatthias Ringwald }
126ed573b14SMatthias Ringwald 
127ed573b14SMatthias Ringwald 
128ed573b14SMatthias Ringwald /* Similar to yxml_setchar(), but will convert ch (any valid unicode point) to
129ed573b14SMatthias Ringwald  * UTF-8 and appends a '\0'. dest must have room for at least 5 bytes. */
130ed573b14SMatthias Ringwald static void yxml_setutf8(char *dest, unsigned ch) {
131ed573b14SMatthias Ringwald 	if(ch <= 0x007F)
132ed573b14SMatthias Ringwald 		yxml_setchar(dest++, ch);
133ed573b14SMatthias Ringwald 	else if(ch <= 0x07FF) {
134ed573b14SMatthias Ringwald 		yxml_setchar(dest++, 0xC0 | (ch>>6));
135ed573b14SMatthias Ringwald 		yxml_setchar(dest++, 0x80 | (ch & 0x3F));
136ed573b14SMatthias Ringwald 	} else if(ch <= 0xFFFF) {
137ed573b14SMatthias Ringwald 		yxml_setchar(dest++, 0xE0 | (ch>>12));
138ed573b14SMatthias Ringwald 		yxml_setchar(dest++, 0x80 | ((ch>>6) & 0x3F));
139ed573b14SMatthias Ringwald 		yxml_setchar(dest++, 0x80 | (ch & 0x3F));
140ed573b14SMatthias Ringwald 	} else {
141ed573b14SMatthias Ringwald 		yxml_setchar(dest++, 0xF0 | (ch>>18));
142ed573b14SMatthias Ringwald 		yxml_setchar(dest++, 0x80 | ((ch>>12) & 0x3F));
143ed573b14SMatthias Ringwald 		yxml_setchar(dest++, 0x80 | ((ch>>6) & 0x3F));
144ed573b14SMatthias Ringwald 		yxml_setchar(dest++, 0x80 | (ch & 0x3F));
145ed573b14SMatthias Ringwald 	}
146ed573b14SMatthias Ringwald 	*dest = 0;
147ed573b14SMatthias Ringwald }
148ed573b14SMatthias Ringwald 
149ed573b14SMatthias Ringwald 
150ed573b14SMatthias Ringwald static inline yxml_ret_t yxml_datacontent(yxml_t *x, unsigned ch) {
151ed573b14SMatthias Ringwald 	yxml_setchar(x->data, ch);
152ed573b14SMatthias Ringwald 	x->data[1] = 0;
153ed573b14SMatthias Ringwald 	return YXML_CONTENT;
154ed573b14SMatthias Ringwald }
155ed573b14SMatthias Ringwald 
156ed573b14SMatthias Ringwald 
157ed573b14SMatthias Ringwald static inline yxml_ret_t yxml_datapi1(yxml_t *x, unsigned ch) {
158ed573b14SMatthias Ringwald 	yxml_setchar(x->data, ch);
159ed573b14SMatthias Ringwald 	x->data[1] = 0;
160ed573b14SMatthias Ringwald 	return YXML_PICONTENT;
161ed573b14SMatthias Ringwald }
162ed573b14SMatthias Ringwald 
163ed573b14SMatthias Ringwald 
164ed573b14SMatthias Ringwald static inline yxml_ret_t yxml_datapi2(yxml_t *x, unsigned ch) {
165ed573b14SMatthias Ringwald 	x->data[0] = '?';
166ed573b14SMatthias Ringwald 	yxml_setchar(x->data+1, ch);
167ed573b14SMatthias Ringwald 	x->data[2] = 0;
168ed573b14SMatthias Ringwald 	return YXML_PICONTENT;
169ed573b14SMatthias Ringwald }
170ed573b14SMatthias Ringwald 
171ed573b14SMatthias Ringwald 
172ed573b14SMatthias Ringwald static inline yxml_ret_t yxml_datacd1(yxml_t *x, unsigned ch) {
173ed573b14SMatthias Ringwald 	x->data[0] = ']';
174ed573b14SMatthias Ringwald 	yxml_setchar(x->data+1, ch);
175ed573b14SMatthias Ringwald 	x->data[2] = 0;
176ed573b14SMatthias Ringwald 	return YXML_CONTENT;
177ed573b14SMatthias Ringwald }
178ed573b14SMatthias Ringwald 
179ed573b14SMatthias Ringwald 
180ed573b14SMatthias Ringwald static inline yxml_ret_t yxml_datacd2(yxml_t *x, unsigned ch) {
181ed573b14SMatthias Ringwald 	x->data[0] = ']';
182ed573b14SMatthias Ringwald 	x->data[1] = ']';
183ed573b14SMatthias Ringwald 	yxml_setchar(x->data+2, ch);
184ed573b14SMatthias Ringwald 	x->data[3] = 0;
185ed573b14SMatthias Ringwald 	return YXML_CONTENT;
186ed573b14SMatthias Ringwald }
187ed573b14SMatthias Ringwald 
188ed573b14SMatthias Ringwald 
189ed573b14SMatthias Ringwald static inline yxml_ret_t yxml_dataattr(yxml_t *x, unsigned ch) {
190ed573b14SMatthias Ringwald 	/* Normalize attribute values according to the XML spec section 3.3.3. */
191*c1ab6cc1SMatthias Ringwald 	yxml_setchar(x->data, (ch == 0x9) || (ch == 0xa) ? 0x20 : ch);
192ed573b14SMatthias Ringwald 	x->data[1] = 0;
193ed573b14SMatthias Ringwald 	return YXML_ATTRVAL;
194ed573b14SMatthias Ringwald }
195ed573b14SMatthias Ringwald 
196ed573b14SMatthias Ringwald 
197ed573b14SMatthias Ringwald static yxml_ret_t yxml_pushstack(yxml_t *x, char **res, unsigned ch) {
198*c1ab6cc1SMatthias Ringwald 	if((x->stacklen+2) >= x->stacksize)
199ed573b14SMatthias Ringwald 		return YXML_ESTACK;
200ed573b14SMatthias Ringwald 	x->stacklen++;
201ed573b14SMatthias Ringwald 	*res = (char *)x->stack+x->stacklen;
202ed573b14SMatthias Ringwald 	x->stack[x->stacklen] = ch;
203ed573b14SMatthias Ringwald 	x->stacklen++;
204ed573b14SMatthias Ringwald 	x->stack[x->stacklen] = 0;
205ed573b14SMatthias Ringwald 	return YXML_OK;
206ed573b14SMatthias Ringwald }
207ed573b14SMatthias Ringwald 
208ed573b14SMatthias Ringwald 
209ed573b14SMatthias Ringwald static yxml_ret_t yxml_pushstackc(yxml_t *x, unsigned ch) {
210*c1ab6cc1SMatthias Ringwald 	if((x->stacklen+1) >= x->stacksize)
211ed573b14SMatthias Ringwald 		return YXML_ESTACK;
212ed573b14SMatthias Ringwald 	x->stack[x->stacklen] = ch;
213ed573b14SMatthias Ringwald 	x->stacklen++;
214ed573b14SMatthias Ringwald 	x->stack[x->stacklen] = 0;
215ed573b14SMatthias Ringwald 	return YXML_OK;
216ed573b14SMatthias Ringwald }
217ed573b14SMatthias Ringwald 
218ed573b14SMatthias Ringwald 
219ed573b14SMatthias Ringwald static void yxml_popstack(yxml_t *x) {
220ed573b14SMatthias Ringwald 	do
221ed573b14SMatthias Ringwald 		x->stacklen--;
222ed573b14SMatthias Ringwald 	while(x->stack[x->stacklen]);
223ed573b14SMatthias Ringwald }
224ed573b14SMatthias Ringwald 
225ed573b14SMatthias Ringwald 
226ed573b14SMatthias Ringwald static inline yxml_ret_t yxml_elemstart  (yxml_t *x, unsigned ch) { return yxml_pushstack(x, &x->elem, ch); }
227ed573b14SMatthias Ringwald static inline yxml_ret_t yxml_elemname   (yxml_t *x, unsigned ch) { return yxml_pushstackc(x, ch); }
228177bf6acSMatthias Ringwald static inline yxml_ret_t yxml_elemnameend(yxml_t *x, unsigned ch) { (void) x; (void) ch; return YXML_ELEMSTART; }
229ed573b14SMatthias Ringwald 
230ed573b14SMatthias Ringwald 
231ed573b14SMatthias Ringwald /* Also used in yxml_elemcloseend(), since this function just removes the last
232ed573b14SMatthias Ringwald  * element from the stack and returns ELEMEND. */
233ed573b14SMatthias Ringwald static yxml_ret_t yxml_selfclose(yxml_t *x, unsigned ch) {
234177bf6acSMatthias Ringwald 	(void) ch;
235ed573b14SMatthias Ringwald 	yxml_popstack(x);
236ed573b14SMatthias Ringwald 	if(x->stacklen) {
237ed573b14SMatthias Ringwald 		x->elem = (char *)x->stack+x->stacklen-1;
238ed573b14SMatthias Ringwald 		while(*(x->elem-1))
239ed573b14SMatthias Ringwald 			x->elem--;
240ed573b14SMatthias Ringwald 		return YXML_ELEMEND;
241ed573b14SMatthias Ringwald 	}
242ed573b14SMatthias Ringwald 	x->elem = (char *)x->stack;
243ed573b14SMatthias Ringwald 	x->state = YXMLS_misc3;
244ed573b14SMatthias Ringwald 	return YXML_ELEMEND;
245ed573b14SMatthias Ringwald }
246ed573b14SMatthias Ringwald 
247ed573b14SMatthias Ringwald 
248ed573b14SMatthias Ringwald static inline yxml_ret_t yxml_elemclose(yxml_t *x, unsigned ch) {
249ed573b14SMatthias Ringwald 	if(*((unsigned char *)x->elem) != ch)
250ed573b14SMatthias Ringwald 		return YXML_ECLOSE;
251ed573b14SMatthias Ringwald 	x->elem++;
252ed573b14SMatthias Ringwald 	return YXML_OK;
253ed573b14SMatthias Ringwald }
254ed573b14SMatthias Ringwald 
255ed573b14SMatthias Ringwald 
256ed573b14SMatthias Ringwald static inline yxml_ret_t yxml_elemcloseend(yxml_t *x, unsigned ch) {
257ed573b14SMatthias Ringwald 	if(*x->elem)
258ed573b14SMatthias Ringwald 		return YXML_ECLOSE;
259ed573b14SMatthias Ringwald 	return yxml_selfclose(x, ch);
260ed573b14SMatthias Ringwald }
261ed573b14SMatthias Ringwald 
262ed573b14SMatthias Ringwald 
263ed573b14SMatthias Ringwald static inline yxml_ret_t yxml_attrstart  (yxml_t *x, unsigned ch) { return yxml_pushstack(x, &x->attr, ch); }
264ed573b14SMatthias Ringwald static inline yxml_ret_t yxml_attrname   (yxml_t *x, unsigned ch) { return yxml_pushstackc(x, ch); }
265177bf6acSMatthias Ringwald static inline yxml_ret_t yxml_attrnameend(yxml_t *x, unsigned ch) { (void) x; (void) ch; return YXML_ATTRSTART; }
266177bf6acSMatthias Ringwald static inline yxml_ret_t yxml_attrvalend (yxml_t *x, unsigned ch) { (void) ch; yxml_popstack(x); return YXML_ATTREND; }
267ed573b14SMatthias Ringwald 
268ed573b14SMatthias Ringwald 
269ed573b14SMatthias Ringwald static inline yxml_ret_t yxml_pistart  (yxml_t *x, unsigned ch) { return yxml_pushstack(x, &x->pi, ch); }
270ed573b14SMatthias Ringwald static inline yxml_ret_t yxml_piname   (yxml_t *x, unsigned ch) { return yxml_pushstackc(x, ch); }
271177bf6acSMatthias Ringwald static inline yxml_ret_t yxml_piabort  (yxml_t *x, unsigned ch) { (void) x; (void) ch; yxml_popstack(x); return YXML_OK; }
272177bf6acSMatthias Ringwald static inline yxml_ret_t yxml_pinameend(yxml_t *x, unsigned ch) { (void) ch;
273*c1ab6cc1SMatthias Ringwald 	return ((x->pi[0]|32) == 'x') && ((x->pi[1]|32) == 'm') && ((x->pi[2]|32) == 'l') && !x->pi[3] ? YXML_ESYN : YXML_PISTART;
274ed573b14SMatthias Ringwald }
275177bf6acSMatthias Ringwald static inline yxml_ret_t yxml_pivalend (yxml_t *x, unsigned ch) { (void) ch; yxml_popstack(x); x->pi = (char *)x->stack; return YXML_PIEND; }
276ed573b14SMatthias Ringwald 
277ed573b14SMatthias Ringwald 
278ed573b14SMatthias Ringwald static inline yxml_ret_t yxml_refstart(yxml_t *x, unsigned ch) {
279177bf6acSMatthias Ringwald 	(void) ch;
280ed573b14SMatthias Ringwald 	memset(x->data, 0, sizeof(x->data));
281ed573b14SMatthias Ringwald 	x->reflen = 0;
282ed573b14SMatthias Ringwald 	return YXML_OK;
283ed573b14SMatthias Ringwald }
284ed573b14SMatthias Ringwald 
285ed573b14SMatthias Ringwald 
286ed573b14SMatthias Ringwald static yxml_ret_t yxml_ref(yxml_t *x, unsigned ch) {
287ed573b14SMatthias Ringwald 	if(x->reflen >= sizeof(x->data)-1)
288ed573b14SMatthias Ringwald 		return YXML_EREF;
289ed573b14SMatthias Ringwald 	yxml_setchar(x->data+x->reflen, ch);
290ed573b14SMatthias Ringwald 	x->reflen++;
291ed573b14SMatthias Ringwald 	return YXML_OK;
292ed573b14SMatthias Ringwald }
293ed573b14SMatthias Ringwald 
294ed573b14SMatthias Ringwald 
295ed573b14SMatthias Ringwald static yxml_ret_t yxml_refend(yxml_t *x, yxml_ret_t ret) {
296ed573b14SMatthias Ringwald 	unsigned char *r = (unsigned char *)x->data;
297ed573b14SMatthias Ringwald 	unsigned ch = 0;
298ed573b14SMatthias Ringwald 	if(*r == '#') {
299ed573b14SMatthias Ringwald 		if(r[1] == 'x')
300ed573b14SMatthias Ringwald 			for(r += 2; yxml_isHex((unsigned)*r); r++)
301*c1ab6cc1SMatthias Ringwald 				ch = (ch<<4) + ((*r <= '9') ? (*r-'0') : ((*r|32)-'a' + 10));
302ed573b14SMatthias Ringwald 		else
303ed573b14SMatthias Ringwald 			for(r++; yxml_isNum((unsigned)*r); r++)
304ed573b14SMatthias Ringwald 				ch = (ch*10) + (*r-'0');
305ed573b14SMatthias Ringwald 		if(*r)
306ed573b14SMatthias Ringwald 			ch = 0;
307ed573b14SMatthias Ringwald 	} else {
308ed573b14SMatthias Ringwald 		uint64_t i = INTFROM5CHARS(r[0], r[1], r[2], r[3], r[4]);
309ed573b14SMatthias Ringwald 		ch =
310ed573b14SMatthias Ringwald 			i == INTFROM5CHARS('l','t', 0,  0, 0) ? '<' :
311ed573b14SMatthias Ringwald 			i == INTFROM5CHARS('g','t', 0,  0, 0) ? '>' :
312ed573b14SMatthias Ringwald 			i == INTFROM5CHARS('a','m','p', 0, 0) ? '&' :
313ed573b14SMatthias Ringwald 			i == INTFROM5CHARS('a','p','o','s',0) ? '\'':
314ed573b14SMatthias Ringwald 			i == INTFROM5CHARS('q','u','o','t',0) ? '"' : 0;
315ed573b14SMatthias Ringwald 	}
316ed573b14SMatthias Ringwald 
317ed573b14SMatthias Ringwald 	/* Codepoints not allowed in the XML 1.1 definition of a Char */
318ed573b14SMatthias Ringwald 	if(!ch || ch > 0x10FFFF || ch == 0xFFFE || ch == 0xFFFF || (ch-0xDFFF) < 0x7FF)
319ed573b14SMatthias Ringwald 		return YXML_EREF;
320ed573b14SMatthias Ringwald 	yxml_setutf8(x->data, ch);
321ed573b14SMatthias Ringwald 	return ret;
322ed573b14SMatthias Ringwald }
323ed573b14SMatthias Ringwald 
324ed573b14SMatthias Ringwald 
325177bf6acSMatthias Ringwald static inline yxml_ret_t yxml_refcontent(yxml_t *x, unsigned ch) { (void) ch; return yxml_refend(x, YXML_CONTENT); }
326177bf6acSMatthias Ringwald static inline yxml_ret_t yxml_refattrval(yxml_t *x, unsigned ch) { (void) ch; return yxml_refend(x, YXML_ATTRVAL); }
327ed573b14SMatthias Ringwald 
328ed573b14SMatthias Ringwald 
329ed573b14SMatthias Ringwald void yxml_init(yxml_t *x, void *stack, size_t stacksize) {
330ed573b14SMatthias Ringwald 	memset(x, 0, sizeof(*x));
331ed573b14SMatthias Ringwald 	x->line = 1;
332a788b16cSMilanka Ringwald 	x->stack = (unsigned char *) stack;
333ed573b14SMatthias Ringwald 	x->stacksize = stacksize;
334ed573b14SMatthias Ringwald 	*x->stack = 0;
335ed573b14SMatthias Ringwald 	x->elem = x->pi = x->attr = (char *)x->stack;
336ed573b14SMatthias Ringwald 	x->state = YXMLS_init;
337ed573b14SMatthias Ringwald }
338ed573b14SMatthias Ringwald 
339ed573b14SMatthias Ringwald 
340ed573b14SMatthias Ringwald yxml_ret_t yxml_parse(yxml_t *x, int _ch) {
341ed573b14SMatthias Ringwald 	/* Ensure that characters are in the range of 0..255 rather than -126..125.
342ed573b14SMatthias Ringwald 	 * All character comparisons are done with positive integers. */
343ed573b14SMatthias Ringwald 	unsigned ch = (unsigned)(_ch+256) & 0xff;
344ed573b14SMatthias Ringwald 	if(!ch)
345ed573b14SMatthias Ringwald 		return YXML_ESYN;
346ed573b14SMatthias Ringwald 	x->total++;
347ed573b14SMatthias Ringwald 
348ed573b14SMatthias Ringwald 	/* End-of-Line normalization, "\rX", "\r\n" and "\n" are recognized and
349ed573b14SMatthias Ringwald 	 * normalized to a single '\n' as per XML 1.0 section 2.11. XML 1.1 adds
350ed573b14SMatthias Ringwald 	 * some non-ASCII character sequences to this list, but we can only handle
351ed573b14SMatthias Ringwald 	 * ASCII here without making assumptions about the input encoding. */
352ed573b14SMatthias Ringwald 	if(x->ignore == ch) {
353ed573b14SMatthias Ringwald 		x->ignore = 0;
354ed573b14SMatthias Ringwald 		return YXML_OK;
355ed573b14SMatthias Ringwald 	}
356ed573b14SMatthias Ringwald 	x->ignore = (ch == 0xd) * 0xa;
357*c1ab6cc1SMatthias Ringwald 	if((ch == 0xa) || (ch == 0xd)) {
358ed573b14SMatthias Ringwald 		ch = 0xa;
359ed573b14SMatthias Ringwald 		x->line++;
360ed573b14SMatthias Ringwald 		x->byte = 0;
361ed573b14SMatthias Ringwald 	}
362ed573b14SMatthias Ringwald 	x->byte++;
363ed573b14SMatthias Ringwald 
364ed573b14SMatthias Ringwald 	switch((yxml_state_t)x->state) {
365ed573b14SMatthias Ringwald 	case YXMLS_string:
366ed573b14SMatthias Ringwald 		if(ch == *x->string) {
367ed573b14SMatthias Ringwald 			x->string++;
368ed573b14SMatthias Ringwald 			if(!*x->string)
369ed573b14SMatthias Ringwald 				x->state = x->nextstate;
370ed573b14SMatthias Ringwald 			return YXML_OK;
371ed573b14SMatthias Ringwald 		}
372ed573b14SMatthias Ringwald 		break;
373ed573b14SMatthias Ringwald 	case YXMLS_attr0:
374ed573b14SMatthias Ringwald 		if(yxml_isName(ch))
375ed573b14SMatthias Ringwald 			return yxml_attrname(x, ch);
376ed573b14SMatthias Ringwald 		if(yxml_isSP(ch)) {
377ed573b14SMatthias Ringwald 			x->state = YXMLS_attr1;
378ed573b14SMatthias Ringwald 			return yxml_attrnameend(x, ch);
379ed573b14SMatthias Ringwald 		}
380ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'=') {
381ed573b14SMatthias Ringwald 			x->state = YXMLS_attr2;
382ed573b14SMatthias Ringwald 			return yxml_attrnameend(x, ch);
383ed573b14SMatthias Ringwald 		}
384ed573b14SMatthias Ringwald 		break;
385ed573b14SMatthias Ringwald 	case YXMLS_attr1:
386ed573b14SMatthias Ringwald 		if(yxml_isSP(ch))
387ed573b14SMatthias Ringwald 			return YXML_OK;
388ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'=') {
389ed573b14SMatthias Ringwald 			x->state = YXMLS_attr2;
390ed573b14SMatthias Ringwald 			return YXML_OK;
391ed573b14SMatthias Ringwald 		}
392ed573b14SMatthias Ringwald 		break;
393ed573b14SMatthias Ringwald 	case YXMLS_attr2:
394ed573b14SMatthias Ringwald 		if(yxml_isSP(ch))
395ed573b14SMatthias Ringwald 			return YXML_OK;
396ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'\'' || ch == (unsigned char)'"') {
397ed573b14SMatthias Ringwald 			x->state = YXMLS_attr3;
398ed573b14SMatthias Ringwald 			x->quote = ch;
399ed573b14SMatthias Ringwald 			return YXML_OK;
400ed573b14SMatthias Ringwald 		}
401ed573b14SMatthias Ringwald 		break;
402ed573b14SMatthias Ringwald 	case YXMLS_attr3:
403ed573b14SMatthias Ringwald 		if(yxml_isAttValue(ch))
404ed573b14SMatthias Ringwald 			return yxml_dataattr(x, ch);
405ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'&') {
406ed573b14SMatthias Ringwald 			x->state = YXMLS_attr4;
407ed573b14SMatthias Ringwald 			return yxml_refstart(x, ch);
408ed573b14SMatthias Ringwald 		}
409ed573b14SMatthias Ringwald 		if(x->quote == ch) {
410ed573b14SMatthias Ringwald 			x->state = YXMLS_elem2;
411ed573b14SMatthias Ringwald 			return yxml_attrvalend(x, ch);
412ed573b14SMatthias Ringwald 		}
413ed573b14SMatthias Ringwald 		break;
414ed573b14SMatthias Ringwald 	case YXMLS_attr4:
415ed573b14SMatthias Ringwald 		if(yxml_isRef(ch))
416ed573b14SMatthias Ringwald 			return yxml_ref(x, ch);
417ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'\x3b') {
418ed573b14SMatthias Ringwald 			x->state = YXMLS_attr3;
419ed573b14SMatthias Ringwald 			return yxml_refattrval(x, ch);
420ed573b14SMatthias Ringwald 		}
421ed573b14SMatthias Ringwald 		break;
422ed573b14SMatthias Ringwald 	case YXMLS_cd0:
423ed573b14SMatthias Ringwald 		if(ch == (unsigned char)']') {
424ed573b14SMatthias Ringwald 			x->state = YXMLS_cd1;
425ed573b14SMatthias Ringwald 			return YXML_OK;
426ed573b14SMatthias Ringwald 		}
427ed573b14SMatthias Ringwald 		if(yxml_isChar(ch))
428ed573b14SMatthias Ringwald 			return yxml_datacontent(x, ch);
429ed573b14SMatthias Ringwald 		break;
430ed573b14SMatthias Ringwald 	case YXMLS_cd1:
431ed573b14SMatthias Ringwald 		if(ch == (unsigned char)']') {
432ed573b14SMatthias Ringwald 			x->state = YXMLS_cd2;
433ed573b14SMatthias Ringwald 			return YXML_OK;
434ed573b14SMatthias Ringwald 		}
435ed573b14SMatthias Ringwald 		if(yxml_isChar(ch)) {
436ed573b14SMatthias Ringwald 			x->state = YXMLS_cd0;
437ed573b14SMatthias Ringwald 			return yxml_datacd1(x, ch);
438ed573b14SMatthias Ringwald 		}
439ed573b14SMatthias Ringwald 		break;
440ed573b14SMatthias Ringwald 	case YXMLS_cd2:
441ed573b14SMatthias Ringwald 		if(ch == (unsigned char)']')
442ed573b14SMatthias Ringwald 			return yxml_datacontent(x, ch);
443ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'>') {
444ed573b14SMatthias Ringwald 			x->state = YXMLS_misc2;
445ed573b14SMatthias Ringwald 			return YXML_OK;
446ed573b14SMatthias Ringwald 		}
447ed573b14SMatthias Ringwald 		if(yxml_isChar(ch)) {
448ed573b14SMatthias Ringwald 			x->state = YXMLS_cd0;
449ed573b14SMatthias Ringwald 			return yxml_datacd2(x, ch);
450ed573b14SMatthias Ringwald 		}
451ed573b14SMatthias Ringwald 		break;
452ed573b14SMatthias Ringwald 	case YXMLS_comment0:
453ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'-') {
454ed573b14SMatthias Ringwald 			x->state = YXMLS_comment1;
455ed573b14SMatthias Ringwald 			return YXML_OK;
456ed573b14SMatthias Ringwald 		}
457ed573b14SMatthias Ringwald 		break;
458ed573b14SMatthias Ringwald 	case YXMLS_comment1:
459ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'-') {
460ed573b14SMatthias Ringwald 			x->state = YXMLS_comment2;
461ed573b14SMatthias Ringwald 			return YXML_OK;
462ed573b14SMatthias Ringwald 		}
463ed573b14SMatthias Ringwald 		break;
464ed573b14SMatthias Ringwald 	case YXMLS_comment2:
465ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'-') {
466ed573b14SMatthias Ringwald 			x->state = YXMLS_comment3;
467ed573b14SMatthias Ringwald 			return YXML_OK;
468ed573b14SMatthias Ringwald 		}
469ed573b14SMatthias Ringwald 		if(yxml_isChar(ch))
470ed573b14SMatthias Ringwald 			return YXML_OK;
471ed573b14SMatthias Ringwald 		break;
472ed573b14SMatthias Ringwald 	case YXMLS_comment3:
473ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'-') {
474ed573b14SMatthias Ringwald 			x->state = YXMLS_comment4;
475ed573b14SMatthias Ringwald 			return YXML_OK;
476ed573b14SMatthias Ringwald 		}
477ed573b14SMatthias Ringwald 		if(yxml_isChar(ch)) {
478ed573b14SMatthias Ringwald 			x->state = YXMLS_comment2;
479ed573b14SMatthias Ringwald 			return YXML_OK;
480ed573b14SMatthias Ringwald 		}
481ed573b14SMatthias Ringwald 		break;
482ed573b14SMatthias Ringwald 	case YXMLS_comment4:
483ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'>') {
484ed573b14SMatthias Ringwald 			x->state = x->nextstate;
485ed573b14SMatthias Ringwald 			return YXML_OK;
486ed573b14SMatthias Ringwald 		}
487ed573b14SMatthias Ringwald 		break;
488ed573b14SMatthias Ringwald 	case YXMLS_dt0:
489ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'>') {
490ed573b14SMatthias Ringwald 			x->state = YXMLS_misc1;
491ed573b14SMatthias Ringwald 			return YXML_OK;
492ed573b14SMatthias Ringwald 		}
493ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'\'' || ch == (unsigned char)'"') {
494ed573b14SMatthias Ringwald 			x->state = YXMLS_dt1;
495ed573b14SMatthias Ringwald 			x->quote = ch;
496ed573b14SMatthias Ringwald 			x->nextstate = YXMLS_dt0;
497ed573b14SMatthias Ringwald 			return YXML_OK;
498ed573b14SMatthias Ringwald 		}
499ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'<') {
500ed573b14SMatthias Ringwald 			x->state = YXMLS_dt2;
501ed573b14SMatthias Ringwald 			return YXML_OK;
502ed573b14SMatthias Ringwald 		}
503ed573b14SMatthias Ringwald 		if(yxml_isChar(ch))
504ed573b14SMatthias Ringwald 			return YXML_OK;
505ed573b14SMatthias Ringwald 		break;
506ed573b14SMatthias Ringwald 	case YXMLS_dt1:
507ed573b14SMatthias Ringwald 		if(x->quote == ch) {
508ed573b14SMatthias Ringwald 			x->state = x->nextstate;
509ed573b14SMatthias Ringwald 			return YXML_OK;
510ed573b14SMatthias Ringwald 		}
511ed573b14SMatthias Ringwald 		if(yxml_isChar(ch))
512ed573b14SMatthias Ringwald 			return YXML_OK;
513ed573b14SMatthias Ringwald 		break;
514ed573b14SMatthias Ringwald 	case YXMLS_dt2:
515ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'?') {
516ed573b14SMatthias Ringwald 			x->state = YXMLS_pi0;
517ed573b14SMatthias Ringwald 			x->nextstate = YXMLS_dt0;
518ed573b14SMatthias Ringwald 			return YXML_OK;
519ed573b14SMatthias Ringwald 		}
520ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'!') {
521ed573b14SMatthias Ringwald 			x->state = YXMLS_dt3;
522ed573b14SMatthias Ringwald 			return YXML_OK;
523ed573b14SMatthias Ringwald 		}
524ed573b14SMatthias Ringwald 		break;
525ed573b14SMatthias Ringwald 	case YXMLS_dt3:
526ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'-') {
527ed573b14SMatthias Ringwald 			x->state = YXMLS_comment1;
528ed573b14SMatthias Ringwald 			x->nextstate = YXMLS_dt0;
529ed573b14SMatthias Ringwald 			return YXML_OK;
530ed573b14SMatthias Ringwald 		}
531ed573b14SMatthias Ringwald 		if(yxml_isChar(ch)) {
532ed573b14SMatthias Ringwald 			x->state = YXMLS_dt4;
533ed573b14SMatthias Ringwald 			return YXML_OK;
534ed573b14SMatthias Ringwald 		}
535ed573b14SMatthias Ringwald 		break;
536ed573b14SMatthias Ringwald 	case YXMLS_dt4:
537ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'\'' || ch == (unsigned char)'"') {
538ed573b14SMatthias Ringwald 			x->state = YXMLS_dt1;
539ed573b14SMatthias Ringwald 			x->quote = ch;
540ed573b14SMatthias Ringwald 			x->nextstate = YXMLS_dt4;
541ed573b14SMatthias Ringwald 			return YXML_OK;
542ed573b14SMatthias Ringwald 		}
543ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'>') {
544ed573b14SMatthias Ringwald 			x->state = YXMLS_dt0;
545ed573b14SMatthias Ringwald 			return YXML_OK;
546ed573b14SMatthias Ringwald 		}
547ed573b14SMatthias Ringwald 		if(yxml_isChar(ch))
548ed573b14SMatthias Ringwald 			return YXML_OK;
549ed573b14SMatthias Ringwald 		break;
550ed573b14SMatthias Ringwald 	case YXMLS_elem0:
551ed573b14SMatthias Ringwald 		if(yxml_isName(ch))
552ed573b14SMatthias Ringwald 			return yxml_elemname(x, ch);
553ed573b14SMatthias Ringwald 		if(yxml_isSP(ch)) {
554ed573b14SMatthias Ringwald 			x->state = YXMLS_elem1;
555ed573b14SMatthias Ringwald 			return yxml_elemnameend(x, ch);
556ed573b14SMatthias Ringwald 		}
557ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'/') {
558ed573b14SMatthias Ringwald 			x->state = YXMLS_elem3;
559ed573b14SMatthias Ringwald 			return yxml_elemnameend(x, ch);
560ed573b14SMatthias Ringwald 		}
561ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'>') {
562ed573b14SMatthias Ringwald 			x->state = YXMLS_misc2;
563ed573b14SMatthias Ringwald 			return yxml_elemnameend(x, ch);
564ed573b14SMatthias Ringwald 		}
565ed573b14SMatthias Ringwald 		break;
566ed573b14SMatthias Ringwald 	case YXMLS_elem1:
567ed573b14SMatthias Ringwald 		if(yxml_isSP(ch))
568ed573b14SMatthias Ringwald 			return YXML_OK;
569ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'/') {
570ed573b14SMatthias Ringwald 			x->state = YXMLS_elem3;
571ed573b14SMatthias Ringwald 			return YXML_OK;
572ed573b14SMatthias Ringwald 		}
573ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'>') {
574ed573b14SMatthias Ringwald 			x->state = YXMLS_misc2;
575ed573b14SMatthias Ringwald 			return YXML_OK;
576ed573b14SMatthias Ringwald 		}
577ed573b14SMatthias Ringwald 		if(yxml_isNameStart(ch)) {
578ed573b14SMatthias Ringwald 			x->state = YXMLS_attr0;
579ed573b14SMatthias Ringwald 			return yxml_attrstart(x, ch);
580ed573b14SMatthias Ringwald 		}
581ed573b14SMatthias Ringwald 		break;
582ed573b14SMatthias Ringwald 	case YXMLS_elem2:
583ed573b14SMatthias Ringwald 		if(yxml_isSP(ch)) {
584ed573b14SMatthias Ringwald 			x->state = YXMLS_elem1;
585ed573b14SMatthias Ringwald 			return YXML_OK;
586ed573b14SMatthias Ringwald 		}
587ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'/') {
588ed573b14SMatthias Ringwald 			x->state = YXMLS_elem3;
589ed573b14SMatthias Ringwald 			return YXML_OK;
590ed573b14SMatthias Ringwald 		}
591ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'>') {
592ed573b14SMatthias Ringwald 			x->state = YXMLS_misc2;
593ed573b14SMatthias Ringwald 			return YXML_OK;
594ed573b14SMatthias Ringwald 		}
595ed573b14SMatthias Ringwald 		break;
596ed573b14SMatthias Ringwald 	case YXMLS_elem3:
597ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'>') {
598ed573b14SMatthias Ringwald 			x->state = YXMLS_misc2;
599ed573b14SMatthias Ringwald 			return yxml_selfclose(x, ch);
600ed573b14SMatthias Ringwald 		}
601ed573b14SMatthias Ringwald 		break;
602ed573b14SMatthias Ringwald 	case YXMLS_enc0:
603ed573b14SMatthias Ringwald 		if(yxml_isSP(ch))
604ed573b14SMatthias Ringwald 			return YXML_OK;
605ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'=') {
606ed573b14SMatthias Ringwald 			x->state = YXMLS_enc1;
607ed573b14SMatthias Ringwald 			return YXML_OK;
608ed573b14SMatthias Ringwald 		}
609ed573b14SMatthias Ringwald 		break;
610ed573b14SMatthias Ringwald 	case YXMLS_enc1:
611ed573b14SMatthias Ringwald 		if(yxml_isSP(ch))
612ed573b14SMatthias Ringwald 			return YXML_OK;
613ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'\'' || ch == (unsigned char)'"') {
614ed573b14SMatthias Ringwald 			x->state = YXMLS_enc2;
615ed573b14SMatthias Ringwald 			x->quote = ch;
616ed573b14SMatthias Ringwald 			return YXML_OK;
617ed573b14SMatthias Ringwald 		}
618ed573b14SMatthias Ringwald 		break;
619ed573b14SMatthias Ringwald 	case YXMLS_enc2:
620ed573b14SMatthias Ringwald 		if(yxml_isAlpha(ch)) {
621ed573b14SMatthias Ringwald 			x->state = YXMLS_enc3;
622ed573b14SMatthias Ringwald 			return YXML_OK;
623ed573b14SMatthias Ringwald 		}
624ed573b14SMatthias Ringwald 		break;
625ed573b14SMatthias Ringwald 	case YXMLS_enc3:
626ed573b14SMatthias Ringwald 		if(yxml_isEncName(ch))
627ed573b14SMatthias Ringwald 			return YXML_OK;
628ed573b14SMatthias Ringwald 		if(x->quote == ch) {
629ed573b14SMatthias Ringwald 			x->state = YXMLS_xmldecl6;
630ed573b14SMatthias Ringwald 			return YXML_OK;
631ed573b14SMatthias Ringwald 		}
632ed573b14SMatthias Ringwald 		break;
633ed573b14SMatthias Ringwald 	case YXMLS_etag0:
634ed573b14SMatthias Ringwald 		if(yxml_isNameStart(ch)) {
635ed573b14SMatthias Ringwald 			x->state = YXMLS_etag1;
636ed573b14SMatthias Ringwald 			return yxml_elemclose(x, ch);
637ed573b14SMatthias Ringwald 		}
638ed573b14SMatthias Ringwald 		break;
639ed573b14SMatthias Ringwald 	case YXMLS_etag1:
640ed573b14SMatthias Ringwald 		if(yxml_isName(ch))
641ed573b14SMatthias Ringwald 			return yxml_elemclose(x, ch);
642ed573b14SMatthias Ringwald 		if(yxml_isSP(ch)) {
643ed573b14SMatthias Ringwald 			x->state = YXMLS_etag2;
644ed573b14SMatthias Ringwald 			return yxml_elemcloseend(x, ch);
645ed573b14SMatthias Ringwald 		}
646ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'>') {
647ed573b14SMatthias Ringwald 			x->state = YXMLS_misc2;
648ed573b14SMatthias Ringwald 			return yxml_elemcloseend(x, ch);
649ed573b14SMatthias Ringwald 		}
650ed573b14SMatthias Ringwald 		break;
651ed573b14SMatthias Ringwald 	case YXMLS_etag2:
652ed573b14SMatthias Ringwald 		if(yxml_isSP(ch))
653ed573b14SMatthias Ringwald 			return YXML_OK;
654ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'>') {
655ed573b14SMatthias Ringwald 			x->state = YXMLS_misc2;
656ed573b14SMatthias Ringwald 			return YXML_OK;
657ed573b14SMatthias Ringwald 		}
658ed573b14SMatthias Ringwald 		break;
659ed573b14SMatthias Ringwald 	case YXMLS_init:
660ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'\xef') {
661ed573b14SMatthias Ringwald 			x->state = YXMLS_string;
662ed573b14SMatthias Ringwald 			x->nextstate = YXMLS_misc0;
663ed573b14SMatthias Ringwald 			x->string = (unsigned char *)"\xbb\xbf";
664ed573b14SMatthias Ringwald 			return YXML_OK;
665ed573b14SMatthias Ringwald 		}
666ed573b14SMatthias Ringwald 		if(yxml_isSP(ch)) {
667ed573b14SMatthias Ringwald 			x->state = YXMLS_misc0;
668ed573b14SMatthias Ringwald 			return YXML_OK;
669ed573b14SMatthias Ringwald 		}
670ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'<') {
671ed573b14SMatthias Ringwald 			x->state = YXMLS_le0;
672ed573b14SMatthias Ringwald 			return YXML_OK;
673ed573b14SMatthias Ringwald 		}
674ed573b14SMatthias Ringwald 		break;
675ed573b14SMatthias Ringwald 	case YXMLS_le0:
676ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'!') {
677ed573b14SMatthias Ringwald 			x->state = YXMLS_lee1;
678ed573b14SMatthias Ringwald 			return YXML_OK;
679ed573b14SMatthias Ringwald 		}
680ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'?') {
681ed573b14SMatthias Ringwald 			x->state = YXMLS_leq0;
682ed573b14SMatthias Ringwald 			return YXML_OK;
683ed573b14SMatthias Ringwald 		}
684ed573b14SMatthias Ringwald 		if(yxml_isNameStart(ch)) {
685ed573b14SMatthias Ringwald 			x->state = YXMLS_elem0;
686ed573b14SMatthias Ringwald 			return yxml_elemstart(x, ch);
687ed573b14SMatthias Ringwald 		}
688ed573b14SMatthias Ringwald 		break;
689ed573b14SMatthias Ringwald 	case YXMLS_le1:
690ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'!') {
691ed573b14SMatthias Ringwald 			x->state = YXMLS_lee1;
692ed573b14SMatthias Ringwald 			return YXML_OK;
693ed573b14SMatthias Ringwald 		}
694ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'?') {
695ed573b14SMatthias Ringwald 			x->state = YXMLS_pi0;
696ed573b14SMatthias Ringwald 			x->nextstate = YXMLS_misc1;
697ed573b14SMatthias Ringwald 			return YXML_OK;
698ed573b14SMatthias Ringwald 		}
699ed573b14SMatthias Ringwald 		if(yxml_isNameStart(ch)) {
700ed573b14SMatthias Ringwald 			x->state = YXMLS_elem0;
701ed573b14SMatthias Ringwald 			return yxml_elemstart(x, ch);
702ed573b14SMatthias Ringwald 		}
703ed573b14SMatthias Ringwald 		break;
704ed573b14SMatthias Ringwald 	case YXMLS_le2:
705ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'!') {
706ed573b14SMatthias Ringwald 			x->state = YXMLS_lee2;
707ed573b14SMatthias Ringwald 			return YXML_OK;
708ed573b14SMatthias Ringwald 		}
709ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'?') {
710ed573b14SMatthias Ringwald 			x->state = YXMLS_pi0;
711ed573b14SMatthias Ringwald 			x->nextstate = YXMLS_misc2;
712ed573b14SMatthias Ringwald 			return YXML_OK;
713ed573b14SMatthias Ringwald 		}
714ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'/') {
715ed573b14SMatthias Ringwald 			x->state = YXMLS_etag0;
716ed573b14SMatthias Ringwald 			return YXML_OK;
717ed573b14SMatthias Ringwald 		}
718ed573b14SMatthias Ringwald 		if(yxml_isNameStart(ch)) {
719ed573b14SMatthias Ringwald 			x->state = YXMLS_elem0;
720ed573b14SMatthias Ringwald 			return yxml_elemstart(x, ch);
721ed573b14SMatthias Ringwald 		}
722ed573b14SMatthias Ringwald 		break;
723ed573b14SMatthias Ringwald 	case YXMLS_le3:
724ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'!') {
725ed573b14SMatthias Ringwald 			x->state = YXMLS_comment0;
726ed573b14SMatthias Ringwald 			x->nextstate = YXMLS_misc3;
727ed573b14SMatthias Ringwald 			return YXML_OK;
728ed573b14SMatthias Ringwald 		}
729ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'?') {
730ed573b14SMatthias Ringwald 			x->state = YXMLS_pi0;
731ed573b14SMatthias Ringwald 			x->nextstate = YXMLS_misc3;
732ed573b14SMatthias Ringwald 			return YXML_OK;
733ed573b14SMatthias Ringwald 		}
734ed573b14SMatthias Ringwald 		break;
735ed573b14SMatthias Ringwald 	case YXMLS_lee1:
736ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'-') {
737ed573b14SMatthias Ringwald 			x->state = YXMLS_comment1;
738ed573b14SMatthias Ringwald 			x->nextstate = YXMLS_misc1;
739ed573b14SMatthias Ringwald 			return YXML_OK;
740ed573b14SMatthias Ringwald 		}
741ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'D') {
742ed573b14SMatthias Ringwald 			x->state = YXMLS_string;
743ed573b14SMatthias Ringwald 			x->nextstate = YXMLS_dt0;
744ed573b14SMatthias Ringwald 			x->string = (unsigned char *)"OCTYPE";
745ed573b14SMatthias Ringwald 			return YXML_OK;
746ed573b14SMatthias Ringwald 		}
747ed573b14SMatthias Ringwald 		break;
748ed573b14SMatthias Ringwald 	case YXMLS_lee2:
749ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'-') {
750ed573b14SMatthias Ringwald 			x->state = YXMLS_comment1;
751ed573b14SMatthias Ringwald 			x->nextstate = YXMLS_misc2;
752ed573b14SMatthias Ringwald 			return YXML_OK;
753ed573b14SMatthias Ringwald 		}
754ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'[') {
755ed573b14SMatthias Ringwald 			x->state = YXMLS_string;
756ed573b14SMatthias Ringwald 			x->nextstate = YXMLS_cd0;
757ed573b14SMatthias Ringwald 			x->string = (unsigned char *)"CDATA[";
758ed573b14SMatthias Ringwald 			return YXML_OK;
759ed573b14SMatthias Ringwald 		}
760ed573b14SMatthias Ringwald 		break;
761ed573b14SMatthias Ringwald 	case YXMLS_leq0:
762ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'x') {
763ed573b14SMatthias Ringwald 			x->state = YXMLS_xmldecl0;
764ed573b14SMatthias Ringwald 			x->nextstate = YXMLS_misc1;
765ed573b14SMatthias Ringwald 			return yxml_pistart(x, ch);
766ed573b14SMatthias Ringwald 		}
767ed573b14SMatthias Ringwald 		if(yxml_isNameStart(ch)) {
768ed573b14SMatthias Ringwald 			x->state = YXMLS_pi1;
769ed573b14SMatthias Ringwald 			x->nextstate = YXMLS_misc1;
770ed573b14SMatthias Ringwald 			return yxml_pistart(x, ch);
771ed573b14SMatthias Ringwald 		}
772ed573b14SMatthias Ringwald 		break;
773ed573b14SMatthias Ringwald 	case YXMLS_misc0:
774ed573b14SMatthias Ringwald 		if(yxml_isSP(ch))
775ed573b14SMatthias Ringwald 			return YXML_OK;
776ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'<') {
777ed573b14SMatthias Ringwald 			x->state = YXMLS_le0;
778ed573b14SMatthias Ringwald 			return YXML_OK;
779ed573b14SMatthias Ringwald 		}
780ed573b14SMatthias Ringwald 		break;
781ed573b14SMatthias Ringwald 	case YXMLS_misc1:
782ed573b14SMatthias Ringwald 		if(yxml_isSP(ch))
783ed573b14SMatthias Ringwald 			return YXML_OK;
784ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'<') {
785ed573b14SMatthias Ringwald 			x->state = YXMLS_le1;
786ed573b14SMatthias Ringwald 			return YXML_OK;
787ed573b14SMatthias Ringwald 		}
788ed573b14SMatthias Ringwald 		break;
789ed573b14SMatthias Ringwald 	case YXMLS_misc2:
790ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'<') {
791ed573b14SMatthias Ringwald 			x->state = YXMLS_le2;
792ed573b14SMatthias Ringwald 			return YXML_OK;
793ed573b14SMatthias Ringwald 		}
794ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'&') {
795ed573b14SMatthias Ringwald 			x->state = YXMLS_misc2a;
796ed573b14SMatthias Ringwald 			return yxml_refstart(x, ch);
797ed573b14SMatthias Ringwald 		}
798ed573b14SMatthias Ringwald 		if(yxml_isChar(ch))
799ed573b14SMatthias Ringwald 			return yxml_datacontent(x, ch);
800ed573b14SMatthias Ringwald 		break;
801ed573b14SMatthias Ringwald 	case YXMLS_misc2a:
802ed573b14SMatthias Ringwald 		if(yxml_isRef(ch))
803ed573b14SMatthias Ringwald 			return yxml_ref(x, ch);
804ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'\x3b') {
805ed573b14SMatthias Ringwald 			x->state = YXMLS_misc2;
806ed573b14SMatthias Ringwald 			return yxml_refcontent(x, ch);
807ed573b14SMatthias Ringwald 		}
808ed573b14SMatthias Ringwald 		break;
809ed573b14SMatthias Ringwald 	case YXMLS_misc3:
810ed573b14SMatthias Ringwald 		if(yxml_isSP(ch))
811ed573b14SMatthias Ringwald 			return YXML_OK;
812ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'<') {
813ed573b14SMatthias Ringwald 			x->state = YXMLS_le3;
814ed573b14SMatthias Ringwald 			return YXML_OK;
815ed573b14SMatthias Ringwald 		}
816ed573b14SMatthias Ringwald 		break;
817ed573b14SMatthias Ringwald 	case YXMLS_pi0:
818ed573b14SMatthias Ringwald 		if(yxml_isNameStart(ch)) {
819ed573b14SMatthias Ringwald 			x->state = YXMLS_pi1;
820ed573b14SMatthias Ringwald 			return yxml_pistart(x, ch);
821ed573b14SMatthias Ringwald 		}
822ed573b14SMatthias Ringwald 		break;
823ed573b14SMatthias Ringwald 	case YXMLS_pi1:
824ed573b14SMatthias Ringwald 		if(yxml_isName(ch))
825ed573b14SMatthias Ringwald 			return yxml_piname(x, ch);
826ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'?') {
827ed573b14SMatthias Ringwald 			x->state = YXMLS_pi4;
828ed573b14SMatthias Ringwald 			return yxml_pinameend(x, ch);
829ed573b14SMatthias Ringwald 		}
830ed573b14SMatthias Ringwald 		if(yxml_isSP(ch)) {
831ed573b14SMatthias Ringwald 			x->state = YXMLS_pi2;
832ed573b14SMatthias Ringwald 			return yxml_pinameend(x, ch);
833ed573b14SMatthias Ringwald 		}
834ed573b14SMatthias Ringwald 		break;
835ed573b14SMatthias Ringwald 	case YXMLS_pi2:
836ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'?') {
837ed573b14SMatthias Ringwald 			x->state = YXMLS_pi3;
838ed573b14SMatthias Ringwald 			return YXML_OK;
839ed573b14SMatthias Ringwald 		}
840ed573b14SMatthias Ringwald 		if(yxml_isChar(ch))
841ed573b14SMatthias Ringwald 			return yxml_datapi1(x, ch);
842ed573b14SMatthias Ringwald 		break;
843ed573b14SMatthias Ringwald 	case YXMLS_pi3:
844ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'>') {
845ed573b14SMatthias Ringwald 			x->state = x->nextstate;
846ed573b14SMatthias Ringwald 			return yxml_pivalend(x, ch);
847ed573b14SMatthias Ringwald 		}
848ed573b14SMatthias Ringwald 		if(yxml_isChar(ch)) {
849ed573b14SMatthias Ringwald 			x->state = YXMLS_pi2;
850ed573b14SMatthias Ringwald 			return yxml_datapi2(x, ch);
851ed573b14SMatthias Ringwald 		}
852ed573b14SMatthias Ringwald 		break;
853ed573b14SMatthias Ringwald 	case YXMLS_pi4:
854ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'>') {
855ed573b14SMatthias Ringwald 			x->state = x->nextstate;
856ed573b14SMatthias Ringwald 			return yxml_pivalend(x, ch);
857ed573b14SMatthias Ringwald 		}
858ed573b14SMatthias Ringwald 		break;
859ed573b14SMatthias Ringwald 	case YXMLS_std0:
860ed573b14SMatthias Ringwald 		if(yxml_isSP(ch))
861ed573b14SMatthias Ringwald 			return YXML_OK;
862ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'=') {
863ed573b14SMatthias Ringwald 			x->state = YXMLS_std1;
864ed573b14SMatthias Ringwald 			return YXML_OK;
865ed573b14SMatthias Ringwald 		}
866ed573b14SMatthias Ringwald 		break;
867ed573b14SMatthias Ringwald 	case YXMLS_std1:
868ed573b14SMatthias Ringwald 		if(yxml_isSP(ch))
869ed573b14SMatthias Ringwald 			return YXML_OK;
870ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'\'' || ch == (unsigned char)'"') {
871ed573b14SMatthias Ringwald 			x->state = YXMLS_std2;
872ed573b14SMatthias Ringwald 			x->quote = ch;
873ed573b14SMatthias Ringwald 			return YXML_OK;
874ed573b14SMatthias Ringwald 		}
875ed573b14SMatthias Ringwald 		break;
876ed573b14SMatthias Ringwald 	case YXMLS_std2:
877ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'y') {
878ed573b14SMatthias Ringwald 			x->state = YXMLS_string;
879ed573b14SMatthias Ringwald 			x->nextstate = YXMLS_std3;
880ed573b14SMatthias Ringwald 			x->string = (unsigned char *)"es";
881ed573b14SMatthias Ringwald 			return YXML_OK;
882ed573b14SMatthias Ringwald 		}
883ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'n') {
884ed573b14SMatthias Ringwald 			x->state = YXMLS_string;
885ed573b14SMatthias Ringwald 			x->nextstate = YXMLS_std3;
886ed573b14SMatthias Ringwald 			x->string = (unsigned char *)"o";
887ed573b14SMatthias Ringwald 			return YXML_OK;
888ed573b14SMatthias Ringwald 		}
889ed573b14SMatthias Ringwald 		break;
890ed573b14SMatthias Ringwald 	case YXMLS_std3:
891ed573b14SMatthias Ringwald 		if(x->quote == ch) {
892ed573b14SMatthias Ringwald 			x->state = YXMLS_xmldecl8;
893ed573b14SMatthias Ringwald 			return YXML_OK;
894ed573b14SMatthias Ringwald 		}
895ed573b14SMatthias Ringwald 		break;
896ed573b14SMatthias Ringwald 	case YXMLS_ver0:
897ed573b14SMatthias Ringwald 		if(yxml_isSP(ch))
898ed573b14SMatthias Ringwald 			return YXML_OK;
899ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'=') {
900ed573b14SMatthias Ringwald 			x->state = YXMLS_ver1;
901ed573b14SMatthias Ringwald 			return YXML_OK;
902ed573b14SMatthias Ringwald 		}
903ed573b14SMatthias Ringwald 		break;
904ed573b14SMatthias Ringwald 	case YXMLS_ver1:
905ed573b14SMatthias Ringwald 		if(yxml_isSP(ch))
906ed573b14SMatthias Ringwald 			return YXML_OK;
907ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'\'' || ch == (unsigned char)'"') {
908ed573b14SMatthias Ringwald 			x->state = YXMLS_string;
909ed573b14SMatthias Ringwald 			x->quote = ch;
910ed573b14SMatthias Ringwald 			x->nextstate = YXMLS_ver2;
911ed573b14SMatthias Ringwald 			x->string = (unsigned char *)"1.";
912ed573b14SMatthias Ringwald 			return YXML_OK;
913ed573b14SMatthias Ringwald 		}
914ed573b14SMatthias Ringwald 		break;
915ed573b14SMatthias Ringwald 	case YXMLS_ver2:
916ed573b14SMatthias Ringwald 		if(yxml_isNum(ch)) {
917ed573b14SMatthias Ringwald 			x->state = YXMLS_ver3;
918ed573b14SMatthias Ringwald 			return YXML_OK;
919ed573b14SMatthias Ringwald 		}
920ed573b14SMatthias Ringwald 		break;
921ed573b14SMatthias Ringwald 	case YXMLS_ver3:
922ed573b14SMatthias Ringwald 		if(yxml_isNum(ch))
923ed573b14SMatthias Ringwald 			return YXML_OK;
924ed573b14SMatthias Ringwald 		if(x->quote == ch) {
925ed573b14SMatthias Ringwald 			x->state = YXMLS_xmldecl4;
926ed573b14SMatthias Ringwald 			return YXML_OK;
927ed573b14SMatthias Ringwald 		}
928ed573b14SMatthias Ringwald 		break;
929ed573b14SMatthias Ringwald 	case YXMLS_xmldecl0:
930ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'m') {
931ed573b14SMatthias Ringwald 			x->state = YXMLS_xmldecl1;
932ed573b14SMatthias Ringwald 			return yxml_piname(x, ch);
933ed573b14SMatthias Ringwald 		}
934ed573b14SMatthias Ringwald 		if(yxml_isName(ch)) {
935ed573b14SMatthias Ringwald 			x->state = YXMLS_pi1;
936ed573b14SMatthias Ringwald 			return yxml_piname(x, ch);
937ed573b14SMatthias Ringwald 		}
938ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'?') {
939ed573b14SMatthias Ringwald 			x->state = YXMLS_pi4;
940ed573b14SMatthias Ringwald 			return yxml_pinameend(x, ch);
941ed573b14SMatthias Ringwald 		}
942ed573b14SMatthias Ringwald 		if(yxml_isSP(ch)) {
943ed573b14SMatthias Ringwald 			x->state = YXMLS_pi2;
944ed573b14SMatthias Ringwald 			return yxml_pinameend(x, ch);
945ed573b14SMatthias Ringwald 		}
946ed573b14SMatthias Ringwald 		break;
947ed573b14SMatthias Ringwald 	case YXMLS_xmldecl1:
948ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'l') {
949ed573b14SMatthias Ringwald 			x->state = YXMLS_xmldecl2;
950ed573b14SMatthias Ringwald 			return yxml_piname(x, ch);
951ed573b14SMatthias Ringwald 		}
952ed573b14SMatthias Ringwald 		if(yxml_isName(ch)) {
953ed573b14SMatthias Ringwald 			x->state = YXMLS_pi1;
954ed573b14SMatthias Ringwald 			return yxml_piname(x, ch);
955ed573b14SMatthias Ringwald 		}
956ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'?') {
957ed573b14SMatthias Ringwald 			x->state = YXMLS_pi4;
958ed573b14SMatthias Ringwald 			return yxml_pinameend(x, ch);
959ed573b14SMatthias Ringwald 		}
960ed573b14SMatthias Ringwald 		if(yxml_isSP(ch)) {
961ed573b14SMatthias Ringwald 			x->state = YXMLS_pi2;
962ed573b14SMatthias Ringwald 			return yxml_pinameend(x, ch);
963ed573b14SMatthias Ringwald 		}
964ed573b14SMatthias Ringwald 		break;
965ed573b14SMatthias Ringwald 	case YXMLS_xmldecl2:
966ed573b14SMatthias Ringwald 		if(yxml_isSP(ch)) {
967ed573b14SMatthias Ringwald 			x->state = YXMLS_xmldecl3;
968ed573b14SMatthias Ringwald 			return yxml_piabort(x, ch);
969ed573b14SMatthias Ringwald 		}
970ed573b14SMatthias Ringwald 		if(yxml_isName(ch)) {
971ed573b14SMatthias Ringwald 			x->state = YXMLS_pi1;
972ed573b14SMatthias Ringwald 			return yxml_piname(x, ch);
973ed573b14SMatthias Ringwald 		}
974ed573b14SMatthias Ringwald 		break;
975ed573b14SMatthias Ringwald 	case YXMLS_xmldecl3:
976ed573b14SMatthias Ringwald 		if(yxml_isSP(ch))
977ed573b14SMatthias Ringwald 			return YXML_OK;
978ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'v') {
979ed573b14SMatthias Ringwald 			x->state = YXMLS_string;
980ed573b14SMatthias Ringwald 			x->nextstate = YXMLS_ver0;
981ed573b14SMatthias Ringwald 			x->string = (unsigned char *)"ersion";
982ed573b14SMatthias Ringwald 			return YXML_OK;
983ed573b14SMatthias Ringwald 		}
984ed573b14SMatthias Ringwald 		break;
985ed573b14SMatthias Ringwald 	case YXMLS_xmldecl4:
986ed573b14SMatthias Ringwald 		if(yxml_isSP(ch)) {
987ed573b14SMatthias Ringwald 			x->state = YXMLS_xmldecl5;
988ed573b14SMatthias Ringwald 			return YXML_OK;
989ed573b14SMatthias Ringwald 		}
990ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'?') {
991ed573b14SMatthias Ringwald 			x->state = YXMLS_xmldecl9;
992ed573b14SMatthias Ringwald 			return YXML_OK;
993ed573b14SMatthias Ringwald 		}
994ed573b14SMatthias Ringwald 		break;
995ed573b14SMatthias Ringwald 	case YXMLS_xmldecl5:
996ed573b14SMatthias Ringwald 		if(yxml_isSP(ch))
997ed573b14SMatthias Ringwald 			return YXML_OK;
998ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'?') {
999ed573b14SMatthias Ringwald 			x->state = YXMLS_xmldecl9;
1000ed573b14SMatthias Ringwald 			return YXML_OK;
1001ed573b14SMatthias Ringwald 		}
1002ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'e') {
1003ed573b14SMatthias Ringwald 			x->state = YXMLS_string;
1004ed573b14SMatthias Ringwald 			x->nextstate = YXMLS_enc0;
1005ed573b14SMatthias Ringwald 			x->string = (unsigned char *)"ncoding";
1006ed573b14SMatthias Ringwald 			return YXML_OK;
1007ed573b14SMatthias Ringwald 		}
1008ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'s') {
1009ed573b14SMatthias Ringwald 			x->state = YXMLS_string;
1010ed573b14SMatthias Ringwald 			x->nextstate = YXMLS_std0;
1011ed573b14SMatthias Ringwald 			x->string = (unsigned char *)"tandalone";
1012ed573b14SMatthias Ringwald 			return YXML_OK;
1013ed573b14SMatthias Ringwald 		}
1014ed573b14SMatthias Ringwald 		break;
1015ed573b14SMatthias Ringwald 	case YXMLS_xmldecl6:
1016ed573b14SMatthias Ringwald 		if(yxml_isSP(ch)) {
1017ed573b14SMatthias Ringwald 			x->state = YXMLS_xmldecl7;
1018ed573b14SMatthias Ringwald 			return YXML_OK;
1019ed573b14SMatthias Ringwald 		}
1020ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'?') {
1021ed573b14SMatthias Ringwald 			x->state = YXMLS_xmldecl9;
1022ed573b14SMatthias Ringwald 			return YXML_OK;
1023ed573b14SMatthias Ringwald 		}
1024ed573b14SMatthias Ringwald 		break;
1025ed573b14SMatthias Ringwald 	case YXMLS_xmldecl7:
1026ed573b14SMatthias Ringwald 		if(yxml_isSP(ch))
1027ed573b14SMatthias Ringwald 			return YXML_OK;
1028ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'?') {
1029ed573b14SMatthias Ringwald 			x->state = YXMLS_xmldecl9;
1030ed573b14SMatthias Ringwald 			return YXML_OK;
1031ed573b14SMatthias Ringwald 		}
1032ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'s') {
1033ed573b14SMatthias Ringwald 			x->state = YXMLS_string;
1034ed573b14SMatthias Ringwald 			x->nextstate = YXMLS_std0;
1035ed573b14SMatthias Ringwald 			x->string = (unsigned char *)"tandalone";
1036ed573b14SMatthias Ringwald 			return YXML_OK;
1037ed573b14SMatthias Ringwald 		}
1038ed573b14SMatthias Ringwald 		break;
1039ed573b14SMatthias Ringwald 	case YXMLS_xmldecl8:
1040ed573b14SMatthias Ringwald 		if(yxml_isSP(ch))
1041ed573b14SMatthias Ringwald 			return YXML_OK;
1042ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'?') {
1043ed573b14SMatthias Ringwald 			x->state = YXMLS_xmldecl9;
1044ed573b14SMatthias Ringwald 			return YXML_OK;
1045ed573b14SMatthias Ringwald 		}
1046ed573b14SMatthias Ringwald 		break;
1047ed573b14SMatthias Ringwald 	case YXMLS_xmldecl9:
1048ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'>') {
1049ed573b14SMatthias Ringwald 			x->state = YXMLS_misc1;
1050ed573b14SMatthias Ringwald 			return YXML_OK;
1051ed573b14SMatthias Ringwald 		}
1052ed573b14SMatthias Ringwald 		break;
1053ed573b14SMatthias Ringwald 	}
1054ed573b14SMatthias Ringwald 	return YXML_ESYN;
1055ed573b14SMatthias Ringwald }
1056ed573b14SMatthias Ringwald 
1057ed573b14SMatthias Ringwald 
1058ed573b14SMatthias Ringwald yxml_ret_t yxml_eof(yxml_t *x) {
1059ed573b14SMatthias Ringwald 	if(x->state != YXMLS_misc3)
1060ed573b14SMatthias Ringwald 		return YXML_EEOF;
1061ed573b14SMatthias Ringwald 	return YXML_OK;
1062ed573b14SMatthias Ringwald }
1063ed573b14SMatthias Ringwald 
1064ed573b14SMatthias Ringwald 
1065ed573b14SMatthias Ringwald /* vim: set noet sw=4 ts=4: */
1066