Coverage Report

Created: 2026-09-14 07:34

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