xref: /btstack/3rd-party/yxml/yxml.c (revision 7bbeb3ad8cec0c1816689843bf9383cf4c644ef8)
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 */
10027bcc36fSMatthias Ringwald #define yxml_isSP(c) ((c == 0x20) || (c == 0x09) || (c == 0x0a))
10127bcc36fSMatthias Ringwald #define yxml_isAlpha(c) ( ((c|32)-'a') < 26)
10227bcc36fSMatthias Ringwald #define yxml_isNum(c) ((c-'0') < 10)
103b3f3a010SMatthias Ringwald #define yxml_isHex(c) (yxml_isNum(c) || (((c|32)-'a') < 6))
10427bcc36fSMatthias Ringwald #define yxml_isEncName(c) (yxml_isAlpha(c) || yxml_isNum(c) || (c == '.') || (c == '_') || (c == '-'))
10527bcc36fSMatthias Ringwald #define yxml_isNameStart(c) (yxml_isAlpha(c) || (c == ':') || (c == '_') || (c >= 128))
10627bcc36fSMatthias 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 */
10827bcc36fSMatthias 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.  */
11227bcc36fSMatthias 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. */
yxml_setchar(char * dest,unsigned ch)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. */
yxml_setutf8(char * dest,unsigned ch)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 
yxml_datacontent(yxml_t * x,unsigned ch)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 
yxml_datapi1(yxml_t * x,unsigned ch)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 
yxml_datapi2(yxml_t * x,unsigned ch)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 
yxml_datacd1(yxml_t * x,unsigned ch)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 
yxml_datacd2(yxml_t * x,unsigned ch)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 
yxml_dataattr(yxml_t * x,unsigned ch)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. */
1915df9dc78SMatthias 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 
yxml_pushstack(yxml_t * x,char ** res,unsigned ch)197ed573b14SMatthias Ringwald static yxml_ret_t yxml_pushstack(yxml_t *x, char **res, unsigned ch) {
198c1ab6cc1SMatthias 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 
yxml_pushstackc(yxml_t * x,unsigned ch)209ed573b14SMatthias Ringwald static yxml_ret_t yxml_pushstackc(yxml_t *x, unsigned ch) {
210c1ab6cc1SMatthias 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 
yxml_popstack(yxml_t * x)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 
yxml_elemstart(yxml_t * x,unsigned ch)226ed573b14SMatthias Ringwald static inline yxml_ret_t yxml_elemstart  (yxml_t *x, unsigned ch) { return yxml_pushstack(x, &x->elem, ch); }
yxml_elemname(yxml_t * x,unsigned ch)227ed573b14SMatthias Ringwald static inline yxml_ret_t yxml_elemname   (yxml_t *x, unsigned ch) { return yxml_pushstackc(x, ch); }
yxml_elemnameend(yxml_t * x,unsigned 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. */
yxml_selfclose(yxml_t * x,unsigned ch)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 
yxml_elemclose(yxml_t * x,unsigned ch)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 
yxml_elemcloseend(yxml_t * x,unsigned ch)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 
yxml_attrstart(yxml_t * x,unsigned ch)263ed573b14SMatthias Ringwald static inline yxml_ret_t yxml_attrstart  (yxml_t *x, unsigned ch) { return yxml_pushstack(x, &x->attr, ch); }
yxml_attrname(yxml_t * x,unsigned ch)264ed573b14SMatthias Ringwald static inline yxml_ret_t yxml_attrname   (yxml_t *x, unsigned ch) { return yxml_pushstackc(x, ch); }
yxml_attrnameend(yxml_t * x,unsigned ch)265177bf6acSMatthias Ringwald static inline yxml_ret_t yxml_attrnameend(yxml_t *x, unsigned ch) { (void) x; (void) ch; return YXML_ATTRSTART; }
yxml_attrvalend(yxml_t * x,unsigned ch)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 
yxml_pistart(yxml_t * x,unsigned ch)269ed573b14SMatthias Ringwald static inline yxml_ret_t yxml_pistart  (yxml_t *x, unsigned ch) { return yxml_pushstack(x, &x->pi, ch); }
yxml_piname(yxml_t * x,unsigned ch)270ed573b14SMatthias Ringwald static inline yxml_ret_t yxml_piname   (yxml_t *x, unsigned ch) { return yxml_pushstackc(x, ch); }
yxml_piabort(yxml_t * x,unsigned 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; }
yxml_pinameend(yxml_t * x,unsigned ch)272177bf6acSMatthias Ringwald static inline yxml_ret_t yxml_pinameend(yxml_t *x, unsigned ch) { (void) ch;
2735df9dc78SMatthias 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 }
yxml_pivalend(yxml_t * x,unsigned ch)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 
yxml_refstart(yxml_t * x,unsigned ch)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 
yxml_ref(yxml_t * x,unsigned ch)286ed573b14SMatthias Ringwald static yxml_ret_t yxml_ref(yxml_t *x, unsigned ch) {
287330534efSMatthias 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 
yxml_refend(yxml_t * x,yxml_ret_t ret)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++)
301c1ab6cc1SMatthias 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]);
309330534efSMatthias Ringwald 		if        (i == INTFROM5CHARS('l','t', 0,  0, 0)){
310330534efSMatthias Ringwald 			ch = '<';
311330534efSMatthias Ringwald 		} else if (i == INTFROM5CHARS('g','t', 0,  0, 0)){
312330534efSMatthias Ringwald 			ch = '>';
313330534efSMatthias Ringwald 		} else if (i == INTFROM5CHARS('a','m','p', 0, 0)){
314330534efSMatthias Ringwald 			ch =  '&';
315330534efSMatthias Ringwald 		} else if (i == INTFROM5CHARS('a','p','o','s',0)){
316330534efSMatthias Ringwald 			ch =  '\'';
317330534efSMatthias Ringwald 		} else if (i == INTFROM5CHARS('q','u','o','t',0)){
318330534efSMatthias Ringwald 			ch =  '"';
319330534efSMatthias Ringwald 		} else {
320330534efSMatthias Ringwald 			ch = 0;
321330534efSMatthias Ringwald 		}
322ed573b14SMatthias Ringwald 	}
323ed573b14SMatthias Ringwald 
324ed573b14SMatthias Ringwald 	/* Codepoints not allowed in the XML 1.1 definition of a Char */
325330534efSMatthias Ringwald 	if(!ch || (ch > 0x10FFFF) || (ch == 0xFFFE) || (ch == 0xFFFF) || ((ch-0xDFFF) < 0x7FF))
326ed573b14SMatthias Ringwald 		return YXML_EREF;
327ed573b14SMatthias Ringwald 	yxml_setutf8(x->data, ch);
328ed573b14SMatthias Ringwald 	return ret;
329ed573b14SMatthias Ringwald }
330ed573b14SMatthias Ringwald 
331ed573b14SMatthias Ringwald 
yxml_refcontent(yxml_t * x,unsigned ch)332177bf6acSMatthias Ringwald static inline yxml_ret_t yxml_refcontent(yxml_t *x, unsigned ch) { (void) ch; return yxml_refend(x, YXML_CONTENT); }
yxml_refattrval(yxml_t * x,unsigned ch)333177bf6acSMatthias Ringwald static inline yxml_ret_t yxml_refattrval(yxml_t *x, unsigned ch) { (void) ch; return yxml_refend(x, YXML_ATTRVAL); }
334ed573b14SMatthias Ringwald 
335ed573b14SMatthias Ringwald 
yxml_init(yxml_t * x,void * stack,size_t stacksize)336ed573b14SMatthias Ringwald void yxml_init(yxml_t *x, void *stack, size_t stacksize) {
337ed573b14SMatthias Ringwald 	memset(x, 0, sizeof(*x));
338ed573b14SMatthias Ringwald 	x->line = 1;
339a788b16cSMilanka Ringwald 	x->stack = (unsigned char *) stack;
340ed573b14SMatthias Ringwald 	x->stacksize = stacksize;
341ed573b14SMatthias Ringwald 	*x->stack = 0;
342ed573b14SMatthias Ringwald 	x->elem = x->pi = x->attr = (char *)x->stack;
343ed573b14SMatthias Ringwald 	x->state = YXMLS_init;
344ed573b14SMatthias Ringwald }
345ed573b14SMatthias Ringwald 
346ed573b14SMatthias Ringwald 
yxml_parse(yxml_t * x,int _ch)347ed573b14SMatthias Ringwald yxml_ret_t yxml_parse(yxml_t *x, int _ch) {
348ed573b14SMatthias Ringwald 	/* Ensure that characters are in the range of 0..255 rather than -126..125.
349ed573b14SMatthias Ringwald 	 * All character comparisons are done with positive integers. */
350ed573b14SMatthias Ringwald 	unsigned ch = (unsigned)(_ch+256) & 0xff;
351ed573b14SMatthias Ringwald 	if(!ch)
352ed573b14SMatthias Ringwald 		return YXML_ESYN;
353ed573b14SMatthias Ringwald 	x->total++;
354ed573b14SMatthias Ringwald 
355ed573b14SMatthias Ringwald 	/* End-of-Line normalization, "\rX", "\r\n" and "\n" are recognized and
356ed573b14SMatthias Ringwald 	 * normalized to a single '\n' as per XML 1.0 section 2.11. XML 1.1 adds
357ed573b14SMatthias Ringwald 	 * some non-ASCII character sequences to this list, but we can only handle
358ed573b14SMatthias Ringwald 	 * ASCII here without making assumptions about the input encoding. */
359ed573b14SMatthias Ringwald 	if(x->ignore == ch) {
360ed573b14SMatthias Ringwald 		x->ignore = 0;
361ed573b14SMatthias Ringwald 		return YXML_OK;
362ed573b14SMatthias Ringwald 	}
363ed573b14SMatthias Ringwald 	x->ignore = (ch == 0xd) * 0xa;
364c1ab6cc1SMatthias Ringwald 	if((ch == 0xa) || (ch == 0xd)) {
365ed573b14SMatthias Ringwald 		ch = 0xa;
366ed573b14SMatthias Ringwald 		x->line++;
367ed573b14SMatthias Ringwald 		x->byte = 0;
368ed573b14SMatthias Ringwald 	}
369ed573b14SMatthias Ringwald 	x->byte++;
370ed573b14SMatthias Ringwald 
371ed573b14SMatthias Ringwald 	switch((yxml_state_t)x->state) {
372ed573b14SMatthias Ringwald 	case YXMLS_string:
373ed573b14SMatthias Ringwald 		if(ch == *x->string) {
374ed573b14SMatthias Ringwald 			x->string++;
375ed573b14SMatthias Ringwald 			if(!*x->string)
376ed573b14SMatthias Ringwald 				x->state = x->nextstate;
377ed573b14SMatthias Ringwald 			return YXML_OK;
378ed573b14SMatthias Ringwald 		}
379ed573b14SMatthias Ringwald 		break;
380ed573b14SMatthias Ringwald 	case YXMLS_attr0:
381ed573b14SMatthias Ringwald 		if(yxml_isName(ch))
382ed573b14SMatthias Ringwald 			return yxml_attrname(x, ch);
383ed573b14SMatthias Ringwald 		if(yxml_isSP(ch)) {
384ed573b14SMatthias Ringwald 			x->state = YXMLS_attr1;
385ed573b14SMatthias Ringwald 			return yxml_attrnameend(x, ch);
386ed573b14SMatthias Ringwald 		}
387ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'=') {
388ed573b14SMatthias Ringwald 			x->state = YXMLS_attr2;
389ed573b14SMatthias Ringwald 			return yxml_attrnameend(x, ch);
390ed573b14SMatthias Ringwald 		}
391ed573b14SMatthias Ringwald 		break;
392ed573b14SMatthias Ringwald 	case YXMLS_attr1:
393ed573b14SMatthias Ringwald 		if(yxml_isSP(ch))
394ed573b14SMatthias Ringwald 			return YXML_OK;
395ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'=') {
396ed573b14SMatthias Ringwald 			x->state = YXMLS_attr2;
397ed573b14SMatthias Ringwald 			return YXML_OK;
398ed573b14SMatthias Ringwald 		}
399ed573b14SMatthias Ringwald 		break;
400ed573b14SMatthias Ringwald 	case YXMLS_attr2:
401ed573b14SMatthias Ringwald 		if(yxml_isSP(ch))
402ed573b14SMatthias Ringwald 			return YXML_OK;
403330534efSMatthias Ringwald 		if((ch == (unsigned char)'\'') || (ch == (unsigned char)'"')) {
404ed573b14SMatthias Ringwald 			x->state = YXMLS_attr3;
405ed573b14SMatthias Ringwald 			x->quote = ch;
406ed573b14SMatthias Ringwald 			return YXML_OK;
407ed573b14SMatthias Ringwald 		}
408ed573b14SMatthias Ringwald 		break;
409ed573b14SMatthias Ringwald 	case YXMLS_attr3:
410ed573b14SMatthias Ringwald 		if(yxml_isAttValue(ch))
411ed573b14SMatthias Ringwald 			return yxml_dataattr(x, ch);
412ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'&') {
413ed573b14SMatthias Ringwald 			x->state = YXMLS_attr4;
414ed573b14SMatthias Ringwald 			return yxml_refstart(x, ch);
415ed573b14SMatthias Ringwald 		}
416ed573b14SMatthias Ringwald 		if(x->quote == ch) {
417ed573b14SMatthias Ringwald 			x->state = YXMLS_elem2;
418ed573b14SMatthias Ringwald 			return yxml_attrvalend(x, ch);
419ed573b14SMatthias Ringwald 		}
420ed573b14SMatthias Ringwald 		break;
421ed573b14SMatthias Ringwald 	case YXMLS_attr4:
422ed573b14SMatthias Ringwald 		if(yxml_isRef(ch))
423ed573b14SMatthias Ringwald 			return yxml_ref(x, ch);
424ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'\x3b') {
425ed573b14SMatthias Ringwald 			x->state = YXMLS_attr3;
426ed573b14SMatthias Ringwald 			return yxml_refattrval(x, ch);
427ed573b14SMatthias Ringwald 		}
428ed573b14SMatthias Ringwald 		break;
429ed573b14SMatthias Ringwald 	case YXMLS_cd0:
430ed573b14SMatthias Ringwald 		if(ch == (unsigned char)']') {
431ed573b14SMatthias Ringwald 			x->state = YXMLS_cd1;
432ed573b14SMatthias Ringwald 			return YXML_OK;
433ed573b14SMatthias Ringwald 		}
434ed573b14SMatthias Ringwald 		if(yxml_isChar(ch))
435ed573b14SMatthias Ringwald 			return yxml_datacontent(x, ch);
436ed573b14SMatthias Ringwald 		break;
437ed573b14SMatthias Ringwald 	case YXMLS_cd1:
438ed573b14SMatthias Ringwald 		if(ch == (unsigned char)']') {
439ed573b14SMatthias Ringwald 			x->state = YXMLS_cd2;
440ed573b14SMatthias Ringwald 			return YXML_OK;
441ed573b14SMatthias Ringwald 		}
442ed573b14SMatthias Ringwald 		if(yxml_isChar(ch)) {
443ed573b14SMatthias Ringwald 			x->state = YXMLS_cd0;
444ed573b14SMatthias Ringwald 			return yxml_datacd1(x, ch);
445ed573b14SMatthias Ringwald 		}
446ed573b14SMatthias Ringwald 		break;
447ed573b14SMatthias Ringwald 	case YXMLS_cd2:
448ed573b14SMatthias Ringwald 		if(ch == (unsigned char)']')
449ed573b14SMatthias Ringwald 			return yxml_datacontent(x, ch);
450ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'>') {
451ed573b14SMatthias Ringwald 			x->state = YXMLS_misc2;
452ed573b14SMatthias Ringwald 			return YXML_OK;
453ed573b14SMatthias Ringwald 		}
454ed573b14SMatthias Ringwald 		if(yxml_isChar(ch)) {
455ed573b14SMatthias Ringwald 			x->state = YXMLS_cd0;
456ed573b14SMatthias Ringwald 			return yxml_datacd2(x, ch);
457ed573b14SMatthias Ringwald 		}
458ed573b14SMatthias Ringwald 		break;
459ed573b14SMatthias Ringwald 	case YXMLS_comment0:
460ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'-') {
461ed573b14SMatthias Ringwald 			x->state = YXMLS_comment1;
462ed573b14SMatthias Ringwald 			return YXML_OK;
463ed573b14SMatthias Ringwald 		}
464ed573b14SMatthias Ringwald 		break;
465ed573b14SMatthias Ringwald 	case YXMLS_comment1:
466ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'-') {
467ed573b14SMatthias Ringwald 			x->state = YXMLS_comment2;
468ed573b14SMatthias Ringwald 			return YXML_OK;
469ed573b14SMatthias Ringwald 		}
470ed573b14SMatthias Ringwald 		break;
471ed573b14SMatthias Ringwald 	case YXMLS_comment2:
472ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'-') {
473ed573b14SMatthias Ringwald 			x->state = YXMLS_comment3;
474ed573b14SMatthias Ringwald 			return YXML_OK;
475ed573b14SMatthias Ringwald 		}
476ed573b14SMatthias Ringwald 		if(yxml_isChar(ch))
477ed573b14SMatthias Ringwald 			return YXML_OK;
478ed573b14SMatthias Ringwald 		break;
479ed573b14SMatthias Ringwald 	case YXMLS_comment3:
480ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'-') {
481ed573b14SMatthias Ringwald 			x->state = YXMLS_comment4;
482ed573b14SMatthias Ringwald 			return YXML_OK;
483ed573b14SMatthias Ringwald 		}
484ed573b14SMatthias Ringwald 		if(yxml_isChar(ch)) {
485ed573b14SMatthias Ringwald 			x->state = YXMLS_comment2;
486ed573b14SMatthias Ringwald 			return YXML_OK;
487ed573b14SMatthias Ringwald 		}
488ed573b14SMatthias Ringwald 		break;
489ed573b14SMatthias Ringwald 	case YXMLS_comment4:
490ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'>') {
491ed573b14SMatthias Ringwald 			x->state = x->nextstate;
492ed573b14SMatthias Ringwald 			return YXML_OK;
493ed573b14SMatthias Ringwald 		}
494ed573b14SMatthias Ringwald 		break;
495ed573b14SMatthias Ringwald 	case YXMLS_dt0:
496ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'>') {
497ed573b14SMatthias Ringwald 			x->state = YXMLS_misc1;
498ed573b14SMatthias Ringwald 			return YXML_OK;
499ed573b14SMatthias Ringwald 		}
500330534efSMatthias Ringwald 		if((ch == (unsigned char)'\'') || (ch == (unsigned char)'"')) {
501ed573b14SMatthias Ringwald 			x->state = YXMLS_dt1;
502ed573b14SMatthias Ringwald 			x->quote = ch;
503ed573b14SMatthias Ringwald 			x->nextstate = YXMLS_dt0;
504ed573b14SMatthias Ringwald 			return YXML_OK;
505ed573b14SMatthias Ringwald 		}
506ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'<') {
507ed573b14SMatthias Ringwald 			x->state = YXMLS_dt2;
508ed573b14SMatthias Ringwald 			return YXML_OK;
509ed573b14SMatthias Ringwald 		}
510ed573b14SMatthias Ringwald 		if(yxml_isChar(ch))
511ed573b14SMatthias Ringwald 			return YXML_OK;
512ed573b14SMatthias Ringwald 		break;
513ed573b14SMatthias Ringwald 	case YXMLS_dt1:
514ed573b14SMatthias Ringwald 		if(x->quote == ch) {
515ed573b14SMatthias Ringwald 			x->state = x->nextstate;
516ed573b14SMatthias Ringwald 			return YXML_OK;
517ed573b14SMatthias Ringwald 		}
518ed573b14SMatthias Ringwald 		if(yxml_isChar(ch))
519ed573b14SMatthias Ringwald 			return YXML_OK;
520ed573b14SMatthias Ringwald 		break;
521ed573b14SMatthias Ringwald 	case YXMLS_dt2:
522ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'?') {
523ed573b14SMatthias Ringwald 			x->state = YXMLS_pi0;
524ed573b14SMatthias Ringwald 			x->nextstate = YXMLS_dt0;
525ed573b14SMatthias Ringwald 			return YXML_OK;
526ed573b14SMatthias Ringwald 		}
527ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'!') {
528ed573b14SMatthias Ringwald 			x->state = YXMLS_dt3;
529ed573b14SMatthias Ringwald 			return YXML_OK;
530ed573b14SMatthias Ringwald 		}
531ed573b14SMatthias Ringwald 		break;
532ed573b14SMatthias Ringwald 	case YXMLS_dt3:
533ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'-') {
534ed573b14SMatthias Ringwald 			x->state = YXMLS_comment1;
535ed573b14SMatthias Ringwald 			x->nextstate = YXMLS_dt0;
536ed573b14SMatthias Ringwald 			return YXML_OK;
537ed573b14SMatthias Ringwald 		}
538ed573b14SMatthias Ringwald 		if(yxml_isChar(ch)) {
539ed573b14SMatthias Ringwald 			x->state = YXMLS_dt4;
540ed573b14SMatthias Ringwald 			return YXML_OK;
541ed573b14SMatthias Ringwald 		}
542ed573b14SMatthias Ringwald 		break;
543ed573b14SMatthias Ringwald 	case YXMLS_dt4:
544330534efSMatthias Ringwald 		if((ch == (unsigned char)'\'') || (ch == (unsigned char)'"')) {
545ed573b14SMatthias Ringwald 			x->state = YXMLS_dt1;
546ed573b14SMatthias Ringwald 			x->quote = ch;
547ed573b14SMatthias Ringwald 			x->nextstate = YXMLS_dt4;
548ed573b14SMatthias Ringwald 			return YXML_OK;
549ed573b14SMatthias Ringwald 		}
550ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'>') {
551ed573b14SMatthias Ringwald 			x->state = YXMLS_dt0;
552ed573b14SMatthias Ringwald 			return YXML_OK;
553ed573b14SMatthias Ringwald 		}
554ed573b14SMatthias Ringwald 		if(yxml_isChar(ch))
555ed573b14SMatthias Ringwald 			return YXML_OK;
556ed573b14SMatthias Ringwald 		break;
557ed573b14SMatthias Ringwald 	case YXMLS_elem0:
558ed573b14SMatthias Ringwald 		if(yxml_isName(ch))
559ed573b14SMatthias Ringwald 			return yxml_elemname(x, ch);
560ed573b14SMatthias Ringwald 		if(yxml_isSP(ch)) {
561ed573b14SMatthias Ringwald 			x->state = YXMLS_elem1;
562ed573b14SMatthias Ringwald 			return yxml_elemnameend(x, ch);
563ed573b14SMatthias Ringwald 		}
564ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'/') {
565ed573b14SMatthias Ringwald 			x->state = YXMLS_elem3;
566ed573b14SMatthias Ringwald 			return yxml_elemnameend(x, ch);
567ed573b14SMatthias Ringwald 		}
568ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'>') {
569ed573b14SMatthias Ringwald 			x->state = YXMLS_misc2;
570ed573b14SMatthias Ringwald 			return yxml_elemnameend(x, ch);
571ed573b14SMatthias Ringwald 		}
572ed573b14SMatthias Ringwald 		break;
573ed573b14SMatthias Ringwald 	case YXMLS_elem1:
574ed573b14SMatthias Ringwald 		if(yxml_isSP(ch))
575ed573b14SMatthias Ringwald 			return YXML_OK;
576ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'/') {
577ed573b14SMatthias Ringwald 			x->state = YXMLS_elem3;
578ed573b14SMatthias Ringwald 			return YXML_OK;
579ed573b14SMatthias Ringwald 		}
580ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'>') {
581ed573b14SMatthias Ringwald 			x->state = YXMLS_misc2;
582ed573b14SMatthias Ringwald 			return YXML_OK;
583ed573b14SMatthias Ringwald 		}
584ed573b14SMatthias Ringwald 		if(yxml_isNameStart(ch)) {
585ed573b14SMatthias Ringwald 			x->state = YXMLS_attr0;
586ed573b14SMatthias Ringwald 			return yxml_attrstart(x, ch);
587ed573b14SMatthias Ringwald 		}
588ed573b14SMatthias Ringwald 		break;
589ed573b14SMatthias Ringwald 	case YXMLS_elem2:
590ed573b14SMatthias Ringwald 		if(yxml_isSP(ch)) {
591ed573b14SMatthias Ringwald 			x->state = YXMLS_elem1;
592ed573b14SMatthias Ringwald 			return YXML_OK;
593ed573b14SMatthias Ringwald 		}
594ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'/') {
595ed573b14SMatthias Ringwald 			x->state = YXMLS_elem3;
596ed573b14SMatthias Ringwald 			return YXML_OK;
597ed573b14SMatthias Ringwald 		}
598ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'>') {
599ed573b14SMatthias Ringwald 			x->state = YXMLS_misc2;
600ed573b14SMatthias Ringwald 			return YXML_OK;
601ed573b14SMatthias Ringwald 		}
602ed573b14SMatthias Ringwald 		break;
603ed573b14SMatthias Ringwald 	case YXMLS_elem3:
604ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'>') {
605ed573b14SMatthias Ringwald 			x->state = YXMLS_misc2;
606ed573b14SMatthias Ringwald 			return yxml_selfclose(x, ch);
607ed573b14SMatthias Ringwald 		}
608ed573b14SMatthias Ringwald 		break;
609ed573b14SMatthias Ringwald 	case YXMLS_enc0:
610ed573b14SMatthias Ringwald 		if(yxml_isSP(ch))
611ed573b14SMatthias Ringwald 			return YXML_OK;
612ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'=') {
613ed573b14SMatthias Ringwald 			x->state = YXMLS_enc1;
614ed573b14SMatthias Ringwald 			return YXML_OK;
615ed573b14SMatthias Ringwald 		}
616ed573b14SMatthias Ringwald 		break;
617ed573b14SMatthias Ringwald 	case YXMLS_enc1:
618ed573b14SMatthias Ringwald 		if(yxml_isSP(ch))
619ed573b14SMatthias Ringwald 			return YXML_OK;
620330534efSMatthias Ringwald 		if((ch == (unsigned char)'\'') || (ch == (unsigned char)'"')) {
621ed573b14SMatthias Ringwald 			x->state = YXMLS_enc2;
622ed573b14SMatthias Ringwald 			x->quote = ch;
623ed573b14SMatthias Ringwald 			return YXML_OK;
624ed573b14SMatthias Ringwald 		}
625ed573b14SMatthias Ringwald 		break;
626ed573b14SMatthias Ringwald 	case YXMLS_enc2:
627ed573b14SMatthias Ringwald 		if(yxml_isAlpha(ch)) {
628ed573b14SMatthias Ringwald 			x->state = YXMLS_enc3;
629ed573b14SMatthias Ringwald 			return YXML_OK;
630ed573b14SMatthias Ringwald 		}
631ed573b14SMatthias Ringwald 		break;
632ed573b14SMatthias Ringwald 	case YXMLS_enc3:
633ed573b14SMatthias Ringwald 		if(yxml_isEncName(ch))
634ed573b14SMatthias Ringwald 			return YXML_OK;
635ed573b14SMatthias Ringwald 		if(x->quote == ch) {
636ed573b14SMatthias Ringwald 			x->state = YXMLS_xmldecl6;
637ed573b14SMatthias Ringwald 			return YXML_OK;
638ed573b14SMatthias Ringwald 		}
639ed573b14SMatthias Ringwald 		break;
640ed573b14SMatthias Ringwald 	case YXMLS_etag0:
641ed573b14SMatthias Ringwald 		if(yxml_isNameStart(ch)) {
642ed573b14SMatthias Ringwald 			x->state = YXMLS_etag1;
643ed573b14SMatthias Ringwald 			return yxml_elemclose(x, ch);
644ed573b14SMatthias Ringwald 		}
645ed573b14SMatthias Ringwald 		break;
646ed573b14SMatthias Ringwald 	case YXMLS_etag1:
647ed573b14SMatthias Ringwald 		if(yxml_isName(ch))
648ed573b14SMatthias Ringwald 			return yxml_elemclose(x, ch);
649ed573b14SMatthias Ringwald 		if(yxml_isSP(ch)) {
650ed573b14SMatthias Ringwald 			x->state = YXMLS_etag2;
651ed573b14SMatthias Ringwald 			return yxml_elemcloseend(x, ch);
652ed573b14SMatthias Ringwald 		}
653ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'>') {
654ed573b14SMatthias Ringwald 			x->state = YXMLS_misc2;
655ed573b14SMatthias Ringwald 			return yxml_elemcloseend(x, ch);
656ed573b14SMatthias Ringwald 		}
657ed573b14SMatthias Ringwald 		break;
658ed573b14SMatthias Ringwald 	case YXMLS_etag2:
659ed573b14SMatthias Ringwald 		if(yxml_isSP(ch))
660ed573b14SMatthias Ringwald 			return YXML_OK;
661ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'>') {
662ed573b14SMatthias Ringwald 			x->state = YXMLS_misc2;
663ed573b14SMatthias Ringwald 			return YXML_OK;
664ed573b14SMatthias Ringwald 		}
665ed573b14SMatthias Ringwald 		break;
666ed573b14SMatthias Ringwald 	case YXMLS_init:
667ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'\xef') {
668ed573b14SMatthias Ringwald 			x->state = YXMLS_string;
669ed573b14SMatthias Ringwald 			x->nextstate = YXMLS_misc0;
670ed573b14SMatthias Ringwald 			x->string = (unsigned char *)"\xbb\xbf";
671ed573b14SMatthias Ringwald 			return YXML_OK;
672ed573b14SMatthias Ringwald 		}
673ed573b14SMatthias Ringwald 		if(yxml_isSP(ch)) {
674ed573b14SMatthias Ringwald 			x->state = YXMLS_misc0;
675ed573b14SMatthias Ringwald 			return YXML_OK;
676ed573b14SMatthias Ringwald 		}
677ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'<') {
678ed573b14SMatthias Ringwald 			x->state = YXMLS_le0;
679ed573b14SMatthias Ringwald 			return YXML_OK;
680ed573b14SMatthias Ringwald 		}
681ed573b14SMatthias Ringwald 		break;
682ed573b14SMatthias Ringwald 	case YXMLS_le0:
683ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'!') {
684ed573b14SMatthias Ringwald 			x->state = YXMLS_lee1;
685ed573b14SMatthias Ringwald 			return YXML_OK;
686ed573b14SMatthias Ringwald 		}
687ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'?') {
688ed573b14SMatthias Ringwald 			x->state = YXMLS_leq0;
689ed573b14SMatthias Ringwald 			return YXML_OK;
690ed573b14SMatthias Ringwald 		}
691ed573b14SMatthias Ringwald 		if(yxml_isNameStart(ch)) {
692ed573b14SMatthias Ringwald 			x->state = YXMLS_elem0;
693ed573b14SMatthias Ringwald 			return yxml_elemstart(x, ch);
694ed573b14SMatthias Ringwald 		}
695ed573b14SMatthias Ringwald 		break;
696ed573b14SMatthias Ringwald 	case YXMLS_le1:
697ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'!') {
698ed573b14SMatthias Ringwald 			x->state = YXMLS_lee1;
699ed573b14SMatthias Ringwald 			return YXML_OK;
700ed573b14SMatthias Ringwald 		}
701ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'?') {
702ed573b14SMatthias Ringwald 			x->state = YXMLS_pi0;
703ed573b14SMatthias Ringwald 			x->nextstate = YXMLS_misc1;
704ed573b14SMatthias Ringwald 			return YXML_OK;
705ed573b14SMatthias Ringwald 		}
706ed573b14SMatthias Ringwald 		if(yxml_isNameStart(ch)) {
707ed573b14SMatthias Ringwald 			x->state = YXMLS_elem0;
708ed573b14SMatthias Ringwald 			return yxml_elemstart(x, ch);
709ed573b14SMatthias Ringwald 		}
710ed573b14SMatthias Ringwald 		break;
711ed573b14SMatthias Ringwald 	case YXMLS_le2:
712ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'!') {
713ed573b14SMatthias Ringwald 			x->state = YXMLS_lee2;
714ed573b14SMatthias Ringwald 			return YXML_OK;
715ed573b14SMatthias Ringwald 		}
716ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'?') {
717ed573b14SMatthias Ringwald 			x->state = YXMLS_pi0;
718ed573b14SMatthias Ringwald 			x->nextstate = YXMLS_misc2;
719ed573b14SMatthias Ringwald 			return YXML_OK;
720ed573b14SMatthias Ringwald 		}
721ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'/') {
722ed573b14SMatthias Ringwald 			x->state = YXMLS_etag0;
723ed573b14SMatthias Ringwald 			return YXML_OK;
724ed573b14SMatthias Ringwald 		}
725ed573b14SMatthias Ringwald 		if(yxml_isNameStart(ch)) {
726ed573b14SMatthias Ringwald 			x->state = YXMLS_elem0;
727ed573b14SMatthias Ringwald 			return yxml_elemstart(x, ch);
728ed573b14SMatthias Ringwald 		}
729ed573b14SMatthias Ringwald 		break;
730ed573b14SMatthias Ringwald 	case YXMLS_le3:
731ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'!') {
732ed573b14SMatthias Ringwald 			x->state = YXMLS_comment0;
733ed573b14SMatthias Ringwald 			x->nextstate = YXMLS_misc3;
734ed573b14SMatthias Ringwald 			return YXML_OK;
735ed573b14SMatthias Ringwald 		}
736ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'?') {
737ed573b14SMatthias Ringwald 			x->state = YXMLS_pi0;
738ed573b14SMatthias Ringwald 			x->nextstate = YXMLS_misc3;
739ed573b14SMatthias Ringwald 			return YXML_OK;
740ed573b14SMatthias Ringwald 		}
741ed573b14SMatthias Ringwald 		break;
742ed573b14SMatthias Ringwald 	case YXMLS_lee1:
743ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'-') {
744ed573b14SMatthias Ringwald 			x->state = YXMLS_comment1;
745ed573b14SMatthias Ringwald 			x->nextstate = YXMLS_misc1;
746ed573b14SMatthias Ringwald 			return YXML_OK;
747ed573b14SMatthias Ringwald 		}
748ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'D') {
749ed573b14SMatthias Ringwald 			x->state = YXMLS_string;
750ed573b14SMatthias Ringwald 			x->nextstate = YXMLS_dt0;
751ed573b14SMatthias Ringwald 			x->string = (unsigned char *)"OCTYPE";
752ed573b14SMatthias Ringwald 			return YXML_OK;
753ed573b14SMatthias Ringwald 		}
754ed573b14SMatthias Ringwald 		break;
755ed573b14SMatthias Ringwald 	case YXMLS_lee2:
756ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'-') {
757ed573b14SMatthias Ringwald 			x->state = YXMLS_comment1;
758ed573b14SMatthias Ringwald 			x->nextstate = YXMLS_misc2;
759ed573b14SMatthias Ringwald 			return YXML_OK;
760ed573b14SMatthias Ringwald 		}
761ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'[') {
762ed573b14SMatthias Ringwald 			x->state = YXMLS_string;
763ed573b14SMatthias Ringwald 			x->nextstate = YXMLS_cd0;
764ed573b14SMatthias Ringwald 			x->string = (unsigned char *)"CDATA[";
765ed573b14SMatthias Ringwald 			return YXML_OK;
766ed573b14SMatthias Ringwald 		}
767ed573b14SMatthias Ringwald 		break;
768ed573b14SMatthias Ringwald 	case YXMLS_leq0:
769ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'x') {
770ed573b14SMatthias Ringwald 			x->state = YXMLS_xmldecl0;
771ed573b14SMatthias Ringwald 			x->nextstate = YXMLS_misc1;
772ed573b14SMatthias Ringwald 			return yxml_pistart(x, ch);
773ed573b14SMatthias Ringwald 		}
774ed573b14SMatthias Ringwald 		if(yxml_isNameStart(ch)) {
775ed573b14SMatthias Ringwald 			x->state = YXMLS_pi1;
776ed573b14SMatthias Ringwald 			x->nextstate = YXMLS_misc1;
777ed573b14SMatthias Ringwald 			return yxml_pistart(x, ch);
778ed573b14SMatthias Ringwald 		}
779ed573b14SMatthias Ringwald 		break;
780ed573b14SMatthias Ringwald 	case YXMLS_misc0:
781ed573b14SMatthias Ringwald 		if(yxml_isSP(ch))
782ed573b14SMatthias Ringwald 			return YXML_OK;
783ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'<') {
784ed573b14SMatthias Ringwald 			x->state = YXMLS_le0;
785ed573b14SMatthias Ringwald 			return YXML_OK;
786ed573b14SMatthias Ringwald 		}
787ed573b14SMatthias Ringwald 		break;
788ed573b14SMatthias Ringwald 	case YXMLS_misc1:
789ed573b14SMatthias Ringwald 		if(yxml_isSP(ch))
790ed573b14SMatthias Ringwald 			return YXML_OK;
791ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'<') {
792ed573b14SMatthias Ringwald 			x->state = YXMLS_le1;
793ed573b14SMatthias Ringwald 			return YXML_OK;
794ed573b14SMatthias Ringwald 		}
795ed573b14SMatthias Ringwald 		break;
796ed573b14SMatthias Ringwald 	case YXMLS_misc2:
797ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'<') {
798ed573b14SMatthias Ringwald 			x->state = YXMLS_le2;
799ed573b14SMatthias Ringwald 			return YXML_OK;
800ed573b14SMatthias Ringwald 		}
801ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'&') {
802ed573b14SMatthias Ringwald 			x->state = YXMLS_misc2a;
803ed573b14SMatthias Ringwald 			return yxml_refstart(x, ch);
804ed573b14SMatthias Ringwald 		}
805ed573b14SMatthias Ringwald 		if(yxml_isChar(ch))
806ed573b14SMatthias Ringwald 			return yxml_datacontent(x, ch);
807ed573b14SMatthias Ringwald 		break;
808ed573b14SMatthias Ringwald 	case YXMLS_misc2a:
809ed573b14SMatthias Ringwald 		if(yxml_isRef(ch))
810ed573b14SMatthias Ringwald 			return yxml_ref(x, ch);
811ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'\x3b') {
812ed573b14SMatthias Ringwald 			x->state = YXMLS_misc2;
813ed573b14SMatthias Ringwald 			return yxml_refcontent(x, ch);
814ed573b14SMatthias Ringwald 		}
815ed573b14SMatthias Ringwald 		break;
816ed573b14SMatthias Ringwald 	case YXMLS_misc3:
817ed573b14SMatthias Ringwald 		if(yxml_isSP(ch))
818ed573b14SMatthias Ringwald 			return YXML_OK;
819ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'<') {
820ed573b14SMatthias Ringwald 			x->state = YXMLS_le3;
821ed573b14SMatthias Ringwald 			return YXML_OK;
822ed573b14SMatthias Ringwald 		}
823ed573b14SMatthias Ringwald 		break;
824ed573b14SMatthias Ringwald 	case YXMLS_pi0:
825ed573b14SMatthias Ringwald 		if(yxml_isNameStart(ch)) {
826ed573b14SMatthias Ringwald 			x->state = YXMLS_pi1;
827ed573b14SMatthias Ringwald 			return yxml_pistart(x, ch);
828ed573b14SMatthias Ringwald 		}
829ed573b14SMatthias Ringwald 		break;
830ed573b14SMatthias Ringwald 	case YXMLS_pi1:
831ed573b14SMatthias Ringwald 		if(yxml_isName(ch))
832ed573b14SMatthias Ringwald 			return yxml_piname(x, ch);
833ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'?') {
834ed573b14SMatthias Ringwald 			x->state = YXMLS_pi4;
835ed573b14SMatthias Ringwald 			return yxml_pinameend(x, ch);
836ed573b14SMatthias Ringwald 		}
837ed573b14SMatthias Ringwald 		if(yxml_isSP(ch)) {
838ed573b14SMatthias Ringwald 			x->state = YXMLS_pi2;
839ed573b14SMatthias Ringwald 			return yxml_pinameend(x, ch);
840ed573b14SMatthias Ringwald 		}
841ed573b14SMatthias Ringwald 		break;
842ed573b14SMatthias Ringwald 	case YXMLS_pi2:
843ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'?') {
844ed573b14SMatthias Ringwald 			x->state = YXMLS_pi3;
845ed573b14SMatthias Ringwald 			return YXML_OK;
846ed573b14SMatthias Ringwald 		}
847ed573b14SMatthias Ringwald 		if(yxml_isChar(ch))
848ed573b14SMatthias Ringwald 			return yxml_datapi1(x, ch);
849ed573b14SMatthias Ringwald 		break;
850ed573b14SMatthias Ringwald 	case YXMLS_pi3:
851ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'>') {
852ed573b14SMatthias Ringwald 			x->state = x->nextstate;
853ed573b14SMatthias Ringwald 			return yxml_pivalend(x, ch);
854ed573b14SMatthias Ringwald 		}
855ed573b14SMatthias Ringwald 		if(yxml_isChar(ch)) {
856ed573b14SMatthias Ringwald 			x->state = YXMLS_pi2;
857ed573b14SMatthias Ringwald 			return yxml_datapi2(x, ch);
858ed573b14SMatthias Ringwald 		}
859ed573b14SMatthias Ringwald 		break;
860ed573b14SMatthias Ringwald 	case YXMLS_pi4:
861ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'>') {
862ed573b14SMatthias Ringwald 			x->state = x->nextstate;
863ed573b14SMatthias Ringwald 			return yxml_pivalend(x, ch);
864ed573b14SMatthias Ringwald 		}
865ed573b14SMatthias Ringwald 		break;
866ed573b14SMatthias Ringwald 	case YXMLS_std0:
867ed573b14SMatthias Ringwald 		if(yxml_isSP(ch))
868ed573b14SMatthias Ringwald 			return YXML_OK;
869ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'=') {
870ed573b14SMatthias Ringwald 			x->state = YXMLS_std1;
871ed573b14SMatthias Ringwald 			return YXML_OK;
872ed573b14SMatthias Ringwald 		}
873ed573b14SMatthias Ringwald 		break;
874ed573b14SMatthias Ringwald 	case YXMLS_std1:
875ed573b14SMatthias Ringwald 		if(yxml_isSP(ch))
876ed573b14SMatthias Ringwald 			return YXML_OK;
877330534efSMatthias Ringwald 		if((ch == (unsigned char)'\'') || (ch == (unsigned char)'"')) {
878ed573b14SMatthias Ringwald 			x->state = YXMLS_std2;
879ed573b14SMatthias Ringwald 			x->quote = ch;
880ed573b14SMatthias Ringwald 			return YXML_OK;
881ed573b14SMatthias Ringwald 		}
882ed573b14SMatthias Ringwald 		break;
883ed573b14SMatthias Ringwald 	case YXMLS_std2:
884ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'y') {
885ed573b14SMatthias Ringwald 			x->state = YXMLS_string;
886ed573b14SMatthias Ringwald 			x->nextstate = YXMLS_std3;
887ed573b14SMatthias Ringwald 			x->string = (unsigned char *)"es";
888ed573b14SMatthias Ringwald 			return YXML_OK;
889ed573b14SMatthias Ringwald 		}
890ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'n') {
891ed573b14SMatthias Ringwald 			x->state = YXMLS_string;
892ed573b14SMatthias Ringwald 			x->nextstate = YXMLS_std3;
893ed573b14SMatthias Ringwald 			x->string = (unsigned char *)"o";
894ed573b14SMatthias Ringwald 			return YXML_OK;
895ed573b14SMatthias Ringwald 		}
896ed573b14SMatthias Ringwald 		break;
897ed573b14SMatthias Ringwald 	case YXMLS_std3:
898ed573b14SMatthias Ringwald 		if(x->quote == ch) {
899ed573b14SMatthias Ringwald 			x->state = YXMLS_xmldecl8;
900ed573b14SMatthias Ringwald 			return YXML_OK;
901ed573b14SMatthias Ringwald 		}
902ed573b14SMatthias Ringwald 		break;
903ed573b14SMatthias Ringwald 	case YXMLS_ver0:
904ed573b14SMatthias Ringwald 		if(yxml_isSP(ch))
905ed573b14SMatthias Ringwald 			return YXML_OK;
906ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'=') {
907ed573b14SMatthias Ringwald 			x->state = YXMLS_ver1;
908ed573b14SMatthias Ringwald 			return YXML_OK;
909ed573b14SMatthias Ringwald 		}
910ed573b14SMatthias Ringwald 		break;
911ed573b14SMatthias Ringwald 	case YXMLS_ver1:
912ed573b14SMatthias Ringwald 		if(yxml_isSP(ch))
913ed573b14SMatthias Ringwald 			return YXML_OK;
914330534efSMatthias Ringwald 		if((ch == (unsigned char)'\'') || (ch == (unsigned char)'"')) {
915ed573b14SMatthias Ringwald 			x->state = YXMLS_string;
916ed573b14SMatthias Ringwald 			x->quote = ch;
917ed573b14SMatthias Ringwald 			x->nextstate = YXMLS_ver2;
918ed573b14SMatthias Ringwald 			x->string = (unsigned char *)"1.";
919ed573b14SMatthias Ringwald 			return YXML_OK;
920ed573b14SMatthias Ringwald 		}
921ed573b14SMatthias Ringwald 		break;
922ed573b14SMatthias Ringwald 	case YXMLS_ver2:
923ed573b14SMatthias Ringwald 		if(yxml_isNum(ch)) {
924ed573b14SMatthias Ringwald 			x->state = YXMLS_ver3;
925ed573b14SMatthias Ringwald 			return YXML_OK;
926ed573b14SMatthias Ringwald 		}
927ed573b14SMatthias Ringwald 		break;
928ed573b14SMatthias Ringwald 	case YXMLS_ver3:
929ed573b14SMatthias Ringwald 		if(yxml_isNum(ch))
930ed573b14SMatthias Ringwald 			return YXML_OK;
931ed573b14SMatthias Ringwald 		if(x->quote == ch) {
932ed573b14SMatthias Ringwald 			x->state = YXMLS_xmldecl4;
933ed573b14SMatthias Ringwald 			return YXML_OK;
934ed573b14SMatthias Ringwald 		}
935ed573b14SMatthias Ringwald 		break;
936ed573b14SMatthias Ringwald 	case YXMLS_xmldecl0:
937ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'m') {
938ed573b14SMatthias Ringwald 			x->state = YXMLS_xmldecl1;
939ed573b14SMatthias Ringwald 			return yxml_piname(x, ch);
940ed573b14SMatthias Ringwald 		}
941ed573b14SMatthias Ringwald 		if(yxml_isName(ch)) {
942ed573b14SMatthias Ringwald 			x->state = YXMLS_pi1;
943ed573b14SMatthias Ringwald 			return yxml_piname(x, ch);
944ed573b14SMatthias Ringwald 		}
945ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'?') {
946ed573b14SMatthias Ringwald 			x->state = YXMLS_pi4;
947ed573b14SMatthias Ringwald 			return yxml_pinameend(x, ch);
948ed573b14SMatthias Ringwald 		}
949ed573b14SMatthias Ringwald 		if(yxml_isSP(ch)) {
950ed573b14SMatthias Ringwald 			x->state = YXMLS_pi2;
951ed573b14SMatthias Ringwald 			return yxml_pinameend(x, ch);
952ed573b14SMatthias Ringwald 		}
953ed573b14SMatthias Ringwald 		break;
954ed573b14SMatthias Ringwald 	case YXMLS_xmldecl1:
955ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'l') {
956ed573b14SMatthias Ringwald 			x->state = YXMLS_xmldecl2;
957ed573b14SMatthias Ringwald 			return yxml_piname(x, ch);
958ed573b14SMatthias Ringwald 		}
959ed573b14SMatthias Ringwald 		if(yxml_isName(ch)) {
960ed573b14SMatthias Ringwald 			x->state = YXMLS_pi1;
961ed573b14SMatthias Ringwald 			return yxml_piname(x, ch);
962ed573b14SMatthias Ringwald 		}
963ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'?') {
964ed573b14SMatthias Ringwald 			x->state = YXMLS_pi4;
965ed573b14SMatthias Ringwald 			return yxml_pinameend(x, ch);
966ed573b14SMatthias Ringwald 		}
967ed573b14SMatthias Ringwald 		if(yxml_isSP(ch)) {
968ed573b14SMatthias Ringwald 			x->state = YXMLS_pi2;
969ed573b14SMatthias Ringwald 			return yxml_pinameend(x, ch);
970ed573b14SMatthias Ringwald 		}
971ed573b14SMatthias Ringwald 		break;
972ed573b14SMatthias Ringwald 	case YXMLS_xmldecl2:
973ed573b14SMatthias Ringwald 		if(yxml_isSP(ch)) {
974ed573b14SMatthias Ringwald 			x->state = YXMLS_xmldecl3;
975ed573b14SMatthias Ringwald 			return yxml_piabort(x, ch);
976ed573b14SMatthias Ringwald 		}
977ed573b14SMatthias Ringwald 		if(yxml_isName(ch)) {
978ed573b14SMatthias Ringwald 			x->state = YXMLS_pi1;
979ed573b14SMatthias Ringwald 			return yxml_piname(x, ch);
980ed573b14SMatthias Ringwald 		}
981ed573b14SMatthias Ringwald 		break;
982ed573b14SMatthias Ringwald 	case YXMLS_xmldecl3:
983ed573b14SMatthias Ringwald 		if(yxml_isSP(ch))
984ed573b14SMatthias Ringwald 			return YXML_OK;
985ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'v') {
986ed573b14SMatthias Ringwald 			x->state = YXMLS_string;
987ed573b14SMatthias Ringwald 			x->nextstate = YXMLS_ver0;
988ed573b14SMatthias Ringwald 			x->string = (unsigned char *)"ersion";
989ed573b14SMatthias Ringwald 			return YXML_OK;
990ed573b14SMatthias Ringwald 		}
991ed573b14SMatthias Ringwald 		break;
992ed573b14SMatthias Ringwald 	case YXMLS_xmldecl4:
993ed573b14SMatthias Ringwald 		if(yxml_isSP(ch)) {
994ed573b14SMatthias Ringwald 			x->state = YXMLS_xmldecl5;
995ed573b14SMatthias Ringwald 			return YXML_OK;
996ed573b14SMatthias Ringwald 		}
997ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'?') {
998ed573b14SMatthias Ringwald 			x->state = YXMLS_xmldecl9;
999ed573b14SMatthias Ringwald 			return YXML_OK;
1000ed573b14SMatthias Ringwald 		}
1001ed573b14SMatthias Ringwald 		break;
1002ed573b14SMatthias Ringwald 	case YXMLS_xmldecl5:
1003ed573b14SMatthias Ringwald 		if(yxml_isSP(ch))
1004ed573b14SMatthias Ringwald 			return YXML_OK;
1005ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'?') {
1006ed573b14SMatthias Ringwald 			x->state = YXMLS_xmldecl9;
1007ed573b14SMatthias Ringwald 			return YXML_OK;
1008ed573b14SMatthias Ringwald 		}
1009ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'e') {
1010ed573b14SMatthias Ringwald 			x->state = YXMLS_string;
1011ed573b14SMatthias Ringwald 			x->nextstate = YXMLS_enc0;
1012ed573b14SMatthias Ringwald 			x->string = (unsigned char *)"ncoding";
1013ed573b14SMatthias Ringwald 			return YXML_OK;
1014ed573b14SMatthias Ringwald 		}
1015ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'s') {
1016ed573b14SMatthias Ringwald 			x->state = YXMLS_string;
1017ed573b14SMatthias Ringwald 			x->nextstate = YXMLS_std0;
1018ed573b14SMatthias Ringwald 			x->string = (unsigned char *)"tandalone";
1019ed573b14SMatthias Ringwald 			return YXML_OK;
1020ed573b14SMatthias Ringwald 		}
1021ed573b14SMatthias Ringwald 		break;
1022ed573b14SMatthias Ringwald 	case YXMLS_xmldecl6:
1023ed573b14SMatthias Ringwald 		if(yxml_isSP(ch)) {
1024ed573b14SMatthias Ringwald 			x->state = YXMLS_xmldecl7;
1025ed573b14SMatthias Ringwald 			return YXML_OK;
1026ed573b14SMatthias Ringwald 		}
1027ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'?') {
1028ed573b14SMatthias Ringwald 			x->state = YXMLS_xmldecl9;
1029ed573b14SMatthias Ringwald 			return YXML_OK;
1030ed573b14SMatthias Ringwald 		}
1031ed573b14SMatthias Ringwald 		break;
1032ed573b14SMatthias Ringwald 	case YXMLS_xmldecl7:
1033ed573b14SMatthias Ringwald 		if(yxml_isSP(ch))
1034ed573b14SMatthias Ringwald 			return YXML_OK;
1035ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'?') {
1036ed573b14SMatthias Ringwald 			x->state = YXMLS_xmldecl9;
1037ed573b14SMatthias Ringwald 			return YXML_OK;
1038ed573b14SMatthias Ringwald 		}
1039ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'s') {
1040ed573b14SMatthias Ringwald 			x->state = YXMLS_string;
1041ed573b14SMatthias Ringwald 			x->nextstate = YXMLS_std0;
1042ed573b14SMatthias Ringwald 			x->string = (unsigned char *)"tandalone";
1043ed573b14SMatthias Ringwald 			return YXML_OK;
1044ed573b14SMatthias Ringwald 		}
1045ed573b14SMatthias Ringwald 		break;
1046ed573b14SMatthias Ringwald 	case YXMLS_xmldecl8:
1047ed573b14SMatthias Ringwald 		if(yxml_isSP(ch))
1048ed573b14SMatthias Ringwald 			return YXML_OK;
1049ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'?') {
1050ed573b14SMatthias Ringwald 			x->state = YXMLS_xmldecl9;
1051ed573b14SMatthias Ringwald 			return YXML_OK;
1052ed573b14SMatthias Ringwald 		}
1053ed573b14SMatthias Ringwald 		break;
1054ed573b14SMatthias Ringwald 	case YXMLS_xmldecl9:
1055ed573b14SMatthias Ringwald 		if(ch == (unsigned char)'>') {
1056ed573b14SMatthias Ringwald 			x->state = YXMLS_misc1;
1057ed573b14SMatthias Ringwald 			return YXML_OK;
1058ed573b14SMatthias Ringwald 		}
1059ed573b14SMatthias Ringwald 		break;
1060*7bbeb3adSMilanka Ringwald 	default:
1061*7bbeb3adSMilanka Ringwald 		break;
1062ed573b14SMatthias Ringwald 	}
1063ed573b14SMatthias Ringwald 	return YXML_ESYN;
1064ed573b14SMatthias Ringwald }
1065ed573b14SMatthias Ringwald 
1066ed573b14SMatthias Ringwald 
yxml_eof(yxml_t * x)1067ed573b14SMatthias Ringwald yxml_ret_t yxml_eof(yxml_t *x) {
1068ed573b14SMatthias Ringwald 	if(x->state != YXMLS_misc3)
1069ed573b14SMatthias Ringwald 		return YXML_EEOF;
1070ed573b14SMatthias Ringwald 	return YXML_OK;
1071ed573b14SMatthias Ringwald }
1072ed573b14SMatthias Ringwald 
1073ed573b14SMatthias Ringwald 
1074ed573b14SMatthias Ringwald /* vim: set noet sw=4 ts=4: */
1075