Coverage Report

Created: 2026-08-13 06:39

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.17G
#define yxml_isChar(c) 1
100
/* 0xd should be part of SP, too, but yxml_parse() already normalizes that into 0xa */
101
91.2M
#define yxml_isSP(c) (c == 0x20 || c == 0x09 || c == 0x0a)
102
1.13G
#define yxml_isAlpha(c) ((c|32)-'a' < 26)
103
568M
#define yxml_isNum(c) (c-'0' < 10)
104
4.60k
#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.06G
#define yxml_isNameStart(c) (yxml_isAlpha(c) || c == ':' || c == '_' || c >= 128)
107
496M
#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
118M
#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.05G
static inline void yxml_setchar(char *dest, unsigned ch) {
119
4.05G
  *(unsigned char *)dest = (unsigned char)ch;
120
4.05G
}
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.04k
static void yxml_setutf8(char *dest, unsigned ch) {
125
6.04k
  if(ch <= 0x007F)
126
4.16k
    yxml_setchar(dest++, ch);
127
1.87k
  else if(ch <= 0x07FF) {
128
516
    yxml_setchar(dest++, 0xC0 | (ch>>6));
129
516
    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.04k
  *dest = 0;
141
6.04k
}
142
143
3.94G
static inline yxml_ret_t yxml_datacontent(yxml_t *x, unsigned ch) {
144
3.94G
  yxml_setchar(x->data, ch);
145
3.94G
  x->data[1] = 0;
146
3.94G
  return YXML_CONTENT;
147
3.94G
}
148
149
680k
static inline yxml_ret_t yxml_datapi1(yxml_t *x, unsigned ch) {
150
680k
  yxml_setchar(x->data, ch);
151
680k
  x->data[1] = 0;
152
680k
  return YXML_PICONTENT;
153
680k
}
154
155
682
static inline yxml_ret_t yxml_datapi2(yxml_t *x, unsigned ch) {
156
682
  x->data[0] = '?';
157
682
  yxml_setchar(x->data+1, ch);
158
682
  x->data[2] = 0;
159
682
  return YXML_PICONTENT;
160
682
}
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
494
static inline yxml_ret_t yxml_datacd2(yxml_t *x, unsigned ch) {
170
494
  x->data[0] = ']';
171
494
  x->data[1] = ']';
172
494
  yxml_setchar(x->data+2, ch);
173
494
  x->data[3] = 0;
174
494
  return YXML_CONTENT;
175
494
}
176
177
112M
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
112M
  yxml_setchar(x->data, ch == 0x9 || ch == 0xa ? 0x20 : ch);
180
112M
  x->data[1] = 0;
181
112M
  return YXML_ATTRVAL;
182
112M
}
183
184
46.1M
static yxml_ret_t yxml_pushstack(yxml_t *x, char **res, unsigned ch) {
185
46.1M
  if(x->stacklen+2 >= x->stacksize)
186
9
    return YXML_ESTACK;
187
46.1M
  x->stacklen++;
188
46.1M
  *res = (char *)x->stack+x->stacklen;
189
46.1M
  x->stack[x->stacklen] = (unsigned char)ch;
190
46.1M
  x->stacklen++;
191
46.1M
  x->stack[x->stacklen] = 0;
192
46.1M
  return YXML_OK;
193
46.1M
}
194
195
263M
static yxml_ret_t yxml_pushstackc(yxml_t *x, unsigned ch) {
196
263M
  if(x->stacklen+1 >= x->stacksize)
197
6
    return YXML_ESTACK;
198
263M
  x->stack[x->stacklen] = (unsigned char)ch;
199
263M
  x->stacklen++;
200
263M
  x->stack[x->stacklen] = 0;
201
263M
  return YXML_OK;
202
263M
}
203
204
46.1M
static void yxml_popstack(yxml_t *x) {
205
46.1M
  do
206
355M
    x->stacklen--;
207
355M
  while(x->stack[x->stacklen]);
208
46.1M
}
209
210
40.4M
static inline yxml_ret_t yxml_elemstart  (yxml_t *x, unsigned ch) { return yxml_pushstack(x, &x->elem, ch); }
211
209M
static inline yxml_ret_t yxml_elemname   (yxml_t *x, unsigned ch) { return yxml_pushstackc(x, ch); }
212
40.4M
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.4M
static yxml_ret_t yxml_selfclose(yxml_t *x, unsigned ch) {
217
40.4M
  yxml_popstack(x);
218
40.4M
  if(x->stacklen) {
219
38.0M
    x->elem = (char *)x->stack+x->stacklen-1;
220
278M
    while(*(x->elem-1))
221
240M
      x->elem--;
222
38.0M
    return YXML_ELEMEND;
223
38.0M
  }
224
2.39M
  x->elem = (char *)x->stack;
225
2.39M
  x->state = YXMLS_misc3;
226
2.39M
  return YXML_ELEMEND;
227
40.4M
}
228
229
187M
static inline yxml_ret_t yxml_elemclose(yxml_t *x, unsigned ch) {
230
187M
  if(*((unsigned char *)x->elem) != ch)
231
196
    return YXML_ECLOSE;
232
187M
  x->elem++;
233
187M
  return YXML_OK;
234
187M
}
235
236
22.2M
static inline yxml_ret_t yxml_elemcloseend(yxml_t *x, unsigned ch) {
237
22.2M
  if(*x->elem)
238
2
    return YXML_ECLOSE;
239
22.2M
  return yxml_selfclose(x, ch);
240
22.2M
}
241
242
5.60M
static inline yxml_ret_t yxml_attrstart  (yxml_t *x, unsigned ch) { return yxml_pushstack(x, &x->attr, ch); }
243
53.9M
static inline yxml_ret_t yxml_attrname   (yxml_t *x, unsigned ch) { return yxml_pushstackc(x, ch); }
244
5.60M
static inline yxml_ret_t yxml_attrnameend(yxml_t *x, unsigned ch) { return YXML_ATTRSTART; }
245
5.60M
static inline yxml_ret_t yxml_attrvalend (yxml_t *x, unsigned ch) { yxml_popstack(x); return YXML_ATTREND; }
246
247
9.24k
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.06k
static inline yxml_ret_t yxml_piabort  (yxml_t *x, unsigned ch) { yxml_popstack(x); return YXML_OK; }
250
7.62k
static inline yxml_ret_t yxml_pinameend(yxml_t *x, unsigned ch) {
251
7.62k
  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.62k
}
253
7.33k
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.65k
static inline yxml_ret_t yxml_refstart(yxml_t *x, unsigned ch) {
256
6.65k
  memset(x->data, 0, sizeof(x->data));
257
6.65k
  x->reflen = 0;
258
6.65k
  return YXML_OK;
259
6.65k
}
260
261
22.9k
static yxml_ret_t yxml_ref(yxml_t *x, unsigned ch) {
262
22.9k
  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.9k
}
268
269
6.42k
static yxml_ret_t yxml_refend(yxml_t *x, yxml_ret_t ret) {
270
6.42k
  unsigned char *r = (unsigned char *)x->data;
271
6.42k
  unsigned ch = 0;
272
6.42k
  if(*r == '#') {
273
3.98k
    if(r[1] == 'x')
274
4.60k
      for(r += 2; yxml_isHex((unsigned)*r); r++)
275
3.27k
        ch = (ch<<4) + (*r <= '9' ? *r-'0' : (*r|32)-'a' + 10);
276
2.66k
    else
277
9.07k
      for(r++; yxml_isNum((unsigned)*r); r++)
278
6.41k
        ch = (ch*10) + (*r-'0');
279
3.98k
    if(*r)
280
20
      ch = 0;
281
3.98k
  } 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.42k
  if(!ch || ch > 0x10FFFF || ch == 0xFFFE || ch == 0xFFFF || (ch-0xDFFF) < 0x7FF)
293
387
    return YXML_EREF;
294
6.04k
  yxml_setutf8(x->data, ch);
295
6.04k
  return ret;
296
6.42k
}
297
298
5.22k
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.40M
void yxml_init(yxml_t *x, void *stack, size_t stacksize) {
302
2.40M
  memset(x, 0, sizeof(*x));
303
2.40M
  x->line = 1;
304
2.40M
  x->stack = (unsigned char*)stack;
305
2.40M
  x->stacksize = stacksize;
306
2.40M
  *x->stack = 0;
307
2.40M
  x->elem = x->pi = x->attr = (char *)x->stack;
308
2.40M
  x->state = YXMLS_init;
309
2.40M
}
310
311
4.74G
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.74G
  unsigned ch = (unsigned)(_ch+256) & 0xff;
315
4.74G
  if(!ch)
316
6
    return YXML_ESYN;
317
4.74G
  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.74G
  if(x->ignore == ch) {
324
4.59k
    x->ignore = 0;
325
4.59k
    return YXML_OK;
326
4.59k
  }
327
4.74G
  x->ignore = (ch == 0xd) * 0xa;
328
4.74G
  if(ch == 0xa || ch == 0xd) {
329
2.99M
    ch = 0xa;
330
2.99M
    x->line++;
331
2.99M
    x->byte = 0;
332
2.99M
  }
333
4.74G
  x->byte++;
334
335
4.74G
  switch((yxml_state_t)x->state) {
336
21.4k
  case YXMLS_string:
337
21.4k
    if(ch == *x->string) {
338
21.4k
      x->string++;
339
21.4k
      if(!*x->string)
340
4.00k
        x->state = x->nextstate;
341
21.4k
      return YXML_OK;
342
21.4k
    }
343
22
    break;
344
59.5M
  case YXMLS_attr0:
345
59.5M
    if(yxml_isName(ch))
346
53.9M
      return yxml_attrname(x, ch);
347
5.60M
    if(yxml_isSP(ch)) {
348
1.43M
      x->state = YXMLS_attr1;
349
1.43M
      return yxml_attrnameend(x, ch);
350
1.43M
    }
351
4.16M
    if(ch == (unsigned char)'=') {
352
4.16M
      x->state = YXMLS_attr2;
353
4.16M
      return yxml_attrnameend(x, ch);
354
4.16M
    }
355
48
    break;
356
1.43M
  case YXMLS_attr1:
357
1.43M
    if(yxml_isSP(ch))
358
1.17k
      return YXML_OK;
359
1.43M
    if(ch == (unsigned char)'=') {
360
1.43M
      x->state = YXMLS_attr2;
361
1.43M
      return YXML_OK;
362
1.43M
    }
363
35
    break;
364
5.60M
  case YXMLS_attr2:
365
5.60M
    if(yxml_isSP(ch))
366
1.34k
      return YXML_OK;
367
5.60M
    if(ch == (unsigned char)'\'' || ch == (unsigned char)'"') {
368
5.60M
      x->state = YXMLS_attr3;
369
5.60M
      x->quote = ch;
370
5.60M
      return YXML_OK;
371
5.60M
    }
372
33
    break;
373
118M
  case YXMLS_attr3:
374
118M
    if(yxml_isAttValue(ch))
375
112M
      return yxml_dataattr(x, ch);
376
5.60M
    if(ch == (unsigned char)'&') {
377
1.30k
      x->state = YXMLS_attr4;
378
1.30k
      return yxml_refstart(x, ch);
379
1.30k
    }
380
5.60M
    if(x->quote == ch) {
381
5.60M
      x->state = YXMLS_elem2;
382
5.60M
      return yxml_attrvalend(x, ch);
383
5.60M
    }
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
32
    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
990
      x->state = YXMLS_cd2;
404
990
      return YXML_OK;
405
990
    }
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
962
    if(ch == (unsigned char)'>') {
415
468
      x->state = YXMLS_misc2;
416
468
      return YXML_OK;
417
468
    }
418
494
    if(yxml_isChar(ch)) {
419
494
      x->state = YXMLS_cd0;
420
494
      return yxml_datacd2(x, ch);
421
494
    }
422
0
    break;
423
449
  case YXMLS_comment0:
424
449
    if(ch == (unsigned char)'-') {
425
429
      x->state = YXMLS_comment1;
426
429
      return YXML_OK;
427
429
    }
428
20
    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
21
    break;
435
3.59k
  case YXMLS_comment2:
436
3.59k
    if(ch == (unsigned char)'-') {
437
3.10k
      x->state = YXMLS_comment3;
438
3.10k
      return YXML_OK;
439
3.10k
    }
440
492
    if(yxml_isChar(ch))
441
492
      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
650
    if(yxml_isChar(ch)) {
449
650
      x->state = YXMLS_comment2;
450
650
      return YXML_OK;
451
650
    }
452
0
    break;
453
2.42k
  case YXMLS_comment4:
454
2.42k
    if(ch == (unsigned char)'>') {
455
2.40k
      x->state = x->nextstate;
456
2.40k
      return YXML_OK;
457
2.40k
    }
458
20
    break;
459
3.85k
  case YXMLS_dt0:
460
3.85k
    if(ch == (unsigned char)'>') {
461
658
      x->state = YXMLS_misc1;
462
658
      return YXML_OK;
463
658
    }
464
3.19k
    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
2.00k
    if(ch == (unsigned char)'<') {
471
1.53k
      x->state = YXMLS_dt2;
472
1.53k
      return YXML_OK;
473
1.53k
    }
474
462
    if(yxml_isChar(ch))
475
462
      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
408
    if(yxml_isChar(ch))
483
408
      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.12k
  case YXMLS_dt3:
497
1.12k
    if(ch == (unsigned char)'-') {
498
389
      x->state = YXMLS_comment1;
499
389
      x->nextstate = YXMLS_dt0;
500
389
      return YXML_OK;
501
389
    }
502
733
    if(yxml_isChar(ch)) {
503
733
      x->state = YXMLS_dt4;
504
733
      return YXML_OK;
505
733
    }
506
0
    break;
507
1.82k
  case YXMLS_dt4:
508
1.82k
    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
409
    if(yxml_isChar(ch))
519
409
      return YXML_OK;
520
0
    break;
521
249M
  case YXMLS_elem0:
522
249M
    if(yxml_isName(ch))
523
209M
      return yxml_elemname(x, ch);
524
40.4M
    if(yxml_isSP(ch)) {
525
3.32M
      x->state = YXMLS_elem1;
526
3.32M
      return yxml_elemnameend(x, ch);
527
3.32M
    }
528
37.1M
    if(ch == (unsigned char)'/') {
529
16.0M
      x->state = YXMLS_elem3;
530
16.0M
      return yxml_elemnameend(x, ch);
531
16.0M
    }
532
21.1M
    if(ch == (unsigned char)'>') {
533
21.1M
      x->state = YXMLS_misc2;
534
21.1M
      return yxml_elemnameend(x, ch);
535
21.1M
    }
536
52
    break;
537
7.83M
  case YXMLS_elem1:
538
7.83M
    if(yxml_isSP(ch))
539
1.36M
      return YXML_OK;
540
6.46M
    if(ch == (unsigned char)'/') {
541
865k
      x->state = YXMLS_elem3;
542
865k
      return YXML_OK;
543
865k
    }
544
5.60M
    if(ch == (unsigned char)'>') {
545
780
      x->state = YXMLS_misc2;
546
780
      return YXML_OK;
547
780
    }
548
5.60M
    if(yxml_isNameStart(ch)) {
549
5.60M
      x->state = YXMLS_attr0;
550
5.60M
      return yxml_attrstart(x, ch);
551
5.60M
    }
552
45
    break;
553
5.60M
  case YXMLS_elem2:
554
5.60M
    if(yxml_isSP(ch)) {
555
3.14M
      x->state = YXMLS_elem1;
556
3.14M
      return YXML_OK;
557
3.14M
    }
558
2.45M
    if(ch == (unsigned char)'/') {
559
1.32M
      x->state = YXMLS_elem3;
560
1.32M
      return YXML_OK;
561
1.32M
    }
562
1.13M
    if(ch == (unsigned char)'>') {
563
1.13M
      x->state = YXMLS_misc2;
564
1.13M
      return YXML_OK;
565
1.13M
    }
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.57k
  case YXMLS_enc0:
574
1.57k
    if(yxml_isSP(ch))
575
1.16k
      return YXML_OK;
576
408
    if(ch == (unsigned char)'=') {
577
392
      x->state = YXMLS_enc1;
578
392
      return YXML_OK;
579
392
    }
580
16
    break;
581
1.50k
  case YXMLS_enc1:
582
1.50k
    if(yxml_isSP(ch))
583
1.16k
      return YXML_OK;
584
342
    if(ch == (unsigned char)'\'' || ch == (unsigned char)'"') {
585
308
      x->state = YXMLS_enc2;
586
308
      x->quote = ch;
587
308
      return YXML_OK;
588
308
    }
589
34
    break;
590
304
  case YXMLS_enc2:
591
304
    if(yxml_isAlpha(ch)) {
592
286
      x->state = YXMLS_enc3;
593
286
      return YXML_OK;
594
286
    }
595
18
    break;
596
2.15k
  case YXMLS_enc3:
597
2.15k
    if(yxml_isEncName(ch))
598
1.96k
      return YXML_OK;
599
194
    if(x->quote == ch) {
600
155
      x->state = YXMLS_xmldecl6;
601
155
      return YXML_OK;
602
155
    }
603
39
    break;
604
22.2M
  case YXMLS_etag0:
605
22.2M
    if(yxml_isNameStart(ch)) {
606
22.2M
      x->state = YXMLS_etag1;
607
22.2M
      return yxml_elemclose(x, ch);
608
22.2M
    }
609
33
    break;
610
187M
  case YXMLS_etag1:
611
187M
    if(yxml_isName(ch))
612
165M
      return yxml_elemclose(x, ch);
613
22.2M
    if(yxml_isSP(ch)) {
614
1.58k
      x->state = YXMLS_etag2;
615
1.58k
      return yxml_elemcloseend(x, ch);
616
1.58k
    }
617
22.2M
    if(ch == (unsigned char)'>') {
618
22.2M
      x->state = YXMLS_misc2;
619
22.2M
      return yxml_elemcloseend(x, ch);
620
22.2M
    }
621
41
    break;
622
4.08k
  case YXMLS_etag2:
623
4.08k
    if(yxml_isSP(ch))
624
2.58k
      return YXML_OK;
625
1.50k
    if(ch == (unsigned char)'>') {
626
1.46k
      x->state = YXMLS_misc2;
627
1.46k
      return YXML_OK;
628
1.46k
    }
629
41
    break;
630
2.40M
  case YXMLS_init:
631
2.40M
    if(ch == (unsigned char)'\xef') {
632
34
      x->state = YXMLS_string;
633
34
      x->nextstate = YXMLS_misc0;
634
34
      x->string = (unsigned char *)"\xbb\xbf";
635
34
      return YXML_OK;
636
34
    }
637
2.40M
    if(yxml_isSP(ch)) {
638
228
      x->state = YXMLS_misc0;
639
228
      return YXML_OK;
640
228
    }
641
2.40M
    if(ch == (unsigned char)'<') {
642
2.40M
      x->state = YXMLS_le0;
643
2.40M
      return YXML_OK;
644
2.40M
    }
645
63
    break;
646
2.40M
  case YXMLS_le0:
647
2.40M
    if(ch == (unsigned char)'!') {
648
585
      x->state = YXMLS_lee1;
649
585
      return YXML_OK;
650
585
    }
651
2.40M
    if(ch == (unsigned char)'?') {
652
2.40k
      x->state = YXMLS_leq0;
653
2.40k
      return YXML_OK;
654
2.40k
    }
655
2.40M
    if(yxml_isNameStart(ch)) {
656
2.40M
      x->state = YXMLS_elem0;
657
2.40M
      return yxml_elemstart(x, ch);
658
2.40M
    }
659
48
    break;
660
5.49k
  case YXMLS_le1:
661
5.49k
    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
431
    if(yxml_isNameStart(ch)) {
671
399
      x->state = YXMLS_elem0;
672
399
      return yxml_elemstart(x, ch);
673
399
    }
674
32
    break;
675
60.3M
  case YXMLS_le2:
676
60.3M
    if(ch == (unsigned char)'!') {
677
1.31k
      x->state = YXMLS_lee2;
678
1.31k
      return YXML_OK;
679
1.31k
    }
680
60.3M
    if(ch == (unsigned char)'?') {
681
2.38k
      x->state = YXMLS_pi0;
682
2.38k
      x->nextstate = YXMLS_misc2;
683
2.38k
      return YXML_OK;
684
2.38k
    }
685
60.3M
    if(ch == (unsigned char)'/') {
686
22.2M
      x->state = YXMLS_etag0;
687
22.2M
      return YXML_OK;
688
22.2M
    }
689
38.0M
    if(yxml_isNameStart(ch)) {
690
38.0M
      x->state = YXMLS_elem0;
691
38.0M
      return yxml_elemstart(x, ch);
692
38.0M
    }
693
47
    break;
694
1.23k
  case YXMLS_le3:
695
1.23k
    if(ch == (unsigned char)'!') {
696
460
      x->state = YXMLS_comment0;
697
460
      x->nextstate = YXMLS_misc3;
698
460
      return YXML_OK;
699
460
    }
700
770
    if(ch == (unsigned char)'?') {
701
737
      x->state = YXMLS_pi0;
702
737
      x->nextstate = YXMLS_misc3;
703
737
      return YXML_OK;
704
737
    }
705
33
    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
29
    break;
719
1.30k
  case YXMLS_lee2:
720
1.30k
    if(ch == (unsigned char)'-') {
721
669
      x->state = YXMLS_comment1;
722
669
      x->nextstate = YXMLS_misc2;
723
669
      return YXML_OK;
724
669
    }
725
636
    if(ch == (unsigned char)'[') {
726
606
      x->state = YXMLS_string;
727
606
      x->nextstate = YXMLS_cd0;
728
606
      x->string = (unsigned char *)"CDATA[";
729
606
      return YXML_OK;
730
606
    }
731
30
    break;
732
2.39k
  case YXMLS_leq0:
733
2.39k
    if(ch == (unsigned char)'x') {
734
1.76k
      x->state = YXMLS_xmldecl0;
735
1.76k
      x->nextstate = YXMLS_misc1;
736
1.76k
      return yxml_pistart(x, ch);
737
1.76k
    }
738
630
    if(yxml_isNameStart(ch)) {
739
593
      x->state = YXMLS_pi1;
740
593
      x->nextstate = YXMLS_misc1;
741
593
      return yxml_pistart(x, ch);
742
593
    }
743
37
    break;
744
2.41k
  case YXMLS_misc0:
745
2.41k
    if(yxml_isSP(ch))
746
2.26k
      return YXML_OK;
747
142
    if(ch == (unsigned char)'<') {
748
94
      x->state = YXMLS_le0;
749
94
      return YXML_OK;
750
94
    }
751
48
    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.50k
      x->state = YXMLS_le1;
757
5.50k
      return YXML_OK;
758
5.50k
    }
759
23
    break;
760
4.00G
  case YXMLS_misc2:
761
4.00G
    if(ch == (unsigned char)'<') {
762
60.3M
      x->state = YXMLS_le2;
763
60.3M
      return YXML_OK;
764
60.3M
    }
765
3.94G
    if(ch == (unsigned char)'&') {
766
5.34k
      x->state = YXMLS_misc2a;
767
5.34k
      return yxml_refstart(x, ch);
768
5.34k
    }
769
3.94G
    if(yxml_isChar(ch))
770
3.94G
      return yxml_datacontent(x, ch);
771
0
    break;
772
24.1k
  case YXMLS_misc2a:
773
24.1k
    if(yxml_isRef(ch))
774
18.8k
      return yxml_ref(x, ch);
775
5.26k
    if(ch == (unsigned char)'\x3b') {
776
5.22k
      x->state = YXMLS_misc2;
777
5.22k
      return yxml_refcontent(x, ch);
778
5.22k
    }
779
33
    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
44
    break;
788
6.91k
  case YXMLS_pi0:
789
6.91k
    if(yxml_isNameStart(ch)) {
790
6.88k
      x->state = YXMLS_pi1;
791
6.88k
      return yxml_pistart(x, ch);
792
6.88k
    }
793
31
    break;
794
18.3k
  case YXMLS_pi1:
795
18.3k
    if(yxml_isName(ch))
796
10.8k
      return yxml_piname(x, ch);
797
7.55k
    if(ch == (unsigned char)'?') {
798
4.73k
      x->state = YXMLS_pi4;
799
4.73k
      return yxml_pinameend(x, ch);
800
4.73k
    }
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
47
    break;
806
684k
  case YXMLS_pi2:
807
684k
    if(ch == (unsigned char)'?') {
808
3.36k
      x->state = YXMLS_pi3;
809
3.36k
      return YXML_OK;
810
3.36k
    }
811
680k
    if(yxml_isChar(ch))
812
680k
      return yxml_datapi1(x, ch);
813
0
    break;
814
3.35k
  case YXMLS_pi3:
815
3.35k
    if(ch == (unsigned char)'>') {
816
2.67k
      x->state = x->nextstate;
817
2.67k
      return yxml_pivalend(x, ch);
818
2.67k
    }
819
682
    if(yxml_isChar(ch)) {
820
682
      x->state = YXMLS_pi2;
821
682
      return yxml_datapi2(x, ch);
822
682
    }
823
0
    break;
824
4.68k
  case YXMLS_pi4:
825
4.68k
    if(ch == (unsigned char)'>') {
826
4.66k
      x->state = x->nextstate;
827
4.66k
      return yxml_pivalend(x, ch);
828
4.66k
    }
829
20
    break;
830
697
  case YXMLS_std0:
831
697
    if(yxml_isSP(ch))
832
582
      return YXML_OK;
833
115
    if(ch == (unsigned char)'=') {
834
102
      x->state = YXMLS_std1;
835
102
      return YXML_OK;
836
102
    }
837
13
    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.08k
  case YXMLS_ver0:
868
2.08k
    if(yxml_isSP(ch))
869
1.16k
      return YXML_OK;
870
923
    if(ch == (unsigned char)'=') {
871
906
      x->state = YXMLS_ver1;
872
906
      return YXML_OK;
873
906
    }
874
17
    break;
875
2.02k
  case YXMLS_ver1:
876
2.02k
    if(yxml_isSP(ch))
877
1.16k
      return YXML_OK;
878
856
    if(ch == (unsigned char)'\'' || ch == (unsigned char)'"') {
879
819
      x->state = YXMLS_string;
880
819
      x->quote = ch;
881
819
      x->nextstate = YXMLS_ver2;
882
819
      x->string = (unsigned char *)"1.";
883
819
      return YXML_OK;
884
819
    }
885
37
    break;
886
813
  case YXMLS_ver2:
887
813
    if(yxml_isNum(ch)) {
888
801
      x->state = YXMLS_ver3;
889
801
      return YXML_OK;
890
801
    }
891
12
    break;
892
1.17k
  case YXMLS_ver3:
893
1.17k
    if(yxml_isNum(ch))
894
389
      return YXML_OK;
895
783
    if(x->quote == ch) {
896
760
      x->state = YXMLS_xmldecl4;
897
760
      return YXML_OK;
898
760
    }
899
23
    break;
900
1.76k
  case YXMLS_xmldecl0:
901
1.76k
    if(ch == (unsigned char)'m') {
902
1.48k
      x->state = YXMLS_xmldecl1;
903
1.48k
      return yxml_piname(x, ch);
904
1.48k
    }
905
280
    if(yxml_isName(ch)) {
906
137
      x->state = YXMLS_pi1;
907
137
      return yxml_piname(x, ch);
908
137
    }
909
143
    if(ch == (unsigned char)'?') {
910
49
      x->state = YXMLS_pi4;
911
49
      return yxml_pinameend(x, ch);
912
49
    }
913
94
    if(yxml_isSP(ch)) {
914
43
      x->state = YXMLS_pi2;
915
43
      return yxml_pinameend(x, ch);
916
43
    }
917
51
    break;
918
1.48k
  case YXMLS_xmldecl1:
919
1.48k
    if(ch == (unsigned char)'l') {
920
1.31k
      x->state = YXMLS_xmldecl2;
921
1.31k
      return yxml_piname(x, ch);
922
1.31k
    }
923
171
    if(yxml_isName(ch)) {
924
94
      x->state = YXMLS_pi1;
925
94
      return yxml_piname(x, ch);
926
94
    }
927
77
    if(ch == (unsigned char)'?') {
928
6
      x->state = YXMLS_pi4;
929
6
      return yxml_pinameend(x, ch);
930
6
    }
931
71
    if(yxml_isSP(ch)) {
932
21
      x->state = YXMLS_pi2;
933
21
      return yxml_pinameend(x, ch);
934
21
    }
935
50
    break;
936
1.31k
  case YXMLS_xmldecl2:
937
1.31k
    if(yxml_isSP(ch)) {
938
1.06k
      x->state = YXMLS_xmldecl3;
939
1.06k
      return yxml_piabort(x, ch);
940
1.06k
    }
941
249
    if(yxml_isName(ch)) {
942
209
      x->state = YXMLS_pi1;
943
209
      return yxml_piname(x, ch);
944
209
    }
945
40
    break;
946
2.17k
  case YXMLS_xmldecl3:
947
2.17k
    if(yxml_isSP(ch))
948
1.16k
      return YXML_OK;
949
1.00k
    if(ch == (unsigned char)'v') {
950
977
      x->state = YXMLS_string;
951
977
      x->nextstate = YXMLS_ver0;
952
977
      x->string = (unsigned char *)"ersion";
953
977
      return YXML_OK;
954
977
    }
955
32
    break;
956
758
  case YXMLS_xmldecl4:
957
758
    if(yxml_isSP(ch)) {
958
686
      x->state = YXMLS_xmldecl5;
959
686
      return YXML_OK;
960
686
    }
961
72
    if(ch == (unsigned char)'?') {
962
38
      x->state = YXMLS_xmldecl9;
963
38
      return YXML_OK;
964
38
    }
965
34
    break;
966
1.79k
  case YXMLS_xmldecl5:
967
1.79k
    if(yxml_isSP(ch))
968
1.16k
      return YXML_OK;
969
632
    if(ch == (unsigned char)'?') {
970
14
      x->state = YXMLS_xmldecl9;
971
14
      return YXML_OK;
972
14
    }
973
618
    if(ch == (unsigned char)'e') {
974
458
      x->state = YXMLS_string;
975
458
      x->nextstate = YXMLS_enc0;
976
458
      x->string = (unsigned char *)"ncoding";
977
458
      return YXML_OK;
978
458
    }
979
160
    if(ch == (unsigned char)'s') {
980
137
      x->state = YXMLS_string;
981
137
      x->nextstate = YXMLS_std0;
982
137
      x->string = (unsigned char *)"tandalone";
983
137
      return YXML_OK;
984
137
    }
985
23
    break;
986
153
  case YXMLS_xmldecl6:
987
153
    if(yxml_isSP(ch)) {
988
108
      x->state = YXMLS_xmldecl7;
989
108
      return YXML_OK;
990
108
    }
991
45
    if(ch == (unsigned char)'?') {
992
10
      x->state = YXMLS_xmldecl9;
993
10
      return YXML_OK;
994
10
    }
995
35
    break;
996
1.21k
  case YXMLS_xmldecl7:
997
1.21k
    if(yxml_isSP(ch))
998
1.16k
      return YXML_OK;
999
54
    if(ch == (unsigned char)'?') {
1000
14
      x->state = YXMLS_xmldecl9;
1001
14
      return YXML_OK;
1002
14
    }
1003
40
    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
34
    break;
1010
605
  case YXMLS_xmldecl8:
1011
605
    if(yxml_isSP(ch))
1012
585
      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
76
  case YXMLS_xmldecl9:
1019
76
    if(ch == (unsigned char)'>') {
1020
54
      x->state = YXMLS_misc1;
1021
54
      return YXML_OK;
1022
54
    }
1023
22
    break;
1024
4.74G
  }
1025
1.64k
  return YXML_ESYN;
1026
4.74G
}
1027
1028
2.40M
yxml_ret_t yxml_eof(yxml_t *x) {
1029
2.40M
  if(x->state != YXMLS_misc3)
1030
4.14k
    return YXML_EEOF;
1031
2.39M
  return YXML_OK;
1032
2.40M
}
1033