Coverage Report

Created: 2026-11-12 06:54

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