Coverage Report

Created: 2026-07-16 06:23

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
3.25G
#define yxml_isChar(c) 1
100
/* 0xd should be part of SP, too, but yxml_parse() already normalizes that into 0xa */
101
83.6M
#define yxml_isSP(c) (c == 0x20 || c == 0x09 || c == 0x0a)
102
903M
#define yxml_isAlpha(c) ((c|32)-'a' < 26)
103
454M
#define yxml_isNum(c) (c-'0' < 10)
104
4.53k
#define yxml_isHex(c) (yxml_isNum(c) || (c|32)-'a' < 6)
105
2.17k
#define yxml_isEncName(c) (yxml_isAlpha(c) || yxml_isNum(c) || c == '.' || c == '_' || c == '-')
106
846M
#define yxml_isNameStart(c) (yxml_isAlpha(c) || c == ':' || c == '_' || c >= 128)
107
394M
#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
92.7M
#define yxml_isAttValue(c) (yxml_isChar(c) && c != x->quote && c != '<' && c != '&')
110
/* Anything between '&' and ';', the yxml_ref* functions will do further
111
 * validation. Strictly speaking, this is "yxml_isName(c) || c == '#'", but
112
 * this parser doesn't understand entities with '.', ':', etc, anwyay.  */
113
29.0k
#define yxml_isRef(c) (yxml_isNum(c) || yxml_isAlpha(c) || c == '#')
114
115
10.6k
#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
3.15G
static inline void yxml_setchar(char *dest, unsigned ch) {
119
3.15G
  *(unsigned char *)dest = (unsigned char)ch;
120
3.15G
}
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
5.85k
static void yxml_setutf8(char *dest, unsigned ch) {
125
5.85k
  if(ch <= 0x007F)
126
3.95k
    yxml_setchar(dest++, ch);
127
1.90k
  else if(ch <= 0x07FF) {
128
477
    yxml_setchar(dest++, 0xC0 | (ch>>6));
129
477
    yxml_setchar(dest++, 0x80 | (ch & 0x3F));
130
1.43k
  } else if(ch <= 0xFFFF) {
131
594
    yxml_setchar(dest++, 0xE0 | (ch>>12));
132
594
    yxml_setchar(dest++, 0x80 | ((ch>>6) & 0x3F));
133
594
    yxml_setchar(dest++, 0x80 | (ch & 0x3F));
134
837
  } else {
135
837
    yxml_setchar(dest++, 0xF0 | (ch>>18));
136
837
    yxml_setchar(dest++, 0x80 | ((ch>>12) & 0x3F));
137
837
    yxml_setchar(dest++, 0x80 | ((ch>>6) & 0x3F));
138
837
    yxml_setchar(dest++, 0x80 | (ch & 0x3F));
139
837
  }
140
5.85k
  *dest = 0;
141
5.85k
}
142
143
3.06G
static inline yxml_ret_t yxml_datacontent(yxml_t *x, unsigned ch) {
144
3.06G
  yxml_setchar(x->data, ch);
145
3.06G
  x->data[1] = 0;
146
3.06G
  return YXML_CONTENT;
147
3.06G
}
148
149
31.2k
static inline yxml_ret_t yxml_datapi1(yxml_t *x, unsigned ch) {
150
31.2k
  yxml_setchar(x->data, ch);
151
31.2k
  x->data[1] = 0;
152
31.2k
  return YXML_PICONTENT;
153
31.2k
}
154
155
1.13k
static inline yxml_ret_t yxml_datapi2(yxml_t *x, unsigned ch) {
156
1.13k
  x->data[0] = '?';
157
1.13k
  yxml_setchar(x->data+1, ch);
158
1.13k
  x->data[2] = 0;
159
1.13k
  return YXML_PICONTENT;
160
1.13k
}
161
162
486
static inline yxml_ret_t yxml_datacd1(yxml_t *x, unsigned ch) {
163
486
  x->data[0] = ']';
164
486
  yxml_setchar(x->data+1, ch);
165
486
  x->data[2] = 0;
166
486
  return YXML_CONTENT;
167
486
}
168
169
634
static inline yxml_ret_t yxml_datacd2(yxml_t *x, unsigned ch) {
170
634
  x->data[0] = ']';
171
634
  x->data[1] = ']';
172
634
  yxml_setchar(x->data+2, ch);
173
634
  x->data[3] = 0;
174
634
  return YXML_CONTENT;
175
634
}
176
177
86.3M
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
86.3M
  yxml_setchar(x->data, ch == 0x9 || ch == 0xa ? 0x20 : ch);
180
86.3M
  x->data[1] = 0;
181
86.3M
  return YXML_ATTRVAL;
182
86.3M
}
183
184
40.3M
static yxml_ret_t yxml_pushstack(yxml_t *x, char **res, unsigned ch) {
185
40.3M
  if(x->stacklen+2 >= x->stacksize)
186
8
    return YXML_ESTACK;
187
40.3M
  x->stacklen++;
188
40.3M
  *res = (char *)x->stack+x->stacklen;
189
40.3M
  x->stack[x->stacklen] = (unsigned char)ch;
190
40.3M
  x->stacklen++;
191
40.3M
  x->stack[x->stacklen] = 0;
192
40.3M
  return YXML_OK;
193
40.3M
}
194
195
208M
static yxml_ret_t yxml_pushstackc(yxml_t *x, unsigned ch) {
196
208M
  if(x->stacklen+1 >= x->stacksize)
197
7
    return YXML_ESTACK;
198
208M
  x->stack[x->stacklen] = (unsigned char)ch;
199
208M
  x->stacklen++;
200
208M
  x->stack[x->stacklen] = 0;
201
208M
  return YXML_OK;
202
208M
}
203
204
40.3M
static void yxml_popstack(yxml_t *x) {
205
40.3M
  do
206
289M
    x->stacklen--;
207
289M
  while(x->stack[x->stacklen]);
208
40.3M
}
209
210
33.9M
static inline yxml_ret_t yxml_elemstart  (yxml_t *x, unsigned ch) { return yxml_pushstack(x, &x->elem, ch); }
211
162M
static inline yxml_ret_t yxml_elemname   (yxml_t *x, unsigned ch) { return yxml_pushstackc(x, ch); }
212
33.9M
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
33.9M
static yxml_ret_t yxml_selfclose(yxml_t *x, unsigned ch) {
217
33.9M
  yxml_popstack(x);
218
33.9M
  if(x->stacklen) {
219
32.1M
    x->elem = (char *)x->stack+x->stacklen-1;
220
212M
    while(*(x->elem-1))
221
180M
      x->elem--;
222
32.1M
    return YXML_ELEMEND;
223
32.1M
  }
224
1.86M
  x->elem = (char *)x->stack;
225
1.86M
  x->state = YXMLS_misc3;
226
1.86M
  return YXML_ELEMEND;
227
33.9M
}
228
229
145M
static inline yxml_ret_t yxml_elemclose(yxml_t *x, unsigned ch) {
230
145M
  if(*((unsigned char *)x->elem) != ch)
231
208
    return YXML_ECLOSE;
232
145M
  x->elem++;
233
145M
  return YXML_OK;
234
145M
}
235
236
17.3M
static inline yxml_ret_t yxml_elemcloseend(yxml_t *x, unsigned ch) {
237
17.3M
  if(*x->elem)
238
2
    return YXML_ECLOSE;
239
17.3M
  return yxml_selfclose(x, ch);
240
17.3M
}
241
242
6.38M
static inline yxml_ret_t yxml_attrstart  (yxml_t *x, unsigned ch) { return yxml_pushstack(x, &x->attr, ch); }
243
45.6M
static inline yxml_ret_t yxml_attrname   (yxml_t *x, unsigned ch) { return yxml_pushstackc(x, ch); }
244
6.38M
static inline yxml_ret_t yxml_attrnameend(yxml_t *x, unsigned ch) { return YXML_ATTRSTART; }
245
6.38M
static inline yxml_ret_t yxml_attrvalend (yxml_t *x, unsigned ch) { yxml_popstack(x); return YXML_ATTREND; }
246
247
9.68k
static inline yxml_ret_t yxml_pistart  (yxml_t *x, unsigned ch) { return yxml_pushstack(x, &x->pi, ch); }
248
13.3k
static inline yxml_ret_t yxml_piname   (yxml_t *x, unsigned ch) { return yxml_pushstackc(x, ch); }
249
1.07k
static inline yxml_ret_t yxml_piabort  (yxml_t *x, unsigned ch) { yxml_popstack(x); return YXML_OK; }
250
8.01k
static inline yxml_ret_t yxml_pinameend(yxml_t *x, unsigned ch) {
251
8.01k
  return (x->pi[0]|32) == 'x' && (x->pi[1]|32) == 'm' && (x->pi[2]|32) == 'l' && !x->pi[3] ? YXML_ESYN : YXML_PISTART;
252
8.01k
}
253
7.70k
static inline yxml_ret_t yxml_pivalend (yxml_t *x, unsigned ch) { yxml_popstack(x); x->pi = (char *)x->stack; return YXML_PIEND; }
254
255
6.49k
static inline yxml_ret_t yxml_refstart(yxml_t *x, unsigned ch) {
256
6.49k
  memset(x->data, 0, sizeof(x->data));
257
6.49k
  x->reflen = 0;
258
6.49k
  return YXML_OK;
259
6.49k
}
260
261
22.6k
static yxml_ret_t yxml_ref(yxml_t *x, unsigned ch) {
262
22.6k
  if(x->reflen >= sizeof(x->data)-1)
263
35
    return YXML_EREF;
264
22.6k
  yxml_setchar(x->data+x->reflen, ch);
265
22.6k
  x->reflen++;
266
22.6k
  return YXML_OK;
267
22.6k
}
268
269
6.26k
static yxml_ret_t yxml_refend(yxml_t *x, yxml_ret_t ret) {
270
6.26k
  unsigned char *r = (unsigned char *)x->data;
271
6.26k
  unsigned ch = 0;
272
6.26k
  if(*r == '#') {
273
3.75k
    if(r[1] == 'x')
274
4.53k
      for(r += 2; yxml_isHex((unsigned)*r); r++)
275
3.22k
        ch = (ch<<4) + (*r <= '9' ? *r-'0' : (*r|32)-'a' + 10);
276
2.44k
    else
277
8.86k
      for(r++; yxml_isNum((unsigned)*r); r++)
278
6.41k
        ch = (ch*10) + (*r-'0');
279
3.75k
    if(*r)
280
22
      ch = 0;
281
3.75k
  } else {
282
2.50k
    uint64_t i = INTFROM5CHARS(r[0], r[1], r[2], r[3], r[4]);
283
2.50k
    ch =
284
2.50k
      i == INTFROM5CHARS('l','t', 0,  0, 0) ? '<' :
285
2.50k
      i == INTFROM5CHARS('g','t', 0,  0, 0) ? '>' :
286
2.07k
      i == INTFROM5CHARS('a','m','p', 0, 0) ? '&' :
287
1.60k
      i == INTFROM5CHARS('a','p','o','s',0) ? '\'':
288
1.18k
      i == INTFROM5CHARS('q','u','o','t',0) ? '"' : 0;
289
2.50k
  }
290
291
  /* Codepoints not allowed in the XML 1.1 definition of a Char */
292
6.26k
  if(!ch || ch > 0x10FFFF || ch == 0xFFFE || ch == 0xFFFF || (ch-0xDFFF) < 0x7FF)
293
408
    return YXML_EREF;
294
5.85k
  yxml_setutf8(x->data, ch);
295
5.85k
  return ret;
296
6.26k
}
297
298
4.99k
static inline yxml_ret_t yxml_refcontent(yxml_t *x, unsigned ch) { return yxml_refend(x, YXML_CONTENT); }
299
1.27k
static inline yxml_ret_t yxml_refattrval(yxml_t *x, unsigned ch) { return yxml_refend(x, YXML_ATTRVAL); }
300
301
1.87M
void yxml_init(yxml_t *x, void *stack, size_t stacksize) {
302
1.87M
  memset(x, 0, sizeof(*x));
303
1.87M
  x->line = 1;
304
1.87M
  x->stack = (unsigned char*)stack;
305
1.87M
  x->stacksize = stacksize;
306
1.87M
  *x->stack = 0;
307
1.87M
  x->elem = x->pi = x->attr = (char *)x->stack;
308
1.87M
  x->state = YXMLS_init;
309
1.87M
}
310
311
3.71G
yxml_ret_t yxml_parse(yxml_t *x, int _ch) {
312
  /* Ensure that characters are in the range of 0..255 rather than -126..125.
313
   * All character comparisons are done with positive integers. */
314
3.71G
  unsigned ch = (unsigned)(_ch+256) & 0xff;
315
3.71G
  if(!ch)
316
10
    return YXML_ESYN;
317
3.71G
  x->total++;
318
319
  /* End-of-Line normalization, "\rX", "\r\n" and "\n" are recognized and
320
   * normalized to a single '\n' as per XML 1.0 section 2.11. XML 1.1 adds
321
   * some non-ASCII character sequences to this list, but we can only handle
322
   * ASCII here without making assumptions about the input encoding. */
323
3.71G
  if(x->ignore == ch) {
324
2.81k
    x->ignore = 0;
325
2.81k
    return YXML_OK;
326
2.81k
  }
327
3.71G
  x->ignore = (ch == 0xd) * 0xa;
328
3.71G
  if(ch == 0xa || ch == 0xd) {
329
4.21M
    ch = 0xa;
330
4.21M
    x->line++;
331
4.21M
    x->byte = 0;
332
4.21M
  }
333
3.71G
  x->byte++;
334
335
3.71G
  switch((yxml_state_t)x->state) {
336
21.6k
  case YXMLS_string:
337
21.6k
    if(ch == *x->string) {
338
21.6k
      x->string++;
339
21.6k
      if(!*x->string)
340
4.04k
        x->state = x->nextstate;
341
21.6k
      return YXML_OK;
342
21.6k
    }
343
25
    break;
344
52.0M
  case YXMLS_attr0:
345
52.0M
    if(yxml_isName(ch))
346
45.6M
      return yxml_attrname(x, ch);
347
6.38M
    if(yxml_isSP(ch)) {
348
2.48M
      x->state = YXMLS_attr1;
349
2.48M
      return yxml_attrnameend(x, ch);
350
2.48M
    }
351
3.89M
    if(ch == (unsigned char)'=') {
352
3.89M
      x->state = YXMLS_attr2;
353
3.89M
      return yxml_attrnameend(x, ch);
354
3.89M
    }
355
48
    break;
356
2.49M
  case YXMLS_attr1:
357
2.49M
    if(yxml_isSP(ch))
358
3.35k
      return YXML_OK;
359
2.48M
    if(ch == (unsigned char)'=') {
360
2.48M
      x->state = YXMLS_attr2;
361
2.48M
      return YXML_OK;
362
2.48M
    }
363
41
    break;
364
6.38M
  case YXMLS_attr2:
365
6.38M
    if(yxml_isSP(ch))
366
1.27k
      return YXML_OK;
367
6.38M
    if(ch == (unsigned char)'\'' || ch == (unsigned char)'"') {
368
6.38M
      x->state = YXMLS_attr3;
369
6.38M
      x->quote = ch;
370
6.38M
      return YXML_OK;
371
6.38M
    }
372
35
    break;
373
92.7M
  case YXMLS_attr3:
374
92.7M
    if(yxml_isAttValue(ch))
375
86.3M
      return yxml_dataattr(x, ch);
376
6.38M
    if(ch == (unsigned char)'&') {
377
1.37k
      x->state = YXMLS_attr4;
378
1.37k
      return yxml_refstart(x, ch);
379
1.37k
    }
380
6.38M
    if(x->quote == ch) {
381
6.38M
      x->state = YXMLS_elem2;
382
6.38M
      return yxml_attrvalend(x, ch);
383
6.38M
    }
384
2
    break;
385
5.44k
  case YXMLS_attr4:
386
5.44k
    if(yxml_isRef(ch))
387
4.13k
      return yxml_ref(x, ch);
388
1.30k
    if(ch == (unsigned char)'\x3b') {
389
1.27k
      x->state = YXMLS_attr3;
390
1.27k
      return yxml_refattrval(x, ch);
391
1.27k
    }
392
34
    break;
393
8.68k
  case YXMLS_cd0:
394
8.68k
    if(ch == (unsigned char)']') {
395
1.70k
      x->state = YXMLS_cd1;
396
1.70k
      return YXML_OK;
397
1.70k
    }
398
6.97k
    if(yxml_isChar(ch))
399
6.97k
      return yxml_datacontent(x, ch);
400
0
    break;
401
1.69k
  case YXMLS_cd1:
402
1.69k
    if(ch == (unsigned char)']') {
403
1.21k
      x->state = YXMLS_cd2;
404
1.21k
      return YXML_OK;
405
1.21k
    }
406
486
    if(yxml_isChar(ch)) {
407
486
      x->state = YXMLS_cd0;
408
486
      return yxml_datacd1(x, ch);
409
486
    }
410
0
    break;
411
1.84k
  case YXMLS_cd2:
412
1.84k
    if(ch == (unsigned char)']')
413
659
      return yxml_datacontent(x, ch);
414
1.18k
    if(ch == (unsigned char)'>') {
415
547
      x->state = YXMLS_misc2;
416
547
      return YXML_OK;
417
547
    }
418
634
    if(yxml_isChar(ch)) {
419
634
      x->state = YXMLS_cd0;
420
634
      return yxml_datacd2(x, ch);
421
634
    }
422
0
    break;
423
435
  case YXMLS_comment0:
424
435
    if(ch == (unsigned char)'-') {
425
414
      x->state = YXMLS_comment1;
426
414
      return YXML_OK;
427
414
    }
428
21
    break;
429
2.37k
  case YXMLS_comment1:
430
2.37k
    if(ch == (unsigned char)'-') {
431
2.35k
      x->state = YXMLS_comment2;
432
2.35k
      return YXML_OK;
433
2.35k
    }
434
24
    break;
435
3.47k
  case YXMLS_comment2:
436
3.47k
    if(ch == (unsigned char)'-') {
437
2.92k
      x->state = YXMLS_comment3;
438
2.92k
      return YXML_OK;
439
2.92k
    }
440
551
    if(yxml_isChar(ch))
441
551
      return YXML_OK;
442
0
    break;
443
2.90k
  case YXMLS_comment3:
444
2.90k
    if(ch == (unsigned char)'-') {
445
2.25k
      x->state = YXMLS_comment4;
446
2.25k
      return YXML_OK;
447
2.25k
    }
448
654
    if(yxml_isChar(ch)) {
449
654
      x->state = YXMLS_comment2;
450
654
      return YXML_OK;
451
654
    }
452
0
    break;
453
2.24k
  case YXMLS_comment4:
454
2.24k
    if(ch == (unsigned char)'>') {
455
2.21k
      x->state = x->nextstate;
456
2.21k
      return YXML_OK;
457
2.21k
    }
458
22
    break;
459
3.83k
  case YXMLS_dt0:
460
3.83k
    if(ch == (unsigned char)'>') {
461
603
      x->state = YXMLS_misc1;
462
603
      return YXML_OK;
463
603
    }
464
3.22k
    if(ch == (unsigned char)'\'' || ch == (unsigned char)'"') {
465
1.19k
      x->state = YXMLS_dt1;
466
1.19k
      x->quote = ch;
467
1.19k
      x->nextstate = YXMLS_dt0;
468
1.19k
      return YXML_OK;
469
1.19k
    }
470
2.02k
    if(ch == (unsigned char)'<') {
471
1.51k
      x->state = YXMLS_dt2;
472
1.51k
      return YXML_OK;
473
1.51k
    }
474
510
    if(yxml_isChar(ch))
475
510
      return YXML_OK;
476
0
    break;
477
2.28k
  case YXMLS_dt1:
478
2.28k
    if(x->quote == ch) {
479
1.87k
      x->state = x->nextstate;
480
1.87k
      return YXML_OK;
481
1.87k
    }
482
407
    if(yxml_isChar(ch))
483
407
      return YXML_OK;
484
0
    break;
485
1.50k
  case YXMLS_dt2:
486
1.50k
    if(ch == (unsigned char)'?') {
487
388
      x->state = YXMLS_pi0;
488
388
      x->nextstate = YXMLS_dt0;
489
388
      return YXML_OK;
490
388
    }
491
1.11k
    if(ch == (unsigned char)'!') {
492
1.11k
      x->state = YXMLS_dt3;
493
1.11k
      return YXML_OK;
494
1.11k
    }
495
2
    break;
496
1.10k
  case YXMLS_dt3:
497
1.10k
    if(ch == (unsigned char)'-') {
498
388
      x->state = YXMLS_comment1;
499
388
      x->nextstate = YXMLS_dt0;
500
388
      return YXML_OK;
501
388
    }
502
718
    if(yxml_isChar(ch)) {
503
718
      x->state = YXMLS_dt4;
504
718
      return YXML_OK;
505
718
    }
506
0
    break;
507
1.80k
  case YXMLS_dt4:
508
1.80k
    if(ch == (unsigned char)'\'' || ch == (unsigned char)'"') {
509
776
      x->state = YXMLS_dt1;
510
776
      x->quote = ch;
511
776
      x->nextstate = YXMLS_dt4;
512
776
      return YXML_OK;
513
776
    }
514
1.02k
    if(ch == (unsigned char)'>') {
515
621
      x->state = YXMLS_dt0;
516
621
      return YXML_OK;
517
621
    }
518
407
    if(yxml_isChar(ch))
519
407
      return YXML_OK;
520
0
    break;
521
196M
  case YXMLS_elem0:
522
196M
    if(yxml_isName(ch))
523
162M
      return yxml_elemname(x, ch);
524
33.9M
    if(yxml_isSP(ch)) {
525
3.27M
      x->state = YXMLS_elem1;
526
3.27M
      return yxml_elemnameend(x, ch);
527
3.27M
    }
528
30.6M
    if(ch == (unsigned char)'/') {
529
14.2M
      x->state = YXMLS_elem3;
530
14.2M
      return yxml_elemnameend(x, ch);
531
14.2M
    }
532
16.4M
    if(ch == (unsigned char)'>') {
533
16.4M
      x->state = YXMLS_misc2;
534
16.4M
      return yxml_elemnameend(x, ch);
535
16.4M
    }
536
56
    break;
537
8.81M
  case YXMLS_elem1:
538
8.81M
    if(yxml_isSP(ch))
539
1.06M
      return YXML_OK;
540
7.75M
    if(ch == (unsigned char)'/') {
541
1.36M
      x->state = YXMLS_elem3;
542
1.36M
      return YXML_OK;
543
1.36M
    }
544
6.38M
    if(ch == (unsigned char)'>') {
545
1.14k
      x->state = YXMLS_misc2;
546
1.14k
      return YXML_OK;
547
1.14k
    }
548
6.38M
    if(yxml_isNameStart(ch)) {
549
6.38M
      x->state = YXMLS_attr0;
550
6.38M
      return yxml_attrstart(x, ch);
551
6.38M
    }
552
47
    break;
553
6.38M
  case YXMLS_elem2:
554
6.38M
    if(yxml_isSP(ch)) {
555
4.47M
      x->state = YXMLS_elem1;
556
4.47M
      return YXML_OK;
557
4.47M
    }
558
1.91M
    if(ch == (unsigned char)'/') {
559
1.03M
      x->state = YXMLS_elem3;
560
1.03M
      return YXML_OK;
561
1.03M
    }
562
879k
    if(ch == (unsigned char)'>') {
563
879k
      x->state = YXMLS_misc2;
564
879k
      return YXML_OK;
565
879k
    }
566
45
    break;
567
16.6M
  case YXMLS_elem3:
568
16.6M
    if(ch == (unsigned char)'>') {
569
16.6M
      x->state = YXMLS_misc2;
570
16.6M
      return yxml_selfclose(x, ch);
571
16.6M
    }
572
23
    break;
573
1.58k
  case YXMLS_enc0:
574
1.58k
    if(yxml_isSP(ch))
575
1.17k
      return YXML_OK;
576
411
    if(ch == (unsigned char)'=') {
577
396
      x->state = YXMLS_enc1;
578
396
      return YXML_OK;
579
396
    }
580
15
    break;
581
1.51k
  case YXMLS_enc1:
582
1.51k
    if(yxml_isSP(ch))
583
1.16k
      return YXML_OK;
584
346
    if(ch == (unsigned char)'\'' || ch == (unsigned char)'"') {
585
313
      x->state = YXMLS_enc2;
586
313
      x->quote = ch;
587
313
      return YXML_OK;
588
313
    }
589
33
    break;
590
309
  case YXMLS_enc2:
591
309
    if(yxml_isAlpha(ch)) {
592
289
      x->state = YXMLS_enc3;
593
289
      return YXML_OK;
594
289
    }
595
20
    break;
596
2.17k
  case YXMLS_enc3:
597
2.17k
    if(yxml_isEncName(ch))
598
1.97k
      return YXML_OK;
599
194
    if(x->quote == ch) {
600
154
      x->state = YXMLS_xmldecl6;
601
154
      return YXML_OK;
602
154
    }
603
40
    break;
604
17.3M
  case YXMLS_etag0:
605
17.3M
    if(yxml_isNameStart(ch)) {
606
17.3M
      x->state = YXMLS_etag1;
607
17.3M
      return yxml_elemclose(x, ch);
608
17.3M
    }
609
33
    break;
610
145M
  case YXMLS_etag1:
611
145M
    if(yxml_isName(ch))
612
128M
      return yxml_elemclose(x, ch);
613
17.3M
    if(yxml_isSP(ch)) {
614
1.97k
      x->state = YXMLS_etag2;
615
1.97k
      return yxml_elemcloseend(x, ch);
616
1.97k
    }
617
17.3M
    if(ch == (unsigned char)'>') {
618
17.3M
      x->state = YXMLS_misc2;
619
17.3M
      return yxml_elemcloseend(x, ch);
620
17.3M
    }
621
43
    break;
622
4.32k
  case YXMLS_etag2:
623
4.32k
    if(yxml_isSP(ch))
624
2.43k
      return YXML_OK;
625
1.88k
    if(ch == (unsigned char)'>') {
626
1.84k
      x->state = YXMLS_misc2;
627
1.84k
      return YXML_OK;
628
1.84k
    }
629
46
    break;
630
1.87M
  case YXMLS_init:
631
1.87M
    if(ch == (unsigned char)'\xef') {
632
38
      x->state = YXMLS_string;
633
38
      x->nextstate = YXMLS_misc0;
634
38
      x->string = (unsigned char *)"\xbb\xbf";
635
38
      return YXML_OK;
636
38
    }
637
1.87M
    if(yxml_isSP(ch)) {
638
212
      x->state = YXMLS_misc0;
639
212
      return YXML_OK;
640
212
    }
641
1.87M
    if(ch == (unsigned char)'<') {
642
1.87M
      x->state = YXMLS_le0;
643
1.87M
      return YXML_OK;
644
1.87M
    }
645
62
    break;
646
1.87M
  case YXMLS_le0:
647
1.87M
    if(ch == (unsigned char)'!') {
648
591
      x->state = YXMLS_lee1;
649
591
      return YXML_OK;
650
591
    }
651
1.87M
    if(ch == (unsigned char)'?') {
652
2.48k
      x->state = YXMLS_leq0;
653
2.48k
      return YXML_OK;
654
2.48k
    }
655
1.86M
    if(yxml_isNameStart(ch)) {
656
1.86M
      x->state = YXMLS_elem0;
657
1.86M
      return yxml_elemstart(x, ch);
658
1.86M
    }
659
49
    break;
660
5.28k
  case YXMLS_le1:
661
5.28k
    if(ch == (unsigned char)'!') {
662
1.50k
      x->state = YXMLS_lee1;
663
1.50k
      return YXML_OK;
664
1.50k
    }
665
3.78k
    if(ch == (unsigned char)'?') {
666
3.33k
      x->state = YXMLS_pi0;
667
3.33k
      x->nextstate = YXMLS_misc1;
668
3.33k
      return YXML_OK;
669
3.33k
    }
670
454
    if(yxml_isNameStart(ch)) {
671
422
      x->state = YXMLS_elem0;
672
422
      return yxml_elemstart(x, ch);
673
422
    }
674
32
    break;
675
49.4M
  case YXMLS_le2:
676
49.4M
    if(ch == (unsigned char)'!') {
677
1.26k
      x->state = YXMLS_lee2;
678
1.26k
      return YXML_OK;
679
1.26k
    }
680
49.4M
    if(ch == (unsigned char)'?') {
681
2.87k
      x->state = YXMLS_pi0;
682
2.87k
      x->nextstate = YXMLS_misc2;
683
2.87k
      return YXML_OK;
684
2.87k
    }
685
49.4M
    if(ch == (unsigned char)'/') {
686
17.3M
      x->state = YXMLS_etag0;
687
17.3M
      return YXML_OK;
688
17.3M
    }
689
32.1M
    if(yxml_isNameStart(ch)) {
690
32.1M
      x->state = YXMLS_elem0;
691
32.1M
      return yxml_elemstart(x, ch);
692
32.1M
    }
693
49
    break;
694
1.21k
  case YXMLS_le3:
695
1.21k
    if(ch == (unsigned char)'!') {
696
445
      x->state = YXMLS_comment0;
697
445
      x->nextstate = YXMLS_misc3;
698
445
      return YXML_OK;
699
445
    }
700
766
    if(ch == (unsigned char)'?') {
701
731
      x->state = YXMLS_pi0;
702
731
      x->nextstate = YXMLS_misc3;
703
731
      return YXML_OK;
704
731
    }
705
35
    break;
706
2.07k
  case YXMLS_lee1:
707
2.07k
    if(ch == (unsigned char)'-') {
708
1.09k
      x->state = YXMLS_comment1;
709
1.09k
      x->nextstate = YXMLS_misc1;
710
1.09k
      return YXML_OK;
711
1.09k
    }
712
982
    if(ch == (unsigned char)'D') {
713
949
      x->state = YXMLS_string;
714
949
      x->nextstate = YXMLS_dt0;
715
949
      x->string = (unsigned char *)"OCTYPE";
716
949
      return YXML_OK;
717
949
    }
718
33
    break;
719
1.25k
  case YXMLS_lee2:
720
1.25k
    if(ch == (unsigned char)'-') {
721
534
      x->state = YXMLS_comment1;
722
534
      x->nextstate = YXMLS_misc2;
723
534
      return YXML_OK;
724
534
    }
725
718
    if(ch == (unsigned char)'[') {
726
685
      x->state = YXMLS_string;
727
685
      x->nextstate = YXMLS_cd0;
728
685
      x->string = (unsigned char *)"CDATA[";
729
685
      return YXML_OK;
730
685
    }
731
33
    break;
732
2.48k
  case YXMLS_leq0:
733
2.48k
    if(ch == (unsigned char)'x') {
734
1.81k
      x->state = YXMLS_xmldecl0;
735
1.81k
      x->nextstate = YXMLS_misc1;
736
1.81k
      return yxml_pistart(x, ch);
737
1.81k
    }
738
669
    if(yxml_isNameStart(ch)) {
739
629
      x->state = YXMLS_pi1;
740
629
      x->nextstate = YXMLS_misc1;
741
629
      return yxml_pistart(x, ch);
742
629
    }
743
40
    break;
744
2.39k
  case YXMLS_misc0:
745
2.39k
    if(yxml_isSP(ch))
746
2.27k
      return YXML_OK;
747
125
    if(ch == (unsigned char)'<') {
748
72
      x->state = YXMLS_le0;
749
72
      return YXML_OK;
750
72
    }
751
53
    break;
752
6.62k
  case YXMLS_misc1:
753
6.62k
    if(yxml_isSP(ch))
754
1.29k
      return YXML_OK;
755
5.32k
    if(ch == (unsigned char)'<') {
756
5.30k
      x->state = YXMLS_le1;
757
5.30k
      return YXML_OK;
758
5.30k
    }
759
27
    break;
760
3.11G
  case YXMLS_misc2:
761
3.11G
    if(ch == (unsigned char)'<') {
762
49.4M
      x->state = YXMLS_le2;
763
49.4M
      return YXML_OK;
764
49.4M
    }
765
3.06G
    if(ch == (unsigned char)'&') {
766
5.11k
      x->state = YXMLS_misc2a;
767
5.11k
      return yxml_refstart(x, ch);
768
5.11k
    }
769
3.06G
    if(yxml_isChar(ch))
770
3.06G
      return yxml_datacontent(x, ch);
771
0
    break;
772
23.5k
  case YXMLS_misc2a:
773
23.5k
    if(yxml_isRef(ch))
774
18.5k
      return yxml_ref(x, ch);
775
5.03k
    if(ch == (unsigned char)'\x3b') {
776
4.99k
      x->state = YXMLS_misc2;
777
4.99k
      return yxml_refcontent(x, ch);
778
4.99k
    }
779
37
    break;
780
2.48k
  case YXMLS_misc3:
781
2.48k
    if(yxml_isSP(ch))
782
1.21k
      return YXML_OK;
783
1.27k
    if(ch == (unsigned char)'<') {
784
1.22k
      x->state = YXMLS_le3;
785
1.22k
      return YXML_OK;
786
1.22k
    }
787
48
    break;
788
7.26k
  case YXMLS_pi0:
789
7.26k
    if(yxml_isNameStart(ch)) {
790
7.23k
      x->state = YXMLS_pi1;
791
7.23k
      return yxml_pistart(x, ch);
792
7.23k
    }
793
30
    break;
794
18.0k
  case YXMLS_pi1:
795
18.0k
    if(yxml_isName(ch))
796
10.0k
      return yxml_piname(x, ch);
797
7.96k
    if(ch == (unsigned char)'?') {
798
4.67k
      x->state = YXMLS_pi4;
799
4.67k
      return yxml_pinameend(x, ch);
800
4.67k
    }
801
3.29k
    if(yxml_isSP(ch)) {
802
3.24k
      x->state = YXMLS_pi2;
803
3.24k
      return yxml_pinameend(x, ch);
804
3.24k
    }
805
52
    break;
806
35.4k
  case YXMLS_pi2:
807
35.4k
    if(ch == (unsigned char)'?') {
808
4.26k
      x->state = YXMLS_pi3;
809
4.26k
      return YXML_OK;
810
4.26k
    }
811
31.2k
    if(yxml_isChar(ch))
812
31.2k
      return yxml_datapi1(x, ch);
813
0
    break;
814
4.25k
  case YXMLS_pi3:
815
4.25k
    if(ch == (unsigned char)'>') {
816
3.12k
      x->state = x->nextstate;
817
3.12k
      return yxml_pivalend(x, ch);
818
3.12k
    }
819
1.13k
    if(yxml_isChar(ch)) {
820
1.13k
      x->state = YXMLS_pi2;
821
1.13k
      return yxml_datapi2(x, ch);
822
1.13k
    }
823
0
    break;
824
4.60k
  case YXMLS_pi4:
825
4.60k
    if(ch == (unsigned char)'>') {
826
4.58k
      x->state = x->nextstate;
827
4.58k
      return yxml_pivalend(x, ch);
828
4.58k
    }
829
25
    break;
830
693
  case YXMLS_std0:
831
693
    if(yxml_isSP(ch))
832
583
      return YXML_OK;
833
110
    if(ch == (unsigned char)'=') {
834
99
      x->state = YXMLS_std1;
835
99
      return YXML_OK;
836
99
    }
837
11
    break;
838
656
  case YXMLS_std1:
839
656
    if(yxml_isSP(ch))
840
582
      return YXML_OK;
841
74
    if(ch == (unsigned char)'\'' || ch == (unsigned char)'"') {
842
65
      x->state = YXMLS_std2;
843
65
      x->quote = ch;
844
65
      return YXML_OK;
845
65
    }
846
9
    break;
847
63
  case YXMLS_std2:
848
63
    if(ch == (unsigned char)'y') {
849
3
      x->state = YXMLS_string;
850
3
      x->nextstate = YXMLS_std3;
851
3
      x->string = (unsigned char *)"es";
852
3
      return YXML_OK;
853
3
    }
854
60
    if(ch == (unsigned char)'n') {
855
47
      x->state = YXMLS_string;
856
47
      x->nextstate = YXMLS_std3;
857
47
      x->string = (unsigned char *)"o";
858
47
      return YXML_OK;
859
47
    }
860
13
    break;
861
47
  case YXMLS_std3:
862
47
    if(x->quote == ch) {
863
46
      x->state = YXMLS_xmldecl8;
864
46
      return YXML_OK;
865
46
    }
866
1
    break;
867
2.09k
  case YXMLS_ver0:
868
2.09k
    if(yxml_isSP(ch))
869
1.16k
      return YXML_OK;
870
928
    if(ch == (unsigned char)'=') {
871
908
      x->state = YXMLS_ver1;
872
908
      return YXML_OK;
873
908
    }
874
20
    break;
875
2.02k
  case YXMLS_ver1:
876
2.02k
    if(yxml_isSP(ch))
877
1.16k
      return YXML_OK;
878
858
    if(ch == (unsigned char)'\'' || ch == (unsigned char)'"') {
879
820
      x->state = YXMLS_string;
880
820
      x->quote = ch;
881
820
      x->nextstate = YXMLS_ver2;
882
820
      x->string = (unsigned char *)"1.";
883
820
      return YXML_OK;
884
820
    }
885
38
    break;
886
814
  case YXMLS_ver2:
887
814
    if(yxml_isNum(ch)) {
888
802
      x->state = YXMLS_ver3;
889
802
      return YXML_OK;
890
802
    }
891
12
    break;
892
1.17k
  case YXMLS_ver3:
893
1.17k
    if(yxml_isNum(ch))
894
388
      return YXML_OK;
895
784
    if(x->quote == ch) {
896
762
      x->state = YXMLS_xmldecl4;
897
762
      return YXML_OK;
898
762
    }
899
22
    break;
900
1.81k
  case YXMLS_xmldecl0:
901
1.81k
    if(ch == (unsigned char)'m') {
902
1.52k
      x->state = YXMLS_xmldecl1;
903
1.52k
      return yxml_piname(x, ch);
904
1.52k
    }
905
285
    if(yxml_isName(ch)) {
906
150
      x->state = YXMLS_pi1;
907
150
      return yxml_piname(x, ch);
908
150
    }
909
135
    if(ch == (unsigned char)'?') {
910
36
      x->state = YXMLS_pi4;
911
36
      return yxml_pinameend(x, ch);
912
36
    }
913
99
    if(yxml_isSP(ch)) {
914
41
      x->state = YXMLS_pi2;
915
41
      return yxml_pinameend(x, ch);
916
41
    }
917
58
    break;
918
1.52k
  case YXMLS_xmldecl1:
919
1.52k
    if(ch == (unsigned char)'l') {
920
1.33k
      x->state = YXMLS_xmldecl2;
921
1.33k
      return yxml_piname(x, ch);
922
1.33k
    }
923
187
    if(yxml_isName(ch)) {
924
105
      x->state = YXMLS_pi1;
925
105
      return yxml_piname(x, ch);
926
105
    }
927
82
    if(ch == (unsigned char)'?') {
928
6
      x->state = YXMLS_pi4;
929
6
      return yxml_pinameend(x, ch);
930
6
    }
931
76
    if(yxml_isSP(ch)) {
932
21
      x->state = YXMLS_pi2;
933
21
      return yxml_pinameend(x, ch);
934
21
    }
935
55
    break;
936
1.33k
  case YXMLS_xmldecl2:
937
1.33k
    if(yxml_isSP(ch)) {
938
1.07k
      x->state = YXMLS_xmldecl3;
939
1.07k
      return yxml_piabort(x, ch);
940
1.07k
    }
941
266
    if(yxml_isName(ch)) {
942
224
      x->state = YXMLS_pi1;
943
224
      return yxml_piname(x, ch);
944
224
    }
945
42
    break;
946
2.18k
  case YXMLS_xmldecl3:
947
2.18k
    if(yxml_isSP(ch))
948
1.16k
      return YXML_OK;
949
1.01k
    if(ch == (unsigned char)'v') {
950
983
      x->state = YXMLS_string;
951
983
      x->nextstate = YXMLS_ver0;
952
983
      x->string = (unsigned char *)"ersion";
953
983
      return YXML_OK;
954
983
    }
955
33
    break;
956
760
  case YXMLS_xmldecl4:
957
760
    if(yxml_isSP(ch)) {
958
688
      x->state = YXMLS_xmldecl5;
959
688
      return YXML_OK;
960
688
    }
961
72
    if(ch == (unsigned char)'?') {
962
36
      x->state = YXMLS_xmldecl9;
963
36
      return YXML_OK;
964
36
    }
965
36
    break;
966
1.79k
  case YXMLS_xmldecl5:
967
1.79k
    if(yxml_isSP(ch))
968
1.16k
      return YXML_OK;
969
634
    if(ch == (unsigned char)'?') {
970
17
      x->state = YXMLS_xmldecl9;
971
17
      return YXML_OK;
972
17
    }
973
617
    if(ch == (unsigned char)'e') {
974
461
      x->state = YXMLS_string;
975
461
      x->nextstate = YXMLS_enc0;
976
461
      x->string = (unsigned char *)"ncoding";
977
461
      return YXML_OK;
978
461
    }
979
156
    if(ch == (unsigned char)'s') {
980
132
      x->state = YXMLS_string;
981
132
      x->nextstate = YXMLS_std0;
982
132
      x->string = (unsigned char *)"tandalone";
983
132
      return YXML_OK;
984
132
    }
985
24
    break;
986
152
  case YXMLS_xmldecl6:
987
152
    if(yxml_isSP(ch)) {
988
108
      x->state = YXMLS_xmldecl7;
989
108
      return YXML_OK;
990
108
    }
991
44
    if(ch == (unsigned char)'?') {
992
10
      x->state = YXMLS_xmldecl9;
993
10
      return YXML_OK;
994
10
    }
995
34
    break;
996
1.22k
  case YXMLS_xmldecl7:
997
1.22k
    if(yxml_isSP(ch))
998
1.16k
      return YXML_OK;
999
54
    if(ch == (unsigned char)'?') {
1000
14
      x->state = YXMLS_xmldecl9;
1001
14
      return YXML_OK;
1002
14
    }
1003
40
    if(ch == (unsigned char)'s') {
1004
6
      x->state = YXMLS_string;
1005
6
      x->nextstate = YXMLS_std0;
1006
6
      x->string = (unsigned char *)"tandalone";
1007
6
      return YXML_OK;
1008
6
    }
1009
34
    break;
1010
609
  case YXMLS_xmldecl8:
1011
609
    if(yxml_isSP(ch))
1012
588
      return YXML_OK;
1013
21
    if(ch == (unsigned char)'?') {
1014
9
      x->state = YXMLS_xmldecl9;
1015
9
      return YXML_OK;
1016
9
    }
1017
12
    break;
1018
77
  case YXMLS_xmldecl9:
1019
77
    if(ch == (unsigned char)'>') {
1020
55
      x->state = YXMLS_misc1;
1021
55
      return YXML_OK;
1022
55
    }
1023
22
    break;
1024
3.71G
  }
1025
1.73k
  return YXML_ESYN;
1026
3.71G
}
1027
1028
1.86M
yxml_ret_t yxml_eof(yxml_t *x) {
1029
1.86M
  if(x->state != YXMLS_misc3)
1030
4.21k
    return YXML_EEOF;
1031
1.86M
  return YXML_OK;
1032
1.86M
}
1033