Coverage Report

Created: 2026-06-09 06:15

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
2.26G
#define yxml_isChar(c) 1
100
/* 0xd should be part of SP, too, but yxml_parse() already normalizes that into 0xa */
101
73.8M
#define yxml_isSP(c) (c == 0x20 || c == 0x09 || c == 0x0a)
102
679M
#define yxml_isAlpha(c) ((c|32)-'a' < 26)
103
341M
#define yxml_isNum(c) (c-'0' < 10)
104
15.9k
#define yxml_isHex(c) (yxml_isNum(c) || (c|32)-'a' < 6)
105
2.15k
#define yxml_isEncName(c) (yxml_isAlpha(c) || yxml_isNum(c) || c == '.' || c == '_' || c == '-')
106
633M
#define yxml_isNameStart(c) (yxml_isAlpha(c) || c == ':' || c == '_' || c >= 128)
107
293M
#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
66.4M
#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
46.2k
#define yxml_isRef(c) (yxml_isNum(c) || yxml_isAlpha(c) || c == '#')
114
115
10.3k
#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
2.19G
static inline void yxml_setchar(char *dest, unsigned ch) {
119
2.19G
  *(unsigned char *)dest = (unsigned char)ch;
120
2.19G
}
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
8.50k
static void yxml_setutf8(char *dest, unsigned ch) {
125
8.50k
  if(ch <= 0x007F)
126
4.05k
    yxml_setchar(dest++, ch);
127
4.44k
  else if(ch <= 0x07FF) {
128
483
    yxml_setchar(dest++, 0xC0 | (ch>>6));
129
483
    yxml_setchar(dest++, 0x80 | (ch & 0x3F));
130
3.96k
  } else if(ch <= 0xFFFF) {
131
3.18k
    yxml_setchar(dest++, 0xE0 | (ch>>12));
132
3.18k
    yxml_setchar(dest++, 0x80 | ((ch>>6) & 0x3F));
133
3.18k
    yxml_setchar(dest++, 0x80 | (ch & 0x3F));
134
3.18k
  } else {
135
779
    yxml_setchar(dest++, 0xF0 | (ch>>18));
136
779
    yxml_setchar(dest++, 0x80 | ((ch>>12) & 0x3F));
137
779
    yxml_setchar(dest++, 0x80 | ((ch>>6) & 0x3F));
138
779
    yxml_setchar(dest++, 0x80 | (ch & 0x3F));
139
779
  }
140
8.50k
  *dest = 0;
141
8.50k
}
142
143
2.13G
static inline yxml_ret_t yxml_datacontent(yxml_t *x, unsigned ch) {
144
2.13G
  yxml_setchar(x->data, ch);
145
2.13G
  x->data[1] = 0;
146
2.13G
  return YXML_CONTENT;
147
2.13G
}
148
149
74.0k
static inline yxml_ret_t yxml_datapi1(yxml_t *x, unsigned ch) {
150
74.0k
  yxml_setchar(x->data, ch);
151
74.0k
  x->data[1] = 0;
152
74.0k
  return YXML_PICONTENT;
153
74.0k
}
154
155
680
static inline yxml_ret_t yxml_datapi2(yxml_t *x, unsigned ch) {
156
680
  x->data[0] = '?';
157
680
  yxml_setchar(x->data+1, ch);
158
680
  x->data[2] = 0;
159
680
  return YXML_PICONTENT;
160
680
}
161
162
490
static inline yxml_ret_t yxml_datacd1(yxml_t *x, unsigned ch) {
163
490
  x->data[0] = ']';
164
490
  yxml_setchar(x->data+1, ch);
165
490
  x->data[2] = 0;
166
490
  return YXML_CONTENT;
167
490
}
168
169
540
static inline yxml_ret_t yxml_datacd2(yxml_t *x, unsigned ch) {
170
540
  x->data[0] = ']';
171
540
  x->data[1] = ']';
172
540
  yxml_setchar(x->data+2, ch);
173
540
  x->data[3] = 0;
174
540
  return YXML_CONTENT;
175
540
}
176
177
60.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
60.3M
  yxml_setchar(x->data, ch == 0x9 || ch == 0xa ? 0x20 : ch);
180
60.3M
  x->data[1] = 0;
181
60.3M
  return YXML_ATTRVAL;
182
60.3M
}
183
184
34.2M
static yxml_ret_t yxml_pushstack(yxml_t *x, char **res, unsigned ch) {
185
34.2M
  if(x->stacklen+2 >= x->stacksize)
186
9
    return YXML_ESTACK;
187
34.2M
  x->stacklen++;
188
34.2M
  *res = (char *)x->stack+x->stacklen;
189
34.2M
  x->stack[x->stacklen] = (unsigned char)ch;
190
34.2M
  x->stacklen++;
191
34.2M
  x->stack[x->stacklen] = 0;
192
34.2M
  return YXML_OK;
193
34.2M
}
194
195
158M
static yxml_ret_t yxml_pushstackc(yxml_t *x, unsigned ch) {
196
158M
  if(x->stacklen+1 >= x->stacksize)
197
8
    return YXML_ESTACK;
198
158M
  x->stack[x->stacklen] = (unsigned char)ch;
199
158M
  x->stacklen++;
200
158M
  x->stack[x->stacklen] = 0;
201
158M
  return YXML_OK;
202
158M
}
203
204
34.2M
static void yxml_popstack(yxml_t *x) {
205
34.2M
  do
206
226M
    x->stacklen--;
207
226M
  while(x->stack[x->stacklen]);
208
34.2M
}
209
210
28.2M
static inline yxml_ret_t yxml_elemstart  (yxml_t *x, unsigned ch) { return yxml_pushstack(x, &x->elem, ch); }
211
113M
static inline yxml_ret_t yxml_elemname   (yxml_t *x, unsigned ch) { return yxml_pushstackc(x, ch); }
212
28.2M
static inline yxml_ret_t yxml_elemnameend(yxml_t *x, unsigned ch) { return YXML_ELEMSTART; }
213
214
/* Also used in yxml_elemcloseend(), since this function just removes the last
215
 * element from the stack and returns ELEMEND. */
216
28.2M
static yxml_ret_t yxml_selfclose(yxml_t *x, unsigned ch) {
217
28.2M
  yxml_popstack(x);
218
28.2M
  if(x->stacklen) {
219
26.9M
    x->elem = (char *)x->stack+x->stacklen-1;
220
160M
    while(*(x->elem-1))
221
133M
      x->elem--;
222
26.9M
    return YXML_ELEMEND;
223
26.9M
  }
224
1.29M
  x->elem = (char *)x->stack;
225
1.29M
  x->state = YXMLS_misc3;
226
1.29M
  return YXML_ELEMEND;
227
28.2M
}
228
229
100M
static inline yxml_ret_t yxml_elemclose(yxml_t *x, unsigned ch) {
230
100M
  if(*((unsigned char *)x->elem) != ch)
231
198
    return YXML_ECLOSE;
232
100M
  x->elem++;
233
100M
  return YXML_OK;
234
100M
}
235
236
12.0M
static inline yxml_ret_t yxml_elemcloseend(yxml_t *x, unsigned ch) {
237
12.0M
  if(*x->elem)
238
16
    return YXML_ECLOSE;
239
12.0M
  return yxml_selfclose(x, ch);
240
12.0M
}
241
242
6.03M
static inline yxml_ret_t yxml_attrstart  (yxml_t *x, unsigned ch) { return yxml_pushstack(x, &x->attr, ch); }
243
45.1M
static inline yxml_ret_t yxml_attrname   (yxml_t *x, unsigned ch) { return yxml_pushstackc(x, ch); }
244
6.03M
static inline yxml_ret_t yxml_attrnameend(yxml_t *x, unsigned ch) { return YXML_ATTRSTART; }
245
6.03M
static inline yxml_ret_t yxml_attrvalend (yxml_t *x, unsigned ch) { yxml_popstack(x); return YXML_ATTREND; }
246
247
9.25k
static inline yxml_ret_t yxml_pistart  (yxml_t *x, unsigned ch) { return yxml_pushstack(x, &x->pi, ch); }
248
12.5k
static inline yxml_ret_t yxml_piname   (yxml_t *x, unsigned ch) { return yxml_pushstackc(x, ch); }
249
1.16k
static inline yxml_ret_t yxml_piabort  (yxml_t *x, unsigned ch) { yxml_popstack(x); return YXML_OK; }
250
7.50k
static inline yxml_ret_t yxml_pinameend(yxml_t *x, unsigned ch) {
251
7.50k
  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.50k
}
253
7.13k
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
9.11k
static inline yxml_ret_t yxml_refstart(yxml_t *x, unsigned ch) {
256
9.11k
  memset(x->data, 0, sizeof(x->data));
257
9.11k
  x->reflen = 0;
258
9.11k
  return YXML_OK;
259
9.11k
}
260
261
37.2k
static yxml_ret_t yxml_ref(yxml_t *x, unsigned ch) {
262
37.2k
  if(x->reflen >= sizeof(x->data)-1)
263
34
    return YXML_EREF;
264
37.2k
  yxml_setchar(x->data+x->reflen, ch);
265
37.2k
  x->reflen++;
266
37.2k
  return YXML_OK;
267
37.2k
}
268
269
8.89k
static yxml_ret_t yxml_refend(yxml_t *x, yxml_ret_t ret) {
270
8.89k
  unsigned char *r = (unsigned char *)x->data;
271
8.89k
  unsigned ch = 0;
272
8.89k
  if(*r == '#') {
273
6.48k
    if(r[1] == 'x')
274
15.9k
      for(r += 2; yxml_isHex((unsigned)*r); r++)
275
12.0k
        ch = (ch<<4) + (*r <= '9' ? *r-'0' : (*r|32)-'a' + 10);
276
2.56k
    else
277
9.56k
      for(r++; yxml_isNum((unsigned)*r); r++)
278
7.00k
        ch = (ch*10) + (*r-'0');
279
6.48k
    if(*r)
280
19
      ch = 0;
281
6.48k
  } else {
282
2.41k
    uint64_t i = INTFROM5CHARS(r[0], r[1], r[2], r[3], r[4]);
283
2.41k
    ch =
284
2.41k
      i == INTFROM5CHARS('l','t', 0,  0, 0) ? '<' :
285
2.41k
      i == INTFROM5CHARS('g','t', 0,  0, 0) ? '>' :
286
1.97k
      i == INTFROM5CHARS('a','m','p', 0, 0) ? '&' :
287
1.58k
      i == INTFROM5CHARS('a','p','o','s',0) ? '\'':
288
1.20k
      i == INTFROM5CHARS('q','u','o','t',0) ? '"' : 0;
289
2.41k
  }
290
291
  /* Codepoints not allowed in the XML 1.1 definition of a Char */
292
8.89k
  if(!ch || ch > 0x10FFFF || ch == 0xFFFE || ch == 0xFFFF || (ch-0xDFFF) < 0x7FF)
293
392
    return YXML_EREF;
294
8.50k
  yxml_setutf8(x->data, ch);
295
8.50k
  return ret;
296
8.89k
}
297
298
7.67k
static inline yxml_ret_t yxml_refcontent(yxml_t *x, unsigned ch) { return yxml_refend(x, YXML_CONTENT); }
299
1.21k
static inline yxml_ret_t yxml_refattrval(yxml_t *x, unsigned ch) { return yxml_refend(x, YXML_ATTRVAL); }
300
301
1.30M
void yxml_init(yxml_t *x, void *stack, size_t stacksize) {
302
1.30M
  memset(x, 0, sizeof(*x));
303
1.30M
  x->line = 1;
304
1.30M
  x->stack = (unsigned char*)stack;
305
1.30M
  x->stacksize = stacksize;
306
1.30M
  *x->stack = 0;
307
1.30M
  x->elem = x->pi = x->attr = (char *)x->stack;
308
1.30M
  x->state = YXMLS_init;
309
1.30M
}
310
311
2.62G
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
2.62G
  unsigned ch = (unsigned)(_ch+256) & 0xff;
315
2.62G
  if(!ch)
316
13
    return YXML_ESYN;
317
2.62G
  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
2.62G
  if(x->ignore == ch) {
324
2.06k
    x->ignore = 0;
325
2.06k
    return YXML_OK;
326
2.06k
  }
327
2.62G
  x->ignore = (ch == 0xd) * 0xa;
328
2.62G
  if(ch == 0xa || ch == 0xd) {
329
4.18M
    ch = 0xa;
330
4.18M
    x->line++;
331
4.18M
    x->byte = 0;
332
4.18M
  }
333
2.62G
  x->byte++;
334
335
2.62G
  switch((yxml_state_t)x->state) {
336
22.0k
  case YXMLS_string:
337
22.0k
    if(ch == *x->string) {
338
21.9k
      x->string++;
339
21.9k
      if(!*x->string)
340
4.14k
        x->state = x->nextstate;
341
21.9k
      return YXML_OK;
342
21.9k
    }
343
24
    break;
344
51.1M
  case YXMLS_attr0:
345
51.1M
    if(yxml_isName(ch))
346
45.1M
      return yxml_attrname(x, ch);
347
6.03M
    if(yxml_isSP(ch)) {
348
2.87M
      x->state = YXMLS_attr1;
349
2.87M
      return yxml_attrnameend(x, ch);
350
2.87M
    }
351
3.16M
    if(ch == (unsigned char)'=') {
352
3.16M
      x->state = YXMLS_attr2;
353
3.16M
      return yxml_attrnameend(x, ch);
354
3.16M
    }
355
53
    break;
356
2.88M
  case YXMLS_attr1:
357
2.88M
    if(yxml_isSP(ch))
358
4.24k
      return YXML_OK;
359
2.87M
    if(ch == (unsigned char)'=') {
360
2.87M
      x->state = YXMLS_attr2;
361
2.87M
      return YXML_OK;
362
2.87M
    }
363
32
    break;
364
6.04M
  case YXMLS_attr2:
365
6.04M
    if(yxml_isSP(ch))
366
1.29k
      return YXML_OK;
367
6.03M
    if(ch == (unsigned char)'\'' || ch == (unsigned char)'"') {
368
6.03M
      x->state = YXMLS_attr3;
369
6.03M
      x->quote = ch;
370
6.03M
      return YXML_OK;
371
6.03M
    }
372
38
    break;
373
66.4M
  case YXMLS_attr3:
374
66.4M
    if(yxml_isAttValue(ch))
375
60.3M
      return yxml_dataattr(x, ch);
376
6.04M
    if(ch == (unsigned char)'&') {
377
1.32k
      x->state = YXMLS_attr4;
378
1.32k
      return yxml_refstart(x, ch);
379
1.32k
    }
380
6.03M
    if(x->quote == ch) {
381
6.03M
      x->state = YXMLS_elem2;
382
6.03M
      return yxml_attrvalend(x, ch);
383
6.03M
    }
384
2
    break;
385
5.36k
  case YXMLS_attr4:
386
5.36k
    if(yxml_isRef(ch))
387
4.12k
      return yxml_ref(x, ch);
388
1.24k
    if(ch == (unsigned char)'\x3b') {
389
1.21k
      x->state = YXMLS_attr3;
390
1.21k
      return yxml_refattrval(x, ch);
391
1.21k
    }
392
30
    break;
393
5.90k
  case YXMLS_cd0:
394
5.90k
    if(ch == (unsigned char)']') {
395
1.57k
      x->state = YXMLS_cd1;
396
1.57k
      return YXML_OK;
397
1.57k
    }
398
4.33k
    if(yxml_isChar(ch))
399
4.33k
      return yxml_datacontent(x, ch);
400
0
    break;
401
1.56k
  case YXMLS_cd1:
402
1.56k
    if(ch == (unsigned char)']') {
403
1.07k
      x->state = YXMLS_cd2;
404
1.07k
      return YXML_OK;
405
1.07k
    }
406
490
    if(yxml_isChar(ch)) {
407
490
      x->state = YXMLS_cd0;
408
490
      return yxml_datacd1(x, ch);
409
490
    }
410
0
    break;
411
1.61k
  case YXMLS_cd2:
412
1.61k
    if(ch == (unsigned char)']')
413
558
      return yxml_datacontent(x, ch);
414
1.05k
    if(ch == (unsigned char)'>') {
415
513
      x->state = YXMLS_misc2;
416
513
      return YXML_OK;
417
513
    }
418
540
    if(yxml_isChar(ch)) {
419
540
      x->state = YXMLS_cd0;
420
540
      return yxml_datacd2(x, ch);
421
540
    }
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.20k
  case YXMLS_comment1:
430
2.20k
    if(ch == (unsigned char)'-') {
431
2.18k
      x->state = YXMLS_comment2;
432
2.18k
      return YXML_OK;
433
2.18k
    }
434
22
    break;
435
3.35k
  case YXMLS_comment2:
436
3.35k
    if(ch == (unsigned char)'-') {
437
2.72k
      x->state = YXMLS_comment3;
438
2.72k
      return YXML_OK;
439
2.72k
    }
440
638
    if(yxml_isChar(ch))
441
638
      return YXML_OK;
442
0
    break;
443
2.70k
  case YXMLS_comment3:
444
2.70k
    if(ch == (unsigned char)'-') {
445
2.08k
      x->state = YXMLS_comment4;
446
2.08k
      return YXML_OK;
447
2.08k
    }
448
623
    if(yxml_isChar(ch)) {
449
623
      x->state = YXMLS_comment2;
450
623
      return YXML_OK;
451
623
    }
452
0
    break;
453
2.07k
  case YXMLS_comment4:
454
2.07k
    if(ch == (unsigned char)'>') {
455
2.05k
      x->state = x->nextstate;
456
2.05k
      return YXML_OK;
457
2.05k
    }
458
22
    break;
459
3.77k
  case YXMLS_dt0:
460
3.77k
    if(ch == (unsigned char)'>') {
461
568
      x->state = YXMLS_misc1;
462
568
      return YXML_OK;
463
568
    }
464
3.21k
    if(ch == (unsigned char)'\'' || ch == (unsigned char)'"') {
465
1.07k
      x->state = YXMLS_dt1;
466
1.07k
      x->quote = ch;
467
1.07k
      x->nextstate = YXMLS_dt0;
468
1.07k
      return YXML_OK;
469
1.07k
    }
470
2.13k
    if(ch == (unsigned char)'<') {
471
1.43k
      x->state = YXMLS_dt2;
472
1.43k
      return YXML_OK;
473
1.43k
    }
474
706
    if(yxml_isChar(ch))
475
706
      return YXML_OK;
476
0
    break;
477
2.15k
  case YXMLS_dt1:
478
2.15k
    if(x->quote == ch) {
479
1.75k
      x->state = x->nextstate;
480
1.75k
      return YXML_OK;
481
1.75k
    }
482
407
    if(yxml_isChar(ch))
483
407
      return YXML_OK;
484
0
    break;
485
1.42k
  case YXMLS_dt2:
486
1.42k
    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.03k
    if(ch == (unsigned char)'!') {
492
1.02k
      x->state = YXMLS_dt3;
493
1.02k
      return YXML_OK;
494
1.02k
    }
495
7
    break;
496
1.01k
  case YXMLS_dt3:
497
1.01k
    if(ch == (unsigned char)'-') {
498
388
      x->state = YXMLS_comment1;
499
388
      x->nextstate = YXMLS_dt0;
500
388
      return YXML_OK;
501
388
    }
502
631
    if(yxml_isChar(ch)) {
503
631
      x->state = YXMLS_dt4;
504
631
      return YXML_OK;
505
631
    }
506
0
    break;
507
1.72k
  case YXMLS_dt4:
508
1.72k
    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
947
    if(ch == (unsigned char)'>') {
515
533
      x->state = YXMLS_dt0;
516
533
      return YXML_OK;
517
533
    }
518
414
    if(yxml_isChar(ch))
519
414
      return YXML_OK;
520
0
    break;
521
141M
  case YXMLS_elem0:
522
141M
    if(yxml_isName(ch))
523
113M
      return yxml_elemname(x, ch);
524
28.2M
    if(yxml_isSP(ch)) {
525
4.20M
      x->state = YXMLS_elem1;
526
4.20M
      return yxml_elemnameend(x, ch);
527
4.20M
    }
528
24.0M
    if(ch == (unsigned char)'/') {
529
12.6M
      x->state = YXMLS_elem3;
530
12.6M
      return yxml_elemnameend(x, ch);
531
12.6M
    }
532
11.4M
    if(ch == (unsigned char)'>') {
533
11.4M
      x->state = YXMLS_misc2;
534
11.4M
      return yxml_elemnameend(x, ch);
535
11.4M
    }
536
57
    break;
537
11.2M
  case YXMLS_elem1:
538
11.2M
    if(yxml_isSP(ch))
539
2.36M
      return YXML_OK;
540
8.92M
    if(ch == (unsigned char)'/') {
541
2.87M
      x->state = YXMLS_elem3;
542
2.87M
      return YXML_OK;
543
2.87M
    }
544
6.04M
    if(ch == (unsigned char)'>') {
545
1.22k
      x->state = YXMLS_misc2;
546
1.22k
      return YXML_OK;
547
1.22k
    }
548
6.03M
    if(yxml_isNameStart(ch)) {
549
6.03M
      x->state = YXMLS_attr0;
550
6.03M
      return yxml_attrstart(x, ch);
551
6.03M
    }
552
55
    break;
553
6.03M
  case YXMLS_elem2:
554
6.03M
    if(yxml_isSP(ch)) {
555
4.71M
      x->state = YXMLS_elem1;
556
4.71M
      return YXML_OK;
557
4.71M
    }
558
1.32M
    if(ch == (unsigned char)'/') {
559
715k
      x->state = YXMLS_elem3;
560
715k
      return YXML_OK;
561
715k
    }
562
610k
    if(ch == (unsigned char)'>') {
563
610k
      x->state = YXMLS_misc2;
564
610k
      return YXML_OK;
565
610k
    }
566
31
    break;
567
16.2M
  case YXMLS_elem3:
568
16.2M
    if(ch == (unsigned char)'>') {
569
16.2M
      x->state = YXMLS_misc2;
570
16.2M
      return yxml_selfclose(x, ch);
571
16.2M
    }
572
10
    break;
573
1.59k
  case YXMLS_enc0:
574
1.59k
    if(yxml_isSP(ch))
575
1.16k
      return YXML_OK;
576
435
    if(ch == (unsigned char)'=') {
577
404
      x->state = YXMLS_enc1;
578
404
      return YXML_OK;
579
404
    }
580
31
    break;
581
1.51k
  case YXMLS_enc1:
582
1.51k
    if(yxml_isSP(ch))
583
1.16k
      return YXML_OK;
584
354
    if(ch == (unsigned char)'\'' || ch == (unsigned char)'"') {
585
318
      x->state = YXMLS_enc2;
586
318
      x->quote = ch;
587
318
      return YXML_OK;
588
318
    }
589
36
    break;
590
314
  case YXMLS_enc2:
591
314
    if(yxml_isAlpha(ch)) {
592
295
      x->state = YXMLS_enc3;
593
295
      return YXML_OK;
594
295
    }
595
19
    break;
596
2.15k
  case YXMLS_enc3:
597
2.15k
    if(yxml_isEncName(ch))
598
1.96k
      return YXML_OK;
599
195
    if(x->quote == ch) {
600
160
      x->state = YXMLS_xmldecl6;
601
160
      return YXML_OK;
602
160
    }
603
35
    break;
604
12.0M
  case YXMLS_etag0:
605
12.0M
    if(yxml_isNameStart(ch)) {
606
12.0M
      x->state = YXMLS_etag1;
607
12.0M
      return yxml_elemclose(x, ch);
608
12.0M
    }
609
30
    break;
610
100M
  case YXMLS_etag1:
611
100M
    if(yxml_isName(ch))
612
88.8M
      return yxml_elemclose(x, ch);
613
12.0M
    if(yxml_isSP(ch)) {
614
2.06k
      x->state = YXMLS_etag2;
615
2.06k
      return yxml_elemcloseend(x, ch);
616
2.06k
    }
617
12.0M
    if(ch == (unsigned char)'>') {
618
12.0M
      x->state = YXMLS_misc2;
619
12.0M
      return yxml_elemcloseend(x, ch);
620
12.0M
    }
621
46
    break;
622
4.44k
  case YXMLS_etag2:
623
4.44k
    if(yxml_isSP(ch))
624
2.48k
      return YXML_OK;
625
1.95k
    if(ch == (unsigned char)'>') {
626
1.92k
      x->state = YXMLS_misc2;
627
1.92k
      return YXML_OK;
628
1.92k
    }
629
33
    break;
630
1.30M
  case YXMLS_init:
631
1.30M
    if(ch == (unsigned char)'\xef') {
632
37
      x->state = YXMLS_string;
633
37
      x->nextstate = YXMLS_misc0;
634
37
      x->string = (unsigned char *)"\xbb\xbf";
635
37
      return YXML_OK;
636
37
    }
637
1.30M
    if(yxml_isSP(ch)) {
638
200
      x->state = YXMLS_misc0;
639
200
      return YXML_OK;
640
200
    }
641
1.30M
    if(ch == (unsigned char)'<') {
642
1.30M
      x->state = YXMLS_le0;
643
1.30M
      return YXML_OK;
644
1.30M
    }
645
71
    break;
646
1.30M
  case YXMLS_le0:
647
1.30M
    if(ch == (unsigned char)'!') {
648
590
      x->state = YXMLS_lee1;
649
590
      return YXML_OK;
650
590
    }
651
1.29M
    if(ch == (unsigned char)'?') {
652
2.62k
      x->state = YXMLS_leq0;
653
2.62k
      return YXML_OK;
654
2.62k
    }
655
1.29M
    if(yxml_isNameStart(ch)) {
656
1.29M
      x->state = YXMLS_elem0;
657
1.29M
      return yxml_elemstart(x, ch);
658
1.29M
    }
659
44
    break;
660
4.62k
  case YXMLS_le1:
661
4.62k
    if(ch == (unsigned char)'!') {
662
1.36k
      x->state = YXMLS_lee1;
663
1.36k
      return YXML_OK;
664
1.36k
    }
665
3.25k
    if(ch == (unsigned char)'?') {
666
2.81k
      x->state = YXMLS_pi0;
667
2.81k
      x->nextstate = YXMLS_misc1;
668
2.81k
      return YXML_OK;
669
2.81k
    }
670
448
    if(yxml_isNameStart(ch)) {
671
415
      x->state = YXMLS_elem0;
672
415
      return yxml_elemstart(x, ch);
673
415
    }
674
33
    break;
675
38.9M
  case YXMLS_le2:
676
38.9M
    if(ch == (unsigned char)'!') {
677
1.15k
      x->state = YXMLS_lee2;
678
1.15k
      return YXML_OK;
679
1.15k
    }
680
38.9M
    if(ch == (unsigned char)'?') {
681
2.85k
      x->state = YXMLS_pi0;
682
2.85k
      x->nextstate = YXMLS_misc2;
683
2.85k
      return YXML_OK;
684
2.85k
    }
685
38.9M
    if(ch == (unsigned char)'/') {
686
12.0M
      x->state = YXMLS_etag0;
687
12.0M
      return YXML_OK;
688
12.0M
    }
689
26.9M
    if(yxml_isNameStart(ch)) {
690
26.9M
      x->state = YXMLS_elem0;
691
26.9M
      return yxml_elemstart(x, ch);
692
26.9M
    }
693
57
    break;
694
1.20k
  case YXMLS_le3:
695
1.20k
    if(ch == (unsigned char)'!') {
696
445
      x->state = YXMLS_comment0;
697
445
      x->nextstate = YXMLS_misc3;
698
445
      return YXML_OK;
699
445
    }
700
757
    if(ch == (unsigned char)'?') {
701
724
      x->state = YXMLS_pi0;
702
724
      x->nextstate = YXMLS_misc3;
703
724
      return YXML_OK;
704
724
    }
705
33
    break;
706
1.93k
  case YXMLS_lee1:
707
1.93k
    if(ch == (unsigned char)'-') {
708
993
      x->state = YXMLS_comment1;
709
993
      x->nextstate = YXMLS_misc1;
710
993
      return YXML_OK;
711
993
    }
712
944
    if(ch == (unsigned char)'D') {
713
907
      x->state = YXMLS_string;
714
907
      x->nextstate = YXMLS_dt0;
715
907
      x->string = (unsigned char *)"OCTYPE";
716
907
      return YXML_OK;
717
907
    }
718
37
    break;
719
1.14k
  case YXMLS_lee2:
720
1.14k
    if(ch == (unsigned char)'-') {
721
470
      x->state = YXMLS_comment1;
722
470
      x->nextstate = YXMLS_misc2;
723
470
      return YXML_OK;
724
470
    }
725
675
    if(ch == (unsigned char)'[') {
726
653
      x->state = YXMLS_string;
727
653
      x->nextstate = YXMLS_cd0;
728
653
      x->string = (unsigned char *)"CDATA[";
729
653
      return YXML_OK;
730
653
    }
731
22
    break;
732
2.62k
  case YXMLS_leq0:
733
2.62k
    if(ch == (unsigned char)'x') {
734
1.91k
      x->state = YXMLS_xmldecl0;
735
1.91k
      x->nextstate = YXMLS_misc1;
736
1.91k
      return yxml_pistart(x, ch);
737
1.91k
    }
738
702
    if(yxml_isNameStart(ch)) {
739
664
      x->state = YXMLS_pi1;
740
664
      x->nextstate = YXMLS_misc1;
741
664
      return yxml_pistart(x, ch);
742
664
    }
743
38
    break;
744
2.41k
  case YXMLS_misc0:
745
2.41k
    if(yxml_isSP(ch))
746
2.30k
      return YXML_OK;
747
113
    if(ch == (unsigned char)'<') {
748
65
      x->state = YXMLS_le0;
749
65
      return YXML_OK;
750
65
    }
751
48
    break;
752
6.03k
  case YXMLS_misc1:
753
6.03k
    if(yxml_isSP(ch))
754
1.36k
      return YXML_OK;
755
4.66k
    if(ch == (unsigned char)'<') {
756
4.63k
      x->state = YXMLS_le1;
757
4.63k
      return YXML_OK;
758
4.63k
    }
759
34
    break;
760
2.16G
  case YXMLS_misc2:
761
2.16G
    if(ch == (unsigned char)'<') {
762
38.9M
      x->state = YXMLS_le2;
763
38.9M
      return YXML_OK;
764
38.9M
    }
765
2.13G
    if(ch == (unsigned char)'&') {
766
7.79k
      x->state = YXMLS_misc2a;
767
7.79k
      return yxml_refstart(x, ch);
768
7.79k
    }
769
2.13G
    if(yxml_isChar(ch))
770
2.13G
      return yxml_datacontent(x, ch);
771
0
    break;
772
40.8k
  case YXMLS_misc2a:
773
40.8k
    if(yxml_isRef(ch))
774
33.1k
      return yxml_ref(x, ch);
775
7.72k
    if(ch == (unsigned char)'\x3b') {
776
7.67k
      x->state = YXMLS_misc2;
777
7.67k
      return yxml_refcontent(x, ch);
778
7.67k
    }
779
45
    break;
780
2.46k
  case YXMLS_misc3:
781
2.46k
    if(yxml_isSP(ch))
782
1.21k
      return YXML_OK;
783
1.25k
    if(ch == (unsigned char)'<') {
784
1.21k
      x->state = YXMLS_le3;
785
1.21k
      return YXML_OK;
786
1.21k
    }
787
40
    break;
788
6.71k
  case YXMLS_pi0:
789
6.71k
    if(yxml_isNameStart(ch)) {
790
6.67k
      x->state = YXMLS_pi1;
791
6.67k
      return yxml_pistart(x, ch);
792
6.67k
    }
793
39
    break;
794
16.4k
  case YXMLS_pi1:
795
16.4k
    if(yxml_isName(ch))
796
9.02k
      return yxml_piname(x, ch);
797
7.43k
    if(ch == (unsigned char)'?') {
798
4.70k
      x->state = YXMLS_pi4;
799
4.70k
      return yxml_pinameend(x, ch);
800
4.70k
    }
801
2.72k
    if(yxml_isSP(ch)) {
802
2.68k
      x->state = YXMLS_pi2;
803
2.68k
      return yxml_pinameend(x, ch);
804
2.68k
    }
805
47
    break;
806
77.3k
  case YXMLS_pi2:
807
77.3k
    if(ch == (unsigned char)'?') {
808
3.21k
      x->state = YXMLS_pi3;
809
3.21k
      return YXML_OK;
810
3.21k
    }
811
74.0k
    if(yxml_isChar(ch))
812
74.0k
      return yxml_datapi1(x, ch);
813
0
    break;
814
3.20k
  case YXMLS_pi3:
815
3.20k
    if(ch == (unsigned char)'>') {
816
2.52k
      x->state = x->nextstate;
817
2.52k
      return yxml_pivalend(x, ch);
818
2.52k
    }
819
680
    if(yxml_isChar(ch)) {
820
680
      x->state = YXMLS_pi2;
821
680
      return yxml_datapi2(x, ch);
822
680
    }
823
0
    break;
824
4.64k
  case YXMLS_pi4:
825
4.64k
    if(ch == (unsigned char)'>') {
826
4.61k
      x->state = x->nextstate;
827
4.61k
      return yxml_pivalend(x, ch);
828
4.61k
    }
829
26
    break;
830
698
  case YXMLS_std0:
831
698
    if(yxml_isSP(ch))
832
582
      return YXML_OK;
833
116
    if(ch == (unsigned char)'=') {
834
99
      x->state = YXMLS_std1;
835
99
      return YXML_OK;
836
99
    }
837
17
    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
62
      x->state = YXMLS_std2;
843
62
      x->quote = ch;
844
62
      return YXML_OK;
845
62
    }
846
12
    break;
847
60
  case YXMLS_std2:
848
60
    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
57
    if(ch == (unsigned char)'n') {
855
46
      x->state = YXMLS_string;
856
46
      x->nextstate = YXMLS_std3;
857
46
      x->string = (unsigned char *)"o";
858
46
      return YXML_OK;
859
46
    }
860
11
    break;
861
46
  case YXMLS_std3:
862
46
    if(x->quote == ch) {
863
45
      x->state = YXMLS_xmldecl8;
864
45
      return YXML_OK;
865
45
    }
866
1
    break;
867
2.17k
  case YXMLS_ver0:
868
2.17k
    if(yxml_isSP(ch))
869
1.16k
      return YXML_OK;
870
1.00k
    if(ch == (unsigned char)'=') {
871
984
      x->state = YXMLS_ver1;
872
984
      return YXML_OK;
873
984
    }
874
24
    break;
875
2.10k
  case YXMLS_ver1:
876
2.10k
    if(yxml_isSP(ch))
877
1.16k
      return YXML_OK;
878
935
    if(ch == (unsigned char)'\'' || ch == (unsigned char)'"') {
879
888
      x->state = YXMLS_string;
880
888
      x->quote = ch;
881
888
      x->nextstate = YXMLS_ver2;
882
888
      x->string = (unsigned char *)"1.";
883
888
      return YXML_OK;
884
888
    }
885
47
    break;
886
882
  case YXMLS_ver2:
887
882
    if(yxml_isNum(ch)) {
888
857
      x->state = YXMLS_ver3;
889
857
      return YXML_OK;
890
857
    }
891
25
    break;
892
1.22k
  case YXMLS_ver3:
893
1.22k
    if(yxml_isNum(ch))
894
397
      return YXML_OK;
895
829
    if(x->quote == ch) {
896
798
      x->state = YXMLS_xmldecl4;
897
798
      return YXML_OK;
898
798
    }
899
31
    break;
900
1.91k
  case YXMLS_xmldecl0:
901
1.91k
    if(ch == (unsigned char)'m') {
902
1.63k
      x->state = YXMLS_xmldecl1;
903
1.63k
      return yxml_piname(x, ch);
904
1.63k
    }
905
284
    if(yxml_isName(ch)) {
906
151
      x->state = YXMLS_pi1;
907
151
      return yxml_piname(x, ch);
908
151
    }
909
133
    if(ch == (unsigned char)'?') {
910
44
      x->state = YXMLS_pi4;
911
44
      return yxml_pinameend(x, ch);
912
44
    }
913
89
    if(yxml_isSP(ch)) {
914
42
      x->state = YXMLS_pi2;
915
42
      return yxml_pinameend(x, ch);
916
42
    }
917
47
    break;
918
1.63k
  case YXMLS_xmldecl1:
919
1.63k
    if(ch == (unsigned char)'l') {
920
1.42k
      x->state = YXMLS_xmldecl2;
921
1.42k
      return yxml_piname(x, ch);
922
1.42k
    }
923
205
    if(yxml_isName(ch)) {
924
122
      x->state = YXMLS_pi1;
925
122
      return yxml_piname(x, ch);
926
122
    }
927
83
    if(ch == (unsigned char)'?') {
928
6
      x->state = YXMLS_pi4;
929
6
      return yxml_pinameend(x, ch);
930
6
    }
931
77
    if(yxml_isSP(ch)) {
932
19
      x->state = YXMLS_pi2;
933
19
      return yxml_pinameend(x, ch);
934
19
    }
935
58
    break;
936
1.42k
  case YXMLS_xmldecl2:
937
1.42k
    if(yxml_isSP(ch)) {
938
1.16k
      x->state = YXMLS_xmldecl3;
939
1.16k
      return yxml_piabort(x, ch);
940
1.16k
    }
941
261
    if(yxml_isName(ch)) {
942
224
      x->state = YXMLS_pi1;
943
224
      return yxml_piname(x, ch);
944
224
    }
945
37
    break;
946
2.27k
  case YXMLS_xmldecl3:
947
2.27k
    if(yxml_isSP(ch))
948
1.16k
      return YXML_OK;
949
1.10k
    if(ch == (unsigned char)'v') {
950
1.06k
      x->state = YXMLS_string;
951
1.06k
      x->nextstate = YXMLS_ver0;
952
1.06k
      x->string = (unsigned char *)"ersion";
953
1.06k
      return YXML_OK;
954
1.06k
    }
955
46
    break;
956
796
  case YXMLS_xmldecl4:
957
796
    if(yxml_isSP(ch)) {
958
743
      x->state = YXMLS_xmldecl5;
959
743
      return YXML_OK;
960
743
    }
961
53
    if(ch == (unsigned char)'?') {
962
19
      x->state = YXMLS_xmldecl9;
963
19
      return YXML_OK;
964
19
    }
965
34
    break;
966
1.85k
  case YXMLS_xmldecl5:
967
1.85k
    if(yxml_isSP(ch))
968
1.16k
      return YXML_OK;
969
689
    if(ch == (unsigned char)'?') {
970
14
      x->state = YXMLS_xmldecl9;
971
14
      return YXML_OK;
972
14
    }
973
675
    if(ch == (unsigned char)'e') {
974
486
      x->state = YXMLS_string;
975
486
      x->nextstate = YXMLS_enc0;
976
486
      x->string = (unsigned char *)"ncoding";
977
486
      return YXML_OK;
978
486
    }
979
189
    if(ch == (unsigned char)'s') {
980
138
      x->state = YXMLS_string;
981
138
      x->nextstate = YXMLS_std0;
982
138
      x->string = (unsigned char *)"tandalone";
983
138
      return YXML_OK;
984
138
    }
985
51
    break;
986
159
  case YXMLS_xmldecl6:
987
159
    if(yxml_isSP(ch)) {
988
129
      x->state = YXMLS_xmldecl7;
989
129
      return YXML_OK;
990
129
    }
991
30
    if(ch == (unsigned char)'?') {
992
11
      x->state = YXMLS_xmldecl9;
993
11
      return YXML_OK;
994
11
    }
995
19
    break;
996
1.24k
  case YXMLS_xmldecl7:
997
1.24k
    if(yxml_isSP(ch))
998
1.16k
      return YXML_OK;
999
75
    if(ch == (unsigned char)'?') {
1000
14
      x->state = YXMLS_xmldecl9;
1001
14
      return YXML_OK;
1002
14
    }
1003
61
    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
55
    break;
1010
604
  case YXMLS_xmldecl8:
1011
604
    if(yxml_isSP(ch))
1012
584
      return YXML_OK;
1013
20
    if(ch == (unsigned char)'?') {
1014
9
      x->state = YXMLS_xmldecl9;
1015
9
      return YXML_OK;
1016
9
    }
1017
11
    break;
1018
58
  case YXMLS_xmldecl9:
1019
58
    if(ch == (unsigned char)'>') {
1020
56
      x->state = YXMLS_misc1;
1021
56
      return YXML_OK;
1022
56
    }
1023
2
    break;
1024
2.62G
  }
1025
1.77k
  return YXML_ESYN;
1026
2.62G
}
1027
1028
1.29M
yxml_ret_t yxml_eof(yxml_t *x) {
1029
1.29M
  if(x->state != YXMLS_misc3)
1030
4.33k
    return YXML_EEOF;
1031
1.29M
  return YXML_OK;
1032
1.29M
}
1033