Coverage Report

Created: 2026-10-03 06:33

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