Coverage Report

Created: 2026-08-08 08:00

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/ghostpdl/expat/lib/xmltok_impl.c
Line
Count
Source
1
/* This file is included (from xmltok.c, 1-3 times depending on XML_MIN_SIZE)!
2
                            __  __            _
3
                         ___\ \/ /_ __   __ _| |_
4
                        / _ \\  /| '_ \ / _` | __|
5
                       |  __//  \| |_) | (_| | |_
6
                        \___/_/\_\ .__/ \__,_|\__|
7
                                 |_| XML parser
8
9
   Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
10
   Copyright (c) 2000      Clark Cooper <coopercc@users.sourceforge.net>
11
   Copyright (c) 2002      Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
12
   Copyright (c) 2002-2016 Karl Waclawek <karl@waclawek.net>
13
   Copyright (c) 2016-2022 Sebastian Pipping <sebastian@pipping.org>
14
   Copyright (c) 2017      Rhodri James <rhodri@wildebeest.org.uk>
15
   Copyright (c) 2018      Benjamin Peterson <benjamin@python.org>
16
   Copyright (c) 2018      Anton Maklakov <antmak.pub@gmail.com>
17
   Copyright (c) 2019      David Loffredo <loffredo@steptools.com>
18
   Copyright (c) 2020      Boris Kolpackov <boris@codesynthesis.com>
19
   Copyright (c) 2022      Martin Ettl <ettl.martin78@googlemail.com>
20
   Licensed under the MIT license:
21
22
   Permission is  hereby granted,  free of charge,  to any  person obtaining
23
   a  copy  of  this  software   and  associated  documentation  files  (the
24
   "Software"),  to  deal in  the  Software  without restriction,  including
25
   without  limitation the  rights  to use,  copy,  modify, merge,  publish,
26
   distribute, sublicense, and/or sell copies of the Software, and to permit
27
   persons  to whom  the Software  is  furnished to  do so,  subject to  the
28
   following conditions:
29
30
   The above copyright  notice and this permission notice  shall be included
31
   in all copies or substantial portions of the Software.
32
33
   THE  SOFTWARE  IS  PROVIDED  "AS  IS",  WITHOUT  WARRANTY  OF  ANY  KIND,
34
   EXPRESS  OR IMPLIED,  INCLUDING  BUT  NOT LIMITED  TO  THE WARRANTIES  OF
35
   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
36
   NO EVENT SHALL THE AUTHORS OR  COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
37
   DAMAGES OR  OTHER LIABILITY, WHETHER  IN AN  ACTION OF CONTRACT,  TORT OR
38
   OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
39
   USE OR OTHER DEALINGS IN THE SOFTWARE.
40
*/
41
42
#ifdef XML_TOK_IMPL_C
43
44
#  ifndef IS_INVALID_CHAR // i.e. for UTF-16 and XML_MIN_SIZE not defined
45
0
#    define IS_INVALID_CHAR(enc, ptr, n) (0)
46
#  endif
47
48
#  define INVALID_LEAD_CASE(n, ptr, nextTokPtr)                                \
49
1.38k
  case BT_LEAD##n:                                                             \
50
1.38k
    if (end - ptr < n)                                                         \
51
1.38k
      return XML_TOK_PARTIAL_CHAR;                                             \
52
1.38k
    if (IS_INVALID_CHAR(enc, ptr, n)) {                                        \
53
1
      *(nextTokPtr) = (ptr);                                                   \
54
1
      return XML_TOK_INVALID;                                                  \
55
1
    }                                                                          \
56
1.38k
    ptr += n;                                                                  \
57
1.38k
    break;
58
59
#  define INVALID_CASES(ptr, nextTokPtr)                                       \
60
0
    INVALID_LEAD_CASE(2, ptr, nextTokPtr)                                      \
61
1.38k
    INVALID_LEAD_CASE(3, ptr, nextTokPtr)                                      \
62
1.38k
    INVALID_LEAD_CASE(4, ptr, nextTokPtr)                                      \
63
0
  case BT_NONXML:                                                              \
64
0
  case BT_MALFORM:                                                             \
65
0
  case BT_TRAIL:                                                               \
66
0
    *(nextTokPtr) = (ptr);                                                     \
67
0
    return XML_TOK_INVALID;
68
69
#  define CHECK_NAME_CASE(n, enc, ptr, end, nextTokPtr)                        \
70
0
  case BT_LEAD##n:                                                             \
71
0
    if (end - ptr < n)                                                         \
72
0
      return XML_TOK_PARTIAL_CHAR;                                             \
73
0
    if (IS_INVALID_CHAR(enc, ptr, n) || ! IS_NAME_CHAR(enc, ptr, n)) {         \
74
0
      *nextTokPtr = ptr;                                                       \
75
0
      return XML_TOK_INVALID;                                                  \
76
0
    }                                                                          \
77
0
    ptr += n;                                                                  \
78
0
    break;
79
80
#  define CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)                          \
81
458k
  case BT_NONASCII:                                                            \
82
458k
    if (! IS_NAME_CHAR_MINBPC(enc, ptr)) {                                     \
83
0
      *nextTokPtr = ptr;                                                       \
84
0
      return XML_TOK_INVALID;                                                  \
85
0
    }                                                                          \
86
458k
    /* fall through */                                                         \
87
458k
  case BT_NMSTRT:                                                              \
88
458k
  case BT_HEX:                                                                 \
89
458k
  case BT_DIGIT:                                                               \
90
458k
  case BT_NAME:                                                                \
91
458k
  case BT_MINUS:                                                               \
92
458k
    ptr += MINBPC(enc);                                                        \
93
458k
    break;                                                                     \
94
458k
    CHECK_NAME_CASE(2, enc, ptr, end, nextTokPtr)                              \
95
0
    CHECK_NAME_CASE(3, enc, ptr, end, nextTokPtr)                              \
96
0
    CHECK_NAME_CASE(4, enc, ptr, end, nextTokPtr)
97
98
#  define CHECK_NMSTRT_CASE(n, enc, ptr, end, nextTokPtr)                      \
99
0
  case BT_LEAD##n:                                                             \
100
0
    if ((end) - (ptr) < (n))                                                   \
101
0
      return XML_TOK_PARTIAL_CHAR;                                             \
102
0
    if (IS_INVALID_CHAR(enc, ptr, n) || ! IS_NMSTRT_CHAR(enc, ptr, n)) {       \
103
0
      *nextTokPtr = ptr;                                                       \
104
0
      return XML_TOK_INVALID;                                                  \
105
0
    }                                                                          \
106
0
    ptr += n;                                                                  \
107
0
    break;
108
109
#  define CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)                        \
110
126k
  case BT_NONASCII:                                                            \
111
126k
    if (! IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {                                   \
112
0
      *nextTokPtr = ptr;                                                       \
113
0
      return XML_TOK_INVALID;                                                  \
114
0
    }                                                                          \
115
126k
    /* fall through */                                                         \
116
126k
  case BT_NMSTRT:                                                              \
117
126k
  case BT_HEX:                                                                 \
118
126k
    ptr += MINBPC(enc);                                                        \
119
126k
    break;                                                                     \
120
126k
    CHECK_NMSTRT_CASE(2, enc, ptr, end, nextTokPtr)                            \
121
0
    CHECK_NMSTRT_CASE(3, enc, ptr, end, nextTokPtr)                            \
122
0
    CHECK_NMSTRT_CASE(4, enc, ptr, end, nextTokPtr)
123
124
#  ifndef PREFIX
125
#    define PREFIX(ident) ident
126
#  endif
127
128
#  define HAS_CHARS(enc, ptr, end, count)                                      \
129
16.5M
    ((end) - (ptr) >= ((count) * MINBPC(enc)))
130
131
858k
#  define HAS_CHAR(enc, ptr, end) HAS_CHARS(enc, ptr, end, 1)
132
133
#  define REQUIRE_CHARS(enc, ptr, end, count)                                  \
134
8.97M
    {                                                                          \
135
8.97M
      if (! HAS_CHARS(enc, ptr, end, count)) {                                 \
136
0
        return XML_TOK_PARTIAL;                                                \
137
0
      }                                                                        \
138
8.97M
    }
139
140
8.97M
#  define REQUIRE_CHAR(enc, ptr, end) REQUIRE_CHARS(enc, ptr, end, 1)
141
142
/* ptr points to character following "<!-" */
143
144
static int PTRCALL
145
PREFIX(scanComment)(const ENCODING *enc, const char *ptr, const char *end,
146
0
                    const char **nextTokPtr) {
147
0
  if (HAS_CHAR(enc, ptr, end)) {
148
0
    if (! CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
149
0
      *nextTokPtr = ptr;
150
0
      return XML_TOK_INVALID;
151
0
    }
152
0
    ptr += MINBPC(enc);
153
0
    while (HAS_CHAR(enc, ptr, end)) {
154
0
      switch (BYTE_TYPE(enc, ptr)) {
155
0
        INVALID_CASES(ptr, nextTokPtr)
156
0
      case BT_MINUS:
157
0
        ptr += MINBPC(enc);
158
0
        REQUIRE_CHAR(enc, ptr, end);
159
0
        if (CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
160
0
          ptr += MINBPC(enc);
161
0
          REQUIRE_CHAR(enc, ptr, end);
162
0
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
163
0
            *nextTokPtr = ptr;
164
0
            return XML_TOK_INVALID;
165
0
          }
166
0
          *nextTokPtr = ptr + MINBPC(enc);
167
0
          return XML_TOK_COMMENT;
168
0
        }
169
0
        break;
170
0
      default:
171
0
        ptr += MINBPC(enc);
172
0
        break;
173
0
      }
174
0
    }
175
0
  }
176
0
  return XML_TOK_PARTIAL;
177
0
}
Unexecuted instantiation: xmltok.c:normal_scanComment
Unexecuted instantiation: xmltok.c:little2_scanComment
Unexecuted instantiation: xmltok.c:big2_scanComment
178
179
/* ptr points to character following "<!" */
180
181
static int PTRCALL
182
PREFIX(scanDecl)(const ENCODING *enc, const char *ptr, const char *end,
183
0
                 const char **nextTokPtr) {
184
0
  REQUIRE_CHAR(enc, ptr, end);
185
0
  switch (BYTE_TYPE(enc, ptr)) {
186
0
  case BT_MINUS:
187
0
    return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
188
0
  case BT_LSQB:
189
0
    *nextTokPtr = ptr + MINBPC(enc);
190
0
    return XML_TOK_COND_SECT_OPEN;
191
0
  case BT_NMSTRT:
192
0
  case BT_HEX:
193
0
    ptr += MINBPC(enc);
194
0
    break;
195
0
  default:
196
0
    *nextTokPtr = ptr;
197
0
    return XML_TOK_INVALID;
198
0
  }
199
0
  while (HAS_CHAR(enc, ptr, end)) {
200
0
    switch (BYTE_TYPE(enc, ptr)) {
201
0
    case BT_PERCNT:
202
0
      REQUIRE_CHARS(enc, ptr, end, 2);
203
      /* don't allow <!ENTITY% foo "whatever"> */
204
0
      switch (BYTE_TYPE(enc, ptr + MINBPC(enc))) {
205
0
      case BT_S:
206
0
      case BT_CR:
207
0
      case BT_LF:
208
0
      case BT_PERCNT:
209
0
        *nextTokPtr = ptr;
210
0
        return XML_TOK_INVALID;
211
0
      }
212
      /* fall through */
213
0
    case BT_S:
214
0
    case BT_CR:
215
0
    case BT_LF:
216
0
      *nextTokPtr = ptr;
217
0
      return XML_TOK_DECL_OPEN;
218
0
    case BT_NMSTRT:
219
0
    case BT_HEX:
220
0
      ptr += MINBPC(enc);
221
0
      break;
222
0
    default:
223
0
      *nextTokPtr = ptr;
224
0
      return XML_TOK_INVALID;
225
0
    }
226
0
  }
227
0
  return XML_TOK_PARTIAL;
228
0
}
Unexecuted instantiation: xmltok.c:normal_scanDecl
Unexecuted instantiation: xmltok.c:little2_scanDecl
Unexecuted instantiation: xmltok.c:big2_scanDecl
229
230
static int PTRCALL
231
PREFIX(checkPiTarget)(const ENCODING *enc, const char *ptr, const char *end,
232
320
                      int *tokPtr) {
233
320
  int upper = 0;
234
320
  UNUSED_P(enc);
235
320
  *tokPtr = XML_TOK_PI;
236
320
  if (end - ptr != MINBPC(enc) * 3)
237
0
    return 1;
238
320
  switch (BYTE_TO_ASCII(enc, ptr)) {
239
320
  case ASCII_x:
240
320
    break;
241
0
  case ASCII_X:
242
0
    upper = 1;
243
0
    break;
244
0
  default:
245
0
    return 1;
246
320
  }
247
320
  ptr += MINBPC(enc);
248
320
  switch (BYTE_TO_ASCII(enc, ptr)) {
249
320
  case ASCII_m:
250
320
    break;
251
0
  case ASCII_M:
252
0
    upper = 1;
253
0
    break;
254
0
  default:
255
0
    return 1;
256
320
  }
257
320
  ptr += MINBPC(enc);
258
320
  switch (BYTE_TO_ASCII(enc, ptr)) {
259
320
  case ASCII_l:
260
320
    break;
261
0
  case ASCII_L:
262
0
    upper = 1;
263
0
    break;
264
0
  default:
265
0
    return 1;
266
320
  }
267
320
  if (upper)
268
0
    return 0;
269
320
  *tokPtr = XML_TOK_XML_DECL;
270
320
  return 1;
271
320
}
xmltok.c:normal_checkPiTarget
Line
Count
Source
232
320
                      int *tokPtr) {
233
320
  int upper = 0;
234
320
  UNUSED_P(enc);
235
320
  *tokPtr = XML_TOK_PI;
236
320
  if (end - ptr != MINBPC(enc) * 3)
237
0
    return 1;
238
320
  switch (BYTE_TO_ASCII(enc, ptr)) {
239
320
  case ASCII_x:
240
320
    break;
241
0
  case ASCII_X:
242
0
    upper = 1;
243
0
    break;
244
0
  default:
245
0
    return 1;
246
320
  }
247
320
  ptr += MINBPC(enc);
248
320
  switch (BYTE_TO_ASCII(enc, ptr)) {
249
320
  case ASCII_m:
250
320
    break;
251
0
  case ASCII_M:
252
0
    upper = 1;
253
0
    break;
254
0
  default:
255
0
    return 1;
256
320
  }
257
320
  ptr += MINBPC(enc);
258
320
  switch (BYTE_TO_ASCII(enc, ptr)) {
259
320
  case ASCII_l:
260
320
    break;
261
0
  case ASCII_L:
262
0
    upper = 1;
263
0
    break;
264
0
  default:
265
0
    return 1;
266
320
  }
267
320
  if (upper)
268
0
    return 0;
269
320
  *tokPtr = XML_TOK_XML_DECL;
270
320
  return 1;
271
320
}
Unexecuted instantiation: xmltok.c:little2_checkPiTarget
Unexecuted instantiation: xmltok.c:big2_checkPiTarget
272
273
/* ptr points to character following "<?" */
274
275
static int PTRCALL
276
PREFIX(scanPi)(const ENCODING *enc, const char *ptr, const char *end,
277
320
               const char **nextTokPtr) {
278
320
  int tok;
279
320
  const char *target = ptr;
280
320
  REQUIRE_CHAR(enc, ptr, end);
281
320
  switch (BYTE_TYPE(enc, ptr)) {
282
320
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
283
0
  default:
284
0
    *nextTokPtr = ptr;
285
0
    return XML_TOK_INVALID;
286
320
  }
287
960
  while (HAS_CHAR(enc, ptr, end)) {
288
960
    switch (BYTE_TYPE(enc, ptr)) {
289
2.56k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
290
320
    case BT_S:
291
320
    case BT_CR:
292
320
    case BT_LF:
293
320
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
294
0
        *nextTokPtr = ptr;
295
0
        return XML_TOK_INVALID;
296
0
      }
297
320
      ptr += MINBPC(enc);
298
9.92k
      while (HAS_CHAR(enc, ptr, end)) {
299
9.92k
        switch (BYTE_TYPE(enc, ptr)) {
300
0
          INVALID_CASES(ptr, nextTokPtr)
301
320
        case BT_QUEST:
302
320
          ptr += MINBPC(enc);
303
320
          REQUIRE_CHAR(enc, ptr, end);
304
320
          if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
305
320
            *nextTokPtr = ptr + MINBPC(enc);
306
320
            return tok;
307
320
          }
308
0
          break;
309
9.60k
        default:
310
9.60k
          ptr += MINBPC(enc);
311
9.60k
          break;
312
9.92k
        }
313
9.92k
      }
314
0
      return XML_TOK_PARTIAL;
315
0
    case BT_QUEST:
316
0
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
317
0
        *nextTokPtr = ptr;
318
0
        return XML_TOK_INVALID;
319
0
      }
320
0
      ptr += MINBPC(enc);
321
0
      REQUIRE_CHAR(enc, ptr, end);
322
0
      if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
323
0
        *nextTokPtr = ptr + MINBPC(enc);
324
0
        return tok;
325
0
      }
326
      /* fall through */
327
0
    default:
328
0
      *nextTokPtr = ptr;
329
0
      return XML_TOK_INVALID;
330
960
    }
331
960
  }
332
0
  return XML_TOK_PARTIAL;
333
320
}
xmltok.c:normal_scanPi
Line
Count
Source
277
320
               const char **nextTokPtr) {
278
320
  int tok;
279
320
  const char *target = ptr;
280
320
  REQUIRE_CHAR(enc, ptr, end);
281
320
  switch (BYTE_TYPE(enc, ptr)) {
282
320
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
283
0
  default:
284
0
    *nextTokPtr = ptr;
285
0
    return XML_TOK_INVALID;
286
320
  }
287
960
  while (HAS_CHAR(enc, ptr, end)) {
288
960
    switch (BYTE_TYPE(enc, ptr)) {
289
2.56k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
290
320
    case BT_S:
291
320
    case BT_CR:
292
320
    case BT_LF:
293
320
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
294
0
        *nextTokPtr = ptr;
295
0
        return XML_TOK_INVALID;
296
0
      }
297
320
      ptr += MINBPC(enc);
298
9.92k
      while (HAS_CHAR(enc, ptr, end)) {
299
9.92k
        switch (BYTE_TYPE(enc, ptr)) {
300
0
          INVALID_CASES(ptr, nextTokPtr)
301
320
        case BT_QUEST:
302
320
          ptr += MINBPC(enc);
303
320
          REQUIRE_CHAR(enc, ptr, end);
304
320
          if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
305
320
            *nextTokPtr = ptr + MINBPC(enc);
306
320
            return tok;
307
320
          }
308
0
          break;
309
9.60k
        default:
310
9.60k
          ptr += MINBPC(enc);
311
9.60k
          break;
312
9.92k
        }
313
9.92k
      }
314
0
      return XML_TOK_PARTIAL;
315
0
    case BT_QUEST:
316
0
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
317
0
        *nextTokPtr = ptr;
318
0
        return XML_TOK_INVALID;
319
0
      }
320
0
      ptr += MINBPC(enc);
321
0
      REQUIRE_CHAR(enc, ptr, end);
322
0
      if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
323
0
        *nextTokPtr = ptr + MINBPC(enc);
324
0
        return tok;
325
0
      }
326
      /* fall through */
327
0
    default:
328
0
      *nextTokPtr = ptr;
329
0
      return XML_TOK_INVALID;
330
960
    }
331
960
  }
332
0
  return XML_TOK_PARTIAL;
333
320
}
Unexecuted instantiation: xmltok.c:little2_scanPi
Unexecuted instantiation: xmltok.c:big2_scanPi
334
335
static int PTRCALL
336
PREFIX(scanCdataSection)(const ENCODING *enc, const char *ptr, const char *end,
337
0
                         const char **nextTokPtr) {
338
0
  static const char CDATA_LSQB[]
339
0
      = {ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, ASCII_LSQB};
340
0
  int i;
341
0
  UNUSED_P(enc);
342
  /* CDATA[ */
343
0
  REQUIRE_CHARS(enc, ptr, end, 6);
344
0
  for (i = 0; i < 6; i++, ptr += MINBPC(enc)) {
345
0
    if (! CHAR_MATCHES(enc, ptr, CDATA_LSQB[i])) {
346
0
      *nextTokPtr = ptr;
347
0
      return XML_TOK_INVALID;
348
0
    }
349
0
  }
350
0
  *nextTokPtr = ptr;
351
0
  return XML_TOK_CDATA_SECT_OPEN;
352
0
}
Unexecuted instantiation: xmltok.c:normal_scanCdataSection
Unexecuted instantiation: xmltok.c:little2_scanCdataSection
Unexecuted instantiation: xmltok.c:big2_scanCdataSection
353
354
static int PTRCALL
355
PREFIX(cdataSectionTok)(const ENCODING *enc, const char *ptr, const char *end,
356
0
                        const char **nextTokPtr) {
357
0
  if (ptr >= end)
358
0
    return XML_TOK_NONE;
359
0
  if (MINBPC(enc) > 1) {
360
0
    size_t n = end - ptr;
361
0
    if (n & (MINBPC(enc) - 1)) {
362
0
      n &= ~(MINBPC(enc) - 1);
363
0
      if (n == 0)
364
0
        return XML_TOK_PARTIAL;
365
0
      end = ptr + n;
366
0
    }
367
0
  }
368
0
  switch (BYTE_TYPE(enc, ptr)) {
369
0
  case BT_RSQB:
370
0
    ptr += MINBPC(enc);
371
0
    REQUIRE_CHAR(enc, ptr, end);
372
0
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
373
0
      break;
374
0
    ptr += MINBPC(enc);
375
0
    REQUIRE_CHAR(enc, ptr, end);
376
0
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
377
0
      ptr -= MINBPC(enc);
378
0
      break;
379
0
    }
380
0
    *nextTokPtr = ptr + MINBPC(enc);
381
0
    return XML_TOK_CDATA_SECT_CLOSE;
382
0
  case BT_CR:
383
0
    ptr += MINBPC(enc);
384
0
    REQUIRE_CHAR(enc, ptr, end);
385
0
    if (BYTE_TYPE(enc, ptr) == BT_LF)
386
0
      ptr += MINBPC(enc);
387
0
    *nextTokPtr = ptr;
388
0
    return XML_TOK_DATA_NEWLINE;
389
0
  case BT_LF:
390
0
    *nextTokPtr = ptr + MINBPC(enc);
391
0
    return XML_TOK_DATA_NEWLINE;
392
0
    INVALID_CASES(ptr, nextTokPtr)
393
0
  default:
394
0
    ptr += MINBPC(enc);
395
0
    break;
396
0
  }
397
0
  while (HAS_CHAR(enc, ptr, end)) {
398
0
    switch (BYTE_TYPE(enc, ptr)) {
399
0
#  define LEAD_CASE(n)                                                         \
400
0
  case BT_LEAD##n:                                                             \
401
0
    if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) {                       \
402
0
      *nextTokPtr = ptr;                                                       \
403
0
      return XML_TOK_DATA_CHARS;                                               \
404
0
    }                                                                          \
405
0
    ptr += n;                                                                  \
406
0
    break;
407
0
      LEAD_CASE(2)
408
0
      LEAD_CASE(3)
409
0
      LEAD_CASE(4)
410
0
#  undef LEAD_CASE
411
0
    case BT_NONXML:
412
0
    case BT_MALFORM:
413
0
    case BT_TRAIL:
414
0
    case BT_CR:
415
0
    case BT_LF:
416
0
    case BT_RSQB:
417
0
      *nextTokPtr = ptr;
418
0
      return XML_TOK_DATA_CHARS;
419
0
    default:
420
0
      ptr += MINBPC(enc);
421
0
      break;
422
0
    }
423
0
  }
424
0
  *nextTokPtr = ptr;
425
0
  return XML_TOK_DATA_CHARS;
426
0
}
Unexecuted instantiation: xmltok.c:normal_cdataSectionTok
Unexecuted instantiation: xmltok.c:little2_cdataSectionTok
Unexecuted instantiation: xmltok.c:big2_cdataSectionTok
427
428
/* ptr points to character following "</" */
429
430
static int PTRCALL
431
PREFIX(scanEndTag)(const ENCODING *enc, const char *ptr, const char *end,
432
581
                   const char **nextTokPtr) {
433
581
  REQUIRE_CHAR(enc, ptr, end);
434
581
  switch (BYTE_TYPE(enc, ptr)) {
435
283
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
436
1
  default:
437
1
    *nextTokPtr = ptr;
438
1
    return XML_TOK_INVALID;
439
581
  }
440
8.14k
  while (HAS_CHAR(enc, ptr, end)) {
441
8.14k
    switch (BYTE_TYPE(enc, ptr)) {
442
27.3k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
443
0
    case BT_S:
444
0
    case BT_CR:
445
0
    case BT_LF:
446
0
      for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
447
0
        switch (BYTE_TYPE(enc, ptr)) {
448
0
        case BT_S:
449
0
        case BT_CR:
450
0
        case BT_LF:
451
0
          break;
452
0
        case BT_GT:
453
0
          *nextTokPtr = ptr + MINBPC(enc);
454
0
          return XML_TOK_END_TAG;
455
0
        default:
456
0
          *nextTokPtr = ptr;
457
0
          return XML_TOK_INVALID;
458
0
        }
459
0
      }
460
0
      return XML_TOK_PARTIAL;
461
0
#  ifdef XML_NS
462
0
    case BT_COLON:
463
      /* no need to check qname syntax here,
464
         since end-tag must match exactly */
465
0
      ptr += MINBPC(enc);
466
0
      break;
467
0
#  endif
468
580
    case BT_GT:
469
580
      *nextTokPtr = ptr + MINBPC(enc);
470
580
      return XML_TOK_END_TAG;
471
0
    default:
472
0
      *nextTokPtr = ptr;
473
0
      return XML_TOK_INVALID;
474
8.14k
    }
475
8.14k
  }
476
0
  return XML_TOK_PARTIAL;
477
580
}
xmltok.c:normal_scanEndTag
Line
Count
Source
432
581
                   const char **nextTokPtr) {
433
581
  REQUIRE_CHAR(enc, ptr, end);
434
581
  switch (BYTE_TYPE(enc, ptr)) {
435
283
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
436
1
  default:
437
1
    *nextTokPtr = ptr;
438
1
    return XML_TOK_INVALID;
439
581
  }
440
8.14k
  while (HAS_CHAR(enc, ptr, end)) {
441
8.14k
    switch (BYTE_TYPE(enc, ptr)) {
442
27.3k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
443
0
    case BT_S:
444
0
    case BT_CR:
445
0
    case BT_LF:
446
0
      for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
447
0
        switch (BYTE_TYPE(enc, ptr)) {
448
0
        case BT_S:
449
0
        case BT_CR:
450
0
        case BT_LF:
451
0
          break;
452
0
        case BT_GT:
453
0
          *nextTokPtr = ptr + MINBPC(enc);
454
0
          return XML_TOK_END_TAG;
455
0
        default:
456
0
          *nextTokPtr = ptr;
457
0
          return XML_TOK_INVALID;
458
0
        }
459
0
      }
460
0
      return XML_TOK_PARTIAL;
461
0
#  ifdef XML_NS
462
0
    case BT_COLON:
463
      /* no need to check qname syntax here,
464
         since end-tag must match exactly */
465
0
      ptr += MINBPC(enc);
466
0
      break;
467
0
#  endif
468
580
    case BT_GT:
469
580
      *nextTokPtr = ptr + MINBPC(enc);
470
580
      return XML_TOK_END_TAG;
471
0
    default:
472
0
      *nextTokPtr = ptr;
473
0
      return XML_TOK_INVALID;
474
8.14k
    }
475
8.14k
  }
476
0
  return XML_TOK_PARTIAL;
477
580
}
Unexecuted instantiation: xmltok.c:little2_scanEndTag
Unexecuted instantiation: xmltok.c:big2_scanEndTag
478
479
/* ptr points to character following "&#X" */
480
481
static int PTRCALL
482
PREFIX(scanHexCharRef)(const ENCODING *enc, const char *ptr, const char *end,
483
0
                       const char **nextTokPtr) {
484
0
  if (HAS_CHAR(enc, ptr, end)) {
485
0
    switch (BYTE_TYPE(enc, ptr)) {
486
0
    case BT_DIGIT:
487
0
    case BT_HEX:
488
0
      break;
489
0
    default:
490
0
      *nextTokPtr = ptr;
491
0
      return XML_TOK_INVALID;
492
0
    }
493
0
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
494
0
      switch (BYTE_TYPE(enc, ptr)) {
495
0
      case BT_DIGIT:
496
0
      case BT_HEX:
497
0
        break;
498
0
      case BT_SEMI:
499
0
        *nextTokPtr = ptr + MINBPC(enc);
500
0
        return XML_TOK_CHAR_REF;
501
0
      default:
502
0
        *nextTokPtr = ptr;
503
0
        return XML_TOK_INVALID;
504
0
      }
505
0
    }
506
0
  }
507
0
  return XML_TOK_PARTIAL;
508
0
}
Unexecuted instantiation: xmltok.c:normal_scanHexCharRef
Unexecuted instantiation: xmltok.c:little2_scanHexCharRef
Unexecuted instantiation: xmltok.c:big2_scanHexCharRef
509
510
/* ptr points to character following "&#" */
511
512
static int PTRCALL
513
PREFIX(scanCharRef)(const ENCODING *enc, const char *ptr, const char *end,
514
0
                    const char **nextTokPtr) {
515
0
  if (HAS_CHAR(enc, ptr, end)) {
516
0
    if (CHAR_MATCHES(enc, ptr, ASCII_x))
517
0
      return PREFIX(scanHexCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
518
0
    switch (BYTE_TYPE(enc, ptr)) {
519
0
    case BT_DIGIT:
520
0
      break;
521
0
    default:
522
0
      *nextTokPtr = ptr;
523
0
      return XML_TOK_INVALID;
524
0
    }
525
0
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
526
0
      switch (BYTE_TYPE(enc, ptr)) {
527
0
      case BT_DIGIT:
528
0
        break;
529
0
      case BT_SEMI:
530
0
        *nextTokPtr = ptr + MINBPC(enc);
531
0
        return XML_TOK_CHAR_REF;
532
0
      default:
533
0
        *nextTokPtr = ptr;
534
0
        return XML_TOK_INVALID;
535
0
      }
536
0
    }
537
0
  }
538
0
  return XML_TOK_PARTIAL;
539
0
}
Unexecuted instantiation: xmltok.c:normal_scanCharRef
Unexecuted instantiation: xmltok.c:little2_scanCharRef
Unexecuted instantiation: xmltok.c:big2_scanCharRef
540
541
/* ptr points to character following "&" */
542
543
static int PTRCALL
544
PREFIX(scanRef)(const ENCODING *enc, const char *ptr, const char *end,
545
0
                const char **nextTokPtr) {
546
0
  REQUIRE_CHAR(enc, ptr, end);
547
0
  switch (BYTE_TYPE(enc, ptr)) {
548
0
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
549
0
  case BT_NUM:
550
0
    return PREFIX(scanCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
551
0
  default:
552
0
    *nextTokPtr = ptr;
553
0
    return XML_TOK_INVALID;
554
0
  }
555
0
  while (HAS_CHAR(enc, ptr, end)) {
556
0
    switch (BYTE_TYPE(enc, ptr)) {
557
0
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
558
0
    case BT_SEMI:
559
0
      *nextTokPtr = ptr + MINBPC(enc);
560
0
      return XML_TOK_ENTITY_REF;
561
0
    default:
562
0
      *nextTokPtr = ptr;
563
0
      return XML_TOK_INVALID;
564
0
    }
565
0
  }
566
0
  return XML_TOK_PARTIAL;
567
0
}
Unexecuted instantiation: xmltok.c:normal_scanRef
Unexecuted instantiation: xmltok.c:little2_scanRef
Unexecuted instantiation: xmltok.c:big2_scanRef
568
569
/* ptr points to character following first character of attribute name */
570
571
static int PTRCALL
572
PREFIX(scanAtts)(const ENCODING *enc, const char *ptr, const char *end,
573
40.2k
                 const char **nextTokPtr) {
574
40.2k
#  ifdef XML_NS
575
40.2k
  int hadColon = 0;
576
40.2k
#  endif
577
402k
  while (HAS_CHAR(enc, ptr, end)) {
578
402k
    switch (BYTE_TYPE(enc, ptr)) {
579
1.16M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
580
0
#  ifdef XML_NS
581
104
    case BT_COLON:
582
104
      if (hadColon) {
583
0
        *nextTokPtr = ptr;
584
0
        return XML_TOK_INVALID;
585
0
      }
586
104
      hadColon = 1;
587
104
      ptr += MINBPC(enc);
588
104
      REQUIRE_CHAR(enc, ptr, end);
589
104
      switch (BYTE_TYPE(enc, ptr)) {
590
104
        CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
591
0
      default:
592
0
        *nextTokPtr = ptr;
593
0
        return XML_TOK_INVALID;
594
104
      }
595
104
      break;
596
104
#  endif
597
104
    case BT_S:
598
8
    case BT_CR:
599
10
    case BT_LF:
600
15
      for (;;) {
601
15
        int t;
602
603
15
        ptr += MINBPC(enc);
604
15
        REQUIRE_CHAR(enc, ptr, end);
605
15
        t = BYTE_TYPE(enc, ptr);
606
15
        if (t == BT_EQUALS)
607
0
          break;
608
15
        switch (t) {
609
5
        case BT_S:
610
5
        case BT_LF:
611
5
        case BT_CR:
612
5
          break;
613
10
        default:
614
10
          *nextTokPtr = ptr;
615
10
          return XML_TOK_INVALID;
616
15
        }
617
15
      }
618
      /* fall through */
619
85.4k
    case BT_EQUALS: {
620
85.4k
      int open;
621
85.4k
#  ifdef XML_NS
622
85.4k
      hadColon = 0;
623
85.4k
#  endif
624
85.4k
      for (;;) {
625
85.4k
        ptr += MINBPC(enc);
626
85.4k
        REQUIRE_CHAR(enc, ptr, end);
627
85.4k
        open = BYTE_TYPE(enc, ptr);
628
85.4k
        if (open == BT_QUOT || open == BT_APOS)
629
85.4k
          break;
630
4
        switch (open) {
631
1
        case BT_S:
632
1
        case BT_LF:
633
1
        case BT_CR:
634
1
          break;
635
3
        default:
636
3
          *nextTokPtr = ptr;
637
3
          return XML_TOK_INVALID;
638
4
        }
639
4
      }
640
85.4k
      ptr += MINBPC(enc);
641
      /* in attribute value */
642
8.63M
      for (;;) {
643
8.63M
        int t;
644
8.63M
        REQUIRE_CHAR(enc, ptr, end);
645
8.63M
        t = BYTE_TYPE(enc, ptr);
646
8.63M
        if (t == open)
647
85.4k
          break;
648
8.55M
        switch (t) {
649
2.77k
          INVALID_CASES(ptr, nextTokPtr)
650
0
        case BT_AMP: {
651
0
          int tok = PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, &ptr);
652
0
          if (tok <= 0) {
653
0
            if (tok == XML_TOK_INVALID)
654
0
              *nextTokPtr = ptr;
655
0
            return tok;
656
0
          }
657
0
          break;
658
0
        }
659
12
        case BT_LT:
660
12
          *nextTokPtr = ptr;
661
12
          return XML_TOK_INVALID;
662
8.55M
        default:
663
8.55M
          ptr += MINBPC(enc);
664
8.55M
          break;
665
8.55M
        }
666
8.55M
      }
667
85.4k
      ptr += MINBPC(enc);
668
85.4k
      REQUIRE_CHAR(enc, ptr, end);
669
85.4k
      switch (BYTE_TYPE(enc, ptr)) {
670
84.2k
      case BT_S:
671
84.2k
      case BT_CR:
672
84.2k
      case BT_LF:
673
84.2k
        break;
674
568
      case BT_SOL:
675
568
        goto sol;
676
651
      case BT_GT:
677
651
        goto gt;
678
26
      default:
679
26
        *nextTokPtr = ptr;
680
26
        return XML_TOK_INVALID;
681
85.4k
      }
682
      /* ptr points to closing quote */
683
84.2k
      for (;;) {
684
84.2k
        ptr += MINBPC(enc);
685
84.2k
        REQUIRE_CHAR(enc, ptr, end);
686
84.2k
        switch (BYTE_TYPE(enc, ptr)) {
687
7.69k
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
688
0
        case BT_S:
689
0
        case BT_CR:
690
0
        case BT_LF:
691
0
          continue;
692
0
        case BT_GT:
693
651
        gt:
694
651
          *nextTokPtr = ptr + MINBPC(enc);
695
651
          return XML_TOK_START_TAG_WITH_ATTS;
696
38.9k
        case BT_SOL:
697
39.5k
        sol:
698
39.5k
          ptr += MINBPC(enc);
699
39.5k
          REQUIRE_CHAR(enc, ptr, end);
700
39.5k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
701
1
            *nextTokPtr = ptr;
702
1
            return XML_TOK_INVALID;
703
1
          }
704
39.5k
          *nextTokPtr = ptr + MINBPC(enc);
705
39.5k
          return XML_TOK_EMPTY_ELEMENT_WITH_ATTS;
706
5
        default:
707
5
          *nextTokPtr = ptr;
708
5
          return XML_TOK_INVALID;
709
84.2k
        }
710
45.2k
        break;
711
84.2k
      }
712
45.2k
      break;
713
84.2k
    }
714
45.2k
    default:
715
8
      *nextTokPtr = ptr;
716
8
      return XML_TOK_INVALID;
717
402k
    }
718
402k
  }
719
0
  return XML_TOK_PARTIAL;
720
40.2k
}
xmltok.c:normal_scanAtts
Line
Count
Source
573
40.2k
                 const char **nextTokPtr) {
574
40.2k
#  ifdef XML_NS
575
40.2k
  int hadColon = 0;
576
40.2k
#  endif
577
402k
  while (HAS_CHAR(enc, ptr, end)) {
578
402k
    switch (BYTE_TYPE(enc, ptr)) {
579
1.16M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
580
0
#  ifdef XML_NS
581
104
    case BT_COLON:
582
104
      if (hadColon) {
583
0
        *nextTokPtr = ptr;
584
0
        return XML_TOK_INVALID;
585
0
      }
586
104
      hadColon = 1;
587
104
      ptr += MINBPC(enc);
588
104
      REQUIRE_CHAR(enc, ptr, end);
589
104
      switch (BYTE_TYPE(enc, ptr)) {
590
104
        CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
591
0
      default:
592
0
        *nextTokPtr = ptr;
593
0
        return XML_TOK_INVALID;
594
104
      }
595
104
      break;
596
104
#  endif
597
104
    case BT_S:
598
8
    case BT_CR:
599
10
    case BT_LF:
600
15
      for (;;) {
601
15
        int t;
602
603
15
        ptr += MINBPC(enc);
604
15
        REQUIRE_CHAR(enc, ptr, end);
605
15
        t = BYTE_TYPE(enc, ptr);
606
15
        if (t == BT_EQUALS)
607
0
          break;
608
15
        switch (t) {
609
5
        case BT_S:
610
5
        case BT_LF:
611
5
        case BT_CR:
612
5
          break;
613
10
        default:
614
10
          *nextTokPtr = ptr;
615
10
          return XML_TOK_INVALID;
616
15
        }
617
15
      }
618
      /* fall through */
619
85.4k
    case BT_EQUALS: {
620
85.4k
      int open;
621
85.4k
#  ifdef XML_NS
622
85.4k
      hadColon = 0;
623
85.4k
#  endif
624
85.4k
      for (;;) {
625
85.4k
        ptr += MINBPC(enc);
626
85.4k
        REQUIRE_CHAR(enc, ptr, end);
627
85.4k
        open = BYTE_TYPE(enc, ptr);
628
85.4k
        if (open == BT_QUOT || open == BT_APOS)
629
85.4k
          break;
630
4
        switch (open) {
631
1
        case BT_S:
632
1
        case BT_LF:
633
1
        case BT_CR:
634
1
          break;
635
3
        default:
636
3
          *nextTokPtr = ptr;
637
3
          return XML_TOK_INVALID;
638
4
        }
639
4
      }
640
85.4k
      ptr += MINBPC(enc);
641
      /* in attribute value */
642
8.63M
      for (;;) {
643
8.63M
        int t;
644
8.63M
        REQUIRE_CHAR(enc, ptr, end);
645
8.63M
        t = BYTE_TYPE(enc, ptr);
646
8.63M
        if (t == open)
647
85.4k
          break;
648
8.55M
        switch (t) {
649
2.77k
          INVALID_CASES(ptr, nextTokPtr)
650
0
        case BT_AMP: {
651
0
          int tok = PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, &ptr);
652
0
          if (tok <= 0) {
653
0
            if (tok == XML_TOK_INVALID)
654
0
              *nextTokPtr = ptr;
655
0
            return tok;
656
0
          }
657
0
          break;
658
0
        }
659
12
        case BT_LT:
660
12
          *nextTokPtr = ptr;
661
12
          return XML_TOK_INVALID;
662
8.55M
        default:
663
8.55M
          ptr += MINBPC(enc);
664
8.55M
          break;
665
8.55M
        }
666
8.55M
      }
667
85.4k
      ptr += MINBPC(enc);
668
85.4k
      REQUIRE_CHAR(enc, ptr, end);
669
85.4k
      switch (BYTE_TYPE(enc, ptr)) {
670
84.2k
      case BT_S:
671
84.2k
      case BT_CR:
672
84.2k
      case BT_LF:
673
84.2k
        break;
674
568
      case BT_SOL:
675
568
        goto sol;
676
651
      case BT_GT:
677
651
        goto gt;
678
26
      default:
679
26
        *nextTokPtr = ptr;
680
26
        return XML_TOK_INVALID;
681
85.4k
      }
682
      /* ptr points to closing quote */
683
84.2k
      for (;;) {
684
84.2k
        ptr += MINBPC(enc);
685
84.2k
        REQUIRE_CHAR(enc, ptr, end);
686
84.2k
        switch (BYTE_TYPE(enc, ptr)) {
687
7.69k
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
688
0
        case BT_S:
689
0
        case BT_CR:
690
0
        case BT_LF:
691
0
          continue;
692
0
        case BT_GT:
693
651
        gt:
694
651
          *nextTokPtr = ptr + MINBPC(enc);
695
651
          return XML_TOK_START_TAG_WITH_ATTS;
696
38.9k
        case BT_SOL:
697
39.5k
        sol:
698
39.5k
          ptr += MINBPC(enc);
699
39.5k
          REQUIRE_CHAR(enc, ptr, end);
700
39.5k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
701
1
            *nextTokPtr = ptr;
702
1
            return XML_TOK_INVALID;
703
1
          }
704
39.5k
          *nextTokPtr = ptr + MINBPC(enc);
705
39.5k
          return XML_TOK_EMPTY_ELEMENT_WITH_ATTS;
706
5
        default:
707
5
          *nextTokPtr = ptr;
708
5
          return XML_TOK_INVALID;
709
84.2k
        }
710
45.2k
        break;
711
84.2k
      }
712
45.2k
      break;
713
84.2k
    }
714
45.2k
    default:
715
8
      *nextTokPtr = ptr;
716
8
      return XML_TOK_INVALID;
717
402k
    }
718
402k
  }
719
0
  return XML_TOK_PARTIAL;
720
40.2k
}
Unexecuted instantiation: xmltok.c:little2_scanAtts
Unexecuted instantiation: xmltok.c:big2_scanAtts
721
722
/* ptr points to character following "<" */
723
724
static int PTRCALL
725
PREFIX(scanLt)(const ENCODING *enc, const char *ptr, const char *end,
726
40.9k
               const char **nextTokPtr) {
727
40.9k
#  ifdef XML_NS
728
40.9k
  int hadColon;
729
40.9k
#  endif
730
40.9k
  REQUIRE_CHAR(enc, ptr, end);
731
40.9k
  switch (BYTE_TYPE(enc, ptr)) {
732
39.7k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
733
0
  case BT_EXCL:
734
0
    ptr += MINBPC(enc);
735
0
    REQUIRE_CHAR(enc, ptr, end);
736
0
    switch (BYTE_TYPE(enc, ptr)) {
737
0
    case BT_MINUS:
738
0
      return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
739
0
    case BT_LSQB:
740
0
      return PREFIX(scanCdataSection)(enc, ptr + MINBPC(enc), end, nextTokPtr);
741
0
    }
742
0
    *nextTokPtr = ptr;
743
0
    return XML_TOK_INVALID;
744
0
  case BT_QUEST:
745
0
    return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
746
581
  case BT_SOL:
747
581
    return PREFIX(scanEndTag)(enc, ptr + MINBPC(enc), end, nextTokPtr);
748
3
  default:
749
3
    *nextTokPtr = ptr;
750
3
    return XML_TOK_INVALID;
751
40.9k
  }
752
40.3k
#  ifdef XML_NS
753
40.3k
  hadColon = 0;
754
40.3k
#  endif
755
  /* we have a start-tag */
756
173k
  while (HAS_CHAR(enc, ptr, end)) {
757
173k
    switch (BYTE_TYPE(enc, ptr)) {
758
487k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
759
0
#  ifdef XML_NS
760
0
    case BT_COLON:
761
0
      if (hadColon) {
762
0
        *nextTokPtr = ptr;
763
0
        return XML_TOK_INVALID;
764
0
      }
765
0
      hadColon = 1;
766
0
      ptr += MINBPC(enc);
767
0
      REQUIRE_CHAR(enc, ptr, end);
768
0
      switch (BYTE_TYPE(enc, ptr)) {
769
0
        CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
770
0
      default:
771
0
        *nextTokPtr = ptr;
772
0
        return XML_TOK_INVALID;
773
0
      }
774
0
      break;
775
0
#  endif
776
40.2k
    case BT_S:
777
40.2k
    case BT_CR:
778
40.2k
    case BT_LF: {
779
40.2k
      ptr += MINBPC(enc);
780
40.2k
      while (HAS_CHAR(enc, ptr, end)) {
781
40.2k
        switch (BYTE_TYPE(enc, ptr)) {
782
1.01k
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
783
0
        case BT_GT:
784
0
          goto gt;
785
0
        case BT_SOL:
786
0
          goto sol;
787
0
        case BT_S:
788
0
        case BT_CR:
789
0
        case BT_LF:
790
0
          ptr += MINBPC(enc);
791
0
          continue;
792
3
        default:
793
3
          *nextTokPtr = ptr;
794
3
          return XML_TOK_INVALID;
795
40.2k
        }
796
40.2k
        return PREFIX(scanAtts)(enc, ptr, end, nextTokPtr);
797
40.2k
      }
798
0
      return XML_TOK_PARTIAL;
799
40.2k
    }
800
85
    case BT_GT:
801
85
    gt:
802
85
      *nextTokPtr = ptr + MINBPC(enc);
803
85
      return XML_TOK_START_TAG_NO_ATTS;
804
0
    case BT_SOL:
805
0
    sol:
806
0
      ptr += MINBPC(enc);
807
0
      REQUIRE_CHAR(enc, ptr, end);
808
0
      if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
809
0
        *nextTokPtr = ptr;
810
0
        return XML_TOK_INVALID;
811
0
      }
812
0
      *nextTokPtr = ptr + MINBPC(enc);
813
0
      return XML_TOK_EMPTY_ELEMENT_NO_ATTS;
814
3
    default:
815
3
      *nextTokPtr = ptr;
816
3
      return XML_TOK_INVALID;
817
173k
    }
818
173k
  }
819
0
  return XML_TOK_PARTIAL;
820
40.3k
}
xmltok.c:normal_scanLt
Line
Count
Source
726
40.9k
               const char **nextTokPtr) {
727
40.9k
#  ifdef XML_NS
728
40.9k
  int hadColon;
729
40.9k
#  endif
730
40.9k
  REQUIRE_CHAR(enc, ptr, end);
731
40.9k
  switch (BYTE_TYPE(enc, ptr)) {
732
39.7k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
733
0
  case BT_EXCL:
734
0
    ptr += MINBPC(enc);
735
0
    REQUIRE_CHAR(enc, ptr, end);
736
0
    switch (BYTE_TYPE(enc, ptr)) {
737
0
    case BT_MINUS:
738
0
      return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
739
0
    case BT_LSQB:
740
0
      return PREFIX(scanCdataSection)(enc, ptr + MINBPC(enc), end, nextTokPtr);
741
0
    }
742
0
    *nextTokPtr = ptr;
743
0
    return XML_TOK_INVALID;
744
0
  case BT_QUEST:
745
0
    return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
746
581
  case BT_SOL:
747
581
    return PREFIX(scanEndTag)(enc, ptr + MINBPC(enc), end, nextTokPtr);
748
3
  default:
749
3
    *nextTokPtr = ptr;
750
3
    return XML_TOK_INVALID;
751
40.9k
  }
752
40.3k
#  ifdef XML_NS
753
40.3k
  hadColon = 0;
754
40.3k
#  endif
755
  /* we have a start-tag */
756
173k
  while (HAS_CHAR(enc, ptr, end)) {
757
173k
    switch (BYTE_TYPE(enc, ptr)) {
758
487k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
759
0
#  ifdef XML_NS
760
0
    case BT_COLON:
761
0
      if (hadColon) {
762
0
        *nextTokPtr = ptr;
763
0
        return XML_TOK_INVALID;
764
0
      }
765
0
      hadColon = 1;
766
0
      ptr += MINBPC(enc);
767
0
      REQUIRE_CHAR(enc, ptr, end);
768
0
      switch (BYTE_TYPE(enc, ptr)) {
769
0
        CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
770
0
      default:
771
0
        *nextTokPtr = ptr;
772
0
        return XML_TOK_INVALID;
773
0
      }
774
0
      break;
775
0
#  endif
776
40.2k
    case BT_S:
777
40.2k
    case BT_CR:
778
40.2k
    case BT_LF: {
779
40.2k
      ptr += MINBPC(enc);
780
40.2k
      while (HAS_CHAR(enc, ptr, end)) {
781
40.2k
        switch (BYTE_TYPE(enc, ptr)) {
782
1.01k
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
783
0
        case BT_GT:
784
0
          goto gt;
785
0
        case BT_SOL:
786
0
          goto sol;
787
0
        case BT_S:
788
0
        case BT_CR:
789
0
        case BT_LF:
790
0
          ptr += MINBPC(enc);
791
0
          continue;
792
3
        default:
793
3
          *nextTokPtr = ptr;
794
3
          return XML_TOK_INVALID;
795
40.2k
        }
796
40.2k
        return PREFIX(scanAtts)(enc, ptr, end, nextTokPtr);
797
40.2k
      }
798
0
      return XML_TOK_PARTIAL;
799
40.2k
    }
800
85
    case BT_GT:
801
85
    gt:
802
85
      *nextTokPtr = ptr + MINBPC(enc);
803
85
      return XML_TOK_START_TAG_NO_ATTS;
804
0
    case BT_SOL:
805
0
    sol:
806
0
      ptr += MINBPC(enc);
807
0
      REQUIRE_CHAR(enc, ptr, end);
808
0
      if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
809
0
        *nextTokPtr = ptr;
810
0
        return XML_TOK_INVALID;
811
0
      }
812
0
      *nextTokPtr = ptr + MINBPC(enc);
813
0
      return XML_TOK_EMPTY_ELEMENT_NO_ATTS;
814
3
    default:
815
3
      *nextTokPtr = ptr;
816
3
      return XML_TOK_INVALID;
817
173k
    }
818
173k
  }
819
0
  return XML_TOK_PARTIAL;
820
40.3k
}
Unexecuted instantiation: xmltok.c:little2_scanLt
Unexecuted instantiation: xmltok.c:big2_scanLt
821
822
static int PTRCALL
823
PREFIX(contentTok)(const ENCODING *enc, const char *ptr, const char *end,
824
116k
                   const char **nextTokPtr) {
825
116k
  if (ptr >= end)
826
0
    return XML_TOK_NONE;
827
116k
  if (MINBPC(enc) > 1) {
828
0
    size_t n = end - ptr;
829
0
    if (n & (MINBPC(enc) - 1)) {
830
0
      n &= ~(MINBPC(enc) - 1);
831
0
      if (n == 0)
832
0
        return XML_TOK_PARTIAL;
833
0
      end = ptr + n;
834
0
    }
835
0
  }
836
116k
  switch (BYTE_TYPE(enc, ptr)) {
837
40.9k
  case BT_LT:
838
40.9k
    return PREFIX(scanLt)(enc, ptr + MINBPC(enc), end, nextTokPtr);
839
0
  case BT_AMP:
840
0
    return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
841
715
  case BT_CR:
842
715
    ptr += MINBPC(enc);
843
715
    if (! HAS_CHAR(enc, ptr, end))
844
0
      return XML_TOK_TRAILING_CR;
845
715
    if (BYTE_TYPE(enc, ptr) == BT_LF)
846
715
      ptr += MINBPC(enc);
847
715
    *nextTokPtr = ptr;
848
715
    return XML_TOK_DATA_NEWLINE;
849
35.0k
  case BT_LF:
850
35.0k
    *nextTokPtr = ptr + MINBPC(enc);
851
35.0k
    return XML_TOK_DATA_NEWLINE;
852
0
  case BT_RSQB:
853
0
    ptr += MINBPC(enc);
854
0
    if (! HAS_CHAR(enc, ptr, end))
855
0
      return XML_TOK_TRAILING_RSQB;
856
0
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
857
0
      break;
858
0
    ptr += MINBPC(enc);
859
0
    if (! HAS_CHAR(enc, ptr, end))
860
0
      return XML_TOK_TRAILING_RSQB;
861
0
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
862
0
      ptr -= MINBPC(enc);
863
0
      break;
864
0
    }
865
0
    *nextTokPtr = ptr;
866
0
    return XML_TOK_INVALID;
867
0
    INVALID_CASES(ptr, nextTokPtr)
868
39.3k
  default:
869
39.3k
    ptr += MINBPC(enc);
870
39.3k
    break;
871
116k
  }
872
196k
  while (HAS_CHAR(enc, ptr, end)) {
873
196k
    switch (BYTE_TYPE(enc, ptr)) {
874
0
#  define LEAD_CASE(n)                                                         \
875
0
  case BT_LEAD##n:                                                             \
876
0
    if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) {                       \
877
0
      *nextTokPtr = ptr;                                                       \
878
0
      return XML_TOK_DATA_CHARS;                                               \
879
0
    }                                                                          \
880
0
    ptr += n;                                                                  \
881
0
    break;
882
0
      LEAD_CASE(2)
883
0
      LEAD_CASE(3)
884
0
      LEAD_CASE(4)
885
0
#  undef LEAD_CASE
886
0
    case BT_RSQB:
887
0
      if (HAS_CHARS(enc, ptr, end, 2)) {
888
0
        if (! CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_RSQB)) {
889
0
          ptr += MINBPC(enc);
890
0
          break;
891
0
        }
892
0
        if (HAS_CHARS(enc, ptr, end, 3)) {
893
0
          if (! CHAR_MATCHES(enc, ptr + 2 * MINBPC(enc), ASCII_GT)) {
894
0
            ptr += MINBPC(enc);
895
0
            break;
896
0
          }
897
0
          *nextTokPtr = ptr + 2 * MINBPC(enc);
898
0
          return XML_TOK_INVALID;
899
0
        }
900
0
      }
901
      /* fall through */
902
0
    case BT_AMP:
903
38.9k
    case BT_LT:
904
38.9k
    case BT_NONXML:
905
38.9k
    case BT_MALFORM:
906
38.9k
    case BT_TRAIL:
907
38.9k
    case BT_CR:
908
39.3k
    case BT_LF:
909
39.3k
      *nextTokPtr = ptr;
910
39.3k
      return XML_TOK_DATA_CHARS;
911
157k
    default:
912
157k
      ptr += MINBPC(enc);
913
157k
      break;
914
196k
    }
915
196k
  }
916
0
  *nextTokPtr = ptr;
917
0
  return XML_TOK_DATA_CHARS;
918
39.3k
}
xmltok.c:normal_contentTok
Line
Count
Source
824
116k
                   const char **nextTokPtr) {
825
116k
  if (ptr >= end)
826
0
    return XML_TOK_NONE;
827
116k
  if (MINBPC(enc) > 1) {
828
0
    size_t n = end - ptr;
829
0
    if (n & (MINBPC(enc) - 1)) {
830
0
      n &= ~(MINBPC(enc) - 1);
831
0
      if (n == 0)
832
0
        return XML_TOK_PARTIAL;
833
0
      end = ptr + n;
834
0
    }
835
0
  }
836
116k
  switch (BYTE_TYPE(enc, ptr)) {
837
40.9k
  case BT_LT:
838
40.9k
    return PREFIX(scanLt)(enc, ptr + MINBPC(enc), end, nextTokPtr);
839
0
  case BT_AMP:
840
0
    return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
841
715
  case BT_CR:
842
715
    ptr += MINBPC(enc);
843
715
    if (! HAS_CHAR(enc, ptr, end))
844
0
      return XML_TOK_TRAILING_CR;
845
715
    if (BYTE_TYPE(enc, ptr) == BT_LF)
846
715
      ptr += MINBPC(enc);
847
715
    *nextTokPtr = ptr;
848
715
    return XML_TOK_DATA_NEWLINE;
849
35.0k
  case BT_LF:
850
35.0k
    *nextTokPtr = ptr + MINBPC(enc);
851
35.0k
    return XML_TOK_DATA_NEWLINE;
852
0
  case BT_RSQB:
853
0
    ptr += MINBPC(enc);
854
0
    if (! HAS_CHAR(enc, ptr, end))
855
0
      return XML_TOK_TRAILING_RSQB;
856
0
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
857
0
      break;
858
0
    ptr += MINBPC(enc);
859
0
    if (! HAS_CHAR(enc, ptr, end))
860
0
      return XML_TOK_TRAILING_RSQB;
861
0
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
862
0
      ptr -= MINBPC(enc);
863
0
      break;
864
0
    }
865
0
    *nextTokPtr = ptr;
866
0
    return XML_TOK_INVALID;
867
0
    INVALID_CASES(ptr, nextTokPtr)
868
39.3k
  default:
869
39.3k
    ptr += MINBPC(enc);
870
39.3k
    break;
871
116k
  }
872
196k
  while (HAS_CHAR(enc, ptr, end)) {
873
196k
    switch (BYTE_TYPE(enc, ptr)) {
874
0
#  define LEAD_CASE(n)                                                         \
875
0
  case BT_LEAD##n:                                                             \
876
0
    if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) {                       \
877
0
      *nextTokPtr = ptr;                                                       \
878
0
      return XML_TOK_DATA_CHARS;                                               \
879
0
    }                                                                          \
880
0
    ptr += n;                                                                  \
881
0
    break;
882
0
      LEAD_CASE(2)
883
0
      LEAD_CASE(3)
884
0
      LEAD_CASE(4)
885
0
#  undef LEAD_CASE
886
0
    case BT_RSQB:
887
0
      if (HAS_CHARS(enc, ptr, end, 2)) {
888
0
        if (! CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_RSQB)) {
889
0
          ptr += MINBPC(enc);
890
0
          break;
891
0
        }
892
0
        if (HAS_CHARS(enc, ptr, end, 3)) {
893
0
          if (! CHAR_MATCHES(enc, ptr + 2 * MINBPC(enc), ASCII_GT)) {
894
0
            ptr += MINBPC(enc);
895
0
            break;
896
0
          }
897
0
          *nextTokPtr = ptr + 2 * MINBPC(enc);
898
0
          return XML_TOK_INVALID;
899
0
        }
900
0
      }
901
      /* fall through */
902
0
    case BT_AMP:
903
38.9k
    case BT_LT:
904
38.9k
    case BT_NONXML:
905
38.9k
    case BT_MALFORM:
906
38.9k
    case BT_TRAIL:
907
38.9k
    case BT_CR:
908
39.3k
    case BT_LF:
909
39.3k
      *nextTokPtr = ptr;
910
39.3k
      return XML_TOK_DATA_CHARS;
911
157k
    default:
912
157k
      ptr += MINBPC(enc);
913
157k
      break;
914
196k
    }
915
196k
  }
916
0
  *nextTokPtr = ptr;
917
0
  return XML_TOK_DATA_CHARS;
918
39.3k
}
Unexecuted instantiation: xmltok.c:little2_contentTok
Unexecuted instantiation: xmltok.c:big2_contentTok
919
920
/* ptr points to character following "%" */
921
922
static int PTRCALL
923
PREFIX(scanPercent)(const ENCODING *enc, const char *ptr, const char *end,
924
0
                    const char **nextTokPtr) {
925
0
  REQUIRE_CHAR(enc, ptr, end);
926
0
  switch (BYTE_TYPE(enc, ptr)) {
927
0
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
928
0
  case BT_S:
929
0
  case BT_LF:
930
0
  case BT_CR:
931
0
  case BT_PERCNT:
932
0
    *nextTokPtr = ptr;
933
0
    return XML_TOK_PERCENT;
934
0
  default:
935
0
    *nextTokPtr = ptr;
936
0
    return XML_TOK_INVALID;
937
0
  }
938
0
  while (HAS_CHAR(enc, ptr, end)) {
939
0
    switch (BYTE_TYPE(enc, ptr)) {
940
0
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
941
0
    case BT_SEMI:
942
0
      *nextTokPtr = ptr + MINBPC(enc);
943
0
      return XML_TOK_PARAM_ENTITY_REF;
944
0
    default:
945
0
      *nextTokPtr = ptr;
946
0
      return XML_TOK_INVALID;
947
0
    }
948
0
  }
949
0
  return XML_TOK_PARTIAL;
950
0
}
Unexecuted instantiation: xmltok.c:normal_scanPercent
Unexecuted instantiation: xmltok.c:little2_scanPercent
Unexecuted instantiation: xmltok.c:big2_scanPercent
951
952
static int PTRCALL
953
PREFIX(scanPoundName)(const ENCODING *enc, const char *ptr, const char *end,
954
0
                      const char **nextTokPtr) {
955
0
  REQUIRE_CHAR(enc, ptr, end);
956
0
  switch (BYTE_TYPE(enc, ptr)) {
957
0
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
958
0
  default:
959
0
    *nextTokPtr = ptr;
960
0
    return XML_TOK_INVALID;
961
0
  }
962
0
  while (HAS_CHAR(enc, ptr, end)) {
963
0
    switch (BYTE_TYPE(enc, ptr)) {
964
0
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
965
0
    case BT_CR:
966
0
    case BT_LF:
967
0
    case BT_S:
968
0
    case BT_RPAR:
969
0
    case BT_GT:
970
0
    case BT_PERCNT:
971
0
    case BT_VERBAR:
972
0
      *nextTokPtr = ptr;
973
0
      return XML_TOK_POUND_NAME;
974
0
    default:
975
0
      *nextTokPtr = ptr;
976
0
      return XML_TOK_INVALID;
977
0
    }
978
0
  }
979
0
  return -XML_TOK_POUND_NAME;
980
0
}
Unexecuted instantiation: xmltok.c:normal_scanPoundName
Unexecuted instantiation: xmltok.c:little2_scanPoundName
Unexecuted instantiation: xmltok.c:big2_scanPoundName
981
982
static int PTRCALL
983
PREFIX(scanLit)(int open, const ENCODING *enc, const char *ptr, const char *end,
984
0
                const char **nextTokPtr) {
985
0
  while (HAS_CHAR(enc, ptr, end)) {
986
0
    int t = BYTE_TYPE(enc, ptr);
987
0
    switch (t) {
988
0
      INVALID_CASES(ptr, nextTokPtr)
989
0
    case BT_QUOT:
990
0
    case BT_APOS:
991
0
      ptr += MINBPC(enc);
992
0
      if (t != open)
993
0
        break;
994
0
      if (! HAS_CHAR(enc, ptr, end))
995
0
        return -XML_TOK_LITERAL;
996
0
      *nextTokPtr = ptr;
997
0
      switch (BYTE_TYPE(enc, ptr)) {
998
0
      case BT_S:
999
0
      case BT_CR:
1000
0
      case BT_LF:
1001
0
      case BT_GT:
1002
0
      case BT_PERCNT:
1003
0
      case BT_LSQB:
1004
0
        return XML_TOK_LITERAL;
1005
0
      default:
1006
0
        return XML_TOK_INVALID;
1007
0
      }
1008
0
    default:
1009
0
      ptr += MINBPC(enc);
1010
0
      break;
1011
0
    }
1012
0
  }
1013
0
  return XML_TOK_PARTIAL;
1014
0
}
Unexecuted instantiation: xmltok.c:normal_scanLit
Unexecuted instantiation: xmltok.c:little2_scanLit
Unexecuted instantiation: xmltok.c:big2_scanLit
1015
1016
static int PTRCALL
1017
PREFIX(prologTok)(const ENCODING *enc, const char *ptr, const char *end,
1018
1.78k
                  const char **nextTokPtr) {
1019
1.78k
  int tok;
1020
1.78k
  if (ptr >= end)
1021
375
    return XML_TOK_NONE;
1022
1.41k
  if (MINBPC(enc) > 1) {
1023
0
    size_t n = end - ptr;
1024
0
    if (n & (MINBPC(enc) - 1)) {
1025
0
      n &= ~(MINBPC(enc) - 1);
1026
0
      if (n == 0)
1027
0
        return XML_TOK_PARTIAL;
1028
0
      end = ptr + n;
1029
0
    }
1030
0
  }
1031
1.41k
  switch (BYTE_TYPE(enc, ptr)) {
1032
0
  case BT_QUOT:
1033
0
    return PREFIX(scanLit)(BT_QUOT, enc, ptr + MINBPC(enc), end, nextTokPtr);
1034
0
  case BT_APOS:
1035
0
    return PREFIX(scanLit)(BT_APOS, enc, ptr + MINBPC(enc), end, nextTokPtr);
1036
778
  case BT_LT: {
1037
778
    ptr += MINBPC(enc);
1038
778
    REQUIRE_CHAR(enc, ptr, end);
1039
778
    switch (BYTE_TYPE(enc, ptr)) {
1040
0
    case BT_EXCL:
1041
0
      return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1042
320
    case BT_QUEST:
1043
320
      return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1044
118
    case BT_NMSTRT:
1045
458
    case BT_HEX:
1046
458
    case BT_NONASCII:
1047
458
    case BT_LEAD2:
1048
458
    case BT_LEAD3:
1049
458
    case BT_LEAD4:
1050
458
      *nextTokPtr = ptr - MINBPC(enc);
1051
458
      return XML_TOK_INSTANCE_START;
1052
778
    }
1053
0
    *nextTokPtr = ptr;
1054
0
    return XML_TOK_INVALID;
1055
778
  }
1056
611
  case BT_CR:
1057
611
    if (ptr + MINBPC(enc) == end) {
1058
0
      *nextTokPtr = end;
1059
      /* indicate that this might be part of a CR/LF pair */
1060
0
      return -XML_TOK_PROLOG_S;
1061
0
    }
1062
    /* fall through */
1063
611
  case BT_S:
1064
630
  case BT_LF:
1065
1.24k
    for (;;) {
1066
1.24k
      ptr += MINBPC(enc);
1067
1.24k
      if (! HAS_CHAR(enc, ptr, end))
1068
319
        break;
1069
922
      switch (BYTE_TYPE(enc, ptr)) {
1070
0
      case BT_S:
1071
611
      case BT_LF:
1072
611
        break;
1073
0
      case BT_CR:
1074
        /* don't split CR/LF pair */
1075
0
        if (ptr + MINBPC(enc) != end)
1076
0
          break;
1077
        /* fall through */
1078
311
      default:
1079
311
        *nextTokPtr = ptr;
1080
311
        return XML_TOK_PROLOG_S;
1081
922
      }
1082
922
    }
1083
319
    *nextTokPtr = ptr;
1084
319
    return XML_TOK_PROLOG_S;
1085
0
  case BT_PERCNT:
1086
0
    return PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1087
0
  case BT_COMMA:
1088
0
    *nextTokPtr = ptr + MINBPC(enc);
1089
0
    return XML_TOK_COMMA;
1090
0
  case BT_LSQB:
1091
0
    *nextTokPtr = ptr + MINBPC(enc);
1092
0
    return XML_TOK_OPEN_BRACKET;
1093
0
  case BT_RSQB:
1094
0
    ptr += MINBPC(enc);
1095
0
    if (! HAS_CHAR(enc, ptr, end))
1096
0
      return -XML_TOK_CLOSE_BRACKET;
1097
0
    if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) {
1098
0
      REQUIRE_CHARS(enc, ptr, end, 2);
1099
0
      if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_GT)) {
1100
0
        *nextTokPtr = ptr + 2 * MINBPC(enc);
1101
0
        return XML_TOK_COND_SECT_CLOSE;
1102
0
      }
1103
0
    }
1104
0
    *nextTokPtr = ptr;
1105
0
    return XML_TOK_CLOSE_BRACKET;
1106
0
  case BT_LPAR:
1107
0
    *nextTokPtr = ptr + MINBPC(enc);
1108
0
    return XML_TOK_OPEN_PAREN;
1109
0
  case BT_RPAR:
1110
0
    ptr += MINBPC(enc);
1111
0
    if (! HAS_CHAR(enc, ptr, end))
1112
0
      return -XML_TOK_CLOSE_PAREN;
1113
0
    switch (BYTE_TYPE(enc, ptr)) {
1114
0
    case BT_AST:
1115
0
      *nextTokPtr = ptr + MINBPC(enc);
1116
0
      return XML_TOK_CLOSE_PAREN_ASTERISK;
1117
0
    case BT_QUEST:
1118
0
      *nextTokPtr = ptr + MINBPC(enc);
1119
0
      return XML_TOK_CLOSE_PAREN_QUESTION;
1120
0
    case BT_PLUS:
1121
0
      *nextTokPtr = ptr + MINBPC(enc);
1122
0
      return XML_TOK_CLOSE_PAREN_PLUS;
1123
0
    case BT_CR:
1124
0
    case BT_LF:
1125
0
    case BT_S:
1126
0
    case BT_GT:
1127
0
    case BT_COMMA:
1128
0
    case BT_VERBAR:
1129
0
    case BT_RPAR:
1130
0
      *nextTokPtr = ptr;
1131
0
      return XML_TOK_CLOSE_PAREN;
1132
0
    }
1133
0
    *nextTokPtr = ptr;
1134
0
    return XML_TOK_INVALID;
1135
0
  case BT_VERBAR:
1136
0
    *nextTokPtr = ptr + MINBPC(enc);
1137
0
    return XML_TOK_OR;
1138
0
  case BT_GT:
1139
0
    *nextTokPtr = ptr + MINBPC(enc);
1140
0
    return XML_TOK_DECL_CLOSE;
1141
0
  case BT_NUM:
1142
0
    return PREFIX(scanPoundName)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1143
0
#  define LEAD_CASE(n)                                                         \
1144
0
  case BT_LEAD##n:                                                             \
1145
0
    if (end - ptr < n)                                                         \
1146
0
      return XML_TOK_PARTIAL_CHAR;                                             \
1147
0
    if (IS_INVALID_CHAR(enc, ptr, n)) {                                        \
1148
0
      *nextTokPtr = ptr;                                                       \
1149
0
      return XML_TOK_INVALID;                                                  \
1150
0
    }                                                                          \
1151
0
    if (IS_NMSTRT_CHAR(enc, ptr, n)) {                                         \
1152
0
      ptr += n;                                                                \
1153
0
      tok = XML_TOK_NAME;                                                      \
1154
0
      break;                                                                   \
1155
0
    }                                                                          \
1156
0
    if (IS_NAME_CHAR(enc, ptr, n)) {                                           \
1157
0
      ptr += n;                                                                \
1158
0
      tok = XML_TOK_NMTOKEN;                                                   \
1159
0
      break;                                                                   \
1160
0
    }                                                                          \
1161
0
    *nextTokPtr = ptr;                                                         \
1162
0
    return XML_TOK_INVALID;
1163
0
    LEAD_CASE(2)
1164
0
    LEAD_CASE(3)
1165
0
    LEAD_CASE(4)
1166
0
#  undef LEAD_CASE
1167
0
  case BT_NMSTRT:
1168
0
  case BT_HEX:
1169
0
    tok = XML_TOK_NAME;
1170
0
    ptr += MINBPC(enc);
1171
0
    break;
1172
0
  case BT_DIGIT:
1173
0
  case BT_NAME:
1174
0
  case BT_MINUS:
1175
0
#  ifdef XML_NS
1176
0
  case BT_COLON:
1177
0
#  endif
1178
0
    tok = XML_TOK_NMTOKEN;
1179
0
    ptr += MINBPC(enc);
1180
0
    break;
1181
0
  case BT_NONASCII:
1182
0
    if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {
1183
0
      ptr += MINBPC(enc);
1184
0
      tok = XML_TOK_NAME;
1185
0
      break;
1186
0
    }
1187
0
    if (IS_NAME_CHAR_MINBPC(enc, ptr)) {
1188
0
      ptr += MINBPC(enc);
1189
0
      tok = XML_TOK_NMTOKEN;
1190
0
      break;
1191
0
    }
1192
    /* fall through */
1193
5
  default:
1194
5
    *nextTokPtr = ptr;
1195
5
    return XML_TOK_INVALID;
1196
1.41k
  }
1197
0
  while (HAS_CHAR(enc, ptr, end)) {
1198
0
    switch (BYTE_TYPE(enc, ptr)) {
1199
0
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1200
0
    case BT_GT:
1201
0
    case BT_RPAR:
1202
0
    case BT_COMMA:
1203
0
    case BT_VERBAR:
1204
0
    case BT_LSQB:
1205
0
    case BT_PERCNT:
1206
0
    case BT_S:
1207
0
    case BT_CR:
1208
0
    case BT_LF:
1209
0
      *nextTokPtr = ptr;
1210
0
      return tok;
1211
0
#  ifdef XML_NS
1212
0
    case BT_COLON:
1213
0
      ptr += MINBPC(enc);
1214
0
      switch (tok) {
1215
0
      case XML_TOK_NAME:
1216
0
        REQUIRE_CHAR(enc, ptr, end);
1217
0
        tok = XML_TOK_PREFIXED_NAME;
1218
0
        switch (BYTE_TYPE(enc, ptr)) {
1219
0
          CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1220
0
        default:
1221
0
          tok = XML_TOK_NMTOKEN;
1222
0
          break;
1223
0
        }
1224
0
        break;
1225
0
      case XML_TOK_PREFIXED_NAME:
1226
0
        tok = XML_TOK_NMTOKEN;
1227
0
        break;
1228
0
      }
1229
0
      break;
1230
0
#  endif
1231
0
    case BT_PLUS:
1232
0
      if (tok == XML_TOK_NMTOKEN) {
1233
0
        *nextTokPtr = ptr;
1234
0
        return XML_TOK_INVALID;
1235
0
      }
1236
0
      *nextTokPtr = ptr + MINBPC(enc);
1237
0
      return XML_TOK_NAME_PLUS;
1238
0
    case BT_AST:
1239
0
      if (tok == XML_TOK_NMTOKEN) {
1240
0
        *nextTokPtr = ptr;
1241
0
        return XML_TOK_INVALID;
1242
0
      }
1243
0
      *nextTokPtr = ptr + MINBPC(enc);
1244
0
      return XML_TOK_NAME_ASTERISK;
1245
0
    case BT_QUEST:
1246
0
      if (tok == XML_TOK_NMTOKEN) {
1247
0
        *nextTokPtr = ptr;
1248
0
        return XML_TOK_INVALID;
1249
0
      }
1250
0
      *nextTokPtr = ptr + MINBPC(enc);
1251
0
      return XML_TOK_NAME_QUESTION;
1252
0
    default:
1253
0
      *nextTokPtr = ptr;
1254
0
      return XML_TOK_INVALID;
1255
0
    }
1256
0
  }
1257
0
  return -tok;
1258
0
}
xmltok.c:normal_prologTok
Line
Count
Source
1018
1.78k
                  const char **nextTokPtr) {
1019
1.78k
  int tok;
1020
1.78k
  if (ptr >= end)
1021
375
    return XML_TOK_NONE;
1022
1.41k
  if (MINBPC(enc) > 1) {
1023
0
    size_t n = end - ptr;
1024
0
    if (n & (MINBPC(enc) - 1)) {
1025
0
      n &= ~(MINBPC(enc) - 1);
1026
0
      if (n == 0)
1027
0
        return XML_TOK_PARTIAL;
1028
0
      end = ptr + n;
1029
0
    }
1030
0
  }
1031
1.41k
  switch (BYTE_TYPE(enc, ptr)) {
1032
0
  case BT_QUOT:
1033
0
    return PREFIX(scanLit)(BT_QUOT, enc, ptr + MINBPC(enc), end, nextTokPtr);
1034
0
  case BT_APOS:
1035
0
    return PREFIX(scanLit)(BT_APOS, enc, ptr + MINBPC(enc), end, nextTokPtr);
1036
778
  case BT_LT: {
1037
778
    ptr += MINBPC(enc);
1038
778
    REQUIRE_CHAR(enc, ptr, end);
1039
778
    switch (BYTE_TYPE(enc, ptr)) {
1040
0
    case BT_EXCL:
1041
0
      return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1042
320
    case BT_QUEST:
1043
320
      return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1044
118
    case BT_NMSTRT:
1045
458
    case BT_HEX:
1046
458
    case BT_NONASCII:
1047
458
    case BT_LEAD2:
1048
458
    case BT_LEAD3:
1049
458
    case BT_LEAD4:
1050
458
      *nextTokPtr = ptr - MINBPC(enc);
1051
458
      return XML_TOK_INSTANCE_START;
1052
778
    }
1053
0
    *nextTokPtr = ptr;
1054
0
    return XML_TOK_INVALID;
1055
778
  }
1056
611
  case BT_CR:
1057
611
    if (ptr + MINBPC(enc) == end) {
1058
0
      *nextTokPtr = end;
1059
      /* indicate that this might be part of a CR/LF pair */
1060
0
      return -XML_TOK_PROLOG_S;
1061
0
    }
1062
    /* fall through */
1063
611
  case BT_S:
1064
630
  case BT_LF:
1065
1.24k
    for (;;) {
1066
1.24k
      ptr += MINBPC(enc);
1067
1.24k
      if (! HAS_CHAR(enc, ptr, end))
1068
319
        break;
1069
922
      switch (BYTE_TYPE(enc, ptr)) {
1070
0
      case BT_S:
1071
611
      case BT_LF:
1072
611
        break;
1073
0
      case BT_CR:
1074
        /* don't split CR/LF pair */
1075
0
        if (ptr + MINBPC(enc) != end)
1076
0
          break;
1077
        /* fall through */
1078
311
      default:
1079
311
        *nextTokPtr = ptr;
1080
311
        return XML_TOK_PROLOG_S;
1081
922
      }
1082
922
    }
1083
319
    *nextTokPtr = ptr;
1084
319
    return XML_TOK_PROLOG_S;
1085
0
  case BT_PERCNT:
1086
0
    return PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1087
0
  case BT_COMMA:
1088
0
    *nextTokPtr = ptr + MINBPC(enc);
1089
0
    return XML_TOK_COMMA;
1090
0
  case BT_LSQB:
1091
0
    *nextTokPtr = ptr + MINBPC(enc);
1092
0
    return XML_TOK_OPEN_BRACKET;
1093
0
  case BT_RSQB:
1094
0
    ptr += MINBPC(enc);
1095
0
    if (! HAS_CHAR(enc, ptr, end))
1096
0
      return -XML_TOK_CLOSE_BRACKET;
1097
0
    if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) {
1098
0
      REQUIRE_CHARS(enc, ptr, end, 2);
1099
0
      if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_GT)) {
1100
0
        *nextTokPtr = ptr + 2 * MINBPC(enc);
1101
0
        return XML_TOK_COND_SECT_CLOSE;
1102
0
      }
1103
0
    }
1104
0
    *nextTokPtr = ptr;
1105
0
    return XML_TOK_CLOSE_BRACKET;
1106
0
  case BT_LPAR:
1107
0
    *nextTokPtr = ptr + MINBPC(enc);
1108
0
    return XML_TOK_OPEN_PAREN;
1109
0
  case BT_RPAR:
1110
0
    ptr += MINBPC(enc);
1111
0
    if (! HAS_CHAR(enc, ptr, end))
1112
0
      return -XML_TOK_CLOSE_PAREN;
1113
0
    switch (BYTE_TYPE(enc, ptr)) {
1114
0
    case BT_AST:
1115
0
      *nextTokPtr = ptr + MINBPC(enc);
1116
0
      return XML_TOK_CLOSE_PAREN_ASTERISK;
1117
0
    case BT_QUEST:
1118
0
      *nextTokPtr = ptr + MINBPC(enc);
1119
0
      return XML_TOK_CLOSE_PAREN_QUESTION;
1120
0
    case BT_PLUS:
1121
0
      *nextTokPtr = ptr + MINBPC(enc);
1122
0
      return XML_TOK_CLOSE_PAREN_PLUS;
1123
0
    case BT_CR:
1124
0
    case BT_LF:
1125
0
    case BT_S:
1126
0
    case BT_GT:
1127
0
    case BT_COMMA:
1128
0
    case BT_VERBAR:
1129
0
    case BT_RPAR:
1130
0
      *nextTokPtr = ptr;
1131
0
      return XML_TOK_CLOSE_PAREN;
1132
0
    }
1133
0
    *nextTokPtr = ptr;
1134
0
    return XML_TOK_INVALID;
1135
0
  case BT_VERBAR:
1136
0
    *nextTokPtr = ptr + MINBPC(enc);
1137
0
    return XML_TOK_OR;
1138
0
  case BT_GT:
1139
0
    *nextTokPtr = ptr + MINBPC(enc);
1140
0
    return XML_TOK_DECL_CLOSE;
1141
0
  case BT_NUM:
1142
0
    return PREFIX(scanPoundName)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1143
0
#  define LEAD_CASE(n)                                                         \
1144
0
  case BT_LEAD##n:                                                             \
1145
0
    if (end - ptr < n)                                                         \
1146
0
      return XML_TOK_PARTIAL_CHAR;                                             \
1147
0
    if (IS_INVALID_CHAR(enc, ptr, n)) {                                        \
1148
0
      *nextTokPtr = ptr;                                                       \
1149
0
      return XML_TOK_INVALID;                                                  \
1150
0
    }                                                                          \
1151
0
    if (IS_NMSTRT_CHAR(enc, ptr, n)) {                                         \
1152
0
      ptr += n;                                                                \
1153
0
      tok = XML_TOK_NAME;                                                      \
1154
0
      break;                                                                   \
1155
0
    }                                                                          \
1156
0
    if (IS_NAME_CHAR(enc, ptr, n)) {                                           \
1157
0
      ptr += n;                                                                \
1158
0
      tok = XML_TOK_NMTOKEN;                                                   \
1159
0
      break;                                                                   \
1160
0
    }                                                                          \
1161
0
    *nextTokPtr = ptr;                                                         \
1162
0
    return XML_TOK_INVALID;
1163
0
    LEAD_CASE(2)
1164
0
    LEAD_CASE(3)
1165
0
    LEAD_CASE(4)
1166
0
#  undef LEAD_CASE
1167
0
  case BT_NMSTRT:
1168
0
  case BT_HEX:
1169
0
    tok = XML_TOK_NAME;
1170
0
    ptr += MINBPC(enc);
1171
0
    break;
1172
0
  case BT_DIGIT:
1173
0
  case BT_NAME:
1174
0
  case BT_MINUS:
1175
0
#  ifdef XML_NS
1176
0
  case BT_COLON:
1177
0
#  endif
1178
0
    tok = XML_TOK_NMTOKEN;
1179
0
    ptr += MINBPC(enc);
1180
0
    break;
1181
0
  case BT_NONASCII:
1182
0
    if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {
1183
0
      ptr += MINBPC(enc);
1184
0
      tok = XML_TOK_NAME;
1185
0
      break;
1186
0
    }
1187
0
    if (IS_NAME_CHAR_MINBPC(enc, ptr)) {
1188
0
      ptr += MINBPC(enc);
1189
0
      tok = XML_TOK_NMTOKEN;
1190
0
      break;
1191
0
    }
1192
    /* fall through */
1193
5
  default:
1194
5
    *nextTokPtr = ptr;
1195
5
    return XML_TOK_INVALID;
1196
1.41k
  }
1197
0
  while (HAS_CHAR(enc, ptr, end)) {
1198
0
    switch (BYTE_TYPE(enc, ptr)) {
1199
0
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1200
0
    case BT_GT:
1201
0
    case BT_RPAR:
1202
0
    case BT_COMMA:
1203
0
    case BT_VERBAR:
1204
0
    case BT_LSQB:
1205
0
    case BT_PERCNT:
1206
0
    case BT_S:
1207
0
    case BT_CR:
1208
0
    case BT_LF:
1209
0
      *nextTokPtr = ptr;
1210
0
      return tok;
1211
0
#  ifdef XML_NS
1212
0
    case BT_COLON:
1213
0
      ptr += MINBPC(enc);
1214
0
      switch (tok) {
1215
0
      case XML_TOK_NAME:
1216
0
        REQUIRE_CHAR(enc, ptr, end);
1217
0
        tok = XML_TOK_PREFIXED_NAME;
1218
0
        switch (BYTE_TYPE(enc, ptr)) {
1219
0
          CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1220
0
        default:
1221
0
          tok = XML_TOK_NMTOKEN;
1222
0
          break;
1223
0
        }
1224
0
        break;
1225
0
      case XML_TOK_PREFIXED_NAME:
1226
0
        tok = XML_TOK_NMTOKEN;
1227
0
        break;
1228
0
      }
1229
0
      break;
1230
0
#  endif
1231
0
    case BT_PLUS:
1232
0
      if (tok == XML_TOK_NMTOKEN) {
1233
0
        *nextTokPtr = ptr;
1234
0
        return XML_TOK_INVALID;
1235
0
      }
1236
0
      *nextTokPtr = ptr + MINBPC(enc);
1237
0
      return XML_TOK_NAME_PLUS;
1238
0
    case BT_AST:
1239
0
      if (tok == XML_TOK_NMTOKEN) {
1240
0
        *nextTokPtr = ptr;
1241
0
        return XML_TOK_INVALID;
1242
0
      }
1243
0
      *nextTokPtr = ptr + MINBPC(enc);
1244
0
      return XML_TOK_NAME_ASTERISK;
1245
0
    case BT_QUEST:
1246
0
      if (tok == XML_TOK_NMTOKEN) {
1247
0
        *nextTokPtr = ptr;
1248
0
        return XML_TOK_INVALID;
1249
0
      }
1250
0
      *nextTokPtr = ptr + MINBPC(enc);
1251
0
      return XML_TOK_NAME_QUESTION;
1252
0
    default:
1253
0
      *nextTokPtr = ptr;
1254
0
      return XML_TOK_INVALID;
1255
0
    }
1256
0
  }
1257
0
  return -tok;
1258
0
}
Unexecuted instantiation: xmltok.c:little2_prologTok
Unexecuted instantiation: xmltok.c:big2_prologTok
1259
1260
static int PTRCALL
1261
PREFIX(attributeValueTok)(const ENCODING *enc, const char *ptr, const char *end,
1262
861k
                          const char **nextTokPtr) {
1263
861k
  const char *start;
1264
861k
  if (ptr >= end)
1265
4.56k
    return XML_TOK_NONE;
1266
856k
  else if (! HAS_CHAR(enc, ptr, end)) {
1267
    /* This line cannot be executed.  The incoming data has already
1268
     * been tokenized once, so incomplete characters like this have
1269
     * already been eliminated from the input.  Retaining the paranoia
1270
     * check is still valuable, however.
1271
     */
1272
0
    return XML_TOK_PARTIAL; /* LCOV_EXCL_LINE */
1273
0
  }
1274
856k
  start = ptr;
1275
5.86M
  while (HAS_CHAR(enc, ptr, end)) {
1276
5.86M
    switch (BYTE_TYPE(enc, ptr)) {
1277
0
#  define LEAD_CASE(n)                                                         \
1278
0
  case BT_LEAD##n:                                                             \
1279
0
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1280
0
    break;
1281
0
      LEAD_CASE(2)
1282
0
      LEAD_CASE(3)
1283
0
      LEAD_CASE(4)
1284
0
#  undef LEAD_CASE
1285
0
    case BT_AMP:
1286
0
      if (ptr == start)
1287
0
        return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1288
0
      *nextTokPtr = ptr;
1289
0
      return XML_TOK_DATA_CHARS;
1290
0
    case BT_LT:
1291
      /* this is for inside entity references */
1292
0
      *nextTokPtr = ptr;
1293
0
      return XML_TOK_INVALID;
1294
44.4k
    case BT_LF:
1295
44.4k
      if (ptr == start) {
1296
22.2k
        *nextTokPtr = ptr + MINBPC(enc);
1297
22.2k
        return XML_TOK_DATA_NEWLINE;
1298
22.2k
      }
1299
22.1k
      *nextTokPtr = ptr;
1300
22.1k
      return XML_TOK_DATA_CHARS;
1301
0
    case BT_CR:
1302
0
      if (ptr == start) {
1303
0
        ptr += MINBPC(enc);
1304
0
        if (! HAS_CHAR(enc, ptr, end))
1305
0
          return XML_TOK_TRAILING_CR;
1306
0
        if (BYTE_TYPE(enc, ptr) == BT_LF)
1307
0
          ptr += MINBPC(enc);
1308
0
        *nextTokPtr = ptr;
1309
0
        return XML_TOK_DATA_NEWLINE;
1310
0
      }
1311
0
      *nextTokPtr = ptr;
1312
0
      return XML_TOK_DATA_CHARS;
1313
808k
    case BT_S:
1314
808k
      if (ptr == start) {
1315
428k
        *nextTokPtr = ptr + MINBPC(enc);
1316
428k
        return XML_TOK_ATTRIBUTE_VALUE_S;
1317
428k
      }
1318
379k
      *nextTokPtr = ptr;
1319
379k
      return XML_TOK_DATA_CHARS;
1320
5.01M
    default:
1321
5.01M
      ptr += MINBPC(enc);
1322
5.01M
      break;
1323
5.86M
    }
1324
5.86M
  }
1325
4.39k
  *nextTokPtr = ptr;
1326
4.39k
  return XML_TOK_DATA_CHARS;
1327
856k
}
xmltok.c:normal_attributeValueTok
Line
Count
Source
1262
861k
                          const char **nextTokPtr) {
1263
861k
  const char *start;
1264
861k
  if (ptr >= end)
1265
4.56k
    return XML_TOK_NONE;
1266
856k
  else if (! HAS_CHAR(enc, ptr, end)) {
1267
    /* This line cannot be executed.  The incoming data has already
1268
     * been tokenized once, so incomplete characters like this have
1269
     * already been eliminated from the input.  Retaining the paranoia
1270
     * check is still valuable, however.
1271
     */
1272
0
    return XML_TOK_PARTIAL; /* LCOV_EXCL_LINE */
1273
0
  }
1274
856k
  start = ptr;
1275
5.86M
  while (HAS_CHAR(enc, ptr, end)) {
1276
5.86M
    switch (BYTE_TYPE(enc, ptr)) {
1277
0
#  define LEAD_CASE(n)                                                         \
1278
0
  case BT_LEAD##n:                                                             \
1279
0
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1280
0
    break;
1281
0
      LEAD_CASE(2)
1282
0
      LEAD_CASE(3)
1283
0
      LEAD_CASE(4)
1284
0
#  undef LEAD_CASE
1285
0
    case BT_AMP:
1286
0
      if (ptr == start)
1287
0
        return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1288
0
      *nextTokPtr = ptr;
1289
0
      return XML_TOK_DATA_CHARS;
1290
0
    case BT_LT:
1291
      /* this is for inside entity references */
1292
0
      *nextTokPtr = ptr;
1293
0
      return XML_TOK_INVALID;
1294
44.4k
    case BT_LF:
1295
44.4k
      if (ptr == start) {
1296
22.2k
        *nextTokPtr = ptr + MINBPC(enc);
1297
22.2k
        return XML_TOK_DATA_NEWLINE;
1298
22.2k
      }
1299
22.1k
      *nextTokPtr = ptr;
1300
22.1k
      return XML_TOK_DATA_CHARS;
1301
0
    case BT_CR:
1302
0
      if (ptr == start) {
1303
0
        ptr += MINBPC(enc);
1304
0
        if (! HAS_CHAR(enc, ptr, end))
1305
0
          return XML_TOK_TRAILING_CR;
1306
0
        if (BYTE_TYPE(enc, ptr) == BT_LF)
1307
0
          ptr += MINBPC(enc);
1308
0
        *nextTokPtr = ptr;
1309
0
        return XML_TOK_DATA_NEWLINE;
1310
0
      }
1311
0
      *nextTokPtr = ptr;
1312
0
      return XML_TOK_DATA_CHARS;
1313
808k
    case BT_S:
1314
808k
      if (ptr == start) {
1315
428k
        *nextTokPtr = ptr + MINBPC(enc);
1316
428k
        return XML_TOK_ATTRIBUTE_VALUE_S;
1317
428k
      }
1318
379k
      *nextTokPtr = ptr;
1319
379k
      return XML_TOK_DATA_CHARS;
1320
5.01M
    default:
1321
5.01M
      ptr += MINBPC(enc);
1322
5.01M
      break;
1323
5.86M
    }
1324
5.86M
  }
1325
4.39k
  *nextTokPtr = ptr;
1326
4.39k
  return XML_TOK_DATA_CHARS;
1327
856k
}
Unexecuted instantiation: xmltok.c:little2_attributeValueTok
Unexecuted instantiation: xmltok.c:big2_attributeValueTok
1328
1329
static int PTRCALL
1330
PREFIX(entityValueTok)(const ENCODING *enc, const char *ptr, const char *end,
1331
0
                       const char **nextTokPtr) {
1332
0
  const char *start;
1333
0
  if (ptr >= end)
1334
0
    return XML_TOK_NONE;
1335
0
  else if (! HAS_CHAR(enc, ptr, end)) {
1336
    /* This line cannot be executed.  The incoming data has already
1337
     * been tokenized once, so incomplete characters like this have
1338
     * already been eliminated from the input.  Retaining the paranoia
1339
     * check is still valuable, however.
1340
     */
1341
0
    return XML_TOK_PARTIAL; /* LCOV_EXCL_LINE */
1342
0
  }
1343
0
  start = ptr;
1344
0
  while (HAS_CHAR(enc, ptr, end)) {
1345
0
    switch (BYTE_TYPE(enc, ptr)) {
1346
0
#  define LEAD_CASE(n)                                                         \
1347
0
  case BT_LEAD##n:                                                             \
1348
0
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1349
0
    break;
1350
0
      LEAD_CASE(2)
1351
0
      LEAD_CASE(3)
1352
0
      LEAD_CASE(4)
1353
0
#  undef LEAD_CASE
1354
0
    case BT_AMP:
1355
0
      if (ptr == start)
1356
0
        return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1357
0
      *nextTokPtr = ptr;
1358
0
      return XML_TOK_DATA_CHARS;
1359
0
    case BT_PERCNT:
1360
0
      if (ptr == start) {
1361
0
        int tok = PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1362
0
        return (tok == XML_TOK_PERCENT) ? XML_TOK_INVALID : tok;
1363
0
      }
1364
0
      *nextTokPtr = ptr;
1365
0
      return XML_TOK_DATA_CHARS;
1366
0
    case BT_LF:
1367
0
      if (ptr == start) {
1368
0
        *nextTokPtr = ptr + MINBPC(enc);
1369
0
        return XML_TOK_DATA_NEWLINE;
1370
0
      }
1371
0
      *nextTokPtr = ptr;
1372
0
      return XML_TOK_DATA_CHARS;
1373
0
    case BT_CR:
1374
0
      if (ptr == start) {
1375
0
        ptr += MINBPC(enc);
1376
0
        if (! HAS_CHAR(enc, ptr, end))
1377
0
          return XML_TOK_TRAILING_CR;
1378
0
        if (BYTE_TYPE(enc, ptr) == BT_LF)
1379
0
          ptr += MINBPC(enc);
1380
0
        *nextTokPtr = ptr;
1381
0
        return XML_TOK_DATA_NEWLINE;
1382
0
      }
1383
0
      *nextTokPtr = ptr;
1384
0
      return XML_TOK_DATA_CHARS;
1385
0
    default:
1386
0
      ptr += MINBPC(enc);
1387
0
      break;
1388
0
    }
1389
0
  }
1390
0
  *nextTokPtr = ptr;
1391
0
  return XML_TOK_DATA_CHARS;
1392
0
}
Unexecuted instantiation: xmltok.c:normal_entityValueTok
Unexecuted instantiation: xmltok.c:little2_entityValueTok
Unexecuted instantiation: xmltok.c:big2_entityValueTok
1393
1394
#  ifdef XML_DTD
1395
1396
static int PTRCALL
1397
PREFIX(ignoreSectionTok)(const ENCODING *enc, const char *ptr, const char *end,
1398
0
                         const char **nextTokPtr) {
1399
0
  int level = 0;
1400
0
  if (MINBPC(enc) > 1) {
1401
0
    size_t n = end - ptr;
1402
0
    if (n & (MINBPC(enc) - 1)) {
1403
0
      n &= ~(MINBPC(enc) - 1);
1404
0
      end = ptr + n;
1405
0
    }
1406
0
  }
1407
0
  while (HAS_CHAR(enc, ptr, end)) {
1408
0
    switch (BYTE_TYPE(enc, ptr)) {
1409
0
      INVALID_CASES(ptr, nextTokPtr)
1410
0
    case BT_LT:
1411
0
      ptr += MINBPC(enc);
1412
0
      REQUIRE_CHAR(enc, ptr, end);
1413
0
      if (CHAR_MATCHES(enc, ptr, ASCII_EXCL)) {
1414
0
        ptr += MINBPC(enc);
1415
0
        REQUIRE_CHAR(enc, ptr, end);
1416
0
        if (CHAR_MATCHES(enc, ptr, ASCII_LSQB)) {
1417
0
          ++level;
1418
0
          ptr += MINBPC(enc);
1419
0
        }
1420
0
      }
1421
0
      break;
1422
0
    case BT_RSQB:
1423
0
      ptr += MINBPC(enc);
1424
0
      REQUIRE_CHAR(enc, ptr, end);
1425
0
      if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) {
1426
0
        ptr += MINBPC(enc);
1427
0
        REQUIRE_CHAR(enc, ptr, end);
1428
0
        if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
1429
0
          ptr += MINBPC(enc);
1430
0
          if (level == 0) {
1431
0
            *nextTokPtr = ptr;
1432
0
            return XML_TOK_IGNORE_SECT;
1433
0
          }
1434
0
          --level;
1435
0
        }
1436
0
      }
1437
0
      break;
1438
0
    default:
1439
0
      ptr += MINBPC(enc);
1440
0
      break;
1441
0
    }
1442
0
  }
1443
0
  return XML_TOK_PARTIAL;
1444
0
}
Unexecuted instantiation: xmltok.c:normal_ignoreSectionTok
Unexecuted instantiation: xmltok.c:little2_ignoreSectionTok
Unexecuted instantiation: xmltok.c:big2_ignoreSectionTok
1445
1446
#  endif /* XML_DTD */
1447
1448
static int PTRCALL
1449
PREFIX(isPublicId)(const ENCODING *enc, const char *ptr, const char *end,
1450
0
                   const char **badPtr) {
1451
0
  ptr += MINBPC(enc);
1452
0
  end -= MINBPC(enc);
1453
0
  for (; HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
1454
0
    switch (BYTE_TYPE(enc, ptr)) {
1455
0
    case BT_DIGIT:
1456
0
    case BT_HEX:
1457
0
    case BT_MINUS:
1458
0
    case BT_APOS:
1459
0
    case BT_LPAR:
1460
0
    case BT_RPAR:
1461
0
    case BT_PLUS:
1462
0
    case BT_COMMA:
1463
0
    case BT_SOL:
1464
0
    case BT_EQUALS:
1465
0
    case BT_QUEST:
1466
0
    case BT_CR:
1467
0
    case BT_LF:
1468
0
    case BT_SEMI:
1469
0
    case BT_EXCL:
1470
0
    case BT_AST:
1471
0
    case BT_PERCNT:
1472
0
    case BT_NUM:
1473
0
#  ifdef XML_NS
1474
0
    case BT_COLON:
1475
0
#  endif
1476
0
      break;
1477
0
    case BT_S:
1478
0
      if (CHAR_MATCHES(enc, ptr, ASCII_TAB)) {
1479
0
        *badPtr = ptr;
1480
0
        return 0;
1481
0
      }
1482
0
      break;
1483
0
    case BT_NAME:
1484
0
    case BT_NMSTRT:
1485
0
      if (! (BYTE_TO_ASCII(enc, ptr) & ~0x7f))
1486
0
        break;
1487
      /* fall through */
1488
0
    default:
1489
0
      switch (BYTE_TO_ASCII(enc, ptr)) {
1490
0
      case 0x24: /* $ */
1491
0
      case 0x40: /* @ */
1492
0
        break;
1493
0
      default:
1494
0
        *badPtr = ptr;
1495
0
        return 0;
1496
0
      }
1497
0
      break;
1498
0
    }
1499
0
  }
1500
0
  return 1;
1501
0
}
Unexecuted instantiation: xmltok.c:normal_isPublicId
Unexecuted instantiation: xmltok.c:little2_isPublicId
Unexecuted instantiation: xmltok.c:big2_isPublicId
1502
1503
/* This must only be called for a well-formed start-tag or empty
1504
   element tag.  Returns the number of attributes.  Pointers to the
1505
   first attsMax attributes are stored in atts.
1506
*/
1507
1508
static int PTRCALL
1509
PREFIX(getAtts)(const ENCODING *enc, const char *ptr, int attsMax,
1510
40.3k
                ATTRIBUTE *atts) {
1511
40.3k
  enum { other, inName, inValue } state = inName;
1512
40.3k
  int nAtts = 0;
1513
40.3k
  int open = 0; /* defined when state == inValue;
1514
                   initialization just to shut up compilers */
1515
1516
9.46M
  for (ptr += MINBPC(enc);; ptr += MINBPC(enc)) {
1517
9.46M
    switch (BYTE_TYPE(enc, ptr)) {
1518
0
#  define START_NAME                                                           \
1519
1.01M
    if (state == other) {                                                      \
1520
85.4k
      if (nAtts < attsMax) {                                                   \
1521
85.4k
        atts[nAtts].name = ptr;                                                \
1522
85.4k
        atts[nAtts].normalized = 1;                                            \
1523
85.4k
      }                                                                        \
1524
85.4k
      state = inName;                                                          \
1525
85.4k
    }
1526
0
#  define LEAD_CASE(n)                                                         \
1527
1.38k
  case BT_LEAD##n: /* NOTE: The encoding has already been validated. */        \
1528
1.38k
    START_NAME ptr += (n - MINBPC(enc));                                       \
1529
1.38k
    break;
1530
0
      LEAD_CASE(2)
1531
1.38k
      LEAD_CASE(3)
1532
0
      LEAD_CASE(4)
1533
0
#  undef LEAD_CASE
1534
0
    case BT_NONASCII:
1535
531k
    case BT_NMSTRT:
1536
1.01M
    case BT_HEX:
1537
1.01M
      START_NAME
1538
1.01M
      break;
1539
0
#  undef START_NAME
1540
170k
    case BT_QUOT:
1541
170k
      if (state != inValue) {
1542
85.4k
        if (nAtts < attsMax)
1543
85.4k
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1544
85.4k
        state = inValue;
1545
85.4k
        open = BT_QUOT;
1546
85.4k
      } else if (open == BT_QUOT) {
1547
85.4k
        state = other;
1548
85.4k
        if (nAtts < attsMax)
1549
85.4k
          atts[nAtts].valueEnd = ptr;
1550
85.4k
        nAtts++;
1551
85.4k
      }
1552
170k
      break;
1553
0
    case BT_APOS:
1554
0
      if (state != inValue) {
1555
0
        if (nAtts < attsMax)
1556
0
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1557
0
        state = inValue;
1558
0
        open = BT_APOS;
1559
0
      } else if (open == BT_APOS) {
1560
0
        state = other;
1561
0
        if (nAtts < attsMax)
1562
0
          atts[nAtts].valueEnd = ptr;
1563
0
        nAtts++;
1564
0
      }
1565
0
      break;
1566
0
    case BT_AMP:
1567
0
      if (nAtts < attsMax)
1568
0
        atts[nAtts].normalized = 0;
1569
0
      break;
1570
816k
    case BT_S:
1571
816k
      if (state == inName)
1572
40.2k
        state = other;
1573
776k
      else if (state == inValue && nAtts < attsMax && atts[nAtts].normalized
1574
310k
               && (ptr == atts[nAtts].valuePtr
1575
310k
                   || BYTE_TO_ASCII(enc, ptr) != ASCII_SPACE
1576
308k
                   || BYTE_TO_ASCII(enc, ptr + MINBPC(enc)) == ASCII_SPACE
1577
308k
                   || BYTE_TYPE(enc, ptr + MINBPC(enc)) == open))
1578
2.03k
        atts[nAtts].normalized = 0;
1579
816k
      break;
1580
0
    case BT_CR:
1581
22.2k
    case BT_LF:
1582
      /* This case ensures that the first attribute name is counted
1583
         Apart from that we could just change state on the quote. */
1584
22.2k
      if (state == inName)
1585
0
        state = other;
1586
22.2k
      else if (state == inValue && nAtts < attsMax)
1587
22.2k
        atts[nAtts].normalized = 0;
1588
22.2k
      break;
1589
736
    case BT_GT:
1590
46.8k
    case BT_SOL:
1591
46.8k
      if (state != inValue)
1592
40.3k
        return nAtts;
1593
6.51k
      break;
1594
7.39M
    default:
1595
7.39M
      break;
1596
9.46M
    }
1597
9.46M
  }
1598
  /* not reached */
1599
40.3k
}
xmltok.c:normal_getAtts
Line
Count
Source
1510
40.3k
                ATTRIBUTE *atts) {
1511
40.3k
  enum { other, inName, inValue } state = inName;
1512
40.3k
  int nAtts = 0;
1513
40.3k
  int open = 0; /* defined when state == inValue;
1514
                   initialization just to shut up compilers */
1515
1516
9.46M
  for (ptr += MINBPC(enc);; ptr += MINBPC(enc)) {
1517
9.46M
    switch (BYTE_TYPE(enc, ptr)) {
1518
0
#  define START_NAME                                                           \
1519
0
    if (state == other) {                                                      \
1520
0
      if (nAtts < attsMax) {                                                   \
1521
0
        atts[nAtts].name = ptr;                                                \
1522
0
        atts[nAtts].normalized = 1;                                            \
1523
0
      }                                                                        \
1524
0
      state = inName;                                                          \
1525
0
    }
1526
0
#  define LEAD_CASE(n)                                                         \
1527
0
  case BT_LEAD##n: /* NOTE: The encoding has already been validated. */        \
1528
0
    START_NAME ptr += (n - MINBPC(enc));                                       \
1529
0
    break;
1530
0
      LEAD_CASE(2)
1531
1.38k
      LEAD_CASE(3)
1532
0
      LEAD_CASE(4)
1533
0
#  undef LEAD_CASE
1534
0
    case BT_NONASCII:
1535
531k
    case BT_NMSTRT:
1536
1.01M
    case BT_HEX:
1537
1.01M
      START_NAME
1538
1.01M
      break;
1539
0
#  undef START_NAME
1540
170k
    case BT_QUOT:
1541
170k
      if (state != inValue) {
1542
85.4k
        if (nAtts < attsMax)
1543
85.4k
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1544
85.4k
        state = inValue;
1545
85.4k
        open = BT_QUOT;
1546
85.4k
      } else if (open == BT_QUOT) {
1547
85.4k
        state = other;
1548
85.4k
        if (nAtts < attsMax)
1549
85.4k
          atts[nAtts].valueEnd = ptr;
1550
85.4k
        nAtts++;
1551
85.4k
      }
1552
170k
      break;
1553
0
    case BT_APOS:
1554
0
      if (state != inValue) {
1555
0
        if (nAtts < attsMax)
1556
0
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1557
0
        state = inValue;
1558
0
        open = BT_APOS;
1559
0
      } else if (open == BT_APOS) {
1560
0
        state = other;
1561
0
        if (nAtts < attsMax)
1562
0
          atts[nAtts].valueEnd = ptr;
1563
0
        nAtts++;
1564
0
      }
1565
0
      break;
1566
0
    case BT_AMP:
1567
0
      if (nAtts < attsMax)
1568
0
        atts[nAtts].normalized = 0;
1569
0
      break;
1570
816k
    case BT_S:
1571
816k
      if (state == inName)
1572
40.2k
        state = other;
1573
776k
      else if (state == inValue && nAtts < attsMax && atts[nAtts].normalized
1574
310k
               && (ptr == atts[nAtts].valuePtr
1575
310k
                   || BYTE_TO_ASCII(enc, ptr) != ASCII_SPACE
1576
308k
                   || BYTE_TO_ASCII(enc, ptr + MINBPC(enc)) == ASCII_SPACE
1577
308k
                   || BYTE_TYPE(enc, ptr + MINBPC(enc)) == open))
1578
2.03k
        atts[nAtts].normalized = 0;
1579
816k
      break;
1580
0
    case BT_CR:
1581
22.2k
    case BT_LF:
1582
      /* This case ensures that the first attribute name is counted
1583
         Apart from that we could just change state on the quote. */
1584
22.2k
      if (state == inName)
1585
0
        state = other;
1586
22.2k
      else if (state == inValue && nAtts < attsMax)
1587
22.2k
        atts[nAtts].normalized = 0;
1588
22.2k
      break;
1589
736
    case BT_GT:
1590
46.8k
    case BT_SOL:
1591
46.8k
      if (state != inValue)
1592
40.3k
        return nAtts;
1593
6.51k
      break;
1594
7.39M
    default:
1595
7.39M
      break;
1596
9.46M
    }
1597
9.46M
  }
1598
  /* not reached */
1599
40.3k
}
Unexecuted instantiation: xmltok.c:little2_getAtts
Unexecuted instantiation: xmltok.c:big2_getAtts
1600
1601
static int PTRFASTCALL
1602
0
PREFIX(charRefNumber)(const ENCODING *enc, const char *ptr) {
1603
0
  int result = 0;
1604
  /* skip &# */
1605
0
  UNUSED_P(enc);
1606
0
  ptr += 2 * MINBPC(enc);
1607
0
  if (CHAR_MATCHES(enc, ptr, ASCII_x)) {
1608
0
    for (ptr += MINBPC(enc); ! CHAR_MATCHES(enc, ptr, ASCII_SEMI);
1609
0
         ptr += MINBPC(enc)) {
1610
0
      int c = BYTE_TO_ASCII(enc, ptr);
1611
0
      switch (c) {
1612
0
      case ASCII_0:
1613
0
      case ASCII_1:
1614
0
      case ASCII_2:
1615
0
      case ASCII_3:
1616
0
      case ASCII_4:
1617
0
      case ASCII_5:
1618
0
      case ASCII_6:
1619
0
      case ASCII_7:
1620
0
      case ASCII_8:
1621
0
      case ASCII_9:
1622
0
        result <<= 4;
1623
0
        result |= (c - ASCII_0);
1624
0
        break;
1625
0
      case ASCII_A:
1626
0
      case ASCII_B:
1627
0
      case ASCII_C:
1628
0
      case ASCII_D:
1629
0
      case ASCII_E:
1630
0
      case ASCII_F:
1631
0
        result <<= 4;
1632
0
        result += 10 + (c - ASCII_A);
1633
0
        break;
1634
0
      case ASCII_a:
1635
0
      case ASCII_b:
1636
0
      case ASCII_c:
1637
0
      case ASCII_d:
1638
0
      case ASCII_e:
1639
0
      case ASCII_f:
1640
0
        result <<= 4;
1641
0
        result += 10 + (c - ASCII_a);
1642
0
        break;
1643
0
      }
1644
0
      if (result >= 0x110000)
1645
0
        return -1;
1646
0
    }
1647
0
  } else {
1648
0
    for (; ! CHAR_MATCHES(enc, ptr, ASCII_SEMI); ptr += MINBPC(enc)) {
1649
0
      int c = BYTE_TO_ASCII(enc, ptr);
1650
0
      result *= 10;
1651
0
      result += (c - ASCII_0);
1652
0
      if (result >= 0x110000)
1653
0
        return -1;
1654
0
    }
1655
0
  }
1656
0
  return checkCharRefNumber(result);
1657
0
}
Unexecuted instantiation: xmltok.c:normal_charRefNumber
Unexecuted instantiation: xmltok.c:little2_charRefNumber
Unexecuted instantiation: xmltok.c:big2_charRefNumber
1658
1659
static int PTRCALL
1660
PREFIX(predefinedEntityName)(const ENCODING *enc, const char *ptr,
1661
0
                             const char *end) {
1662
0
  UNUSED_P(enc);
1663
0
  switch ((end - ptr) / MINBPC(enc)) {
1664
0
  case 2:
1665
0
    if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_t)) {
1666
0
      switch (BYTE_TO_ASCII(enc, ptr)) {
1667
0
      case ASCII_l:
1668
0
        return ASCII_LT;
1669
0
      case ASCII_g:
1670
0
        return ASCII_GT;
1671
0
      }
1672
0
    }
1673
0
    break;
1674
0
  case 3:
1675
0
    if (CHAR_MATCHES(enc, ptr, ASCII_a)) {
1676
0
      ptr += MINBPC(enc);
1677
0
      if (CHAR_MATCHES(enc, ptr, ASCII_m)) {
1678
0
        ptr += MINBPC(enc);
1679
0
        if (CHAR_MATCHES(enc, ptr, ASCII_p))
1680
0
          return ASCII_AMP;
1681
0
      }
1682
0
    }
1683
0
    break;
1684
0
  case 4:
1685
0
    switch (BYTE_TO_ASCII(enc, ptr)) {
1686
0
    case ASCII_q:
1687
0
      ptr += MINBPC(enc);
1688
0
      if (CHAR_MATCHES(enc, ptr, ASCII_u)) {
1689
0
        ptr += MINBPC(enc);
1690
0
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1691
0
          ptr += MINBPC(enc);
1692
0
          if (CHAR_MATCHES(enc, ptr, ASCII_t))
1693
0
            return ASCII_QUOT;
1694
0
        }
1695
0
      }
1696
0
      break;
1697
0
    case ASCII_a:
1698
0
      ptr += MINBPC(enc);
1699
0
      if (CHAR_MATCHES(enc, ptr, ASCII_p)) {
1700
0
        ptr += MINBPC(enc);
1701
0
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1702
0
          ptr += MINBPC(enc);
1703
0
          if (CHAR_MATCHES(enc, ptr, ASCII_s))
1704
0
            return ASCII_APOS;
1705
0
        }
1706
0
      }
1707
0
      break;
1708
0
    }
1709
0
  }
1710
0
  return 0;
1711
0
}
Unexecuted instantiation: xmltok.c:normal_predefinedEntityName
Unexecuted instantiation: xmltok.c:little2_predefinedEntityName
Unexecuted instantiation: xmltok.c:big2_predefinedEntityName
1712
1713
static int PTRCALL
1714
PREFIX(nameMatchesAscii)(const ENCODING *enc, const char *ptr1,
1715
640
                         const char *end1, const char *ptr2) {
1716
640
  UNUSED_P(enc);
1717
5.44k
  for (; *ptr2; ptr1 += MINBPC(enc), ptr2++) {
1718
4.80k
    if (end1 - ptr1 < MINBPC(enc)) {
1719
      /* This line cannot be executed.  The incoming data has already
1720
       * been tokenized once, so incomplete characters like this have
1721
       * already been eliminated from the input.  Retaining the
1722
       * paranoia check is still valuable, however.
1723
       */
1724
0
      return 0; /* LCOV_EXCL_LINE */
1725
0
    }
1726
4.80k
    if (! CHAR_MATCHES(enc, ptr1, *ptr2))
1727
0
      return 0;
1728
4.80k
  }
1729
640
  return ptr1 == end1;
1730
640
}
xmltok.c:normal_nameMatchesAscii
Line
Count
Source
1715
640
                         const char *end1, const char *ptr2) {
1716
640
  UNUSED_P(enc);
1717
5.44k
  for (; *ptr2; ptr1 += MINBPC(enc), ptr2++) {
1718
4.80k
    if (end1 - ptr1 < MINBPC(enc)) {
1719
      /* This line cannot be executed.  The incoming data has already
1720
       * been tokenized once, so incomplete characters like this have
1721
       * already been eliminated from the input.  Retaining the
1722
       * paranoia check is still valuable, however.
1723
       */
1724
0
      return 0; /* LCOV_EXCL_LINE */
1725
0
    }
1726
4.80k
    if (! CHAR_MATCHES(enc, ptr1, *ptr2))
1727
0
      return 0;
1728
4.80k
  }
1729
640
  return ptr1 == end1;
1730
640
}
Unexecuted instantiation: xmltok.c:little2_nameMatchesAscii
Unexecuted instantiation: xmltok.c:big2_nameMatchesAscii
1731
1732
static int PTRFASTCALL
1733
126k
PREFIX(nameLength)(const ENCODING *enc, const char *ptr) {
1734
126k
  const char *start = ptr;
1735
709k
  for (;;) {
1736
709k
    switch (BYTE_TYPE(enc, ptr)) {
1737
0
#  define LEAD_CASE(n)                                                         \
1738
0
  case BT_LEAD##n:                                                             \
1739
0
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1740
0
    break;
1741
0
      LEAD_CASE(2)
1742
0
      LEAD_CASE(3)
1743
0
      LEAD_CASE(4)
1744
0
#  undef LEAD_CASE
1745
0
    case BT_NONASCII:
1746
361k
    case BT_NMSTRT:
1747
361k
#  ifdef XML_NS
1748
361k
    case BT_COLON:
1749
361k
#  endif
1750
583k
    case BT_HEX:
1751
583k
    case BT_DIGIT:
1752
583k
    case BT_NAME:
1753
583k
    case BT_MINUS:
1754
583k
      ptr += MINBPC(enc);
1755
583k
      break;
1756
126k
    default:
1757
126k
      return (int)(ptr - start);
1758
709k
    }
1759
709k
  }
1760
126k
}
xmltok.c:normal_nameLength
Line
Count
Source
1733
126k
PREFIX(nameLength)(const ENCODING *enc, const char *ptr) {
1734
126k
  const char *start = ptr;
1735
709k
  for (;;) {
1736
709k
    switch (BYTE_TYPE(enc, ptr)) {
1737
0
#  define LEAD_CASE(n)                                                         \
1738
0
  case BT_LEAD##n:                                                             \
1739
0
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1740
0
    break;
1741
0
      LEAD_CASE(2)
1742
0
      LEAD_CASE(3)
1743
0
      LEAD_CASE(4)
1744
0
#  undef LEAD_CASE
1745
0
    case BT_NONASCII:
1746
361k
    case BT_NMSTRT:
1747
361k
#  ifdef XML_NS
1748
361k
    case BT_COLON:
1749
361k
#  endif
1750
583k
    case BT_HEX:
1751
583k
    case BT_DIGIT:
1752
583k
    case BT_NAME:
1753
583k
    case BT_MINUS:
1754
583k
      ptr += MINBPC(enc);
1755
583k
      break;
1756
126k
    default:
1757
126k
      return (int)(ptr - start);
1758
709k
    }
1759
709k
  }
1760
126k
}
Unexecuted instantiation: xmltok.c:little2_nameLength
Unexecuted instantiation: xmltok.c:big2_nameLength
1761
1762
static const char *PTRFASTCALL
1763
0
PREFIX(skipS)(const ENCODING *enc, const char *ptr) {
1764
0
  for (;;) {
1765
0
    switch (BYTE_TYPE(enc, ptr)) {
1766
0
    case BT_LF:
1767
0
    case BT_CR:
1768
0
    case BT_S:
1769
0
      ptr += MINBPC(enc);
1770
0
      break;
1771
0
    default:
1772
0
      return ptr;
1773
0
    }
1774
0
  }
1775
0
}
Unexecuted instantiation: xmltok.c:normal_skipS
Unexecuted instantiation: xmltok.c:little2_skipS
Unexecuted instantiation: xmltok.c:big2_skipS
1776
1777
static void PTRCALL
1778
PREFIX(updatePosition)(const ENCODING *enc, const char *ptr, const char *end,
1779
0
                       POSITION *pos) {
1780
0
  while (HAS_CHAR(enc, ptr, end)) {
1781
0
    switch (BYTE_TYPE(enc, ptr)) {
1782
0
#  define LEAD_CASE(n)                                                         \
1783
0
  case BT_LEAD##n:                                                             \
1784
0
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1785
0
    pos->columnNumber++;                                                       \
1786
0
    break;
1787
0
      LEAD_CASE(2)
1788
0
      LEAD_CASE(3)
1789
0
      LEAD_CASE(4)
1790
0
#  undef LEAD_CASE
1791
0
    case BT_LF:
1792
0
      pos->columnNumber = 0;
1793
0
      pos->lineNumber++;
1794
0
      ptr += MINBPC(enc);
1795
0
      break;
1796
0
    case BT_CR:
1797
0
      pos->lineNumber++;
1798
0
      ptr += MINBPC(enc);
1799
0
      if (HAS_CHAR(enc, ptr, end) && BYTE_TYPE(enc, ptr) == BT_LF)
1800
0
        ptr += MINBPC(enc);
1801
0
      pos->columnNumber = 0;
1802
0
      break;
1803
0
    default:
1804
0
      ptr += MINBPC(enc);
1805
0
      pos->columnNumber++;
1806
0
      break;
1807
0
    }
1808
0
  }
1809
0
}
Unexecuted instantiation: xmltok.c:normal_updatePosition
Unexecuted instantiation: xmltok.c:little2_updatePosition
Unexecuted instantiation: xmltok.c:big2_updatePosition
1810
1811
#  undef DO_LEAD_CASE
1812
#  undef MULTIBYTE_CASES
1813
#  undef INVALID_CASES
1814
#  undef CHECK_NAME_CASE
1815
#  undef CHECK_NAME_CASES
1816
#  undef CHECK_NMSTRT_CASE
1817
#  undef CHECK_NMSTRT_CASES
1818
1819
#endif /* XML_TOK_IMPL_C */