Coverage Report

Created: 2026-07-24 07:44

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.32k
  case BT_LEAD##n:                                                             \
50
1.32k
    if (end - ptr < n)                                                         \
51
1.32k
      return XML_TOK_PARTIAL_CHAR;                                             \
52
1.32k
    if (IS_INVALID_CHAR(enc, ptr, n)) {                                        \
53
1
      *(nextTokPtr) = (ptr);                                                   \
54
1
      return XML_TOK_INVALID;                                                  \
55
1
    }                                                                          \
56
1.32k
    ptr += n;                                                                  \
57
1.32k
    break;
58
59
#  define INVALID_CASES(ptr, nextTokPtr)                                       \
60
0
    INVALID_LEAD_CASE(2, ptr, nextTokPtr)                                      \
61
1.32k
    INVALID_LEAD_CASE(3, ptr, nextTokPtr)                                      \
62
1.32k
    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
438k
  case BT_NONASCII:                                                            \
82
438k
    if (! IS_NAME_CHAR_MINBPC(enc, ptr)) {                                     \
83
0
      *nextTokPtr = ptr;                                                       \
84
0
      return XML_TOK_INVALID;                                                  \
85
0
    }                                                                          \
86
438k
    /* fall through */                                                         \
87
438k
  case BT_NMSTRT:                                                              \
88
437k
  case BT_HEX:                                                                 \
89
438k
  case BT_DIGIT:                                                               \
90
438k
  case BT_NAME:                                                                \
91
438k
  case BT_MINUS:                                                               \
92
438k
    ptr += MINBPC(enc);                                                        \
93
438k
    break;                                                                     \
94
438k
    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
120k
  case BT_NONASCII:                                                            \
111
120k
    if (! IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {                                   \
112
0
      *nextTokPtr = ptr;                                                       \
113
0
      return XML_TOK_INVALID;                                                  \
114
0
    }                                                                          \
115
120k
    /* fall through */                                                         \
116
120k
  case BT_NMSTRT:                                                              \
117
120k
  case BT_HEX:                                                                 \
118
120k
    ptr += MINBPC(enc);                                                        \
119
120k
    break;                                                                     \
120
120k
    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.1M
    ((end) - (ptr) >= ((count) * MINBPC(enc)))
130
131
842k
#  define HAS_CHAR(enc, ptr, end) HAS_CHARS(enc, ptr, end, 1)
132
133
#  define REQUIRE_CHARS(enc, ptr, end, count)                                  \
134
8.71M
    {                                                                          \
135
8.71M
      if (! HAS_CHARS(enc, ptr, end, count)) {                                 \
136
0
        return XML_TOK_PARTIAL;                                                \
137
0
      }                                                                        \
138
8.71M
    }
139
140
8.71M
#  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
309
                      int *tokPtr) {
233
309
  int upper = 0;
234
309
  UNUSED_P(enc);
235
309
  *tokPtr = XML_TOK_PI;
236
309
  if (end - ptr != MINBPC(enc) * 3)
237
0
    return 1;
238
309
  switch (BYTE_TO_ASCII(enc, ptr)) {
239
309
  case ASCII_x:
240
309
    break;
241
0
  case ASCII_X:
242
0
    upper = 1;
243
0
    break;
244
0
  default:
245
0
    return 1;
246
309
  }
247
309
  ptr += MINBPC(enc);
248
309
  switch (BYTE_TO_ASCII(enc, ptr)) {
249
309
  case ASCII_m:
250
309
    break;
251
0
  case ASCII_M:
252
0
    upper = 1;
253
0
    break;
254
0
  default:
255
0
    return 1;
256
309
  }
257
309
  ptr += MINBPC(enc);
258
309
  switch (BYTE_TO_ASCII(enc, ptr)) {
259
309
  case ASCII_l:
260
309
    break;
261
0
  case ASCII_L:
262
0
    upper = 1;
263
0
    break;
264
0
  default:
265
0
    return 1;
266
309
  }
267
309
  if (upper)
268
0
    return 0;
269
309
  *tokPtr = XML_TOK_XML_DECL;
270
309
  return 1;
271
309
}
xmltok.c:normal_checkPiTarget
Line
Count
Source
232
309
                      int *tokPtr) {
233
309
  int upper = 0;
234
309
  UNUSED_P(enc);
235
309
  *tokPtr = XML_TOK_PI;
236
309
  if (end - ptr != MINBPC(enc) * 3)
237
0
    return 1;
238
309
  switch (BYTE_TO_ASCII(enc, ptr)) {
239
309
  case ASCII_x:
240
309
    break;
241
0
  case ASCII_X:
242
0
    upper = 1;
243
0
    break;
244
0
  default:
245
0
    return 1;
246
309
  }
247
309
  ptr += MINBPC(enc);
248
309
  switch (BYTE_TO_ASCII(enc, ptr)) {
249
309
  case ASCII_m:
250
309
    break;
251
0
  case ASCII_M:
252
0
    upper = 1;
253
0
    break;
254
0
  default:
255
0
    return 1;
256
309
  }
257
309
  ptr += MINBPC(enc);
258
309
  switch (BYTE_TO_ASCII(enc, ptr)) {
259
309
  case ASCII_l:
260
309
    break;
261
0
  case ASCII_L:
262
0
    upper = 1;
263
0
    break;
264
0
  default:
265
0
    return 1;
266
309
  }
267
309
  if (upper)
268
0
    return 0;
269
309
  *tokPtr = XML_TOK_XML_DECL;
270
309
  return 1;
271
309
}
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
309
               const char **nextTokPtr) {
278
309
  int tok;
279
309
  const char *target = ptr;
280
309
  REQUIRE_CHAR(enc, ptr, end);
281
309
  switch (BYTE_TYPE(enc, ptr)) {
282
309
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
283
0
  default:
284
0
    *nextTokPtr = ptr;
285
0
    return XML_TOK_INVALID;
286
309
  }
287
927
  while (HAS_CHAR(enc, ptr, end)) {
288
927
    switch (BYTE_TYPE(enc, ptr)) {
289
2.47k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
290
309
    case BT_S:
291
309
    case BT_CR:
292
309
    case BT_LF:
293
309
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
294
0
        *nextTokPtr = ptr;
295
0
        return XML_TOK_INVALID;
296
0
      }
297
309
      ptr += MINBPC(enc);
298
9.57k
      while (HAS_CHAR(enc, ptr, end)) {
299
9.57k
        switch (BYTE_TYPE(enc, ptr)) {
300
0
          INVALID_CASES(ptr, nextTokPtr)
301
309
        case BT_QUEST:
302
309
          ptr += MINBPC(enc);
303
309
          REQUIRE_CHAR(enc, ptr, end);
304
309
          if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
305
309
            *nextTokPtr = ptr + MINBPC(enc);
306
309
            return tok;
307
309
          }
308
0
          break;
309
9.27k
        default:
310
9.27k
          ptr += MINBPC(enc);
311
9.27k
          break;
312
9.57k
        }
313
9.57k
      }
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
927
    }
331
927
  }
332
0
  return XML_TOK_PARTIAL;
333
309
}
xmltok.c:normal_scanPi
Line
Count
Source
277
309
               const char **nextTokPtr) {
278
309
  int tok;
279
309
  const char *target = ptr;
280
309
  REQUIRE_CHAR(enc, ptr, end);
281
309
  switch (BYTE_TYPE(enc, ptr)) {
282
309
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
283
0
  default:
284
0
    *nextTokPtr = ptr;
285
0
    return XML_TOK_INVALID;
286
309
  }
287
927
  while (HAS_CHAR(enc, ptr, end)) {
288
927
    switch (BYTE_TYPE(enc, ptr)) {
289
2.47k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
290
309
    case BT_S:
291
309
    case BT_CR:
292
309
    case BT_LF:
293
309
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
294
0
        *nextTokPtr = ptr;
295
0
        return XML_TOK_INVALID;
296
0
      }
297
309
      ptr += MINBPC(enc);
298
9.57k
      while (HAS_CHAR(enc, ptr, end)) {
299
9.57k
        switch (BYTE_TYPE(enc, ptr)) {
300
0
          INVALID_CASES(ptr, nextTokPtr)
301
309
        case BT_QUEST:
302
309
          ptr += MINBPC(enc);
303
309
          REQUIRE_CHAR(enc, ptr, end);
304
309
          if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
305
309
            *nextTokPtr = ptr + MINBPC(enc);
306
309
            return tok;
307
309
          }
308
0
          break;
309
9.27k
        default:
310
9.27k
          ptr += MINBPC(enc);
311
9.27k
          break;
312
9.57k
        }
313
9.57k
      }
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
927
    }
331
927
  }
332
0
  return XML_TOK_PARTIAL;
333
309
}
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
562
                   const char **nextTokPtr) {
433
562
  REQUIRE_CHAR(enc, ptr, end);
434
562
  switch (BYTE_TYPE(enc, ptr)) {
435
273
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
436
1
  default:
437
1
    *nextTokPtr = ptr;
438
1
    return XML_TOK_INVALID;
439
562
  }
440
7.90k
  while (HAS_CHAR(enc, ptr, end)) {
441
7.90k
    switch (BYTE_TYPE(enc, ptr)) {
442
26.5k
      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
561
    case BT_GT:
469
561
      *nextTokPtr = ptr + MINBPC(enc);
470
561
      return XML_TOK_END_TAG;
471
0
    default:
472
0
      *nextTokPtr = ptr;
473
0
      return XML_TOK_INVALID;
474
7.90k
    }
475
7.90k
  }
476
0
  return XML_TOK_PARTIAL;
477
561
}
xmltok.c:normal_scanEndTag
Line
Count
Source
432
562
                   const char **nextTokPtr) {
433
562
  REQUIRE_CHAR(enc, ptr, end);
434
562
  switch (BYTE_TYPE(enc, ptr)) {
435
273
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
436
1
  default:
437
1
    *nextTokPtr = ptr;
438
1
    return XML_TOK_INVALID;
439
562
  }
440
7.90k
  while (HAS_CHAR(enc, ptr, end)) {
441
7.90k
    switch (BYTE_TYPE(enc, ptr)) {
442
26.5k
      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
561
    case BT_GT:
469
561
      *nextTokPtr = ptr + MINBPC(enc);
470
561
      return XML_TOK_END_TAG;
471
0
    default:
472
0
      *nextTokPtr = ptr;
473
0
      return XML_TOK_INVALID;
474
7.90k
    }
475
7.90k
  }
476
0
  return XML_TOK_PARTIAL;
477
561
}
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
38.2k
                 const char **nextTokPtr) {
574
38.2k
#  ifdef XML_NS
575
38.2k
  int hadColon = 0;
576
38.2k
#  endif
577
385k
  while (HAS_CHAR(enc, ptr, end)) {
578
385k
    switch (BYTE_TYPE(enc, ptr)) {
579
1.12M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
580
0
#  ifdef XML_NS
581
100
    case BT_COLON:
582
100
      if (hadColon) {
583
0
        *nextTokPtr = ptr;
584
0
        return XML_TOK_INVALID;
585
0
      }
586
100
      hadColon = 1;
587
100
      ptr += MINBPC(enc);
588
100
      REQUIRE_CHAR(enc, ptr, end);
589
100
      switch (BYTE_TYPE(enc, ptr)) {
590
100
        CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
591
0
      default:
592
0
        *nextTokPtr = ptr;
593
0
        return XML_TOK_INVALID;
594
100
      }
595
100
      break;
596
100
#  endif
597
100
    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
81.4k
    case BT_EQUALS: {
620
81.4k
      int open;
621
81.4k
#  ifdef XML_NS
622
81.4k
      hadColon = 0;
623
81.4k
#  endif
624
81.4k
      for (;;) {
625
81.4k
        ptr += MINBPC(enc);
626
81.4k
        REQUIRE_CHAR(enc, ptr, end);
627
81.4k
        open = BYTE_TYPE(enc, ptr);
628
81.4k
        if (open == BT_QUOT || open == BT_APOS)
629
81.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
81.4k
      ptr += MINBPC(enc);
641
      /* in attribute value */
642
8.38M
      for (;;) {
643
8.38M
        int t;
644
8.38M
        REQUIRE_CHAR(enc, ptr, end);
645
8.38M
        t = BYTE_TYPE(enc, ptr);
646
8.38M
        if (t == open)
647
81.4k
          break;
648
8.30M
        switch (t) {
649
2.64k
          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.30M
        default:
663
8.30M
          ptr += MINBPC(enc);
664
8.30M
          break;
665
8.30M
        }
666
8.30M
      }
667
81.4k
      ptr += MINBPC(enc);
668
81.4k
      REQUIRE_CHAR(enc, ptr, end);
669
81.4k
      switch (BYTE_TYPE(enc, ptr)) {
670
80.1k
      case BT_S:
671
80.1k
      case BT_CR:
672
80.1k
      case BT_LF:
673
80.1k
        break;
674
548
      case BT_SOL:
675
548
        goto sol;
676
631
      case BT_GT:
677
631
        goto gt;
678
25
      default:
679
25
        *nextTokPtr = ptr;
680
25
        return XML_TOK_INVALID;
681
81.4k
      }
682
      /* ptr points to closing quote */
683
80.1k
      for (;;) {
684
80.1k
        ptr += MINBPC(enc);
685
80.1k
        REQUIRE_CHAR(enc, ptr, end);
686
80.1k
        switch (BYTE_TYPE(enc, ptr)) {
687
7.54k
          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
631
        gt:
694
631
          *nextTokPtr = ptr + MINBPC(enc);
695
631
          return XML_TOK_START_TAG_WITH_ATTS;
696
37.0k
        case BT_SOL:
697
37.5k
        sol:
698
37.5k
          ptr += MINBPC(enc);
699
37.5k
          REQUIRE_CHAR(enc, ptr, end);
700
37.5k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
701
1
            *nextTokPtr = ptr;
702
1
            return XML_TOK_INVALID;
703
1
          }
704
37.5k
          *nextTokPtr = ptr + MINBPC(enc);
705
37.5k
          return XML_TOK_EMPTY_ELEMENT_WITH_ATTS;
706
5
        default:
707
5
          *nextTokPtr = ptr;
708
5
          return XML_TOK_INVALID;
709
80.1k
        }
710
43.1k
        break;
711
80.1k
      }
712
43.1k
      break;
713
80.1k
    }
714
43.1k
    default:
715
7
      *nextTokPtr = ptr;
716
7
      return XML_TOK_INVALID;
717
385k
    }
718
385k
  }
719
0
  return XML_TOK_PARTIAL;
720
38.2k
}
xmltok.c:normal_scanAtts
Line
Count
Source
573
38.2k
                 const char **nextTokPtr) {
574
38.2k
#  ifdef XML_NS
575
38.2k
  int hadColon = 0;
576
38.2k
#  endif
577
385k
  while (HAS_CHAR(enc, ptr, end)) {
578
385k
    switch (BYTE_TYPE(enc, ptr)) {
579
1.12M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
580
0
#  ifdef XML_NS
581
100
    case BT_COLON:
582
100
      if (hadColon) {
583
0
        *nextTokPtr = ptr;
584
0
        return XML_TOK_INVALID;
585
0
      }
586
100
      hadColon = 1;
587
100
      ptr += MINBPC(enc);
588
100
      REQUIRE_CHAR(enc, ptr, end);
589
100
      switch (BYTE_TYPE(enc, ptr)) {
590
100
        CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
591
0
      default:
592
0
        *nextTokPtr = ptr;
593
0
        return XML_TOK_INVALID;
594
100
      }
595
100
      break;
596
100
#  endif
597
100
    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
81.4k
    case BT_EQUALS: {
620
81.4k
      int open;
621
81.4k
#  ifdef XML_NS
622
81.4k
      hadColon = 0;
623
81.4k
#  endif
624
81.4k
      for (;;) {
625
81.4k
        ptr += MINBPC(enc);
626
81.4k
        REQUIRE_CHAR(enc, ptr, end);
627
81.4k
        open = BYTE_TYPE(enc, ptr);
628
81.4k
        if (open == BT_QUOT || open == BT_APOS)
629
81.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
81.4k
      ptr += MINBPC(enc);
641
      /* in attribute value */
642
8.38M
      for (;;) {
643
8.38M
        int t;
644
8.38M
        REQUIRE_CHAR(enc, ptr, end);
645
8.38M
        t = BYTE_TYPE(enc, ptr);
646
8.38M
        if (t == open)
647
81.4k
          break;
648
8.30M
        switch (t) {
649
2.64k
          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.30M
        default:
663
8.30M
          ptr += MINBPC(enc);
664
8.30M
          break;
665
8.30M
        }
666
8.30M
      }
667
81.4k
      ptr += MINBPC(enc);
668
81.4k
      REQUIRE_CHAR(enc, ptr, end);
669
81.4k
      switch (BYTE_TYPE(enc, ptr)) {
670
80.1k
      case BT_S:
671
80.1k
      case BT_CR:
672
80.1k
      case BT_LF:
673
80.1k
        break;
674
548
      case BT_SOL:
675
548
        goto sol;
676
631
      case BT_GT:
677
631
        goto gt;
678
25
      default:
679
25
        *nextTokPtr = ptr;
680
25
        return XML_TOK_INVALID;
681
81.4k
      }
682
      /* ptr points to closing quote */
683
80.1k
      for (;;) {
684
80.1k
        ptr += MINBPC(enc);
685
80.1k
        REQUIRE_CHAR(enc, ptr, end);
686
80.1k
        switch (BYTE_TYPE(enc, ptr)) {
687
7.54k
          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
631
        gt:
694
631
          *nextTokPtr = ptr + MINBPC(enc);
695
631
          return XML_TOK_START_TAG_WITH_ATTS;
696
37.0k
        case BT_SOL:
697
37.5k
        sol:
698
37.5k
          ptr += MINBPC(enc);
699
37.5k
          REQUIRE_CHAR(enc, ptr, end);
700
37.5k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
701
1
            *nextTokPtr = ptr;
702
1
            return XML_TOK_INVALID;
703
1
          }
704
37.5k
          *nextTokPtr = ptr + MINBPC(enc);
705
37.5k
          return XML_TOK_EMPTY_ELEMENT_WITH_ATTS;
706
5
        default:
707
5
          *nextTokPtr = ptr;
708
5
          return XML_TOK_INVALID;
709
80.1k
        }
710
43.1k
        break;
711
80.1k
      }
712
43.1k
      break;
713
80.1k
    }
714
43.1k
    default:
715
7
      *nextTokPtr = ptr;
716
7
      return XML_TOK_INVALID;
717
385k
    }
718
385k
  }
719
0
  return XML_TOK_PARTIAL;
720
38.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
38.9k
               const char **nextTokPtr) {
727
38.9k
#  ifdef XML_NS
728
38.9k
  int hadColon;
729
38.9k
#  endif
730
38.9k
  REQUIRE_CHAR(enc, ptr, end);
731
38.9k
  switch (BYTE_TYPE(enc, ptr)) {
732
37.8k
    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
562
  case BT_SOL:
747
562
    return PREFIX(scanEndTag)(enc, ptr + MINBPC(enc), end, nextTokPtr);
748
3
  default:
749
3
    *nextTokPtr = ptr;
750
3
    return XML_TOK_INVALID;
751
38.9k
  }
752
38.3k
#  ifdef XML_NS
753
38.3k
  hadColon = 0;
754
38.3k
#  endif
755
  /* we have a start-tag */
756
165k
  while (HAS_CHAR(enc, ptr, end)) {
757
165k
    switch (BYTE_TYPE(enc, ptr)) {
758
464k
      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
38.2k
    case BT_S:
777
38.2k
    case BT_CR:
778
38.2k
    case BT_LF: {
779
38.2k
      ptr += MINBPC(enc);
780
38.2k
      while (HAS_CHAR(enc, ptr, end)) {
781
38.2k
        switch (BYTE_TYPE(enc, ptr)) {
782
979
          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
38.2k
        }
796
38.2k
        return PREFIX(scanAtts)(enc, ptr, end, nextTokPtr);
797
38.2k
      }
798
0
      return XML_TOK_PARTIAL;
799
38.2k
    }
800
82
    case BT_GT:
801
82
    gt:
802
82
      *nextTokPtr = ptr + MINBPC(enc);
803
82
      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
165k
    }
818
165k
  }
819
0
  return XML_TOK_PARTIAL;
820
38.3k
}
xmltok.c:normal_scanLt
Line
Count
Source
726
38.9k
               const char **nextTokPtr) {
727
38.9k
#  ifdef XML_NS
728
38.9k
  int hadColon;
729
38.9k
#  endif
730
38.9k
  REQUIRE_CHAR(enc, ptr, end);
731
38.9k
  switch (BYTE_TYPE(enc, ptr)) {
732
37.8k
    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
562
  case BT_SOL:
747
562
    return PREFIX(scanEndTag)(enc, ptr + MINBPC(enc), end, nextTokPtr);
748
3
  default:
749
3
    *nextTokPtr = ptr;
750
3
    return XML_TOK_INVALID;
751
38.9k
  }
752
38.3k
#  ifdef XML_NS
753
38.3k
  hadColon = 0;
754
38.3k
#  endif
755
  /* we have a start-tag */
756
165k
  while (HAS_CHAR(enc, ptr, end)) {
757
165k
    switch (BYTE_TYPE(enc, ptr)) {
758
464k
      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
38.2k
    case BT_S:
777
38.2k
    case BT_CR:
778
38.2k
    case BT_LF: {
779
38.2k
      ptr += MINBPC(enc);
780
38.2k
      while (HAS_CHAR(enc, ptr, end)) {
781
38.2k
        switch (BYTE_TYPE(enc, ptr)) {
782
979
          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
38.2k
        }
796
38.2k
        return PREFIX(scanAtts)(enc, ptr, end, nextTokPtr);
797
38.2k
      }
798
0
      return XML_TOK_PARTIAL;
799
38.2k
    }
800
82
    case BT_GT:
801
82
    gt:
802
82
      *nextTokPtr = ptr + MINBPC(enc);
803
82
      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
165k
    }
818
165k
  }
819
0
  return XML_TOK_PARTIAL;
820
38.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
110k
                   const char **nextTokPtr) {
825
110k
  if (ptr >= end)
826
0
    return XML_TOK_NONE;
827
110k
  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
110k
  switch (BYTE_TYPE(enc, ptr)) {
837
38.9k
  case BT_LT:
838
38.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
687
  case BT_CR:
842
687
    ptr += MINBPC(enc);
843
687
    if (! HAS_CHAR(enc, ptr, end))
844
0
      return XML_TOK_TRAILING_CR;
845
687
    if (BYTE_TYPE(enc, ptr) == BT_LF)
846
687
      ptr += MINBPC(enc);
847
687
    *nextTokPtr = ptr;
848
687
    return XML_TOK_DATA_NEWLINE;
849
33.2k
  case BT_LF:
850
33.2k
    *nextTokPtr = ptr + MINBPC(enc);
851
33.2k
    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
37.4k
  default:
869
37.4k
    ptr += MINBPC(enc);
870
37.4k
    break;
871
110k
  }
872
192k
  while (HAS_CHAR(enc, ptr, end)) {
873
192k
    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
37.0k
    case BT_LT:
904
37.0k
    case BT_NONXML:
905
37.0k
    case BT_MALFORM:
906
37.0k
    case BT_TRAIL:
907
37.0k
    case BT_CR:
908
37.4k
    case BT_LF:
909
37.4k
      *nextTokPtr = ptr;
910
37.4k
      return XML_TOK_DATA_CHARS;
911
155k
    default:
912
155k
      ptr += MINBPC(enc);
913
155k
      break;
914
192k
    }
915
192k
  }
916
0
  *nextTokPtr = ptr;
917
0
  return XML_TOK_DATA_CHARS;
918
37.4k
}
xmltok.c:normal_contentTok
Line
Count
Source
824
110k
                   const char **nextTokPtr) {
825
110k
  if (ptr >= end)
826
0
    return XML_TOK_NONE;
827
110k
  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
110k
  switch (BYTE_TYPE(enc, ptr)) {
837
38.9k
  case BT_LT:
838
38.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
687
  case BT_CR:
842
687
    ptr += MINBPC(enc);
843
687
    if (! HAS_CHAR(enc, ptr, end))
844
0
      return XML_TOK_TRAILING_CR;
845
687
    if (BYTE_TYPE(enc, ptr) == BT_LF)
846
687
      ptr += MINBPC(enc);
847
687
    *nextTokPtr = ptr;
848
687
    return XML_TOK_DATA_NEWLINE;
849
33.2k
  case BT_LF:
850
33.2k
    *nextTokPtr = ptr + MINBPC(enc);
851
33.2k
    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
37.4k
  default:
869
37.4k
    ptr += MINBPC(enc);
870
37.4k
    break;
871
110k
  }
872
192k
  while (HAS_CHAR(enc, ptr, end)) {
873
192k
    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
37.0k
    case BT_LT:
904
37.0k
    case BT_NONXML:
905
37.0k
    case BT_MALFORM:
906
37.0k
    case BT_TRAIL:
907
37.0k
    case BT_CR:
908
37.4k
    case BT_LF:
909
37.4k
      *nextTokPtr = ptr;
910
37.4k
      return XML_TOK_DATA_CHARS;
911
155k
    default:
912
155k
      ptr += MINBPC(enc);
913
155k
      break;
914
192k
    }
915
192k
  }
916
0
  *nextTokPtr = ptr;
917
0
  return XML_TOK_DATA_CHARS;
918
37.4k
}
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.73k
                  const char **nextTokPtr) {
1019
1.73k
  int tok;
1020
1.73k
  if (ptr >= end)
1021
366
    return XML_TOK_NONE;
1022
1.36k
  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.36k
  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
756
  case BT_LT: {
1037
756
    ptr += MINBPC(enc);
1038
756
    REQUIRE_CHAR(enc, ptr, end);
1039
756
    switch (BYTE_TYPE(enc, ptr)) {
1040
0
    case BT_EXCL:
1041
0
      return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1042
309
    case BT_QUEST:
1043
309
      return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1044
115
    case BT_NMSTRT:
1045
447
    case BT_HEX:
1046
447
    case BT_NONASCII:
1047
447
    case BT_LEAD2:
1048
447
    case BT_LEAD3:
1049
447
    case BT_LEAD4:
1050
447
      *nextTokPtr = ptr - MINBPC(enc);
1051
447
      return XML_TOK_INSTANCE_START;
1052
756
    }
1053
0
    *nextTokPtr = ptr;
1054
0
    return XML_TOK_INVALID;
1055
756
  }
1056
587
  case BT_CR:
1057
587
    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
587
  case BT_S:
1064
605
  case BT_LF:
1065
1.19k
    for (;;) {
1066
1.19k
      ptr += MINBPC(enc);
1067
1.19k
      if (! HAS_CHAR(enc, ptr, end))
1068
306
        break;
1069
886
      switch (BYTE_TYPE(enc, ptr)) {
1070
0
      case BT_S:
1071
587
      case BT_LF:
1072
587
        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
299
      default:
1079
299
        *nextTokPtr = ptr;
1080
299
        return XML_TOK_PROLOG_S;
1081
886
      }
1082
886
    }
1083
306
    *nextTokPtr = ptr;
1084
306
    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.36k
  }
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.73k
                  const char **nextTokPtr) {
1019
1.73k
  int tok;
1020
1.73k
  if (ptr >= end)
1021
366
    return XML_TOK_NONE;
1022
1.36k
  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.36k
  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
756
  case BT_LT: {
1037
756
    ptr += MINBPC(enc);
1038
756
    REQUIRE_CHAR(enc, ptr, end);
1039
756
    switch (BYTE_TYPE(enc, ptr)) {
1040
0
    case BT_EXCL:
1041
0
      return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1042
309
    case BT_QUEST:
1043
309
      return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1044
115
    case BT_NMSTRT:
1045
447
    case BT_HEX:
1046
447
    case BT_NONASCII:
1047
447
    case BT_LEAD2:
1048
447
    case BT_LEAD3:
1049
447
    case BT_LEAD4:
1050
447
      *nextTokPtr = ptr - MINBPC(enc);
1051
447
      return XML_TOK_INSTANCE_START;
1052
756
    }
1053
0
    *nextTokPtr = ptr;
1054
0
    return XML_TOK_INVALID;
1055
756
  }
1056
587
  case BT_CR:
1057
587
    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
587
  case BT_S:
1064
605
  case BT_LF:
1065
1.19k
    for (;;) {
1066
1.19k
      ptr += MINBPC(enc);
1067
1.19k
      if (! HAS_CHAR(enc, ptr, end))
1068
306
        break;
1069
886
      switch (BYTE_TYPE(enc, ptr)) {
1070
0
      case BT_S:
1071
587
      case BT_LF:
1072
587
        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
299
      default:
1079
299
        *nextTokPtr = ptr;
1080
299
        return XML_TOK_PROLOG_S;
1081
886
      }
1082
886
    }
1083
306
    *nextTokPtr = ptr;
1084
306
    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.36k
  }
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
845k
                          const char **nextTokPtr) {
1263
845k
  const char *start;
1264
845k
  if (ptr >= end)
1265
4.46k
    return XML_TOK_NONE;
1266
841k
  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
841k
  start = ptr;
1275
5.75M
  while (HAS_CHAR(enc, ptr, end)) {
1276
5.75M
    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
43.3k
    case BT_LF:
1295
43.3k
      if (ptr == start) {
1296
21.7k
        *nextTokPtr = ptr + MINBPC(enc);
1297
21.7k
        return XML_TOK_DATA_NEWLINE;
1298
21.7k
      }
1299
21.6k
      *nextTokPtr = ptr;
1300
21.6k
      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
793k
    case BT_S:
1314
793k
      if (ptr == start) {
1315
420k
        *nextTokPtr = ptr + MINBPC(enc);
1316
420k
        return XML_TOK_ATTRIBUTE_VALUE_S;
1317
420k
      }
1318
372k
      *nextTokPtr = ptr;
1319
372k
      return XML_TOK_DATA_CHARS;
1320
4.91M
    default:
1321
4.91M
      ptr += MINBPC(enc);
1322
4.91M
      break;
1323
5.75M
    }
1324
5.75M
  }
1325
4.30k
  *nextTokPtr = ptr;
1326
4.30k
  return XML_TOK_DATA_CHARS;
1327
841k
}
xmltok.c:normal_attributeValueTok
Line
Count
Source
1262
845k
                          const char **nextTokPtr) {
1263
845k
  const char *start;
1264
845k
  if (ptr >= end)
1265
4.46k
    return XML_TOK_NONE;
1266
841k
  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
841k
  start = ptr;
1275
5.75M
  while (HAS_CHAR(enc, ptr, end)) {
1276
5.75M
    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
43.3k
    case BT_LF:
1295
43.3k
      if (ptr == start) {
1296
21.7k
        *nextTokPtr = ptr + MINBPC(enc);
1297
21.7k
        return XML_TOK_DATA_NEWLINE;
1298
21.7k
      }
1299
21.6k
      *nextTokPtr = ptr;
1300
21.6k
      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
793k
    case BT_S:
1314
793k
      if (ptr == start) {
1315
420k
        *nextTokPtr = ptr + MINBPC(enc);
1316
420k
        return XML_TOK_ATTRIBUTE_VALUE_S;
1317
420k
      }
1318
372k
      *nextTokPtr = ptr;
1319
372k
      return XML_TOK_DATA_CHARS;
1320
4.91M
    default:
1321
4.91M
      ptr += MINBPC(enc);
1322
4.91M
      break;
1323
5.75M
    }
1324
5.75M
  }
1325
4.30k
  *nextTokPtr = ptr;
1326
4.30k
  return XML_TOK_DATA_CHARS;
1327
841k
}
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
38.3k
                ATTRIBUTE *atts) {
1511
38.3k
  enum { other, inName, inValue } state = inName;
1512
38.3k
  int nAtts = 0;
1513
38.3k
  int open = 0; /* defined when state == inValue;
1514
                   initialization just to shut up compilers */
1515
1516
9.17M
  for (ptr += MINBPC(enc);; ptr += MINBPC(enc)) {
1517
9.17M
    switch (BYTE_TYPE(enc, ptr)) {
1518
0
#  define START_NAME                                                           \
1519
972k
    if (state == other) {                                                      \
1520
81.3k
      if (nAtts < attsMax) {                                                   \
1521
81.3k
        atts[nAtts].name = ptr;                                                \
1522
81.3k
        atts[nAtts].normalized = 1;                                            \
1523
81.3k
      }                                                                        \
1524
81.3k
      state = inName;                                                          \
1525
81.3k
    }
1526
0
#  define LEAD_CASE(n)                                                         \
1527
1.32k
  case BT_LEAD##n: /* NOTE: The encoding has already been validated. */        \
1528
1.32k
    START_NAME ptr += (n - MINBPC(enc));                                       \
1529
1.32k
    break;
1530
0
      LEAD_CASE(2)
1531
1.32k
      LEAD_CASE(3)
1532
0
      LEAD_CASE(4)
1533
0
#  undef LEAD_CASE
1534
0
    case BT_NONASCII:
1535
508k
    case BT_NMSTRT:
1536
971k
    case BT_HEX:
1537
971k
      START_NAME
1538
971k
      break;
1539
0
#  undef START_NAME
1540
162k
    case BT_QUOT:
1541
162k
      if (state != inValue) {
1542
81.3k
        if (nAtts < attsMax)
1543
81.3k
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1544
81.3k
        state = inValue;
1545
81.3k
        open = BT_QUOT;
1546
81.3k
      } else if (open == BT_QUOT) {
1547
81.3k
        state = other;
1548
81.3k
        if (nAtts < attsMax)
1549
81.3k
          atts[nAtts].valueEnd = ptr;
1550
81.3k
        nAtts++;
1551
81.3k
      }
1552
162k
      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
789k
    case BT_S:
1571
789k
      if (state == inName)
1572
38.2k
        state = other;
1573
751k
      else if (state == inValue && nAtts < attsMax && atts[nAtts].normalized
1574
296k
               && (ptr == atts[nAtts].valuePtr
1575
296k
                   || BYTE_TO_ASCII(enc, ptr) != ASCII_SPACE
1576
295k
                   || BYTE_TO_ASCII(enc, ptr + MINBPC(enc)) == ASCII_SPACE
1577
294k
                   || BYTE_TYPE(enc, ptr + MINBPC(enc)) == open))
1578
1.98k
        atts[nAtts].normalized = 0;
1579
789k
      break;
1580
0
    case BT_CR:
1581
21.7k
    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
21.7k
      if (state == inName)
1585
0
        state = other;
1586
21.7k
      else if (state == inValue && nAtts < attsMax)
1587
21.7k
        atts[nAtts].normalized = 0;
1588
21.7k
      break;
1589
713
    case BT_GT:
1590
44.6k
    case BT_SOL:
1591
44.6k
      if (state != inValue)
1592
38.3k
        return nAtts;
1593
6.30k
      break;
1594
7.18M
    default:
1595
7.18M
      break;
1596
9.17M
    }
1597
9.17M
  }
1598
  /* not reached */
1599
38.3k
}
xmltok.c:normal_getAtts
Line
Count
Source
1510
38.3k
                ATTRIBUTE *atts) {
1511
38.3k
  enum { other, inName, inValue } state = inName;
1512
38.3k
  int nAtts = 0;
1513
38.3k
  int open = 0; /* defined when state == inValue;
1514
                   initialization just to shut up compilers */
1515
1516
9.17M
  for (ptr += MINBPC(enc);; ptr += MINBPC(enc)) {
1517
9.17M
    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.32k
      LEAD_CASE(3)
1532
0
      LEAD_CASE(4)
1533
0
#  undef LEAD_CASE
1534
0
    case BT_NONASCII:
1535
508k
    case BT_NMSTRT:
1536
971k
    case BT_HEX:
1537
971k
      START_NAME
1538
971k
      break;
1539
0
#  undef START_NAME
1540
162k
    case BT_QUOT:
1541
162k
      if (state != inValue) {
1542
81.3k
        if (nAtts < attsMax)
1543
81.3k
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1544
81.3k
        state = inValue;
1545
81.3k
        open = BT_QUOT;
1546
81.3k
      } else if (open == BT_QUOT) {
1547
81.3k
        state = other;
1548
81.3k
        if (nAtts < attsMax)
1549
81.3k
          atts[nAtts].valueEnd = ptr;
1550
81.3k
        nAtts++;
1551
81.3k
      }
1552
162k
      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
789k
    case BT_S:
1571
789k
      if (state == inName)
1572
38.2k
        state = other;
1573
751k
      else if (state == inValue && nAtts < attsMax && atts[nAtts].normalized
1574
296k
               && (ptr == atts[nAtts].valuePtr
1575
296k
                   || BYTE_TO_ASCII(enc, ptr) != ASCII_SPACE
1576
295k
                   || BYTE_TO_ASCII(enc, ptr + MINBPC(enc)) == ASCII_SPACE
1577
294k
                   || BYTE_TYPE(enc, ptr + MINBPC(enc)) == open))
1578
1.98k
        atts[nAtts].normalized = 0;
1579
789k
      break;
1580
0
    case BT_CR:
1581
21.7k
    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
21.7k
      if (state == inName)
1585
0
        state = other;
1586
21.7k
      else if (state == inValue && nAtts < attsMax)
1587
21.7k
        atts[nAtts].normalized = 0;
1588
21.7k
      break;
1589
713
    case BT_GT:
1590
44.6k
    case BT_SOL:
1591
44.6k
      if (state != inValue)
1592
38.3k
        return nAtts;
1593
6.30k
      break;
1594
7.18M
    default:
1595
7.18M
      break;
1596
9.17M
    }
1597
9.17M
  }
1598
  /* not reached */
1599
38.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
618
                         const char *end1, const char *ptr2) {
1716
618
  UNUSED_P(enc);
1717
5.25k
  for (; *ptr2; ptr1 += MINBPC(enc), ptr2++) {
1718
4.63k
    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.63k
    if (! CHAR_MATCHES(enc, ptr1, *ptr2))
1727
0
      return 0;
1728
4.63k
  }
1729
618
  return ptr1 == end1;
1730
618
}
xmltok.c:normal_nameMatchesAscii
Line
Count
Source
1715
618
                         const char *end1, const char *ptr2) {
1716
618
  UNUSED_P(enc);
1717
5.25k
  for (; *ptr2; ptr1 += MINBPC(enc), ptr2++) {
1718
4.63k
    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.63k
    if (! CHAR_MATCHES(enc, ptr1, *ptr2))
1727
0
      return 0;
1728
4.63k
  }
1729
618
  return ptr1 == end1;
1730
618
}
Unexecuted instantiation: xmltok.c:little2_nameMatchesAscii
Unexecuted instantiation: xmltok.c:big2_nameMatchesAscii
1731
1732
static int PTRFASTCALL
1733
120k
PREFIX(nameLength)(const ENCODING *enc, const char *ptr) {
1734
120k
  const char *start = ptr;
1735
677k
  for (;;) {
1736
677k
    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
345k
    case BT_NMSTRT:
1747
345k
#  ifdef XML_NS
1748
345k
    case BT_COLON:
1749
345k
#  endif
1750
557k
    case BT_HEX:
1751
557k
    case BT_DIGIT:
1752
557k
    case BT_NAME:
1753
557k
    case BT_MINUS:
1754
557k
      ptr += MINBPC(enc);
1755
557k
      break;
1756
120k
    default:
1757
120k
      return (int)(ptr - start);
1758
677k
    }
1759
677k
  }
1760
120k
}
xmltok.c:normal_nameLength
Line
Count
Source
1733
120k
PREFIX(nameLength)(const ENCODING *enc, const char *ptr) {
1734
120k
  const char *start = ptr;
1735
677k
  for (;;) {
1736
677k
    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
345k
    case BT_NMSTRT:
1747
345k
#  ifdef XML_NS
1748
345k
    case BT_COLON:
1749
345k
#  endif
1750
557k
    case BT_HEX:
1751
557k
    case BT_DIGIT:
1752
557k
    case BT_NAME:
1753
557k
    case BT_MINUS:
1754
557k
      ptr += MINBPC(enc);
1755
557k
      break;
1756
120k
    default:
1757
120k
      return (int)(ptr - start);
1758
677k
    }
1759
677k
  }
1760
120k
}
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 */