Coverage Report

Created: 2026-10-15 06:50

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.64G
#define yxml_isChar(c) 1
100
/* 0xd should be part of SP, too, but yxml_parse() already normalizes that into 0xa */
101
106M
#define yxml_isSP(c) (c == 0x20 || c == 0x09 || c == 0x0a)
102
1.45G
#define yxml_isAlpha(c) ((c|32)-'a' < 26)
103
746M
#define yxml_isNum(c) (c-'0' < 10)
104
4.86k
#define yxml_isHex(c) (yxml_isNum(c) || (c|32)-'a' < 6)
105
2.14k
#define yxml_isEncName(c) (yxml_isAlpha(c) || yxml_isNum(c) || c == '.' || c == '_' || c == '-')
106
1.33G
#define yxml_isNameStart(c) (yxml_isAlpha(c) || c == ':' || c == '_' || c >= 128)
107
626M
#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
137M
#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
17.1M
#define yxml_isRef(c) (yxml_isNum(c) || yxml_isAlpha(c) || c == '#')
114
115
20.0M
#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.51G
static inline void yxml_setchar(char *dest, unsigned ch) {
119
4.51G
  *(unsigned char *)dest = (unsigned char)ch;
120
4.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.45M
static void yxml_setutf8(char *dest, unsigned ch) {
125
3.45M
  if(ch <= 0x007F)
126
3.45M
    yxml_setchar(dest++, ch);
127
1.86k
  else if(ch <= 0x07FF) {
128
467
    yxml_setchar(dest++, 0xC0 | (ch>>6));
129
467
    yxml_setchar(dest++, 0x80 | (ch & 0x3F));
130
1.39k
  } else if(ch <= 0xFFFF) {
131
622
    yxml_setchar(dest++, 0xE0 | (ch>>12));
132
622
    yxml_setchar(dest++, 0x80 | ((ch>>6) & 0x3F));
133
622
    yxml_setchar(dest++, 0x80 | (ch & 0x3F));
134
777
  } else {
135
777
    yxml_setchar(dest++, 0xF0 | (ch>>18));
136
777
    yxml_setchar(dest++, 0x80 | ((ch>>12) & 0x3F));
137
777
    yxml_setchar(dest++, 0x80 | ((ch>>6) & 0x3F));
138
777
    yxml_setchar(dest++, 0x80 | (ch & 0x3F));
139
777
  }
140
3.45M
  *dest = 0;
141
3.45M
}
142
143
4.36G
static inline yxml_ret_t yxml_datacontent(yxml_t *x, unsigned ch) {
144
4.36G
  yxml_setchar(x->data, ch);
145
4.36G
  x->data[1] = 0;
146
4.36G
  return YXML_CONTENT;
147
4.36G
}
148
149
3.49k
static inline yxml_ret_t yxml_datapi1(yxml_t *x, unsigned ch) {
150
3.49k
  yxml_setchar(x->data, ch);
151
3.49k
  x->data[1] = 0;
152
3.49k
  return YXML_PICONTENT;
153
3.49k
}
154
155
789
static inline yxml_ret_t yxml_datapi2(yxml_t *x, unsigned ch) {
156
789
  x->data[0] = '?';
157
789
  yxml_setchar(x->data+1, ch);
158
789
  x->data[2] = 0;
159
789
  return YXML_PICONTENT;
160
789
}
161
162
509
static inline yxml_ret_t yxml_datacd1(yxml_t *x, unsigned ch) {
163
509
  x->data[0] = ']';
164
509
  yxml_setchar(x->data+1, ch);
165
509
  x->data[2] = 0;
166
509
  return YXML_CONTENT;
167
509
}
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
132M
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
132M
  yxml_setchar(x->data, ch == 0x9 || ch == 0xa ? 0x20 : ch);
180
132M
  x->data[1] = 0;
181
132M
  return YXML_ATTRVAL;
182
132M
}
183
184
53.8M
static yxml_ret_t yxml_pushstack(yxml_t *x, char **res, unsigned ch) {
185
53.8M
  if(x->stacklen+2 >= x->stacksize)
186
11
    return YXML_ESTACK;
187
53.8M
  x->stacklen++;
188
53.8M
  *res = (char *)x->stack+x->stacklen;
189
53.8M
  x->stack[x->stacklen] = (unsigned char)ch;
190
53.8M
  x->stacklen++;
191
53.8M
  x->stack[x->stacklen] = 0;
192
53.8M
  return YXML_OK;
193
53.8M
}
194
195
327M
static yxml_ret_t yxml_pushstackc(yxml_t *x, unsigned ch) {
196
327M
  if(x->stacklen+1 >= x->stacksize)
197
7
    return YXML_ESTACK;
198
327M
  x->stack[x->stacklen] = (unsigned char)ch;
199
327M
  x->stacklen++;
200
327M
  x->stack[x->stacklen] = 0;
201
327M
  return YXML_OK;
202
327M
}
203
204
53.8M
static void yxml_popstack(yxml_t *x) {
205
53.8M
  do
206
435M
    x->stacklen--;
207
435M
  while(x->stack[x->stacklen]);
208
53.8M
}
209
210
48.2M
static inline yxml_ret_t yxml_elemstart  (yxml_t *x, unsigned ch) { return yxml_pushstack(x, &x->elem, ch); }
211
270M
static inline yxml_ret_t yxml_elemname   (yxml_t *x, unsigned ch) { return yxml_pushstackc(x, ch); }
212
48.2M
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.2M
static yxml_ret_t yxml_selfclose(yxml_t *x, unsigned ch) {
217
48.2M
  yxml_popstack(x);
218
48.2M
  if(x->stacklen) {
219
45.1M
    x->elem = (char *)x->stack+x->stacklen-1;
220
343M
    while(*(x->elem-1))
221
298M
      x->elem--;
222
45.1M
    return YXML_ELEMEND;
223
45.1M
  }
224
3.14M
  x->elem = (char *)x->stack;
225
3.14M
  x->state = x->contentmode ? YXMLS_misc2 : YXMLS_misc3;
226
3.14M
  return YXML_ELEMEND;
227
48.2M
}
228
229
244M
static inline yxml_ret_t yxml_elemclose(yxml_t *x, unsigned ch) {
230
244M
  if(*((unsigned char *)x->elem) != ch)
231
195
    return YXML_ECLOSE;
232
244M
  x->elem++;
233
244M
  return YXML_OK;
234
244M
}
235
236
28.9M
static inline yxml_ret_t yxml_elemcloseend(yxml_t *x, unsigned ch) {
237
28.9M
  if(*x->elem)
238
3
    return YXML_ECLOSE;
239
28.9M
  return yxml_selfclose(x, ch);
240
28.9M
}
241
242
5.54M
static inline yxml_ret_t yxml_attrstart  (yxml_t *x, unsigned ch) { return yxml_pushstack(x, &x->attr, ch); }
243
56.8M
static inline yxml_ret_t yxml_attrname   (yxml_t *x, unsigned ch) { return yxml_pushstackc(x, ch); }
244
5.54M
static inline yxml_ret_t yxml_attrnameend(yxml_t *x, unsigned ch) { return YXML_ATTRSTART; }
245
5.54M
static inline yxml_ret_t yxml_attrvalend (yxml_t *x, unsigned ch) { yxml_popstack(x); return YXML_ATTREND; }
246
247
9.51k
static inline yxml_ret_t yxml_pistart  (yxml_t *x, unsigned ch) { return yxml_pushstack(x, &x->pi, ch); }
248
13.0k
static inline yxml_ret_t yxml_piname   (yxml_t *x, unsigned ch) { return yxml_pushstackc(x, ch); }
249
1.18k
static inline yxml_ret_t yxml_piabort  (yxml_t *x, unsigned ch) { yxml_popstack(x); return YXML_OK; }
250
7.79k
static inline yxml_ret_t yxml_pinameend(yxml_t *x, unsigned ch) {
251
7.79k
  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.79k
}
253
7.47k
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.45M
static inline yxml_ret_t yxml_refstart(yxml_t *x, unsigned ch) {
256
3.45M
  memset(x->data, 0, sizeof(x->data));
257
3.45M
  x->reflen = 0;
258
3.45M
  return YXML_OK;
259
3.45M
}
260
261
13.6M
static yxml_ret_t yxml_ref(yxml_t *x, unsigned ch) {
262
13.6M
  if(x->reflen >= sizeof(x->data)-1)
263
40
    return YXML_EREF;
264
13.6M
  yxml_setchar(x->data+x->reflen, ch);
265
13.6M
  x->reflen++;
266
13.6M
  return YXML_OK;
267
13.6M
}
268
269
3.45M
static yxml_ret_t yxml_refend(yxml_t *x, yxml_ret_t ret) {
270
3.45M
  unsigned char *r = (unsigned char *)x->data;
271
3.45M
  unsigned ch = 0;
272
3.45M
  if(*r == '#') {
273
6.81k
    if(r[1] == 'x')
274
4.86k
      for(r += 2; yxml_isHex((unsigned)*r); r++)
275
3.45k
        ch = (ch<<4) + (*r <= '9' ? *r-'0' : (*r|32)-'a' + 10);
276
5.41k
    else
277
14.8k
      for(r++; yxml_isNum((unsigned)*r); r++)
278
9.43k
        ch = (ch*10) + (*r-'0');
279
6.81k
    if(*r)
280
23
      ch = 0;
281
3.45M
  } else {
282
3.45M
    uint64_t i = INTFROM5CHARS(r[0], r[1], r[2], r[3], r[4]);
283
3.45M
    ch =
284
3.45M
      i == INTFROM5CHARS('l','t', 0,  0, 0) ? '<' :
285
3.45M
      i == INTFROM5CHARS('g','t', 0,  0, 0) ? '>' :
286
3.45M
      i == INTFROM5CHARS('a','m','p', 0, 0) ? '&' :
287
3.38M
      i == INTFROM5CHARS('a','p','o','s',0) ? '\'':
288
3.38M
      i == INTFROM5CHARS('q','u','o','t',0) ? '"' : 0;
289
3.45M
  }
290
291
  /* Codepoints not allowed in the XML 1.1 definition of a Char */
292
3.45M
  if(!ch || ch > 0x10FFFF || ch == 0xFFFE || ch == 0xFFFF || (ch-0xDFFF) < 0x7FF)
293
385
    return YXML_EREF;
294
3.45M
  yxml_setutf8(x->data, ch);
295
3.45M
  x->isReference = true;
296
3.45M
  return ret;
297
3.45M
}
298
299
3.45M
static inline yxml_ret_t yxml_refcontent(yxml_t *x, unsigned ch) { return yxml_refend(x, YXML_CONTENT); }
300
1.57k
static inline yxml_ret_t yxml_refattrval(yxml_t *x, unsigned ch) { return yxml_refend(x, YXML_ATTRVAL); }
301
302
3.12M
void yxml_init(yxml_t *x, void *stack, size_t stacksize) {
303
3.12M
  memset(x, 0, sizeof(*x));
304
3.12M
  x->line = 1;
305
3.12M
  x->stack = (unsigned char*)stack;
306
3.12M
  x->stacksize = stacksize;
307
3.12M
  *x->stack = 0;
308
3.12M
  x->elem = x->pi = x->attr = (char *)x->stack;
309
3.12M
  x->state = YXMLS_init;
310
3.12M
}
311
312
369
void yxml_init_content(yxml_t *x, void *stack, size_t stacksize) {
313
369
  yxml_init(x, stack, stacksize);
314
369
  x->contentmode = true;
315
369
  x->state = YXMLS_misc2;
316
369
}
317
318
5.37G
yxml_ret_t yxml_parse(yxml_t *x, int _ch) {
319
5.37G
  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
5.37G
  unsigned ch = (unsigned)(_ch+256) & 0xff;
324
5.37G
  if(!ch)
325
11
    return YXML_ESYN;
326
5.37G
  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
5.37G
  if(x->ignore == ch) {
333
20.5k
    x->ignore = 0;
334
20.5k
    return YXML_OK;
335
20.5k
  }
336
5.37G
  x->ignore = (ch == 0xd) * 0xa;
337
5.37G
  if(ch == 0xa || ch == 0xd) {
338
5.30M
    ch = 0xa;
339
5.30M
    x->line++;
340
5.30M
    x->byte = 0;
341
5.30M
  }
342
5.37G
  x->byte++;
343
344
5.37G
  switch((yxml_state_t)x->state) {
345
23.6k
  case YXMLS_string:
346
23.6k
    if(ch == *x->string) {
347
23.6k
      x->string++;
348
23.6k
      if(!*x->string)
349
4.44k
        x->state = x->nextstate;
350
23.6k
      return YXML_OK;
351
23.6k
    }
352
22
    break;
353
62.4M
  case YXMLS_attr0:
354
62.4M
    if(yxml_isName(ch))
355
56.8M
      return yxml_attrname(x, ch);
356
5.54M
    if(yxml_isSP(ch)) {
357
919k
      x->state = YXMLS_attr1;
358
919k
      return yxml_attrnameend(x, ch);
359
919k
    }
360
4.62M
    if(ch == (unsigned char)'=') {
361
4.62M
      x->state = YXMLS_attr2;
362
4.62M
      return yxml_attrnameend(x, ch);
363
4.62M
    }
364
45
    break;
365
920k
  case YXMLS_attr1:
366
920k
    if(yxml_isSP(ch))
367
1.18k
      return YXML_OK;
368
919k
    if(ch == (unsigned char)'=') {
369
919k
      x->state = YXMLS_attr2;
370
919k
      return YXML_OK;
371
919k
    }
372
36
    break;
373
5.54M
  case YXMLS_attr2:
374
5.54M
    if(yxml_isSP(ch))
375
1.16k
      return YXML_OK;
376
5.54M
    if(ch == (unsigned char)'\'' || ch == (unsigned char)'"') {
377
5.54M
      x->state = YXMLS_attr3;
378
5.54M
      x->quote = ch;
379
5.54M
      return YXML_OK;
380
5.54M
    }
381
36
    break;
382
137M
  case YXMLS_attr3:
383
137M
    if(yxml_isAttValue(ch))
384
132M
      return yxml_dataattr(x, ch);
385
5.54M
    if(ch == (unsigned char)'&') {
386
1.68k
      x->state = YXMLS_attr4;
387
1.68k
      return yxml_refstart(x, ch);
388
1.68k
    }
389
5.54M
    if(x->quote == ch) {
390
5.54M
      x->state = YXMLS_elem2;
391
5.54M
      return yxml_attrvalend(x, ch);
392
5.54M
    }
393
2
    break;
394
6.15k
  case YXMLS_attr4:
395
6.15k
    if(yxml_isRef(ch))
396
4.54k
      return yxml_ref(x, ch);
397
1.61k
    if(ch == (unsigned char)'\x3b') {
398
1.57k
      x->state = YXMLS_attr3;
399
1.57k
      return yxml_refattrval(x, ch);
400
1.57k
    }
401
32
    break;
402
2.41k
  case YXMLS_cd0:
403
2.41k
    if(ch == (unsigned char)']') {
404
1.49k
      x->state = YXMLS_cd1;
405
1.49k
      return YXML_OK;
406
1.49k
    }
407
914
    if(yxml_isChar(ch))
408
914
      return yxml_datacontent(x, ch);
409
0
    break;
410
1.48k
  case YXMLS_cd1:
411
1.48k
    if(ch == (unsigned char)']') {
412
973
      x->state = YXMLS_cd2;
413
973
      return YXML_OK;
414
973
    }
415
509
    if(yxml_isChar(ch)) {
416
509
      x->state = YXMLS_cd0;
417
509
      return yxml_datacd1(x, ch);
418
509
    }
419
0
    break;
420
1.36k
  case YXMLS_cd2:
421
1.36k
    if(ch == (unsigned char)']')
422
416
      return yxml_datacontent(x, ch);
423
945
    if(ch == (unsigned char)'>') {
424
483
      x->state = YXMLS_misc2;
425
483
      return YXML_OK;
426
483
    }
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
447
  case YXMLS_comment0:
433
447
    if(ch == (unsigned char)'-') {
434
429
      x->state = YXMLS_comment1;
435
429
      return YXML_OK;
436
429
    }
437
18
    break;
438
5.47k
  case YXMLS_comment1:
439
5.47k
    if(ch == (unsigned char)'-') {
440
5.45k
      x->state = YXMLS_comment2;
441
5.45k
      return YXML_OK;
442
5.45k
    }
443
17
    break;
444
8.43k
  case YXMLS_comment2:
445
8.43k
    if(ch == (unsigned char)'-') {
446
6.15k
      x->state = YXMLS_comment3;
447
6.15k
      return YXML_OK;
448
6.15k
    }
449
2.27k
    if(yxml_isChar(ch))
450
2.27k
      return YXML_OK;
451
0
    break;
452
6.14k
  case YXMLS_comment3:
453
6.14k
    if(ch == (unsigned char)'-') {
454
5.35k
      x->state = YXMLS_comment4;
455
5.35k
      return YXML_OK;
456
5.35k
    }
457
784
    if(yxml_isChar(ch)) {
458
784
      x->state = YXMLS_comment2;
459
784
      return YXML_OK;
460
784
    }
461
0
    break;
462
5.34k
  case YXMLS_comment4:
463
5.34k
    if(ch == (unsigned char)'>') {
464
5.33k
      x->state = x->nextstate;
465
5.33k
      return YXML_OK;
466
5.33k
    }
467
8
    break;
468
4.25k
  case YXMLS_dt0:
469
4.25k
    if(ch == (unsigned char)'>') {
470
653
      x->state = YXMLS_misc1;
471
653
      return YXML_OK;
472
653
    }
473
3.59k
    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.41k
    if(ch == (unsigned char)'<') {
480
1.82k
      x->state = YXMLS_dt2;
481
1.82k
      return YXML_OK;
482
1.82k
    }
483
594
    if(yxml_isChar(ch))
484
594
      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.80k
  case YXMLS_dt2:
495
1.80k
    if(ch == (unsigned char)'?') {
496
510
      x->state = YXMLS_pi0;
497
510
      x->nextstate = YXMLS_dt0;
498
510
      return YXML_OK;
499
510
    }
500
1.29k
    if(ch == (unsigned char)'!') {
501
1.27k
      x->state = YXMLS_dt3;
502
1.27k
      return YXML_OK;
503
1.27k
    }
504
25
    break;
505
1.26k
  case YXMLS_dt3:
506
1.26k
    if(ch == (unsigned char)'-') {
507
388
      x->state = YXMLS_comment1;
508
388
      x->nextstate = YXMLS_dt0;
509
388
      return YXML_OK;
510
388
    }
511
873
    if(yxml_isChar(ch)) {
512
873
      x->state = YXMLS_dt4;
513
873
      return YXML_OK;
514
873
    }
515
0
    break;
516
3.40k
  case YXMLS_dt4:
517
3.40k
    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
2.62k
    if(ch == (unsigned char)'>') {
524
778
      x->state = YXMLS_dt0;
525
778
      return YXML_OK;
526
778
    }
527
1.85k
    if(yxml_isChar(ch))
528
1.85k
      return YXML_OK;
529
0
    break;
530
319M
  case YXMLS_elem0:
531
319M
    if(yxml_isName(ch))
532
270M
      return yxml_elemname(x, ch);
533
48.2M
    if(yxml_isSP(ch)) {
534
3.88M
      x->state = YXMLS_elem1;
535
3.88M
      return yxml_elemnameend(x, ch);
536
3.88M
    }
537
44.4M
    if(ch == (unsigned char)'/') {
538
16.8M
      x->state = YXMLS_elem3;
539
16.8M
      return yxml_elemnameend(x, ch);
540
16.8M
    }
541
27.5M
    if(ch == (unsigned char)'>') {
542
27.5M
      x->state = YXMLS_misc2;
543
27.5M
      return yxml_elemnameend(x, ch);
544
27.5M
    }
545
49
    break;
546
8.12M
  case YXMLS_elem1:
547
8.12M
    if(yxml_isSP(ch))
548
1.56M
      return YXML_OK;
549
6.55M
    if(ch == (unsigned char)'/') {
550
1.00M
      x->state = YXMLS_elem3;
551
1.00M
      return YXML_OK;
552
1.00M
    }
553
5.54M
    if(ch == (unsigned char)'>') {
554
827
      x->state = YXMLS_misc2;
555
827
      return YXML_OK;
556
827
    }
557
5.54M
    if(yxml_isNameStart(ch)) {
558
5.54M
      x->state = YXMLS_attr0;
559
5.54M
      return yxml_attrstart(x, ch);
560
5.54M
    }
561
51
    break;
562
5.54M
  case YXMLS_elem2:
563
5.54M
    if(yxml_isSP(ch)) {
564
2.67M
      x->state = YXMLS_elem1;
565
2.67M
      return YXML_OK;
566
2.67M
    }
567
2.87M
    if(ch == (unsigned char)'/') {
568
1.44M
      x->state = YXMLS_elem3;
569
1.44M
      return YXML_OK;
570
1.44M
    }
571
1.42M
    if(ch == (unsigned char)'>') {
572
1.42M
      x->state = YXMLS_misc2;
573
1.42M
      return YXML_OK;
574
1.42M
    }
575
37
    break;
576
19.2M
  case YXMLS_elem3:
577
19.2M
    if(ch == (unsigned char)'>') {
578
19.2M
      x->state = YXMLS_misc2;
579
19.2M
      return yxml_selfclose(x, ch);
580
19.2M
    }
581
21
    break;
582
1.57k
  case YXMLS_enc0:
583
1.57k
    if(yxml_isSP(ch))
584
1.16k
      return YXML_OK;
585
405
    if(ch == (unsigned char)'=') {
586
369
      x->state = YXMLS_enc1;
587
369
      return YXML_OK;
588
369
    }
589
36
    break;
590
1.48k
  case YXMLS_enc1:
591
1.48k
    if(yxml_isSP(ch))
592
1.16k
      return YXML_OK;
593
319
    if(ch == (unsigned char)'\'' || ch == (unsigned char)'"') {
594
290
      x->state = YXMLS_enc2;
595
290
      x->quote = ch;
596
290
      return YXML_OK;
597
290
    }
598
29
    break;
599
286
  case YXMLS_enc2:
600
286
    if(yxml_isAlpha(ch)) {
601
274
      x->state = YXMLS_enc3;
602
274
      return YXML_OK;
603
274
    }
604
12
    break;
605
2.14k
  case YXMLS_enc3:
606
2.14k
    if(yxml_isEncName(ch))
607
1.95k
      return YXML_OK;
608
188
    if(x->quote == ch) {
609
160
      x->state = YXMLS_xmldecl6;
610
160
      return YXML_OK;
611
160
    }
612
28
    break;
613
28.9M
  case YXMLS_etag0:
614
28.9M
    if(yxml_isNameStart(ch)) {
615
28.9M
      x->state = YXMLS_etag1;
616
28.9M
      return yxml_elemclose(x, ch);
617
28.9M
    }
618
31
    break;
619
244M
  case YXMLS_etag1:
620
244M
    if(yxml_isName(ch))
621
215M
      return yxml_elemclose(x, ch);
622
28.9M
    if(yxml_isSP(ch)) {
623
2.56k
      x->state = YXMLS_etag2;
624
2.56k
      return yxml_elemcloseend(x, ch);
625
2.56k
    }
626
28.9M
    if(ch == (unsigned char)'>') {
627
28.9M
      x->state = YXMLS_misc2;
628
28.9M
      return yxml_elemcloseend(x, ch);
629
28.9M
    }
630
38
    break;
631
18.9k
  case YXMLS_etag2:
632
18.9k
    if(yxml_isSP(ch))
633
16.7k
      return YXML_OK;
634
2.13k
    if(ch == (unsigned char)'>') {
635
2.09k
      x->state = YXMLS_misc2;
636
2.09k
      return YXML_OK;
637
2.09k
    }
638
35
    break;
639
3.12M
  case YXMLS_init:
640
3.12M
    if(ch == (unsigned char)'\xef') {
641
37
      x->state = YXMLS_string;
642
37
      x->nextstate = YXMLS_misc0;
643
37
      x->string = (unsigned char *)"\xbb\xbf";
644
37
      return YXML_OK;
645
37
    }
646
3.12M
    if(yxml_isSP(ch)) {
647
247
      x->state = YXMLS_misc0;
648
247
      return YXML_OK;
649
247
    }
650
3.12M
    if(ch == (unsigned char)'<') {
651
3.12M
      x->state = YXMLS_le0;
652
3.12M
      return YXML_OK;
653
3.12M
    }
654
54
    break;
655
3.12M
  case YXMLS_le0:
656
3.12M
    if(ch == (unsigned char)'!') {
657
552
      x->state = YXMLS_lee1;
658
552
      return YXML_OK;
659
552
    }
660
3.12M
    if(ch == (unsigned char)'?') {
661
2.46k
      x->state = YXMLS_leq0;
662
2.46k
      return YXML_OK;
663
2.46k
    }
664
3.12M
    if(yxml_isNameStart(ch)) {
665
3.12M
      x->state = YXMLS_elem0;
666
3.12M
      return yxml_elemstart(x, ch);
667
3.12M
    }
668
44
    break;
669
5.22k
  case YXMLS_le1:
670
5.22k
    if(ch == (unsigned char)'!') {
671
1.58k
      x->state = YXMLS_lee1;
672
1.58k
      return YXML_OK;
673
1.58k
    }
674
3.63k
    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
376
    if(yxml_isNameStart(ch)) {
680
350
      x->state = YXMLS_elem0;
681
350
      return yxml_elemstart(x, ch);
682
350
    }
683
26
    break;
684
74.1M
  case YXMLS_le2:
685
74.1M
    if(ch == (unsigned char)'!') {
686
4.25k
      x->state = YXMLS_lee2;
687
4.25k
      return YXML_OK;
688
4.25k
    }
689
74.1M
    if(ch == (unsigned char)'?') {
690
2.66k
      x->state = YXMLS_pi0;
691
2.66k
      x->nextstate = YXMLS_misc2;
692
2.66k
      return YXML_OK;
693
2.66k
    }
694
74.1M
    if(ch == (unsigned char)'/') {
695
28.9M
      x->state = YXMLS_etag0;
696
28.9M
      return YXML_OK;
697
28.9M
    }
698
45.1M
    if(yxml_isNameStart(ch)) {
699
45.1M
      x->state = YXMLS_elem0;
700
45.1M
      return yxml_elemstart(x, ch);
701
45.1M
    }
702
41
    break;
703
1.21k
  case YXMLS_le3:
704
1.21k
    if(ch == (unsigned char)'!') {
705
458
      x->state = YXMLS_comment0;
706
458
      x->nextstate = YXMLS_misc3;
707
458
      return YXML_OK;
708
458
    }
709
757
    if(ch == (unsigned char)'?') {
710
737
      x->state = YXMLS_pi0;
711
737
      x->nextstate = YXMLS_misc3;
712
737
      return YXML_OK;
713
737
    }
714
20
    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.24k
  case YXMLS_lee2:
729
4.24k
    if(ch == (unsigned char)'-') {
730
3.59k
      x->state = YXMLS_comment1;
731
3.59k
      x->nextstate = YXMLS_misc2;
732
3.59k
      return YXML_OK;
733
3.59k
    }
734
647
    if(ch == (unsigned char)'[') {
735
620
      x->state = YXMLS_string;
736
620
      x->nextstate = YXMLS_cd0;
737
620
      x->string = (unsigned char *)"CDATA[";
738
620
      return YXML_OK;
739
620
    }
740
27
    break;
741
2.46k
  case YXMLS_leq0:
742
2.46k
    if(ch == (unsigned char)'x') {
743
1.84k
      x->state = YXMLS_xmldecl0;
744
1.84k
      x->nextstate = YXMLS_misc1;
745
1.84k
      return yxml_pistart(x, ch);
746
1.84k
    }
747
619
    if(yxml_isNameStart(ch)) {
748
591
      x->state = YXMLS_pi1;
749
591
      x->nextstate = YXMLS_misc1;
750
591
      return yxml_pistart(x, ch);
751
591
    }
752
28
    break;
753
2.48k
  case YXMLS_misc0:
754
2.48k
    if(yxml_isSP(ch))
755
2.31k
      return YXML_OK;
756
164
    if(ch == (unsigned char)'<') {
757
125
      x->state = YXMLS_le0;
758
125
      return YXML_OK;
759
125
    }
760
39
    break;
761
6.45k
  case YXMLS_misc1:
762
6.45k
    if(yxml_isSP(ch))
763
1.18k
      return YXML_OK;
764
5.26k
    if(ch == (unsigned char)'<') {
765
5.23k
      x->state = YXMLS_le1;
766
5.23k
      return YXML_OK;
767
5.23k
    }
768
34
    break;
769
4.44G
  case YXMLS_misc2:
770
4.44G
    if(ch == (unsigned char)'<') {
771
74.1M
      x->state = YXMLS_le2;
772
74.1M
      return YXML_OK;
773
74.1M
    }
774
4.37G
    if(ch == (unsigned char)'&') {
775
3.45M
      x->state = YXMLS_misc2a;
776
3.45M
      return yxml_refstart(x, ch);
777
3.45M
    }
778
4.36G
    if(yxml_isChar(ch))
779
4.36G
      return yxml_datacontent(x, ch);
780
0
    break;
781
17.1M
  case YXMLS_misc2a:
782
17.1M
    if(yxml_isRef(ch))
783
13.6M
      return yxml_ref(x, ch);
784
3.45M
    if(ch == (unsigned char)'\x3b') {
785
3.45M
      x->state = YXMLS_misc2;
786
3.45M
      return yxml_refcontent(x, ch);
787
3.45M
    }
788
31
    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
41
    break;
797
7.10k
  case YXMLS_pi0:
798
7.10k
    if(yxml_isNameStart(ch)) {
799
7.07k
      x->state = YXMLS_pi1;
800
7.07k
      return yxml_pistart(x, ch);
801
7.07k
    }
802
31
    break;
803
17.4k
  case YXMLS_pi1:
804
17.4k
    if(yxml_isName(ch))
805
9.71k
      return yxml_piname(x, ch);
806
7.73k
    if(ch == (unsigned char)'?') {
807
5.04k
      x->state = YXMLS_pi4;
808
5.04k
      return yxml_pinameend(x, ch);
809
5.04k
    }
810
2.69k
    if(yxml_isSP(ch)) {
811
2.64k
      x->state = YXMLS_pi2;
812
2.64k
      return yxml_pinameend(x, ch);
813
2.64k
    }
814
47
    break;
815
6.80k
  case YXMLS_pi2:
816
6.80k
    if(ch == (unsigned char)'?') {
817
3.31k
      x->state = YXMLS_pi3;
818
3.31k
      return YXML_OK;
819
3.31k
    }
820
3.49k
    if(yxml_isChar(ch))
821
3.49k
      return yxml_datapi1(x, ch);
822
0
    break;
823
3.29k
  case YXMLS_pi3:
824
3.29k
    if(ch == (unsigned char)'>') {
825
2.50k
      x->state = x->nextstate;
826
2.50k
      return yxml_pivalend(x, ch);
827
2.50k
    }
828
789
    if(yxml_isChar(ch)) {
829
789
      x->state = YXMLS_pi2;
830
789
      return yxml_datapi2(x, ch);
831
789
    }
832
0
    break;
833
4.97k
  case YXMLS_pi4:
834
4.97k
    if(ch == (unsigned char)'>') {
835
4.96k
      x->state = x->nextstate;
836
4.96k
      return yxml_pivalend(x, ch);
837
4.96k
    }
838
7
    break;
839
1.40k
  case YXMLS_std0:
840
1.40k
    if(yxml_isSP(ch))
841
1.17k
      return YXML_OK;
842
228
    if(ch == (unsigned char)'=') {
843
198
      x->state = YXMLS_std1;
844
198
      return YXML_OK;
845
198
    }
846
30
    break;
847
1.31k
  case YXMLS_std1:
848
1.31k
    if(yxml_isSP(ch))
849
1.16k
      return YXML_OK;
850
148
    if(ch == (unsigned char)'\'' || ch == (unsigned char)'"') {
851
132
      x->state = YXMLS_std2;
852
132
      x->quote = ch;
853
132
      return YXML_OK;
854
132
    }
855
16
    break;
856
128
  case YXMLS_std2:
857
128
    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
122
    if(ch == (unsigned char)'n') {
864
104
      x->state = YXMLS_string;
865
104
      x->nextstate = YXMLS_std3;
866
104
      x->string = (unsigned char *)"o";
867
104
      return YXML_OK;
868
104
    }
869
18
    break;
870
105
  case YXMLS_std3:
871
105
    if(x->quote == ch) {
872
101
      x->state = YXMLS_xmldecl8;
873
101
      return YXML_OK;
874
101
    }
875
4
    break;
876
2.21k
  case YXMLS_ver0:
877
2.21k
    if(yxml_isSP(ch))
878
1.16k
      return YXML_OK;
879
1.04k
    if(ch == (unsigned char)'=') {
880
1.02k
      x->state = YXMLS_ver1;
881
1.02k
      return YXML_OK;
882
1.02k
    }
883
27
    break;
884
2.13k
  case YXMLS_ver1:
885
2.13k
    if(yxml_isSP(ch))
886
1.16k
      return YXML_OK;
887
971
    if(ch == (unsigned char)'\'' || ch == (unsigned char)'"') {
888
939
      x->state = YXMLS_string;
889
939
      x->quote = ch;
890
939
      x->nextstate = YXMLS_ver2;
891
939
      x->string = (unsigned char *)"1.";
892
939
      return YXML_OK;
893
939
    }
894
32
    break;
895
933
  case YXMLS_ver2:
896
933
    if(yxml_isNum(ch)) {
897
919
      x->state = YXMLS_ver3;
898
919
      return YXML_OK;
899
919
    }
900
14
    break;
901
1.29k
  case YXMLS_ver3:
902
1.29k
    if(yxml_isNum(ch))
903
392
      return YXML_OK;
904
901
    if(x->quote == ch) {
905
880
      x->state = YXMLS_xmldecl4;
906
880
      return YXML_OK;
907
880
    }
908
21
    break;
909
1.84k
  case YXMLS_xmldecl0:
910
1.84k
    if(ch == (unsigned char)'m') {
911
1.56k
      x->state = YXMLS_xmldecl1;
912
1.56k
      return yxml_piname(x, ch);
913
1.56k
    }
914
280
    if(yxml_isName(ch)) {
915
148
      x->state = YXMLS_pi1;
916
148
      return yxml_piname(x, ch);
917
148
    }
918
132
    if(ch == (unsigned char)'?') {
919
35
      x->state = YXMLS_pi4;
920
35
      return yxml_pinameend(x, ch);
921
35
    }
922
97
    if(yxml_isSP(ch)) {
923
48
      x->state = YXMLS_pi2;
924
48
      return yxml_pinameend(x, ch);
925
48
    }
926
49
    break;
927
1.56k
  case YXMLS_xmldecl1:
928
1.56k
    if(ch == (unsigned char)'l') {
929
1.38k
      x->state = YXMLS_xmldecl2;
930
1.38k
      return yxml_piname(x, ch);
931
1.38k
    }
932
178
    if(yxml_isName(ch)) {
933
106
      x->state = YXMLS_pi1;
934
106
      return yxml_piname(x, ch);
935
106
    }
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
21
      x->state = YXMLS_pi2;
942
21
      return yxml_pinameend(x, ch);
943
21
    }
944
45
    break;
945
1.38k
  case YXMLS_xmldecl2:
946
1.38k
    if(yxml_isSP(ch)) {
947
1.18k
      x->state = YXMLS_xmldecl3;
948
1.18k
      return yxml_piabort(x, ch);
949
1.18k
    }
950
198
    if(yxml_isName(ch)) {
951
171
      x->state = YXMLS_pi1;
952
171
      return yxml_piname(x, ch);
953
171
    }
954
27
    break;
955
2.29k
  case YXMLS_xmldecl3:
956
2.29k
    if(yxml_isSP(ch))
957
1.16k
      return YXML_OK;
958
1.13k
    if(ch == (unsigned char)'v') {
959
1.09k
      x->state = YXMLS_string;
960
1.09k
      x->nextstate = YXMLS_ver0;
961
1.09k
      x->string = (unsigned char *)"ersion";
962
1.09k
      return YXML_OK;
963
1.09k
    }
964
34
    break;
965
878
  case YXMLS_xmldecl4:
966
878
    if(yxml_isSP(ch)) {
967
834
      x->state = YXMLS_xmldecl5;
968
834
      return YXML_OK;
969
834
    }
970
44
    if(ch == (unsigned char)'?') {
971
24
      x->state = YXMLS_xmldecl9;
972
24
      return YXML_OK;
973
24
    }
974
20
    break;
975
1.96k
  case YXMLS_xmldecl5:
976
1.96k
    if(yxml_isSP(ch))
977
1.18k
      return YXML_OK;
978
780
    if(ch == (unsigned char)'?') {
979
14
      x->state = YXMLS_xmldecl9;
980
14
      return YXML_OK;
981
14
    }
982
766
    if(ch == (unsigned char)'e') {
983
456
      x->state = YXMLS_string;
984
456
      x->nextstate = YXMLS_enc0;
985
456
      x->string = (unsigned char *)"ncoding";
986
456
      return YXML_OK;
987
456
    }
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
158
  case YXMLS_xmldecl6:
996
158
    if(yxml_isSP(ch)) {
997
108
      x->state = YXMLS_xmldecl7;
998
108
      return YXML_OK;
999
108
    }
1000
50
    if(ch == (unsigned char)'?') {
1001
10
      x->state = YXMLS_xmldecl9;
1002
10
      return YXML_OK;
1003
10
    }
1004
40
    break;
1005
1.22k
  case YXMLS_xmldecl7:
1006
1.22k
    if(yxml_isSP(ch))
1007
1.17k
      return YXML_OK;
1008
54
    if(ch == (unsigned char)'?') {
1009
14
      x->state = YXMLS_xmldecl9;
1010
14
      return YXML_OK;
1011
14
    }
1012
40
    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
32
    break;
1019
1.35k
  case YXMLS_xmldecl8:
1020
1.35k
    if(yxml_isSP(ch))
1021
1.30k
      return YXML_OK;
1022
51
    if(ch == (unsigned char)'?') {
1023
18
      x->state = YXMLS_xmldecl9;
1024
18
      return YXML_OK;
1025
18
    }
1026
33
    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
5.37G
  }
1034
1.58k
  return YXML_ESYN;
1035
5.37G
}
1036
1037
3.12M
yxml_ret_t yxml_eof(yxml_t *x) {
1038
3.12M
  if(x->state != YXMLS_misc3 &&
1039
4.51k
     !(x->contentmode && x->state == YXMLS_misc2 && x->stacklen == 0))
1040
4.14k
    return YXML_EEOF;
1041
3.12M
  return YXML_OK;
1042
3.12M
}