Coverage Report

Created: 2026-10-05 06:46

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/open62541_15/deps/yxml.c
Line
Count
Source
1
/* This file is generated by yxml-gen.pl using yxml-states and yxml.c.in as input files.
2
 * It is preferable to edit those files instead of this one if you want to make a change.
3
 * The source files can be found through the homepage: https://dev.yorhel.nl/yxml */
4
5
/* Copyright (c) 2013-2014 Yoran Heling
6
7
  Permission is hereby granted, free of charge, to any person obtaining
8
  a copy of this software and associated documentation files (the
9
  "Software"), to deal in the Software without restriction, including
10
  without limitation the rights to use, copy, modify, merge, publish,
11
  distribute, sublicense, and/or sell copies of the Software, and to
12
  permit persons to whom the Software is furnished to do so, subject to
13
  the following conditions:
14
15
  The above copyright notice and this permission notice shall be included
16
  in all copies or substantial portions of the Software.
17
18
  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
19
  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20
  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
21
  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
22
  CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23
  TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24
  SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25
*/
26
27
#include "yxml.h"
28
#include <string.h>
29
30
typedef enum {
31
  YXMLS_string,
32
  YXMLS_attr0,
33
  YXMLS_attr1,
34
  YXMLS_attr2,
35
  YXMLS_attr3,
36
  YXMLS_attr4,
37
  YXMLS_cd0,
38
  YXMLS_cd1,
39
  YXMLS_cd2,
40
  YXMLS_comment0,
41
  YXMLS_comment1,
42
  YXMLS_comment2,
43
  YXMLS_comment3,
44
  YXMLS_comment4,
45
  YXMLS_dt0,
46
  YXMLS_dt1,
47
  YXMLS_dt2,
48
  YXMLS_dt3,
49
  YXMLS_dt4,
50
  YXMLS_elem0,
51
  YXMLS_elem1,
52
  YXMLS_elem2,
53
  YXMLS_elem3,
54
  YXMLS_enc0,
55
  YXMLS_enc1,
56
  YXMLS_enc2,
57
  YXMLS_enc3,
58
  YXMLS_etag0,
59
  YXMLS_etag1,
60
  YXMLS_etag2,
61
  YXMLS_init,
62
  YXMLS_le0,
63
  YXMLS_le1,
64
  YXMLS_le2,
65
  YXMLS_le3,
66
  YXMLS_lee1,
67
  YXMLS_lee2,
68
  YXMLS_leq0,
69
  YXMLS_misc0,
70
  YXMLS_misc1,
71
  YXMLS_misc2,
72
  YXMLS_misc2a,
73
  YXMLS_misc3,
74
  YXMLS_pi0,
75
  YXMLS_pi1,
76
  YXMLS_pi2,
77
  YXMLS_pi3,
78
  YXMLS_pi4,
79
  YXMLS_std0,
80
  YXMLS_std1,
81
  YXMLS_std2,
82
  YXMLS_std3,
83
  YXMLS_ver0,
84
  YXMLS_ver1,
85
  YXMLS_ver2,
86
  YXMLS_ver3,
87
  YXMLS_xmldecl0,
88
  YXMLS_xmldecl1,
89
  YXMLS_xmldecl2,
90
  YXMLS_xmldecl3,
91
  YXMLS_xmldecl4,
92
  YXMLS_xmldecl5,
93
  YXMLS_xmldecl6,
94
  YXMLS_xmldecl7,
95
  YXMLS_xmldecl8,
96
  YXMLS_xmldecl9
97
} yxml_state_t;
98
99
5.16G
#define yxml_isChar(c) 1
100
/* 0xd should be part of SP, too, but yxml_parse() already normalizes that into 0xa */
101
107M
#define yxml_isSP(c) (c == 0x20 || c == 0x09 || c == 0x0a)
102
1.39G
#define yxml_isAlpha(c) ((c|32)-'a' < 26)
103
720M
#define yxml_isNum(c) (c-'0' < 10)
104
4.91k
#define yxml_isHex(c) (yxml_isNum(c) || (c|32)-'a' < 6)
105
2.14k
#define yxml_isEncName(c) (yxml_isAlpha(c) || yxml_isNum(c) || c == '.' || c == '_' || c == '-')
106
1.28G
#define yxml_isNameStart(c) (yxml_isAlpha(c) || c == ':' || c == '_' || c >= 128)
107
600M
#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
144M
#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
16.3M
#define yxml_isRef(c) (yxml_isNum(c) || yxml_isAlpha(c) || c == '#')
114
115
19.0M
#define INTFROM5CHARS(a, b, c, d, e) ((((uint64_t)(a))<<32) | (((uint64_t)(b))<<24) | (((uint64_t)(c))<<16) | (((uint64_t)(d))<<8) | (uint64_t)(e))
116
117
/* Set the given char value to ch (0<=ch<=255). */
118
5.02G
static inline void yxml_setchar(char *dest, unsigned ch) {
119
5.02G
  *(unsigned char *)dest = (unsigned char)ch;
120
5.02G
}
121
122
/* Similar to yxml_setchar(), but will convert ch (any valid unicode point) to
123
 * UTF-8 and appends a '\0'. dest must have room for at least 5 bytes. */
124
3.30M
static void yxml_setutf8(char *dest, unsigned ch) {
125
3.30M
  if(ch <= 0x007F)
126
3.30M
    yxml_setchar(dest++, ch);
127
1.87k
  else if(ch <= 0x07FF) {
128
468
    yxml_setchar(dest++, 0xC0 | (ch>>6));
129
468
    yxml_setchar(dest++, 0x80 | (ch & 0x3F));
130
1.40k
  } else if(ch <= 0xFFFF) {
131
625
    yxml_setchar(dest++, 0xE0 | (ch>>12));
132
625
    yxml_setchar(dest++, 0x80 | ((ch>>6) & 0x3F));
133
625
    yxml_setchar(dest++, 0x80 | (ch & 0x3F));
134
781
  } else {
135
781
    yxml_setchar(dest++, 0xF0 | (ch>>18));
136
781
    yxml_setchar(dest++, 0x80 | ((ch>>12) & 0x3F));
137
781
    yxml_setchar(dest++, 0x80 | ((ch>>6) & 0x3F));
138
781
    yxml_setchar(dest++, 0x80 | (ch & 0x3F));
139
781
  }
140
3.30M
  *dest = 0;
141
3.30M
}
142
143
4.87G
static inline yxml_ret_t yxml_datacontent(yxml_t *x, unsigned ch) {
144
4.87G
  yxml_setchar(x->data, ch);
145
4.87G
  x->data[1] = 0;
146
4.87G
  return YXML_CONTENT;
147
4.87G
}
148
149
3.36k
static inline yxml_ret_t yxml_datapi1(yxml_t *x, unsigned ch) {
150
3.36k
  yxml_setchar(x->data, ch);
151
3.36k
  x->data[1] = 0;
152
3.36k
  return YXML_PICONTENT;
153
3.36k
}
154
155
779
static inline yxml_ret_t yxml_datapi2(yxml_t *x, unsigned ch) {
156
779
  x->data[0] = '?';
157
779
  yxml_setchar(x->data+1, ch);
158
779
  x->data[2] = 0;
159
779
  return YXML_PICONTENT;
160
779
}
161
162
510
static inline yxml_ret_t yxml_datacd1(yxml_t *x, unsigned ch) {
163
510
  x->data[0] = ']';
164
510
  yxml_setchar(x->data+1, ch);
165
510
  x->data[2] = 0;
166
510
  return YXML_CONTENT;
167
510
}
168
169
458
static inline yxml_ret_t yxml_datacd2(yxml_t *x, unsigned ch) {
170
458
  x->data[0] = ']';
171
458
  x->data[1] = ']';
172
458
  yxml_setchar(x->data+2, ch);
173
458
  x->data[3] = 0;
174
458
  return YXML_CONTENT;
175
458
}
176
177
138M
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
138M
  yxml_setchar(x->data, ch == 0x9 || ch == 0xa ? 0x20 : ch);
180
138M
  x->data[1] = 0;
181
138M
  return YXML_ATTRVAL;
182
138M
}
183
184
55.3M
static yxml_ret_t yxml_pushstack(yxml_t *x, char **res, unsigned ch) {
185
55.3M
  if(x->stacklen+2 >= x->stacksize)
186
9
    return YXML_ESTACK;
187
55.3M
  x->stacklen++;
188
55.3M
  *res = (char *)x->stack+x->stacklen;
189
55.3M
  x->stack[x->stacklen] = (unsigned char)ch;
190
55.3M
  x->stacklen++;
191
55.3M
  x->stack[x->stacklen] = 0;
192
55.3M
  return YXML_OK;
193
55.3M
}
194
195
316M
static yxml_ret_t yxml_pushstackc(yxml_t *x, unsigned ch) {
196
316M
  if(x->stacklen+1 >= x->stacksize)
197
7
    return YXML_ESTACK;
198
316M
  x->stack[x->stacklen] = (unsigned char)ch;
199
316M
  x->stacklen++;
200
316M
  x->stack[x->stacklen] = 0;
201
316M
  return YXML_OK;
202
316M
}
203
204
55.3M
static void yxml_popstack(yxml_t *x) {
205
55.3M
  do
206
427M
    x->stacklen--;
207
427M
  while(x->stack[x->stacklen]);
208
55.3M
}
209
210
49.4M
static inline yxml_ret_t yxml_elemstart  (yxml_t *x, unsigned ch) { return yxml_pushstack(x, &x->elem, ch); }
211
255M
static inline yxml_ret_t yxml_elemname   (yxml_t *x, unsigned ch) { return yxml_pushstackc(x, ch); }
212
49.4M
static inline yxml_ret_t yxml_elemnameend(yxml_t *x, unsigned ch) { return YXML_ELEMSTART; }
213
214
/* Also used in yxml_elemcloseend(), since this function just removes the last
215
 * element from the stack and returns ELEMEND. */
216
49.4M
static yxml_ret_t yxml_selfclose(yxml_t *x, unsigned ch) {
217
49.4M
  yxml_popstack(x);
218
49.4M
  if(x->stacklen) {
219
46.4M
    x->elem = (char *)x->stack+x->stacklen-1;
220
338M
    while(*(x->elem-1))
221
292M
      x->elem--;
222
46.4M
    return YXML_ELEMEND;
223
46.4M
  }
224
2.96M
  x->elem = (char *)x->stack;
225
2.96M
  x->state = x->contentmode ? YXMLS_misc2 : YXMLS_misc3;
226
2.96M
  return YXML_ELEMEND;
227
49.4M
}
228
229
228M
static inline yxml_ret_t yxml_elemclose(yxml_t *x, unsigned ch) {
230
228M
  if(*((unsigned char *)x->elem) != ch)
231
193
    return YXML_ECLOSE;
232
228M
  x->elem++;
233
228M
  return YXML_OK;
234
228M
}
235
236
27.1M
static inline yxml_ret_t yxml_elemcloseend(yxml_t *x, unsigned ch) {
237
27.1M
  if(*x->elem)
238
3
    return YXML_ECLOSE;
239
27.1M
  return yxml_selfclose(x, ch);
240
27.1M
}
241
242
5.95M
static inline yxml_ret_t yxml_attrstart  (yxml_t *x, unsigned ch) { return yxml_pushstack(x, &x->attr, ch); }
243
61.1M
static inline yxml_ret_t yxml_attrname   (yxml_t *x, unsigned ch) { return yxml_pushstackc(x, ch); }
244
5.95M
static inline yxml_ret_t yxml_attrnameend(yxml_t *x, unsigned ch) { return YXML_ATTRSTART; }
245
5.95M
static inline yxml_ret_t yxml_attrvalend (yxml_t *x, unsigned ch) { yxml_popstack(x); return YXML_ATTREND; }
246
247
9.45k
static inline yxml_ret_t yxml_pistart  (yxml_t *x, unsigned ch) { return yxml_pushstack(x, &x->pi, ch); }
248
12.7k
static inline yxml_ret_t yxml_piname   (yxml_t *x, unsigned ch) { return yxml_pushstackc(x, ch); }
249
1.19k
static inline yxml_ret_t yxml_piabort  (yxml_t *x, unsigned ch) { yxml_popstack(x); return YXML_OK; }
250
7.72k
static inline yxml_ret_t yxml_pinameend(yxml_t *x, unsigned ch) {
251
7.72k
  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.72k
}
253
7.41k
static inline yxml_ret_t yxml_pivalend (yxml_t *x, unsigned ch) { yxml_popstack(x); x->pi = (char *)x->stack; return YXML_PIEND; }
254
255
3.30M
static inline yxml_ret_t yxml_refstart(yxml_t *x, unsigned ch) {
256
3.30M
  memset(x->data, 0, sizeof(x->data));
257
3.30M
  x->reflen = 0;
258
3.30M
  return YXML_OK;
259
3.30M
}
260
261
13.0M
static yxml_ret_t yxml_ref(yxml_t *x, unsigned ch) {
262
13.0M
  if(x->reflen >= sizeof(x->data)-1)
263
40
    return YXML_EREF;
264
13.0M
  yxml_setchar(x->data+x->reflen, ch);
265
13.0M
  x->reflen++;
266
13.0M
  return YXML_OK;
267
13.0M
}
268
269
3.30M
static yxml_ret_t yxml_refend(yxml_t *x, yxml_ret_t ret) {
270
3.30M
  unsigned char *r = (unsigned char *)x->data;
271
3.30M
  unsigned ch = 0;
272
3.30M
  if(*r == '#') {
273
6.91k
    if(r[1] == 'x')
274
4.91k
      for(r += 2; yxml_isHex((unsigned)*r); r++)
275
3.49k
        ch = (ch<<4) + (*r <= '9' ? *r-'0' : (*r|32)-'a' + 10);
276
5.49k
    else
277
15.0k
      for(r++; yxml_isNum((unsigned)*r); r++)
278
9.58k
        ch = (ch*10) + (*r-'0');
279
6.91k
    if(*r)
280
24
      ch = 0;
281
3.29M
  } else {
282
3.29M
    uint64_t i = INTFROM5CHARS(r[0], r[1], r[2], r[3], r[4]);
283
3.29M
    ch =
284
3.29M
      i == INTFROM5CHARS('l','t', 0,  0, 0) ? '<' :
285
3.29M
      i == INTFROM5CHARS('g','t', 0,  0, 0) ? '>' :
286
3.29M
      i == INTFROM5CHARS('a','m','p', 0, 0) ? '&' :
287
3.22M
      i == INTFROM5CHARS('a','p','o','s',0) ? '\'':
288
3.21M
      i == INTFROM5CHARS('q','u','o','t',0) ? '"' : 0;
289
3.29M
  }
290
291
  /* Codepoints not allowed in the XML 1.1 definition of a Char */
292
3.30M
  if(!ch || ch > 0x10FFFF || ch == 0xFFFE || ch == 0xFFFF || (ch-0xDFFF) < 0x7FF)
293
384
    return YXML_EREF;
294
3.30M
  yxml_setutf8(x->data, ch);
295
3.30M
  x->isReference = true;
296
3.30M
  return ret;
297
3.30M
}
298
299
3.30M
static inline yxml_ret_t yxml_refcontent(yxml_t *x, unsigned ch) { return yxml_refend(x, YXML_CONTENT); }
300
1.57k
static inline yxml_ret_t yxml_refattrval(yxml_t *x, unsigned ch) { return yxml_refend(x, YXML_ATTRVAL); }
301
302
2.93M
void yxml_init(yxml_t *x, void *stack, size_t stacksize) {
303
2.93M
  memset(x, 0, sizeof(*x));
304
2.93M
  x->line = 1;
305
2.93M
  x->stack = (unsigned char*)stack;
306
2.93M
  x->stacksize = stacksize;
307
2.93M
  *x->stack = 0;
308
2.93M
  x->elem = x->pi = x->attr = (char *)x->stack;
309
2.93M
  x->state = YXMLS_init;
310
2.93M
}
311
312
372
void yxml_init_content(yxml_t *x, void *stack, size_t stacksize) {
313
372
  yxml_init(x, stack, stacksize);
314
372
  x->contentmode = true;
315
372
  x->state = YXMLS_misc2;
316
372
}
317
318
5.86G
yxml_ret_t yxml_parse(yxml_t *x, int _ch) {
319
5.86G
  x->isReference = false;
320
321
  /* Ensure that characters are in the range of 0..255 rather than -126..125.
322
   * All character comparisons are done with positive integers. */
323
5.86G
  unsigned ch = (unsigned)(_ch+256) & 0xff;
324
5.86G
  if(!ch)
325
9
    return YXML_ESYN;
326
5.86G
  x->total++;
327
328
  /* End-of-Line normalization, "\rX", "\r\n" and "\n" are recognized and
329
   * normalized to a single '\n' as per XML 1.0 section 2.11. XML 1.1 adds
330
   * some non-ASCII character sequences to this list, but we can only handle
331
   * ASCII here without making assumptions about the input encoding. */
332
5.86G
  if(x->ignore == ch) {
333
20.2k
    x->ignore = 0;
334
20.2k
    return YXML_OK;
335
20.2k
  }
336
5.86G
  x->ignore = (ch == 0xd) * 0xa;
337
5.86G
  if(ch == 0xa || ch == 0xd) {
338
5.43M
    ch = 0xa;
339
5.43M
    x->line++;
340
5.43M
    x->byte = 0;
341
5.43M
  }
342
5.86G
  x->byte++;
343
344
5.86G
  switch((yxml_state_t)x->state) {
345
23.8k
  case YXMLS_string:
346
23.8k
    if(ch == *x->string) {
347
23.8k
      x->string++;
348
23.8k
      if(!*x->string)
349
4.48k
        x->state = x->nextstate;
350
23.8k
      return YXML_OK;
351
23.8k
    }
352
23
    break;
353
67.1M
  case YXMLS_attr0:
354
67.1M
    if(yxml_isName(ch))
355
61.1M
      return yxml_attrname(x, ch);
356
5.95M
    if(yxml_isSP(ch)) {
357
1.01M
      x->state = YXMLS_attr1;
358
1.01M
      return yxml_attrnameend(x, ch);
359
1.01M
    }
360
4.94M
    if(ch == (unsigned char)'=') {
361
4.94M
      x->state = YXMLS_attr2;
362
4.94M
      return yxml_attrnameend(x, ch);
363
4.94M
    }
364
46
    break;
365
1.01M
  case YXMLS_attr1:
366
1.01M
    if(yxml_isSP(ch))
367
1.18k
      return YXML_OK;
368
1.01M
    if(ch == (unsigned char)'=') {
369
1.01M
      x->state = YXMLS_attr2;
370
1.01M
      return YXML_OK;
371
1.01M
    }
372
36
    break;
373
5.95M
  case YXMLS_attr2:
374
5.95M
    if(yxml_isSP(ch))
375
1.17k
      return YXML_OK;
376
5.95M
    if(ch == (unsigned char)'\'' || ch == (unsigned char)'"') {
377
5.95M
      x->state = YXMLS_attr3;
378
5.95M
      x->quote = ch;
379
5.95M
      return YXML_OK;
380
5.95M
    }
381
36
    break;
382
144M
  case YXMLS_attr3:
383
144M
    if(yxml_isAttValue(ch))
384
138M
      return yxml_dataattr(x, ch);
385
5.95M
    if(ch == (unsigned char)'&') {
386
1.68k
      x->state = YXMLS_attr4;
387
1.68k
      return yxml_refstart(x, ch);
388
1.68k
    }
389
5.95M
    if(x->quote == ch) {
390
5.95M
      x->state = YXMLS_elem2;
391
5.95M
      return yxml_attrvalend(x, ch);
392
5.95M
    }
393
2
    break;
394
6.14k
  case YXMLS_attr4:
395
6.14k
    if(yxml_isRef(ch))
396
4.53k
      return yxml_ref(x, ch);
397
1.60k
    if(ch == (unsigned char)'\x3b') {
398
1.57k
      x->state = YXMLS_attr3;
399
1.57k
      return yxml_refattrval(x, ch);
400
1.57k
    }
401
29
    break;
402
2.34k
  case YXMLS_cd0:
403
2.34k
    if(ch == (unsigned char)']') {
404
1.49k
      x->state = YXMLS_cd1;
405
1.49k
      return YXML_OK;
406
1.49k
    }
407
855
    if(yxml_isChar(ch))
408
855
      return yxml_datacontent(x, ch);
409
0
    break;
410
1.47k
  case YXMLS_cd1:
411
1.47k
    if(ch == (unsigned char)']') {
412
969
      x->state = YXMLS_cd2;
413
969
      return YXML_OK;
414
969
    }
415
510
    if(yxml_isChar(ch)) {
416
510
      x->state = YXMLS_cd0;
417
510
      return yxml_datacd1(x, ch);
418
510
    }
419
0
    break;
420
1.35k
  case YXMLS_cd2:
421
1.35k
    if(ch == (unsigned char)']')
422
416
      return yxml_datacontent(x, ch);
423
941
    if(ch == (unsigned char)'>') {
424
483
      x->state = YXMLS_misc2;
425
483
      return YXML_OK;
426
483
    }
427
458
    if(yxml_isChar(ch)) {
428
458
      x->state = YXMLS_cd0;
429
458
      return yxml_datacd2(x, ch);
430
458
    }
431
0
    break;
432
447
  case YXMLS_comment0:
433
447
    if(ch == (unsigned char)'-') {
434
429
      x->state = YXMLS_comment1;
435
429
      return YXML_OK;
436
429
    }
437
18
    break;
438
5.44k
  case YXMLS_comment1:
439
5.44k
    if(ch == (unsigned char)'-') {
440
5.43k
      x->state = YXMLS_comment2;
441
5.43k
      return YXML_OK;
442
5.43k
    }
443
17
    break;
444
8.21k
  case YXMLS_comment2:
445
8.21k
    if(ch == (unsigned char)'-') {
446
6.12k
      x->state = YXMLS_comment3;
447
6.12k
      return YXML_OK;
448
6.12k
    }
449
2.08k
    if(yxml_isChar(ch))
450
2.08k
      return YXML_OK;
451
0
    break;
452
6.11k
  case YXMLS_comment3:
453
6.11k
    if(ch == (unsigned char)'-') {
454
5.33k
      x->state = YXMLS_comment4;
455
5.33k
      return YXML_OK;
456
5.33k
    }
457
777
    if(yxml_isChar(ch)) {
458
777
      x->state = YXMLS_comment2;
459
777
      return YXML_OK;
460
777
    }
461
0
    break;
462
5.32k
  case YXMLS_comment4:
463
5.32k
    if(ch == (unsigned char)'>') {
464
5.31k
      x->state = x->nextstate;
465
5.31k
      return YXML_OK;
466
5.31k
    }
467
8
    break;
468
3.92k
  case YXMLS_dt0:
469
3.92k
    if(ch == (unsigned char)'>') {
470
655
      x->state = YXMLS_misc1;
471
655
      return YXML_OK;
472
655
    }
473
3.27k
    if(ch == (unsigned char)'\'' || ch == (unsigned char)'"') {
474
1.18k
      x->state = YXMLS_dt1;
475
1.18k
      x->quote = ch;
476
1.18k
      x->nextstate = YXMLS_dt0;
477
1.18k
      return YXML_OK;
478
1.18k
    }
479
2.09k
    if(ch == (unsigned char)'<') {
480
1.66k
      x->state = YXMLS_dt2;
481
1.66k
      return YXML_OK;
482
1.66k
    }
483
423
    if(yxml_isChar(ch))
484
423
      return YXML_OK;
485
0
    break;
486
2.26k
  case YXMLS_dt1:
487
2.26k
    if(x->quote == ch) {
488
1.87k
      x->state = x->nextstate;
489
1.87k
      return YXML_OK;
490
1.87k
    }
491
390
    if(yxml_isChar(ch))
492
390
      return YXML_OK;
493
0
    break;
494
1.65k
  case YXMLS_dt2:
495
1.65k
    if(ch == (unsigned char)'?') {
496
388
      x->state = YXMLS_pi0;
497
388
      x->nextstate = YXMLS_dt0;
498
388
      return YXML_OK;
499
388
    }
500
1.26k
    if(ch == (unsigned char)'!') {
501
1.23k
      x->state = YXMLS_dt3;
502
1.23k
      return YXML_OK;
503
1.23k
    }
504
27
    break;
505
1.22k
  case YXMLS_dt3:
506
1.22k
    if(ch == (unsigned char)'-') {
507
388
      x->state = YXMLS_comment1;
508
388
      x->nextstate = YXMLS_dt0;
509
388
      return YXML_OK;
510
388
    }
511
837
    if(yxml_isChar(ch)) {
512
837
      x->state = YXMLS_dt4;
513
837
      return YXML_OK;
514
837
    }
515
0
    break;
516
1.92k
  case YXMLS_dt4:
517
1.92k
    if(ch == (unsigned char)'\'' || ch == (unsigned char)'"') {
518
777
      x->state = YXMLS_dt1;
519
777
      x->quote = ch;
520
777
      x->nextstate = YXMLS_dt4;
521
777
      return YXML_OK;
522
777
    }
523
1.15k
    if(ch == (unsigned char)'>') {
524
743
      x->state = YXMLS_dt0;
525
743
      return YXML_OK;
526
743
    }
527
407
    if(yxml_isChar(ch))
528
407
      return YXML_OK;
529
0
    break;
530
304M
  case YXMLS_elem0:
531
304M
    if(yxml_isName(ch))
532
255M
      return yxml_elemname(x, ch);
533
49.4M
    if(yxml_isSP(ch)) {
534
4.22M
      x->state = YXMLS_elem1;
535
4.22M
      return yxml_elemnameend(x, ch);
536
4.22M
    }
537
45.2M
    if(ch == (unsigned char)'/') {
538
19.3M
      x->state = YXMLS_elem3;
539
19.3M
      return yxml_elemnameend(x, ch);
540
19.3M
    }
541
25.8M
    if(ch == (unsigned char)'>') {
542
25.8M
      x->state = YXMLS_misc2;
543
25.8M
      return yxml_elemnameend(x, ch);
544
25.8M
    }
545
47
    break;
546
9.01M
  case YXMLS_elem1:
547
9.01M
    if(yxml_isSP(ch))
548
1.83M
      return YXML_OK;
549
7.18M
    if(ch == (unsigned char)'/') {
550
1.22M
      x->state = YXMLS_elem3;
551
1.22M
      return YXML_OK;
552
1.22M
    }
553
5.95M
    if(ch == (unsigned char)'>') {
554
841
      x->state = YXMLS_misc2;
555
841
      return YXML_OK;
556
841
    }
557
5.95M
    if(yxml_isNameStart(ch)) {
558
5.95M
      x->state = YXMLS_attr0;
559
5.95M
      return yxml_attrstart(x, ch);
560
5.95M
    }
561
49
    break;
562
5.95M
  case YXMLS_elem2:
563
5.95M
    if(yxml_isSP(ch)) {
564
2.95M
      x->state = YXMLS_elem1;
565
2.95M
      return YXML_OK;
566
2.95M
    }
567
3.00M
    if(ch == (unsigned char)'/') {
568
1.61M
      x->state = YXMLS_elem3;
569
1.61M
      return YXML_OK;
570
1.61M
    }
571
1.38M
    if(ch == (unsigned char)'>') {
572
1.38M
      x->state = YXMLS_misc2;
573
1.38M
      return YXML_OK;
574
1.38M
    }
575
39
    break;
576
22.2M
  case YXMLS_elem3:
577
22.2M
    if(ch == (unsigned char)'>') {
578
22.2M
      x->state = YXMLS_misc2;
579
22.2M
      return yxml_selfclose(x, ch);
580
22.2M
    }
581
24
    break;
582
1.58k
  case YXMLS_enc0:
583
1.58k
    if(yxml_isSP(ch))
584
1.16k
      return YXML_OK;
585
415
    if(ch == (unsigned char)'=') {
586
376
      x->state = YXMLS_enc1;
587
376
      return YXML_OK;
588
376
    }
589
39
    break;
590
1.49k
  case YXMLS_enc1:
591
1.49k
    if(yxml_isSP(ch))
592
1.16k
      return YXML_OK;
593
326
    if(ch == (unsigned char)'\'' || ch == (unsigned char)'"') {
594
298
      x->state = YXMLS_enc2;
595
298
      x->quote = ch;
596
298
      return YXML_OK;
597
298
    }
598
28
    break;
599
294
  case YXMLS_enc2:
600
294
    if(yxml_isAlpha(ch)) {
601
277
      x->state = YXMLS_enc3;
602
277
      return YXML_OK;
603
277
    }
604
17
    break;
605
2.14k
  case YXMLS_enc3:
606
2.14k
    if(yxml_isEncName(ch))
607
1.95k
      return YXML_OK;
608
186
    if(x->quote == ch) {
609
158
      x->state = YXMLS_xmldecl6;
610
158
      return YXML_OK;
611
158
    }
612
28
    break;
613
27.1M
  case YXMLS_etag0:
614
27.1M
    if(yxml_isNameStart(ch)) {
615
27.1M
      x->state = YXMLS_etag1;
616
27.1M
      return yxml_elemclose(x, ch);
617
27.1M
    }
618
31
    break;
619
228M
  case YXMLS_etag1:
620
228M
    if(yxml_isName(ch))
621
201M
      return yxml_elemclose(x, ch);
622
27.1M
    if(yxml_isSP(ch)) {
623
2.52k
      x->state = YXMLS_etag2;
624
2.52k
      return yxml_elemcloseend(x, ch);
625
2.52k
    }
626
27.1M
    if(ch == (unsigned char)'>') {
627
27.1M
      x->state = YXMLS_misc2;
628
27.1M
      return yxml_elemcloseend(x, ch);
629
27.1M
    }
630
39
    break;
631
18.6k
  case YXMLS_etag2:
632
18.6k
    if(yxml_isSP(ch))
633
16.5k
      return YXML_OK;
634
2.09k
    if(ch == (unsigned char)'>') {
635
2.05k
      x->state = YXMLS_misc2;
636
2.05k
      return YXML_OK;
637
2.05k
    }
638
34
    break;
639
2.93M
  case YXMLS_init:
640
2.93M
    if(ch == (unsigned char)'\xef') {
641
36
      x->state = YXMLS_string;
642
36
      x->nextstate = YXMLS_misc0;
643
36
      x->string = (unsigned char *)"\xbb\xbf";
644
36
      return YXML_OK;
645
36
    }
646
2.93M
    if(yxml_isSP(ch)) {
647
227
      x->state = YXMLS_misc0;
648
227
      return YXML_OK;
649
227
    }
650
2.93M
    if(ch == (unsigned char)'<') {
651
2.93M
      x->state = YXMLS_le0;
652
2.93M
      return YXML_OK;
653
2.93M
    }
654
57
    break;
655
2.93M
  case YXMLS_le0:
656
2.93M
    if(ch == (unsigned char)'!') {
657
555
      x->state = YXMLS_lee1;
658
555
      return YXML_OK;
659
555
    }
660
2.93M
    if(ch == (unsigned char)'?') {
661
2.47k
      x->state = YXMLS_leq0;
662
2.47k
      return YXML_OK;
663
2.47k
    }
664
2.93M
    if(yxml_isNameStart(ch)) {
665
2.93M
      x->state = YXMLS_elem0;
666
2.93M
      return yxml_elemstart(x, ch);
667
2.93M
    }
668
43
    break;
669
5.23k
  case YXMLS_le1:
670
5.23k
    if(ch == (unsigned char)'!') {
671
1.59k
      x->state = YXMLS_lee1;
672
1.59k
      return YXML_OK;
673
1.59k
    }
674
3.64k
    if(ch == (unsigned char)'?') {
675
3.25k
      x->state = YXMLS_pi0;
676
3.25k
      x->nextstate = YXMLS_misc1;
677
3.25k
      return YXML_OK;
678
3.25k
    }
679
388
    if(yxml_isNameStart(ch)) {
680
362
      x->state = YXMLS_elem0;
681
362
      return yxml_elemstart(x, ch);
682
362
    }
683
26
    break;
684
73.6M
  case YXMLS_le2:
685
73.6M
    if(ch == (unsigned char)'!') {
686
4.23k
      x->state = YXMLS_lee2;
687
4.23k
      return YXML_OK;
688
4.23k
    }
689
73.6M
    if(ch == (unsigned char)'?') {
690
2.71k
      x->state = YXMLS_pi0;
691
2.71k
      x->nextstate = YXMLS_misc2;
692
2.71k
      return YXML_OK;
693
2.71k
    }
694
73.6M
    if(ch == (unsigned char)'/') {
695
27.1M
      x->state = YXMLS_etag0;
696
27.1M
      return YXML_OK;
697
27.1M
    }
698
46.4M
    if(yxml_isNameStart(ch)) {
699
46.4M
      x->state = YXMLS_elem0;
700
46.4M
      return yxml_elemstart(x, ch);
701
46.4M
    }
702
44
    break;
703
1.21k
  case YXMLS_le3:
704
1.21k
    if(ch == (unsigned char)'!') {
705
458
      x->state = YXMLS_comment0;
706
458
      x->nextstate = YXMLS_misc3;
707
458
      return YXML_OK;
708
458
    }
709
756
    if(ch == (unsigned char)'?') {
710
737
      x->state = YXMLS_pi0;
711
737
      x->nextstate = YXMLS_misc3;
712
737
      return YXML_OK;
713
737
    }
714
19
    break;
715
2.12k
  case YXMLS_lee1:
716
2.12k
    if(ch == (unsigned char)'-') {
717
1.11k
      x->state = YXMLS_comment1;
718
1.11k
      x->nextstate = YXMLS_misc1;
719
1.11k
      return YXML_OK;
720
1.11k
    }
721
1.01k
    if(ch == (unsigned char)'D') {
722
992
      x->state = YXMLS_string;
723
992
      x->nextstate = YXMLS_dt0;
724
992
      x->string = (unsigned char *)"OCTYPE";
725
992
      return YXML_OK;
726
992
    }
727
22
    break;
728
4.22k
  case YXMLS_lee2:
729
4.22k
    if(ch == (unsigned char)'-') {
730
3.57k
      x->state = YXMLS_comment1;
731
3.57k
      x->nextstate = YXMLS_misc2;
732
3.57k
      return YXML_OK;
733
3.57k
    }
734
649
    if(ch == (unsigned char)'[') {
735
622
      x->state = YXMLS_string;
736
622
      x->nextstate = YXMLS_cd0;
737
622
      x->string = (unsigned char *)"CDATA[";
738
622
      return YXML_OK;
739
622
    }
740
27
    break;
741
2.47k
  case YXMLS_leq0:
742
2.47k
    if(ch == (unsigned char)'x') {
743
1.85k
      x->state = YXMLS_xmldecl0;
744
1.85k
      x->nextstate = YXMLS_misc1;
745
1.85k
      return yxml_pistart(x, ch);
746
1.85k
    }
747
619
    if(yxml_isNameStart(ch)) {
748
591
      x->state = YXMLS_pi1;
749
591
      x->nextstate = YXMLS_misc1;
750
591
      return yxml_pistart(x, ch);
751
591
    }
752
28
    break;
753
2.46k
  case YXMLS_misc0:
754
2.46k
    if(yxml_isSP(ch))
755
2.32k
      return YXML_OK;
756
141
    if(ch == (unsigned char)'<') {
757
101
      x->state = YXMLS_le0;
758
101
      return YXML_OK;
759
101
    }
760
40
    break;
761
6.46k
  case YXMLS_misc1:
762
6.46k
    if(yxml_isSP(ch))
763
1.18k
      return YXML_OK;
764
5.27k
    if(ch == (unsigned char)'<') {
765
5.24k
      x->state = YXMLS_le1;
766
5.24k
      return YXML_OK;
767
5.24k
    }
768
26
    break;
769
4.95G
  case YXMLS_misc2:
770
4.95G
    if(ch == (unsigned char)'<') {
771
73.6M
      x->state = YXMLS_le2;
772
73.6M
      return YXML_OK;
773
73.6M
    }
774
4.87G
    if(ch == (unsigned char)'&') {
775
3.30M
      x->state = YXMLS_misc2a;
776
3.30M
      return yxml_refstart(x, ch);
777
3.30M
    }
778
4.87G
    if(yxml_isChar(ch))
779
4.87G
      return yxml_datacontent(x, ch);
780
0
    break;
781
16.3M
  case YXMLS_misc2a:
782
16.3M
    if(yxml_isRef(ch))
783
13.0M
      return yxml_ref(x, ch);
784
3.30M
    if(ch == (unsigned char)'\x3b') {
785
3.30M
      x->state = YXMLS_misc2;
786
3.30M
      return yxml_refcontent(x, ch);
787
3.30M
    }
788
33
    break;
789
2.44k
  case YXMLS_misc3:
790
2.44k
    if(yxml_isSP(ch))
791
1.17k
      return YXML_OK;
792
1.26k
    if(ch == (unsigned char)'<') {
793
1.22k
      x->state = YXMLS_le3;
794
1.22k
      return YXML_OK;
795
1.22k
    }
796
39
    break;
797
7.04k
  case YXMLS_pi0:
798
7.04k
    if(yxml_isNameStart(ch)) {
799
7.00k
      x->state = YXMLS_pi1;
800
7.00k
      return yxml_pistart(x, ch);
801
7.00k
    }
802
32
    break;
803
16.9k
  case YXMLS_pi1:
804
16.9k
    if(yxml_isName(ch))
805
9.30k
      return yxml_piname(x, ch);
806
7.66k
    if(ch == (unsigned char)'?') {
807
4.94k
      x->state = YXMLS_pi4;
808
4.94k
      return yxml_pinameend(x, ch);
809
4.94k
    }
810
2.72k
    if(yxml_isSP(ch)) {
811
2.68k
      x->state = YXMLS_pi2;
812
2.68k
      return yxml_pinameend(x, ch);
813
2.68k
    }
814
44
    break;
815
6.71k
  case YXMLS_pi2:
816
6.71k
    if(ch == (unsigned char)'?') {
817
3.34k
      x->state = YXMLS_pi3;
818
3.34k
      return YXML_OK;
819
3.34k
    }
820
3.36k
    if(yxml_isChar(ch))
821
3.36k
      return yxml_datapi1(x, ch);
822
0
    break;
823
3.33k
  case YXMLS_pi3:
824
3.33k
    if(ch == (unsigned char)'>') {
825
2.55k
      x->state = x->nextstate;
826
2.55k
      return yxml_pivalend(x, ch);
827
2.55k
    }
828
779
    if(yxml_isChar(ch)) {
829
779
      x->state = YXMLS_pi2;
830
779
      return yxml_datapi2(x, ch);
831
779
    }
832
0
    break;
833
4.86k
  case YXMLS_pi4:
834
4.86k
    if(ch == (unsigned char)'>') {
835
4.86k
      x->state = x->nextstate;
836
4.86k
      return yxml_pivalend(x, ch);
837
4.86k
    }
838
5
    break;
839
1.40k
  case YXMLS_std0:
840
1.40k
    if(yxml_isSP(ch))
841
1.17k
      return YXML_OK;
842
230
    if(ch == (unsigned char)'=') {
843
199
      x->state = YXMLS_std1;
844
199
      return YXML_OK;
845
199
    }
846
31
    break;
847
1.31k
  case YXMLS_std1:
848
1.31k
    if(yxml_isSP(ch))
849
1.16k
      return YXML_OK;
850
149
    if(ch == (unsigned char)'\'' || ch == (unsigned char)'"') {
851
134
      x->state = YXMLS_std2;
852
134
      x->quote = ch;
853
134
      return YXML_OK;
854
134
    }
855
15
    break;
856
130
  case YXMLS_std2:
857
130
    if(ch == (unsigned char)'y') {
858
6
      x->state = YXMLS_string;
859
6
      x->nextstate = YXMLS_std3;
860
6
      x->string = (unsigned char *)"es";
861
6
      return YXML_OK;
862
6
    }
863
124
    if(ch == (unsigned char)'n') {
864
104
      x->state = YXMLS_string;
865
104
      x->nextstate = YXMLS_std3;
866
104
      x->string = (unsigned char *)"o";
867
104
      return YXML_OK;
868
104
    }
869
20
    break;
870
105
  case YXMLS_std3:
871
105
    if(x->quote == ch) {
872
101
      x->state = YXMLS_xmldecl8;
873
101
      return YXML_OK;
874
101
    }
875
4
    break;
876
2.22k
  case YXMLS_ver0:
877
2.22k
    if(yxml_isSP(ch))
878
1.16k
      return YXML_OK;
879
1.05k
    if(ch == (unsigned char)'=') {
880
1.03k
      x->state = YXMLS_ver1;
881
1.03k
      return YXML_OK;
882
1.03k
    }
883
27
    break;
884
2.14k
  case YXMLS_ver1:
885
2.14k
    if(yxml_isSP(ch))
886
1.16k
      return YXML_OK;
887
981
    if(ch == (unsigned char)'\'' || ch == (unsigned char)'"') {
888
949
      x->state = YXMLS_string;
889
949
      x->quote = ch;
890
949
      x->nextstate = YXMLS_ver2;
891
949
      x->string = (unsigned char *)"1.";
892
949
      return YXML_OK;
893
949
    }
894
32
    break;
895
943
  case YXMLS_ver2:
896
943
    if(yxml_isNum(ch)) {
897
929
      x->state = YXMLS_ver3;
898
929
      return YXML_OK;
899
929
    }
900
14
    break;
901
1.30k
  case YXMLS_ver3:
902
1.30k
    if(yxml_isNum(ch))
903
392
      return YXML_OK;
904
911
    if(x->quote == ch) {
905
892
      x->state = YXMLS_xmldecl4;
906
892
      return YXML_OK;
907
892
    }
908
19
    break;
909
1.85k
  case YXMLS_xmldecl0:
910
1.85k
    if(ch == (unsigned char)'m') {
911
1.58k
      x->state = YXMLS_xmldecl1;
912
1.58k
      return yxml_piname(x, ch);
913
1.58k
    }
914
271
    if(yxml_isName(ch)) {
915
144
      x->state = YXMLS_pi1;
916
144
      return yxml_piname(x, ch);
917
144
    }
918
127
    if(ch == (unsigned char)'?') {
919
28
      x->state = YXMLS_pi4;
920
28
      return yxml_pinameend(x, ch);
921
28
    }
922
99
    if(yxml_isSP(ch)) {
923
48
      x->state = YXMLS_pi2;
924
48
      return yxml_pinameend(x, ch);
925
48
    }
926
51
    break;
927
1.58k
  case YXMLS_xmldecl1:
928
1.58k
    if(ch == (unsigned char)'l') {
929
1.40k
      x->state = YXMLS_xmldecl2;
930
1.40k
      return yxml_piname(x, ch);
931
1.40k
    }
932
174
    if(yxml_isName(ch)) {
933
100
      x->state = YXMLS_pi1;
934
100
      return yxml_piname(x, ch);
935
100
    }
936
74
    if(ch == (unsigned char)'?') {
937
6
      x->state = YXMLS_pi4;
938
6
      return yxml_pinameend(x, ch);
939
6
    }
940
68
    if(yxml_isSP(ch)) {
941
21
      x->state = YXMLS_pi2;
942
21
      return yxml_pinameend(x, ch);
943
21
    }
944
47
    break;
945
1.40k
  case YXMLS_xmldecl2:
946
1.40k
    if(yxml_isSP(ch)) {
947
1.19k
      x->state = YXMLS_xmldecl3;
948
1.19k
      return yxml_piabort(x, ch);
949
1.19k
    }
950
211
    if(yxml_isName(ch)) {
951
183
      x->state = YXMLS_pi1;
952
183
      return yxml_piname(x, ch);
953
183
    }
954
28
    break;
955
2.30k
  case YXMLS_xmldecl3:
956
2.30k
    if(yxml_isSP(ch))
957
1.16k
      return YXML_OK;
958
1.14k
    if(ch == (unsigned char)'v') {
959
1.10k
      x->state = YXMLS_string;
960
1.10k
      x->nextstate = YXMLS_ver0;
961
1.10k
      x->string = (unsigned char *)"ersion";
962
1.10k
      return YXML_OK;
963
1.10k
    }
964
34
    break;
965
890
  case YXMLS_xmldecl4:
966
890
    if(yxml_isSP(ch)) {
967
846
      x->state = YXMLS_xmldecl5;
968
846
      return YXML_OK;
969
846
    }
970
44
    if(ch == (unsigned char)'?') {
971
24
      x->state = YXMLS_xmldecl9;
972
24
      return YXML_OK;
973
24
    }
974
20
    break;
975
1.99k
  case YXMLS_xmldecl5:
976
1.99k
    if(yxml_isSP(ch))
977
1.20k
      return YXML_OK;
978
792
    if(ch == (unsigned char)'?') {
979
14
      x->state = YXMLS_xmldecl9;
980
14
      return YXML_OK;
981
14
    }
982
778
    if(ch == (unsigned char)'e') {
983
466
      x->state = YXMLS_string;
984
466
      x->nextstate = YXMLS_enc0;
985
466
      x->string = (unsigned char *)"ncoding";
986
466
      return YXML_OK;
987
466
    }
988
312
    if(ch == (unsigned char)'s') {
989
274
      x->state = YXMLS_string;
990
274
      x->nextstate = YXMLS_std0;
991
274
      x->string = (unsigned char *)"tandalone";
992
274
      return YXML_OK;
993
274
    }
994
38
    break;
995
156
  case YXMLS_xmldecl6:
996
156
    if(yxml_isSP(ch)) {
997
109
      x->state = YXMLS_xmldecl7;
998
109
      return YXML_OK;
999
109
    }
1000
47
    if(ch == (unsigned char)'?') {
1001
10
      x->state = YXMLS_xmldecl9;
1002
10
      return YXML_OK;
1003
10
    }
1004
37
    break;
1005
1.22k
  case YXMLS_xmldecl7:
1006
1.22k
    if(yxml_isSP(ch))
1007
1.17k
      return YXML_OK;
1008
55
    if(ch == (unsigned char)'?') {
1009
14
      x->state = YXMLS_xmldecl9;
1010
14
      return YXML_OK;
1011
14
    }
1012
41
    if(ch == (unsigned char)'s') {
1013
8
      x->state = YXMLS_string;
1014
8
      x->nextstate = YXMLS_std0;
1015
8
      x->string = (unsigned char *)"tandalone";
1016
8
      return YXML_OK;
1017
8
    }
1018
33
    break;
1019
1.23k
  case YXMLS_xmldecl8:
1020
1.23k
    if(yxml_isSP(ch))
1021
1.18k
      return YXML_OK;
1022
51
    if(ch == (unsigned char)'?') {
1023
18
      x->state = YXMLS_xmldecl9;
1024
18
      return YXML_OK;
1025
18
    }
1026
33
    break;
1027
70
  case YXMLS_xmldecl9:
1028
70
    if(ch == (unsigned char)'>') {
1029
62
      x->state = YXMLS_misc1;
1030
62
      return YXML_OK;
1031
62
    }
1032
8
    break;
1033
5.86G
  }
1034
1.59k
  return YXML_ESYN;
1035
5.86G
}
1036
1037
2.93M
yxml_ret_t yxml_eof(yxml_t *x) {
1038
2.93M
  if(x->state != YXMLS_misc3 &&
1039
4.55k
     !(x->contentmode && x->state == YXMLS_misc2 && x->stacklen == 0))
1040
4.18k
    return YXML_EEOF;
1041
2.92M
  return YXML_OK;
1042
2.93M
}