Coverage Report

Created: 2026-05-30 06:22

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.90G
#define yxml_isChar(c) 1
100
/* 0xd should be part of SP, too, but yxml_parse() already normalizes that into 0xa */
101
68.6M
#define yxml_isSP(c) (c == 0x20 || c == 0x09 || c == 0x0a)
102
594M
#define yxml_isAlpha(c) ((c|32)-'a' < 26)
103
298M
#define yxml_isNum(c) (c-'0' < 10)
104
16.0k
#define yxml_isHex(c) (yxml_isNum(c) || (c|32)-'a' < 6)
105
2.15k
#define yxml_isEncName(c) (yxml_isAlpha(c) || yxml_isNum(c) || c == '.' || c == '_' || c == '-')
106
552M
#define yxml_isNameStart(c) (yxml_isAlpha(c) || c == ':' || c == '_' || c >= 128)
107
255M
#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
56.5M
#define yxml_isAttValue(c) (yxml_isChar(c) && c != x->quote && c != '<' && c != '&')
110
/* Anything between '&' and ';', the yxml_ref* functions will do further
111
 * validation. Strictly speaking, this is "yxml_isName(c) || c == '#'", but
112
 * this parser doesn't understand entities with '.', ':', etc, anwyay.  */
113
46.2k
#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.84G
static inline void yxml_setchar(char *dest, unsigned ch) {
119
1.84G
  *(unsigned char *)dest = (unsigned char)ch;
120
1.84G
}
121
122
/* Similar to yxml_setchar(), but will convert ch (any valid unicode point) to
123
 * UTF-8 and appends a '\0'. dest must have room for at least 5 bytes. */
124
8.50k
static void yxml_setutf8(char *dest, unsigned ch) {
125
8.50k
  if(ch <= 0x007F)
126
4.06k
    yxml_setchar(dest++, ch);
127
4.44k
  else if(ch <= 0x07FF) {
128
483
    yxml_setchar(dest++, 0xC0 | (ch>>6));
129
483
    yxml_setchar(dest++, 0x80 | (ch & 0x3F));
130
3.96k
  } else if(ch <= 0xFFFF) {
131
3.18k
    yxml_setchar(dest++, 0xE0 | (ch>>12));
132
3.18k
    yxml_setchar(dest++, 0x80 | ((ch>>6) & 0x3F));
133
3.18k
    yxml_setchar(dest++, 0x80 | (ch & 0x3F));
134
3.18k
  } else {
135
781
    yxml_setchar(dest++, 0xF0 | (ch>>18));
136
781
    yxml_setchar(dest++, 0x80 | ((ch>>12) & 0x3F));
137
781
    yxml_setchar(dest++, 0x80 | ((ch>>6) & 0x3F));
138
781
    yxml_setchar(dest++, 0x80 | (ch & 0x3F));
139
781
  }
140
8.50k
  *dest = 0;
141
8.50k
}
142
143
1.79G
static inline yxml_ret_t yxml_datacontent(yxml_t *x, unsigned ch) {
144
1.79G
  yxml_setchar(x->data, ch);
145
1.79G
  x->data[1] = 0;
146
1.79G
  return YXML_CONTENT;
147
1.79G
}
148
149
73.0k
static inline yxml_ret_t yxml_datapi1(yxml_t *x, unsigned ch) {
150
73.0k
  yxml_setchar(x->data, ch);
151
73.0k
  x->data[1] = 0;
152
73.0k
  return YXML_PICONTENT;
153
73.0k
}
154
155
653
static inline yxml_ret_t yxml_datapi2(yxml_t *x, unsigned ch) {
156
653
  x->data[0] = '?';
157
653
  yxml_setchar(x->data+1, ch);
158
653
  x->data[2] = 0;
159
653
  return YXML_PICONTENT;
160
653
}
161
162
490
static inline yxml_ret_t yxml_datacd1(yxml_t *x, unsigned ch) {
163
490
  x->data[0] = ']';
164
490
  yxml_setchar(x->data+1, ch);
165
490
  x->data[2] = 0;
166
490
  return YXML_CONTENT;
167
490
}
168
169
550
static inline yxml_ret_t yxml_datacd2(yxml_t *x, unsigned ch) {
170
550
  x->data[0] = ']';
171
550
  x->data[1] = ']';
172
550
  yxml_setchar(x->data+2, ch);
173
550
  x->data[3] = 0;
174
550
  return YXML_CONTENT;
175
550
}
176
177
50.7M
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
50.7M
  yxml_setchar(x->data, ch == 0x9 || ch == 0xa ? 0x20 : ch);
180
50.7M
  x->data[1] = 0;
181
50.7M
  return YXML_ATTRVAL;
182
50.7M
}
183
184
31.8M
static yxml_ret_t yxml_pushstack(yxml_t *x, char **res, unsigned ch) {
185
31.8M
  if(x->stacklen+2 >= x->stacksize)
186
9
    return YXML_ESTACK;
187
31.8M
  x->stacklen++;
188
31.8M
  *res = (char *)x->stack+x->stacklen;
189
31.8M
  x->stack[x->stacklen] = (unsigned char)ch;
190
31.8M
  x->stacklen++;
191
31.8M
  x->stack[x->stacklen] = 0;
192
31.8M
  return YXML_OK;
193
31.8M
}
194
195
139M
static yxml_ret_t yxml_pushstackc(yxml_t *x, unsigned ch) {
196
139M
  if(x->stacklen+1 >= x->stacksize)
197
8
    return YXML_ESTACK;
198
139M
  x->stack[x->stacklen] = (unsigned char)ch;
199
139M
  x->stacklen++;
200
139M
  x->stack[x->stacklen] = 0;
201
139M
  return YXML_OK;
202
139M
}
203
204
31.8M
static void yxml_popstack(yxml_t *x) {
205
31.8M
  do
206
202M
    x->stacklen--;
207
202M
  while(x->stack[x->stacklen]);
208
31.8M
}
209
210
26.0M
static inline yxml_ret_t yxml_elemstart  (yxml_t *x, unsigned ch) { return yxml_pushstack(x, &x->elem, ch); }
211
94.8M
static inline yxml_ret_t yxml_elemname   (yxml_t *x, unsigned ch) { return yxml_pushstackc(x, ch); }
212
26.0M
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
26.0M
static yxml_ret_t yxml_selfclose(yxml_t *x, unsigned ch) {
217
26.0M
  yxml_popstack(x);
218
26.0M
  if(x->stacklen) {
219
24.9M
    x->elem = (char *)x->stack+x->stacklen-1;
220
144M
    while(*(x->elem-1))
221
119M
      x->elem--;
222
24.9M
    return YXML_ELEMEND;
223
24.9M
  }
224
1.08M
  x->elem = (char *)x->stack;
225
1.08M
  x->state = YXMLS_misc3;
226
1.08M
  return YXML_ELEMEND;
227
26.0M
}
228
229
84.5M
static inline yxml_ret_t yxml_elemclose(yxml_t *x, unsigned ch) {
230
84.5M
  if(*((unsigned char *)x->elem) != ch)
231
197
    return YXML_ECLOSE;
232
84.5M
  x->elem++;
233
84.5M
  return YXML_OK;
234
84.5M
}
235
236
10.0M
static inline yxml_ret_t yxml_elemcloseend(yxml_t *x, unsigned ch) {
237
10.0M
  if(*x->elem)
238
16
    return YXML_ECLOSE;
239
10.0M
  return yxml_selfclose(x, ch);
240
10.0M
}
241
242
5.79M
static inline yxml_ret_t yxml_attrstart  (yxml_t *x, unsigned ch) { return yxml_pushstack(x, &x->attr, ch); }
243
44.1M
static inline yxml_ret_t yxml_attrname   (yxml_t *x, unsigned ch) { return yxml_pushstackc(x, ch); }
244
5.79M
static inline yxml_ret_t yxml_attrnameend(yxml_t *x, unsigned ch) { return YXML_ATTRSTART; }
245
5.79M
static inline yxml_ret_t yxml_attrvalend (yxml_t *x, unsigned ch) { yxml_popstack(x); return YXML_ATTREND; }
246
247
9.25k
static inline yxml_ret_t yxml_pistart  (yxml_t *x, unsigned ch) { return yxml_pushstack(x, &x->pi, ch); }
248
12.5k
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
7.46k
static inline yxml_ret_t yxml_pinameend(yxml_t *x, unsigned ch) {
251
7.46k
  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.46k
}
253
7.09k
static inline yxml_ret_t yxml_pivalend (yxml_t *x, unsigned ch) { yxml_popstack(x); x->pi = (char *)x->stack; return YXML_PIEND; }
254
255
9.12k
static inline yxml_ret_t yxml_refstart(yxml_t *x, unsigned ch) {
256
9.12k
  memset(x->data, 0, sizeof(x->data));
257
9.12k
  x->reflen = 0;
258
9.12k
  return YXML_OK;
259
9.12k
}
260
261
37.2k
static yxml_ret_t yxml_ref(yxml_t *x, unsigned ch) {
262
37.2k
  if(x->reflen >= sizeof(x->data)-1)
263
34
    return YXML_EREF;
264
37.2k
  yxml_setchar(x->data+x->reflen, ch);
265
37.2k
  x->reflen++;
266
37.2k
  return YXML_OK;
267
37.2k
}
268
269
8.90k
static yxml_ret_t yxml_refend(yxml_t *x, yxml_ret_t ret) {
270
8.90k
  unsigned char *r = (unsigned char *)x->data;
271
8.90k
  unsigned ch = 0;
272
8.90k
  if(*r == '#') {
273
6.48k
    if(r[1] == 'x')
274
16.0k
      for(r += 2; yxml_isHex((unsigned)*r); r++)
275
12.0k
        ch = (ch<<4) + (*r <= '9' ? *r-'0' : (*r|32)-'a' + 10);
276
2.56k
    else
277
9.57k
      for(r++; yxml_isNum((unsigned)*r); r++)
278
7.01k
        ch = (ch*10) + (*r-'0');
279
6.48k
    if(*r)
280
18
      ch = 0;
281
6.48k
  } else {
282
2.41k
    uint64_t i = INTFROM5CHARS(r[0], r[1], r[2], r[3], r[4]);
283
2.41k
    ch =
284
2.41k
      i == INTFROM5CHARS('l','t', 0,  0, 0) ? '<' :
285
2.41k
      i == INTFROM5CHARS('g','t', 0,  0, 0) ? '>' :
286
1.98k
      i == INTFROM5CHARS('a','m','p', 0, 0) ? '&' :
287
1.59k
      i == INTFROM5CHARS('a','p','o','s',0) ? '\'':
288
1.20k
      i == INTFROM5CHARS('q','u','o','t',0) ? '"' : 0;
289
2.41k
  }
290
291
  /* Codepoints not allowed in the XML 1.1 definition of a Char */
292
8.90k
  if(!ch || ch > 0x10FFFF || ch == 0xFFFE || ch == 0xFFFF || (ch-0xDFFF) < 0x7FF)
293
394
    return YXML_EREF;
294
8.50k
  yxml_setutf8(x->data, ch);
295
8.50k
  return ret;
296
8.90k
}
297
298
7.68k
static inline yxml_ret_t yxml_refcontent(yxml_t *x, unsigned ch) { return yxml_refend(x, YXML_CONTENT); }
299
1.21k
static inline yxml_ret_t yxml_refattrval(yxml_t *x, unsigned ch) { return yxml_refend(x, YXML_ATTRVAL); }
300
301
1.09M
void yxml_init(yxml_t *x, void *stack, size_t stacksize) {
302
1.09M
  memset(x, 0, sizeof(*x));
303
1.09M
  x->line = 1;
304
1.09M
  x->stack = (unsigned char*)stack;
305
1.09M
  x->stacksize = stacksize;
306
1.09M
  *x->stack = 0;
307
1.09M
  x->elem = x->pi = x->attr = (char *)x->stack;
308
1.09M
  x->state = YXMLS_init;
309
1.09M
}
310
311
2.22G
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.22G
  unsigned ch = (unsigned)(_ch+256) & 0xff;
315
2.22G
  if(!ch)
316
13
    return YXML_ESYN;
317
2.22G
  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.22G
  if(x->ignore == ch) {
324
2.13k
    x->ignore = 0;
325
2.13k
    return YXML_OK;
326
2.13k
  }
327
2.22G
  x->ignore = (ch == 0xd) * 0xa;
328
2.22G
  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.22G
  x->byte++;
334
335
2.22G
  switch((yxml_state_t)x->state) {
336
22.1k
  case YXMLS_string:
337
22.1k
    if(ch == *x->string) {
338
22.1k
      x->string++;
339
22.1k
      if(!*x->string)
340
4.17k
        x->state = x->nextstate;
341
22.1k
      return YXML_OK;
342
22.1k
    }
343
24
    break;
344
49.9M
  case YXMLS_attr0:
345
49.9M
    if(yxml_isName(ch))
346
44.1M
      return yxml_attrname(x, ch);
347
5.79M
    if(yxml_isSP(ch)) {
348
2.94M
      x->state = YXMLS_attr1;
349
2.94M
      return yxml_attrnameend(x, ch);
350
2.94M
    }
351
2.84M
    if(ch == (unsigned char)'=') {
352
2.84M
      x->state = YXMLS_attr2;
353
2.84M
      return yxml_attrnameend(x, ch);
354
2.84M
    }
355
56
    break;
356
2.95M
  case YXMLS_attr1:
357
2.95M
    if(yxml_isSP(ch))
358
4.24k
      return YXML_OK;
359
2.94M
    if(ch == (unsigned char)'=') {
360
2.94M
      x->state = YXMLS_attr2;
361
2.94M
      return YXML_OK;
362
2.94M
    }
363
34
    break;
364
5.79M
  case YXMLS_attr2:
365
5.79M
    if(yxml_isSP(ch))
366
1.28k
      return YXML_OK;
367
5.79M
    if(ch == (unsigned char)'\'' || ch == (unsigned char)'"') {
368
5.79M
      x->state = YXMLS_attr3;
369
5.79M
      x->quote = ch;
370
5.79M
      return YXML_OK;
371
5.79M
    }
372
39
    break;
373
56.5M
  case YXMLS_attr3:
374
56.5M
    if(yxml_isAttValue(ch))
375
50.7M
      return yxml_dataattr(x, ch);
376
5.79M
    if(ch == (unsigned char)'&') {
377
1.32k
      x->state = YXMLS_attr4;
378
1.32k
      return yxml_refstart(x, ch);
379
1.32k
    }
380
5.79M
    if(x->quote == ch) {
381
5.79M
      x->state = YXMLS_elem2;
382
5.79M
      return yxml_attrvalend(x, ch);
383
5.79M
    }
384
2
    break;
385
5.36k
  case YXMLS_attr4:
386
5.36k
    if(yxml_isRef(ch))
387
4.12k
      return yxml_ref(x, ch);
388
1.24k
    if(ch == (unsigned char)'\x3b') {
389
1.21k
      x->state = YXMLS_attr3;
390
1.21k
      return yxml_refattrval(x, ch);
391
1.21k
    }
392
30
    break;
393
6.30k
  case YXMLS_cd0:
394
6.30k
    if(ch == (unsigned char)']') {
395
1.59k
      x->state = YXMLS_cd1;
396
1.59k
      return YXML_OK;
397
1.59k
    }
398
4.71k
    if(yxml_isChar(ch))
399
4.71k
      return yxml_datacontent(x, ch);
400
0
    break;
401
1.58k
  case YXMLS_cd1:
402
1.58k
    if(ch == (unsigned char)']') {
403
1.09k
      x->state = YXMLS_cd2;
404
1.09k
      return YXML_OK;
405
1.09k
    }
406
490
    if(yxml_isChar(ch)) {
407
490
      x->state = YXMLS_cd0;
408
490
      return yxml_datacd1(x, ch);
409
490
    }
410
0
    break;
411
1.64k
  case YXMLS_cd2:
412
1.64k
    if(ch == (unsigned char)']')
413
574
      return yxml_datacontent(x, ch);
414
1.07k
    if(ch == (unsigned char)'>') {
415
521
      x->state = YXMLS_misc2;
416
521
      return YXML_OK;
417
521
    }
418
550
    if(yxml_isChar(ch)) {
419
550
      x->state = YXMLS_cd0;
420
550
      return yxml_datacd2(x, ch);
421
550
    }
422
0
    break;
423
437
  case YXMLS_comment0:
424
437
    if(ch == (unsigned char)'-') {
425
414
      x->state = YXMLS_comment1;
426
414
      return YXML_OK;
427
414
    }
428
23
    break;
429
2.20k
  case YXMLS_comment1:
430
2.20k
    if(ch == (unsigned char)'-') {
431
2.18k
      x->state = YXMLS_comment2;
432
2.18k
      return YXML_OK;
433
2.18k
    }
434
23
    break;
435
3.35k
  case YXMLS_comment2:
436
3.35k
    if(ch == (unsigned char)'-') {
437
2.71k
      x->state = YXMLS_comment3;
438
2.71k
      return YXML_OK;
439
2.71k
    }
440
639
    if(yxml_isChar(ch))
441
639
      return YXML_OK;
442
0
    break;
443
2.70k
  case YXMLS_comment3:
444
2.70k
    if(ch == (unsigned char)'-') {
445
2.07k
      x->state = YXMLS_comment4;
446
2.07k
      return YXML_OK;
447
2.07k
    }
448
624
    if(yxml_isChar(ch)) {
449
624
      x->state = YXMLS_comment2;
450
624
      return YXML_OK;
451
624
    }
452
0
    break;
453
2.06k
  case YXMLS_comment4:
454
2.06k
    if(ch == (unsigned char)'>') {
455
2.04k
      x->state = x->nextstate;
456
2.04k
      return YXML_OK;
457
2.04k
    }
458
22
    break;
459
3.78k
  case YXMLS_dt0:
460
3.78k
    if(ch == (unsigned char)'>') {
461
568
      x->state = YXMLS_misc1;
462
568
      return YXML_OK;
463
568
    }
464
3.21k
    if(ch == (unsigned char)'\'' || ch == (unsigned char)'"') {
465
1.07k
      x->state = YXMLS_dt1;
466
1.07k
      x->quote = ch;
467
1.07k
      x->nextstate = YXMLS_dt0;
468
1.07k
      return YXML_OK;
469
1.07k
    }
470
2.14k
    if(ch == (unsigned char)'<') {
471
1.43k
      x->state = YXMLS_dt2;
472
1.43k
      return YXML_OK;
473
1.43k
    }
474
707
    if(yxml_isChar(ch))
475
707
      return YXML_OK;
476
0
    break;
477
2.15k
  case YXMLS_dt1:
478
2.15k
    if(x->quote == ch) {
479
1.75k
      x->state = x->nextstate;
480
1.75k
      return YXML_OK;
481
1.75k
    }
482
407
    if(yxml_isChar(ch))
483
407
      return YXML_OK;
484
0
    break;
485
1.42k
  case YXMLS_dt2:
486
1.42k
    if(ch == (unsigned char)'?') {
487
388
      x->state = YXMLS_pi0;
488
388
      x->nextstate = YXMLS_dt0;
489
388
      return YXML_OK;
490
388
    }
491
1.03k
    if(ch == (unsigned char)'!') {
492
1.03k
      x->state = YXMLS_dt3;
493
1.03k
      return YXML_OK;
494
1.03k
    }
495
8
    break;
496
1.02k
  case YXMLS_dt3:
497
1.02k
    if(ch == (unsigned char)'-') {
498
388
      x->state = YXMLS_comment1;
499
388
      x->nextstate = YXMLS_dt0;
500
388
      return YXML_OK;
501
388
    }
502
634
    if(yxml_isChar(ch)) {
503
634
      x->state = YXMLS_dt4;
504
634
      return YXML_OK;
505
634
    }
506
0
    break;
507
1.72k
  case YXMLS_dt4:
508
1.72k
    if(ch == (unsigned char)'\'' || ch == (unsigned char)'"') {
509
776
      x->state = YXMLS_dt1;
510
776
      x->quote = ch;
511
776
      x->nextstate = YXMLS_dt4;
512
776
      return YXML_OK;
513
776
    }
514
949
    if(ch == (unsigned char)'>') {
515
533
      x->state = YXMLS_dt0;
516
533
      return YXML_OK;
517
533
    }
518
416
    if(yxml_isChar(ch))
519
416
      return YXML_OK;
520
0
    break;
521
120M
  case YXMLS_elem0:
522
120M
    if(yxml_isName(ch))
523
94.8M
      return yxml_elemname(x, ch);
524
26.0M
    if(yxml_isSP(ch)) {
525
3.99M
      x->state = YXMLS_elem1;
526
3.99M
      return yxml_elemnameend(x, ch);
527
3.99M
    }
528
22.0M
    if(ch == (unsigned char)'/') {
529
12.4M
      x->state = YXMLS_elem3;
530
12.4M
      return yxml_elemnameend(x, ch);
531
12.4M
    }
532
9.56M
    if(ch == (unsigned char)'>') {
533
9.56M
      x->state = YXMLS_misc2;
534
9.56M
      return yxml_elemnameend(x, ch);
535
9.56M
    }
536
58
    break;
537
11.0M
  case YXMLS_elem1:
538
11.0M
    if(yxml_isSP(ch))
539
2.36M
      return YXML_OK;
540
8.67M
    if(ch == (unsigned char)'/') {
541
2.87M
      x->state = YXMLS_elem3;
542
2.87M
      return YXML_OK;
543
2.87M
    }
544
5.79M
    if(ch == (unsigned char)'>') {
545
1.22k
      x->state = YXMLS_misc2;
546
1.22k
      return YXML_OK;
547
1.22k
    }
548
5.79M
    if(yxml_isNameStart(ch)) {
549
5.79M
      x->state = YXMLS_attr0;
550
5.79M
      return yxml_attrstart(x, ch);
551
5.79M
    }
552
57
    break;
553
5.79M
  case YXMLS_elem2:
554
5.79M
    if(yxml_isSP(ch)) {
555
4.68M
      x->state = YXMLS_elem1;
556
4.68M
      return YXML_OK;
557
4.68M
    }
558
1.11M
    if(ch == (unsigned char)'/') {
559
599k
      x->state = YXMLS_elem3;
560
599k
      return YXML_OK;
561
599k
    }
562
511k
    if(ch == (unsigned char)'>') {
563
511k
      x->state = YXMLS_misc2;
564
511k
      return YXML_OK;
565
511k
    }
566
33
    break;
567
15.9M
  case YXMLS_elem3:
568
15.9M
    if(ch == (unsigned char)'>') {
569
15.9M
      x->state = YXMLS_misc2;
570
15.9M
      return yxml_selfclose(x, ch);
571
15.9M
    }
572
15
    break;
573
1.60k
  case YXMLS_enc0:
574
1.60k
    if(yxml_isSP(ch))
575
1.16k
      return YXML_OK;
576
437
    if(ch == (unsigned char)'=') {
577
405
      x->state = YXMLS_enc1;
578
405
      return YXML_OK;
579
405
    }
580
32
    break;
581
1.51k
  case YXMLS_enc1:
582
1.51k
    if(yxml_isSP(ch))
583
1.16k
      return YXML_OK;
584
355
    if(ch == (unsigned char)'\'' || ch == (unsigned char)'"') {
585
318
      x->state = YXMLS_enc2;
586
318
      x->quote = ch;
587
318
      return YXML_OK;
588
318
    }
589
37
    break;
590
314
  case YXMLS_enc2:
591
314
    if(yxml_isAlpha(ch)) {
592
295
      x->state = YXMLS_enc3;
593
295
      return YXML_OK;
594
295
    }
595
19
    break;
596
2.15k
  case YXMLS_enc3:
597
2.15k
    if(yxml_isEncName(ch))
598
1.95k
      return YXML_OK;
599
196
    if(x->quote == ch) {
600
160
      x->state = YXMLS_xmldecl6;
601
160
      return YXML_OK;
602
160
    }
603
36
    break;
604
10.0M
  case YXMLS_etag0:
605
10.0M
    if(yxml_isNameStart(ch)) {
606
10.0M
      x->state = YXMLS_etag1;
607
10.0M
      return yxml_elemclose(x, ch);
608
10.0M
    }
609
30
    break;
610
84.5M
  case YXMLS_etag1:
611
84.5M
    if(yxml_isName(ch))
612
74.4M
      return yxml_elemclose(x, ch);
613
10.0M
    if(yxml_isSP(ch)) {
614
2.06k
      x->state = YXMLS_etag2;
615
2.06k
      return yxml_elemcloseend(x, ch);
616
2.06k
    }
617
10.0M
    if(ch == (unsigned char)'>') {
618
10.0M
      x->state = YXMLS_misc2;
619
10.0M
      return yxml_elemcloseend(x, ch);
620
10.0M
    }
621
47
    break;
622
4.43k
  case YXMLS_etag2:
623
4.43k
    if(yxml_isSP(ch))
624
2.48k
      return YXML_OK;
625
1.95k
    if(ch == (unsigned char)'>') {
626
1.92k
      x->state = YXMLS_misc2;
627
1.92k
      return YXML_OK;
628
1.92k
    }
629
33
    break;
630
1.09M
  case YXMLS_init:
631
1.09M
    if(ch == (unsigned char)'\xef') {
632
37
      x->state = YXMLS_string;
633
37
      x->nextstate = YXMLS_misc0;
634
37
      x->string = (unsigned char *)"\xbb\xbf";
635
37
      return YXML_OK;
636
37
    }
637
1.09M
    if(yxml_isSP(ch)) {
638
208
      x->state = YXMLS_misc0;
639
208
      return YXML_OK;
640
208
    }
641
1.09M
    if(ch == (unsigned char)'<') {
642
1.09M
      x->state = YXMLS_le0;
643
1.09M
      return YXML_OK;
644
1.09M
    }
645
72
    break;
646
1.09M
  case YXMLS_le0:
647
1.09M
    if(ch == (unsigned char)'!') {
648
601
      x->state = YXMLS_lee1;
649
601
      return YXML_OK;
650
601
    }
651
1.09M
    if(ch == (unsigned char)'?') {
652
2.65k
      x->state = YXMLS_leq0;
653
2.65k
      return YXML_OK;
654
2.65k
    }
655
1.08M
    if(yxml_isNameStart(ch)) {
656
1.08M
      x->state = YXMLS_elem0;
657
1.08M
      return yxml_elemstart(x, ch);
658
1.08M
    }
659
47
    break;
660
4.62k
  case YXMLS_le1:
661
4.62k
    if(ch == (unsigned char)'!') {
662
1.36k
      x->state = YXMLS_lee1;
663
1.36k
      return YXML_OK;
664
1.36k
    }
665
3.26k
    if(ch == (unsigned char)'?') {
666
2.80k
      x->state = YXMLS_pi0;
667
2.80k
      x->nextstate = YXMLS_misc1;
668
2.80k
      return YXML_OK;
669
2.80k
    }
670
452
    if(yxml_isNameStart(ch)) {
671
420
      x->state = YXMLS_elem0;
672
420
      return yxml_elemstart(x, ch);
673
420
    }
674
32
    break;
675
35.0M
  case YXMLS_le2:
676
35.0M
    if(ch == (unsigned char)'!') {
677
1.15k
      x->state = YXMLS_lee2;
678
1.15k
      return YXML_OK;
679
1.15k
    }
680
35.0M
    if(ch == (unsigned char)'?') {
681
2.81k
      x->state = YXMLS_pi0;
682
2.81k
      x->nextstate = YXMLS_misc2;
683
2.81k
      return YXML_OK;
684
2.81k
    }
685
34.9M
    if(ch == (unsigned char)'/') {
686
10.0M
      x->state = YXMLS_etag0;
687
10.0M
      return YXML_OK;
688
10.0M
    }
689
24.9M
    if(yxml_isNameStart(ch)) {
690
24.9M
      x->state = YXMLS_elem0;
691
24.9M
      return yxml_elemstart(x, ch);
692
24.9M
    }
693
58
    break;
694
1.20k
  case YXMLS_le3:
695
1.20k
    if(ch == (unsigned char)'!') {
696
447
      x->state = YXMLS_comment0;
697
447
      x->nextstate = YXMLS_misc3;
698
447
      return YXML_OK;
699
447
    }
700
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.94k
  case YXMLS_lee1:
707
1.94k
    if(ch == (unsigned char)'-') {
708
996
      x->state = YXMLS_comment1;
709
996
      x->nextstate = YXMLS_misc1;
710
996
      return YXML_OK;
711
996
    }
712
952
    if(ch == (unsigned char)'D') {
713
912
      x->state = YXMLS_string;
714
912
      x->nextstate = YXMLS_dt0;
715
912
      x->string = (unsigned char *)"OCTYPE";
716
912
      return YXML_OK;
717
912
    }
718
40
    break;
719
1.14k
  case YXMLS_lee2:
720
1.14k
    if(ch == (unsigned char)'-') {
721
462
      x->state = YXMLS_comment1;
722
462
      x->nextstate = YXMLS_misc2;
723
462
      return YXML_OK;
724
462
    }
725
686
    if(ch == (unsigned char)'[') {
726
661
      x->state = YXMLS_string;
727
661
      x->nextstate = YXMLS_cd0;
728
661
      x->string = (unsigned char *)"CDATA[";
729
661
      return YXML_OK;
730
661
    }
731
25
    break;
732
2.65k
  case YXMLS_leq0:
733
2.65k
    if(ch == (unsigned char)'x') {
734
1.94k
      x->state = YXMLS_xmldecl0;
735
1.94k
      x->nextstate = YXMLS_misc1;
736
1.94k
      return yxml_pistart(x, ch);
737
1.94k
    }
738
711
    if(yxml_isNameStart(ch)) {
739
673
      x->state = YXMLS_pi1;
740
673
      x->nextstate = YXMLS_misc1;
741
673
      return yxml_pistart(x, ch);
742
673
    }
743
38
    break;
744
2.40k
  case YXMLS_misc0:
745
2.40k
    if(yxml_isSP(ch))
746
2.28k
      return YXML_OK;
747
120
    if(ch == (unsigned char)'<') {
748
70
      x->state = YXMLS_le0;
749
70
      return YXML_OK;
750
70
    }
751
50
    break;
752
6.03k
  case YXMLS_misc1:
753
6.03k
    if(yxml_isSP(ch))
754
1.36k
      return YXML_OK;
755
4.67k
    if(ch == (unsigned char)'<') {
756
4.63k
      x->state = YXMLS_le1;
757
4.63k
      return YXML_OK;
758
4.63k
    }
759
33
    break;
760
1.82G
  case YXMLS_misc2:
761
1.82G
    if(ch == (unsigned char)'<') {
762
35.0M
      x->state = YXMLS_le2;
763
35.0M
      return YXML_OK;
764
35.0M
    }
765
1.79G
    if(ch == (unsigned char)'&') {
766
7.80k
      x->state = YXMLS_misc2a;
767
7.80k
      return yxml_refstart(x, ch);
768
7.80k
    }
769
1.79G
    if(yxml_isChar(ch))
770
1.79G
      return yxml_datacontent(x, ch);
771
0
    break;
772
40.9k
  case YXMLS_misc2a:
773
40.9k
    if(yxml_isRef(ch))
774
33.1k
      return yxml_ref(x, ch);
775
7.72k
    if(ch == (unsigned char)'\x3b') {
776
7.68k
      x->state = YXMLS_misc2;
777
7.68k
      return yxml_refcontent(x, ch);
778
7.68k
    }
779
44
    break;
780
2.46k
  case YXMLS_misc3:
781
2.46k
    if(yxml_isSP(ch))
782
1.21k
      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
40
    break;
788
6.67k
  case YXMLS_pi0:
789
6.67k
    if(yxml_isNameStart(ch)) {
790
6.63k
      x->state = YXMLS_pi1;
791
6.63k
      return yxml_pistart(x, ch);
792
6.63k
    }
793
39
    break;
794
16.3k
  case YXMLS_pi1:
795
16.3k
    if(yxml_isName(ch))
796
8.92k
      return yxml_piname(x, ch);
797
7.40k
    if(ch == (unsigned char)'?') {
798
4.68k
      x->state = YXMLS_pi4;
799
4.68k
      return yxml_pinameend(x, ch);
800
4.68k
    }
801
2.71k
    if(yxml_isSP(ch)) {
802
2.66k
      x->state = YXMLS_pi2;
803
2.66k
      return yxml_pinameend(x, ch);
804
2.66k
    }
805
51
    break;
806
76.2k
  case YXMLS_pi2:
807
76.2k
    if(ch == (unsigned char)'?') {
808
3.17k
      x->state = YXMLS_pi3;
809
3.17k
      return YXML_OK;
810
3.17k
    }
811
73.0k
    if(yxml_isChar(ch))
812
73.0k
      return yxml_datapi1(x, ch);
813
0
    break;
814
3.15k
  case YXMLS_pi3:
815
3.15k
    if(ch == (unsigned char)'>') {
816
2.50k
      x->state = x->nextstate;
817
2.50k
      return yxml_pivalend(x, ch);
818
2.50k
    }
819
653
    if(yxml_isChar(ch)) {
820
653
      x->state = YXMLS_pi2;
821
653
      return yxml_datapi2(x, ch);
822
653
    }
823
0
    break;
824
4.61k
  case YXMLS_pi4:
825
4.61k
    if(ch == (unsigned char)'>') {
826
4.59k
      x->state = x->nextstate;
827
4.59k
      return yxml_pivalend(x, ch);
828
4.59k
    }
829
25
    break;
830
699
  case YXMLS_std0:
831
699
    if(yxml_isSP(ch))
832
582
      return YXML_OK;
833
117
    if(ch == (unsigned char)'=') {
834
100
      x->state = YXMLS_std1;
835
100
      return YXML_OK;
836
100
    }
837
17
    break;
838
657
  case YXMLS_std1:
839
657
    if(yxml_isSP(ch))
840
582
      return YXML_OK;
841
75
    if(ch == (unsigned char)'\'' || ch == (unsigned char)'"') {
842
63
      x->state = YXMLS_std2;
843
63
      x->quote = ch;
844
63
      return YXML_OK;
845
63
    }
846
12
    break;
847
61
  case YXMLS_std2:
848
61
    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
58
    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
12
    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.18k
  case YXMLS_ver0:
868
2.18k
    if(yxml_isSP(ch))
869
1.16k
      return YXML_OK;
870
1.01k
    if(ch == (unsigned char)'=') {
871
992
      x->state = YXMLS_ver1;
872
992
      return YXML_OK;
873
992
    }
874
26
    break;
875
2.10k
  case YXMLS_ver1:
876
2.10k
    if(yxml_isSP(ch))
877
1.16k
      return YXML_OK;
878
943
    if(ch == (unsigned char)'\'' || ch == (unsigned char)'"') {
879
897
      x->state = YXMLS_string;
880
897
      x->quote = ch;
881
897
      x->nextstate = YXMLS_ver2;
882
897
      x->string = (unsigned char *)"1.";
883
897
      return YXML_OK;
884
897
    }
885
46
    break;
886
891
  case YXMLS_ver2:
887
891
    if(yxml_isNum(ch)) {
888
866
      x->state = YXMLS_ver3;
889
866
      return YXML_OK;
890
866
    }
891
25
    break;
892
1.23k
  case YXMLS_ver3:
893
1.23k
    if(yxml_isNum(ch))
894
394
      return YXML_OK;
895
838
    if(x->quote == ch) {
896
804
      x->state = YXMLS_xmldecl4;
897
804
      return YXML_OK;
898
804
    }
899
34
    break;
900
1.94k
  case YXMLS_xmldecl0:
901
1.94k
    if(ch == (unsigned char)'m') {
902
1.65k
      x->state = YXMLS_xmldecl1;
903
1.65k
      return yxml_piname(x, ch);
904
1.65k
    }
905
289
    if(yxml_isName(ch)) {
906
157
      x->state = YXMLS_pi1;
907
157
      return yxml_piname(x, ch);
908
157
    }
909
132
    if(ch == (unsigned char)'?') {
910
42
      x->state = YXMLS_pi4;
911
42
      return yxml_pinameend(x, ch);
912
42
    }
913
90
    if(yxml_isSP(ch)) {
914
43
      x->state = YXMLS_pi2;
915
43
      return yxml_pinameend(x, ch);
916
43
    }
917
47
    break;
918
1.65k
  case YXMLS_xmldecl1:
919
1.65k
    if(ch == (unsigned char)'l') {
920
1.43k
      x->state = YXMLS_xmldecl2;
921
1.43k
      return yxml_piname(x, ch);
922
1.43k
    }
923
214
    if(yxml_isName(ch)) {
924
125
      x->state = YXMLS_pi1;
925
125
      return yxml_piname(x, ch);
926
125
    }
927
89
    if(ch == (unsigned char)'?') {
928
6
      x->state = YXMLS_pi4;
929
6
      return yxml_pinameend(x, ch);
930
6
    }
931
83
    if(yxml_isSP(ch)) {
932
21
      x->state = YXMLS_pi2;
933
21
      return yxml_pinameend(x, ch);
934
21
    }
935
62
    break;
936
1.43k
  case YXMLS_xmldecl2:
937
1.43k
    if(yxml_isSP(ch)) {
938
1.17k
      x->state = YXMLS_xmldecl3;
939
1.17k
      return yxml_piabort(x, ch);
940
1.17k
    }
941
263
    if(yxml_isName(ch)) {
942
224
      x->state = YXMLS_pi1;
943
224
      return yxml_piname(x, ch);
944
224
    }
945
39
    break;
946
2.28k
  case YXMLS_xmldecl3:
947
2.28k
    if(yxml_isSP(ch))
948
1.16k
      return YXML_OK;
949
1.12k
    if(ch == (unsigned char)'v') {
950
1.07k
      x->state = YXMLS_string;
951
1.07k
      x->nextstate = YXMLS_ver0;
952
1.07k
      x->string = (unsigned char *)"ersion";
953
1.07k
      return YXML_OK;
954
1.07k
    }
955
48
    break;
956
802
  case YXMLS_xmldecl4:
957
802
    if(yxml_isSP(ch)) {
958
748
      x->state = YXMLS_xmldecl5;
959
748
      return YXML_OK;
960
748
    }
961
54
    if(ch == (unsigned char)'?') {
962
19
      x->state = YXMLS_xmldecl9;
963
19
      return YXML_OK;
964
19
    }
965
35
    break;
966
1.85k
  case YXMLS_xmldecl5:
967
1.85k
    if(yxml_isSP(ch))
968
1.16k
      return YXML_OK;
969
694
    if(ch == (unsigned char)'?') {
970
14
      x->state = YXMLS_xmldecl9;
971
14
      return YXML_OK;
972
14
    }
973
680
    if(ch == (unsigned char)'e') {
974
488
      x->state = YXMLS_string;
975
488
      x->nextstate = YXMLS_enc0;
976
488
      x->string = (unsigned char *)"ncoding";
977
488
      return YXML_OK;
978
488
    }
979
192
    if(ch == (unsigned char)'s') {
980
139
      x->state = YXMLS_string;
981
139
      x->nextstate = YXMLS_std0;
982
139
      x->string = (unsigned char *)"tandalone";
983
139
      return YXML_OK;
984
139
    }
985
53
    break;
986
159
  case YXMLS_xmldecl6:
987
159
    if(yxml_isSP(ch)) {
988
129
      x->state = YXMLS_xmldecl7;
989
129
      return YXML_OK;
990
129
    }
991
30
    if(ch == (unsigned char)'?') {
992
11
      x->state = YXMLS_xmldecl9;
993
11
      return YXML_OK;
994
11
    }
995
19
    break;
996
1.25k
  case YXMLS_xmldecl7:
997
1.25k
    if(yxml_isSP(ch))
998
1.18k
      return YXML_OK;
999
75
    if(ch == (unsigned char)'?') {
1000
14
      x->state = YXMLS_xmldecl9;
1001
14
      return YXML_OK;
1002
14
    }
1003
61
    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
55
    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
58
  case YXMLS_xmldecl9:
1019
58
    if(ch == (unsigned char)'>') {
1020
56
      x->state = YXMLS_misc1;
1021
56
      return YXML_OK;
1022
56
    }
1023
2
    break;
1024
2.22G
  }
1025
1.82k
  return YXML_ESYN;
1026
2.22G
}
1027
1028
1.08M
yxml_ret_t yxml_eof(yxml_t *x) {
1029
1.08M
  if(x->state != YXMLS_misc3)
1030
4.37k
    return YXML_EEOF;
1031
1.08M
  return YXML_OK;
1032
1.08M
}
1033