Coverage Report

Created: 2026-05-16 06:54

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
1.74G
#define yxml_isChar(c) 1
100
/* 0xd should be part of SP, too, but yxml_parse() already normalizes that into 0xa */
101
65.5M
#define yxml_isSP(c) (c == 0x20 || c == 0x09 || c == 0x0a)
102
559M
#define yxml_isAlpha(c) ((c|32)-'a' < 26)
103
281M
#define yxml_isNum(c) (c-'0' < 10)
104
6.79k
#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
519M
#define yxml_isNameStart(c) (yxml_isAlpha(c) || c == ':' || c == '_' || c >= 128)
107
240M
#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
52.6M
#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
31.5k
#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
1.69G
static inline void yxml_setchar(char *dest, unsigned ch) {
119
1.69G
  *(unsigned char *)dest = (unsigned char)ch;
120
1.69G
}
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
6.18k
static void yxml_setutf8(char *dest, unsigned ch) {
125
6.18k
  if(ch <= 0x007F)
126
3.80k
    yxml_setchar(dest++, ch);
127
2.38k
  else if(ch <= 0x07FF) {
128
480
    yxml_setchar(dest++, 0xC0 | (ch>>6));
129
480
    yxml_setchar(dest++, 0x80 | (ch & 0x3F));
130
1.90k
  } else if(ch <= 0xFFFF) {
131
1.14k
    yxml_setchar(dest++, 0xE0 | (ch>>12));
132
1.14k
    yxml_setchar(dest++, 0x80 | ((ch>>6) & 0x3F));
133
1.14k
    yxml_setchar(dest++, 0x80 | (ch & 0x3F));
134
1.14k
  } else {
135
754
    yxml_setchar(dest++, 0xF0 | (ch>>18));
136
754
    yxml_setchar(dest++, 0x80 | ((ch>>12) & 0x3F));
137
754
    yxml_setchar(dest++, 0x80 | ((ch>>6) & 0x3F));
138
754
    yxml_setchar(dest++, 0x80 | (ch & 0x3F));
139
754
  }
140
6.18k
  *dest = 0;
141
6.18k
}
142
143
1.64G
static inline yxml_ret_t yxml_datacontent(yxml_t *x, unsigned ch) {
144
1.64G
  yxml_setchar(x->data, ch);
145
1.64G
  x->data[1] = 0;
146
1.64G
  return YXML_CONTENT;
147
1.64G
}
148
149
186k
static inline yxml_ret_t yxml_datapi1(yxml_t *x, unsigned ch) {
150
186k
  yxml_setchar(x->data, ch);
151
186k
  x->data[1] = 0;
152
186k
  return YXML_PICONTENT;
153
186k
}
154
155
667
static inline yxml_ret_t yxml_datapi2(yxml_t *x, unsigned ch) {
156
667
  x->data[0] = '?';
157
667
  yxml_setchar(x->data+1, ch);
158
667
  x->data[2] = 0;
159
667
  return YXML_PICONTENT;
160
667
}
161
162
250
static inline yxml_ret_t yxml_datacd1(yxml_t *x, unsigned ch) {
163
250
  x->data[0] = ']';
164
250
  yxml_setchar(x->data+1, ch);
165
250
  x->data[2] = 0;
166
250
  return YXML_CONTENT;
167
250
}
168
169
340
static inline yxml_ret_t yxml_datacd2(yxml_t *x, unsigned ch) {
170
340
  x->data[0] = ']';
171
340
  x->data[1] = ']';
172
340
  yxml_setchar(x->data+2, ch);
173
340
  x->data[3] = 0;
174
340
  return YXML_CONTENT;
175
340
}
176
177
46.9M
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
46.9M
  yxml_setchar(x->data, ch == 0x9 || ch == 0xa ? 0x20 : ch);
180
46.9M
  x->data[1] = 0;
181
46.9M
  return YXML_ATTRVAL;
182
46.9M
}
183
184
30.3M
static yxml_ret_t yxml_pushstack(yxml_t *x, char **res, unsigned ch) {
185
30.3M
  if(x->stacklen+2 >= x->stacksize)
186
8
    return YXML_ESTACK;
187
30.3M
  x->stacklen++;
188
30.3M
  *res = (char *)x->stack+x->stacklen;
189
30.3M
  x->stack[x->stacklen] = (unsigned char)ch;
190
30.3M
  x->stacklen++;
191
30.3M
  x->stack[x->stacklen] = 0;
192
30.3M
  return YXML_OK;
193
30.3M
}
194
195
132M
static yxml_ret_t yxml_pushstackc(yxml_t *x, unsigned ch) {
196
132M
  if(x->stacklen+1 >= x->stacksize)
197
6
    return YXML_ESTACK;
198
132M
  x->stack[x->stacklen] = (unsigned char)ch;
199
132M
  x->stacklen++;
200
132M
  x->stack[x->stacklen] = 0;
201
132M
  return YXML_OK;
202
132M
}
203
204
30.3M
static void yxml_popstack(yxml_t *x) {
205
30.3M
  do
206
192M
    x->stacklen--;
207
192M
  while(x->stack[x->stacklen]);
208
30.3M
}
209
210
24.5M
static inline yxml_ret_t yxml_elemstart  (yxml_t *x, unsigned ch) { return yxml_pushstack(x, &x->elem, ch); }
211
87.1M
static inline yxml_ret_t yxml_elemname   (yxml_t *x, unsigned ch) { return yxml_pushstackc(x, ch); }
212
24.5M
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
24.5M
static yxml_ret_t yxml_selfclose(yxml_t *x, unsigned ch) {
217
24.5M
  yxml_popstack(x);
218
24.5M
  if(x->stacklen) {
219
23.5M
    x->elem = (char *)x->stack+x->stacklen-1;
220
133M
    while(*(x->elem-1))
221
109M
      x->elem--;
222
23.5M
    return YXML_ELEMEND;
223
23.5M
  }
224
997k
  x->elem = (char *)x->stack;
225
997k
  x->state = YXMLS_misc3;
226
997k
  return YXML_ELEMEND;
227
24.5M
}
228
229
77.6M
static inline yxml_ret_t yxml_elemclose(yxml_t *x, unsigned ch) {
230
77.6M
  if(*((unsigned char *)x->elem) != ch)
231
197
    return YXML_ECLOSE;
232
77.6M
  x->elem++;
233
77.6M
  return YXML_OK;
234
77.6M
}
235
236
9.25M
static inline yxml_ret_t yxml_elemcloseend(yxml_t *x, unsigned ch) {
237
9.25M
  if(*x->elem)
238
16
    return YXML_ECLOSE;
239
9.25M
  return yxml_selfclose(x, ch);
240
9.25M
}
241
242
5.77M
static inline yxml_ret_t yxml_attrstart  (yxml_t *x, unsigned ch) { return yxml_pushstack(x, &x->attr, ch); }
243
45.0M
static inline yxml_ret_t yxml_attrname   (yxml_t *x, unsigned ch) { return yxml_pushstackc(x, ch); }
244
5.77M
static inline yxml_ret_t yxml_attrnameend(yxml_t *x, unsigned ch) { return YXML_ATTRSTART; }
245
5.77M
static inline yxml_ret_t yxml_attrvalend (yxml_t *x, unsigned ch) { yxml_popstack(x); return YXML_ATTREND; }
246
247
8.78k
static inline yxml_ret_t yxml_pistart  (yxml_t *x, unsigned ch) { return yxml_pushstack(x, &x->pi, ch); }
248
12.8k
static inline yxml_ret_t yxml_piname   (yxml_t *x, unsigned ch) { return yxml_pushstackc(x, ch); }
249
1.14k
static inline yxml_ret_t yxml_piabort  (yxml_t *x, unsigned ch) { yxml_popstack(x); return YXML_OK; }
250
7.04k
static inline yxml_ret_t yxml_pinameend(yxml_t *x, unsigned ch) {
251
7.04k
  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.04k
}
253
6.68k
static inline yxml_ret_t yxml_pivalend (yxml_t *x, unsigned ch) { yxml_popstack(x); x->pi = (char *)x->stack; return YXML_PIEND; }
254
255
6.80k
static inline yxml_ret_t yxml_refstart(yxml_t *x, unsigned ch) {
256
6.80k
  memset(x->data, 0, sizeof(x->data));
257
6.80k
  x->reflen = 0;
258
6.80k
  return YXML_OK;
259
6.80k
}
260
261
24.9k
static yxml_ret_t yxml_ref(yxml_t *x, unsigned ch) {
262
24.9k
  if(x->reflen >= sizeof(x->data)-1)
263
32
    return YXML_EREF;
264
24.8k
  yxml_setchar(x->data+x->reflen, ch);
265
24.8k
  x->reflen++;
266
24.8k
  return YXML_OK;
267
24.9k
}
268
269
6.57k
static yxml_ret_t yxml_refend(yxml_t *x, yxml_ret_t ret) {
270
6.57k
  unsigned char *r = (unsigned char *)x->data;
271
6.57k
  unsigned ch = 0;
272
6.57k
  if(*r == '#') {
273
4.16k
    if(r[1] == 'x')
274
6.79k
      for(r += 2; yxml_isHex((unsigned)*r); r++)
275
4.96k
        ch = (ch<<4) + (*r <= '9' ? *r-'0' : (*r|32)-'a' + 10);
276
2.33k
    else
277
8.58k
      for(r++; yxml_isNum((unsigned)*r); r++)
278
6.24k
        ch = (ch*10) + (*r-'0');
279
4.16k
    if(*r)
280
18
      ch = 0;
281
4.16k
  } 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.96k
      i == INTFROM5CHARS('a','m','p', 0, 0) ? '&' :
287
1.57k
      i == INTFROM5CHARS('a','p','o','s',0) ? '\'':
288
1.19k
      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
6.57k
  if(!ch || ch > 0x10FFFF || ch == 0xFFFE || ch == 0xFFFF || (ch-0xDFFF) < 0x7FF)
293
389
    return YXML_EREF;
294
6.18k
  yxml_setutf8(x->data, ch);
295
6.18k
  return ret;
296
6.57k
}
297
298
5.49k
static inline yxml_ret_t yxml_refcontent(yxml_t *x, unsigned ch) { return yxml_refend(x, YXML_CONTENT); }
299
1.07k
static inline yxml_ret_t yxml_refattrval(yxml_t *x, unsigned ch) { return yxml_refend(x, YXML_ATTRVAL); }
300
301
1.00M
void yxml_init(yxml_t *x, void *stack, size_t stacksize) {
302
1.00M
  memset(x, 0, sizeof(*x));
303
1.00M
  x->line = 1;
304
1.00M
  x->stack = (unsigned char*)stack;
305
1.00M
  x->stacksize = stacksize;
306
1.00M
  *x->stack = 0;
307
1.00M
  x->elem = x->pi = x->attr = (char *)x->stack;
308
1.00M
  x->state = YXMLS_init;
309
1.00M
}
310
311
2.05G
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.05G
  unsigned ch = (unsigned)(_ch+256) & 0xff;
315
2.05G
  if(!ch)
316
10
    return YXML_ESYN;
317
2.05G
  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.05G
  if(x->ignore == ch) {
324
1.30k
    x->ignore = 0;
325
1.30k
    return YXML_OK;
326
1.30k
  }
327
2.05G
  x->ignore = (ch == 0xd) * 0xa;
328
2.05G
  if(ch == 0xa || ch == 0xd) {
329
4.33M
    ch = 0xa;
330
4.33M
    x->line++;
331
4.33M
    x->byte = 0;
332
4.33M
  }
333
2.05G
  x->byte++;
334
335
2.05G
  switch((yxml_state_t)x->state) {
336
17.6k
  case YXMLS_string:
337
17.6k
    if(ch == *x->string) {
338
17.5k
      x->string++;
339
17.5k
      if(!*x->string)
340
3.40k
        x->state = x->nextstate;
341
17.5k
      return YXML_OK;
342
17.5k
    }
343
25
    break;
344
50.7M
  case YXMLS_attr0:
345
50.7M
    if(yxml_isName(ch))
346
45.0M
      return yxml_attrname(x, ch);
347
5.77M
    if(yxml_isSP(ch)) {
348
3.16M
      x->state = YXMLS_attr1;
349
3.16M
      return yxml_attrnameend(x, ch);
350
3.16M
    }
351
2.61M
    if(ch == (unsigned char)'=') {
352
2.61M
      x->state = YXMLS_attr2;
353
2.61M
      return yxml_attrnameend(x, ch);
354
2.61M
    }
355
54
    break;
356
3.16M
  case YXMLS_attr1:
357
3.16M
    if(yxml_isSP(ch))
358
4.25k
      return YXML_OK;
359
3.16M
    if(ch == (unsigned char)'=') {
360
3.16M
      x->state = YXMLS_attr2;
361
3.16M
      return YXML_OK;
362
3.16M
    }
363
32
    break;
364
5.77M
  case YXMLS_attr2:
365
5.77M
    if(yxml_isSP(ch))
366
1.29k
      return YXML_OK;
367
5.77M
    if(ch == (unsigned char)'\'' || ch == (unsigned char)'"') {
368
5.77M
      x->state = YXMLS_attr3;
369
5.77M
      x->quote = ch;
370
5.77M
      return YXML_OK;
371
5.77M
    }
372
40
    break;
373
52.6M
  case YXMLS_attr3:
374
52.6M
    if(yxml_isAttValue(ch))
375
46.9M
      return yxml_dataattr(x, ch);
376
5.77M
    if(ch == (unsigned char)'&') {
377
1.18k
      x->state = YXMLS_attr4;
378
1.18k
      return yxml_refstart(x, ch);
379
1.18k
    }
380
5.77M
    if(x->quote == ch) {
381
5.77M
      x->state = YXMLS_elem2;
382
5.77M
      return yxml_attrvalend(x, ch);
383
5.77M
    }
384
2
    break;
385
4.67k
  case YXMLS_attr4:
386
4.67k
    if(yxml_isRef(ch))
387
3.57k
      return yxml_ref(x, ch);
388
1.10k
    if(ch == (unsigned char)'\x3b') {
389
1.07k
      x->state = YXMLS_attr3;
390
1.07k
      return yxml_refattrval(x, ch);
391
1.07k
    }
392
33
    break;
393
5.33k
  case YXMLS_cd0:
394
5.33k
    if(ch == (unsigned char)']') {
395
909
      x->state = YXMLS_cd1;
396
909
      return YXML_OK;
397
909
    }
398
4.43k
    if(yxml_isChar(ch))
399
4.43k
      return yxml_datacontent(x, ch);
400
0
    break;
401
903
  case YXMLS_cd1:
402
903
    if(ch == (unsigned char)']') {
403
653
      x->state = YXMLS_cd2;
404
653
      return YXML_OK;
405
653
    }
406
250
    if(yxml_isChar(ch)) {
407
250
      x->state = YXMLS_cd0;
408
250
      return yxml_datacd1(x, ch);
409
250
    }
410
0
    break;
411
993
  case YXMLS_cd2:
412
993
    if(ch == (unsigned char)']')
413
354
      return yxml_datacontent(x, ch);
414
639
    if(ch == (unsigned char)'>') {
415
299
      x->state = YXMLS_misc2;
416
299
      return YXML_OK;
417
299
    }
418
340
    if(yxml_isChar(ch)) {
419
340
      x->state = YXMLS_cd0;
420
340
      return yxml_datacd2(x, ch);
421
340
    }
422
0
    break;
423
434
  case YXMLS_comment0:
424
434
    if(ch == (unsigned char)'-') {
425
411
      x->state = YXMLS_comment1;
426
411
      return YXML_OK;
427
411
    }
428
23
    break;
429
1.90k
  case YXMLS_comment1:
430
1.90k
    if(ch == (unsigned char)'-') {
431
1.88k
      x->state = YXMLS_comment2;
432
1.88k
      return YXML_OK;
433
1.88k
    }
434
23
    break;
435
2.99k
  case YXMLS_comment2:
436
2.99k
    if(ch == (unsigned char)'-') {
437
2.39k
      x->state = YXMLS_comment3;
438
2.39k
      return YXML_OK;
439
2.39k
    }
440
600
    if(yxml_isChar(ch))
441
600
      return YXML_OK;
442
0
    break;
443
2.38k
  case YXMLS_comment3:
444
2.38k
    if(ch == (unsigned char)'-') {
445
1.78k
      x->state = YXMLS_comment4;
446
1.78k
      return YXML_OK;
447
1.78k
    }
448
601
    if(yxml_isChar(ch)) {
449
601
      x->state = YXMLS_comment2;
450
601
      return YXML_OK;
451
601
    }
452
0
    break;
453
1.77k
  case YXMLS_comment4:
454
1.77k
    if(ch == (unsigned char)'>') {
455
1.75k
      x->state = x->nextstate;
456
1.75k
      return YXML_OK;
457
1.75k
    }
458
22
    break;
459
2.66k
  case YXMLS_dt0:
460
2.66k
    if(ch == (unsigned char)'>') {
461
314
      x->state = YXMLS_misc1;
462
314
      return YXML_OK;
463
314
    }
464
2.35k
    if(ch == (unsigned char)'\'' || ch == (unsigned char)'"') {
465
691
      x->state = YXMLS_dt1;
466
691
      x->quote = ch;
467
691
      x->nextstate = YXMLS_dt0;
468
691
      return YXML_OK;
469
691
    }
470
1.66k
    if(ch == (unsigned char)'<') {
471
762
      x->state = YXMLS_dt2;
472
762
      return YXML_OK;
473
762
    }
474
900
    if(yxml_isChar(ch))
475
900
      return YXML_OK;
476
0
    break;
477
1.23k
  case YXMLS_dt1:
478
1.23k
    if(x->quote == ch) {
479
1.03k
      x->state = x->nextstate;
480
1.03k
      return YXML_OK;
481
1.03k
    }
482
202
    if(yxml_isChar(ch))
483
202
      return YXML_OK;
484
0
    break;
485
756
  case YXMLS_dt2:
486
756
    if(ch == (unsigned char)'?') {
487
194
      x->state = YXMLS_pi0;
488
194
      x->nextstate = YXMLS_dt0;
489
194
      return YXML_OK;
490
194
    }
491
562
    if(ch == (unsigned char)'!') {
492
559
      x->state = YXMLS_dt3;
493
559
      return YXML_OK;
494
559
    }
495
3
    break;
496
553
  case YXMLS_dt3:
497
553
    if(ch == (unsigned char)'-') {
498
194
      x->state = YXMLS_comment1;
499
194
      x->nextstate = YXMLS_dt0;
500
194
      return YXML_OK;
501
194
    }
502
359
    if(yxml_isChar(ch)) {
503
359
      x->state = YXMLS_dt4;
504
359
      return YXML_OK;
505
359
    }
506
0
    break;
507
903
  case YXMLS_dt4:
508
903
    if(ch == (unsigned char)'\'' || ch == (unsigned char)'"') {
509
388
      x->state = YXMLS_dt1;
510
388
      x->quote = ch;
511
388
      x->nextstate = YXMLS_dt4;
512
388
      return YXML_OK;
513
388
    }
514
515
    if(ch == (unsigned char)'>') {
515
311
      x->state = YXMLS_dt0;
516
311
      return YXML_OK;
517
311
    }
518
204
    if(yxml_isChar(ch))
519
204
      return YXML_OK;
520
0
    break;
521
111M
  case YXMLS_elem0:
522
111M
    if(yxml_isName(ch))
523
87.1M
      return yxml_elemname(x, ch);
524
24.5M
    if(yxml_isSP(ch)) {
525
3.46M
      x->state = YXMLS_elem1;
526
3.46M
      return yxml_elemnameend(x, ch);
527
3.46M
    }
528
21.0M
    if(ch == (unsigned char)'/') {
529
12.2M
      x->state = YXMLS_elem3;
530
12.2M
      return yxml_elemnameend(x, ch);
531
12.2M
    }
532
8.78M
    if(ch == (unsigned char)'>') {
533
8.78M
      x->state = YXMLS_misc2;
534
8.78M
      return yxml_elemnameend(x, ch);
535
8.78M
    }
536
59
    break;
537
10.2M
  case YXMLS_elem1:
538
10.2M
    if(yxml_isSP(ch))
539
2.03M
      return YXML_OK;
540
8.22M
    if(ch == (unsigned char)'/') {
541
2.44M
      x->state = YXMLS_elem3;
542
2.44M
      return YXML_OK;
543
2.44M
    }
544
5.77M
    if(ch == (unsigned char)'>') {
545
1.21k
      x->state = YXMLS_misc2;
546
1.21k
      return YXML_OK;
547
1.21k
    }
548
5.77M
    if(yxml_isNameStart(ch)) {
549
5.77M
      x->state = YXMLS_attr0;
550
5.77M
      return yxml_attrstart(x, ch);
551
5.77M
    }
552
57
    break;
553
5.77M
  case YXMLS_elem2:
554
5.77M
    if(yxml_isSP(ch)) {
555
4.75M
      x->state = YXMLS_elem1;
556
4.75M
      return YXML_OK;
557
4.75M
    }
558
1.02M
    if(ch == (unsigned char)'/') {
559
550k
      x->state = YXMLS_elem3;
560
550k
      return YXML_OK;
561
550k
    }
562
469k
    if(ch == (unsigned char)'>') {
563
469k
      x->state = YXMLS_misc2;
564
469k
      return YXML_OK;
565
469k
    }
566
35
    break;
567
15.2M
  case YXMLS_elem3:
568
15.2M
    if(ch == (unsigned char)'>') {
569
15.2M
      x->state = YXMLS_misc2;
570
15.2M
      return yxml_selfclose(x, ch);
571
15.2M
    }
572
14
    break;
573
1.68k
  case YXMLS_enc0:
574
1.68k
    if(yxml_isSP(ch))
575
1.26k
      return YXML_OK;
576
420
    if(ch == (unsigned char)'=') {
577
390
      x->state = YXMLS_enc1;
578
390
      return YXML_OK;
579
390
    }
580
30
    break;
581
1.50k
  case YXMLS_enc1:
582
1.50k
    if(yxml_isSP(ch))
583
1.16k
      return YXML_OK;
584
341
    if(ch == (unsigned char)'\'' || ch == (unsigned char)'"') {
585
307
      x->state = YXMLS_enc2;
586
307
      x->quote = ch;
587
307
      return YXML_OK;
588
307
    }
589
34
    break;
590
304
  case YXMLS_enc2:
591
304
    if(yxml_isAlpha(ch)) {
592
285
      x->state = YXMLS_enc3;
593
285
      return YXML_OK;
594
285
    }
595
19
    break;
596
2.14k
  case YXMLS_enc3:
597
2.14k
    if(yxml_isEncName(ch))
598
1.95k
      return YXML_OK;
599
190
    if(x->quote == ch) {
600
156
      x->state = YXMLS_xmldecl6;
601
156
      return YXML_OK;
602
156
    }
603
34
    break;
604
9.25M
  case YXMLS_etag0:
605
9.25M
    if(yxml_isNameStart(ch)) {
606
9.25M
      x->state = YXMLS_etag1;
607
9.25M
      return yxml_elemclose(x, ch);
608
9.25M
    }
609
30
    break;
610
77.6M
  case YXMLS_etag1:
611
77.6M
    if(yxml_isName(ch))
612
68.4M
      return yxml_elemclose(x, ch);
613
9.25M
    if(yxml_isSP(ch)) {
614
2.05k
      x->state = YXMLS_etag2;
615
2.05k
      return yxml_elemcloseend(x, ch);
616
2.05k
    }
617
9.25M
    if(ch == (unsigned char)'>') {
618
9.25M
      x->state = YXMLS_misc2;
619
9.25M
      return yxml_elemcloseend(x, ch);
620
9.25M
    }
621
44
    break;
622
4.43k
  case YXMLS_etag2:
623
4.43k
    if(yxml_isSP(ch))
624
2.48k
      return YXML_OK;
625
1.94k
    if(ch == (unsigned char)'>') {
626
1.91k
      x->state = YXMLS_misc2;
627
1.91k
      return YXML_OK;
628
1.91k
    }
629
34
    break;
630
1.00M
  case YXMLS_init:
631
1.00M
    if(ch == (unsigned char)'\xef') {
632
40
      x->state = YXMLS_string;
633
40
      x->nextstate = YXMLS_misc0;
634
40
      x->string = (unsigned char *)"\xbb\xbf";
635
40
      return YXML_OK;
636
40
    }
637
1.00M
    if(yxml_isSP(ch)) {
638
204
      x->state = YXMLS_misc0;
639
204
      return YXML_OK;
640
204
    }
641
1.00M
    if(ch == (unsigned char)'<') {
642
1.00M
      x->state = YXMLS_le0;
643
1.00M
      return YXML_OK;
644
1.00M
    }
645
64
    break;
646
1.00M
  case YXMLS_le0:
647
1.00M
    if(ch == (unsigned char)'!') {
648
413
      x->state = YXMLS_lee1;
649
413
      return YXML_OK;
650
413
    }
651
1.00M
    if(ch == (unsigned char)'?') {
652
2.59k
      x->state = YXMLS_leq0;
653
2.59k
      return YXML_OK;
654
2.59k
    }
655
1.00M
    if(yxml_isNameStart(ch)) {
656
1.00M
      x->state = YXMLS_elem0;
657
1.00M
      return yxml_elemstart(x, ch);
658
1.00M
    }
659
47
    break;
660
3.93k
  case YXMLS_le1:
661
3.93k
    if(ch == (unsigned char)'!') {
662
1.06k
      x->state = YXMLS_lee1;
663
1.06k
      return YXML_OK;
664
1.06k
    }
665
2.86k
    if(ch == (unsigned char)'?') {
666
2.42k
      x->state = YXMLS_pi0;
667
2.42k
      x->nextstate = YXMLS_misc1;
668
2.42k
      return YXML_OK;
669
2.42k
    }
670
443
    if(yxml_isNameStart(ch)) {
671
412
      x->state = YXMLS_elem0;
672
412
      return yxml_elemstart(x, ch);
673
412
    }
674
31
    break;
675
32.8M
  case YXMLS_le2:
676
32.8M
    if(ch == (unsigned char)'!') {
677
817
      x->state = YXMLS_lee2;
678
817
      return YXML_OK;
679
817
    }
680
32.8M
    if(ch == (unsigned char)'?') {
681
2.97k
      x->state = YXMLS_pi0;
682
2.97k
      x->nextstate = YXMLS_misc2;
683
2.97k
      return YXML_OK;
684
2.97k
    }
685
32.8M
    if(ch == (unsigned char)'/') {
686
9.25M
      x->state = YXMLS_etag0;
687
9.25M
      return YXML_OK;
688
9.25M
    }
689
23.5M
    if(yxml_isNameStart(ch)) {
690
23.5M
      x->state = YXMLS_elem0;
691
23.5M
      return yxml_elemstart(x, ch);
692
23.5M
    }
693
52
    break;
694
1.20k
  case YXMLS_le3:
695
1.20k
    if(ch == (unsigned char)'!') {
696
443
      x->state = YXMLS_comment0;
697
443
      x->nextstate = YXMLS_misc3;
698
443
      return YXML_OK;
699
443
    }
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.46k
  case YXMLS_lee1:
707
1.46k
    if(ch == (unsigned char)'-') {
708
935
      x->state = YXMLS_comment1;
709
935
      x->nextstate = YXMLS_misc1;
710
935
      return YXML_OK;
711
935
    }
712
526
    if(ch == (unsigned char)'D') {
713
492
      x->state = YXMLS_string;
714
492
      x->nextstate = YXMLS_dt0;
715
492
      x->string = (unsigned char *)"OCTYPE";
716
492
      return YXML_OK;
717
492
    }
718
34
    break;
719
807
  case YXMLS_lee2:
720
807
    if(ch == (unsigned char)'-') {
721
414
      x->state = YXMLS_comment1;
722
414
      x->nextstate = YXMLS_misc2;
723
414
      return YXML_OK;
724
414
    }
725
393
    if(ch == (unsigned char)'[') {
726
368
      x->state = YXMLS_string;
727
368
      x->nextstate = YXMLS_cd0;
728
368
      x->string = (unsigned char *)"CDATA[";
729
368
      return YXML_OK;
730
368
    }
731
25
    break;
732
2.58k
  case YXMLS_leq0:
733
2.58k
    if(ch == (unsigned char)'x') {
734
1.89k
      x->state = YXMLS_xmldecl0;
735
1.89k
      x->nextstate = YXMLS_misc1;
736
1.89k
      return yxml_pistart(x, ch);
737
1.89k
    }
738
690
    if(yxml_isNameStart(ch)) {
739
653
      x->state = YXMLS_pi1;
740
653
      x->nextstate = YXMLS_misc1;
741
653
      return yxml_pistart(x, ch);
742
653
    }
743
37
    break;
744
2.41k
  case YXMLS_misc0:
745
2.41k
    if(yxml_isSP(ch))
746
2.29k
      return YXML_OK;
747
118
    if(ch == (unsigned char)'<') {
748
72
      x->state = YXMLS_le0;
749
72
      return YXML_OK;
750
72
    }
751
46
    break;
752
5.18k
  case YXMLS_misc1:
753
5.18k
    if(yxml_isSP(ch))
754
1.20k
      return YXML_OK;
755
3.97k
    if(ch == (unsigned char)'<') {
756
3.94k
      x->state = YXMLS_le1;
757
3.94k
      return YXML_OK;
758
3.94k
    }
759
36
    break;
760
1.67G
  case YXMLS_misc2:
761
1.67G
    if(ch == (unsigned char)'<') {
762
32.8M
      x->state = YXMLS_le2;
763
32.8M
      return YXML_OK;
764
32.8M
    }
765
1.64G
    if(ch == (unsigned char)'&') {
766
5.61k
      x->state = YXMLS_misc2a;
767
5.61k
      return yxml_refstart(x, ch);
768
5.61k
    }
769
1.64G
    if(yxml_isChar(ch))
770
1.64G
      return yxml_datacontent(x, ch);
771
0
    break;
772
26.9k
  case YXMLS_misc2a:
773
26.9k
    if(yxml_isRef(ch))
774
21.3k
      return yxml_ref(x, ch);
775
5.53k
    if(ch == (unsigned char)'\x3b') {
776
5.49k
      x->state = YXMLS_misc2;
777
5.49k
      return yxml_refcontent(x, ch);
778
5.49k
    }
779
43
    break;
780
2.52k
  case YXMLS_misc3:
781
2.52k
    if(yxml_isSP(ch))
782
1.26k
      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
43
    break;
788
6.27k
  case YXMLS_pi0:
789
6.27k
    if(yxml_isNameStart(ch)) {
790
6.23k
      x->state = YXMLS_pi1;
791
6.23k
      return yxml_pistart(x, ch);
792
6.23k
    }
793
38
    break;
794
16.3k
  case YXMLS_pi1:
795
16.3k
    if(yxml_isName(ch))
796
9.35k
      return yxml_piname(x, ch);
797
6.97k
    if(ch == (unsigned char)'?') {
798
4.35k
      x->state = YXMLS_pi4;
799
4.35k
      return yxml_pinameend(x, ch);
800
4.35k
    }
801
2.62k
    if(yxml_isSP(ch)) {
802
2.58k
      x->state = YXMLS_pi2;
803
2.58k
      return yxml_pinameend(x, ch);
804
2.58k
    }
805
43
    break;
806
190k
  case YXMLS_pi2:
807
190k
    if(ch == (unsigned char)'?') {
808
3.10k
      x->state = YXMLS_pi3;
809
3.10k
      return YXML_OK;
810
3.10k
    }
811
186k
    if(yxml_isChar(ch))
812
186k
      return yxml_datapi1(x, ch);
813
0
    break;
814
3.08k
  case YXMLS_pi3:
815
3.08k
    if(ch == (unsigned char)'>') {
816
2.42k
      x->state = x->nextstate;
817
2.42k
      return yxml_pivalend(x, ch);
818
2.42k
    }
819
667
    if(yxml_isChar(ch)) {
820
667
      x->state = YXMLS_pi2;
821
667
      return yxml_datapi2(x, ch);
822
667
    }
823
0
    break;
824
4.29k
  case YXMLS_pi4:
825
4.29k
    if(ch == (unsigned char)'>') {
826
4.26k
      x->state = x->nextstate;
827
4.26k
      return yxml_pivalend(x, ch);
828
4.26k
    }
829
25
    break;
830
700
  case YXMLS_std0:
831
700
    if(yxml_isSP(ch))
832
582
      return YXML_OK;
833
118
    if(ch == (unsigned char)'=') {
834
101
      x->state = YXMLS_std1;
835
101
      return YXML_OK;
836
101
    }
837
17
    break;
838
658
  case YXMLS_std1:
839
658
    if(yxml_isSP(ch))
840
582
      return YXML_OK;
841
76
    if(ch == (unsigned char)'\'' || ch == (unsigned char)'"') {
842
64
      x->state = YXMLS_std2;
843
64
      x->quote = ch;
844
64
      return YXML_OK;
845
64
    }
846
12
    break;
847
62
  case YXMLS_std2:
848
62
    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
59
    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
13
    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.14k
  case YXMLS_ver0:
868
2.14k
    if(yxml_isSP(ch))
869
1.16k
      return YXML_OK;
870
983
    if(ch == (unsigned char)'=') {
871
959
      x->state = YXMLS_ver1;
872
959
      return YXML_OK;
873
959
    }
874
24
    break;
875
2.07k
  case YXMLS_ver1:
876
2.07k
    if(yxml_isSP(ch))
877
1.16k
      return YXML_OK;
878
910
    if(ch == (unsigned char)'\'' || ch == (unsigned char)'"') {
879
869
      x->state = YXMLS_string;
880
869
      x->quote = ch;
881
869
      x->nextstate = YXMLS_ver2;
882
869
      x->string = (unsigned char *)"1.";
883
869
      return YXML_OK;
884
869
    }
885
41
    break;
886
863
  case YXMLS_ver2:
887
863
    if(yxml_isNum(ch)) {
888
839
      x->state = YXMLS_ver3;
889
839
      return YXML_OK;
890
839
    }
891
24
    break;
892
1.20k
  case YXMLS_ver3:
893
1.20k
    if(yxml_isNum(ch))
894
396
      return YXML_OK;
895
810
    if(x->quote == ch) {
896
781
      x->state = YXMLS_xmldecl4;
897
781
      return YXML_OK;
898
781
    }
899
29
    break;
900
1.89k
  case YXMLS_xmldecl0:
901
1.89k
    if(ch == (unsigned char)'m') {
902
1.62k
      x->state = YXMLS_xmldecl1;
903
1.62k
      return yxml_piname(x, ch);
904
1.62k
    }
905
272
    if(yxml_isName(ch)) {
906
141
      x->state = YXMLS_pi1;
907
141
      return yxml_piname(x, ch);
908
141
    }
909
131
    if(ch == (unsigned char)'?') {
910
50
      x->state = YXMLS_pi4;
911
50
      return yxml_pinameend(x, ch);
912
50
    }
913
81
    if(yxml_isSP(ch)) {
914
38
      x->state = YXMLS_pi2;
915
38
      return yxml_pinameend(x, ch);
916
38
    }
917
43
    break;
918
1.62k
  case YXMLS_xmldecl1:
919
1.62k
    if(ch == (unsigned char)'l') {
920
1.40k
      x->state = YXMLS_xmldecl2;
921
1.40k
      return yxml_piname(x, ch);
922
1.40k
    }
923
213
    if(yxml_isName(ch)) {
924
123
      x->state = YXMLS_pi1;
925
123
      return yxml_piname(x, ch);
926
123
    }
927
90
    if(ch == (unsigned char)'?') {
928
7
      x->state = YXMLS_pi4;
929
7
      return yxml_pinameend(x, ch);
930
7
    }
931
83
    if(yxml_isSP(ch)) {
932
23
      x->state = YXMLS_pi2;
933
23
      return yxml_pinameend(x, ch);
934
23
    }
935
60
    break;
936
1.40k
  case YXMLS_xmldecl2:
937
1.40k
    if(yxml_isSP(ch)) {
938
1.14k
      x->state = YXMLS_xmldecl3;
939
1.14k
      return yxml_piabort(x, ch);
940
1.14k
    }
941
267
    if(yxml_isName(ch)) {
942
225
      x->state = YXMLS_pi1;
943
225
      return yxml_piname(x, ch);
944
225
    }
945
42
    break;
946
2.25k
  case YXMLS_xmldecl3:
947
2.25k
    if(yxml_isSP(ch))
948
1.16k
      return YXML_OK;
949
1.08k
    if(ch == (unsigned char)'v') {
950
1.03k
      x->state = YXMLS_string;
951
1.03k
      x->nextstate = YXMLS_ver0;
952
1.03k
      x->string = (unsigned char *)"ersion";
953
1.03k
      return YXML_OK;
954
1.03k
    }
955
48
    break;
956
779
  case YXMLS_xmldecl4:
957
779
    if(yxml_isSP(ch)) {
958
730
      x->state = YXMLS_xmldecl5;
959
730
      return YXML_OK;
960
730
    }
961
49
    if(ch == (unsigned char)'?') {
962
20
      x->state = YXMLS_xmldecl9;
963
20
      return YXML_OK;
964
20
    }
965
29
    break;
966
1.84k
  case YXMLS_xmldecl5:
967
1.84k
    if(yxml_isSP(ch))
968
1.16k
      return YXML_OK;
969
676
    if(ch == (unsigned char)'?') {
970
14
      x->state = YXMLS_xmldecl9;
971
14
      return YXML_OK;
972
14
    }
973
662
    if(ch == (unsigned char)'e') {
974
472
      x->state = YXMLS_string;
975
472
      x->nextstate = YXMLS_enc0;
976
472
      x->string = (unsigned char *)"ncoding";
977
472
      return YXML_OK;
978
472
    }
979
190
    if(ch == (unsigned char)'s') {
980
140
      x->state = YXMLS_string;
981
140
      x->nextstate = YXMLS_std0;
982
140
      x->string = (unsigned char *)"tandalone";
983
140
      return YXML_OK;
984
140
    }
985
50
    break;
986
155
  case YXMLS_xmldecl6:
987
155
    if(yxml_isSP(ch)) {
988
127
      x->state = YXMLS_xmldecl7;
989
127
      return YXML_OK;
990
127
    }
991
28
    if(ch == (unsigned char)'?') {
992
10
      x->state = YXMLS_xmldecl9;
993
10
      return YXML_OK;
994
10
    }
995
18
    break;
996
1.23k
  case YXMLS_xmldecl7:
997
1.23k
    if(yxml_isSP(ch))
998
1.16k
      return YXML_OK;
999
73
    if(ch == (unsigned char)'?') {
1000
16
      x->state = YXMLS_xmldecl9;
1001
16
      return YXML_OK;
1002
16
    }
1003
57
    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
51
    break;
1010
603
  case YXMLS_xmldecl8:
1011
603
    if(yxml_isSP(ch))
1012
583
      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
60
  case YXMLS_xmldecl9:
1019
60
    if(ch == (unsigned char)'>') {
1020
55
      x->state = YXMLS_misc1;
1021
55
      return YXML_OK;
1022
55
    }
1023
5
    break;
1024
2.05G
  }
1025
1.76k
  return YXML_ESYN;
1026
2.05G
}
1027
1028
1.00M
yxml_ret_t yxml_eof(yxml_t *x) {
1029
1.00M
  if(x->state != YXMLS_misc3)
1030
4.07k
    return YXML_EEOF;
1031
997k
  return YXML_OK;
1032
1.00M
}
1033