Coverage Report

Created: 2026-09-28 07:11

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.06G
#define yxml_isChar(c) 1
100
/* 0xd should be part of SP, too, but yxml_parse() already normalizes that into 0xa */
101
104M
#define yxml_isSP(c) (c == 0x20 || c == 0x09 || c == 0x0a)
102
1.35G
#define yxml_isAlpha(c) ((c|32)-'a' < 26)
103
691M
#define yxml_isNum(c) (c-'0' < 10)
104
4.83k
#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.25G
#define yxml_isNameStart(c) (yxml_isAlpha(c) || c == ':' || c == '_' || c >= 128)
107
586M
#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
9.29M
#define yxml_isRef(c) (yxml_isNum(c) || yxml_isAlpha(c) || c == '#')
114
115
10.7M
#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.92G
static inline void yxml_setchar(char *dest, unsigned ch) {
119
4.92G
  *(unsigned char *)dest = (unsigned char)ch;
120
4.92G
}
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
1.88M
static void yxml_setutf8(char *dest, unsigned ch) {
125
1.88M
  if(ch <= 0x007F)
126
1.88M
    yxml_setchar(dest++, ch);
127
1.85k
  else if(ch <= 0x07FF) {
128
474
    yxml_setchar(dest++, 0xC0 | (ch>>6));
129
474
    yxml_setchar(dest++, 0x80 | (ch & 0x3F));
130
1.37k
  } else if(ch <= 0xFFFF) {
131
603
    yxml_setchar(dest++, 0xE0 | (ch>>12));
132
603
    yxml_setchar(dest++, 0x80 | ((ch>>6) & 0x3F));
133
603
    yxml_setchar(dest++, 0x80 | (ch & 0x3F));
134
774
  } else {
135
774
    yxml_setchar(dest++, 0xF0 | (ch>>18));
136
774
    yxml_setchar(dest++, 0x80 | ((ch>>12) & 0x3F));
137
774
    yxml_setchar(dest++, 0x80 | ((ch>>6) & 0x3F));
138
774
    yxml_setchar(dest++, 0x80 | (ch & 0x3F));
139
774
  }
140
1.88M
  *dest = 0;
141
1.88M
}
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
779
static inline yxml_ret_t yxml_datapi2(yxml_t *x, unsigned ch) {
156
779
  x->data[0] = '?';
157
779
  yxml_setchar(x->data+1, ch);
158
779
  x->data[2] = 0;
159
779
  return YXML_PICONTENT;
160
779
}
161
162
505
static inline yxml_ret_t yxml_datacd1(yxml_t *x, unsigned ch) {
163
505
  x->data[0] = ']';
164
505
  yxml_setchar(x->data+1, ch);
165
505
  x->data[2] = 0;
166
505
  return YXML_CONTENT;
167
505
}
168
169
459
static inline yxml_ret_t yxml_datacd2(yxml_t *x, unsigned ch) {
170
459
  x->data[0] = ']';
171
459
  x->data[1] = ']';
172
459
  yxml_setchar(x->data+2, ch);
173
459
  x->data[3] = 0;
174
459
  return YXML_CONTENT;
175
459
}
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.7M
static yxml_ret_t yxml_pushstack(yxml_t *x, char **res, unsigned ch) {
185
54.7M
  if(x->stacklen+2 >= x->stacksize)
186
10
    return YXML_ESTACK;
187
54.7M
  x->stacklen++;
188
54.7M
  *res = (char *)x->stack+x->stacklen;
189
54.7M
  x->stack[x->stacklen] = (unsigned char)ch;
190
54.7M
  x->stacklen++;
191
54.7M
  x->stack[x->stacklen] = 0;
192
54.7M
  return YXML_OK;
193
54.7M
}
194
195
306M
static yxml_ret_t yxml_pushstackc(yxml_t *x, unsigned ch) {
196
306M
  if(x->stacklen+1 >= x->stacksize)
197
7
    return YXML_ESTACK;
198
306M
  x->stack[x->stacklen] = (unsigned char)ch;
199
306M
  x->stacklen++;
200
306M
  x->stack[x->stacklen] = 0;
201
306M
  return YXML_OK;
202
306M
}
203
204
54.7M
static void yxml_popstack(yxml_t *x) {
205
54.7M
  do
206
415M
    x->stacklen--;
207
415M
  while(x->stack[x->stacklen]);
208
54.7M
}
209
210
49.1M
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
49.1M
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
49.1M
static yxml_ret_t yxml_selfclose(yxml_t *x, unsigned ch) {
217
49.1M
  yxml_popstack(x);
218
49.1M
  if(x->stacklen) {
219
46.2M
    x->elem = (char *)x->stack+x->stacklen-1;
220
336M
    while(*(x->elem-1))
221
290M
      x->elem--;
222
46.2M
    return YXML_ELEMEND;
223
46.2M
  }
224
2.92M
  x->elem = (char *)x->stack;
225
2.92M
  x->state = x->contentmode ? YXMLS_misc2 : YXMLS_misc3;
226
2.92M
  return YXML_ELEMEND;
227
49.1M
}
228
229
225M
static inline yxml_ret_t yxml_elemclose(yxml_t *x, unsigned ch) {
230
225M
  if(*((unsigned char *)x->elem) != ch)
231
198
    return YXML_ECLOSE;
232
225M
  x->elem++;
233
225M
  return YXML_OK;
234
225M
}
235
236
26.8M
static inline yxml_ret_t yxml_elemcloseend(yxml_t *x, unsigned ch) {
237
26.8M
  if(*x->elem)
238
3
    return YXML_ECLOSE;
239
26.8M
  return yxml_selfclose(x, ch);
240
26.8M
}
241
242
5.60M
static inline yxml_ret_t yxml_attrstart  (yxml_t *x, unsigned ch) { return yxml_pushstack(x, &x->attr, ch); }
243
54.6M
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.62k
static inline yxml_ret_t yxml_pistart  (yxml_t *x, unsigned ch) { return yxml_pushstack(x, &x->pi, ch); }
248
13.5k
static inline yxml_ret_t yxml_piname   (yxml_t *x, unsigned ch) { return yxml_pushstackc(x, ch); }
249
1.20k
static inline yxml_ret_t yxml_piabort  (yxml_t *x, unsigned ch) { yxml_popstack(x); return YXML_OK; }
250
7.88k
static inline yxml_ret_t yxml_pinameend(yxml_t *x, unsigned ch) {
251
7.88k
  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.88k
}
253
7.55k
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
1.88M
static inline yxml_ret_t yxml_refstart(yxml_t *x, unsigned ch) {
256
1.88M
  memset(x->data, 0, sizeof(x->data));
257
1.88M
  x->reflen = 0;
258
1.88M
  return YXML_OK;
259
1.88M
}
260
261
7.41M
static yxml_ret_t yxml_ref(yxml_t *x, unsigned ch) {
262
7.41M
  if(x->reflen >= sizeof(x->data)-1)
263
40
    return YXML_EREF;
264
7.41M
  yxml_setchar(x->data+x->reflen, ch);
265
7.41M
  x->reflen++;
266
7.41M
  return YXML_OK;
267
7.41M
}
268
269
1.88M
static yxml_ret_t yxml_refend(yxml_t *x, yxml_ret_t ret) {
270
1.88M
  unsigned char *r = (unsigned char *)x->data;
271
1.88M
  unsigned ch = 0;
272
1.88M
  if(*r == '#') {
273
5.98k
    if(r[1] == 'x')
274
4.83k
      for(r += 2; yxml_isHex((unsigned)*r); r++)
275
3.44k
        ch = (ch<<4) + (*r <= '9' ? *r-'0' : (*r|32)-'a' + 10);
276
4.59k
    else
277
13.1k
      for(r++; yxml_isNum((unsigned)*r); r++)
278
8.57k
        ch = (ch*10) + (*r-'0');
279
5.98k
    if(*r)
280
25
      ch = 0;
281
1.87M
  } else {
282
1.87M
    uint64_t i = INTFROM5CHARS(r[0], r[1], r[2], r[3], r[4]);
283
1.87M
    ch =
284
1.87M
      i == INTFROM5CHARS('l','t', 0,  0, 0) ? '<' :
285
1.87M
      i == INTFROM5CHARS('g','t', 0,  0, 0) ? '>' :
286
1.87M
      i == INTFROM5CHARS('a','m','p', 0, 0) ? '&' :
287
1.81M
      i == INTFROM5CHARS('a','p','o','s',0) ? '\'':
288
1.81M
      i == INTFROM5CHARS('q','u','o','t',0) ? '"' : 0;
289
1.87M
  }
290
291
  /* Codepoints not allowed in the XML 1.1 definition of a Char */
292
1.88M
  if(!ch || ch > 0x10FFFF || ch == 0xFFFE || ch == 0xFFFF || (ch-0xDFFF) < 0x7FF)
293
390
    return YXML_EREF;
294
1.88M
  yxml_setutf8(x->data, ch);
295
1.88M
  x->isReference = true;
296
1.88M
  return ret;
297
1.88M
}
298
299
1.88M
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.89M
void yxml_init(yxml_t *x, void *stack, size_t stacksize) {
303
2.89M
  memset(x, 0, sizeof(*x));
304
2.89M
  x->line = 1;
305
2.89M
  x->stack = (unsigned char*)stack;
306
2.89M
  x->stacksize = stacksize;
307
2.89M
  *x->stack = 0;
308
2.89M
  x->elem = x->pi = x->attr = (char *)x->stack;
309
2.89M
  x->state = YXMLS_init;
310
2.89M
}
311
312
350
void yxml_init_content(yxml_t *x, void *stack, size_t stacksize) {
313
350
  yxml_init(x, stack, stacksize);
314
350
  x->contentmode = true;
315
350
  x->state = YXMLS_misc2;
316
350
}
317
318
5.74G
yxml_ret_t yxml_parse(yxml_t *x, int _ch) {
319
5.74G
  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.74G
  unsigned ch = (unsigned)(_ch+256) & 0xff;
324
5.74G
  if(!ch)
325
12
    return YXML_ESYN;
326
5.74G
  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.74G
  if(x->ignore == ch) {
333
22.4k
    x->ignore = 0;
334
22.4k
    return YXML_OK;
335
22.4k
  }
336
5.74G
  x->ignore = (ch == 0xd) * 0xa;
337
5.74G
  if(ch == 0xa || ch == 0xd) {
338
3.97M
    ch = 0xa;
339
3.97M
    x->line++;
340
3.97M
    x->byte = 0;
341
3.97M
  }
342
5.74G
  x->byte++;
343
344
5.74G
  switch((yxml_state_t)x->state) {
345
23.9k
  case YXMLS_string:
346
23.9k
    if(ch == *x->string) {
347
23.8k
      x->string++;
348
23.8k
      if(!*x->string)
349
4.48k
        x->state = x->nextstate;
350
23.8k
      return YXML_OK;
351
23.8k
    }
352
22
    break;
353
60.2M
  case YXMLS_attr0:
354
60.2M
    if(yxml_isName(ch))
355
54.6M
      return yxml_attrname(x, ch);
356
5.60M
    if(yxml_isSP(ch)) {
357
777k
      x->state = YXMLS_attr1;
358
777k
      return yxml_attrnameend(x, ch);
359
777k
    }
360
4.82M
    if(ch == (unsigned char)'=') {
361
4.82M
      x->state = YXMLS_attr2;
362
4.82M
      return yxml_attrnameend(x, ch);
363
4.82M
    }
364
44
    break;
365
778k
  case YXMLS_attr1:
366
778k
    if(yxml_isSP(ch))
367
1.18k
      return YXML_OK;
368
777k
    if(ch == (unsigned char)'=') {
369
777k
      x->state = YXMLS_attr2;
370
777k
      return YXML_OK;
371
777k
    }
372
38
    break;
373
5.60M
  case YXMLS_attr2:
374
5.60M
    if(yxml_isSP(ch))
375
1.17k
      return YXML_OK;
376
5.60M
    if(ch == (unsigned char)'\'' || ch == (unsigned char)'"') {
377
5.60M
      x->state = YXMLS_attr3;
378
5.60M
      x->quote = ch;
379
5.60M
      return YXML_OK;
380
5.60M
    }
381
37
    break;
382
141M
  case YXMLS_attr3:
383
141M
    if(yxml_isAttValue(ch))
384
136M
      return yxml_dataattr(x, ch);
385
5.60M
    if(ch == (unsigned char)'&') {
386
1.68k
      x->state = YXMLS_attr4;
387
1.68k
      return yxml_refstart(x, ch);
388
1.68k
    }
389
5.60M
    if(x->quote == ch) {
390
5.60M
      x->state = YXMLS_elem2;
391
5.60M
      return yxml_attrvalend(x, ch);
392
5.60M
    }
393
2
    break;
394
6.14k
  case YXMLS_attr4:
395
6.14k
    if(yxml_isRef(ch))
396
4.54k
      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
31
    break;
402
2.92k
  case YXMLS_cd0:
403
2.92k
    if(ch == (unsigned char)']') {
404
1.48k
      x->state = YXMLS_cd1;
405
1.48k
      return YXML_OK;
406
1.48k
    }
407
1.43k
    if(yxml_isChar(ch))
408
1.43k
      return yxml_datacontent(x, ch);
409
0
    break;
410
1.47k
  case YXMLS_cd1:
411
1.47k
    if(ch == (unsigned char)']') {
412
971
      x->state = YXMLS_cd2;
413
971
      return YXML_OK;
414
971
    }
415
505
    if(yxml_isChar(ch)) {
416
505
      x->state = YXMLS_cd0;
417
505
      return yxml_datacd1(x, ch);
418
505
    }
419
0
    break;
420
1.36k
  case YXMLS_cd2:
421
1.36k
    if(ch == (unsigned char)']')
422
419
      return yxml_datacontent(x, ch);
423
942
    if(ch == (unsigned char)'>') {
424
483
      x->state = YXMLS_misc2;
425
483
      return YXML_OK;
426
483
    }
427
459
    if(yxml_isChar(ch)) {
428
459
      x->state = YXMLS_cd0;
429
459
      return yxml_datacd2(x, ch);
430
459
    }
431
0
    break;
432
449
  case YXMLS_comment0:
433
449
    if(ch == (unsigned char)'-') {
434
429
      x->state = YXMLS_comment1;
435
429
      return YXML_OK;
436
429
    }
437
20
    break;
438
5.52k
  case YXMLS_comment1:
439
5.52k
    if(ch == (unsigned char)'-') {
440
5.50k
      x->state = YXMLS_comment2;
441
5.50k
      return YXML_OK;
442
5.50k
    }
443
19
    break;
444
7.97k
  case YXMLS_comment2:
445
7.97k
    if(ch == (unsigned char)'-') {
446
6.20k
      x->state = YXMLS_comment3;
447
6.20k
      return YXML_OK;
448
6.20k
    }
449
1.77k
    if(yxml_isChar(ch))
450
1.77k
      return YXML_OK;
451
0
    break;
452
6.18k
  case YXMLS_comment3:
453
6.18k
    if(ch == (unsigned char)'-') {
454
5.40k
      x->state = YXMLS_comment4;
455
5.40k
      return YXML_OK;
456
5.40k
    }
457
779
    if(yxml_isChar(ch)) {
458
779
      x->state = YXMLS_comment2;
459
779
      return YXML_OK;
460
779
    }
461
0
    break;
462
5.39k
  case YXMLS_comment4:
463
5.39k
    if(ch == (unsigned char)'>') {
464
5.38k
      x->state = x->nextstate;
465
5.38k
      return YXML_OK;
466
5.38k
    }
467
9
    break;
468
3.86k
  case YXMLS_dt0:
469
3.86k
    if(ch == (unsigned char)'>') {
470
655
      x->state = YXMLS_misc1;
471
655
      return YXML_OK;
472
655
    }
473
3.21k
    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.03k
    if(ch == (unsigned char)'<') {
480
1.60k
      x->state = YXMLS_dt2;
481
1.60k
      return YXML_OK;
482
1.60k
    }
483
424
    if(yxml_isChar(ch))
484
424
      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.59k
  case YXMLS_dt2:
495
1.59k
    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.20k
    if(ch == (unsigned char)'!') {
501
1.17k
      x->state = YXMLS_dt3;
502
1.17k
      return YXML_OK;
503
1.17k
    }
504
27
    break;
505
1.16k
  case YXMLS_dt3:
506
1.16k
    if(ch == (unsigned char)'-') {
507
388
      x->state = YXMLS_comment1;
508
388
      x->nextstate = YXMLS_dt0;
509
388
      return YXML_OK;
510
388
    }
511
777
    if(yxml_isChar(ch)) {
512
777
      x->state = YXMLS_dt4;
513
777
      return YXML_OK;
514
777
    }
515
0
    break;
516
1.86k
  case YXMLS_dt4:
517
1.86k
    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.09k
    if(ch == (unsigned char)'>') {
524
683
      x->state = YXMLS_dt0;
525
683
      return YXML_OK;
526
683
    }
527
409
    if(yxml_isChar(ch))
528
409
      return YXML_OK;
529
0
    break;
530
300M
  case YXMLS_elem0:
531
300M
    if(yxml_isName(ch))
532
251M
      return yxml_elemname(x, ch);
533
49.1M
    if(yxml_isSP(ch)) {
534
3.90M
      x->state = YXMLS_elem1;
535
3.90M
      return yxml_elemnameend(x, ch);
536
3.90M
    }
537
45.2M
    if(ch == (unsigned char)'/') {
538
19.7M
      x->state = YXMLS_elem3;
539
19.7M
      return yxml_elemnameend(x, ch);
540
19.7M
    }
541
25.4M
    if(ch == (unsigned char)'>') {
542
25.4M
      x->state = YXMLS_misc2;
543
25.4M
      return yxml_elemnameend(x, ch);
544
25.4M
    }
545
48
    break;
546
7.97M
  case YXMLS_elem1:
547
7.97M
    if(yxml_isSP(ch))
548
1.43M
      return YXML_OK;
549
6.54M
    if(ch == (unsigned char)'/') {
550
938k
      x->state = YXMLS_elem3;
551
938k
      return YXML_OK;
552
938k
    }
553
5.60M
    if(ch == (unsigned char)'>') {
554
825
      x->state = YXMLS_misc2;
555
825
      return YXML_OK;
556
825
    }
557
5.60M
    if(yxml_isNameStart(ch)) {
558
5.60M
      x->state = YXMLS_attr0;
559
5.60M
      return yxml_attrstart(x, ch);
560
5.60M
    }
561
49
    break;
562
5.60M
  case YXMLS_elem2:
563
5.60M
    if(yxml_isSP(ch)) {
564
2.64M
      x->state = YXMLS_elem1;
565
2.64M
      return YXML_OK;
566
2.64M
    }
567
2.96M
    if(ch == (unsigned char)'/') {
568
1.59M
      x->state = YXMLS_elem3;
569
1.59M
      return YXML_OK;
570
1.59M
    }
571
1.36M
    if(ch == (unsigned char)'>') {
572
1.36M
      x->state = YXMLS_misc2;
573
1.36M
      return YXML_OK;
574
1.36M
    }
575
35
    break;
576
22.3M
  case YXMLS_elem3:
577
22.3M
    if(ch == (unsigned char)'>') {
578
22.3M
      x->state = YXMLS_misc2;
579
22.3M
      return yxml_selfclose(x, ch);
580
22.3M
    }
581
19
    break;
582
1.58k
  case YXMLS_enc0:
583
1.58k
    if(yxml_isSP(ch))
584
1.16k
      return YXML_OK;
585
419
    if(ch == (unsigned char)'=') {
586
381
      x->state = YXMLS_enc1;
587
381
      return YXML_OK;
588
381
    }
589
38
    break;
590
1.49k
  case YXMLS_enc1:
591
1.49k
    if(yxml_isSP(ch))
592
1.16k
      return YXML_OK;
593
331
    if(ch == (unsigned char)'\'' || ch == (unsigned char)'"') {
594
300
      x->state = YXMLS_enc2;
595
300
      x->quote = ch;
596
300
      return YXML_OK;
597
300
    }
598
31
    break;
599
296
  case YXMLS_enc2:
600
296
    if(yxml_isAlpha(ch)) {
601
279
      x->state = YXMLS_enc3;
602
279
      return YXML_OK;
603
279
    }
604
17
    break;
605
2.14k
  case YXMLS_enc3:
606
2.14k
    if(yxml_isEncName(ch))
607
1.95k
      return YXML_OK;
608
187
    if(x->quote == ch) {
609
158
      x->state = YXMLS_xmldecl6;
610
158
      return YXML_OK;
611
158
    }
612
29
    break;
613
26.8M
  case YXMLS_etag0:
614
26.8M
    if(yxml_isNameStart(ch)) {
615
26.8M
      x->state = YXMLS_etag1;
616
26.8M
      return yxml_elemclose(x, ch);
617
26.8M
    }
618
30
    break;
619
225M
  case YXMLS_etag1:
620
225M
    if(yxml_isName(ch))
621
198M
      return yxml_elemclose(x, ch);
622
26.8M
    if(yxml_isSP(ch)) {
623
2.48k
      x->state = YXMLS_etag2;
624
2.48k
      return yxml_elemcloseend(x, ch);
625
2.48k
    }
626
26.8M
    if(ch == (unsigned char)'>') {
627
26.8M
      x->state = YXMLS_misc2;
628
26.8M
      return yxml_elemcloseend(x, ch);
629
26.8M
    }
630
39
    break;
631
19.5k
  case YXMLS_etag2:
632
19.5k
    if(yxml_isSP(ch))
633
17.5k
      return YXML_OK;
634
2.06k
    if(ch == (unsigned char)'>') {
635
2.02k
      x->state = YXMLS_misc2;
636
2.02k
      return YXML_OK;
637
2.02k
    }
638
34
    break;
639
2.89M
  case YXMLS_init:
640
2.89M
    if(ch == (unsigned char)'\xef') {
641
35
      x->state = YXMLS_string;
642
35
      x->nextstate = YXMLS_misc0;
643
35
      x->string = (unsigned char *)"\xbb\xbf";
644
35
      return YXML_OK;
645
35
    }
646
2.89M
    if(yxml_isSP(ch)) {
647
220
      x->state = YXMLS_misc0;
648
220
      return YXML_OK;
649
220
    }
650
2.89M
    if(ch == (unsigned char)'<') {
651
2.89M
      x->state = YXMLS_le0;
652
2.89M
      return YXML_OK;
653
2.89M
    }
654
57
    break;
655
2.89M
  case YXMLS_le0:
656
2.89M
    if(ch == (unsigned char)'!') {
657
557
      x->state = YXMLS_lee1;
658
557
      return YXML_OK;
659
557
    }
660
2.89M
    if(ch == (unsigned char)'?') {
661
2.50k
      x->state = YXMLS_leq0;
662
2.50k
      return YXML_OK;
663
2.50k
    }
664
2.89M
    if(yxml_isNameStart(ch)) {
665
2.89M
      x->state = YXMLS_elem0;
666
2.89M
      return yxml_elemstart(x, ch);
667
2.89M
    }
668
45
    break;
669
5.24k
  case YXMLS_le1:
670
5.24k
    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.26k
      x->state = YXMLS_pi0;
676
3.26k
      x->nextstate = YXMLS_misc1;
677
3.26k
      return YXML_OK;
678
3.26k
    }
679
389
    if(yxml_isNameStart(ch)) {
680
362
      x->state = YXMLS_elem0;
681
362
      return yxml_elemstart(x, ch);
682
362
    }
683
27
    break;
684
73.0M
  case YXMLS_le2:
685
73.0M
    if(ch == (unsigned char)'!') {
686
4.30k
      x->state = YXMLS_lee2;
687
4.30k
      return YXML_OK;
688
4.30k
    }
689
73.0M
    if(ch == (unsigned char)'?') {
690
2.85k
      x->state = YXMLS_pi0;
691
2.85k
      x->nextstate = YXMLS_misc2;
692
2.85k
      return YXML_OK;
693
2.85k
    }
694
73.0M
    if(ch == (unsigned char)'/') {
695
26.8M
      x->state = YXMLS_etag0;
696
26.8M
      return YXML_OK;
697
26.8M
    }
698
46.2M
    if(yxml_isNameStart(ch)) {
699
46.2M
      x->state = YXMLS_elem0;
700
46.2M
      return yxml_elemstart(x, ch);
701
46.2M
    }
702
43
    break;
703
1.21k
  case YXMLS_le3:
704
1.21k
    if(ch == (unsigned char)'!') {
705
460
      x->state = YXMLS_comment0;
706
460
      x->nextstate = YXMLS_misc3;
707
460
      return YXML_OK;
708
460
    }
709
758
    if(ch == (unsigned char)'?') {
710
737
      x->state = YXMLS_pi0;
711
737
      x->nextstate = YXMLS_misc3;
712
737
      return YXML_OK;
713
737
    }
714
21
    break;
715
2.13k
  case YXMLS_lee1:
716
2.13k
    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
993
      x->state = YXMLS_string;
723
993
      x->nextstate = YXMLS_dt0;
724
993
      x->string = (unsigned char *)"OCTYPE";
725
993
      return YXML_OK;
726
993
    }
727
22
    break;
728
4.29k
  case YXMLS_lee2:
729
4.29k
    if(ch == (unsigned char)'-') {
730
3.64k
      x->state = YXMLS_comment1;
731
3.64k
      x->nextstate = YXMLS_misc2;
732
3.64k
      return YXML_OK;
733
3.64k
    }
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.50k
  case YXMLS_leq0:
742
2.50k
    if(ch == (unsigned char)'x') {
743
1.86k
      x->state = YXMLS_xmldecl0;
744
1.86k
      x->nextstate = YXMLS_misc1;
745
1.86k
      return yxml_pistart(x, ch);
746
1.86k
    }
747
633
    if(yxml_isNameStart(ch)) {
748
606
      x->state = YXMLS_pi1;
749
606
      x->nextstate = YXMLS_misc1;
750
606
      return yxml_pistart(x, ch);
751
606
    }
752
27
    break;
753
2.45k
  case YXMLS_misc0:
754
2.45k
    if(yxml_isSP(ch))
755
2.31k
      return YXML_OK;
756
134
    if(ch == (unsigned char)'<') {
757
94
      x->state = YXMLS_le0;
758
94
      return YXML_OK;
759
94
    }
760
40
    break;
761
6.48k
  case YXMLS_misc1:
762
6.48k
    if(yxml_isSP(ch))
763
1.19k
      return YXML_OK;
764
5.28k
    if(ch == (unsigned char)'<') {
765
5.25k
      x->state = YXMLS_le1;
766
5.25k
      return YXML_OK;
767
5.25k
    }
768
33
    break;
769
4.85G
  case YXMLS_misc2:
770
4.85G
    if(ch == (unsigned char)'<') {
771
73.0M
      x->state = YXMLS_le2;
772
73.0M
      return YXML_OK;
773
73.0M
    }
774
4.78G
    if(ch == (unsigned char)'&') {
775
1.88M
      x->state = YXMLS_misc2a;
776
1.88M
      return yxml_refstart(x, ch);
777
1.88M
    }
778
4.78G
    if(yxml_isChar(ch))
779
4.78G
      return yxml_datacontent(x, ch);
780
0
    break;
781
9.28M
  case YXMLS_misc2a:
782
9.28M
    if(yxml_isRef(ch))
783
7.40M
      return yxml_ref(x, ch);
784
1.88M
    if(ch == (unsigned char)'\x3b') {
785
1.88M
      x->state = YXMLS_misc2;
786
1.88M
      return yxml_refcontent(x, ch);
787
1.88M
    }
788
32
    break;
789
2.45k
  case YXMLS_misc3:
790
2.45k
    if(yxml_isSP(ch))
791
1.18k
      return YXML_OK;
792
1.27k
    if(ch == (unsigned char)'<') {
793
1.22k
      x->state = YXMLS_le3;
794
1.22k
      return YXML_OK;
795
1.22k
    }
796
42
    break;
797
7.17k
  case YXMLS_pi0:
798
7.17k
    if(yxml_isNameStart(ch)) {
799
7.14k
      x->state = YXMLS_pi1;
800
7.14k
      return yxml_pistart(x, ch);
801
7.14k
    }
802
32
    break;
803
17.9k
  case YXMLS_pi1:
804
17.9k
    if(yxml_isName(ch))
805
10.0k
      return yxml_piname(x, ch);
806
7.82k
    if(ch == (unsigned char)'?') {
807
5.07k
      x->state = YXMLS_pi4;
808
5.07k
      return yxml_pinameend(x, ch);
809
5.07k
    }
810
2.75k
    if(yxml_isSP(ch)) {
811
2.70k
      x->state = YXMLS_pi2;
812
2.70k
      return yxml_pinameend(x, ch);
813
2.70k
    }
814
48
    break;
815
6.75k
  case YXMLS_pi2:
816
6.75k
    if(ch == (unsigned char)'?') {
817
3.35k
      x->state = YXMLS_pi3;
818
3.35k
      return YXML_OK;
819
3.35k
    }
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.56k
      x->state = x->nextstate;
826
2.56k
      return yxml_pivalend(x, ch);
827
2.56k
    }
828
779
    if(yxml_isChar(ch)) {
829
779
      x->state = YXMLS_pi2;
830
779
      return yxml_datapi2(x, ch);
831
779
    }
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
227
    if(ch == (unsigned char)'=') {
843
196
      x->state = YXMLS_std1;
844
196
      return YXML_OK;
845
196
    }
846
31
    break;
847
1.31k
  case YXMLS_std1:
848
1.31k
    if(yxml_isSP(ch))
849
1.16k
      return YXML_OK;
850
146
    if(ch == (unsigned char)'\'' || ch == (unsigned char)'"') {
851
131
      x->state = YXMLS_std2;
852
131
      x->quote = ch;
853
131
      return YXML_OK;
854
131
    }
855
15
    break;
856
127
  case YXMLS_std2:
857
127
    if(ch == (unsigned char)'y') {
858
6
      x->state = YXMLS_string;
859
6
      x->nextstate = YXMLS_std3;
860
6
      x->string = (unsigned char *)"es";
861
6
      return YXML_OK;
862
6
    }
863
121
    if(ch == (unsigned char)'n') {
864
102
      x->state = YXMLS_string;
865
102
      x->nextstate = YXMLS_std3;
866
102
      x->string = (unsigned char *)"o";
867
102
      return YXML_OK;
868
102
    }
869
19
    break;
870
103
  case YXMLS_std3:
871
103
    if(x->quote == ch) {
872
100
      x->state = YXMLS_xmldecl8;
873
100
      return YXML_OK;
874
100
    }
875
3
    break;
876
2.22k
  case YXMLS_ver0:
877
2.22k
    if(yxml_isSP(ch))
878
1.16k
      return YXML_OK;
879
1.06k
    if(ch == (unsigned char)'=') {
880
1.03k
      x->state = YXMLS_ver1;
881
1.03k
      return YXML_OK;
882
1.03k
    }
883
28
    break;
884
2.15k
  case YXMLS_ver1:
885
2.15k
    if(yxml_isSP(ch))
886
1.16k
      return YXML_OK;
887
985
    if(ch == (unsigned char)'\'' || ch == (unsigned char)'"') {
888
951
      x->state = YXMLS_string;
889
951
      x->quote = ch;
890
951
      x->nextstate = YXMLS_ver2;
891
951
      x->string = (unsigned char *)"1.";
892
951
      return YXML_OK;
893
951
    }
894
34
    break;
895
945
  case YXMLS_ver2:
896
945
    if(yxml_isNum(ch)) {
897
931
      x->state = YXMLS_ver3;
898
931
      return YXML_OK;
899
931
    }
900
14
    break;
901
1.30k
  case YXMLS_ver3:
902
1.30k
    if(yxml_isNum(ch))
903
388
      return YXML_OK;
904
913
    if(x->quote == ch) {
905
892
      x->state = YXMLS_xmldecl4;
906
892
      return YXML_OK;
907
892
    }
908
21
    break;
909
1.86k
  case YXMLS_xmldecl0:
910
1.86k
    if(ch == (unsigned char)'m') {
911
1.59k
      x->state = YXMLS_xmldecl1;
912
1.59k
      return yxml_piname(x, ch);
913
1.59k
    }
914
277
    if(yxml_isName(ch)) {
915
146
      x->state = YXMLS_pi1;
916
146
      return yxml_piname(x, ch);
917
146
    }
918
131
    if(ch == (unsigned char)'?') {
919
31
      x->state = YXMLS_pi4;
920
31
      return yxml_pinameend(x, ch);
921
31
    }
922
100
    if(yxml_isSP(ch)) {
923
50
      x->state = YXMLS_pi2;
924
50
      return yxml_pinameend(x, ch);
925
50
    }
926
50
    break;
927
1.58k
  case YXMLS_xmldecl1:
928
1.58k
    if(ch == (unsigned char)'l') {
929
1.41k
      x->state = YXMLS_xmldecl2;
930
1.41k
      return yxml_piname(x, ch);
931
1.41k
    }
932
172
    if(yxml_isName(ch)) {
933
99
      x->state = YXMLS_pi1;
934
99
      return yxml_piname(x, ch);
935
99
    }
936
73
    if(ch == (unsigned char)'?') {
937
6
      x->state = YXMLS_pi4;
938
6
      return yxml_pinameend(x, ch);
939
6
    }
940
67
    if(yxml_isSP(ch)) {
941
20
      x->state = YXMLS_pi2;
942
20
      return yxml_pinameend(x, ch);
943
20
    }
944
47
    break;
945
1.41k
  case YXMLS_xmldecl2:
946
1.41k
    if(yxml_isSP(ch)) {
947
1.20k
      x->state = YXMLS_xmldecl3;
948
1.20k
      return yxml_piabort(x, ch);
949
1.20k
    }
950
211
    if(yxml_isName(ch)) {
951
184
      x->state = YXMLS_pi1;
952
184
      return yxml_piname(x, ch);
953
184
    }
954
27
    break;
955
2.31k
  case YXMLS_xmldecl3:
956
2.31k
    if(yxml_isSP(ch))
957
1.16k
      return YXML_OK;
958
1.14k
    if(ch == (unsigned char)'v') {
959
1.11k
      x->state = YXMLS_string;
960
1.11k
      x->nextstate = YXMLS_ver0;
961
1.11k
      x->string = (unsigned char *)"ersion";
962
1.11k
      return YXML_OK;
963
1.11k
    }
964
36
    break;
965
890
  case YXMLS_xmldecl4:
966
890
    if(yxml_isSP(ch)) {
967
846
      x->state = YXMLS_xmldecl5;
968
846
      return YXML_OK;
969
846
    }
970
44
    if(ch == (unsigned char)'?') {
971
24
      x->state = YXMLS_xmldecl9;
972
24
      return YXML_OK;
973
24
    }
974
20
    break;
975
2.03k
  case YXMLS_xmldecl5:
976
2.03k
    if(yxml_isSP(ch))
977
1.23k
      return YXML_OK;
978
792
    if(ch == (unsigned char)'?') {
979
14
      x->state = YXMLS_xmldecl9;
980
14
      return YXML_OK;
981
14
    }
982
778
    if(ch == (unsigned char)'e') {
983
470
      x->state = YXMLS_string;
984
470
      x->nextstate = YXMLS_enc0;
985
470
      x->string = (unsigned char *)"ncoding";
986
470
      return YXML_OK;
987
470
    }
988
308
    if(ch == (unsigned char)'s') {
989
271
      x->state = YXMLS_string;
990
271
      x->nextstate = YXMLS_std0;
991
271
      x->string = (unsigned char *)"tandalone";
992
271
      return YXML_OK;
993
271
    }
994
37
    break;
995
156
  case YXMLS_xmldecl6:
996
156
    if(yxml_isSP(ch)) {
997
108
      x->state = YXMLS_xmldecl7;
998
108
      return YXML_OK;
999
108
    }
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.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.23k
  case YXMLS_xmldecl8:
1020
1.23k
    if(yxml_isSP(ch))
1021
1.18k
      return YXML_OK;
1022
50
    if(ch == (unsigned char)'?') {
1023
18
      x->state = YXMLS_xmldecl9;
1024
18
      return YXML_OK;
1025
18
    }
1026
32
    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.74G
  }
1034
1.61k
  return YXML_ESYN;
1035
5.74G
}
1036
1037
2.89M
yxml_ret_t yxml_eof(yxml_t *x) {
1038
2.89M
  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.88M
  return YXML_OK;
1042
2.89M
}