Coverage Report

Created: 2026-08-14 07:31

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
4.25G
#define yxml_isChar(c) 1
100
/* 0xd should be part of SP, too, but yxml_parse() already normalizes that into 0xa */
101
92.3M
#define yxml_isSP(c) (c == 0x20 || c == 0x09 || c == 0x0a)
102
1.14G
#define yxml_isAlpha(c) ((c|32)-'a' < 26)
103
578M
#define yxml_isNum(c) (c-'0' < 10)
104
4.64k
#define yxml_isHex(c) (yxml_isNum(c) || (c|32)-'a' < 6)
105
2.15k
#define yxml_isEncName(c) (yxml_isAlpha(c) || yxml_isNum(c) || c == '.' || c == '_' || c == '-')
106
1.08G
#define yxml_isNameStart(c) (yxml_isAlpha(c) || c == ':' || c == '_' || c >= 128)
107
505M
#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
120M
#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
29.3k
#define yxml_isRef(c) (yxml_isNum(c) || yxml_isAlpha(c) || c == '#')
114
115
10.5k
#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
4.13G
static inline void yxml_setchar(char *dest, unsigned ch) {
119
4.13G
  *(unsigned char *)dest = (unsigned char)ch;
120
4.13G
}
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
6.02k
static void yxml_setutf8(char *dest, unsigned ch) {
125
6.02k
  if(ch <= 0x007F)
126
4.15k
    yxml_setchar(dest++, ch);
127
1.86k
  else if(ch <= 0x07FF) {
128
510
    yxml_setchar(dest++, 0xC0 | (ch>>6));
129
510
    yxml_setchar(dest++, 0x80 | (ch & 0x3F));
130
1.35k
  } else if(ch <= 0xFFFF) {
131
573
    yxml_setchar(dest++, 0xE0 | (ch>>12));
132
573
    yxml_setchar(dest++, 0x80 | ((ch>>6) & 0x3F));
133
573
    yxml_setchar(dest++, 0x80 | (ch & 0x3F));
134
784
  } else {
135
784
    yxml_setchar(dest++, 0xF0 | (ch>>18));
136
784
    yxml_setchar(dest++, 0x80 | ((ch>>12) & 0x3F));
137
784
    yxml_setchar(dest++, 0x80 | ((ch>>6) & 0x3F));
138
784
    yxml_setchar(dest++, 0x80 | (ch & 0x3F));
139
784
  }
140
6.02k
  *dest = 0;
141
6.02k
}
142
143
4.01G
static inline yxml_ret_t yxml_datacontent(yxml_t *x, unsigned ch) {
144
4.01G
  yxml_setchar(x->data, ch);
145
4.01G
  x->data[1] = 0;
146
4.01G
  return YXML_CONTENT;
147
4.01G
}
148
149
531k
static inline yxml_ret_t yxml_datapi1(yxml_t *x, unsigned ch) {
150
531k
  yxml_setchar(x->data, ch);
151
531k
  x->data[1] = 0;
152
531k
  return YXML_PICONTENT;
153
531k
}
154
155
689
static inline yxml_ret_t yxml_datapi2(yxml_t *x, unsigned ch) {
156
689
  x->data[0] = '?';
157
689
  yxml_setchar(x->data+1, ch);
158
689
  x->data[2] = 0;
159
689
  return YXML_PICONTENT;
160
689
}
161
162
500
static inline yxml_ret_t yxml_datacd1(yxml_t *x, unsigned ch) {
163
500
  x->data[0] = ']';
164
500
  yxml_setchar(x->data+1, ch);
165
500
  x->data[2] = 0;
166
500
  return YXML_CONTENT;
167
500
}
168
169
495
static inline yxml_ret_t yxml_datacd2(yxml_t *x, unsigned ch) {
170
495
  x->data[0] = ']';
171
495
  x->data[1] = ']';
172
495
  yxml_setchar(x->data+2, ch);
173
495
  x->data[3] = 0;
174
495
  return YXML_CONTENT;
175
495
}
176
177
114M
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
114M
  yxml_setchar(x->data, ch == 0x9 || ch == 0xa ? 0x20 : ch);
180
114M
  x->data[1] = 0;
181
114M
  return YXML_ATTRVAL;
182
114M
}
183
184
46.5M
static yxml_ret_t yxml_pushstack(yxml_t *x, char **res, unsigned ch) {
185
46.5M
  if(x->stacklen+2 >= x->stacksize)
186
9
    return YXML_ESTACK;
187
46.5M
  x->stacklen++;
188
46.5M
  *res = (char *)x->stack+x->stacklen;
189
46.5M
  x->stack[x->stacklen] = (unsigned char)ch;
190
46.5M
  x->stacklen++;
191
46.5M
  x->stack[x->stacklen] = 0;
192
46.5M
  return YXML_OK;
193
46.5M
}
194
195
268M
static yxml_ret_t yxml_pushstackc(yxml_t *x, unsigned ch) {
196
268M
  if(x->stacklen+1 >= x->stacksize)
197
6
    return YXML_ESTACK;
198
268M
  x->stack[x->stacklen] = (unsigned char)ch;
199
268M
  x->stacklen++;
200
268M
  x->stack[x->stacklen] = 0;
201
268M
  return YXML_OK;
202
268M
}
203
204
46.5M
static void yxml_popstack(yxml_t *x) {
205
46.5M
  do
206
361M
    x->stacklen--;
207
361M
  while(x->stack[x->stacklen]);
208
46.5M
}
209
210
40.9M
static inline yxml_ret_t yxml_elemstart  (yxml_t *x, unsigned ch) { return yxml_pushstack(x, &x->elem, ch); }
211
213M
static inline yxml_ret_t yxml_elemname   (yxml_t *x, unsigned ch) { return yxml_pushstackc(x, ch); }
212
40.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
40.9M
static yxml_ret_t yxml_selfclose(yxml_t *x, unsigned ch) {
217
40.9M
  yxml_popstack(x);
218
40.9M
  if(x->stacklen) {
219
38.4M
    x->elem = (char *)x->stack+x->stacklen-1;
220
282M
    while(*(x->elem-1))
221
243M
      x->elem--;
222
38.4M
    return YXML_ELEMEND;
223
38.4M
  }
224
2.44M
  x->elem = (char *)x->stack;
225
2.44M
  x->state = YXMLS_misc3;
226
2.44M
  return YXML_ELEMEND;
227
40.9M
}
228
229
190M
static inline yxml_ret_t yxml_elemclose(yxml_t *x, unsigned ch) {
230
190M
  if(*((unsigned char *)x->elem) != ch)
231
195
    return YXML_ECLOSE;
232
190M
  x->elem++;
233
190M
  return YXML_OK;
234
190M
}
235
236
22.6M
static inline yxml_ret_t yxml_elemcloseend(yxml_t *x, unsigned ch) {
237
22.6M
  if(*x->elem)
238
2
    return YXML_ECLOSE;
239
22.6M
  return yxml_selfclose(x, ch);
240
22.6M
}
241
242
5.64M
static inline yxml_ret_t yxml_attrstart  (yxml_t *x, unsigned ch) { return yxml_pushstack(x, &x->attr, ch); }
243
54.8M
static inline yxml_ret_t yxml_attrname   (yxml_t *x, unsigned ch) { return yxml_pushstackc(x, ch); }
244
5.64M
static inline yxml_ret_t yxml_attrnameend(yxml_t *x, unsigned ch) { return YXML_ATTRSTART; }
245
5.64M
static inline yxml_ret_t yxml_attrvalend (yxml_t *x, unsigned ch) { yxml_popstack(x); return YXML_ATTREND; }
246
247
9.21k
static inline yxml_ret_t yxml_pistart  (yxml_t *x, unsigned ch) { return yxml_pushstack(x, &x->pi, ch); }
248
14.0k
static inline yxml_ret_t yxml_piname   (yxml_t *x, unsigned ch) { return yxml_pushstackc(x, ch); }
249
1.04k
static inline yxml_ret_t yxml_piabort  (yxml_t *x, unsigned ch) { yxml_popstack(x); return YXML_OK; }
250
7.61k
static inline yxml_ret_t yxml_pinameend(yxml_t *x, unsigned ch) {
251
7.61k
  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.61k
}
253
7.31k
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
6.63k
static inline yxml_ret_t yxml_refstart(yxml_t *x, unsigned ch) {
256
6.63k
  memset(x->data, 0, sizeof(x->data));
257
6.63k
  x->reflen = 0;
258
6.63k
  return YXML_OK;
259
6.63k
}
260
261
22.8k
static yxml_ret_t yxml_ref(yxml_t *x, unsigned ch) {
262
22.8k
  if(x->reflen >= sizeof(x->data)-1)
263
38
    return YXML_EREF;
264
22.8k
  yxml_setchar(x->data+x->reflen, ch);
265
22.8k
  x->reflen++;
266
22.8k
  return YXML_OK;
267
22.8k
}
268
269
6.41k
static yxml_ret_t yxml_refend(yxml_t *x, yxml_ret_t ret) {
270
6.41k
  unsigned char *r = (unsigned char *)x->data;
271
6.41k
  unsigned ch = 0;
272
6.41k
  if(*r == '#') {
273
3.96k
    if(r[1] == 'x')
274
4.64k
      for(r += 2; yxml_isHex((unsigned)*r); r++)
275
3.31k
        ch = (ch<<4) + (*r <= '9' ? *r-'0' : (*r|32)-'a' + 10);
276
2.63k
    else
277
8.96k
      for(r++; yxml_isNum((unsigned)*r); r++)
278
6.33k
        ch = (ch*10) + (*r-'0');
279
3.96k
    if(*r)
280
20
      ch = 0;
281
3.96k
  } else {
282
2.44k
    uint64_t i = INTFROM5CHARS(r[0], r[1], r[2], r[3], r[4]);
283
2.44k
    ch =
284
2.44k
      i == INTFROM5CHARS('l','t', 0,  0, 0) ? '<' :
285
2.44k
      i == INTFROM5CHARS('g','t', 0,  0, 0) ? '>' :
286
2.01k
      i == INTFROM5CHARS('a','m','p', 0, 0) ? '&' :
287
1.61k
      i == INTFROM5CHARS('a','p','o','s',0) ? '\'':
288
1.22k
      i == INTFROM5CHARS('q','u','o','t',0) ? '"' : 0;
289
2.44k
  }
290
291
  /* Codepoints not allowed in the XML 1.1 definition of a Char */
292
6.41k
  if(!ch || ch > 0x10FFFF || ch == 0xFFFE || ch == 0xFFFF || (ch-0xDFFF) < 0x7FF)
293
387
    return YXML_EREF;
294
6.02k
  yxml_setutf8(x->data, ch);
295
6.02k
  return ret;
296
6.41k
}
297
298
5.21k
static inline yxml_ret_t yxml_refcontent(yxml_t *x, unsigned ch) { return yxml_refend(x, YXML_CONTENT); }
299
1.19k
static inline yxml_ret_t yxml_refattrval(yxml_t *x, unsigned ch) { return yxml_refend(x, YXML_ATTRVAL); }
300
301
2.45M
void yxml_init(yxml_t *x, void *stack, size_t stacksize) {
302
2.45M
  memset(x, 0, sizeof(*x));
303
2.45M
  x->line = 1;
304
2.45M
  x->stack = (unsigned char*)stack;
305
2.45M
  x->stacksize = stacksize;
306
2.45M
  *x->stack = 0;
307
2.45M
  x->elem = x->pi = x->attr = (char *)x->stack;
308
2.45M
  x->state = YXMLS_init;
309
2.45M
}
310
311
4.83G
yxml_ret_t yxml_parse(yxml_t *x, int _ch) {
312
  /* Ensure that characters are in the range of 0..255 rather than -126..125.
313
   * All character comparisons are done with positive integers. */
314
4.83G
  unsigned ch = (unsigned)(_ch+256) & 0xff;
315
4.83G
  if(!ch)
316
6
    return YXML_ESYN;
317
4.83G
  x->total++;
318
319
  /* End-of-Line normalization, "\rX", "\r\n" and "\n" are recognized and
320
   * normalized to a single '\n' as per XML 1.0 section 2.11. XML 1.1 adds
321
   * some non-ASCII character sequences to this list, but we can only handle
322
   * ASCII here without making assumptions about the input encoding. */
323
4.83G
  if(x->ignore == ch) {
324
4.68k
    x->ignore = 0;
325
4.68k
    return YXML_OK;
326
4.68k
  }
327
4.83G
  x->ignore = (ch == 0xd) * 0xa;
328
4.83G
  if(ch == 0xa || ch == 0xd) {
329
2.91M
    ch = 0xa;
330
2.91M
    x->line++;
331
2.91M
    x->byte = 0;
332
2.91M
  }
333
4.83G
  x->byte++;
334
335
4.83G
  switch((yxml_state_t)x->state) {
336
21.2k
  case YXMLS_string:
337
21.2k
    if(ch == *x->string) {
338
21.2k
      x->string++;
339
21.2k
      if(!*x->string)
340
3.96k
        x->state = x->nextstate;
341
21.2k
      return YXML_OK;
342
21.2k
    }
343
23
    break;
344
60.4M
  case YXMLS_attr0:
345
60.4M
    if(yxml_isName(ch))
346
54.8M
      return yxml_attrname(x, ch);
347
5.64M
    if(yxml_isSP(ch)) {
348
1.40M
      x->state = YXMLS_attr1;
349
1.40M
      return yxml_attrnameend(x, ch);
350
1.40M
    }
351
4.23M
    if(ch == (unsigned char)'=') {
352
4.23M
      x->state = YXMLS_attr2;
353
4.23M
      return yxml_attrnameend(x, ch);
354
4.23M
    }
355
50
    break;
356
1.40M
  case YXMLS_attr1:
357
1.40M
    if(yxml_isSP(ch))
358
1.18k
      return YXML_OK;
359
1.40M
    if(ch == (unsigned char)'=') {
360
1.40M
      x->state = YXMLS_attr2;
361
1.40M
      return YXML_OK;
362
1.40M
    }
363
32
    break;
364
5.64M
  case YXMLS_attr2:
365
5.64M
    if(yxml_isSP(ch))
366
1.16k
      return YXML_OK;
367
5.64M
    if(ch == (unsigned char)'\'' || ch == (unsigned char)'"') {
368
5.64M
      x->state = YXMLS_attr3;
369
5.64M
      x->quote = ch;
370
5.64M
      return YXML_OK;
371
5.64M
    }
372
30
    break;
373
120M
  case YXMLS_attr3:
374
120M
    if(yxml_isAttValue(ch))
375
114M
      return yxml_dataattr(x, ch);
376
5.64M
    if(ch == (unsigned char)'&') {
377
1.30k
      x->state = YXMLS_attr4;
378
1.30k
      return yxml_refstart(x, ch);
379
1.30k
    }
380
5.64M
    if(x->quote == ch) {
381
5.64M
      x->state = YXMLS_elem2;
382
5.64M
      return yxml_attrvalend(x, ch);
383
5.64M
    }
384
2
    break;
385
5.24k
  case YXMLS_attr4:
386
5.24k
    if(yxml_isRef(ch))
387
4.01k
      return yxml_ref(x, ch);
388
1.23k
    if(ch == (unsigned char)'\x3b') {
389
1.19k
      x->state = YXMLS_attr3;
390
1.19k
      return yxml_refattrval(x, ch);
391
1.19k
    }
392
31
    break;
393
3.18k
  case YXMLS_cd0:
394
3.18k
    if(ch == (unsigned char)']') {
395
1.50k
      x->state = YXMLS_cd1;
396
1.50k
      return YXML_OK;
397
1.50k
    }
398
1.68k
    if(yxml_isChar(ch))
399
1.68k
      return yxml_datacontent(x, ch);
400
0
    break;
401
1.49k
  case YXMLS_cd1:
402
1.49k
    if(ch == (unsigned char)']') {
403
991
      x->state = YXMLS_cd2;
404
991
      return YXML_OK;
405
991
    }
406
500
    if(yxml_isChar(ch)) {
407
500
      x->state = YXMLS_cd0;
408
500
      return yxml_datacd1(x, ch);
409
500
    }
410
0
    break;
411
1.41k
  case YXMLS_cd2:
412
1.41k
    if(ch == (unsigned char)']')
413
452
      return yxml_datacontent(x, ch);
414
963
    if(ch == (unsigned char)'>') {
415
468
      x->state = YXMLS_misc2;
416
468
      return YXML_OK;
417
468
    }
418
495
    if(yxml_isChar(ch)) {
419
495
      x->state = YXMLS_cd0;
420
495
      return yxml_datacd2(x, ch);
421
495
    }
422
0
    break;
423
450
  case YXMLS_comment0:
424
450
    if(ch == (unsigned char)'-') {
425
429
      x->state = YXMLS_comment1;
426
429
      return YXML_OK;
427
429
    }
428
21
    break;
429
2.56k
  case YXMLS_comment1:
430
2.56k
    if(ch == (unsigned char)'-') {
431
2.54k
      x->state = YXMLS_comment2;
432
2.54k
      return YXML_OK;
433
2.54k
    }
434
23
    break;
435
3.60k
  case YXMLS_comment2:
436
3.60k
    if(ch == (unsigned char)'-') {
437
3.11k
      x->state = YXMLS_comment3;
438
3.11k
      return YXML_OK;
439
3.11k
    }
440
491
    if(yxml_isChar(ch))
441
491
      return YXML_OK;
442
0
    break;
443
3.09k
  case YXMLS_comment3:
444
3.09k
    if(ch == (unsigned char)'-') {
445
2.44k
      x->state = YXMLS_comment4;
446
2.44k
      return YXML_OK;
447
2.44k
    }
448
651
    if(yxml_isChar(ch)) {
449
651
      x->state = YXMLS_comment2;
450
651
      return YXML_OK;
451
651
    }
452
0
    break;
453
2.43k
  case YXMLS_comment4:
454
2.43k
    if(ch == (unsigned char)'>') {
455
2.41k
      x->state = x->nextstate;
456
2.41k
      return YXML_OK;
457
2.41k
    }
458
19
    break;
459
3.84k
  case YXMLS_dt0:
460
3.84k
    if(ch == (unsigned char)'>') {
461
658
      x->state = YXMLS_misc1;
462
658
      return YXML_OK;
463
658
    }
464
3.18k
    if(ch == (unsigned char)'\'' || ch == (unsigned char)'"') {
465
1.19k
      x->state = YXMLS_dt1;
466
1.19k
      x->quote = ch;
467
1.19k
      x->nextstate = YXMLS_dt0;
468
1.19k
      return YXML_OK;
469
1.19k
    }
470
1.98k
    if(ch == (unsigned char)'<') {
471
1.53k
      x->state = YXMLS_dt2;
472
1.53k
      return YXML_OK;
473
1.53k
    }
474
454
    if(yxml_isChar(ch))
475
454
      return YXML_OK;
476
0
    break;
477
2.28k
  case YXMLS_dt1:
478
2.28k
    if(x->quote == ch) {
479
1.87k
      x->state = x->nextstate;
480
1.87k
      return YXML_OK;
481
1.87k
    }
482
404
    if(yxml_isChar(ch))
483
404
      return YXML_OK;
484
0
    break;
485
1.52k
  case YXMLS_dt2:
486
1.52k
    if(ch == (unsigned char)'?') {
487
388
      x->state = YXMLS_pi0;
488
388
      x->nextstate = YXMLS_dt0;
489
388
      return YXML_OK;
490
388
    }
491
1.13k
    if(ch == (unsigned char)'!') {
492
1.13k
      x->state = YXMLS_dt3;
493
1.13k
      return YXML_OK;
494
1.13k
    }
495
2
    break;
496
1.11k
  case YXMLS_dt3:
497
1.11k
    if(ch == (unsigned char)'-') {
498
388
      x->state = YXMLS_comment1;
499
388
      x->nextstate = YXMLS_dt0;
500
388
      return YXML_OK;
501
388
    }
502
731
    if(yxml_isChar(ch)) {
503
731
      x->state = YXMLS_dt4;
504
731
      return YXML_OK;
505
731
    }
506
0
    break;
507
1.81k
  case YXMLS_dt4:
508
1.81k
    if(ch == (unsigned char)'\'' || ch == (unsigned char)'"') {
509
776
      x->state = YXMLS_dt1;
510
776
      x->quote = ch;
511
776
      x->nextstate = YXMLS_dt4;
512
776
      return YXML_OK;
513
776
    }
514
1.04k
    if(ch == (unsigned char)'>') {
515
636
      x->state = YXMLS_dt0;
516
636
      return YXML_OK;
517
636
    }
518
405
    if(yxml_isChar(ch))
519
405
      return YXML_OK;
520
0
    break;
521
254M
  case YXMLS_elem0:
522
254M
    if(yxml_isName(ch))
523
213M
      return yxml_elemname(x, ch);
524
40.9M
    if(yxml_isSP(ch)) {
525
3.37M
      x->state = YXMLS_elem1;
526
3.37M
      return yxml_elemnameend(x, ch);
527
3.37M
    }
528
37.5M
    if(ch == (unsigned char)'/') {
529
16.0M
      x->state = YXMLS_elem3;
530
16.0M
      return yxml_elemnameend(x, ch);
531
16.0M
    }
532
21.5M
    if(ch == (unsigned char)'>') {
533
21.5M
      x->state = YXMLS_misc2;
534
21.5M
      return yxml_elemnameend(x, ch);
535
21.5M
    }
536
53
    break;
537
7.87M
  case YXMLS_elem1:
538
7.87M
    if(yxml_isSP(ch))
539
1.36M
      return YXML_OK;
540
6.50M
    if(ch == (unsigned char)'/') {
541
866k
      x->state = YXMLS_elem3;
542
866k
      return YXML_OK;
543
866k
    }
544
5.64M
    if(ch == (unsigned char)'>') {
545
787
      x->state = YXMLS_misc2;
546
787
      return YXML_OK;
547
787
    }
548
5.64M
    if(yxml_isNameStart(ch)) {
549
5.64M
      x->state = YXMLS_attr0;
550
5.64M
      return yxml_attrstart(x, ch);
551
5.64M
    }
552
42
    break;
553
5.64M
  case YXMLS_elem2:
554
5.64M
    if(yxml_isSP(ch)) {
555
3.13M
      x->state = YXMLS_elem1;
556
3.13M
      return YXML_OK;
557
3.13M
    }
558
2.50M
    if(ch == (unsigned char)'/') {
559
1.35M
      x->state = YXMLS_elem3;
560
1.35M
      return YXML_OK;
561
1.35M
    }
562
1.15M
    if(ch == (unsigned char)'>') {
563
1.15M
      x->state = YXMLS_misc2;
564
1.15M
      return YXML_OK;
565
1.15M
    }
566
39
    break;
567
18.2M
  case YXMLS_elem3:
568
18.2M
    if(ch == (unsigned char)'>') {
569
18.2M
      x->state = YXMLS_misc2;
570
18.2M
      return yxml_selfclose(x, ch);
571
18.2M
    }
572
22
    break;
573
1.56k
  case YXMLS_enc0:
574
1.56k
    if(yxml_isSP(ch))
575
1.16k
      return YXML_OK;
576
399
    if(ch == (unsigned char)'=') {
577
383
      x->state = YXMLS_enc1;
578
383
      return YXML_OK;
579
383
    }
580
16
    break;
581
1.49k
  case YXMLS_enc1:
582
1.49k
    if(yxml_isSP(ch))
583
1.16k
      return YXML_OK;
584
333
    if(ch == (unsigned char)'\'' || ch == (unsigned char)'"') {
585
304
      x->state = YXMLS_enc2;
586
304
      x->quote = ch;
587
304
      return YXML_OK;
588
304
    }
589
29
    break;
590
300
  case YXMLS_enc2:
591
300
    if(yxml_isAlpha(ch)) {
592
282
      x->state = YXMLS_enc3;
593
282
      return YXML_OK;
594
282
    }
595
18
    break;
596
2.15k
  case YXMLS_enc3:
597
2.15k
    if(yxml_isEncName(ch))
598
1.96k
      return YXML_OK;
599
189
    if(x->quote == ch) {
600
152
      x->state = YXMLS_xmldecl6;
601
152
      return YXML_OK;
602
152
    }
603
37
    break;
604
22.6M
  case YXMLS_etag0:
605
22.6M
    if(yxml_isNameStart(ch)) {
606
22.6M
      x->state = YXMLS_etag1;
607
22.6M
      return yxml_elemclose(x, ch);
608
22.6M
    }
609
32
    break;
610
190M
  case YXMLS_etag1:
611
190M
    if(yxml_isName(ch))
612
168M
      return yxml_elemclose(x, ch);
613
22.6M
    if(yxml_isSP(ch)) {
614
1.57k
      x->state = YXMLS_etag2;
615
1.57k
      return yxml_elemcloseend(x, ch);
616
1.57k
    }
617
22.6M
    if(ch == (unsigned char)'>') {
618
22.6M
      x->state = YXMLS_misc2;
619
22.6M
      return yxml_elemcloseend(x, ch);
620
22.6M
    }
621
41
    break;
622
4.05k
  case YXMLS_etag2:
623
4.05k
    if(yxml_isSP(ch))
624
2.56k
      return YXML_OK;
625
1.48k
    if(ch == (unsigned char)'>') {
626
1.44k
      x->state = YXMLS_misc2;
627
1.44k
      return YXML_OK;
628
1.44k
    }
629
40
    break;
630
2.45M
  case YXMLS_init:
631
2.45M
    if(ch == (unsigned char)'\xef') {
632
35
      x->state = YXMLS_string;
633
35
      x->nextstate = YXMLS_misc0;
634
35
      x->string = (unsigned char *)"\xbb\xbf";
635
35
      return YXML_OK;
636
35
    }
637
2.45M
    if(yxml_isSP(ch)) {
638
223
      x->state = YXMLS_misc0;
639
223
      return YXML_OK;
640
223
    }
641
2.45M
    if(ch == (unsigned char)'<') {
642
2.45M
      x->state = YXMLS_le0;
643
2.45M
      return YXML_OK;
644
2.45M
    }
645
61
    break;
646
2.45M
  case YXMLS_le0:
647
2.45M
    if(ch == (unsigned char)'!') {
648
586
      x->state = YXMLS_lee1;
649
586
      return YXML_OK;
650
586
    }
651
2.45M
    if(ch == (unsigned char)'?') {
652
2.37k
      x->state = YXMLS_leq0;
653
2.37k
      return YXML_OK;
654
2.37k
    }
655
2.44M
    if(yxml_isNameStart(ch)) {
656
2.44M
      x->state = YXMLS_elem0;
657
2.44M
      return yxml_elemstart(x, ch);
658
2.44M
    }
659
48
    break;
660
5.48k
  case YXMLS_le1:
661
5.48k
    if(ch == (unsigned char)'!') {
662
1.59k
      x->state = YXMLS_lee1;
663
1.59k
      return YXML_OK;
664
1.59k
    }
665
3.89k
    if(ch == (unsigned char)'?') {
666
3.46k
      x->state = YXMLS_pi0;
667
3.46k
      x->nextstate = YXMLS_misc1;
668
3.46k
      return YXML_OK;
669
3.46k
    }
670
430
    if(yxml_isNameStart(ch)) {
671
400
      x->state = YXMLS_elem0;
672
400
      return yxml_elemstart(x, ch);
673
400
    }
674
30
    break;
675
61.1M
  case YXMLS_le2:
676
61.1M
    if(ch == (unsigned char)'!') {
677
1.32k
      x->state = YXMLS_lee2;
678
1.32k
      return YXML_OK;
679
1.32k
    }
680
61.1M
    if(ch == (unsigned char)'?') {
681
2.37k
      x->state = YXMLS_pi0;
682
2.37k
      x->nextstate = YXMLS_misc2;
683
2.37k
      return YXML_OK;
684
2.37k
    }
685
61.1M
    if(ch == (unsigned char)'/') {
686
22.6M
      x->state = YXMLS_etag0;
687
22.6M
      return YXML_OK;
688
22.6M
    }
689
38.4M
    if(yxml_isNameStart(ch)) {
690
38.4M
      x->state = YXMLS_elem0;
691
38.4M
      return yxml_elemstart(x, ch);
692
38.4M
    }
693
47
    break;
694
1.23k
  case YXMLS_le3:
695
1.23k
    if(ch == (unsigned char)'!') {
696
461
      x->state = YXMLS_comment0;
697
461
      x->nextstate = YXMLS_misc3;
698
461
      return YXML_OK;
699
461
    }
700
771
    if(ch == (unsigned char)'?') {
701
737
      x->state = YXMLS_pi0;
702
737
      x->nextstate = YXMLS_misc3;
703
737
      return YXML_OK;
704
737
    }
705
34
    break;
706
2.16k
  case YXMLS_lee1:
707
2.16k
    if(ch == (unsigned char)'-') {
708
1.13k
      x->state = YXMLS_comment1;
709
1.13k
      x->nextstate = YXMLS_misc1;
710
1.13k
      return YXML_OK;
711
1.13k
    }
712
1.03k
    if(ch == (unsigned char)'D') {
713
1.00k
      x->state = YXMLS_string;
714
1.00k
      x->nextstate = YXMLS_dt0;
715
1.00k
      x->string = (unsigned char *)"OCTYPE";
716
1.00k
      return YXML_OK;
717
1.00k
    }
718
31
    break;
719
1.31k
  case YXMLS_lee2:
720
1.31k
    if(ch == (unsigned char)'-') {
721
677
      x->state = YXMLS_comment1;
722
677
      x->nextstate = YXMLS_misc2;
723
677
      return YXML_OK;
724
677
    }
725
635
    if(ch == (unsigned char)'[') {
726
607
      x->state = YXMLS_string;
727
607
      x->nextstate = YXMLS_cd0;
728
607
      x->string = (unsigned char *)"CDATA[";
729
607
      return YXML_OK;
730
607
    }
731
28
    break;
732
2.37k
  case YXMLS_leq0:
733
2.37k
    if(ch == (unsigned char)'x') {
734
1.74k
      x->state = YXMLS_xmldecl0;
735
1.74k
      x->nextstate = YXMLS_misc1;
736
1.74k
      return yxml_pistart(x, ch);
737
1.74k
    }
738
627
    if(yxml_isNameStart(ch)) {
739
594
      x->state = YXMLS_pi1;
740
594
      x->nextstate = YXMLS_misc1;
741
594
      return yxml_pistart(x, ch);
742
594
    }
743
33
    break;
744
2.42k
  case YXMLS_misc0:
745
2.42k
    if(yxml_isSP(ch))
746
2.29k
      return YXML_OK;
747
137
    if(ch == (unsigned char)'<') {
748
92
      x->state = YXMLS_le0;
749
92
      return YXML_OK;
750
92
    }
751
45
    break;
752
6.73k
  case YXMLS_misc1:
753
6.73k
    if(yxml_isSP(ch))
754
1.21k
      return YXML_OK;
755
5.52k
    if(ch == (unsigned char)'<') {
756
5.49k
      x->state = YXMLS_le1;
757
5.49k
      return YXML_OK;
758
5.49k
    }
759
21
    break;
760
4.07G
  case YXMLS_misc2:
761
4.07G
    if(ch == (unsigned char)'<') {
762
61.1M
      x->state = YXMLS_le2;
763
61.1M
      return YXML_OK;
764
61.1M
    }
765
4.01G
    if(ch == (unsigned char)'&') {
766
5.33k
      x->state = YXMLS_misc2a;
767
5.33k
      return yxml_refstart(x, ch);
768
5.33k
    }
769
4.01G
    if(yxml_isChar(ch))
770
4.01G
      return yxml_datacontent(x, ch);
771
0
    break;
772
24.0k
  case YXMLS_misc2a:
773
24.0k
    if(yxml_isRef(ch))
774
18.8k
      return yxml_ref(x, ch);
775
5.24k
    if(ch == (unsigned char)'\x3b') {
776
5.21k
      x->state = YXMLS_misc2;
777
5.21k
      return yxml_refcontent(x, ch);
778
5.21k
    }
779
34
    break;
780
2.50k
  case YXMLS_misc3:
781
2.50k
    if(yxml_isSP(ch))
782
1.21k
      return YXML_OK;
783
1.28k
    if(ch == (unsigned char)'<') {
784
1.24k
      x->state = YXMLS_le3;
785
1.24k
      return YXML_OK;
786
1.24k
    }
787
43
    break;
788
6.90k
  case YXMLS_pi0:
789
6.90k
    if(yxml_isNameStart(ch)) {
790
6.87k
      x->state = YXMLS_pi1;
791
6.87k
      return yxml_pistart(x, ch);
792
6.87k
    }
793
26
    break;
794
18.3k
  case YXMLS_pi1:
795
18.3k
    if(yxml_isName(ch))
796
10.8k
      return yxml_piname(x, ch);
797
7.54k
    if(ch == (unsigned char)'?') {
798
4.71k
      x->state = YXMLS_pi4;
799
4.71k
      return yxml_pinameend(x, ch);
800
4.71k
    }
801
2.82k
    if(yxml_isSP(ch)) {
802
2.77k
      x->state = YXMLS_pi2;
803
2.77k
      return yxml_pinameend(x, ch);
804
2.77k
    }
805
46
    break;
806
534k
  case YXMLS_pi2:
807
534k
    if(ch == (unsigned char)'?') {
808
3.37k
      x->state = YXMLS_pi3;
809
3.37k
      return YXML_OK;
810
3.37k
    }
811
531k
    if(yxml_isChar(ch))
812
531k
      return yxml_datapi1(x, ch);
813
0
    break;
814
3.36k
  case YXMLS_pi3:
815
3.36k
    if(ch == (unsigned char)'>') {
816
2.67k
      x->state = x->nextstate;
817
2.67k
      return yxml_pivalend(x, ch);
818
2.67k
    }
819
689
    if(yxml_isChar(ch)) {
820
689
      x->state = YXMLS_pi2;
821
689
      return yxml_datapi2(x, ch);
822
689
    }
823
0
    break;
824
4.66k
  case YXMLS_pi4:
825
4.66k
    if(ch == (unsigned char)'>') {
826
4.64k
      x->state = x->nextstate;
827
4.64k
      return yxml_pivalend(x, ch);
828
4.64k
    }
829
21
    break;
830
698
  case YXMLS_std0:
831
698
    if(yxml_isSP(ch))
832
582
      return YXML_OK;
833
116
    if(ch == (unsigned char)'=') {
834
102
      x->state = YXMLS_std1;
835
102
      return YXML_OK;
836
102
    }
837
14
    break;
838
661
  case YXMLS_std1:
839
661
    if(yxml_isSP(ch))
840
584
      return YXML_OK;
841
77
    if(ch == (unsigned char)'\'' || ch == (unsigned char)'"') {
842
60
      x->state = YXMLS_std2;
843
60
      x->quote = ch;
844
60
      return YXML_OK;
845
60
    }
846
17
    break;
847
58
  case YXMLS_std2:
848
58
    if(ch == (unsigned char)'y') {
849
3
      x->state = YXMLS_string;
850
3
      x->nextstate = YXMLS_std3;
851
3
      x->string = (unsigned char *)"es";
852
3
      return YXML_OK;
853
3
    }
854
55
    if(ch == (unsigned char)'n') {
855
46
      x->state = YXMLS_string;
856
46
      x->nextstate = YXMLS_std3;
857
46
      x->string = (unsigned char *)"o";
858
46
      return YXML_OK;
859
46
    }
860
9
    break;
861
46
  case YXMLS_std3:
862
46
    if(x->quote == ch) {
863
45
      x->state = YXMLS_xmldecl8;
864
45
      return YXML_OK;
865
45
    }
866
1
    break;
867
2.07k
  case YXMLS_ver0:
868
2.07k
    if(yxml_isSP(ch))
869
1.16k
      return YXML_OK;
870
907
    if(ch == (unsigned char)'=') {
871
891
      x->state = YXMLS_ver1;
872
891
      return YXML_OK;
873
891
    }
874
16
    break;
875
2.00k
  case YXMLS_ver1:
876
2.00k
    if(yxml_isSP(ch))
877
1.16k
      return YXML_OK;
878
841
    if(ch == (unsigned char)'\'' || ch == (unsigned char)'"') {
879
808
      x->state = YXMLS_string;
880
808
      x->quote = ch;
881
808
      x->nextstate = YXMLS_ver2;
882
808
      x->string = (unsigned char *)"1.";
883
808
      return YXML_OK;
884
808
    }
885
33
    break;
886
802
  case YXMLS_ver2:
887
802
    if(yxml_isNum(ch)) {
888
790
      x->state = YXMLS_ver3;
889
790
      return YXML_OK;
890
790
    }
891
12
    break;
892
1.16k
  case YXMLS_ver3:
893
1.16k
    if(yxml_isNum(ch))
894
388
      return YXML_OK;
895
772
    if(x->quote == ch) {
896
748
      x->state = YXMLS_xmldecl4;
897
748
      return YXML_OK;
898
748
    }
899
24
    break;
900
1.74k
  case YXMLS_xmldecl0:
901
1.74k
    if(ch == (unsigned char)'m') {
902
1.46k
      x->state = YXMLS_xmldecl1;
903
1.46k
      return yxml_piname(x, ch);
904
1.46k
    }
905
275
    if(yxml_isName(ch)) {
906
134
      x->state = YXMLS_pi1;
907
134
      return yxml_piname(x, ch);
908
134
    }
909
141
    if(ch == (unsigned char)'?') {
910
47
      x->state = YXMLS_pi4;
911
47
      return yxml_pinameend(x, ch);
912
47
    }
913
94
    if(yxml_isSP(ch)) {
914
44
      x->state = YXMLS_pi2;
915
44
      return yxml_pinameend(x, ch);
916
44
    }
917
50
    break;
918
1.46k
  case YXMLS_xmldecl1:
919
1.46k
    if(ch == (unsigned char)'l') {
920
1.29k
      x->state = YXMLS_xmldecl2;
921
1.29k
      return yxml_piname(x, ch);
922
1.29k
    }
923
169
    if(yxml_isName(ch)) {
924
94
      x->state = YXMLS_pi1;
925
94
      return yxml_piname(x, ch);
926
94
    }
927
75
    if(ch == (unsigned char)'?') {
928
6
      x->state = YXMLS_pi4;
929
6
      return yxml_pinameend(x, ch);
930
6
    }
931
69
    if(yxml_isSP(ch)) {
932
20
      x->state = YXMLS_pi2;
933
20
      return yxml_pinameend(x, ch);
934
20
    }
935
49
    break;
936
1.29k
  case YXMLS_xmldecl2:
937
1.29k
    if(yxml_isSP(ch)) {
938
1.04k
      x->state = YXMLS_xmldecl3;
939
1.04k
      return yxml_piabort(x, ch);
940
1.04k
    }
941
246
    if(yxml_isName(ch)) {
942
209
      x->state = YXMLS_pi1;
943
209
      return yxml_piname(x, ch);
944
209
    }
945
37
    break;
946
2.15k
  case YXMLS_xmldecl3:
947
2.15k
    if(yxml_isSP(ch))
948
1.16k
      return YXML_OK;
949
994
    if(ch == (unsigned char)'v') {
950
961
      x->state = YXMLS_string;
951
961
      x->nextstate = YXMLS_ver0;
952
961
      x->string = (unsigned char *)"ersion";
953
961
      return YXML_OK;
954
961
    }
955
33
    break;
956
746
  case YXMLS_xmldecl4:
957
746
    if(yxml_isSP(ch)) {
958
678
      x->state = YXMLS_xmldecl5;
959
678
      return YXML_OK;
960
678
    }
961
68
    if(ch == (unsigned char)'?') {
962
37
      x->state = YXMLS_xmldecl9;
963
37
      return YXML_OK;
964
37
    }
965
31
    break;
966
1.78k
  case YXMLS_xmldecl5:
967
1.78k
    if(yxml_isSP(ch))
968
1.16k
      return YXML_OK;
969
624
    if(ch == (unsigned char)'?') {
970
14
      x->state = YXMLS_xmldecl9;
971
14
      return YXML_OK;
972
14
    }
973
610
    if(ch == (unsigned char)'e') {
974
449
      x->state = YXMLS_string;
975
449
      x->nextstate = YXMLS_enc0;
976
449
      x->string = (unsigned char *)"ncoding";
977
449
      return YXML_OK;
978
449
    }
979
161
    if(ch == (unsigned char)'s') {
980
138
      x->state = YXMLS_string;
981
138
      x->nextstate = YXMLS_std0;
982
138
      x->string = (unsigned char *)"tandalone";
983
138
      return YXML_OK;
984
138
    }
985
23
    break;
986
150
  case YXMLS_xmldecl6:
987
150
    if(yxml_isSP(ch)) {
988
107
      x->state = YXMLS_xmldecl7;
989
107
      return YXML_OK;
990
107
    }
991
43
    if(ch == (unsigned char)'?') {
992
10
      x->state = YXMLS_xmldecl9;
993
10
      return YXML_OK;
994
10
    }
995
33
    break;
996
1.21k
  case YXMLS_xmldecl7:
997
1.21k
    if(yxml_isSP(ch))
998
1.16k
      return YXML_OK;
999
53
    if(ch == (unsigned char)'?') {
1000
14
      x->state = YXMLS_xmldecl9;
1001
14
      return YXML_OK;
1002
14
    }
1003
39
    if(ch == (unsigned char)'s') {
1004
6
      x->state = YXMLS_string;
1005
6
      x->nextstate = YXMLS_std0;
1006
6
      x->string = (unsigned char *)"tandalone";
1007
6
      return YXML_OK;
1008
6
    }
1009
33
    break;
1010
603
  case YXMLS_xmldecl8:
1011
603
    if(yxml_isSP(ch))
1012
583
      return YXML_OK;
1013
20
    if(ch == (unsigned char)'?') {
1014
9
      x->state = YXMLS_xmldecl9;
1015
9
      return YXML_OK;
1016
9
    }
1017
11
    break;
1018
75
  case YXMLS_xmldecl9:
1019
75
    if(ch == (unsigned char)'>') {
1020
55
      x->state = YXMLS_misc1;
1021
55
      return YXML_OK;
1022
55
    }
1023
20
    break;
1024
4.83G
  }
1025
1.59k
  return YXML_ESYN;
1026
4.83G
}
1027
1028
2.44M
yxml_ret_t yxml_eof(yxml_t *x) {
1029
2.44M
  if(x->state != YXMLS_misc3)
1030
4.14k
    return YXML_EEOF;
1031
2.44M
  return YXML_OK;
1032
2.44M
}
1033