Coverage Report

Created: 2026-06-30 06:45

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.32G
#define yxml_isChar(c) 1
100
/* 0xd should be part of SP, too, but yxml_parse() already normalizes that into 0xa */
101
86.1M
#define yxml_isSP(c) (c == 0x20 || c == 0x09 || c == 0x0a)
102
916M
#define yxml_isAlpha(c) ((c|32)-'a' < 26)
103
460M
#define yxml_isNum(c) (c-'0' < 10)
104
16.0k
#define yxml_isHex(c) (yxml_isNum(c) || (c|32)-'a' < 6)
105
2.21k
#define yxml_isEncName(c) (yxml_isAlpha(c) || yxml_isNum(c) || c == '.' || c == '_' || c == '-')
106
858M
#define yxml_isNameStart(c) (yxml_isAlpha(c) || c == ':' || c == '_' || c >= 128)
107
400M
#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
95.1M
#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.3k
#define yxml_isRef(c) (yxml_isNum(c) || yxml_isAlpha(c) || c == '#')
114
115
10.4k
#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.22G
static inline void yxml_setchar(char *dest, unsigned ch) {
119
3.22G
  *(unsigned char *)dest = (unsigned char)ch;
120
3.22G
}
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.51k
static void yxml_setutf8(char *dest, unsigned ch) {
125
8.51k
  if(ch <= 0x007F)
126
4.06k
    yxml_setchar(dest++, ch);
127
4.44k
  else if(ch <= 0x07FF) {
128
478
    yxml_setchar(dest++, 0xC0 | (ch>>6));
129
478
    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
783
    yxml_setchar(dest++, 0xF0 | (ch>>18));
136
783
    yxml_setchar(dest++, 0x80 | ((ch>>12) & 0x3F));
137
783
    yxml_setchar(dest++, 0x80 | ((ch>>6) & 0x3F));
138
783
    yxml_setchar(dest++, 0x80 | (ch & 0x3F));
139
783
  }
140
8.51k
  *dest = 0;
141
8.51k
}
142
143
3.13G
static inline yxml_ret_t yxml_datacontent(yxml_t *x, unsigned ch) {
144
3.13G
  yxml_setchar(x->data, ch);
145
3.13G
  x->data[1] = 0;
146
3.13G
  return YXML_CONTENT;
147
3.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
676
static inline yxml_ret_t yxml_datapi2(yxml_t *x, unsigned ch) {
156
676
  x->data[0] = '?';
157
676
  yxml_setchar(x->data+1, ch);
158
676
  x->data[2] = 0;
159
676
  return YXML_PICONTENT;
160
676
}
161
162
509
static inline yxml_ret_t yxml_datacd1(yxml_t *x, unsigned ch) {
163
509
  x->data[0] = ']';
164
509
  yxml_setchar(x->data+1, ch);
165
509
  x->data[2] = 0;
166
509
  return YXML_CONTENT;
167
509
}
168
169
647
static inline yxml_ret_t yxml_datacd2(yxml_t *x, unsigned ch) {
170
647
  x->data[0] = ']';
171
647
  x->data[1] = ']';
172
647
  yxml_setchar(x->data+2, ch);
173
647
  x->data[3] = 0;
174
647
  return YXML_CONTENT;
175
647
}
176
177
88.8M
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
88.8M
  yxml_setchar(x->data, ch == 0x9 || ch == 0xa ? 0x20 : ch);
180
88.8M
  x->data[1] = 0;
181
88.8M
  return YXML_ATTRVAL;
182
88.8M
}
183
184
39.9M
static yxml_ret_t yxml_pushstack(yxml_t *x, char **res, unsigned ch) {
185
39.9M
  if(x->stacklen+2 >= x->stacksize)
186
9
    return YXML_ESTACK;
187
39.9M
  x->stacklen++;
188
39.9M
  *res = (char *)x->stack+x->stacklen;
189
39.9M
  x->stack[x->stacklen] = (unsigned char)ch;
190
39.9M
  x->stacklen++;
191
39.9M
  x->stack[x->stacklen] = 0;
192
39.9M
  return YXML_OK;
193
39.9M
}
194
195
211M
static yxml_ret_t yxml_pushstackc(yxml_t *x, unsigned ch) {
196
211M
  if(x->stacklen+1 >= x->stacksize)
197
7
    return YXML_ESTACK;
198
211M
  x->stack[x->stacklen] = (unsigned char)ch;
199
211M
  x->stacklen++;
200
211M
  x->stack[x->stacklen] = 0;
201
211M
  return YXML_OK;
202
211M
}
203
204
39.9M
static void yxml_popstack(yxml_t *x) {
205
39.9M
  do
206
291M
    x->stacklen--;
207
291M
  while(x->stack[x->stacklen]);
208
39.9M
}
209
210
33.6M
static inline yxml_ret_t yxml_elemstart  (yxml_t *x, unsigned ch) { return yxml_pushstack(x, &x->elem, ch); }
211
166M
static inline yxml_ret_t yxml_elemname   (yxml_t *x, unsigned ch) { return yxml_pushstackc(x, ch); }
212
33.6M
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.6M
static yxml_ret_t yxml_selfclose(yxml_t *x, unsigned ch) {
217
33.6M
  yxml_popstack(x);
218
33.6M
  if(x->stacklen) {
219
31.7M
    x->elem = (char *)x->stack+x->stacklen-1;
220
216M
    while(*(x->elem-1))
221
184M
      x->elem--;
222
31.7M
    return YXML_ELEMEND;
223
31.7M
  }
224
1.91M
  x->elem = (char *)x->stack;
225
1.91M
  x->state = YXMLS_misc3;
226
1.91M
  return YXML_ELEMEND;
227
33.6M
}
228
229
149M
static inline yxml_ret_t yxml_elemclose(yxml_t *x, unsigned ch) {
230
149M
  if(*((unsigned char *)x->elem) != ch)
231
208
    return YXML_ECLOSE;
232
149M
  x->elem++;
233
149M
  return YXML_OK;
234
149M
}
235
236
17.7M
static inline yxml_ret_t yxml_elemcloseend(yxml_t *x, unsigned ch) {
237
17.7M
  if(*x->elem)
238
9
    return YXML_ECLOSE;
239
17.7M
  return yxml_selfclose(x, ch);
240
17.7M
}
241
242
6.29M
static inline yxml_ret_t yxml_attrstart  (yxml_t *x, unsigned ch) { return yxml_pushstack(x, &x->attr, ch); }
243
44.4M
static inline yxml_ret_t yxml_attrname   (yxml_t *x, unsigned ch) { return yxml_pushstackc(x, ch); }
244
6.29M
static inline yxml_ret_t yxml_attrnameend(yxml_t *x, unsigned ch) { return YXML_ATTRSTART; }
245
6.29M
static inline yxml_ret_t yxml_attrvalend (yxml_t *x, unsigned ch) { yxml_popstack(x); return YXML_ATTREND; }
246
247
9.26k
static inline yxml_ret_t yxml_pistart  (yxml_t *x, unsigned ch) { return yxml_pushstack(x, &x->pi, ch); }
248
13.0k
static inline yxml_ret_t yxml_piname   (yxml_t *x, unsigned ch) { return yxml_pushstackc(x, ch); }
249
1.15k
static inline yxml_ret_t yxml_piabort  (yxml_t *x, unsigned ch) { yxml_popstack(x); return YXML_OK; }
250
7.47k
static inline yxml_ret_t yxml_pinameend(yxml_t *x, unsigned ch) {
251
7.47k
  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.47k
}
253
7.12k
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.15k
static inline yxml_ret_t yxml_refstart(yxml_t *x, unsigned ch) {
256
9.15k
  memset(x->data, 0, sizeof(x->data));
257
9.15k
  x->reflen = 0;
258
9.15k
  return YXML_OK;
259
9.15k
}
260
261
37.3k
static yxml_ret_t yxml_ref(yxml_t *x, unsigned ch) {
262
37.3k
  if(x->reflen >= sizeof(x->data)-1)
263
35
    return YXML_EREF;
264
37.3k
  yxml_setchar(x->data+x->reflen, ch);
265
37.3k
  x->reflen++;
266
37.3k
  return YXML_OK;
267
37.3k
}
268
269
8.91k
static yxml_ret_t yxml_refend(yxml_t *x, yxml_ret_t ret) {
270
8.91k
  unsigned char *r = (unsigned char *)x->data;
271
8.91k
  unsigned ch = 0;
272
8.91k
  if(*r == '#') {
273
6.50k
    if(r[1] == 'x')
274
16.0k
      for(r += 2; yxml_isHex((unsigned)*r); r++)
275
12.0k
        ch = (ch<<4) + (*r <= '9' ? *r-'0' : (*r|32)-'a' + 10);
276
2.57k
    else
277
9.58k
      for(r++; yxml_isNum((unsigned)*r); r++)
278
7.01k
        ch = (ch*10) + (*r-'0');
279
6.50k
    if(*r)
280
22
      ch = 0;
281
6.50k
  } 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.98k
      i == INTFROM5CHARS('a','m','p', 0, 0) ? '&' :
287
1.59k
      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.91k
  if(!ch || ch > 0x10FFFF || ch == 0xFFFE || ch == 0xFFFF || (ch-0xDFFF) < 0x7FF)
293
406
    return YXML_EREF;
294
8.51k
  yxml_setutf8(x->data, ch);
295
8.51k
  return ret;
296
8.91k
}
297
298
7.69k
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.91M
void yxml_init(yxml_t *x, void *stack, size_t stacksize) {
302
1.91M
  memset(x, 0, sizeof(*x));
303
1.91M
  x->line = 1;
304
1.91M
  x->stack = (unsigned char*)stack;
305
1.91M
  x->stacksize = stacksize;
306
1.91M
  *x->stack = 0;
307
1.91M
  x->elem = x->pi = x->attr = (char *)x->stack;
308
1.91M
  x->state = YXMLS_init;
309
1.91M
}
310
311
3.79G
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.79G
  unsigned ch = (unsigned)(_ch+256) & 0xff;
315
3.79G
  if(!ch)
316
13
    return YXML_ESYN;
317
3.79G
  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.79G
  if(x->ignore == ch) {
324
1.90k
    x->ignore = 0;
325
1.90k
    return YXML_OK;
326
1.90k
  }
327
3.79G
  x->ignore = (ch == 0xd) * 0xa;
328
3.79G
  if(ch == 0xa || ch == 0xd) {
329
3.78M
    ch = 0xa;
330
3.78M
    x->line++;
331
3.78M
    x->byte = 0;
332
3.78M
  }
333
3.79G
  x->byte++;
334
335
3.79G
  switch((yxml_state_t)x->state) {
336
22.5k
  case YXMLS_string:
337
22.5k
    if(ch == *x->string) {
338
22.5k
      x->string++;
339
22.5k
      if(!*x->string)
340
4.23k
        x->state = x->nextstate;
341
22.5k
      return YXML_OK;
342
22.5k
    }
343
26
    break;
344
50.7M
  case YXMLS_attr0:
345
50.7M
    if(yxml_isName(ch))
346
44.4M
      return yxml_attrname(x, ch);
347
6.29M
    if(yxml_isSP(ch)) {
348
2.39M
      x->state = YXMLS_attr1;
349
2.39M
      return yxml_attrnameend(x, ch);
350
2.39M
    }
351
3.90M
    if(ch == (unsigned char)'=') {
352
3.90M
      x->state = YXMLS_attr2;
353
3.90M
      return yxml_attrnameend(x, ch);
354
3.90M
    }
355
52
    break;
356
2.39M
  case YXMLS_attr1:
357
2.39M
    if(yxml_isSP(ch))
358
4.23k
      return YXML_OK;
359
2.39M
    if(ch == (unsigned char)'=') {
360
2.39M
      x->state = YXMLS_attr2;
361
2.39M
      return YXML_OK;
362
2.39M
    }
363
41
    break;
364
6.30M
  case YXMLS_attr2:
365
6.30M
    if(yxml_isSP(ch))
366
1.30k
      return YXML_OK;
367
6.29M
    if(ch == (unsigned char)'\'' || ch == (unsigned char)'"') {
368
6.29M
      x->state = YXMLS_attr3;
369
6.29M
      x->quote = ch;
370
6.29M
      return YXML_OK;
371
6.29M
    }
372
40
    break;
373
95.1M
  case YXMLS_attr3:
374
95.1M
    if(yxml_isAttValue(ch))
375
88.8M
      return yxml_dataattr(x, ch);
376
6.29M
    if(ch == (unsigned char)'&') {
377
1.33k
      x->state = YXMLS_attr4;
378
1.33k
      return yxml_refstart(x, ch);
379
1.33k
    }
380
6.29M
    if(x->quote == ch) {
381
6.29M
      x->state = YXMLS_elem2;
382
6.29M
      return yxml_attrvalend(x, ch);
383
6.29M
    }
384
2
    break;
385
5.38k
  case YXMLS_attr4:
386
5.38k
    if(yxml_isRef(ch))
387
4.13k
      return yxml_ref(x, ch);
388
1.25k
    if(ch == (unsigned char)'\x3b') {
389
1.21k
      x->state = YXMLS_attr3;
390
1.21k
      return yxml_refattrval(x, ch);
391
1.21k
    }
392
35
    break;
393
9.91k
  case YXMLS_cd0:
394
9.91k
    if(ch == (unsigned char)']') {
395
1.77k
      x->state = YXMLS_cd1;
396
1.77k
      return YXML_OK;
397
1.77k
    }
398
8.13k
    if(yxml_isChar(ch))
399
8.13k
      return yxml_datacontent(x, ch);
400
0
    break;
401
1.76k
  case YXMLS_cd1:
402
1.76k
    if(ch == (unsigned char)']') {
403
1.25k
      x->state = YXMLS_cd2;
404
1.25k
      return YXML_OK;
405
1.25k
    }
406
509
    if(yxml_isChar(ch)) {
407
509
      x->state = YXMLS_cd0;
408
509
      return yxml_datacd1(x, ch);
409
509
    }
410
0
    break;
411
1.91k
  case YXMLS_cd2:
412
1.91k
    if(ch == (unsigned char)']')
413
690
      return yxml_datacontent(x, ch);
414
1.22k
    if(ch == (unsigned char)'>') {
415
582
      x->state = YXMLS_misc2;
416
582
      return YXML_OK;
417
582
    }
418
647
    if(yxml_isChar(ch)) {
419
647
      x->state = YXMLS_cd0;
420
647
      return yxml_datacd2(x, ch);
421
647
    }
422
0
    break;
423
437
  case YXMLS_comment0:
424
437
    if(ch == (unsigned char)'-') {
425
414
      x->state = YXMLS_comment1;
426
414
      return YXML_OK;
427
414
    }
428
23
    break;
429
2.21k
  case YXMLS_comment1:
430
2.21k
    if(ch == (unsigned char)'-') {
431
2.19k
      x->state = YXMLS_comment2;
432
2.19k
      return YXML_OK;
433
2.19k
    }
434
23
    break;
435
3.36k
  case YXMLS_comment2:
436
3.36k
    if(ch == (unsigned char)'-') {
437
2.72k
      x->state = YXMLS_comment3;
438
2.72k
      return YXML_OK;
439
2.72k
    }
440
640
    if(yxml_isChar(ch))
441
640
      return YXML_OK;
442
0
    break;
443
2.71k
  case YXMLS_comment3:
444
2.71k
    if(ch == (unsigned char)'-') {
445
2.08k
      x->state = YXMLS_comment4;
446
2.08k
      return YXML_OK;
447
2.08k
    }
448
626
    if(yxml_isChar(ch)) {
449
626
      x->state = YXMLS_comment2;
450
626
      return YXML_OK;
451
626
    }
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
23
    break;
459
3.80k
  case YXMLS_dt0:
460
3.80k
    if(ch == (unsigned char)'>') {
461
569
      x->state = YXMLS_misc1;
462
569
      return YXML_OK;
463
569
    }
464
3.23k
    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.16k
    if(ch == (unsigned char)'<') {
471
1.43k
      x->state = YXMLS_dt2;
472
1.43k
      return YXML_OK;
473
1.43k
    }
474
727
    if(yxml_isChar(ch))
475
727
      return YXML_OK;
476
0
    break;
477
2.16k
  case YXMLS_dt1:
478
2.16k
    if(x->quote == ch) {
479
1.75k
      x->state = x->nextstate;
480
1.75k
      return YXML_OK;
481
1.75k
    }
482
410
    if(yxml_isChar(ch))
483
410
      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.02k
  case YXMLS_dt3:
497
1.02k
    if(ch == (unsigned char)'-') {
498
388
      x->state = YXMLS_comment1;
499
388
      x->nextstate = YXMLS_dt0;
500
388
      return YXML_OK;
501
388
    }
502
632
    if(yxml_isChar(ch)) {
503
632
      x->state = YXMLS_dt4;
504
632
      return YXML_OK;
505
632
    }
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
949
    if(ch == (unsigned char)'>') {
515
534
      x->state = YXMLS_dt0;
516
534
      return YXML_OK;
517
534
    }
518
415
    if(yxml_isChar(ch))
519
415
      return YXML_OK;
520
0
    break;
521
200M
  case YXMLS_elem0:
522
200M
    if(yxml_isName(ch))
523
166M
      return yxml_elemname(x, ch);
524
33.6M
    if(yxml_isSP(ch)) {
525
4.84M
      x->state = YXMLS_elem1;
526
4.84M
      return yxml_elemnameend(x, ch);
527
4.84M
    }
528
28.7M
    if(ch == (unsigned char)'/') {
529
11.9M
      x->state = YXMLS_elem3;
530
11.9M
      return yxml_elemnameend(x, ch);
531
11.9M
    }
532
16.8M
    if(ch == (unsigned char)'>') {
533
16.8M
      x->state = YXMLS_misc2;
534
16.8M
      return yxml_elemnameend(x, ch);
535
16.8M
    }
536
59
    break;
537
11.5M
  case YXMLS_elem1:
538
11.5M
    if(yxml_isSP(ch))
539
2.36M
      return YXML_OK;
540
9.18M
    if(ch == (unsigned char)'/') {
541
2.87M
      x->state = YXMLS_elem3;
542
2.87M
      return YXML_OK;
543
2.87M
    }
544
6.30M
    if(ch == (unsigned char)'>') {
545
1.24k
      x->state = YXMLS_misc2;
546
1.24k
      return YXML_OK;
547
1.24k
    }
548
6.29M
    if(yxml_isNameStart(ch)) {
549
6.29M
      x->state = YXMLS_attr0;
550
6.29M
      return yxml_attrstart(x, ch);
551
6.29M
    }
552
50
    break;
553
6.29M
  case YXMLS_elem2:
554
6.29M
    if(yxml_isSP(ch)) {
555
4.33M
      x->state = YXMLS_elem1;
556
4.33M
      return YXML_OK;
557
4.33M
    }
558
1.95M
    if(ch == (unsigned char)'/') {
559
1.05M
      x->state = YXMLS_elem3;
560
1.05M
      return YXML_OK;
561
1.05M
    }
562
901k
    if(ch == (unsigned char)'>') {
563
901k
      x->state = YXMLS_misc2;
564
901k
      return YXML_OK;
565
901k
    }
566
40
    break;
567
15.8M
  case YXMLS_elem3:
568
15.8M
    if(ch == (unsigned char)'>') {
569
15.8M
      x->state = YXMLS_misc2;
570
15.8M
      return yxml_selfclose(x, ch);
571
15.8M
    }
572
21
    break;
573
1.60k
  case YXMLS_enc0:
574
1.60k
    if(yxml_isSP(ch))
575
1.16k
      return YXML_OK;
576
437
    if(ch == (unsigned char)'=') {
577
411
      x->state = YXMLS_enc1;
578
411
      return YXML_OK;
579
411
    }
580
26
    break;
581
1.52k
  case YXMLS_enc1:
582
1.52k
    if(yxml_isSP(ch))
583
1.16k
      return YXML_OK;
584
361
    if(ch == (unsigned char)'\'' || ch == (unsigned char)'"') {
585
321
      x->state = YXMLS_enc2;
586
321
      x->quote = ch;
587
321
      return YXML_OK;
588
321
    }
589
40
    break;
590
317
  case YXMLS_enc2:
591
317
    if(yxml_isAlpha(ch)) {
592
297
      x->state = YXMLS_enc3;
593
297
      return YXML_OK;
594
297
    }
595
20
    break;
596
2.21k
  case YXMLS_enc3:
597
2.21k
    if(yxml_isEncName(ch))
598
2.01k
      return YXML_OK;
599
200
    if(x->quote == ch) {
600
161
      x->state = YXMLS_xmldecl6;
601
161
      return YXML_OK;
602
161
    }
603
39
    break;
604
17.7M
  case YXMLS_etag0:
605
17.7M
    if(yxml_isNameStart(ch)) {
606
17.7M
      x->state = YXMLS_etag1;
607
17.7M
      return yxml_elemclose(x, ch);
608
17.7M
    }
609
35
    break;
610
149M
  case YXMLS_etag1:
611
149M
    if(yxml_isName(ch))
612
131M
      return yxml_elemclose(x, ch);
613
17.7M
    if(yxml_isSP(ch)) {
614
2.05k
      x->state = YXMLS_etag2;
615
2.05k
      return yxml_elemcloseend(x, ch);
616
2.05k
    }
617
17.7M
    if(ch == (unsigned char)'>') {
618
17.7M
      x->state = YXMLS_misc2;
619
17.7M
      return yxml_elemcloseend(x, ch);
620
17.7M
    }
621
46
    break;
622
4.39k
  case YXMLS_etag2:
623
4.39k
    if(yxml_isSP(ch))
624
2.44k
      return YXML_OK;
625
1.95k
    if(ch == (unsigned char)'>') {
626
1.91k
      x->state = YXMLS_misc2;
627
1.91k
      return YXML_OK;
628
1.91k
    }
629
40
    break;
630
1.91M
  case YXMLS_init:
631
1.91M
    if(ch == (unsigned char)'\xef') {
632
41
      x->state = YXMLS_string;
633
41
      x->nextstate = YXMLS_misc0;
634
41
      x->string = (unsigned char *)"\xbb\xbf";
635
41
      return YXML_OK;
636
41
    }
637
1.91M
    if(yxml_isSP(ch)) {
638
207
      x->state = YXMLS_misc0;
639
207
      return YXML_OK;
640
207
    }
641
1.91M
    if(ch == (unsigned char)'<') {
642
1.91M
      x->state = YXMLS_le0;
643
1.91M
      return YXML_OK;
644
1.91M
    }
645
79
    break;
646
1.91M
  case YXMLS_le0:
647
1.91M
    if(ch == (unsigned char)'!') {
648
607
      x->state = YXMLS_lee1;
649
607
      return YXML_OK;
650
607
    }
651
1.91M
    if(ch == (unsigned char)'?') {
652
2.61k
      x->state = YXMLS_leq0;
653
2.61k
      return YXML_OK;
654
2.61k
    }
655
1.91M
    if(yxml_isNameStart(ch)) {
656
1.91M
      x->state = YXMLS_elem0;
657
1.91M
      return yxml_elemstart(x, ch);
658
1.91M
    }
659
48
    break;
660
4.60k
  case YXMLS_le1:
661
4.60k
    if(ch == (unsigned char)'!') {
662
1.36k
      x->state = YXMLS_lee1;
663
1.36k
      return YXML_OK;
664
1.36k
    }
665
3.24k
    if(ch == (unsigned char)'?') {
666
2.80k
      x->state = YXMLS_pi0;
667
2.80k
      x->nextstate = YXMLS_misc1;
668
2.80k
      return YXML_OK;
669
2.80k
    }
670
433
    if(yxml_isNameStart(ch)) {
671
399
      x->state = YXMLS_elem0;
672
399
      return yxml_elemstart(x, ch);
673
399
    }
674
34
    break;
675
49.4M
  case YXMLS_le2:
676
49.4M
    if(ch == (unsigned char)'!') {
677
1.23k
      x->state = YXMLS_lee2;
678
1.23k
      return YXML_OK;
679
1.23k
    }
680
49.4M
    if(ch == (unsigned char)'?') {
681
2.86k
      x->state = YXMLS_pi0;
682
2.86k
      x->nextstate = YXMLS_misc2;
683
2.86k
      return YXML_OK;
684
2.86k
    }
685
49.4M
    if(ch == (unsigned char)'/') {
686
17.7M
      x->state = YXMLS_etag0;
687
17.7M
      return YXML_OK;
688
17.7M
    }
689
31.7M
    if(yxml_isNameStart(ch)) {
690
31.7M
      x->state = YXMLS_elem0;
691
31.7M
      return yxml_elemstart(x, ch);
692
31.7M
    }
693
58
    break;
694
1.20k
  case YXMLS_le3:
695
1.20k
    if(ch == (unsigned char)'!') {
696
447
      x->state = YXMLS_comment0;
697
447
      x->nextstate = YXMLS_misc3;
698
447
      return YXML_OK;
699
447
    }
700
761
    if(ch == (unsigned char)'?') {
701
724
      x->state = YXMLS_pi0;
702
724
      x->nextstate = YXMLS_misc3;
703
724
      return YXML_OK;
704
724
    }
705
37
    break;
706
1.95k
  case YXMLS_lee1:
707
1.95k
    if(ch == (unsigned char)'-') {
708
1.00k
      x->state = YXMLS_comment1;
709
1.00k
      x->nextstate = YXMLS_misc1;
710
1.00k
      return YXML_OK;
711
1.00k
    }
712
954
    if(ch == (unsigned char)'D') {
713
914
      x->state = YXMLS_string;
714
914
      x->nextstate = YXMLS_dt0;
715
914
      x->string = (unsigned char *)"OCTYPE";
716
914
      return YXML_OK;
717
914
    }
718
40
    break;
719
1.22k
  case YXMLS_lee2:
720
1.22k
    if(ch == (unsigned char)'-') {
721
470
      x->state = YXMLS_comment1;
722
470
      x->nextstate = YXMLS_misc2;
723
470
      return YXML_OK;
724
470
    }
725
755
    if(ch == (unsigned char)'[') {
726
726
      x->state = YXMLS_string;
727
726
      x->nextstate = YXMLS_cd0;
728
726
      x->string = (unsigned char *)"CDATA[";
729
726
      return YXML_OK;
730
726
    }
731
29
    break;
732
2.61k
  case YXMLS_leq0:
733
2.61k
    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
694
    if(yxml_isNameStart(ch)) {
739
655
      x->state = YXMLS_pi1;
740
655
      x->nextstate = YXMLS_misc1;
741
655
      return yxml_pistart(x, ch);
742
655
    }
743
39
    break;
744
2.42k
  case YXMLS_misc0:
745
2.42k
    if(yxml_isSP(ch))
746
2.30k
      return YXML_OK;
747
118
    if(ch == (unsigned char)'<') {
748
64
      x->state = YXMLS_le0;
749
64
      return YXML_OK;
750
64
    }
751
54
    break;
752
6.00k
  case YXMLS_misc1:
753
6.00k
    if(yxml_isSP(ch))
754
1.35k
      return YXML_OK;
755
4.65k
    if(ch == (unsigned char)'<') {
756
4.61k
      x->state = YXMLS_le1;
757
4.61k
      return YXML_OK;
758
4.61k
    }
759
31
    break;
760
3.18G
  case YXMLS_misc2:
761
3.18G
    if(ch == (unsigned char)'<') {
762
49.4M
      x->state = YXMLS_le2;
763
49.4M
      return YXML_OK;
764
49.4M
    }
765
3.13G
    if(ch == (unsigned char)'&') {
766
7.82k
      x->state = YXMLS_misc2a;
767
7.82k
      return yxml_refstart(x, ch);
768
7.82k
    }
769
3.13G
    if(yxml_isChar(ch))
770
3.13G
      return yxml_datacontent(x, ch);
771
0
    break;
772
40.9k
  case YXMLS_misc2a:
773
40.9k
    if(yxml_isRef(ch))
774
33.2k
      return yxml_ref(x, ch);
775
7.74k
    if(ch == (unsigned char)'\x3b') {
776
7.69k
      x->state = YXMLS_misc2;
777
7.69k
      return yxml_refcontent(x, ch);
778
7.69k
    }
779
46
    break;
780
2.48k
  case YXMLS_misc3:
781
2.48k
    if(yxml_isSP(ch))
782
1.21k
      return YXML_OK;
783
1.26k
    if(ch == (unsigned char)'<') {
784
1.21k
      x->state = YXMLS_le3;
785
1.21k
      return YXML_OK;
786
1.21k
    }
787
47
    break;
788
6.72k
  case YXMLS_pi0:
789
6.72k
    if(yxml_isNameStart(ch)) {
790
6.68k
      x->state = YXMLS_pi1;
791
6.68k
      return yxml_pistart(x, ch);
792
6.68k
    }
793
35
    break;
794
16.9k
  case YXMLS_pi1:
795
16.9k
    if(yxml_isName(ch))
796
9.55k
      return yxml_piname(x, ch);
797
7.41k
    if(ch == (unsigned char)'?') {
798
4.69k
      x->state = YXMLS_pi4;
799
4.69k
      return yxml_pinameend(x, ch);
800
4.69k
    }
801
2.72k
    if(yxml_isSP(ch)) {
802
2.67k
      x->state = YXMLS_pi2;
803
2.67k
      return yxml_pinameend(x, ch);
804
2.67k
    }
805
52
    break;
806
77.2k
  case YXMLS_pi2:
807
77.2k
    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
676
    if(yxml_isChar(ch)) {
820
676
      x->state = YXMLS_pi2;
821
676
      return yxml_datapi2(x, ch);
822
676
    }
823
0
    break;
824
4.63k
  case YXMLS_pi4:
825
4.63k
    if(ch == (unsigned char)'>') {
826
4.60k
      x->state = x->nextstate;
827
4.60k
      return yxml_pivalend(x, ch);
828
4.60k
    }
829
28
    break;
830
706
  case YXMLS_std0:
831
706
    if(yxml_isSP(ch))
832
582
      return YXML_OK;
833
124
    if(ch == (unsigned char)'=') {
834
108
      x->state = YXMLS_std1;
835
108
      return YXML_OK;
836
108
    }
837
16
    break;
838
667
  case YXMLS_std1:
839
667
    if(yxml_isSP(ch))
840
584
      return YXML_OK;
841
83
    if(ch == (unsigned char)'\'' || ch == (unsigned char)'"') {
842
68
      x->state = YXMLS_std2;
843
68
      x->quote = ch;
844
68
      return YXML_OK;
845
68
    }
846
15
    break;
847
66
  case YXMLS_std2:
848
66
    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
63
    if(ch == (unsigned char)'n') {
855
53
      x->state = YXMLS_string;
856
53
      x->nextstate = YXMLS_std3;
857
53
      x->string = (unsigned char *)"o";
858
53
      return YXML_OK;
859
53
    }
860
10
    break;
861
53
  case YXMLS_std3:
862
53
    if(x->quote == ch) {
863
52
      x->state = YXMLS_xmldecl8;
864
52
      return YXML_OK;
865
52
    }
866
1
    break;
867
2.16k
  case YXMLS_ver0:
868
2.16k
    if(yxml_isSP(ch))
869
1.16k
      return YXML_OK;
870
1.00k
    if(ch == (unsigned char)'=') {
871
979
      x->state = YXMLS_ver1;
872
979
      return YXML_OK;
873
979
    }
874
23
    break;
875
2.09k
  case YXMLS_ver1:
876
2.09k
    if(yxml_isSP(ch))
877
1.16k
      return YXML_OK;
878
930
    if(ch == (unsigned char)'\'' || ch == (unsigned char)'"') {
879
885
      x->state = YXMLS_string;
880
885
      x->quote = ch;
881
885
      x->nextstate = YXMLS_ver2;
882
885
      x->string = (unsigned char *)"1.";
883
885
      return YXML_OK;
884
885
    }
885
45
    break;
886
879
  case YXMLS_ver2:
887
879
    if(yxml_isNum(ch)) {
888
860
      x->state = YXMLS_ver3;
889
860
      return YXML_OK;
890
860
    }
891
19
    break;
892
1.24k
  case YXMLS_ver3:
893
1.24k
    if(yxml_isNum(ch))
894
412
      return YXML_OK;
895
837
    if(x->quote == ch) {
896
807
      x->state = YXMLS_xmldecl4;
897
807
      return YXML_OK;
898
807
    }
899
30
    break;
900
1.91k
  case YXMLS_xmldecl0:
901
1.91k
    if(ch == (unsigned char)'m') {
902
1.61k
      x->state = YXMLS_xmldecl1;
903
1.61k
      return yxml_piname(x, ch);
904
1.61k
    }
905
297
    if(yxml_isName(ch)) {
906
156
      x->state = YXMLS_pi1;
907
156
      return yxml_piname(x, ch);
908
156
    }
909
141
    if(ch == (unsigned char)'?') {
910
44
      x->state = YXMLS_pi4;
911
44
      return yxml_pinameend(x, ch);
912
44
    }
913
97
    if(yxml_isSP(ch)) {
914
40
      x->state = YXMLS_pi2;
915
40
      return yxml_pinameend(x, ch);
916
40
    }
917
57
    break;
918
1.61k
  case YXMLS_xmldecl1:
919
1.61k
    if(ch == (unsigned char)'l') {
920
1.41k
      x->state = YXMLS_xmldecl2;
921
1.41k
      return yxml_piname(x, ch);
922
1.41k
    }
923
207
    if(yxml_isName(ch)) {
924
118
      x->state = YXMLS_pi1;
925
118
      return yxml_piname(x, ch);
926
118
    }
927
89
    if(ch == (unsigned char)'?') {
928
6
      x->state = YXMLS_pi4;
929
6
      return yxml_pinameend(x, ch);
930
6
    }
931
83
    if(yxml_isSP(ch)) {
932
21
      x->state = YXMLS_pi2;
933
21
      return yxml_pinameend(x, ch);
934
21
    }
935
62
    break;
936
1.40k
  case YXMLS_xmldecl2:
937
1.40k
    if(yxml_isSP(ch)) {
938
1.15k
      x->state = YXMLS_xmldecl3;
939
1.15k
      return yxml_piabort(x, ch);
940
1.15k
    }
941
256
    if(yxml_isName(ch)) {
942
215
      x->state = YXMLS_pi1;
943
215
      return yxml_piname(x, ch);
944
215
    }
945
41
    break;
946
2.26k
  case YXMLS_xmldecl3:
947
2.26k
    if(yxml_isSP(ch))
948
1.16k
      return YXML_OK;
949
1.09k
    if(ch == (unsigned char)'v') {
950
1.05k
      x->state = YXMLS_string;
951
1.05k
      x->nextstate = YXMLS_ver0;
952
1.05k
      x->string = (unsigned char *)"ersion";
953
1.05k
      return YXML_OK;
954
1.05k
    }
955
42
    break;
956
805
  case YXMLS_xmldecl4:
957
805
    if(yxml_isSP(ch)) {
958
746
      x->state = YXMLS_xmldecl5;
959
746
      return YXML_OK;
960
746
    }
961
59
    if(ch == (unsigned char)'?') {
962
22
      x->state = YXMLS_xmldecl9;
963
22
      return YXML_OK;
964
22
    }
965
37
    break;
966
1.85k
  case YXMLS_xmldecl5:
967
1.85k
    if(yxml_isSP(ch))
968
1.16k
      return YXML_OK;
969
692
    if(ch == (unsigned char)'?') {
970
19
      x->state = YXMLS_xmldecl9;
971
19
      return YXML_OK;
972
19
    }
973
673
    if(ch == (unsigned char)'e') {
974
488
      x->state = YXMLS_string;
975
488
      x->nextstate = YXMLS_enc0;
976
488
      x->string = (unsigned char *)"ncoding";
977
488
      return YXML_OK;
978
488
    }
979
185
    if(ch == (unsigned char)'s') {
980
146
      x->state = YXMLS_string;
981
146
      x->nextstate = YXMLS_std0;
982
146
      x->string = (unsigned char *)"tandalone";
983
146
      return YXML_OK;
984
146
    }
985
39
    break;
986
160
  case YXMLS_xmldecl6:
987
160
    if(yxml_isSP(ch)) {
988
122
      x->state = YXMLS_xmldecl7;
989
122
      return YXML_OK;
990
122
    }
991
38
    if(ch == (unsigned char)'?') {
992
11
      x->state = YXMLS_xmldecl9;
993
11
      return YXML_OK;
994
11
    }
995
27
    break;
996
1.23k
  case YXMLS_xmldecl7:
997
1.23k
    if(yxml_isSP(ch))
998
1.16k
      return YXML_OK;
999
68
    if(ch == (unsigned char)'?') {
1000
14
      x->state = YXMLS_xmldecl9;
1001
14
      return YXML_OK;
1002
14
    }
1003
54
    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
48
    break;
1010
623
  case YXMLS_xmldecl8:
1011
623
    if(yxml_isSP(ch))
1012
596
      return YXML_OK;
1013
27
    if(ch == (unsigned char)'?') {
1014
13
      x->state = YXMLS_xmldecl9;
1015
13
      return YXML_OK;
1016
13
    }
1017
14
    break;
1018
70
  case YXMLS_xmldecl9:
1019
70
    if(ch == (unsigned char)'>') {
1020
58
      x->state = YXMLS_misc1;
1021
58
      return YXML_OK;
1022
58
    }
1023
12
    break;
1024
3.79G
  }
1025
1.88k
  return YXML_ESYN;
1026
3.79G
}
1027
1028
1.91M
yxml_ret_t yxml_eof(yxml_t *x) {
1029
1.91M
  if(x->state != YXMLS_misc3)
1030
4.36k
    return YXML_EEOF;
1031
1.91M
  return YXML_OK;
1032
1.91M
}
1033