Coverage Report

Created: 2026-11-05 07:00

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.88G
#define yxml_isChar(c) 1
100
/* 0xd should be part of SP, too, but yxml_parse() already normalizes that into 0xa */
101
114M
#define yxml_isSP(c) (c == 0x20 || c == 0x09 || c == 0x0a)
102
1.60G
#define yxml_isAlpha(c) ((c|32)-'a' < 26)
103
820M
#define yxml_isNum(c) (c-'0' < 10)
104
5.01k
#define yxml_isHex(c) (yxml_isNum(c) || (c|32)-'a' < 6)
105
2.16k
#define yxml_isEncName(c) (yxml_isAlpha(c) || yxml_isNum(c) || c == '.' || c == '_' || c == '-')
106
1.47G
#define yxml_isNameStart(c) (yxml_isAlpha(c) || c == ':' || c == '_' || c >= 128)
107
694M
#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
153M
#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.9M
#define yxml_isRef(c) (yxml_isNum(c) || yxml_isAlpha(c) || c == '#')
114
115
18.5M
#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
5.73G
static inline void yxml_setchar(char *dest, unsigned ch) {
119
5.73G
  *(unsigned char *)dest = (unsigned char)ch;
120
5.73G
}
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.21M
static void yxml_setutf8(char *dest, unsigned ch) {
125
3.21M
  if(ch <= 0x007F)
126
3.21M
    yxml_setchar(dest++, ch);
127
1.86k
  else if(ch <= 0x07FF) {
128
490
    yxml_setchar(dest++, 0xC0 | (ch>>6));
129
490
    yxml_setchar(dest++, 0x80 | (ch & 0x3F));
130
1.37k
  } else if(ch <= 0xFFFF) {
131
604
    yxml_setchar(dest++, 0xE0 | (ch>>12));
132
604
    yxml_setchar(dest++, 0x80 | ((ch>>6) & 0x3F));
133
604
    yxml_setchar(dest++, 0x80 | (ch & 0x3F));
134
766
  } else {
135
766
    yxml_setchar(dest++, 0xF0 | (ch>>18));
136
766
    yxml_setchar(dest++, 0x80 | ((ch>>12) & 0x3F));
137
766
    yxml_setchar(dest++, 0x80 | ((ch>>6) & 0x3F));
138
766
    yxml_setchar(dest++, 0x80 | (ch & 0x3F));
139
766
  }
140
3.21M
  *dest = 0;
141
3.21M
}
142
143
5.57G
static inline yxml_ret_t yxml_datacontent(yxml_t *x, unsigned ch) {
144
5.57G
  yxml_setchar(x->data, ch);
145
5.57G
  x->data[1] = 0;
146
5.57G
  return YXML_CONTENT;
147
5.57G
}
148
149
602
static inline yxml_ret_t yxml_datapi1(yxml_t *x, unsigned ch) {
150
602
  yxml_setchar(x->data, ch);
151
602
  x->data[1] = 0;
152
602
  return YXML_PICONTENT;
153
602
}
154
155
775
static inline yxml_ret_t yxml_datapi2(yxml_t *x, unsigned ch) {
156
775
  x->data[0] = '?';
157
775
  yxml_setchar(x->data+1, ch);
158
775
  x->data[2] = 0;
159
775
  return YXML_PICONTENT;
160
775
}
161
162
506
static inline yxml_ret_t yxml_datacd1(yxml_t *x, unsigned ch) {
163
506
  x->data[0] = ']';
164
506
  yxml_setchar(x->data+1, ch);
165
506
  x->data[2] = 0;
166
506
  return YXML_CONTENT;
167
506
}
168
169
460
static inline yxml_ret_t yxml_datacd2(yxml_t *x, unsigned ch) {
170
460
  x->data[0] = ']';
171
460
  x->data[1] = ']';
172
460
  yxml_setchar(x->data+2, ch);
173
460
  x->data[3] = 0;
174
460
  return YXML_CONTENT;
175
460
}
176
177
147M
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
147M
  yxml_setchar(x->data, ch == 0x9 || ch == 0xa ? 0x20 : ch);
180
147M
  x->data[1] = 0;
181
147M
  return YXML_ATTRVAL;
182
147M
}
183
184
56.9M
static yxml_ret_t yxml_pushstack(yxml_t *x, char **res, unsigned ch) {
185
56.9M
  if(x->stacklen+2 >= x->stacksize)
186
10
    return YXML_ESTACK;
187
56.9M
  x->stacklen++;
188
56.9M
  *res = (char *)x->stack+x->stacklen;
189
56.9M
  x->stack[x->stacklen] = (unsigned char)ch;
190
56.9M
  x->stacklen++;
191
56.9M
  x->stack[x->stacklen] = 0;
192
56.9M
  return YXML_OK;
193
56.9M
}
194
195
363M
static yxml_ret_t yxml_pushstackc(yxml_t *x, unsigned ch) {
196
363M
  if(x->stacklen+1 >= x->stacksize)
197
6
    return YXML_ESTACK;
198
363M
  x->stack[x->stacklen] = (unsigned char)ch;
199
363M
  x->stacklen++;
200
363M
  x->stack[x->stacklen] = 0;
201
363M
  return YXML_OK;
202
363M
}
203
204
56.9M
static void yxml_popstack(yxml_t *x) {
205
56.9M
  do
206
477M
    x->stacklen--;
207
477M
  while(x->stack[x->stacklen]);
208
56.9M
}
209
210
50.8M
static inline yxml_ret_t yxml_elemstart  (yxml_t *x, unsigned ch) { return yxml_pushstack(x, &x->elem, ch); }
211
304M
static inline yxml_ret_t yxml_elemname   (yxml_t *x, unsigned ch) { return yxml_pushstackc(x, ch); }
212
50.8M
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
50.8M
static yxml_ret_t yxml_selfclose(yxml_t *x, unsigned ch) {
217
50.8M
  yxml_popstack(x);
218
50.8M
  if(x->stacklen) {
219
47.3M
    x->elem = (char *)x->stack+x->stacklen-1;
220
372M
    while(*(x->elem-1))
221
324M
      x->elem--;
222
47.3M
    return YXML_ELEMEND;
223
47.3M
  }
224
3.51M
  x->elem = (char *)x->stack;
225
3.51M
  x->state = x->contentmode ? YXMLS_misc2 : YXMLS_misc3;
226
3.51M
  return YXML_ELEMEND;
227
50.8M
}
228
229
274M
static inline yxml_ret_t yxml_elemclose(yxml_t *x, unsigned ch) {
230
274M
  if(*((unsigned char *)x->elem) != ch)
231
194
    return YXML_ECLOSE;
232
274M
  x->elem++;
233
274M
  return YXML_OK;
234
274M
}
235
236
32.5M
static inline yxml_ret_t yxml_elemcloseend(yxml_t *x, unsigned ch) {
237
32.5M
  if(*x->elem)
238
4
    return YXML_ECLOSE;
239
32.5M
  return yxml_selfclose(x, ch);
240
32.5M
}
241
242
6.04M
static inline yxml_ret_t yxml_attrstart  (yxml_t *x, unsigned ch) { return yxml_pushstack(x, &x->attr, ch); }
243
59.2M
static inline yxml_ret_t yxml_attrname   (yxml_t *x, unsigned ch) { return yxml_pushstackc(x, ch); }
244
6.04M
static inline yxml_ret_t yxml_attrnameend(yxml_t *x, unsigned ch) { return YXML_ATTRSTART; }
245
6.04M
static inline yxml_ret_t yxml_attrvalend (yxml_t *x, unsigned ch) { yxml_popstack(x); return YXML_ATTREND; }
246
247
9.47k
static inline yxml_ret_t yxml_pistart  (yxml_t *x, unsigned ch) { return yxml_pushstack(x, &x->pi, ch); }
248
12.9k
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.75k
static inline yxml_ret_t yxml_pinameend(yxml_t *x, unsigned ch) {
251
7.75k
  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.75k
}
253
7.42k
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.21M
static inline yxml_ret_t yxml_refstart(yxml_t *x, unsigned ch) {
256
3.21M
  memset(x->data, 0, sizeof(x->data));
257
3.21M
  x->reflen = 0;
258
3.21M
  return YXML_OK;
259
3.21M
}
260
261
12.6M
static yxml_ret_t yxml_ref(yxml_t *x, unsigned ch) {
262
12.6M
  if(x->reflen >= sizeof(x->data)-1)
263
41
    return YXML_EREF;
264
12.6M
  yxml_setchar(x->data+x->reflen, ch);
265
12.6M
  x->reflen++;
266
12.6M
  return YXML_OK;
267
12.6M
}
268
269
3.21M
static yxml_ret_t yxml_refend(yxml_t *x, yxml_ret_t ret) {
270
3.21M
  unsigned char *r = (unsigned char *)x->data;
271
3.21M
  unsigned ch = 0;
272
3.21M
  if(*r == '#') {
273
6.55k
    if(r[1] == 'x')
274
5.01k
      for(r += 2; yxml_isHex((unsigned)*r); r++)
275
3.56k
        ch = (ch<<4) + (*r <= '9' ? *r-'0' : (*r|32)-'a' + 10);
276
5.10k
    else
277
13.9k
      for(r++; yxml_isNum((unsigned)*r); r++)
278
8.79k
        ch = (ch*10) + (*r-'0');
279
6.55k
    if(*r)
280
23
      ch = 0;
281
3.20M
  } else {
282
3.20M
    uint64_t i = INTFROM5CHARS(r[0], r[1], r[2], r[3], r[4]);
283
3.20M
    ch =
284
3.20M
      i == INTFROM5CHARS('l','t', 0,  0, 0) ? '<' :
285
3.20M
      i == INTFROM5CHARS('g','t', 0,  0, 0) ? '>' :
286
3.20M
      i == INTFROM5CHARS('a','m','p', 0, 0) ? '&' :
287
3.12M
      i == INTFROM5CHARS('a','p','o','s',0) ? '\'':
288
3.12M
      i == INTFROM5CHARS('q','u','o','t',0) ? '"' : 0;
289
3.20M
  }
290
291
  /* Codepoints not allowed in the XML 1.1 definition of a Char */
292
3.21M
  if(!ch || ch > 0x10FFFF || ch == 0xFFFE || ch == 0xFFFF || (ch-0xDFFF) < 0x7FF)
293
389
    return YXML_EREF;
294
3.21M
  yxml_setutf8(x->data, ch);
295
3.21M
  x->isReference = true;
296
3.21M
  return ret;
297
3.21M
}
298
299
3.21M
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.51M
void yxml_init(yxml_t *x, void *stack, size_t stacksize) {
303
3.51M
  memset(x, 0, sizeof(*x));
304
3.51M
  x->line = 1;
305
3.51M
  x->stack = (unsigned char*)stack;
306
3.51M
  x->stacksize = stacksize;
307
3.51M
  *x->stack = 0;
308
3.51M
  x->elem = x->pi = x->attr = (char *)x->stack;
309
3.51M
  x->state = YXMLS_init;
310
3.51M
}
311
312
343
void yxml_init_content(yxml_t *x, void *stack, size_t stacksize) {
313
343
  yxml_init(x, stack, stacksize);
314
343
  x->contentmode = true;
315
343
  x->state = YXMLS_misc2;
316
343
}
317
318
6.68G
yxml_ret_t yxml_parse(yxml_t *x, int _ch) {
319
6.68G
  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
6.68G
  unsigned ch = (unsigned)(_ch+256) & 0xff;
324
6.68G
  if(!ch)
325
11
    return YXML_ESYN;
326
6.68G
  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
6.68G
  if(x->ignore == ch) {
333
20.3k
    x->ignore = 0;
334
20.3k
    return YXML_OK;
335
20.3k
  }
336
6.68G
  x->ignore = (ch == 0xd) * 0xa;
337
6.68G
  if(ch == 0xa || ch == 0xd) {
338
118M
    ch = 0xa;
339
118M
    x->line++;
340
118M
    x->byte = 0;
341
118M
  }
342
6.68G
  x->byte++;
343
344
6.68G
  switch((yxml_state_t)x->state) {
345
23.7k
  case YXMLS_string:
346
23.7k
    if(ch == *x->string) {
347
23.7k
      x->string++;
348
23.7k
      if(!*x->string)
349
4.45k
        x->state = x->nextstate;
350
23.7k
      return YXML_OK;
351
23.7k
    }
352
22
    break;
353
65.2M
  case YXMLS_attr0:
354
65.2M
    if(yxml_isName(ch))
355
59.2M
      return yxml_attrname(x, ch);
356
6.04M
    if(yxml_isSP(ch)) {
357
897k
      x->state = YXMLS_attr1;
358
897k
      return yxml_attrnameend(x, ch);
359
897k
    }
360
5.14M
    if(ch == (unsigned char)'=') {
361
5.14M
      x->state = YXMLS_attr2;
362
5.14M
      return yxml_attrnameend(x, ch);
363
5.14M
    }
364
46
    break;
365
898k
  case YXMLS_attr1:
366
898k
    if(yxml_isSP(ch))
367
1.19k
      return YXML_OK;
368
897k
    if(ch == (unsigned char)'=') {
369
897k
      x->state = YXMLS_attr2;
370
897k
      return YXML_OK;
371
897k
    }
372
31
    break;
373
6.04M
  case YXMLS_attr2:
374
6.04M
    if(yxml_isSP(ch))
375
1.16k
      return YXML_OK;
376
6.04M
    if(ch == (unsigned char)'\'' || ch == (unsigned char)'"') {
377
6.04M
      x->state = YXMLS_attr3;
378
6.04M
      x->quote = ch;
379
6.04M
      return YXML_OK;
380
6.04M
    }
381
36
    break;
382
153M
  case YXMLS_attr3:
383
153M
    if(yxml_isAttValue(ch))
384
147M
      return yxml_dataattr(x, ch);
385
6.04M
    if(ch == (unsigned char)'&') {
386
1.68k
      x->state = YXMLS_attr4;
387
1.68k
      return yxml_refstart(x, ch);
388
1.68k
    }
389
6.04M
    if(x->quote == ch) {
390
6.04M
      x->state = YXMLS_elem2;
391
6.04M
      return yxml_attrvalend(x, ch);
392
6.04M
    }
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.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
33
    break;
402
2.35k
  case YXMLS_cd0:
403
2.35k
    if(ch == (unsigned char)']') {
404
1.49k
      x->state = YXMLS_cd1;
405
1.49k
      return YXML_OK;
406
1.49k
    }
407
862
    if(yxml_isChar(ch))
408
862
      return yxml_datacontent(x, ch);
409
0
    break;
410
1.47k
  case YXMLS_cd1:
411
1.47k
    if(ch == (unsigned char)']') {
412
972
      x->state = YXMLS_cd2;
413
972
      return YXML_OK;
414
972
    }
415
506
    if(yxml_isChar(ch)) {
416
506
      x->state = YXMLS_cd0;
417
506
      return yxml_datacd1(x, ch);
418
506
    }
419
0
    break;
420
1.36k
  case YXMLS_cd2:
421
1.36k
    if(ch == (unsigned char)']')
422
418
      return yxml_datacontent(x, ch);
423
944
    if(ch == (unsigned char)'>') {
424
484
      x->state = YXMLS_misc2;
425
484
      return YXML_OK;
426
484
    }
427
460
    if(yxml_isChar(ch)) {
428
460
      x->state = YXMLS_cd0;
429
460
      return yxml_datacd2(x, ch);
430
460
    }
431
0
    break;
432
448
  case YXMLS_comment0:
433
448
    if(ch == (unsigned char)'-') {
434
429
      x->state = YXMLS_comment1;
435
429
      return YXML_OK;
436
429
    }
437
19
    break;
438
5.60k
  case YXMLS_comment1:
439
5.60k
    if(ch == (unsigned char)'-') {
440
5.59k
      x->state = YXMLS_comment2;
441
5.59k
      return YXML_OK;
442
5.59k
    }
443
19
    break;
444
8.26k
  case YXMLS_comment2:
445
8.26k
    if(ch == (unsigned char)'-') {
446
6.30k
      x->state = YXMLS_comment3;
447
6.30k
      return YXML_OK;
448
6.30k
    }
449
1.96k
    if(yxml_isChar(ch))
450
1.96k
      return YXML_OK;
451
0
    break;
452
6.28k
  case YXMLS_comment3:
453
6.28k
    if(ch == (unsigned char)'-') {
454
5.49k
      x->state = YXMLS_comment4;
455
5.49k
      return YXML_OK;
456
5.49k
    }
457
787
    if(yxml_isChar(ch)) {
458
787
      x->state = YXMLS_comment2;
459
787
      return YXML_OK;
460
787
    }
461
0
    break;
462
5.48k
  case YXMLS_comment4:
463
5.48k
    if(ch == (unsigned char)'>') {
464
5.47k
      x->state = x->nextstate;
465
5.47k
      return YXML_OK;
466
5.47k
    }
467
8
    break;
468
3.91k
  case YXMLS_dt0:
469
3.91k
    if(ch == (unsigned char)'>') {
470
653
      x->state = YXMLS_misc1;
471
653
      return YXML_OK;
472
653
    }
473
3.26k
    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.07k
    if(ch == (unsigned char)'<') {
480
1.63k
      x->state = YXMLS_dt2;
481
1.63k
      return YXML_OK;
482
1.63k
    }
483
436
    if(yxml_isChar(ch))
484
436
      return YXML_OK;
485
0
    break;
486
2.27k
  case YXMLS_dt1:
487
2.27k
    if(x->quote == ch) {
488
1.87k
      x->state = x->nextstate;
489
1.87k
      return YXML_OK;
490
1.87k
    }
491
393
    if(yxml_isChar(ch))
492
393
      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.21k
      x->state = YXMLS_dt3;
502
1.21k
      return YXML_OK;
503
1.21k
    }
504
27
    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
809
    if(yxml_isChar(ch)) {
512
809
      x->state = YXMLS_dt4;
513
809
      return YXML_OK;
514
809
    }
515
0
    break;
516
1.90k
  case YXMLS_dt4:
517
1.90k
    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
409
    if(yxml_isChar(ch))
528
409
      return YXML_OK;
529
0
    break;
530
354M
  case YXMLS_elem0:
531
354M
    if(yxml_isName(ch))
532
304M
      return yxml_elemname(x, ch);
533
50.8M
    if(yxml_isSP(ch)) {
534
4.22M
      x->state = YXMLS_elem1;
535
4.22M
      return yxml_elemnameend(x, ch);
536
4.22M
    }
537
46.6M
    if(ch == (unsigned char)'/') {
538
15.7M
      x->state = YXMLS_elem3;
539
15.7M
      return yxml_elemnameend(x, ch);
540
15.7M
    }
541
30.9M
    if(ch == (unsigned char)'>') {
542
30.9M
      x->state = YXMLS_misc2;
543
30.9M
      return yxml_elemnameend(x, ch);
544
30.9M
    }
545
47
    break;
546
8.61M
  case YXMLS_elem1:
547
8.61M
    if(yxml_isSP(ch))
548
1.55M
      return YXML_OK;
549
7.05M
    if(ch == (unsigned char)'/') {
550
1.01M
      x->state = YXMLS_elem3;
551
1.01M
      return YXML_OK;
552
1.01M
    }
553
6.04M
    if(ch == (unsigned char)'>') {
554
812
      x->state = YXMLS_misc2;
555
812
      return YXML_OK;
556
812
    }
557
6.04M
    if(yxml_isNameStart(ch)) {
558
6.04M
      x->state = YXMLS_attr0;
559
6.04M
      return yxml_attrstart(x, ch);
560
6.04M
    }
561
47
    break;
562
6.04M
  case YXMLS_elem2:
563
6.04M
    if(yxml_isSP(ch)) {
564
2.83M
      x->state = YXMLS_elem1;
565
2.83M
      return YXML_OK;
566
2.83M
    }
567
3.21M
    if(ch == (unsigned char)'/') {
568
1.61M
      x->state = YXMLS_elem3;
569
1.61M
      return YXML_OK;
570
1.61M
    }
571
1.59M
    if(ch == (unsigned char)'>') {
572
1.59M
      x->state = YXMLS_misc2;
573
1.59M
      return YXML_OK;
574
1.59M
    }
575
39
    break;
576
18.3M
  case YXMLS_elem3:
577
18.3M
    if(ch == (unsigned char)'>') {
578
18.3M
      x->state = YXMLS_misc2;
579
18.3M
      return yxml_selfclose(x, ch);
580
18.3M
    }
581
22
    break;
582
1.56k
  case YXMLS_enc0:
583
1.56k
    if(yxml_isSP(ch))
584
1.16k
      return YXML_OK;
585
401
    if(ch == (unsigned char)'=') {
586
364
      x->state = YXMLS_enc1;
587
364
      return YXML_OK;
588
364
    }
589
37
    break;
590
1.48k
  case YXMLS_enc1:
591
1.48k
    if(yxml_isSP(ch))
592
1.16k
      return YXML_OK;
593
314
    if(ch == (unsigned char)'\'' || ch == (unsigned char)'"') {
594
285
      x->state = YXMLS_enc2;
595
285
      x->quote = ch;
596
285
      return YXML_OK;
597
285
    }
598
29
    break;
599
281
  case YXMLS_enc2:
600
281
    if(yxml_isAlpha(ch)) {
601
274
      x->state = YXMLS_enc3;
602
274
      return YXML_OK;
603
274
    }
604
7
    break;
605
2.16k
  case YXMLS_enc3:
606
2.16k
    if(yxml_isEncName(ch))
607
1.97k
      return YXML_OK;
608
190
    if(x->quote == ch) {
609
161
      x->state = YXMLS_xmldecl6;
610
161
      return YXML_OK;
611
161
    }
612
29
    break;
613
32.5M
  case YXMLS_etag0:
614
32.5M
    if(yxml_isNameStart(ch)) {
615
32.5M
      x->state = YXMLS_etag1;
616
32.5M
      return yxml_elemclose(x, ch);
617
32.5M
    }
618
31
    break;
619
274M
  case YXMLS_etag1:
620
274M
    if(yxml_isName(ch))
621
241M
      return yxml_elemclose(x, ch);
622
32.5M
    if(yxml_isSP(ch)) {
623
1.67k
      x->state = YXMLS_etag2;
624
1.67k
      return yxml_elemcloseend(x, ch);
625
1.67k
    }
626
32.5M
    if(ch == (unsigned char)'>') {
627
32.5M
      x->state = YXMLS_misc2;
628
32.5M
      return yxml_elemcloseend(x, ch);
629
32.5M
    }
630
38
    break;
631
5.07k
  case YXMLS_etag2:
632
5.07k
    if(yxml_isSP(ch))
633
3.55k
      return YXML_OK;
634
1.52k
    if(ch == (unsigned char)'>') {
635
1.49k
      x->state = YXMLS_misc2;
636
1.49k
      return YXML_OK;
637
1.49k
    }
638
36
    break;
639
3.51M
  case YXMLS_init:
640
3.51M
    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.51M
    if(yxml_isSP(ch)) {
647
234
      x->state = YXMLS_misc0;
648
234
      return YXML_OK;
649
234
    }
650
3.51M
    if(ch == (unsigned char)'<') {
651
3.51M
      x->state = YXMLS_le0;
652
3.51M
      return YXML_OK;
653
3.51M
    }
654
53
    break;
655
3.51M
  case YXMLS_le0:
656
3.51M
    if(ch == (unsigned char)'!') {
657
552
      x->state = YXMLS_lee1;
658
552
      return YXML_OK;
659
552
    }
660
3.51M
    if(ch == (unsigned char)'?') {
661
2.48k
      x->state = YXMLS_leq0;
662
2.48k
      return YXML_OK;
663
2.48k
    }
664
3.50M
    if(yxml_isNameStart(ch)) {
665
3.50M
      x->state = YXMLS_elem0;
666
3.50M
      return yxml_elemstart(x, ch);
667
3.50M
    }
668
44
    break;
669
5.23k
  case YXMLS_le1:
670
5.23k
    if(ch == (unsigned char)'!') {
671
1.58k
      x->state = YXMLS_lee1;
672
1.58k
      return YXML_OK;
673
1.58k
    }
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
384
    if(yxml_isNameStart(ch)) {
680
357
      x->state = YXMLS_elem0;
681
357
      return yxml_elemstart(x, ch);
682
357
    }
683
27
    break;
684
79.9M
  case YXMLS_le2:
685
79.9M
    if(ch == (unsigned char)'!') {
686
4.39k
      x->state = YXMLS_lee2;
687
4.39k
      return YXML_OK;
688
4.39k
    }
689
79.9M
    if(ch == (unsigned char)'?') {
690
2.72k
      x->state = YXMLS_pi0;
691
2.72k
      x->nextstate = YXMLS_misc2;
692
2.72k
      return YXML_OK;
693
2.72k
    }
694
79.9M
    if(ch == (unsigned char)'/') {
695
32.5M
      x->state = YXMLS_etag0;
696
32.5M
      return YXML_OK;
697
32.5M
    }
698
47.3M
    if(yxml_isNameStart(ch)) {
699
47.3M
      x->state = YXMLS_elem0;
700
47.3M
      return yxml_elemstart(x, ch);
701
47.3M
    }
702
42
    break;
703
1.21k
  case YXMLS_le3:
704
1.21k
    if(ch == (unsigned char)'!') {
705
459
      x->state = YXMLS_comment0;
706
459
      x->nextstate = YXMLS_misc3;
707
459
      return YXML_OK;
708
459
    }
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
22
    break;
728
4.38k
  case YXMLS_lee2:
729
4.38k
    if(ch == (unsigned char)'-') {
730
3.73k
      x->state = YXMLS_comment1;
731
3.73k
      x->nextstate = YXMLS_misc2;
732
3.73k
      return YXML_OK;
733
3.73k
    }
734
646
    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
26
    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
630
    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
24
    break;
753
2.42k
  case YXMLS_misc0:
754
2.42k
    if(yxml_isSP(ch))
755
2.27k
      return YXML_OK;
756
150
    if(ch == (unsigned char)'<') {
757
111
      x->state = YXMLS_le0;
758
111
      return YXML_OK;
759
111
    }
760
39
    break;
761
6.46k
  case YXMLS_misc1:
762
6.46k
    if(yxml_isSP(ch))
763
1.18k
      return YXML_OK;
764
5.28k
    if(ch == (unsigned char)'<') {
765
5.24k
      x->state = YXMLS_le1;
766
5.24k
      return YXML_OK;
767
5.24k
    }
768
35
    break;
769
5.65G
  case YXMLS_misc2:
770
5.65G
    if(ch == (unsigned char)'<') {
771
79.9M
      x->state = YXMLS_le2;
772
79.9M
      return YXML_OK;
773
79.9M
    }
774
5.57G
    if(ch == (unsigned char)'&') {
775
3.21M
      x->state = YXMLS_misc2a;
776
3.21M
      return yxml_refstart(x, ch);
777
3.21M
    }
778
5.57G
    if(yxml_isChar(ch))
779
5.57G
      return yxml_datacontent(x, ch);
780
0
    break;
781
15.8M
  case YXMLS_misc2a:
782
15.8M
    if(yxml_isRef(ch))
783
12.6M
      return yxml_ref(x, ch);
784
3.21M
    if(ch == (unsigned char)'\x3b') {
785
3.21M
      x->state = YXMLS_misc2;
786
3.21M
      return yxml_refcontent(x, ch);
787
3.21M
    }
788
30
    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
44
    break;
797
7.04k
  case YXMLS_pi0:
798
7.04k
    if(yxml_isNameStart(ch)) {
799
7.01k
      x->state = YXMLS_pi1;
800
7.01k
      return yxml_pistart(x, ch);
801
7.01k
    }
802
32
    break;
803
17.2k
  case YXMLS_pi1:
804
17.2k
    if(yxml_isName(ch))
805
9.56k
      return yxml_piname(x, ch);
806
7.69k
    if(ch == (unsigned char)'?') {
807
5.03k
      x->state = YXMLS_pi4;
808
5.03k
      return yxml_pinameend(x, ch);
809
5.03k
    }
810
2.66k
    if(yxml_isSP(ch)) {
811
2.61k
      x->state = YXMLS_pi2;
812
2.61k
      return yxml_pinameend(x, ch);
813
2.61k
    }
814
47
    break;
815
3.86k
  case YXMLS_pi2:
816
3.86k
    if(ch == (unsigned char)'?') {
817
3.26k
      x->state = YXMLS_pi3;
818
3.26k
      return YXML_OK;
819
3.26k
    }
820
602
    if(yxml_isChar(ch))
821
602
      return yxml_datapi1(x, ch);
822
0
    break;
823
3.24k
  case YXMLS_pi3:
824
3.24k
    if(ch == (unsigned char)'>') {
825
2.47k
      x->state = x->nextstate;
826
2.47k
      return yxml_pivalend(x, ch);
827
2.47k
    }
828
775
    if(yxml_isChar(ch)) {
829
775
      x->state = YXMLS_pi2;
830
775
      return yxml_datapi2(x, ch);
831
775
    }
832
0
    break;
833
4.96k
  case YXMLS_pi4:
834
4.96k
    if(ch == (unsigned char)'>') {
835
4.95k
      x->state = x->nextstate;
836
4.95k
      return yxml_pivalend(x, ch);
837
4.95k
    }
838
11
    break;
839
1.41k
  case YXMLS_std0:
840
1.41k
    if(yxml_isSP(ch))
841
1.18k
      return YXML_OK;
842
233
    if(ch == (unsigned char)'=') {
843
200
      x->state = YXMLS_std1;
844
200
      return YXML_OK;
845
200
    }
846
33
    break;
847
1.31k
  case YXMLS_std1:
848
1.31k
    if(yxml_isSP(ch))
849
1.16k
      return YXML_OK;
850
150
    if(ch == (unsigned char)'\'' || ch == (unsigned char)'"') {
851
134
      x->state = YXMLS_std2;
852
134
      x->quote = ch;
853
134
      return YXML_OK;
854
134
    }
855
16
    break;
856
130
  case YXMLS_std2:
857
130
    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
124
    if(ch == (unsigned char)'n') {
864
105
      x->state = YXMLS_string;
865
105
      x->nextstate = YXMLS_std3;
866
105
      x->string = (unsigned char *)"o";
867
105
      return YXML_OK;
868
105
    }
869
19
    break;
870
106
  case YXMLS_std3:
871
106
    if(x->quote == ch) {
872
101
      x->state = YXMLS_xmldecl8;
873
101
      return YXML_OK;
874
101
    }
875
5
    break;
876
2.21k
  case YXMLS_ver0:
877
2.21k
    if(yxml_isSP(ch))
878
1.16k
      return YXML_OK;
879
1.05k
    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
973
    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
34
    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.28k
  case YXMLS_ver3:
902
1.28k
    if(yxml_isNum(ch))
903
388
      return YXML_OK;
904
901
    if(x->quote == ch) {
905
881
      x->state = YXMLS_xmldecl4;
906
881
      return YXML_OK;
907
881
    }
908
20
    break;
909
1.85k
  case YXMLS_xmldecl0:
910
1.85k
    if(ch == (unsigned char)'m') {
911
1.57k
      x->state = YXMLS_xmldecl1;
912
1.57k
      return yxml_piname(x, ch);
913
1.57k
    }
914
279
    if(yxml_isName(ch)) {
915
147
      x->state = YXMLS_pi1;
916
147
      return yxml_piname(x, ch);
917
147
    }
918
132
    if(ch == (unsigned char)'?') {
919
34
      x->state = YXMLS_pi4;
920
34
      return yxml_pinameend(x, ch);
921
34
    }
922
98
    if(yxml_isSP(ch)) {
923
48
      x->state = YXMLS_pi2;
924
48
      return yxml_pinameend(x, ch);
925
48
    }
926
50
    break;
927
1.57k
  case YXMLS_xmldecl1:
928
1.57k
    if(ch == (unsigned char)'l') {
929
1.39k
      x->state = YXMLS_xmldecl2;
930
1.39k
      return yxml_piname(x, ch);
931
1.39k
    }
932
177
    if(yxml_isName(ch)) {
933
104
      x->state = YXMLS_pi1;
934
104
      return yxml_piname(x, ch);
935
104
    }
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
21
      x->state = YXMLS_pi2;
942
21
      return yxml_pinameend(x, ch);
943
21
    }
944
46
    break;
945
1.39k
  case YXMLS_xmldecl2:
946
1.39k
    if(yxml_isSP(ch)) {
947
1.18k
      x->state = YXMLS_xmldecl3;
948
1.18k
      return yxml_piabort(x, ch);
949
1.18k
    }
950
206
    if(yxml_isName(ch)) {
951
178
      x->state = YXMLS_pi1;
952
178
      return yxml_piname(x, ch);
953
178
    }
954
28
    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.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
33
    break;
965
879
  case YXMLS_xmldecl4:
966
879
    if(yxml_isSP(ch)) {
967
834
      x->state = YXMLS_xmldecl5;
968
834
      return YXML_OK;
969
834
    }
970
45
    if(ch == (unsigned char)'?') {
971
24
      x->state = YXMLS_xmldecl9;
972
24
      return YXML_OK;
973
24
    }
974
21
    break;
975
1.94k
  case YXMLS_xmldecl5:
976
1.94k
    if(yxml_isSP(ch))
977
1.16k
      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
452
      x->state = YXMLS_string;
984
452
      x->nextstate = YXMLS_enc0;
985
452
      x->string = (unsigned char *)"ncoding";
986
452
      return YXML_OK;
987
452
    }
988
314
    if(ch == (unsigned char)'s') {
989
277
      x->state = YXMLS_string;
990
277
      x->nextstate = YXMLS_std0;
991
277
      x->string = (unsigned char *)"tandalone";
992
277
      return YXML_OK;
993
277
    }
994
37
    break;
995
159
  case YXMLS_xmldecl6:
996
159
    if(yxml_isSP(ch)) {
997
110
      x->state = YXMLS_xmldecl7;
998
110
      return YXML_OK;
999
110
    }
1000
49
    if(ch == (unsigned char)'?') {
1001
10
      x->state = YXMLS_xmldecl9;
1002
10
      return YXML_OK;
1003
10
    }
1004
39
    break;
1005
1.38k
  case YXMLS_xmldecl7:
1006
1.38k
    if(yxml_isSP(ch))
1007
1.33k
      return YXML_OK;
1008
56
    if(ch == (unsigned char)'?') {
1009
14
      x->state = YXMLS_xmldecl9;
1010
14
      return YXML_OK;
1011
14
    }
1012
42
    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
34
    break;
1019
1.24k
  case YXMLS_xmldecl8:
1020
1.24k
    if(yxml_isSP(ch))
1021
1.19k
      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
6.68G
  }
1034
1.59k
  return YXML_ESYN;
1035
6.68G
}
1036
1037
3.50M
yxml_ret_t yxml_eof(yxml_t *x) {
1038
3.50M
  if(x->state != YXMLS_misc3 &&
1039
4.50k
     !(x->contentmode && x->state == YXMLS_misc2 && x->stacklen == 0))
1040
4.16k
    return YXML_EEOF;
1041
3.50M
  return YXML_OK;
1042
3.50M
}