Coverage Report

Created: 2026-04-09 07:06

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
925
  case BT_LEAD##n:                                                             \
50
925
    if (end - ptr < n)                                                         \
51
924
      return XML_TOK_PARTIAL_CHAR;                                             \
52
925
    if (IS_INVALID_CHAR(enc, ptr, n)) {                                        \
53
1
      *(nextTokPtr) = (ptr);                                                   \
54
1
      return XML_TOK_INVALID;                                                  \
55
1
    }                                                                          \
56
925
    ptr += n;                                                                  \
57
924
    break;
58
59
#  define INVALID_CASES(ptr, nextTokPtr)                                       \
60
0
    INVALID_LEAD_CASE(2, ptr, nextTokPtr)                                      \
61
925
    INVALID_LEAD_CASE(3, ptr, nextTokPtr)                                      \
62
924
    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
242k
  case BT_NONASCII:                                                            \
82
242k
    if (! IS_NAME_CHAR_MINBPC(enc, ptr)) {                                     \
83
0
      *nextTokPtr = ptr;                                                       \
84
0
      return XML_TOK_INVALID;                                                  \
85
0
    }                                                                          \
86
242k
    /* fall through */                                                         \
87
242k
  case BT_NMSTRT:                                                              \
88
242k
  case BT_HEX:                                                                 \
89
242k
  case BT_DIGIT:                                                               \
90
242k
  case BT_NAME:                                                                \
91
242k
  case BT_MINUS:                                                               \
92
242k
    ptr += MINBPC(enc);                                                        \
93
242k
    break;                                                                     \
94
242k
    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
68.1k
  case BT_NONASCII:                                                            \
111
68.1k
    if (! IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {                                   \
112
0
      *nextTokPtr = ptr;                                                       \
113
0
      return XML_TOK_INVALID;                                                  \
114
0
    }                                                                          \
115
68.1k
    /* fall through */                                                         \
116
68.1k
  case BT_NMSTRT:                                                              \
117
68.1k
  case BT_HEX:                                                                 \
118
68.1k
    ptr += MINBPC(enc);                                                        \
119
68.1k
    break;                                                                     \
120
68.1k
    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
9.25M
    ((end) - (ptr) >= ((count) * MINBPC(enc)))
130
131
490k
#  define HAS_CHAR(enc, ptr, end) HAS_CHARS(enc, ptr, end, 1)
132
133
#  define REQUIRE_CHARS(enc, ptr, end, count)                                  \
134
5.00M
    {                                                                          \
135
5.00M
      if (! HAS_CHARS(enc, ptr, end, count)) {                                 \
136
0
        return XML_TOK_PARTIAL;                                                \
137
0
      }                                                                        \
138
5.00M
    }
139
140
5.00M
#  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
209
                      int *tokPtr) {
233
209
  int upper = 0;
234
209
  UNUSED_P(enc);
235
209
  *tokPtr = XML_TOK_PI;
236
209
  if (end - ptr != MINBPC(enc) * 3)
237
0
    return 1;
238
209
  switch (BYTE_TO_ASCII(enc, ptr)) {
239
209
  case ASCII_x:
240
209
    break;
241
0
  case ASCII_X:
242
0
    upper = 1;
243
0
    break;
244
0
  default:
245
0
    return 1;
246
209
  }
247
209
  ptr += MINBPC(enc);
248
209
  switch (BYTE_TO_ASCII(enc, ptr)) {
249
209
  case ASCII_m:
250
209
    break;
251
0
  case ASCII_M:
252
0
    upper = 1;
253
0
    break;
254
0
  default:
255
0
    return 1;
256
209
  }
257
209
  ptr += MINBPC(enc);
258
209
  switch (BYTE_TO_ASCII(enc, ptr)) {
259
209
  case ASCII_l:
260
209
    break;
261
0
  case ASCII_L:
262
0
    upper = 1;
263
0
    break;
264
0
  default:
265
0
    return 1;
266
209
  }
267
209
  if (upper)
268
0
    return 0;
269
209
  *tokPtr = XML_TOK_XML_DECL;
270
209
  return 1;
271
209
}
xmltok.c:normal_checkPiTarget
Line
Count
Source
232
209
                      int *tokPtr) {
233
209
  int upper = 0;
234
209
  UNUSED_P(enc);
235
209
  *tokPtr = XML_TOK_PI;
236
209
  if (end - ptr != MINBPC(enc) * 3)
237
0
    return 1;
238
209
  switch (BYTE_TO_ASCII(enc, ptr)) {
239
209
  case ASCII_x:
240
209
    break;
241
0
  case ASCII_X:
242
0
    upper = 1;
243
0
    break;
244
0
  default:
245
0
    return 1;
246
209
  }
247
209
  ptr += MINBPC(enc);
248
209
  switch (BYTE_TO_ASCII(enc, ptr)) {
249
209
  case ASCII_m:
250
209
    break;
251
0
  case ASCII_M:
252
0
    upper = 1;
253
0
    break;
254
0
  default:
255
0
    return 1;
256
209
  }
257
209
  ptr += MINBPC(enc);
258
209
  switch (BYTE_TO_ASCII(enc, ptr)) {
259
209
  case ASCII_l:
260
209
    break;
261
0
  case ASCII_L:
262
0
    upper = 1;
263
0
    break;
264
0
  default:
265
0
    return 1;
266
209
  }
267
209
  if (upper)
268
0
    return 0;
269
209
  *tokPtr = XML_TOK_XML_DECL;
270
209
  return 1;
271
209
}
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
209
               const char **nextTokPtr) {
278
209
  int tok;
279
209
  const char *target = ptr;
280
209
  REQUIRE_CHAR(enc, ptr, end);
281
209
  switch (BYTE_TYPE(enc, ptr)) {
282
209
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
283
0
  default:
284
0
    *nextTokPtr = ptr;
285
0
    return XML_TOK_INVALID;
286
209
  }
287
627
  while (HAS_CHAR(enc, ptr, end)) {
288
627
    switch (BYTE_TYPE(enc, ptr)) {
289
1.67k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
290
209
    case BT_S:
291
209
    case BT_CR:
292
209
    case BT_LF:
293
209
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
294
0
        *nextTokPtr = ptr;
295
0
        return XML_TOK_INVALID;
296
0
      }
297
209
      ptr += MINBPC(enc);
298
6.47k
      while (HAS_CHAR(enc, ptr, end)) {
299
6.47k
        switch (BYTE_TYPE(enc, ptr)) {
300
0
          INVALID_CASES(ptr, nextTokPtr)
301
209
        case BT_QUEST:
302
209
          ptr += MINBPC(enc);
303
209
          REQUIRE_CHAR(enc, ptr, end);
304
209
          if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
305
209
            *nextTokPtr = ptr + MINBPC(enc);
306
209
            return tok;
307
209
          }
308
0
          break;
309
6.27k
        default:
310
6.27k
          ptr += MINBPC(enc);
311
6.27k
          break;
312
6.47k
        }
313
6.47k
      }
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
627
    }
331
627
  }
332
0
  return XML_TOK_PARTIAL;
333
209
}
xmltok.c:normal_scanPi
Line
Count
Source
277
209
               const char **nextTokPtr) {
278
209
  int tok;
279
209
  const char *target = ptr;
280
209
  REQUIRE_CHAR(enc, ptr, end);
281
209
  switch (BYTE_TYPE(enc, ptr)) {
282
209
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
283
0
  default:
284
0
    *nextTokPtr = ptr;
285
0
    return XML_TOK_INVALID;
286
209
  }
287
627
  while (HAS_CHAR(enc, ptr, end)) {
288
627
    switch (BYTE_TYPE(enc, ptr)) {
289
1.67k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
290
209
    case BT_S:
291
209
    case BT_CR:
292
209
    case BT_LF:
293
209
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
294
0
        *nextTokPtr = ptr;
295
0
        return XML_TOK_INVALID;
296
0
      }
297
209
      ptr += MINBPC(enc);
298
6.47k
      while (HAS_CHAR(enc, ptr, end)) {
299
6.47k
        switch (BYTE_TYPE(enc, ptr)) {
300
0
          INVALID_CASES(ptr, nextTokPtr)
301
209
        case BT_QUEST:
302
209
          ptr += MINBPC(enc);
303
209
          REQUIRE_CHAR(enc, ptr, end);
304
209
          if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
305
209
            *nextTokPtr = ptr + MINBPC(enc);
306
209
            return tok;
307
209
          }
308
0
          break;
309
6.27k
        default:
310
6.27k
          ptr += MINBPC(enc);
311
6.27k
          break;
312
6.47k
        }
313
6.47k
      }
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
627
    }
331
627
  }
332
0
  return XML_TOK_PARTIAL;
333
209
}
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
223
                   const char **nextTokPtr) {
433
223
  REQUIRE_CHAR(enc, ptr, end);
434
223
  switch (BYTE_TYPE(enc, ptr)) {
435
71
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
436
1
  default:
437
1
    *nextTokPtr = ptr;
438
1
    return XML_TOK_INVALID;
439
223
  }
440
3.36k
  while (HAS_CHAR(enc, ptr, end)) {
441
3.36k
    switch (BYTE_TYPE(enc, ptr)) {
442
11.4k
      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
222
    case BT_GT:
469
222
      *nextTokPtr = ptr + MINBPC(enc);
470
222
      return XML_TOK_END_TAG;
471
0
    default:
472
0
      *nextTokPtr = ptr;
473
0
      return XML_TOK_INVALID;
474
3.36k
    }
475
3.36k
  }
476
0
  return XML_TOK_PARTIAL;
477
222
}
xmltok.c:normal_scanEndTag
Line
Count
Source
432
223
                   const char **nextTokPtr) {
433
223
  REQUIRE_CHAR(enc, ptr, end);
434
223
  switch (BYTE_TYPE(enc, ptr)) {
435
71
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
436
1
  default:
437
1
    *nextTokPtr = ptr;
438
1
    return XML_TOK_INVALID;
439
223
  }
440
3.36k
  while (HAS_CHAR(enc, ptr, end)) {
441
3.36k
    switch (BYTE_TYPE(enc, ptr)) {
442
11.4k
      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
222
    case BT_GT:
469
222
      *nextTokPtr = ptr + MINBPC(enc);
470
222
      return XML_TOK_END_TAG;
471
0
    default:
472
0
      *nextTokPtr = ptr;
473
0
      return XML_TOK_INVALID;
474
3.36k
    }
475
3.36k
  }
476
0
  return XML_TOK_PARTIAL;
477
222
}
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
21.6k
                 const char **nextTokPtr) {
574
21.6k
#  ifdef XML_NS
575
21.6k
  int hadColon = 0;
576
21.6k
#  endif
577
213k
  while (HAS_CHAR(enc, ptr, end)) {
578
213k
    switch (BYTE_TYPE(enc, ptr)) {
579
618k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
580
0
#  ifdef XML_NS
581
64
    case BT_COLON:
582
64
      if (hadColon) {
583
0
        *nextTokPtr = ptr;
584
0
        return XML_TOK_INVALID;
585
0
      }
586
64
      hadColon = 1;
587
64
      ptr += MINBPC(enc);
588
64
      REQUIRE_CHAR(enc, ptr, end);
589
64
      switch (BYTE_TYPE(enc, ptr)) {
590
64
        CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
591
0
      default:
592
0
        *nextTokPtr = ptr;
593
0
        return XML_TOK_INVALID;
594
64
      }
595
64
      break;
596
64
#  endif
597
64
    case BT_S:
598
6
    case BT_CR:
599
6
    case BT_LF:
600
6
      for (;;) {
601
6
        int t;
602
603
6
        ptr += MINBPC(enc);
604
6
        REQUIRE_CHAR(enc, ptr, end);
605
6
        t = BYTE_TYPE(enc, ptr);
606
6
        if (t == BT_EQUALS)
607
0
          break;
608
6
        switch (t) {
609
0
        case BT_S:
610
0
        case BT_LF:
611
0
        case BT_CR:
612
0
          break;
613
6
        default:
614
6
          *nextTokPtr = ptr;
615
6
          return XML_TOK_INVALID;
616
6
        }
617
6
      }
618
      /* fall through */
619
45.9k
    case BT_EQUALS: {
620
45.9k
      int open;
621
45.9k
#  ifdef XML_NS
622
45.9k
      hadColon = 0;
623
45.9k
#  endif
624
45.9k
      for (;;) {
625
45.9k
        ptr += MINBPC(enc);
626
45.9k
        REQUIRE_CHAR(enc, ptr, end);
627
45.9k
        open = BYTE_TYPE(enc, ptr);
628
45.9k
        if (open == BT_QUOT || open == BT_APOS)
629
45.9k
          break;
630
1
        switch (open) {
631
1
        case BT_S:
632
1
        case BT_LF:
633
1
        case BT_CR:
634
1
          break;
635
0
        default:
636
0
          *nextTokPtr = ptr;
637
0
          return XML_TOK_INVALID;
638
1
        }
639
1
      }
640
45.9k
      ptr += MINBPC(enc);
641
      /* in attribute value */
642
4.81M
      for (;;) {
643
4.81M
        int t;
644
4.81M
        REQUIRE_CHAR(enc, ptr, end);
645
4.81M
        t = BYTE_TYPE(enc, ptr);
646
4.81M
        if (t == open)
647
45.9k
          break;
648
4.77M
        switch (t) {
649
1.85k
          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
5
        case BT_LT:
660
5
          *nextTokPtr = ptr;
661
5
          return XML_TOK_INVALID;
662
4.77M
        default:
663
4.77M
          ptr += MINBPC(enc);
664
4.77M
          break;
665
4.77M
        }
666
4.77M
      }
667
45.9k
      ptr += MINBPC(enc);
668
45.9k
      REQUIRE_CHAR(enc, ptr, end);
669
45.9k
      switch (BYTE_TYPE(enc, ptr)) {
670
45.2k
      case BT_S:
671
45.2k
      case BT_CR:
672
45.2k
      case BT_LF:
673
45.2k
        break;
674
279
      case BT_SOL:
675
279
        goto sol;
676
338
      case BT_GT:
677
338
        goto gt;
678
22
      default:
679
22
        *nextTokPtr = ptr;
680
22
        return XML_TOK_INVALID;
681
45.9k
      }
682
      /* ptr points to closing quote */
683
45.2k
      for (;;) {
684
45.2k
        ptr += MINBPC(enc);
685
45.2k
        REQUIRE_CHAR(enc, ptr, end);
686
45.2k
        switch (BYTE_TYPE(enc, ptr)) {
687
3.95k
          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
338
        gt:
694
338
          *nextTokPtr = ptr + MINBPC(enc);
695
338
          return XML_TOK_START_TAG_WITH_ATTS;
696
21.0k
        case BT_SOL:
697
21.3k
        sol:
698
21.3k
          ptr += MINBPC(enc);
699
21.3k
          REQUIRE_CHAR(enc, ptr, end);
700
21.3k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
701
2
            *nextTokPtr = ptr;
702
2
            return XML_TOK_INVALID;
703
2
          }
704
21.3k
          *nextTokPtr = ptr + MINBPC(enc);
705
21.3k
          return XML_TOK_EMPTY_ELEMENT_WITH_ATTS;
706
7
        default:
707
7
          *nextTokPtr = ptr;
708
7
          return XML_TOK_INVALID;
709
45.2k
        }
710
24.2k
        break;
711
45.2k
      }
712
24.2k
      break;
713
45.2k
    }
714
24.2k
    default:
715
7
      *nextTokPtr = ptr;
716
7
      return XML_TOK_INVALID;
717
213k
    }
718
213k
  }
719
0
  return XML_TOK_PARTIAL;
720
21.6k
}
xmltok.c:normal_scanAtts
Line
Count
Source
573
21.6k
                 const char **nextTokPtr) {
574
21.6k
#  ifdef XML_NS
575
21.6k
  int hadColon = 0;
576
21.6k
#  endif
577
213k
  while (HAS_CHAR(enc, ptr, end)) {
578
213k
    switch (BYTE_TYPE(enc, ptr)) {
579
618k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
580
0
#  ifdef XML_NS
581
64
    case BT_COLON:
582
64
      if (hadColon) {
583
0
        *nextTokPtr = ptr;
584
0
        return XML_TOK_INVALID;
585
0
      }
586
64
      hadColon = 1;
587
64
      ptr += MINBPC(enc);
588
64
      REQUIRE_CHAR(enc, ptr, end);
589
64
      switch (BYTE_TYPE(enc, ptr)) {
590
64
        CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
591
0
      default:
592
0
        *nextTokPtr = ptr;
593
0
        return XML_TOK_INVALID;
594
64
      }
595
64
      break;
596
64
#  endif
597
64
    case BT_S:
598
6
    case BT_CR:
599
6
    case BT_LF:
600
6
      for (;;) {
601
6
        int t;
602
603
6
        ptr += MINBPC(enc);
604
6
        REQUIRE_CHAR(enc, ptr, end);
605
6
        t = BYTE_TYPE(enc, ptr);
606
6
        if (t == BT_EQUALS)
607
0
          break;
608
6
        switch (t) {
609
0
        case BT_S:
610
0
        case BT_LF:
611
0
        case BT_CR:
612
0
          break;
613
6
        default:
614
6
          *nextTokPtr = ptr;
615
6
          return XML_TOK_INVALID;
616
6
        }
617
6
      }
618
      /* fall through */
619
45.9k
    case BT_EQUALS: {
620
45.9k
      int open;
621
45.9k
#  ifdef XML_NS
622
45.9k
      hadColon = 0;
623
45.9k
#  endif
624
45.9k
      for (;;) {
625
45.9k
        ptr += MINBPC(enc);
626
45.9k
        REQUIRE_CHAR(enc, ptr, end);
627
45.9k
        open = BYTE_TYPE(enc, ptr);
628
45.9k
        if (open == BT_QUOT || open == BT_APOS)
629
45.9k
          break;
630
1
        switch (open) {
631
1
        case BT_S:
632
1
        case BT_LF:
633
1
        case BT_CR:
634
1
          break;
635
0
        default:
636
0
          *nextTokPtr = ptr;
637
0
          return XML_TOK_INVALID;
638
1
        }
639
1
      }
640
45.9k
      ptr += MINBPC(enc);
641
      /* in attribute value */
642
4.81M
      for (;;) {
643
4.81M
        int t;
644
4.81M
        REQUIRE_CHAR(enc, ptr, end);
645
4.81M
        t = BYTE_TYPE(enc, ptr);
646
4.81M
        if (t == open)
647
45.9k
          break;
648
4.77M
        switch (t) {
649
1.85k
          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
5
        case BT_LT:
660
5
          *nextTokPtr = ptr;
661
5
          return XML_TOK_INVALID;
662
4.77M
        default:
663
4.77M
          ptr += MINBPC(enc);
664
4.77M
          break;
665
4.77M
        }
666
4.77M
      }
667
45.9k
      ptr += MINBPC(enc);
668
45.9k
      REQUIRE_CHAR(enc, ptr, end);
669
45.9k
      switch (BYTE_TYPE(enc, ptr)) {
670
45.2k
      case BT_S:
671
45.2k
      case BT_CR:
672
45.2k
      case BT_LF:
673
45.2k
        break;
674
279
      case BT_SOL:
675
279
        goto sol;
676
338
      case BT_GT:
677
338
        goto gt;
678
22
      default:
679
22
        *nextTokPtr = ptr;
680
22
        return XML_TOK_INVALID;
681
45.9k
      }
682
      /* ptr points to closing quote */
683
45.2k
      for (;;) {
684
45.2k
        ptr += MINBPC(enc);
685
45.2k
        REQUIRE_CHAR(enc, ptr, end);
686
45.2k
        switch (BYTE_TYPE(enc, ptr)) {
687
3.95k
          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
338
        gt:
694
338
          *nextTokPtr = ptr + MINBPC(enc);
695
338
          return XML_TOK_START_TAG_WITH_ATTS;
696
21.0k
        case BT_SOL:
697
21.3k
        sol:
698
21.3k
          ptr += MINBPC(enc);
699
21.3k
          REQUIRE_CHAR(enc, ptr, end);
700
21.3k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
701
2
            *nextTokPtr = ptr;
702
2
            return XML_TOK_INVALID;
703
2
          }
704
21.3k
          *nextTokPtr = ptr + MINBPC(enc);
705
21.3k
          return XML_TOK_EMPTY_ELEMENT_WITH_ATTS;
706
7
        default:
707
7
          *nextTokPtr = ptr;
708
7
          return XML_TOK_INVALID;
709
45.2k
        }
710
24.2k
        break;
711
45.2k
      }
712
24.2k
      break;
713
45.2k
    }
714
24.2k
    default:
715
7
      *nextTokPtr = ptr;
716
7
      return XML_TOK_INVALID;
717
213k
    }
718
213k
  }
719
0
  return XML_TOK_PARTIAL;
720
21.6k
}
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
21.9k
               const char **nextTokPtr) {
727
21.9k
#  ifdef XML_NS
728
21.9k
  int hadColon;
729
21.9k
#  endif
730
21.9k
  REQUIRE_CHAR(enc, ptr, end);
731
21.9k
  switch (BYTE_TYPE(enc, ptr)) {
732
21.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
223
  case BT_SOL:
747
223
    return PREFIX(scanEndTag)(enc, ptr + MINBPC(enc), end, nextTokPtr);
748
1
  default:
749
1
    *nextTokPtr = ptr;
750
1
    return XML_TOK_INVALID;
751
21.9k
  }
752
21.6k
#  ifdef XML_NS
753
21.6k
  hadColon = 0;
754
21.6k
#  endif
755
  /* we have a start-tag */
756
92.5k
  while (HAS_CHAR(enc, ptr, end)) {
757
92.5k
    switch (BYTE_TYPE(enc, ptr)) {
758
260k
      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
21.6k
    case BT_S:
777
21.6k
    case BT_CR:
778
21.6k
    case BT_LF: {
779
21.6k
      ptr += MINBPC(enc);
780
21.6k
      while (HAS_CHAR(enc, ptr, end)) {
781
21.6k
        switch (BYTE_TYPE(enc, ptr)) {
782
553
          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
21.6k
        }
796
21.6k
        return PREFIX(scanAtts)(enc, ptr, end, nextTokPtr);
797
21.6k
      }
798
0
      return XML_TOK_PARTIAL;
799
21.6k
    }
800
0
    case BT_GT:
801
0
    gt:
802
0
      *nextTokPtr = ptr + MINBPC(enc);
803
0
      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
2
    default:
815
2
      *nextTokPtr = ptr;
816
2
      return XML_TOK_INVALID;
817
92.5k
    }
818
92.5k
  }
819
0
  return XML_TOK_PARTIAL;
820
21.6k
}
xmltok.c:normal_scanLt
Line
Count
Source
726
21.9k
               const char **nextTokPtr) {
727
21.9k
#  ifdef XML_NS
728
21.9k
  int hadColon;
729
21.9k
#  endif
730
21.9k
  REQUIRE_CHAR(enc, ptr, end);
731
21.9k
  switch (BYTE_TYPE(enc, ptr)) {
732
21.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
223
  case BT_SOL:
747
223
    return PREFIX(scanEndTag)(enc, ptr + MINBPC(enc), end, nextTokPtr);
748
1
  default:
749
1
    *nextTokPtr = ptr;
750
1
    return XML_TOK_INVALID;
751
21.9k
  }
752
21.6k
#  ifdef XML_NS
753
21.6k
  hadColon = 0;
754
21.6k
#  endif
755
  /* we have a start-tag */
756
92.5k
  while (HAS_CHAR(enc, ptr, end)) {
757
92.5k
    switch (BYTE_TYPE(enc, ptr)) {
758
260k
      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
21.6k
    case BT_S:
777
21.6k
    case BT_CR:
778
21.6k
    case BT_LF: {
779
21.6k
      ptr += MINBPC(enc);
780
21.6k
      while (HAS_CHAR(enc, ptr, end)) {
781
21.6k
        switch (BYTE_TYPE(enc, ptr)) {
782
553
          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
21.6k
        }
796
21.6k
        return PREFIX(scanAtts)(enc, ptr, end, nextTokPtr);
797
21.6k
      }
798
0
      return XML_TOK_PARTIAL;
799
21.6k
    }
800
0
    case BT_GT:
801
0
    gt:
802
0
      *nextTokPtr = ptr + MINBPC(enc);
803
0
      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
2
    default:
815
2
      *nextTokPtr = ptr;
816
2
      return XML_TOK_INVALID;
817
92.5k
    }
818
92.5k
  }
819
0
  return XML_TOK_PARTIAL;
820
21.6k
}
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
62.8k
                   const char **nextTokPtr) {
825
62.8k
  if (ptr >= end)
826
0
    return XML_TOK_NONE;
827
62.8k
  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
62.8k
  switch (BYTE_TYPE(enc, ptr)) {
837
21.9k
  case BT_LT:
838
21.9k
    return PREFIX(scanLt)(enc, ptr + MINBPC(enc), end, nextTokPtr);
839
0
  case BT_AMP:
840
0
    return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
841
488
  case BT_CR:
842
488
    ptr += MINBPC(enc);
843
488
    if (! HAS_CHAR(enc, ptr, end))
844
0
      return XML_TOK_TRAILING_CR;
845
488
    if (BYTE_TYPE(enc, ptr) == BT_LF)
846
488
      ptr += MINBPC(enc);
847
488
    *nextTokPtr = ptr;
848
488
    return XML_TOK_DATA_NEWLINE;
849
19.2k
  case BT_LF:
850
19.2k
    *nextTokPtr = ptr + MINBPC(enc);
851
19.2k
    return XML_TOK_DATA_NEWLINE;
852
0
  case BT_RSQB:
853
0
    ptr += MINBPC(enc);
854
0
    if (! HAS_CHAR(enc, ptr, end))
855
0
      return XML_TOK_TRAILING_RSQB;
856
0
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
857
0
      break;
858
0
    ptr += MINBPC(enc);
859
0
    if (! HAS_CHAR(enc, ptr, end))
860
0
      return XML_TOK_TRAILING_RSQB;
861
0
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
862
0
      ptr -= MINBPC(enc);
863
0
      break;
864
0
    }
865
0
    *nextTokPtr = ptr;
866
0
    return XML_TOK_INVALID;
867
0
    INVALID_CASES(ptr, nextTokPtr)
868
21.1k
  default:
869
21.1k
    ptr += MINBPC(enc);
870
21.1k
    break;
871
62.8k
  }
872
44.3k
  while (HAS_CHAR(enc, ptr, end)) {
873
44.3k
    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
20.6k
    case BT_LT:
904
20.6k
    case BT_NONXML:
905
20.6k
    case BT_MALFORM:
906
20.6k
    case BT_TRAIL:
907
20.6k
    case BT_CR:
908
21.1k
    case BT_LF:
909
21.1k
      *nextTokPtr = ptr;
910
21.1k
      return XML_TOK_DATA_CHARS;
911
23.2k
    default:
912
23.2k
      ptr += MINBPC(enc);
913
23.2k
      break;
914
44.3k
    }
915
44.3k
  }
916
0
  *nextTokPtr = ptr;
917
0
  return XML_TOK_DATA_CHARS;
918
21.1k
}
xmltok.c:normal_contentTok
Line
Count
Source
824
62.8k
                   const char **nextTokPtr) {
825
62.8k
  if (ptr >= end)
826
0
    return XML_TOK_NONE;
827
62.8k
  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
62.8k
  switch (BYTE_TYPE(enc, ptr)) {
837
21.9k
  case BT_LT:
838
21.9k
    return PREFIX(scanLt)(enc, ptr + MINBPC(enc), end, nextTokPtr);
839
0
  case BT_AMP:
840
0
    return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
841
488
  case BT_CR:
842
488
    ptr += MINBPC(enc);
843
488
    if (! HAS_CHAR(enc, ptr, end))
844
0
      return XML_TOK_TRAILING_CR;
845
488
    if (BYTE_TYPE(enc, ptr) == BT_LF)
846
488
      ptr += MINBPC(enc);
847
488
    *nextTokPtr = ptr;
848
488
    return XML_TOK_DATA_NEWLINE;
849
19.2k
  case BT_LF:
850
19.2k
    *nextTokPtr = ptr + MINBPC(enc);
851
19.2k
    return XML_TOK_DATA_NEWLINE;
852
0
  case BT_RSQB:
853
0
    ptr += MINBPC(enc);
854
0
    if (! HAS_CHAR(enc, ptr, end))
855
0
      return XML_TOK_TRAILING_RSQB;
856
0
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
857
0
      break;
858
0
    ptr += MINBPC(enc);
859
0
    if (! HAS_CHAR(enc, ptr, end))
860
0
      return XML_TOK_TRAILING_RSQB;
861
0
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
862
0
      ptr -= MINBPC(enc);
863
0
      break;
864
0
    }
865
0
    *nextTokPtr = ptr;
866
0
    return XML_TOK_INVALID;
867
0
    INVALID_CASES(ptr, nextTokPtr)
868
21.1k
  default:
869
21.1k
    ptr += MINBPC(enc);
870
21.1k
    break;
871
62.8k
  }
872
44.3k
  while (HAS_CHAR(enc, ptr, end)) {
873
44.3k
    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
20.6k
    case BT_LT:
904
20.6k
    case BT_NONXML:
905
20.6k
    case BT_MALFORM:
906
20.6k
    case BT_TRAIL:
907
20.6k
    case BT_CR:
908
21.1k
    case BT_LF:
909
21.1k
      *nextTokPtr = ptr;
910
21.1k
      return XML_TOK_DATA_CHARS;
911
23.2k
    default:
912
23.2k
      ptr += MINBPC(enc);
913
23.2k
      break;
914
44.3k
    }
915
44.3k
  }
916
0
  *nextTokPtr = ptr;
917
0
  return XML_TOK_DATA_CHARS;
918
21.1k
}
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.12k
                  const char **nextTokPtr) {
1019
1.12k
  int tok;
1020
1.12k
  if (ptr >= end)
1021
213
    return XML_TOK_NONE;
1022
909
  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
909
  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
482
  case BT_LT: {
1037
482
    ptr += MINBPC(enc);
1038
482
    REQUIRE_CHAR(enc, ptr, end);
1039
482
    switch (BYTE_TYPE(enc, ptr)) {
1040
0
    case BT_EXCL:
1041
0
      return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1042
209
    case BT_QUEST:
1043
209
      return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1044
71
    case BT_NMSTRT:
1045
273
    case BT_HEX:
1046
273
    case BT_NONASCII:
1047
273
    case BT_LEAD2:
1048
273
    case BT_LEAD3:
1049
273
    case BT_LEAD4:
1050
273
      *nextTokPtr = ptr - MINBPC(enc);
1051
273
      return XML_TOK_INSTANCE_START;
1052
482
    }
1053
0
    *nextTokPtr = ptr;
1054
0
    return XML_TOK_INVALID;
1055
482
  }
1056
417
  case BT_CR:
1057
417
    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
417
  case BT_S:
1064
424
  case BT_LF:
1065
841
    for (;;) {
1066
841
      ptr += MINBPC(enc);
1067
841
      if (! HAS_CHAR(enc, ptr, end))
1068
213
        break;
1069
628
      switch (BYTE_TYPE(enc, ptr)) {
1070
0
      case BT_S:
1071
417
      case BT_LF:
1072
417
        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
211
      default:
1079
211
        *nextTokPtr = ptr;
1080
211
        return XML_TOK_PROLOG_S;
1081
628
      }
1082
628
    }
1083
213
    *nextTokPtr = ptr;
1084
213
    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
1
  case BT_NMSTRT:
1168
1
  case BT_HEX:
1169
1
    tok = XML_TOK_NAME;
1170
1
    ptr += MINBPC(enc);
1171
1
    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
2
  default:
1194
2
    *nextTokPtr = ptr;
1195
2
    return XML_TOK_INVALID;
1196
909
  }
1197
10
  while (HAS_CHAR(enc, ptr, end)) {
1198
10
    switch (BYTE_TYPE(enc, ptr)) {
1199
31
      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
1
    case BT_S:
1207
1
    case BT_CR:
1208
1
    case BT_LF:
1209
1
      *nextTokPtr = ptr;
1210
1
      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
10
    }
1256
10
  }
1257
0
  return -tok;
1258
1
}
xmltok.c:normal_prologTok
Line
Count
Source
1018
1.12k
                  const char **nextTokPtr) {
1019
1.12k
  int tok;
1020
1.12k
  if (ptr >= end)
1021
213
    return XML_TOK_NONE;
1022
909
  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
909
  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
482
  case BT_LT: {
1037
482
    ptr += MINBPC(enc);
1038
482
    REQUIRE_CHAR(enc, ptr, end);
1039
482
    switch (BYTE_TYPE(enc, ptr)) {
1040
0
    case BT_EXCL:
1041
0
      return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1042
209
    case BT_QUEST:
1043
209
      return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1044
71
    case BT_NMSTRT:
1045
273
    case BT_HEX:
1046
273
    case BT_NONASCII:
1047
273
    case BT_LEAD2:
1048
273
    case BT_LEAD3:
1049
273
    case BT_LEAD4:
1050
273
      *nextTokPtr = ptr - MINBPC(enc);
1051
273
      return XML_TOK_INSTANCE_START;
1052
482
    }
1053
0
    *nextTokPtr = ptr;
1054
0
    return XML_TOK_INVALID;
1055
482
  }
1056
417
  case BT_CR:
1057
417
    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
417
  case BT_S:
1064
424
  case BT_LF:
1065
841
    for (;;) {
1066
841
      ptr += MINBPC(enc);
1067
841
      if (! HAS_CHAR(enc, ptr, end))
1068
213
        break;
1069
628
      switch (BYTE_TYPE(enc, ptr)) {
1070
0
      case BT_S:
1071
417
      case BT_LF:
1072
417
        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
211
      default:
1079
211
        *nextTokPtr = ptr;
1080
211
        return XML_TOK_PROLOG_S;
1081
628
      }
1082
628
    }
1083
213
    *nextTokPtr = ptr;
1084
213
    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
1
  case BT_NMSTRT:
1168
1
  case BT_HEX:
1169
1
    tok = XML_TOK_NAME;
1170
1
    ptr += MINBPC(enc);
1171
1
    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
2
  default:
1194
2
    *nextTokPtr = ptr;
1195
2
    return XML_TOK_INVALID;
1196
909
  }
1197
10
  while (HAS_CHAR(enc, ptr, end)) {
1198
10
    switch (BYTE_TYPE(enc, ptr)) {
1199
31
      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
1
    case BT_S:
1207
1
    case BT_CR:
1208
1
    case BT_LF:
1209
1
      *nextTokPtr = ptr;
1210
1
      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
10
    }
1256
10
  }
1257
0
  return -tok;
1258
1
}
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
491k
                          const char **nextTokPtr) {
1263
491k
  const char *start;
1264
491k
  if (ptr >= end)
1265
2.59k
    return XML_TOK_NONE;
1266
489k
  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
489k
  start = ptr;
1275
3.37M
  while (HAS_CHAR(enc, ptr, end)) {
1276
3.37M
    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
27.8k
    case BT_LF:
1295
27.8k
      if (ptr == start) {
1296
13.9k
        *nextTokPtr = ptr + MINBPC(enc);
1297
13.9k
        return XML_TOK_DATA_NEWLINE;
1298
13.9k
      }
1299
13.9k
      *nextTokPtr = ptr;
1300
13.9k
      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
458k
    case BT_S:
1314
458k
      if (ptr == start) {
1315
244k
        *nextTokPtr = ptr + MINBPC(enc);
1316
244k
        return XML_TOK_ATTRIBUTE_VALUE_S;
1317
244k
      }
1318
214k
      *nextTokPtr = ptr;
1319
214k
      return XML_TOK_DATA_CHARS;
1320
2.88M
    default:
1321
2.88M
      ptr += MINBPC(enc);
1322
2.88M
      break;
1323
3.37M
    }
1324
3.37M
  }
1325
2.51k
  *nextTokPtr = ptr;
1326
2.51k
  return XML_TOK_DATA_CHARS;
1327
489k
}
xmltok.c:normal_attributeValueTok
Line
Count
Source
1262
491k
                          const char **nextTokPtr) {
1263
491k
  const char *start;
1264
491k
  if (ptr >= end)
1265
2.59k
    return XML_TOK_NONE;
1266
489k
  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
489k
  start = ptr;
1275
3.37M
  while (HAS_CHAR(enc, ptr, end)) {
1276
3.37M
    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
27.8k
    case BT_LF:
1295
27.8k
      if (ptr == start) {
1296
13.9k
        *nextTokPtr = ptr + MINBPC(enc);
1297
13.9k
        return XML_TOK_DATA_NEWLINE;
1298
13.9k
      }
1299
13.9k
      *nextTokPtr = ptr;
1300
13.9k
      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
458k
    case BT_S:
1314
458k
      if (ptr == start) {
1315
244k
        *nextTokPtr = ptr + MINBPC(enc);
1316
244k
        return XML_TOK_ATTRIBUTE_VALUE_S;
1317
244k
      }
1318
214k
      *nextTokPtr = ptr;
1319
214k
      return XML_TOK_DATA_CHARS;
1320
2.88M
    default:
1321
2.88M
      ptr += MINBPC(enc);
1322
2.88M
      break;
1323
3.37M
    }
1324
3.37M
  }
1325
2.51k
  *nextTokPtr = ptr;
1326
2.51k
  return XML_TOK_DATA_CHARS;
1327
489k
}
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
21.6k
                ATTRIBUTE *atts) {
1511
21.6k
  enum { other, inName, inValue } state = inName;
1512
21.6k
  int nAtts = 0;
1513
21.6k
  int open = 0; /* defined when state == inValue;
1514
                   initialization just to shut up compilers */
1515
1516
5.25M
  for (ptr += MINBPC(enc);; ptr += MINBPC(enc)) {
1517
5.25M
    switch (BYTE_TYPE(enc, ptr)) {
1518
0
#  define START_NAME                                                           \
1519
548k
    if (state == other) {                                                      \
1520
45.8k
      if (nAtts < attsMax) {                                                   \
1521
45.8k
        atts[nAtts].name = ptr;                                                \
1522
45.8k
        atts[nAtts].normalized = 1;                                            \
1523
45.8k
      }                                                                        \
1524
45.8k
      state = inName;                                                          \
1525
45.8k
    }
1526
0
#  define LEAD_CASE(n)                                                         \
1527
924
  case BT_LEAD##n: /* NOTE: The encoding has already been validated. */        \
1528
924
    START_NAME ptr += (n - MINBPC(enc));                                       \
1529
924
    break;
1530
0
      LEAD_CASE(2)
1531
924
      LEAD_CASE(3)
1532
0
      LEAD_CASE(4)
1533
0
#  undef LEAD_CASE
1534
0
    case BT_NONASCII:
1535
285k
    case BT_NMSTRT:
1536
547k
    case BT_HEX:
1537
547k
      START_NAME
1538
547k
      break;
1539
0
#  undef START_NAME
1540
91.7k
    case BT_QUOT:
1541
91.7k
      if (state != inValue) {
1542
45.8k
        if (nAtts < attsMax)
1543
45.8k
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1544
45.8k
        state = inValue;
1545
45.8k
        open = BT_QUOT;
1546
45.8k
      } else if (open == BT_QUOT) {
1547
45.8k
        state = other;
1548
45.8k
        if (nAtts < attsMax)
1549
45.8k
          atts[nAtts].valueEnd = ptr;
1550
45.8k
        nAtts++;
1551
45.8k
      }
1552
91.7k
      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
447k
    case BT_S:
1571
447k
      if (state == inName)
1572
21.6k
        state = other;
1573
425k
      else if (state == inValue && nAtts < attsMax && atts[nAtts].normalized
1574
159k
               && (ptr == atts[nAtts].valuePtr
1575
159k
                   || BYTE_TO_ASCII(enc, ptr) != ASCII_SPACE
1576
159k
                   || BYTE_TO_ASCII(enc, ptr + MINBPC(enc)) == ASCII_SPACE
1577
158k
                   || BYTE_TYPE(enc, ptr + MINBPC(enc)) == open))
1578
1.35k
        atts[nAtts].normalized = 0;
1579
447k
      break;
1580
0
    case BT_CR:
1581
13.9k
    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
13.9k
      if (state == inName)
1585
0
        state = other;
1586
13.9k
      else if (state == inValue && nAtts < attsMax)
1587
13.9k
        atts[nAtts].normalized = 0;
1588
13.9k
      break;
1589
338
    case BT_GT:
1590
25.7k
    case BT_SOL:
1591
25.7k
      if (state != inValue)
1592
21.6k
        return nAtts;
1593
4.10k
      break;
1594
4.12M
    default:
1595
4.12M
      break;
1596
5.25M
    }
1597
5.25M
  }
1598
  /* not reached */
1599
21.6k
}
xmltok.c:normal_getAtts
Line
Count
Source
1510
21.6k
                ATTRIBUTE *atts) {
1511
21.6k
  enum { other, inName, inValue } state = inName;
1512
21.6k
  int nAtts = 0;
1513
21.6k
  int open = 0; /* defined when state == inValue;
1514
                   initialization just to shut up compilers */
1515
1516
5.25M
  for (ptr += MINBPC(enc);; ptr += MINBPC(enc)) {
1517
5.25M
    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
924
      LEAD_CASE(3)
1532
0
      LEAD_CASE(4)
1533
0
#  undef LEAD_CASE
1534
0
    case BT_NONASCII:
1535
285k
    case BT_NMSTRT:
1536
547k
    case BT_HEX:
1537
547k
      START_NAME
1538
547k
      break;
1539
0
#  undef START_NAME
1540
91.7k
    case BT_QUOT:
1541
91.7k
      if (state != inValue) {
1542
45.8k
        if (nAtts < attsMax)
1543
45.8k
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1544
45.8k
        state = inValue;
1545
45.8k
        open = BT_QUOT;
1546
45.8k
      } else if (open == BT_QUOT) {
1547
45.8k
        state = other;
1548
45.8k
        if (nAtts < attsMax)
1549
45.8k
          atts[nAtts].valueEnd = ptr;
1550
45.8k
        nAtts++;
1551
45.8k
      }
1552
91.7k
      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
447k
    case BT_S:
1571
447k
      if (state == inName)
1572
21.6k
        state = other;
1573
425k
      else if (state == inValue && nAtts < attsMax && atts[nAtts].normalized
1574
159k
               && (ptr == atts[nAtts].valuePtr
1575
159k
                   || BYTE_TO_ASCII(enc, ptr) != ASCII_SPACE
1576
159k
                   || BYTE_TO_ASCII(enc, ptr + MINBPC(enc)) == ASCII_SPACE
1577
158k
                   || BYTE_TYPE(enc, ptr + MINBPC(enc)) == open))
1578
1.35k
        atts[nAtts].normalized = 0;
1579
447k
      break;
1580
0
    case BT_CR:
1581
13.9k
    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
13.9k
      if (state == inName)
1585
0
        state = other;
1586
13.9k
      else if (state == inValue && nAtts < attsMax)
1587
13.9k
        atts[nAtts].normalized = 0;
1588
13.9k
      break;
1589
338
    case BT_GT:
1590
25.7k
    case BT_SOL:
1591
25.7k
      if (state != inValue)
1592
21.6k
        return nAtts;
1593
4.10k
      break;
1594
4.12M
    default:
1595
4.12M
      break;
1596
5.25M
    }
1597
5.25M
  }
1598
  /* not reached */
1599
21.6k
}
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
418
                         const char *end1, const char *ptr2) {
1716
418
  UNUSED_P(enc);
1717
3.55k
  for (; *ptr2; ptr1 += MINBPC(enc), ptr2++) {
1718
3.13k
    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
3.13k
    if (! CHAR_MATCHES(enc, ptr1, *ptr2))
1727
0
      return 0;
1728
3.13k
  }
1729
418
  return ptr1 == end1;
1730
418
}
xmltok.c:normal_nameMatchesAscii
Line
Count
Source
1715
418
                         const char *end1, const char *ptr2) {
1716
418
  UNUSED_P(enc);
1717
3.55k
  for (; *ptr2; ptr1 += MINBPC(enc), ptr2++) {
1718
3.13k
    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
3.13k
    if (! CHAR_MATCHES(enc, ptr1, *ptr2))
1727
0
      return 0;
1728
3.13k
  }
1729
418
  return ptr1 == end1;
1730
418
}
Unexecuted instantiation: xmltok.c:little2_nameMatchesAscii
Unexecuted instantiation: xmltok.c:big2_nameMatchesAscii
1731
1732
static int PTRFASTCALL
1733
67.7k
PREFIX(nameLength)(const ENCODING *enc, const char *ptr) {
1734
67.7k
  const char *start = ptr;
1735
376k
  for (;;) {
1736
376k
    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
190k
    case BT_NMSTRT:
1747
190k
#  ifdef XML_NS
1748
191k
    case BT_COLON:
1749
191k
#  endif
1750
309k
    case BT_HEX:
1751
309k
    case BT_DIGIT:
1752
309k
    case BT_NAME:
1753
309k
    case BT_MINUS:
1754
309k
      ptr += MINBPC(enc);
1755
309k
      break;
1756
67.7k
    default:
1757
67.7k
      return (int)(ptr - start);
1758
376k
    }
1759
376k
  }
1760
67.7k
}
xmltok.c:normal_nameLength
Line
Count
Source
1733
67.7k
PREFIX(nameLength)(const ENCODING *enc, const char *ptr) {
1734
67.7k
  const char *start = ptr;
1735
376k
  for (;;) {
1736
376k
    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
190k
    case BT_NMSTRT:
1747
190k
#  ifdef XML_NS
1748
191k
    case BT_COLON:
1749
191k
#  endif
1750
309k
    case BT_HEX:
1751
309k
    case BT_DIGIT:
1752
309k
    case BT_NAME:
1753
309k
    case BT_MINUS:
1754
309k
      ptr += MINBPC(enc);
1755
309k
      break;
1756
67.7k
    default:
1757
67.7k
      return (int)(ptr - start);
1758
376k
    }
1759
376k
  }
1760
67.7k
}
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 */