Coverage Report

Created: 2026-08-31 07:11

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
4.50G
#define yxml_isChar(c) 1
100
/* 0xd should be part of SP, too, but yxml_parse() already normalizes that into 0xa */
101
100M
#define yxml_isSP(c) (c == 0x20 || c == 0x09 || c == 0x0a)
102
1.21G
#define yxml_isAlpha(c) ((c|32)-'a' < 26)
103
613M
#define yxml_isNum(c) (c-'0' < 10)
104
4.77k
#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.14G
#define yxml_isNameStart(c) (yxml_isAlpha(c) || c == ':' || c == '_' || c >= 128)
107
533M
#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
127M
#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
28.5k
#define yxml_isRef(c) (yxml_isNum(c) || yxml_isAlpha(c) || c == '#')
114
115
10.5k
#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
4.37G
static inline void yxml_setchar(char *dest, unsigned ch) {
119
4.37G
  *(unsigned char *)dest = (unsigned char)ch;
120
4.37G
}
121
122
/* Similar to yxml_setchar(), but will convert ch (any valid unicode point) to
123
 * UTF-8 and appends a '\0'. dest must have room for at least 5 bytes. */
124
5.84k
static void yxml_setutf8(char *dest, unsigned ch) {
125
5.84k
  if(ch <= 0x007F)
126
4.07k
    yxml_setchar(dest++, ch);
127
1.77k
  else if(ch <= 0x07FF) {
128
428
    yxml_setchar(dest++, 0xC0 | (ch>>6));
129
428
    yxml_setchar(dest++, 0x80 | (ch & 0x3F));
130
1.34k
  } else if(ch <= 0xFFFF) {
131
573
    yxml_setchar(dest++, 0xE0 | (ch>>12));
132
573
    yxml_setchar(dest++, 0x80 | ((ch>>6) & 0x3F));
133
573
    yxml_setchar(dest++, 0x80 | (ch & 0x3F));
134
773
  } else {
135
773
    yxml_setchar(dest++, 0xF0 | (ch>>18));
136
773
    yxml_setchar(dest++, 0x80 | ((ch>>12) & 0x3F));
137
773
    yxml_setchar(dest++, 0x80 | ((ch>>6) & 0x3F));
138
773
    yxml_setchar(dest++, 0x80 | (ch & 0x3F));
139
773
  }
140
5.84k
  *dest = 0;
141
5.84k
}
142
143
4.25G
static inline yxml_ret_t yxml_datacontent(yxml_t *x, unsigned ch) {
144
4.25G
  yxml_setchar(x->data, ch);
145
4.25G
  x->data[1] = 0;
146
4.25G
  return YXML_CONTENT;
147
4.25G
}
148
149
793k
static inline yxml_ret_t yxml_datapi1(yxml_t *x, unsigned ch) {
150
793k
  yxml_setchar(x->data, ch);
151
793k
  x->data[1] = 0;
152
793k
  return YXML_PICONTENT;
153
793k
}
154
155
800
static inline yxml_ret_t yxml_datapi2(yxml_t *x, unsigned ch) {
156
800
  x->data[0] = '?';
157
800
  yxml_setchar(x->data+1, ch);
158
800
  x->data[2] = 0;
159
800
  return YXML_PICONTENT;
160
800
}
161
162
499
static inline yxml_ret_t yxml_datacd1(yxml_t *x, unsigned ch) {
163
499
  x->data[0] = ']';
164
499
  yxml_setchar(x->data+1, ch);
165
499
  x->data[2] = 0;
166
499
  return YXML_CONTENT;
167
499
}
168
169
484
static inline yxml_ret_t yxml_datacd2(yxml_t *x, unsigned ch) {
170
484
  x->data[0] = ']';
171
484
  x->data[1] = ']';
172
484
  yxml_setchar(x->data+2, ch);
173
484
  x->data[3] = 0;
174
484
  return YXML_CONTENT;
175
484
}
176
177
121M
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
121M
  yxml_setchar(x->data, ch == 0x9 || ch == 0xa ? 0x20 : ch);
180
121M
  x->data[1] = 0;
181
121M
  return YXML_ATTRVAL;
182
121M
}
183
184
51.7M
static yxml_ret_t yxml_pushstack(yxml_t *x, char **res, unsigned ch) {
185
51.7M
  if(x->stacklen+2 >= x->stacksize)
186
8
    return YXML_ESTACK;
187
51.7M
  x->stacklen++;
188
51.7M
  *res = (char *)x->stack+x->stacklen;
189
51.7M
  x->stack[x->stacklen] = (unsigned char)ch;
190
51.7M
  x->stacklen++;
191
51.7M
  x->stack[x->stacklen] = 0;
192
51.7M
  return YXML_OK;
193
51.7M
}
194
195
280M
static yxml_ret_t yxml_pushstackc(yxml_t *x, unsigned ch) {
196
280M
  if(x->stacklen+1 >= x->stacksize)
197
7
    return YXML_ESTACK;
198
280M
  x->stack[x->stacklen] = (unsigned char)ch;
199
280M
  x->stacklen++;
200
280M
  x->stack[x->stacklen] = 0;
201
280M
  return YXML_OK;
202
280M
}
203
204
51.7M
static void yxml_popstack(yxml_t *x) {
205
51.7M
  do
206
383M
    x->stacklen--;
207
383M
  while(x->stack[x->stacklen]);
208
51.7M
}
209
210
45.6M
static inline yxml_ret_t yxml_elemstart  (yxml_t *x, unsigned ch) { return yxml_pushstack(x, &x->elem, ch); }
211
225M
static inline yxml_ret_t yxml_elemname   (yxml_t *x, unsigned ch) { return yxml_pushstackc(x, ch); }
212
45.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
45.6M
static yxml_ret_t yxml_selfclose(yxml_t *x, unsigned ch) {
217
45.6M
  yxml_popstack(x);
218
45.6M
  if(x->stacklen) {
219
43.0M
    x->elem = (char *)x->stack+x->stacklen-1;
220
308M
    while(*(x->elem-1))
221
265M
      x->elem--;
222
43.0M
    return YXML_ELEMEND;
223
43.0M
  }
224
2.58M
  x->elem = (char *)x->stack;
225
2.58M
  x->state = YXMLS_misc3;
226
2.58M
  return YXML_ELEMEND;
227
45.6M
}
228
229
202M
static inline yxml_ret_t yxml_elemclose(yxml_t *x, unsigned ch) {
230
202M
  if(*((unsigned char *)x->elem) != ch)
231
199
    return YXML_ECLOSE;
232
202M
  x->elem++;
233
202M
  return YXML_OK;
234
202M
}
235
236
24.0M
static inline yxml_ret_t yxml_elemcloseend(yxml_t *x, unsigned ch) {
237
24.0M
  if(*x->elem)
238
2
    return YXML_ECLOSE;
239
24.0M
  return yxml_selfclose(x, ch);
240
24.0M
}
241
242
6.06M
static inline yxml_ret_t yxml_attrstart  (yxml_t *x, unsigned ch) { return yxml_pushstack(x, &x->attr, ch); }
243
54.5M
static inline yxml_ret_t yxml_attrname   (yxml_t *x, unsigned ch) { return yxml_pushstackc(x, ch); }
244
6.06M
static inline yxml_ret_t yxml_attrnameend(yxml_t *x, unsigned ch) { return YXML_ATTRSTART; }
245
6.06M
static inline yxml_ret_t yxml_attrvalend (yxml_t *x, unsigned ch) { yxml_popstack(x); return YXML_ATTREND; }
246
247
9.97k
static inline yxml_ret_t yxml_pistart  (yxml_t *x, unsigned ch) { return yxml_pushstack(x, &x->pi, ch); }
248
14.7k
static inline yxml_ret_t yxml_piname   (yxml_t *x, unsigned ch) { return yxml_pushstackc(x, ch); }
249
1.17k
static inline yxml_ret_t yxml_piabort  (yxml_t *x, unsigned ch) { yxml_popstack(x); return YXML_OK; }
250
8.24k
static inline yxml_ret_t yxml_pinameend(yxml_t *x, unsigned ch) {
251
8.24k
  return (x->pi[0]|32) == 'x' && (x->pi[1]|32) == 'm' && (x->pi[2]|32) == 'l' && !x->pi[3] ? YXML_ESYN : YXML_PISTART;
252
8.24k
}
253
7.95k
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.45k
static inline yxml_ret_t yxml_refstart(yxml_t *x, unsigned ch) {
256
6.45k
  memset(x->data, 0, sizeof(x->data));
257
6.45k
  x->reflen = 0;
258
6.45k
  return YXML_OK;
259
6.45k
}
260
261
22.2k
static yxml_ret_t yxml_ref(yxml_t *x, unsigned ch) {
262
22.2k
  if(x->reflen >= sizeof(x->data)-1)
263
39
    return YXML_EREF;
264
22.1k
  yxml_setchar(x->data+x->reflen, ch);
265
22.1k
  x->reflen++;
266
22.1k
  return YXML_OK;
267
22.2k
}
268
269
6.23k
static yxml_ret_t yxml_refend(yxml_t *x, yxml_ret_t ret) {
270
6.23k
  unsigned char *r = (unsigned char *)x->data;
271
6.23k
  unsigned ch = 0;
272
6.23k
  if(*r == '#') {
273
3.78k
    if(r[1] == 'x')
274
4.77k
      for(r += 2; yxml_isHex((unsigned)*r); r++)
275
3.40k
        ch = (ch<<4) + (*r <= '9' ? *r-'0' : (*r|32)-'a' + 10);
276
2.41k
    else
277
8.13k
      for(r++; yxml_isNum((unsigned)*r); r++)
278
5.72k
        ch = (ch*10) + (*r-'0');
279
3.78k
    if(*r)
280
20
      ch = 0;
281
3.78k
  } else {
282
2.44k
    uint64_t i = INTFROM5CHARS(r[0], r[1], r[2], r[3], r[4]);
283
2.44k
    ch =
284
2.44k
      i == INTFROM5CHARS('l','t', 0,  0, 0) ? '<' :
285
2.44k
      i == INTFROM5CHARS('g','t', 0,  0, 0) ? '>' :
286
2.01k
      i == INTFROM5CHARS('a','m','p', 0, 0) ? '&' :
287
1.61k
      i == INTFROM5CHARS('a','p','o','s',0) ? '\'':
288
1.22k
      i == INTFROM5CHARS('q','u','o','t',0) ? '"' : 0;
289
2.44k
  }
290
291
  /* Codepoints not allowed in the XML 1.1 definition of a Char */
292
6.23k
  if(!ch || ch > 0x10FFFF || ch == 0xFFFE || ch == 0xFFFF || (ch-0xDFFF) < 0x7FF)
293
383
    return YXML_EREF;
294
5.84k
  yxml_setutf8(x->data, ch);
295
5.84k
  return ret;
296
6.23k
}
297
298
5.02k
static inline yxml_ret_t yxml_refcontent(yxml_t *x, unsigned ch) { return yxml_refend(x, YXML_CONTENT); }
299
1.20k
static inline yxml_ret_t yxml_refattrval(yxml_t *x, unsigned ch) { return yxml_refend(x, YXML_ATTRVAL); }
300
301
2.59M
void yxml_init(yxml_t *x, void *stack, size_t stacksize) {
302
2.59M
  memset(x, 0, sizeof(*x));
303
2.59M
  x->line = 1;
304
2.59M
  x->stack = (unsigned char*)stack;
305
2.59M
  x->stacksize = stacksize;
306
2.59M
  *x->stack = 0;
307
2.59M
  x->elem = x->pi = x->attr = (char *)x->stack;
308
2.59M
  x->state = YXMLS_init;
309
2.59M
}
310
311
5.11G
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
5.11G
  unsigned ch = (unsigned)(_ch+256) & 0xff;
315
5.11G
  if(!ch)
316
7
    return YXML_ESYN;
317
5.11G
  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
5.11G
  if(x->ignore == ch) {
324
2.54k
    x->ignore = 0;
325
2.54k
    return YXML_OK;
326
2.54k
  }
327
5.11G
  x->ignore = (ch == 0xd) * 0xa;
328
5.11G
  if(ch == 0xa || ch == 0xd) {
329
3.24M
    ch = 0xa;
330
3.24M
    x->line++;
331
3.24M
    x->byte = 0;
332
3.24M
  }
333
5.11G
  x->byte++;
334
335
5.11G
  switch((yxml_state_t)x->state) {
336
23.6k
  case YXMLS_string:
337
23.6k
    if(ch == *x->string) {
338
23.6k
      x->string++;
339
23.6k
      if(!*x->string)
340
4.42k
        x->state = x->nextstate;
341
23.6k
      return YXML_OK;
342
23.6k
    }
343
22
    break;
344
60.5M
  case YXMLS_attr0:
345
60.5M
    if(yxml_isName(ch))
346
54.5M
      return yxml_attrname(x, ch);
347
6.06M
    if(yxml_isSP(ch)) {
348
1.55M
      x->state = YXMLS_attr1;
349
1.55M
      return yxml_attrnameend(x, ch);
350
1.55M
    }
351
4.50M
    if(ch == (unsigned char)'=') {
352
4.50M
      x->state = YXMLS_attr2;
353
4.50M
      return yxml_attrnameend(x, ch);
354
4.50M
    }
355
46
    break;
356
1.56M
  case YXMLS_attr1:
357
1.56M
    if(yxml_isSP(ch))
358
2.68k
      return YXML_OK;
359
1.55M
    if(ch == (unsigned char)'=') {
360
1.55M
      x->state = YXMLS_attr2;
361
1.55M
      return YXML_OK;
362
1.55M
    }
363
38
    break;
364
6.06M
  case YXMLS_attr2:
365
6.06M
    if(yxml_isSP(ch))
366
1.16k
      return YXML_OK;
367
6.06M
    if(ch == (unsigned char)'\'' || ch == (unsigned char)'"') {
368
6.06M
      x->state = YXMLS_attr3;
369
6.06M
      x->quote = ch;
370
6.06M
      return YXML_OK;
371
6.06M
    }
372
30
    break;
373
127M
  case YXMLS_attr3:
374
127M
    if(yxml_isAttValue(ch))
375
121M
      return yxml_dataattr(x, ch);
376
6.06M
    if(ch == (unsigned char)'&') {
377
1.31k
      x->state = YXMLS_attr4;
378
1.31k
      return yxml_refstart(x, ch);
379
1.31k
    }
380
6.06M
    if(x->quote == ch) {
381
6.06M
      x->state = YXMLS_elem2;
382
6.06M
      return yxml_attrvalend(x, ch);
383
6.06M
    }
384
2
    break;
385
5.27k
  case YXMLS_attr4:
386
5.27k
    if(yxml_isRef(ch))
387
4.03k
      return yxml_ref(x, ch);
388
1.23k
    if(ch == (unsigned char)'\x3b') {
389
1.20k
      x->state = YXMLS_attr3;
390
1.20k
      return yxml_refattrval(x, ch);
391
1.20k
    }
392
32
    break;
393
2.78k
  case YXMLS_cd0:
394
2.78k
    if(ch == (unsigned char)']') {
395
1.51k
      x->state = YXMLS_cd1;
396
1.51k
      return YXML_OK;
397
1.51k
    }
398
1.26k
    if(yxml_isChar(ch))
399
1.26k
      return yxml_datacontent(x, ch);
400
0
    break;
401
1.50k
  case YXMLS_cd1:
402
1.50k
    if(ch == (unsigned char)']') {
403
1.00k
      x->state = YXMLS_cd2;
404
1.00k
      return YXML_OK;
405
1.00k
    }
406
499
    if(yxml_isChar(ch)) {
407
499
      x->state = YXMLS_cd0;
408
499
      return yxml_datacd1(x, ch);
409
499
    }
410
0
    break;
411
1.40k
  case YXMLS_cd2:
412
1.40k
    if(ch == (unsigned char)']')
413
428
      return yxml_datacontent(x, ch);
414
976
    if(ch == (unsigned char)'>') {
415
492
      x->state = YXMLS_misc2;
416
492
      return YXML_OK;
417
492
    }
418
484
    if(yxml_isChar(ch)) {
419
484
      x->state = YXMLS_cd0;
420
484
      return yxml_datacd2(x, ch);
421
484
    }
422
0
    break;
423
449
  case YXMLS_comment0:
424
449
    if(ch == (unsigned char)'-') {
425
429
      x->state = YXMLS_comment1;
426
429
      return YXML_OK;
427
429
    }
428
20
    break;
429
2.43k
  case YXMLS_comment1:
430
2.43k
    if(ch == (unsigned char)'-') {
431
2.41k
      x->state = YXMLS_comment2;
432
2.41k
      return YXML_OK;
433
2.41k
    }
434
22
    break;
435
3.47k
  case YXMLS_comment2:
436
3.47k
    if(ch == (unsigned char)'-') {
437
2.98k
      x->state = YXMLS_comment3;
438
2.98k
      return YXML_OK;
439
2.98k
    }
440
486
    if(yxml_isChar(ch))
441
486
      return YXML_OK;
442
0
    break;
443
2.97k
  case YXMLS_comment3:
444
2.97k
    if(ch == (unsigned char)'-') {
445
2.32k
      x->state = YXMLS_comment4;
446
2.32k
      return YXML_OK;
447
2.32k
    }
448
651
    if(yxml_isChar(ch)) {
449
651
      x->state = YXMLS_comment2;
450
651
      return YXML_OK;
451
651
    }
452
0
    break;
453
2.30k
  case YXMLS_comment4:
454
2.30k
    if(ch == (unsigned char)'>') {
455
2.28k
      x->state = x->nextstate;
456
2.28k
      return YXML_OK;
457
2.28k
    }
458
21
    break;
459
3.88k
  case YXMLS_dt0:
460
3.88k
    if(ch == (unsigned char)'>') {
461
655
      x->state = YXMLS_misc1;
462
655
      return YXML_OK;
463
655
    }
464
3.22k
    if(ch == (unsigned char)'\'' || ch == (unsigned char)'"') {
465
1.19k
      x->state = YXMLS_dt1;
466
1.19k
      x->quote = ch;
467
1.19k
      x->nextstate = YXMLS_dt0;
468
1.19k
      return YXML_OK;
469
1.19k
    }
470
2.03k
    if(ch == (unsigned char)'<') {
471
1.58k
      x->state = YXMLS_dt2;
472
1.58k
      return YXML_OK;
473
1.58k
    }
474
446
    if(yxml_isChar(ch))
475
446
      return YXML_OK;
476
0
    break;
477
2.28k
  case YXMLS_dt1:
478
2.28k
    if(x->quote == ch) {
479
1.87k
      x->state = x->nextstate;
480
1.87k
      return YXML_OK;
481
1.87k
    }
482
405
    if(yxml_isChar(ch))
483
405
      return YXML_OK;
484
0
    break;
485
1.57k
  case YXMLS_dt2:
486
1.57k
    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.18k
    if(ch == (unsigned char)'!') {
492
1.18k
      x->state = YXMLS_dt3;
493
1.18k
      return YXML_OK;
494
1.18k
    }
495
2
    break;
496
1.16k
  case YXMLS_dt3:
497
1.16k
    if(ch == (unsigned char)'-') {
498
388
      x->state = YXMLS_comment1;
499
388
      x->nextstate = YXMLS_dt0;
500
388
      return YXML_OK;
501
388
    }
502
780
    if(yxml_isChar(ch)) {
503
780
      x->state = YXMLS_dt4;
504
780
      return YXML_OK;
505
780
    }
506
0
    break;
507
1.86k
  case YXMLS_dt4:
508
1.86k
    if(ch == (unsigned char)'\'' || ch == (unsigned char)'"') {
509
776
      x->state = YXMLS_dt1;
510
776
      x->quote = ch;
511
776
      x->nextstate = YXMLS_dt4;
512
776
      return YXML_OK;
513
776
    }
514
1.09k
    if(ch == (unsigned char)'>') {
515
682
      x->state = YXMLS_dt0;
516
682
      return YXML_OK;
517
682
    }
518
408
    if(yxml_isChar(ch))
519
408
      return YXML_OK;
520
0
    break;
521
271M
  case YXMLS_elem0:
522
271M
    if(yxml_isName(ch))
523
225M
      return yxml_elemname(x, ch);
524
45.6M
    if(yxml_isSP(ch)) {
525
3.52M
      x->state = YXMLS_elem1;
526
3.52M
      return yxml_elemnameend(x, ch);
527
3.52M
    }
528
42.1M
    if(ch == (unsigned char)'/') {
529
19.3M
      x->state = YXMLS_elem3;
530
19.3M
      return yxml_elemnameend(x, ch);
531
19.3M
    }
532
22.7M
    if(ch == (unsigned char)'>') {
533
22.7M
      x->state = YXMLS_misc2;
534
22.7M
      return yxml_elemnameend(x, ch);
535
22.7M
    }
536
51
    break;
537
8.17M
  case YXMLS_elem1:
538
8.17M
    if(yxml_isSP(ch))
539
1.23M
      return YXML_OK;
540
6.93M
    if(ch == (unsigned char)'/') {
541
874k
      x->state = YXMLS_elem3;
542
874k
      return YXML_OK;
543
874k
    }
544
6.06M
    if(ch == (unsigned char)'>') {
545
814
      x->state = YXMLS_misc2;
546
814
      return YXML_OK;
547
814
    }
548
6.06M
    if(yxml_isNameStart(ch)) {
549
6.06M
      x->state = YXMLS_attr0;
550
6.06M
      return yxml_attrstart(x, ch);
551
6.06M
    }
552
43
    break;
553
6.06M
  case YXMLS_elem2:
554
6.06M
    if(yxml_isSP(ch)) {
555
3.40M
      x->state = YXMLS_elem1;
556
3.40M
      return YXML_OK;
557
3.40M
    }
558
2.65M
    if(ch == (unsigned char)'/') {
559
1.43M
      x->state = YXMLS_elem3;
560
1.43M
      return YXML_OK;
561
1.43M
    }
562
1.22M
    if(ch == (unsigned char)'>') {
563
1.22M
      x->state = YXMLS_misc2;
564
1.22M
      return YXML_OK;
565
1.22M
    }
566
38
    break;
567
21.6M
  case YXMLS_elem3:
568
21.6M
    if(ch == (unsigned char)'>') {
569
21.6M
      x->state = YXMLS_misc2;
570
21.6M
      return yxml_selfclose(x, ch);
571
21.6M
    }
572
21
    break;
573
1.55k
  case YXMLS_enc0:
574
1.55k
    if(yxml_isSP(ch))
575
1.16k
      return YXML_OK;
576
392
    if(ch == (unsigned char)'=') {
577
378
      x->state = YXMLS_enc1;
578
378
      return YXML_OK;
579
378
    }
580
14
    break;
581
1.49k
  case YXMLS_enc1:
582
1.49k
    if(yxml_isSP(ch))
583
1.16k
      return YXML_OK;
584
328
    if(ch == (unsigned char)'\'' || ch == (unsigned char)'"') {
585
299
      x->state = YXMLS_enc2;
586
299
      x->quote = ch;
587
299
      return YXML_OK;
588
299
    }
589
29
    break;
590
295
  case YXMLS_enc2:
591
295
    if(yxml_isAlpha(ch)) {
592
277
      x->state = YXMLS_enc3;
593
277
      return YXML_OK;
594
277
    }
595
18
    break;
596
2.14k
  case YXMLS_enc3:
597
2.14k
    if(yxml_isEncName(ch))
598
1.95k
      return YXML_OK;
599
184
    if(x->quote == ch) {
600
150
      x->state = YXMLS_xmldecl6;
601
150
      return YXML_OK;
602
150
    }
603
34
    break;
604
24.0M
  case YXMLS_etag0:
605
24.0M
    if(yxml_isNameStart(ch)) {
606
24.0M
      x->state = YXMLS_etag1;
607
24.0M
      return yxml_elemclose(x, ch);
608
24.0M
    }
609
33
    break;
610
202M
  case YXMLS_etag1:
611
202M
    if(yxml_isName(ch))
612
178M
      return yxml_elemclose(x, ch);
613
24.0M
    if(yxml_isSP(ch)) {
614
1.48k
      x->state = YXMLS_etag2;
615
1.48k
      return yxml_elemcloseend(x, ch);
616
1.48k
    }
617
24.0M
    if(ch == (unsigned char)'>') {
618
24.0M
      x->state = YXMLS_misc2;
619
24.0M
      return yxml_elemcloseend(x, ch);
620
24.0M
    }
621
40
    break;
622
3.99k
  case YXMLS_etag2:
623
3.99k
    if(yxml_isSP(ch))
624
2.59k
      return YXML_OK;
625
1.39k
    if(ch == (unsigned char)'>') {
626
1.36k
      x->state = YXMLS_misc2;
627
1.36k
      return YXML_OK;
628
1.36k
    }
629
39
    break;
630
2.59M
  case YXMLS_init:
631
2.59M
    if(ch == (unsigned char)'\xef') {
632
35
      x->state = YXMLS_string;
633
35
      x->nextstate = YXMLS_misc0;
634
35
      x->string = (unsigned char *)"\xbb\xbf";
635
35
      return YXML_OK;
636
35
    }
637
2.59M
    if(yxml_isSP(ch)) {
638
220
      x->state = YXMLS_misc0;
639
220
      return YXML_OK;
640
220
    }
641
2.59M
    if(ch == (unsigned char)'<') {
642
2.59M
      x->state = YXMLS_le0;
643
2.59M
      return YXML_OK;
644
2.59M
    }
645
56
    break;
646
2.59M
  case YXMLS_le0:
647
2.59M
    if(ch == (unsigned char)'!') {
648
587
      x->state = YXMLS_lee1;
649
587
      return YXML_OK;
650
587
    }
651
2.59M
    if(ch == (unsigned char)'?') {
652
2.51k
      x->state = YXMLS_leq0;
653
2.51k
      return YXML_OK;
654
2.51k
    }
655
2.59M
    if(yxml_isNameStart(ch)) {
656
2.59M
      x->state = YXMLS_elem0;
657
2.59M
      return yxml_elemstart(x, ch);
658
2.59M
    }
659
48
    break;
660
5.32k
  case YXMLS_le1:
661
5.32k
    if(ch == (unsigned char)'!') {
662
1.59k
      x->state = YXMLS_lee1;
663
1.59k
      return YXML_OK;
664
1.59k
    }
665
3.73k
    if(ch == (unsigned char)'?') {
666
3.28k
      x->state = YXMLS_pi0;
667
3.28k
      x->nextstate = YXMLS_misc1;
668
3.28k
      return YXML_OK;
669
3.28k
    }
670
443
    if(yxml_isNameStart(ch)) {
671
413
      x->state = YXMLS_elem0;
672
413
      return yxml_elemstart(x, ch);
673
413
    }
674
30
    break;
675
67.0M
  case YXMLS_le2:
676
67.0M
    if(ch == (unsigned char)'!') {
677
1.21k
      x->state = YXMLS_lee2;
678
1.21k
      return YXML_OK;
679
1.21k
    }
680
67.0M
    if(ch == (unsigned char)'?') {
681
3.18k
      x->state = YXMLS_pi0;
682
3.18k
      x->nextstate = YXMLS_misc2;
683
3.18k
      return YXML_OK;
684
3.18k
    }
685
67.0M
    if(ch == (unsigned char)'/') {
686
24.0M
      x->state = YXMLS_etag0;
687
24.0M
      return YXML_OK;
688
24.0M
    }
689
43.0M
    if(yxml_isNameStart(ch)) {
690
43.0M
      x->state = YXMLS_elem0;
691
43.0M
      return yxml_elemstart(x, ch);
692
43.0M
    }
693
47
    break;
694
1.22k
  case YXMLS_le3:
695
1.22k
    if(ch == (unsigned char)'!') {
696
460
      x->state = YXMLS_comment0;
697
460
      x->nextstate = YXMLS_misc3;
698
460
      return YXML_OK;
699
460
    }
700
769
    if(ch == (unsigned char)'?') {
701
737
      x->state = YXMLS_pi0;
702
737
      x->nextstate = YXMLS_misc3;
703
737
      return YXML_OK;
704
737
    }
705
32
    break;
706
2.16k
  case YXMLS_lee1:
707
2.16k
    if(ch == (unsigned char)'-') {
708
1.13k
      x->state = YXMLS_comment1;
709
1.13k
      x->nextstate = YXMLS_misc1;
710
1.13k
      return YXML_OK;
711
1.13k
    }
712
1.03k
    if(ch == (unsigned char)'D') {
713
1.00k
      x->state = YXMLS_string;
714
1.00k
      x->nextstate = YXMLS_dt0;
715
1.00k
      x->string = (unsigned char *)"OCTYPE";
716
1.00k
      return YXML_OK;
717
1.00k
    }
718
28
    break;
719
1.20k
  case YXMLS_lee2:
720
1.20k
    if(ch == (unsigned char)'-') {
721
549
      x->state = YXMLS_comment1;
722
549
      x->nextstate = YXMLS_misc2;
723
549
      return YXML_OK;
724
549
    }
725
658
    if(ch == (unsigned char)'[') {
726
629
      x->state = YXMLS_string;
727
629
      x->nextstate = YXMLS_cd0;
728
629
      x->string = (unsigned char *)"CDATA[";
729
629
      return YXML_OK;
730
629
    }
731
29
    break;
732
2.50k
  case YXMLS_leq0:
733
2.50k
    if(ch == (unsigned char)'x') {
734
1.86k
      x->state = YXMLS_xmldecl0;
735
1.86k
      x->nextstate = YXMLS_misc1;
736
1.86k
      return yxml_pistart(x, ch);
737
1.86k
    }
738
642
    if(yxml_isNameStart(ch)) {
739
605
      x->state = YXMLS_pi1;
740
605
      x->nextstate = YXMLS_misc1;
741
605
      return yxml_pistart(x, ch);
742
605
    }
743
37
    break;
744
2.45k
  case YXMLS_misc0:
745
2.45k
    if(yxml_isSP(ch))
746
2.32k
      return YXML_OK;
747
134
    if(ch == (unsigned char)'<') {
748
89
      x->state = YXMLS_le0;
749
89
      return YXML_OK;
750
89
    }
751
45
    break;
752
6.55k
  case YXMLS_misc1:
753
6.55k
    if(yxml_isSP(ch))
754
1.20k
      return YXML_OK;
755
5.35k
    if(ch == (unsigned char)'<') {
756
5.33k
      x->state = YXMLS_le1;
757
5.33k
      return YXML_OK;
758
5.33k
    }
759
21
    break;
760
4.31G
  case YXMLS_misc2:
761
4.31G
    if(ch == (unsigned char)'<') {
762
67.0M
      x->state = YXMLS_le2;
763
67.0M
      return YXML_OK;
764
67.0M
    }
765
4.25G
    if(ch == (unsigned char)'&') {
766
5.14k
      x->state = YXMLS_misc2a;
767
5.14k
      return yxml_refstart(x, ch);
768
5.14k
    }
769
4.25G
    if(yxml_isChar(ch))
770
4.25G
      return yxml_datacontent(x, ch);
771
0
    break;
772
23.2k
  case YXMLS_misc2a:
773
23.2k
    if(yxml_isRef(ch))
774
18.1k
      return yxml_ref(x, ch);
775
5.06k
    if(ch == (unsigned char)'\x3b') {
776
5.02k
      x->state = YXMLS_misc2;
777
5.02k
      return yxml_refcontent(x, ch);
778
5.02k
    }
779
38
    break;
780
2.46k
  case YXMLS_misc3:
781
2.46k
    if(yxml_isSP(ch))
782
1.18k
      return YXML_OK;
783
1.28k
    if(ch == (unsigned char)'<') {
784
1.24k
      x->state = YXMLS_le3;
785
1.24k
      return YXML_OK;
786
1.24k
    }
787
43
    break;
788
7.53k
  case YXMLS_pi0:
789
7.53k
    if(yxml_isNameStart(ch)) {
790
7.50k
      x->state = YXMLS_pi1;
791
7.50k
      return yxml_pistart(x, ch);
792
7.50k
    }
793
28
    break;
794
19.5k
  case YXMLS_pi1:
795
19.5k
    if(yxml_isName(ch))
796
11.3k
      return yxml_piname(x, ch);
797
8.18k
    if(ch == (unsigned char)'?') {
798
5.38k
      x->state = YXMLS_pi4;
799
5.38k
      return yxml_pinameend(x, ch);
800
5.38k
    }
801
2.80k
    if(yxml_isSP(ch)) {
802
2.75k
      x->state = YXMLS_pi2;
803
2.75k
      return yxml_pinameend(x, ch);
804
2.75k
    }
805
50
    break;
806
796k
  case YXMLS_pi2:
807
796k
    if(ch == (unsigned char)'?') {
808
3.46k
      x->state = YXMLS_pi3;
809
3.46k
      return YXML_OK;
810
3.46k
    }
811
793k
    if(yxml_isChar(ch))
812
793k
      return yxml_datapi1(x, ch);
813
0
    break;
814
3.44k
  case YXMLS_pi3:
815
3.44k
    if(ch == (unsigned char)'>') {
816
2.64k
      x->state = x->nextstate;
817
2.64k
      return yxml_pivalend(x, ch);
818
2.64k
    }
819
800
    if(yxml_isChar(ch)) {
820
800
      x->state = YXMLS_pi2;
821
800
      return yxml_datapi2(x, ch);
822
800
    }
823
0
    break;
824
5.32k
  case YXMLS_pi4:
825
5.32k
    if(ch == (unsigned char)'>') {
826
5.30k
      x->state = x->nextstate;
827
5.30k
      return yxml_pivalend(x, ch);
828
5.30k
    }
829
19
    break;
830
1.39k
  case YXMLS_std0:
831
1.39k
    if(yxml_isSP(ch))
832
1.16k
      return YXML_OK;
833
232
    if(ch == (unsigned char)'=') {
834
207
      x->state = YXMLS_std1;
835
207
      return YXML_OK;
836
207
    }
837
25
    break;
838
1.32k
  case YXMLS_std1:
839
1.32k
    if(yxml_isSP(ch))
840
1.16k
      return YXML_OK;
841
158
    if(ch == (unsigned char)'\'' || ch == (unsigned char)'"') {
842
128
      x->state = YXMLS_std2;
843
128
      x->quote = ch;
844
128
      return YXML_OK;
845
128
    }
846
30
    break;
847
124
  case YXMLS_std2:
848
124
    if(ch == (unsigned char)'y') {
849
7
      x->state = YXMLS_string;
850
7
      x->nextstate = YXMLS_std3;
851
7
      x->string = (unsigned char *)"es";
852
7
      return YXML_OK;
853
7
    }
854
117
    if(ch == (unsigned char)'n') {
855
90
      x->state = YXMLS_string;
856
90
      x->nextstate = YXMLS_std3;
857
90
      x->string = (unsigned char *)"o";
858
90
      return YXML_OK;
859
90
    }
860
27
    break;
861
92
  case YXMLS_std3:
862
92
    if(x->quote == ch) {
863
90
      x->state = YXMLS_xmldecl8;
864
90
      return YXML_OK;
865
90
    }
866
2
    break;
867
2.19k
  case YXMLS_ver0:
868
2.19k
    if(yxml_isSP(ch))
869
1.16k
      return YXML_OK;
870
1.03k
    if(ch == (unsigned char)'=') {
871
1.01k
      x->state = YXMLS_ver1;
872
1.01k
      return YXML_OK;
873
1.01k
    }
874
15
    break;
875
2.13k
  case YXMLS_ver1:
876
2.13k
    if(yxml_isSP(ch))
877
1.16k
      return YXML_OK;
878
966
    if(ch == (unsigned char)'\'' || ch == (unsigned char)'"') {
879
934
      x->state = YXMLS_string;
880
934
      x->quote = ch;
881
934
      x->nextstate = YXMLS_ver2;
882
934
      x->string = (unsigned char *)"1.";
883
934
      return YXML_OK;
884
934
    }
885
32
    break;
886
928
  case YXMLS_ver2:
887
928
    if(yxml_isNum(ch)) {
888
916
      x->state = YXMLS_ver3;
889
916
      return YXML_OK;
890
916
    }
891
12
    break;
892
1.28k
  case YXMLS_ver3:
893
1.28k
    if(yxml_isNum(ch))
894
388
      return YXML_OK;
895
898
    if(x->quote == ch) {
896
877
      x->state = YXMLS_xmldecl4;
897
877
      return YXML_OK;
898
877
    }
899
21
    break;
900
1.86k
  case YXMLS_xmldecl0:
901
1.86k
    if(ch == (unsigned char)'m') {
902
1.58k
      x->state = YXMLS_xmldecl1;
903
1.58k
      return yxml_piname(x, ch);
904
1.58k
    }
905
276
    if(yxml_isName(ch)) {
906
144
      x->state = YXMLS_pi1;
907
144
      return yxml_piname(x, ch);
908
144
    }
909
132
    if(ch == (unsigned char)'?') {
910
34
      x->state = YXMLS_pi4;
911
34
      return yxml_pinameend(x, ch);
912
34
    }
913
98
    if(yxml_isSP(ch)) {
914
50
      x->state = YXMLS_pi2;
915
50
      return yxml_pinameend(x, ch);
916
50
    }
917
48
    break;
918
1.58k
  case YXMLS_xmldecl1:
919
1.58k
    if(ch == (unsigned char)'l') {
920
1.41k
      x->state = YXMLS_xmldecl2;
921
1.41k
      return yxml_piname(x, ch);
922
1.41k
    }
923
167
    if(yxml_isName(ch)) {
924
93
      x->state = YXMLS_pi1;
925
93
      return yxml_piname(x, ch);
926
93
    }
927
74
    if(ch == (unsigned char)'?') {
928
6
      x->state = YXMLS_pi4;
929
6
      return yxml_pinameend(x, ch);
930
6
    }
931
68
    if(yxml_isSP(ch)) {
932
20
      x->state = YXMLS_pi2;
933
20
      return yxml_pinameend(x, ch);
934
20
    }
935
48
    break;
936
1.41k
  case YXMLS_xmldecl2:
937
1.41k
    if(yxml_isSP(ch)) {
938
1.17k
      x->state = YXMLS_xmldecl3;
939
1.17k
      return yxml_piabort(x, ch);
940
1.17k
    }
941
246
    if(yxml_isName(ch)) {
942
204
      x->state = YXMLS_pi1;
943
204
      return yxml_piname(x, ch);
944
204
    }
945
42
    break;
946
2.28k
  case YXMLS_xmldecl3:
947
2.28k
    if(yxml_isSP(ch))
948
1.16k
      return YXML_OK;
949
1.11k
    if(ch == (unsigned char)'v') {
950
1.08k
      x->state = YXMLS_string;
951
1.08k
      x->nextstate = YXMLS_ver0;
952
1.08k
      x->string = (unsigned char *)"ersion";
953
1.08k
      return YXML_OK;
954
1.08k
    }
955
31
    break;
956
875
  case YXMLS_xmldecl4:
957
875
    if(yxml_isSP(ch)) {
958
809
      x->state = YXMLS_xmldecl5;
959
809
      return YXML_OK;
960
809
    }
961
66
    if(ch == (unsigned char)'?') {
962
36
      x->state = YXMLS_xmldecl9;
963
36
      return YXML_OK;
964
36
    }
965
30
    break;
966
1.91k
  case YXMLS_xmldecl5:
967
1.91k
    if(yxml_isSP(ch))
968
1.16k
      return YXML_OK;
969
755
    if(ch == (unsigned char)'?') {
970
14
      x->state = YXMLS_xmldecl9;
971
14
      return YXML_OK;
972
14
    }
973
741
    if(ch == (unsigned char)'e') {
974
443
      x->state = YXMLS_string;
975
443
      x->nextstate = YXMLS_enc0;
976
443
      x->string = (unsigned char *)"ncoding";
977
443
      return YXML_OK;
978
443
    }
979
298
    if(ch == (unsigned char)'s') {
980
276
      x->state = YXMLS_string;
981
276
      x->nextstate = YXMLS_std0;
982
276
      x->string = (unsigned char *)"tandalone";
983
276
      return YXML_OK;
984
276
    }
985
22
    break;
986
148
  case YXMLS_xmldecl6:
987
148
    if(yxml_isSP(ch)) {
988
106
      x->state = YXMLS_xmldecl7;
989
106
      return YXML_OK;
990
106
    }
991
42
    if(ch == (unsigned char)'?') {
992
10
      x->state = YXMLS_xmldecl9;
993
10
      return YXML_OK;
994
10
    }
995
32
    break;
996
1.21k
  case YXMLS_xmldecl7:
997
1.21k
    if(yxml_isSP(ch))
998
1.16k
      return YXML_OK;
999
52
    if(ch == (unsigned char)'?') {
1000
14
      x->state = YXMLS_xmldecl9;
1001
14
      return YXML_OK;
1002
14
    }
1003
38
    if(ch == (unsigned char)'s') {
1004
8
      x->state = YXMLS_string;
1005
8
      x->nextstate = YXMLS_std0;
1006
8
      x->string = (unsigned char *)"tandalone";
1007
8
      return YXML_OK;
1008
8
    }
1009
30
    break;
1010
1.20k
  case YXMLS_xmldecl8:
1011
1.20k
    if(yxml_isSP(ch))
1012
1.16k
      return YXML_OK;
1013
41
    if(ch == (unsigned char)'?') {
1014
18
      x->state = YXMLS_xmldecl9;
1015
18
      return YXML_OK;
1016
18
    }
1017
23
    break;
1018
82
  case YXMLS_xmldecl9:
1019
82
    if(ch == (unsigned char)'>') {
1020
62
      x->state = YXMLS_misc1;
1021
62
      return YXML_OK;
1022
62
    }
1023
20
    break;
1024
5.11G
  }
1025
1.63k
  return YXML_ESYN;
1026
5.11G
}
1027
1028
2.59M
yxml_ret_t yxml_eof(yxml_t *x) {
1029
2.59M
  if(x->state != YXMLS_misc3)
1030
4.21k
    return YXML_EEOF;
1031
2.58M
  return YXML_OK;
1032
2.59M
}
1033