Coverage Report

Created: 2026-08-30 06:27

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.53G
#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.22G
#define yxml_isAlpha(c) ((c|32)-'a' < 26)
103
616M
#define yxml_isNum(c) (c-'0' < 10)
104
4.72k
#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.15G
#define yxml_isNameStart(c) (yxml_isAlpha(c) || c == ':' || c == '_' || c >= 128)
107
537M
#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.6k
#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.39G
static inline void yxml_setchar(char *dest, unsigned ch) {
119
4.39G
  *(unsigned char *)dest = (unsigned char)ch;
120
4.39G
}
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.85k
static void yxml_setutf8(char *dest, unsigned ch) {
125
5.85k
  if(ch <= 0x007F)
126
4.07k
    yxml_setchar(dest++, ch);
127
1.78k
  else if(ch <= 0x07FF) {
128
427
    yxml_setchar(dest++, 0xC0 | (ch>>6));
129
427
    yxml_setchar(dest++, 0x80 | (ch & 0x3F));
130
1.35k
  } else if(ch <= 0xFFFF) {
131
578
    yxml_setchar(dest++, 0xE0 | (ch>>12));
132
578
    yxml_setchar(dest++, 0x80 | ((ch>>6) & 0x3F));
133
578
    yxml_setchar(dest++, 0x80 | (ch & 0x3F));
134
777
  } else {
135
777
    yxml_setchar(dest++, 0xF0 | (ch>>18));
136
777
    yxml_setchar(dest++, 0x80 | ((ch>>12) & 0x3F));
137
777
    yxml_setchar(dest++, 0x80 | ((ch>>6) & 0x3F));
138
777
    yxml_setchar(dest++, 0x80 | (ch & 0x3F));
139
777
  }
140
5.85k
  *dest = 0;
141
5.85k
}
142
143
4.27G
static inline yxml_ret_t yxml_datacontent(yxml_t *x, unsigned ch) {
144
4.27G
  yxml_setchar(x->data, ch);
145
4.27G
  x->data[1] = 0;
146
4.27G
  return YXML_CONTENT;
147
4.27G
}
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
801
static inline yxml_ret_t yxml_datapi2(yxml_t *x, unsigned ch) {
156
801
  x->data[0] = '?';
157
801
  yxml_setchar(x->data+1, ch);
158
801
  x->data[2] = 0;
159
801
  return YXML_PICONTENT;
160
801
}
161
162
498
static inline yxml_ret_t yxml_datacd1(yxml_t *x, unsigned ch) {
163
498
  x->data[0] = ']';
164
498
  yxml_setchar(x->data+1, ch);
165
498
  x->data[2] = 0;
166
498
  return YXML_CONTENT;
167
498
}
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.9M
static yxml_ret_t yxml_pushstack(yxml_t *x, char **res, unsigned ch) {
185
51.9M
  if(x->stacklen+2 >= x->stacksize)
186
8
    return YXML_ESTACK;
187
51.9M
  x->stacklen++;
188
51.9M
  *res = (char *)x->stack+x->stacklen;
189
51.9M
  x->stack[x->stacklen] = (unsigned char)ch;
190
51.9M
  x->stacklen++;
191
51.9M
  x->stack[x->stacklen] = 0;
192
51.9M
  return YXML_OK;
193
51.9M
}
194
195
281M
static yxml_ret_t yxml_pushstackc(yxml_t *x, unsigned ch) {
196
281M
  if(x->stacklen+1 >= x->stacksize)
197
7
    return YXML_ESTACK;
198
281M
  x->stack[x->stacklen] = (unsigned char)ch;
199
281M
  x->stacklen++;
200
281M
  x->stack[x->stacklen] = 0;
201
281M
  return YXML_OK;
202
281M
}
203
204
51.9M
static void yxml_popstack(yxml_t *x) {
205
51.9M
  do
206
385M
    x->stacklen--;
207
385M
  while(x->stack[x->stacklen]);
208
51.9M
}
209
210
45.8M
static inline yxml_ret_t yxml_elemstart  (yxml_t *x, unsigned ch) { return yxml_pushstack(x, &x->elem, ch); }
211
227M
static inline yxml_ret_t yxml_elemname   (yxml_t *x, unsigned ch) { return yxml_pushstackc(x, ch); }
212
45.8M
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.7M
static yxml_ret_t yxml_selfclose(yxml_t *x, unsigned ch) {
217
45.7M
  yxml_popstack(x);
218
45.7M
  if(x->stacklen) {
219
43.1M
    x->elem = (char *)x->stack+x->stacklen-1;
220
309M
    while(*(x->elem-1))
221
266M
      x->elem--;
222
43.1M
    return YXML_ELEMEND;
223
43.1M
  }
224
2.60M
  x->elem = (char *)x->stack;
225
2.60M
  x->state = YXMLS_misc3;
226
2.60M
  return YXML_ELEMEND;
227
45.7M
}
228
229
203M
static inline yxml_ret_t yxml_elemclose(yxml_t *x, unsigned ch) {
230
203M
  if(*((unsigned char *)x->elem) != ch)
231
198
    return YXML_ECLOSE;
232
203M
  x->elem++;
233
203M
  return YXML_OK;
234
203M
}
235
236
24.1M
static inline yxml_ret_t yxml_elemcloseend(yxml_t *x, unsigned ch) {
237
24.1M
  if(*x->elem)
238
2
    return YXML_ECLOSE;
239
24.1M
  return yxml_selfclose(x, ch);
240
24.1M
}
241
242
6.09M
static inline yxml_ret_t yxml_attrstart  (yxml_t *x, unsigned ch) { return yxml_pushstack(x, &x->attr, ch); }
243
54.8M
static inline yxml_ret_t yxml_attrname   (yxml_t *x, unsigned ch) { return yxml_pushstackc(x, ch); }
244
6.09M
static inline yxml_ret_t yxml_attrnameend(yxml_t *x, unsigned ch) { return YXML_ATTRSTART; }
245
6.09M
static inline yxml_ret_t yxml_attrvalend (yxml_t *x, unsigned ch) { yxml_popstack(x); return YXML_ATTREND; }
246
247
9.99k
static inline yxml_ret_t yxml_pistart  (yxml_t *x, unsigned ch) { return yxml_pushstack(x, &x->pi, ch); }
248
14.8k
static inline yxml_ret_t yxml_piname   (yxml_t *x, unsigned ch) { return yxml_pushstackc(x, ch); }
249
1.18k
static inline yxml_ret_t yxml_piabort  (yxml_t *x, unsigned ch) { yxml_popstack(x); return YXML_OK; }
250
8.25k
static inline yxml_ret_t yxml_pinameend(yxml_t *x, unsigned ch) {
251
8.25k
  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.25k
}
253
7.96k
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.46k
static inline yxml_ret_t yxml_refstart(yxml_t *x, unsigned ch) {
256
6.46k
  memset(x->data, 0, sizeof(x->data));
257
6.46k
  x->reflen = 0;
258
6.46k
  return YXML_OK;
259
6.46k
}
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.2k
  yxml_setchar(x->data+x->reflen, ch);
265
22.2k
  x->reflen++;
266
22.2k
  return YXML_OK;
267
22.2k
}
268
269
6.24k
static yxml_ret_t yxml_refend(yxml_t *x, yxml_ret_t ret) {
270
6.24k
  unsigned char *r = (unsigned char *)x->data;
271
6.24k
  unsigned ch = 0;
272
6.24k
  if(*r == '#') {
273
3.78k
    if(r[1] == 'x')
274
4.72k
      for(r += 2; yxml_isHex((unsigned)*r); r++)
275
3.37k
        ch = (ch<<4) + (*r <= '9' ? *r-'0' : (*r|32)-'a' + 10);
276
2.42k
    else
277
8.22k
      for(r++; yxml_isNum((unsigned)*r); r++)
278
5.79k
        ch = (ch*10) + (*r-'0');
279
3.78k
    if(*r)
280
21
      ch = 0;
281
3.78k
  } else {
282
2.45k
    uint64_t i = INTFROM5CHARS(r[0], r[1], r[2], r[3], r[4]);
283
2.45k
    ch =
284
2.45k
      i == INTFROM5CHARS('l','t', 0,  0, 0) ? '<' :
285
2.45k
      i == INTFROM5CHARS('g','t', 0,  0, 0) ? '>' :
286
2.02k
      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.45k
  }
290
291
  /* Codepoints not allowed in the XML 1.1 definition of a Char */
292
6.24k
  if(!ch || ch > 0x10FFFF || ch == 0xFFFE || ch == 0xFFFF || (ch-0xDFFF) < 0x7FF)
293
390
    return YXML_EREF;
294
5.85k
  yxml_setutf8(x->data, ch);
295
5.85k
  return ret;
296
6.24k
}
297
298
5.04k
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.60M
void yxml_init(yxml_t *x, void *stack, size_t stacksize) {
302
2.60M
  memset(x, 0, sizeof(*x));
303
2.60M
  x->line = 1;
304
2.60M
  x->stack = (unsigned char*)stack;
305
2.60M
  x->stacksize = stacksize;
306
2.60M
  *x->stack = 0;
307
2.60M
  x->elem = x->pi = x->attr = (char *)x->stack;
308
2.60M
  x->state = YXMLS_init;
309
2.60M
}
310
311
5.14G
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.14G
  unsigned ch = (unsigned)(_ch+256) & 0xff;
315
5.14G
  if(!ch)
316
6
    return YXML_ESYN;
317
5.14G
  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.14G
  if(x->ignore == ch) {
324
2.55k
    x->ignore = 0;
325
2.55k
    return YXML_OK;
326
2.55k
  }
327
5.14G
  x->ignore = (ch == 0xd) * 0xa;
328
5.14G
  if(ch == 0xa || ch == 0xd) {
329
3.20M
    ch = 0xa;
330
3.20M
    x->line++;
331
3.20M
    x->byte = 0;
332
3.20M
  }
333
5.14G
  x->byte++;
334
335
5.14G
  switch((yxml_state_t)x->state) {
336
23.8k
  case YXMLS_string:
337
23.8k
    if(ch == *x->string) {
338
23.8k
      x->string++;
339
23.8k
      if(!*x->string)
340
4.45k
        x->state = x->nextstate;
341
23.8k
      return YXML_OK;
342
23.8k
    }
343
23
    break;
344
60.9M
  case YXMLS_attr0:
345
60.9M
    if(yxml_isName(ch))
346
54.8M
      return yxml_attrname(x, ch);
347
6.09M
    if(yxml_isSP(ch)) {
348
1.57M
      x->state = YXMLS_attr1;
349
1.57M
      return yxml_attrnameend(x, ch);
350
1.57M
    }
351
4.52M
    if(ch == (unsigned char)'=') {
352
4.52M
      x->state = YXMLS_attr2;
353
4.52M
      return yxml_attrnameend(x, ch);
354
4.52M
    }
355
52
    break;
356
1.57M
  case YXMLS_attr1:
357
1.57M
    if(yxml_isSP(ch))
358
2.68k
      return YXML_OK;
359
1.57M
    if(ch == (unsigned char)'=') {
360
1.57M
      x->state = YXMLS_attr2;
361
1.57M
      return YXML_OK;
362
1.57M
    }
363
41
    break;
364
6.10M
  case YXMLS_attr2:
365
6.10M
    if(yxml_isSP(ch))
366
1.16k
      return YXML_OK;
367
6.09M
    if(ch == (unsigned char)'\'' || ch == (unsigned char)'"') {
368
6.09M
      x->state = YXMLS_attr3;
369
6.09M
      x->quote = ch;
370
6.09M
      return YXML_OK;
371
6.09M
    }
372
32
    break;
373
127M
  case YXMLS_attr3:
374
127M
    if(yxml_isAttValue(ch))
375
121M
      return yxml_dataattr(x, ch);
376
6.09M
    if(ch == (unsigned char)'&') {
377
1.30k
      x->state = YXMLS_attr4;
378
1.30k
      return yxml_refstart(x, ch);
379
1.30k
    }
380
6.09M
    if(x->quote == ch) {
381
6.09M
      x->state = YXMLS_elem2;
382
6.09M
      return yxml_attrvalend(x, ch);
383
6.09M
    }
384
2
    break;
385
5.26k
  case YXMLS_attr4:
386
5.26k
    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
30
    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.27k
    if(yxml_isChar(ch))
399
1.27k
      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
498
    if(yxml_isChar(ch)) {
407
498
      x->state = YXMLS_cd0;
408
498
      return yxml_datacd1(x, ch);
409
498
    }
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.44k
  case YXMLS_comment1:
430
2.44k
    if(ch == (unsigned char)'-') {
431
2.41k
      x->state = YXMLS_comment2;
432
2.41k
      return YXML_OK;
433
2.41k
    }
434
21
    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
488
    if(yxml_isChar(ch))
441
488
      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
447
    if(yxml_isChar(ch))
475
447
      return YXML_OK;
476
0
    break;
477
2.27k
  case YXMLS_dt1:
478
2.27k
    if(x->quote == ch) {
479
1.87k
      x->state = x->nextstate;
480
1.87k
      return YXML_OK;
481
1.87k
    }
482
403
    if(yxml_isChar(ch))
483
403
      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
781
    if(yxml_isChar(ch)) {
503
781
      x->state = YXMLS_dt4;
504
781
      return YXML_OK;
505
781
    }
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
272M
  case YXMLS_elem0:
522
272M
    if(yxml_isName(ch))
523
227M
      return yxml_elemname(x, ch);
524
45.8M
    if(yxml_isSP(ch)) {
525
3.54M
      x->state = YXMLS_elem1;
526
3.54M
      return yxml_elemnameend(x, ch);
527
3.54M
    }
528
42.2M
    if(ch == (unsigned char)'/') {
529
19.3M
      x->state = YXMLS_elem3;
530
19.3M
      return yxml_elemnameend(x, ch);
531
19.3M
    }
532
22.9M
    if(ch == (unsigned char)'>') {
533
22.9M
      x->state = YXMLS_misc2;
534
22.9M
      return yxml_elemnameend(x, ch);
535
22.9M
    }
536
54
    break;
537
8.21M
  case YXMLS_elem1:
538
8.21M
    if(yxml_isSP(ch))
539
1.24M
      return YXML_OK;
540
6.97M
    if(ch == (unsigned char)'/') {
541
874k
      x->state = YXMLS_elem3;
542
874k
      return YXML_OK;
543
874k
    }
544
6.10M
    if(ch == (unsigned char)'>') {
545
817
      x->state = YXMLS_misc2;
546
817
      return YXML_OK;
547
817
    }
548
6.09M
    if(yxml_isNameStart(ch)) {
549
6.09M
      x->state = YXMLS_attr0;
550
6.09M
      return yxml_attrstart(x, ch);
551
6.09M
    }
552
46
    break;
553
6.09M
  case YXMLS_elem2:
554
6.09M
    if(yxml_isSP(ch)) {
555
3.43M
      x->state = YXMLS_elem1;
556
3.43M
      return YXML_OK;
557
3.43M
    }
558
2.66M
    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
42
    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
395
    if(ch == (unsigned char)'=') {
577
381
      x->state = YXMLS_enc1;
578
381
      return YXML_OK;
579
381
    }
580
14
    break;
581
1.49k
  case YXMLS_enc1:
582
1.49k
    if(yxml_isSP(ch))
583
1.16k
      return YXML_OK;
584
331
    if(ch == (unsigned char)'\'' || ch == (unsigned char)'"') {
585
300
      x->state = YXMLS_enc2;
586
300
      x->quote = ch;
587
300
      return YXML_OK;
588
300
    }
589
31
    break;
590
296
  case YXMLS_enc2:
591
296
    if(yxml_isAlpha(ch)) {
592
278
      x->state = YXMLS_enc3;
593
278
      return YXML_OK;
594
278
    }
595
18
    break;
596
2.14k
  case YXMLS_enc3:
597
2.14k
    if(yxml_isEncName(ch))
598
1.95k
      return YXML_OK;
599
185
    if(x->quote == ch) {
600
151
      x->state = YXMLS_xmldecl6;
601
151
      return YXML_OK;
602
151
    }
603
34
    break;
604
24.1M
  case YXMLS_etag0:
605
24.1M
    if(yxml_isNameStart(ch)) {
606
24.1M
      x->state = YXMLS_etag1;
607
24.1M
      return yxml_elemclose(x, ch);
608
24.1M
    }
609
32
    break;
610
203M
  case YXMLS_etag1:
611
203M
    if(yxml_isName(ch))
612
179M
      return yxml_elemclose(x, ch);
613
24.1M
    if(yxml_isSP(ch)) {
614
1.49k
      x->state = YXMLS_etag2;
615
1.49k
      return yxml_elemcloseend(x, ch);
616
1.49k
    }
617
24.1M
    if(ch == (unsigned char)'>') {
618
24.1M
      x->state = YXMLS_misc2;
619
24.1M
      return yxml_elemcloseend(x, ch);
620
24.1M
    }
621
43
    break;
622
3.99k
  case YXMLS_etag2:
623
3.99k
    if(yxml_isSP(ch))
624
2.59k
      return YXML_OK;
625
1.40k
    if(ch == (unsigned char)'>') {
626
1.36k
      x->state = YXMLS_misc2;
627
1.36k
      return YXML_OK;
628
1.36k
    }
629
38
    break;
630
2.60M
  case YXMLS_init:
631
2.60M
    if(ch == (unsigned char)'\xef') {
632
36
      x->state = YXMLS_string;
633
36
      x->nextstate = YXMLS_misc0;
634
36
      x->string = (unsigned char *)"\xbb\xbf";
635
36
      return YXML_OK;
636
36
    }
637
2.60M
    if(yxml_isSP(ch)) {
638
224
      x->state = YXMLS_misc0;
639
224
      return YXML_OK;
640
224
    }
641
2.60M
    if(ch == (unsigned char)'<') {
642
2.60M
      x->state = YXMLS_le0;
643
2.60M
      return YXML_OK;
644
2.60M
    }
645
59
    break;
646
2.60M
  case YXMLS_le0:
647
2.60M
    if(ch == (unsigned char)'!') {
648
586
      x->state = YXMLS_lee1;
649
586
      return YXML_OK;
650
586
    }
651
2.60M
    if(ch == (unsigned char)'?') {
652
2.52k
      x->state = YXMLS_leq0;
653
2.52k
      return YXML_OK;
654
2.52k
    }
655
2.60M
    if(yxml_isNameStart(ch)) {
656
2.60M
      x->state = YXMLS_elem0;
657
2.60M
      return yxml_elemstart(x, ch);
658
2.60M
    }
659
47
    break;
660
5.31k
  case YXMLS_le1:
661
5.31k
    if(ch == (unsigned char)'!') {
662
1.59k
      x->state = YXMLS_lee1;
663
1.59k
      return YXML_OK;
664
1.59k
    }
665
3.72k
    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
445
    if(yxml_isNameStart(ch)) {
671
416
      x->state = YXMLS_elem0;
672
416
      return yxml_elemstart(x, ch);
673
416
    }
674
29
    break;
675
67.3M
  case YXMLS_le2:
676
67.3M
    if(ch == (unsigned char)'!') {
677
1.21k
      x->state = YXMLS_lee2;
678
1.21k
      return YXML_OK;
679
1.21k
    }
680
67.3M
    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.3M
    if(ch == (unsigned char)'/') {
686
24.1M
      x->state = YXMLS_etag0;
687
24.1M
      return YXML_OK;
688
24.1M
    }
689
43.1M
    if(yxml_isNameStart(ch)) {
690
43.1M
      x->state = YXMLS_elem0;
691
43.1M
      return yxml_elemstart(x, ch);
692
43.1M
    }
693
47
    break;
694
1.23k
  case YXMLS_le3:
695
1.23k
    if(ch == (unsigned char)'!') {
696
460
      x->state = YXMLS_comment0;
697
460
      x->nextstate = YXMLS_misc3;
698
460
      return YXML_OK;
699
460
    }
700
771
    if(ch == (unsigned char)'?') {
701
737
      x->state = YXMLS_pi0;
702
737
      x->nextstate = YXMLS_misc3;
703
737
      return YXML_OK;
704
737
    }
705
34
    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.02k
    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
657
    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
28
    break;
732
2.52k
  case YXMLS_leq0:
733
2.52k
    if(ch == (unsigned char)'x') {
734
1.88k
      x->state = YXMLS_xmldecl0;
735
1.88k
      x->nextstate = YXMLS_misc1;
736
1.88k
      return yxml_pistart(x, ch);
737
1.88k
    }
738
641
    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
36
    break;
744
2.44k
  case YXMLS_misc0:
745
2.44k
    if(yxml_isSP(ch))
746
2.30k
      return YXML_OK;
747
137
    if(ch == (unsigned char)'<') {
748
91
      x->state = YXMLS_le0;
749
91
      return YXML_OK;
750
91
    }
751
46
    break;
752
6.56k
  case YXMLS_misc1:
753
6.56k
    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
22
    break;
760
4.34G
  case YXMLS_misc2:
761
4.34G
    if(ch == (unsigned char)'<') {
762
67.3M
      x->state = YXMLS_le2;
763
67.3M
      return YXML_OK;
764
67.3M
    }
765
4.27G
    if(ch == (unsigned char)'&') {
766
5.16k
      x->state = YXMLS_misc2a;
767
5.16k
      return yxml_refstart(x, ch);
768
5.16k
    }
769
4.27G
    if(yxml_isChar(ch))
770
4.27G
      return yxml_datacontent(x, ch);
771
0
    break;
772
23.3k
  case YXMLS_misc2a:
773
23.3k
    if(yxml_isRef(ch))
774
18.2k
      return yxml_ref(x, ch);
775
5.07k
    if(ch == (unsigned char)'\x3b') {
776
5.04k
      x->state = YXMLS_misc2;
777
5.04k
      return yxml_refcontent(x, ch);
778
5.04k
    }
779
36
    break;
780
2.47k
  case YXMLS_misc3:
781
2.47k
    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.19k
    if(ch == (unsigned char)'?') {
798
5.39k
      x->state = YXMLS_pi4;
799
5.39k
      return yxml_pinameend(x, ch);
800
5.39k
    }
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
52
    break;
806
796k
  case YXMLS_pi2:
807
796k
    if(ch == (unsigned char)'?') {
808
3.47k
      x->state = YXMLS_pi3;
809
3.47k
      return YXML_OK;
810
3.47k
    }
811
793k
    if(yxml_isChar(ch))
812
793k
      return yxml_datapi1(x, ch);
813
0
    break;
814
3.45k
  case YXMLS_pi3:
815
3.45k
    if(ch == (unsigned char)'>') {
816
2.65k
      x->state = x->nextstate;
817
2.65k
      return yxml_pivalend(x, ch);
818
2.65k
    }
819
801
    if(yxml_isChar(ch)) {
820
801
      x->state = YXMLS_pi2;
821
801
      return yxml_datapi2(x, ch);
822
801
    }
823
0
    break;
824
5.33k
  case YXMLS_pi4:
825
5.33k
    if(ch == (unsigned char)'>') {
826
5.31k
      x->state = x->nextstate;
827
5.31k
      return yxml_pivalend(x, ch);
828
5.31k
    }
829
19
    break;
830
1.39k
  case YXMLS_std0:
831
1.39k
    if(yxml_isSP(ch))
832
1.16k
      return YXML_OK;
833
235
    if(ch == (unsigned char)'=') {
834
209
      x->state = YXMLS_std1;
835
209
      return YXML_OK;
836
209
    }
837
26
    break;
838
1.32k
  case YXMLS_std1:
839
1.32k
    if(yxml_isSP(ch))
840
1.16k
      return YXML_OK;
841
160
    if(ch == (unsigned char)'\'' || ch == (unsigned char)'"') {
842
130
      x->state = YXMLS_std2;
843
130
      x->quote = ch;
844
130
      return YXML_OK;
845
130
    }
846
30
    break;
847
126
  case YXMLS_std2:
848
126
    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
119
    if(ch == (unsigned char)'n') {
855
91
      x->state = YXMLS_string;
856
91
      x->nextstate = YXMLS_std3;
857
91
      x->string = (unsigned char *)"o";
858
91
      return YXML_OK;
859
91
    }
860
28
    break;
861
93
  case YXMLS_std3:
862
93
    if(x->quote == ch) {
863
91
      x->state = YXMLS_xmldecl8;
864
91
      return YXML_OK;
865
91
    }
866
2
    break;
867
2.21k
  case YXMLS_ver0:
868
2.21k
    if(yxml_isSP(ch))
869
1.16k
      return YXML_OK;
870
1.04k
    if(ch == (unsigned char)'=') {
871
1.03k
      x->state = YXMLS_ver1;
872
1.03k
      return YXML_OK;
873
1.03k
    }
874
18
    break;
875
2.14k
  case YXMLS_ver1:
876
2.14k
    if(yxml_isSP(ch))
877
1.16k
      return YXML_OK;
878
980
    if(ch == (unsigned char)'\'' || ch == (unsigned char)'"') {
879
948
      x->state = YXMLS_string;
880
948
      x->quote = ch;
881
948
      x->nextstate = YXMLS_ver2;
882
948
      x->string = (unsigned char *)"1.";
883
948
      return YXML_OK;
884
948
    }
885
32
    break;
886
942
  case YXMLS_ver2:
887
942
    if(yxml_isNum(ch)) {
888
929
      x->state = YXMLS_ver3;
889
929
      return YXML_OK;
890
929
    }
891
13
    break;
892
1.29k
  case YXMLS_ver3:
893
1.29k
    if(yxml_isNum(ch))
894
388
      return YXML_OK;
895
911
    if(x->quote == ch) {
896
889
      x->state = YXMLS_xmldecl4;
897
889
      return YXML_OK;
898
889
    }
899
22
    break;
900
1.87k
  case YXMLS_xmldecl0:
901
1.87k
    if(ch == (unsigned char)'m') {
902
1.59k
      x->state = YXMLS_xmldecl1;
903
1.59k
      return yxml_piname(x, ch);
904
1.59k
    }
905
283
    if(yxml_isName(ch)) {
906
149
      x->state = YXMLS_pi1;
907
149
      return yxml_piname(x, ch);
908
149
    }
909
134
    if(ch == (unsigned char)'?') {
910
34
      x->state = YXMLS_pi4;
911
34
      return yxml_pinameend(x, ch);
912
34
    }
913
100
    if(yxml_isSP(ch)) {
914
52
      x->state = YXMLS_pi2;
915
52
      return yxml_pinameend(x, ch);
916
52
    }
917
48
    break;
918
1.59k
  case YXMLS_xmldecl1:
919
1.59k
    if(ch == (unsigned char)'l') {
920
1.43k
      x->state = YXMLS_xmldecl2;
921
1.43k
      return yxml_piname(x, ch);
922
1.43k
    }
923
163
    if(yxml_isName(ch)) {
924
91
      x->state = YXMLS_pi1;
925
91
      return yxml_piname(x, ch);
926
91
    }
927
72
    if(ch == (unsigned char)'?') {
928
6
      x->state = YXMLS_pi4;
929
6
      return yxml_pinameend(x, ch);
930
6
    }
931
66
    if(yxml_isSP(ch)) {
932
20
      x->state = YXMLS_pi2;
933
20
      return yxml_pinameend(x, ch);
934
20
    }
935
46
    break;
936
1.42k
  case YXMLS_xmldecl2:
937
1.42k
    if(yxml_isSP(ch)) {
938
1.18k
      x->state = YXMLS_xmldecl3;
939
1.18k
      return yxml_piabort(x, ch);
940
1.18k
    }
941
242
    if(yxml_isName(ch)) {
942
202
      x->state = YXMLS_pi1;
943
202
      return yxml_piname(x, ch);
944
202
    }
945
40
    break;
946
2.29k
  case YXMLS_xmldecl3:
947
2.29k
    if(yxml_isSP(ch))
948
1.16k
      return YXML_OK;
949
1.13k
    if(ch == (unsigned char)'v') {
950
1.10k
      x->state = YXMLS_string;
951
1.10k
      x->nextstate = YXMLS_ver0;
952
1.10k
      x->string = (unsigned char *)"ersion";
953
1.10k
      return YXML_OK;
954
1.10k
    }
955
31
    break;
956
887
  case YXMLS_xmldecl4:
957
887
    if(yxml_isSP(ch)) {
958
819
      x->state = YXMLS_xmldecl5;
959
819
      return YXML_OK;
960
819
    }
961
68
    if(ch == (unsigned char)'?') {
962
36
      x->state = YXMLS_xmldecl9;
963
36
      return YXML_OK;
964
36
    }
965
32
    break;
966
1.92k
  case YXMLS_xmldecl5:
967
1.92k
    if(yxml_isSP(ch))
968
1.16k
      return YXML_OK;
969
765
    if(ch == (unsigned char)'?') {
970
14
      x->state = YXMLS_xmldecl9;
971
14
      return YXML_OK;
972
14
    }
973
751
    if(ch == (unsigned char)'e') {
974
446
      x->state = YXMLS_string;
975
446
      x->nextstate = YXMLS_enc0;
976
446
      x->string = (unsigned char *)"ncoding";
977
446
      return YXML_OK;
978
446
    }
979
305
    if(ch == (unsigned char)'s') {
980
279
      x->state = YXMLS_string;
981
279
      x->nextstate = YXMLS_std0;
982
279
      x->string = (unsigned char *)"tandalone";
983
279
      return YXML_OK;
984
279
    }
985
26
    break;
986
149
  case YXMLS_xmldecl6:
987
149
    if(yxml_isSP(ch)) {
988
107
      x->state = YXMLS_xmldecl7;
989
107
      return YXML_OK;
990
107
    }
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
53
    if(ch == (unsigned char)'?') {
1000
14
      x->state = YXMLS_xmldecl9;
1001
14
      return YXML_OK;
1002
14
    }
1003
39
    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
31
    break;
1010
1.20k
  case YXMLS_xmldecl8:
1011
1.20k
    if(yxml_isSP(ch))
1012
1.16k
      return YXML_OK;
1013
42
    if(ch == (unsigned char)'?') {
1014
18
      x->state = YXMLS_xmldecl9;
1015
18
      return YXML_OK;
1016
18
    }
1017
24
    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.14G
  }
1025
1.67k
  return YXML_ESYN;
1026
5.14G
}
1027
1028
2.60M
yxml_ret_t yxml_eof(yxml_t *x) {
1029
2.60M
  if(x->state != YXMLS_misc3)
1030
4.21k
    return YXML_EEOF;
1031
2.60M
  return YXML_OK;
1032
2.60M
}
1033