Coverage Report

Created: 2026-04-01 07:17

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
429
  case BT_LEAD##n:                                                             \
50
429
    if (end - ptr < n)                                                         \
51
429
      return XML_TOK_PARTIAL_CHAR;                                             \
52
429
    if (IS_INVALID_CHAR(enc, ptr, n)) {                                        \
53
0
      *(nextTokPtr) = (ptr);                                                   \
54
0
      return XML_TOK_INVALID;                                                  \
55
0
    }                                                                          \
56
429
    ptr += n;                                                                  \
57
429
    break;
58
59
#  define INVALID_CASES(ptr, nextTokPtr)                                       \
60
0
    INVALID_LEAD_CASE(2, ptr, nextTokPtr)                                      \
61
429
    INVALID_LEAD_CASE(3, ptr, nextTokPtr)                                      \
62
429
    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
122k
  case BT_NONASCII:                                                            \
82
122k
    if (! IS_NAME_CHAR_MINBPC(enc, ptr)) {                                     \
83
0
      *nextTokPtr = ptr;                                                       \
84
0
      return XML_TOK_INVALID;                                                  \
85
0
    }                                                                          \
86
122k
    /* fall through */                                                         \
87
122k
  case BT_NMSTRT:                                                              \
88
122k
  case BT_HEX:                                                                 \
89
122k
  case BT_DIGIT:                                                               \
90
122k
  case BT_NAME:                                                                \
91
122k
  case BT_MINUS:                                                               \
92
122k
    ptr += MINBPC(enc);                                                        \
93
122k
    break;                                                                     \
94
122k
    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
34.9k
  case BT_NONASCII:                                                            \
111
34.9k
    if (! IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {                                   \
112
0
      *nextTokPtr = ptr;                                                       \
113
0
      return XML_TOK_INVALID;                                                  \
114
0
    }                                                                          \
115
34.9k
    /* fall through */                                                         \
116
34.9k
  case BT_NMSTRT:                                                              \
117
34.9k
  case BT_HEX:                                                                 \
118
34.9k
    ptr += MINBPC(enc);                                                        \
119
34.9k
    break;                                                                     \
120
34.9k
    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
3.00M
    ((end) - (ptr) >= ((count) * MINBPC(enc)))
130
131
135k
#  define HAS_CHAR(enc, ptr, end) HAS_CHARS(enc, ptr, end, 1)
132
133
#  define REQUIRE_CHARS(enc, ptr, end, count)                                  \
134
1.78M
    {                                                                          \
135
1.78M
      if (! HAS_CHARS(enc, ptr, end, count)) {                                 \
136
0
        return XML_TOK_PARTIAL;                                                \
137
0
      }                                                                        \
138
1.78M
    }
139
140
1.78M
#  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
69
                      int *tokPtr) {
233
69
  int upper = 0;
234
69
  UNUSED_P(enc);
235
69
  *tokPtr = XML_TOK_PI;
236
69
  if (end - ptr != MINBPC(enc) * 3)
237
0
    return 1;
238
69
  switch (BYTE_TO_ASCII(enc, ptr)) {
239
69
  case ASCII_x:
240
69
    break;
241
0
  case ASCII_X:
242
0
    upper = 1;
243
0
    break;
244
0
  default:
245
0
    return 1;
246
69
  }
247
69
  ptr += MINBPC(enc);
248
69
  switch (BYTE_TO_ASCII(enc, ptr)) {
249
69
  case ASCII_m:
250
69
    break;
251
0
  case ASCII_M:
252
0
    upper = 1;
253
0
    break;
254
0
  default:
255
0
    return 1;
256
69
  }
257
69
  ptr += MINBPC(enc);
258
69
  switch (BYTE_TO_ASCII(enc, ptr)) {
259
69
  case ASCII_l:
260
69
    break;
261
0
  case ASCII_L:
262
0
    upper = 1;
263
0
    break;
264
0
  default:
265
0
    return 1;
266
69
  }
267
69
  if (upper)
268
0
    return 0;
269
69
  *tokPtr = XML_TOK_XML_DECL;
270
69
  return 1;
271
69
}
xmltok.c:normal_checkPiTarget
Line
Count
Source
232
69
                      int *tokPtr) {
233
69
  int upper = 0;
234
69
  UNUSED_P(enc);
235
69
  *tokPtr = XML_TOK_PI;
236
69
  if (end - ptr != MINBPC(enc) * 3)
237
0
    return 1;
238
69
  switch (BYTE_TO_ASCII(enc, ptr)) {
239
69
  case ASCII_x:
240
69
    break;
241
0
  case ASCII_X:
242
0
    upper = 1;
243
0
    break;
244
0
  default:
245
0
    return 1;
246
69
  }
247
69
  ptr += MINBPC(enc);
248
69
  switch (BYTE_TO_ASCII(enc, ptr)) {
249
69
  case ASCII_m:
250
69
    break;
251
0
  case ASCII_M:
252
0
    upper = 1;
253
0
    break;
254
0
  default:
255
0
    return 1;
256
69
  }
257
69
  ptr += MINBPC(enc);
258
69
  switch (BYTE_TO_ASCII(enc, ptr)) {
259
69
  case ASCII_l:
260
69
    break;
261
0
  case ASCII_L:
262
0
    upper = 1;
263
0
    break;
264
0
  default:
265
0
    return 1;
266
69
  }
267
69
  if (upper)
268
0
    return 0;
269
69
  *tokPtr = XML_TOK_XML_DECL;
270
69
  return 1;
271
69
}
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
69
               const char **nextTokPtr) {
278
69
  int tok;
279
69
  const char *target = ptr;
280
69
  REQUIRE_CHAR(enc, ptr, end);
281
69
  switch (BYTE_TYPE(enc, ptr)) {
282
69
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
283
0
  default:
284
0
    *nextTokPtr = ptr;
285
0
    return XML_TOK_INVALID;
286
69
  }
287
207
  while (HAS_CHAR(enc, ptr, end)) {
288
207
    switch (BYTE_TYPE(enc, ptr)) {
289
552
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
290
69
    case BT_S:
291
69
    case BT_CR:
292
69
    case BT_LF:
293
69
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
294
0
        *nextTokPtr = ptr;
295
0
        return XML_TOK_INVALID;
296
0
      }
297
69
      ptr += MINBPC(enc);
298
2.13k
      while (HAS_CHAR(enc, ptr, end)) {
299
2.13k
        switch (BYTE_TYPE(enc, ptr)) {
300
0
          INVALID_CASES(ptr, nextTokPtr)
301
69
        case BT_QUEST:
302
69
          ptr += MINBPC(enc);
303
69
          REQUIRE_CHAR(enc, ptr, end);
304
69
          if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
305
69
            *nextTokPtr = ptr + MINBPC(enc);
306
69
            return tok;
307
69
          }
308
0
          break;
309
2.07k
        default:
310
2.07k
          ptr += MINBPC(enc);
311
2.07k
          break;
312
2.13k
        }
313
2.13k
      }
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
207
    }
331
207
  }
332
0
  return XML_TOK_PARTIAL;
333
69
}
xmltok.c:normal_scanPi
Line
Count
Source
277
69
               const char **nextTokPtr) {
278
69
  int tok;
279
69
  const char *target = ptr;
280
69
  REQUIRE_CHAR(enc, ptr, end);
281
69
  switch (BYTE_TYPE(enc, ptr)) {
282
69
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
283
0
  default:
284
0
    *nextTokPtr = ptr;
285
0
    return XML_TOK_INVALID;
286
69
  }
287
207
  while (HAS_CHAR(enc, ptr, end)) {
288
207
    switch (BYTE_TYPE(enc, ptr)) {
289
552
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
290
69
    case BT_S:
291
69
    case BT_CR:
292
69
    case BT_LF:
293
69
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
294
0
        *nextTokPtr = ptr;
295
0
        return XML_TOK_INVALID;
296
0
      }
297
69
      ptr += MINBPC(enc);
298
2.13k
      while (HAS_CHAR(enc, ptr, end)) {
299
2.13k
        switch (BYTE_TYPE(enc, ptr)) {
300
0
          INVALID_CASES(ptr, nextTokPtr)
301
69
        case BT_QUEST:
302
69
          ptr += MINBPC(enc);
303
69
          REQUIRE_CHAR(enc, ptr, end);
304
69
          if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
305
69
            *nextTokPtr = ptr + MINBPC(enc);
306
69
            return tok;
307
69
          }
308
0
          break;
309
2.07k
        default:
310
2.07k
          ptr += MINBPC(enc);
311
2.07k
          break;
312
2.13k
        }
313
2.13k
      }
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
207
    }
331
207
  }
332
0
  return XML_TOK_PARTIAL;
333
69
}
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
79
                   const char **nextTokPtr) {
433
79
  REQUIRE_CHAR(enc, ptr, end);
434
79
  switch (BYTE_TYPE(enc, ptr)) {
435
24
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
436
0
  default:
437
0
    *nextTokPtr = ptr;
438
0
    return XML_TOK_INVALID;
439
79
  }
440
1.15k
  while (HAS_CHAR(enc, ptr, end)) {
441
1.15k
    switch (BYTE_TYPE(enc, ptr)) {
442
3.91k
      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
79
    case BT_GT:
469
79
      *nextTokPtr = ptr + MINBPC(enc);
470
79
      return XML_TOK_END_TAG;
471
0
    default:
472
0
      *nextTokPtr = ptr;
473
0
      return XML_TOK_INVALID;
474
1.15k
    }
475
1.15k
  }
476
0
  return XML_TOK_PARTIAL;
477
79
}
xmltok.c:normal_scanEndTag
Line
Count
Source
432
79
                   const char **nextTokPtr) {
433
79
  REQUIRE_CHAR(enc, ptr, end);
434
79
  switch (BYTE_TYPE(enc, ptr)) {
435
24
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
436
0
  default:
437
0
    *nextTokPtr = ptr;
438
0
    return XML_TOK_INVALID;
439
79
  }
440
1.15k
  while (HAS_CHAR(enc, ptr, end)) {
441
1.15k
    switch (BYTE_TYPE(enc, ptr)) {
442
3.91k
      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
79
    case BT_GT:
469
79
      *nextTokPtr = ptr + MINBPC(enc);
470
79
      return XML_TOK_END_TAG;
471
0
    default:
472
0
      *nextTokPtr = ptr;
473
0
      return XML_TOK_INVALID;
474
1.15k
    }
475
1.15k
  }
476
0
  return XML_TOK_PARTIAL;
477
79
}
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
11.1k
                 const char **nextTokPtr) {
574
11.1k
#  ifdef XML_NS
575
11.1k
  int hadColon = 0;
576
11.1k
#  endif
577
110k
  while (HAS_CHAR(enc, ptr, end)) {
578
110k
    switch (BYTE_TYPE(enc, ptr)) {
579
318k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
580
0
#  ifdef XML_NS
581
20
    case BT_COLON:
582
20
      if (hadColon) {
583
0
        *nextTokPtr = ptr;
584
0
        return XML_TOK_INVALID;
585
0
      }
586
20
      hadColon = 1;
587
20
      ptr += MINBPC(enc);
588
20
      REQUIRE_CHAR(enc, ptr, end);
589
20
      switch (BYTE_TYPE(enc, ptr)) {
590
20
        CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
591
0
      default:
592
0
        *nextTokPtr = ptr;
593
0
        return XML_TOK_INVALID;
594
20
      }
595
20
      break;
596
20
#  endif
597
20
    case BT_S:
598
1
    case BT_CR:
599
1
    case BT_LF:
600
1
      for (;;) {
601
1
        int t;
602
603
1
        ptr += MINBPC(enc);
604
1
        REQUIRE_CHAR(enc, ptr, end);
605
1
        t = BYTE_TYPE(enc, ptr);
606
1
        if (t == BT_EQUALS)
607
0
          break;
608
1
        switch (t) {
609
0
        case BT_S:
610
0
        case BT_LF:
611
0
        case BT_CR:
612
0
          break;
613
1
        default:
614
1
          *nextTokPtr = ptr;
615
1
          return XML_TOK_INVALID;
616
1
        }
617
1
      }
618
      /* fall through */
619
23.6k
    case BT_EQUALS: {
620
23.6k
      int open;
621
23.6k
#  ifdef XML_NS
622
23.6k
      hadColon = 0;
623
23.6k
#  endif
624
23.6k
      for (;;) {
625
23.6k
        ptr += MINBPC(enc);
626
23.6k
        REQUIRE_CHAR(enc, ptr, end);
627
23.6k
        open = BYTE_TYPE(enc, ptr);
628
23.6k
        if (open == BT_QUOT || open == BT_APOS)
629
23.6k
          break;
630
0
        switch (open) {
631
0
        case BT_S:
632
0
        case BT_LF:
633
0
        case BT_CR:
634
0
          break;
635
0
        default:
636
0
          *nextTokPtr = ptr;
637
0
          return XML_TOK_INVALID;
638
0
        }
639
0
      }
640
23.6k
      ptr += MINBPC(enc);
641
      /* in attribute value */
642
1.69M
      for (;;) {
643
1.69M
        int t;
644
1.69M
        REQUIRE_CHAR(enc, ptr, end);
645
1.69M
        t = BYTE_TYPE(enc, ptr);
646
1.69M
        if (t == open)
647
23.6k
          break;
648
1.66M
        switch (t) {
649
858
          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
2
        case BT_LT:
660
2
          *nextTokPtr = ptr;
661
2
          return XML_TOK_INVALID;
662
1.66M
        default:
663
1.66M
          ptr += MINBPC(enc);
664
1.66M
          break;
665
1.66M
        }
666
1.66M
      }
667
23.6k
      ptr += MINBPC(enc);
668
23.6k
      REQUIRE_CHAR(enc, ptr, end);
669
23.6k
      switch (BYTE_TYPE(enc, ptr)) {
670
23.4k
      case BT_S:
671
23.4k
      case BT_CR:
672
23.4k
      case BT_LF:
673
23.4k
        break;
674
93
      case BT_SOL:
675
93
        goto sol;
676
110
      case BT_GT:
677
110
        goto gt;
678
9
      default:
679
9
        *nextTokPtr = ptr;
680
9
        return XML_TOK_INVALID;
681
23.6k
      }
682
      /* ptr points to closing quote */
683
23.4k
      for (;;) {
684
23.4k
        ptr += MINBPC(enc);
685
23.4k
        REQUIRE_CHAR(enc, ptr, end);
686
23.4k
        switch (BYTE_TYPE(enc, ptr)) {
687
1.82k
          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
110
        gt:
694
110
          *nextTokPtr = ptr + MINBPC(enc);
695
110
          return XML_TOK_START_TAG_WITH_ATTS;
696
10.9k
        case BT_SOL:
697
11.0k
        sol:
698
11.0k
          ptr += MINBPC(enc);
699
11.0k
          REQUIRE_CHAR(enc, ptr, end);
700
11.0k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
701
0
            *nextTokPtr = ptr;
702
0
            return XML_TOK_INVALID;
703
0
          }
704
11.0k
          *nextTokPtr = ptr + MINBPC(enc);
705
11.0k
          return XML_TOK_EMPTY_ELEMENT_WITH_ATTS;
706
3
        default:
707
3
          *nextTokPtr = ptr;
708
3
          return XML_TOK_INVALID;
709
23.4k
        }
710
12.5k
        break;
711
23.4k
      }
712
12.5k
      break;
713
23.4k
    }
714
12.5k
    default:
715
0
      *nextTokPtr = ptr;
716
0
      return XML_TOK_INVALID;
717
110k
    }
718
110k
  }
719
0
  return XML_TOK_PARTIAL;
720
11.1k
}
xmltok.c:normal_scanAtts
Line
Count
Source
573
11.1k
                 const char **nextTokPtr) {
574
11.1k
#  ifdef XML_NS
575
11.1k
  int hadColon = 0;
576
11.1k
#  endif
577
110k
  while (HAS_CHAR(enc, ptr, end)) {
578
110k
    switch (BYTE_TYPE(enc, ptr)) {
579
318k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
580
0
#  ifdef XML_NS
581
20
    case BT_COLON:
582
20
      if (hadColon) {
583
0
        *nextTokPtr = ptr;
584
0
        return XML_TOK_INVALID;
585
0
      }
586
20
      hadColon = 1;
587
20
      ptr += MINBPC(enc);
588
20
      REQUIRE_CHAR(enc, ptr, end);
589
20
      switch (BYTE_TYPE(enc, ptr)) {
590
20
        CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
591
0
      default:
592
0
        *nextTokPtr = ptr;
593
0
        return XML_TOK_INVALID;
594
20
      }
595
20
      break;
596
20
#  endif
597
20
    case BT_S:
598
1
    case BT_CR:
599
1
    case BT_LF:
600
1
      for (;;) {
601
1
        int t;
602
603
1
        ptr += MINBPC(enc);
604
1
        REQUIRE_CHAR(enc, ptr, end);
605
1
        t = BYTE_TYPE(enc, ptr);
606
1
        if (t == BT_EQUALS)
607
0
          break;
608
1
        switch (t) {
609
0
        case BT_S:
610
0
        case BT_LF:
611
0
        case BT_CR:
612
0
          break;
613
1
        default:
614
1
          *nextTokPtr = ptr;
615
1
          return XML_TOK_INVALID;
616
1
        }
617
1
      }
618
      /* fall through */
619
23.6k
    case BT_EQUALS: {
620
23.6k
      int open;
621
23.6k
#  ifdef XML_NS
622
23.6k
      hadColon = 0;
623
23.6k
#  endif
624
23.6k
      for (;;) {
625
23.6k
        ptr += MINBPC(enc);
626
23.6k
        REQUIRE_CHAR(enc, ptr, end);
627
23.6k
        open = BYTE_TYPE(enc, ptr);
628
23.6k
        if (open == BT_QUOT || open == BT_APOS)
629
23.6k
          break;
630
0
        switch (open) {
631
0
        case BT_S:
632
0
        case BT_LF:
633
0
        case BT_CR:
634
0
          break;
635
0
        default:
636
0
          *nextTokPtr = ptr;
637
0
          return XML_TOK_INVALID;
638
0
        }
639
0
      }
640
23.6k
      ptr += MINBPC(enc);
641
      /* in attribute value */
642
1.69M
      for (;;) {
643
1.69M
        int t;
644
1.69M
        REQUIRE_CHAR(enc, ptr, end);
645
1.69M
        t = BYTE_TYPE(enc, ptr);
646
1.69M
        if (t == open)
647
23.6k
          break;
648
1.66M
        switch (t) {
649
858
          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
2
        case BT_LT:
660
2
          *nextTokPtr = ptr;
661
2
          return XML_TOK_INVALID;
662
1.66M
        default:
663
1.66M
          ptr += MINBPC(enc);
664
1.66M
          break;
665
1.66M
        }
666
1.66M
      }
667
23.6k
      ptr += MINBPC(enc);
668
23.6k
      REQUIRE_CHAR(enc, ptr, end);
669
23.6k
      switch (BYTE_TYPE(enc, ptr)) {
670
23.4k
      case BT_S:
671
23.4k
      case BT_CR:
672
23.4k
      case BT_LF:
673
23.4k
        break;
674
93
      case BT_SOL:
675
93
        goto sol;
676
110
      case BT_GT:
677
110
        goto gt;
678
9
      default:
679
9
        *nextTokPtr = ptr;
680
9
        return XML_TOK_INVALID;
681
23.6k
      }
682
      /* ptr points to closing quote */
683
23.4k
      for (;;) {
684
23.4k
        ptr += MINBPC(enc);
685
23.4k
        REQUIRE_CHAR(enc, ptr, end);
686
23.4k
        switch (BYTE_TYPE(enc, ptr)) {
687
1.82k
          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
110
        gt:
694
110
          *nextTokPtr = ptr + MINBPC(enc);
695
110
          return XML_TOK_START_TAG_WITH_ATTS;
696
10.9k
        case BT_SOL:
697
11.0k
        sol:
698
11.0k
          ptr += MINBPC(enc);
699
11.0k
          REQUIRE_CHAR(enc, ptr, end);
700
11.0k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
701
0
            *nextTokPtr = ptr;
702
0
            return XML_TOK_INVALID;
703
0
          }
704
11.0k
          *nextTokPtr = ptr + MINBPC(enc);
705
11.0k
          return XML_TOK_EMPTY_ELEMENT_WITH_ATTS;
706
3
        default:
707
3
          *nextTokPtr = ptr;
708
3
          return XML_TOK_INVALID;
709
23.4k
        }
710
12.5k
        break;
711
23.4k
      }
712
12.5k
      break;
713
23.4k
    }
714
12.5k
    default:
715
0
      *nextTokPtr = ptr;
716
0
      return XML_TOK_INVALID;
717
110k
    }
718
110k
  }
719
0
  return XML_TOK_PARTIAL;
720
11.1k
}
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
11.2k
               const char **nextTokPtr) {
727
11.2k
#  ifdef XML_NS
728
11.2k
  int hadColon;
729
11.2k
#  endif
730
11.2k
  REQUIRE_CHAR(enc, ptr, end);
731
11.2k
  switch (BYTE_TYPE(enc, ptr)) {
732
11.0k
    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
79
  case BT_SOL:
747
79
    return PREFIX(scanEndTag)(enc, ptr + MINBPC(enc), end, nextTokPtr);
748
0
  default:
749
0
    *nextTokPtr = ptr;
750
0
    return XML_TOK_INVALID;
751
11.2k
  }
752
11.1k
#  ifdef XML_NS
753
11.1k
  hadColon = 0;
754
11.1k
#  endif
755
  /* we have a start-tag */
756
46.5k
  while (HAS_CHAR(enc, ptr, end)) {
757
46.5k
    switch (BYTE_TYPE(enc, ptr)) {
758
130k
      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
11.1k
    case BT_S:
777
11.1k
    case BT_CR:
778
11.1k
    case BT_LF: {
779
11.1k
      ptr += MINBPC(enc);
780
11.1k
      while (HAS_CHAR(enc, ptr, end)) {
781
11.1k
        switch (BYTE_TYPE(enc, ptr)) {
782
182
          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
0
        default:
793
0
          *nextTokPtr = ptr;
794
0
          return XML_TOK_INVALID;
795
11.1k
        }
796
11.1k
        return PREFIX(scanAtts)(enc, ptr, end, nextTokPtr);
797
11.1k
      }
798
0
      return XML_TOK_PARTIAL;
799
11.1k
    }
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
0
    default:
815
0
      *nextTokPtr = ptr;
816
0
      return XML_TOK_INVALID;
817
46.5k
    }
818
46.5k
  }
819
0
  return XML_TOK_PARTIAL;
820
11.1k
}
xmltok.c:normal_scanLt
Line
Count
Source
726
11.2k
               const char **nextTokPtr) {
727
11.2k
#  ifdef XML_NS
728
11.2k
  int hadColon;
729
11.2k
#  endif
730
11.2k
  REQUIRE_CHAR(enc, ptr, end);
731
11.2k
  switch (BYTE_TYPE(enc, ptr)) {
732
11.0k
    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
79
  case BT_SOL:
747
79
    return PREFIX(scanEndTag)(enc, ptr + MINBPC(enc), end, nextTokPtr);
748
0
  default:
749
0
    *nextTokPtr = ptr;
750
0
    return XML_TOK_INVALID;
751
11.2k
  }
752
11.1k
#  ifdef XML_NS
753
11.1k
  hadColon = 0;
754
11.1k
#  endif
755
  /* we have a start-tag */
756
46.5k
  while (HAS_CHAR(enc, ptr, end)) {
757
46.5k
    switch (BYTE_TYPE(enc, ptr)) {
758
130k
      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
11.1k
    case BT_S:
777
11.1k
    case BT_CR:
778
11.1k
    case BT_LF: {
779
11.1k
      ptr += MINBPC(enc);
780
11.1k
      while (HAS_CHAR(enc, ptr, end)) {
781
11.1k
        switch (BYTE_TYPE(enc, ptr)) {
782
182
          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
0
        default:
793
0
          *nextTokPtr = ptr;
794
0
          return XML_TOK_INVALID;
795
11.1k
        }
796
11.1k
        return PREFIX(scanAtts)(enc, ptr, end, nextTokPtr);
797
11.1k
      }
798
0
      return XML_TOK_PARTIAL;
799
11.1k
    }
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
0
    default:
815
0
      *nextTokPtr = ptr;
816
0
      return XML_TOK_INVALID;
817
46.5k
    }
818
46.5k
  }
819
0
  return XML_TOK_PARTIAL;
820
11.1k
}
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
33.0k
                   const char **nextTokPtr) {
825
33.0k
  if (ptr >= end)
826
0
    return XML_TOK_NONE;
827
33.0k
  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
33.0k
  switch (BYTE_TYPE(enc, ptr)) {
837
11.2k
  case BT_LT:
838
11.2k
    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
162
  case BT_CR:
842
162
    ptr += MINBPC(enc);
843
162
    if (! HAS_CHAR(enc, ptr, end))
844
0
      return XML_TOK_TRAILING_CR;
845
162
    if (BYTE_TYPE(enc, ptr) == BT_LF)
846
162
      ptr += MINBPC(enc);
847
162
    *nextTokPtr = ptr;
848
162
    return XML_TOK_DATA_NEWLINE;
849
10.7k
  case BT_LF:
850
10.7k
    *nextTokPtr = ptr + MINBPC(enc);
851
10.7k
    return XML_TOK_DATA_NEWLINE;
852
0
  case BT_RSQB:
853
0
    ptr += MINBPC(enc);
854
0
    if (! HAS_CHAR(enc, ptr, end))
855
0
      return XML_TOK_TRAILING_RSQB;
856
0
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
857
0
      break;
858
0
    ptr += MINBPC(enc);
859
0
    if (! HAS_CHAR(enc, ptr, end))
860
0
      return XML_TOK_TRAILING_RSQB;
861
0
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
862
0
      ptr -= MINBPC(enc);
863
0
      break;
864
0
    }
865
0
    *nextTokPtr = ptr;
866
0
    return XML_TOK_INVALID;
867
0
    INVALID_CASES(ptr, nextTokPtr)
868
10.9k
  default:
869
10.9k
    ptr += MINBPC(enc);
870
10.9k
    break;
871
33.0k
  }
872
22.1k
  while (HAS_CHAR(enc, ptr, end)) {
873
22.1k
    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
10.6k
    case BT_LT:
904
10.6k
    case BT_NONXML:
905
10.6k
    case BT_MALFORM:
906
10.6k
    case BT_TRAIL:
907
10.6k
    case BT_CR:
908
10.9k
    case BT_LF:
909
10.9k
      *nextTokPtr = ptr;
910
10.9k
      return XML_TOK_DATA_CHARS;
911
11.1k
    default:
912
11.1k
      ptr += MINBPC(enc);
913
11.1k
      break;
914
22.1k
    }
915
22.1k
  }
916
0
  *nextTokPtr = ptr;
917
0
  return XML_TOK_DATA_CHARS;
918
10.9k
}
xmltok.c:normal_contentTok
Line
Count
Source
824
33.0k
                   const char **nextTokPtr) {
825
33.0k
  if (ptr >= end)
826
0
    return XML_TOK_NONE;
827
33.0k
  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
33.0k
  switch (BYTE_TYPE(enc, ptr)) {
837
11.2k
  case BT_LT:
838
11.2k
    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
162
  case BT_CR:
842
162
    ptr += MINBPC(enc);
843
162
    if (! HAS_CHAR(enc, ptr, end))
844
0
      return XML_TOK_TRAILING_CR;
845
162
    if (BYTE_TYPE(enc, ptr) == BT_LF)
846
162
      ptr += MINBPC(enc);
847
162
    *nextTokPtr = ptr;
848
162
    return XML_TOK_DATA_NEWLINE;
849
10.7k
  case BT_LF:
850
10.7k
    *nextTokPtr = ptr + MINBPC(enc);
851
10.7k
    return XML_TOK_DATA_NEWLINE;
852
0
  case BT_RSQB:
853
0
    ptr += MINBPC(enc);
854
0
    if (! HAS_CHAR(enc, ptr, end))
855
0
      return XML_TOK_TRAILING_RSQB;
856
0
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
857
0
      break;
858
0
    ptr += MINBPC(enc);
859
0
    if (! HAS_CHAR(enc, ptr, end))
860
0
      return XML_TOK_TRAILING_RSQB;
861
0
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
862
0
      ptr -= MINBPC(enc);
863
0
      break;
864
0
    }
865
0
    *nextTokPtr = ptr;
866
0
    return XML_TOK_INVALID;
867
0
    INVALID_CASES(ptr, nextTokPtr)
868
10.9k
  default:
869
10.9k
    ptr += MINBPC(enc);
870
10.9k
    break;
871
33.0k
  }
872
22.1k
  while (HAS_CHAR(enc, ptr, end)) {
873
22.1k
    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
10.6k
    case BT_LT:
904
10.6k
    case BT_NONXML:
905
10.6k
    case BT_MALFORM:
906
10.6k
    case BT_TRAIL:
907
10.6k
    case BT_CR:
908
10.9k
    case BT_LF:
909
10.9k
      *nextTokPtr = ptr;
910
10.9k
      return XML_TOK_DATA_CHARS;
911
11.1k
    default:
912
11.1k
      ptr += MINBPC(enc);
913
11.1k
      break;
914
22.1k
    }
915
22.1k
  }
916
0
  *nextTokPtr = ptr;
917
0
  return XML_TOK_DATA_CHARS;
918
10.9k
}
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
375
                  const char **nextTokPtr) {
1019
375
  int tok;
1020
375
  if (ptr >= end)
1021
72
    return XML_TOK_NONE;
1022
303
  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
303
  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
158
  case BT_LT: {
1037
158
    ptr += MINBPC(enc);
1038
158
    REQUIRE_CHAR(enc, ptr, end);
1039
158
    switch (BYTE_TYPE(enc, ptr)) {
1040
0
    case BT_EXCL:
1041
0
      return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1042
69
    case BT_QUEST:
1043
69
      return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1044
24
    case BT_NMSTRT:
1045
89
    case BT_HEX:
1046
89
    case BT_NONASCII:
1047
89
    case BT_LEAD2:
1048
89
    case BT_LEAD3:
1049
89
    case BT_LEAD4:
1050
89
      *nextTokPtr = ptr - MINBPC(enc);
1051
89
      return XML_TOK_INSTANCE_START;
1052
158
    }
1053
0
    *nextTokPtr = ptr;
1054
0
    return XML_TOK_INVALID;
1055
158
  }
1056
138
  case BT_CR:
1057
138
    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
138
  case BT_S:
1064
143
  case BT_LF:
1065
281
    for (;;) {
1066
281
      ptr += MINBPC(enc);
1067
281
      if (! HAS_CHAR(enc, ptr, end))
1068
72
        break;
1069
209
      switch (BYTE_TYPE(enc, ptr)) {
1070
0
      case BT_S:
1071
138
      case BT_LF:
1072
138
        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
71
      default:
1079
71
        *nextTokPtr = ptr;
1080
71
        return XML_TOK_PROLOG_S;
1081
209
      }
1082
209
    }
1083
72
    *nextTokPtr = ptr;
1084
72
    return XML_TOK_PROLOG_S;
1085
0
  case BT_PERCNT:
1086
0
    return PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1087
0
  case BT_COMMA:
1088
0
    *nextTokPtr = ptr + MINBPC(enc);
1089
0
    return XML_TOK_COMMA;
1090
0
  case BT_LSQB:
1091
0
    *nextTokPtr = ptr + MINBPC(enc);
1092
0
    return XML_TOK_OPEN_BRACKET;
1093
0
  case BT_RSQB:
1094
0
    ptr += MINBPC(enc);
1095
0
    if (! HAS_CHAR(enc, ptr, end))
1096
0
      return -XML_TOK_CLOSE_BRACKET;
1097
0
    if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) {
1098
0
      REQUIRE_CHARS(enc, ptr, end, 2);
1099
0
      if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_GT)) {
1100
0
        *nextTokPtr = ptr + 2 * MINBPC(enc);
1101
0
        return XML_TOK_COND_SECT_CLOSE;
1102
0
      }
1103
0
    }
1104
0
    *nextTokPtr = ptr;
1105
0
    return XML_TOK_CLOSE_BRACKET;
1106
0
  case BT_LPAR:
1107
0
    *nextTokPtr = ptr + MINBPC(enc);
1108
0
    return XML_TOK_OPEN_PAREN;
1109
0
  case BT_RPAR:
1110
0
    ptr += MINBPC(enc);
1111
0
    if (! HAS_CHAR(enc, ptr, end))
1112
0
      return -XML_TOK_CLOSE_PAREN;
1113
0
    switch (BYTE_TYPE(enc, ptr)) {
1114
0
    case BT_AST:
1115
0
      *nextTokPtr = ptr + MINBPC(enc);
1116
0
      return XML_TOK_CLOSE_PAREN_ASTERISK;
1117
0
    case BT_QUEST:
1118
0
      *nextTokPtr = ptr + MINBPC(enc);
1119
0
      return XML_TOK_CLOSE_PAREN_QUESTION;
1120
0
    case BT_PLUS:
1121
0
      *nextTokPtr = ptr + MINBPC(enc);
1122
0
      return XML_TOK_CLOSE_PAREN_PLUS;
1123
0
    case BT_CR:
1124
0
    case BT_LF:
1125
0
    case BT_S:
1126
0
    case BT_GT:
1127
0
    case BT_COMMA:
1128
0
    case BT_VERBAR:
1129
0
    case BT_RPAR:
1130
0
      *nextTokPtr = ptr;
1131
0
      return XML_TOK_CLOSE_PAREN;
1132
0
    }
1133
0
    *nextTokPtr = ptr;
1134
0
    return XML_TOK_INVALID;
1135
0
  case BT_VERBAR:
1136
0
    *nextTokPtr = ptr + MINBPC(enc);
1137
0
    return XML_TOK_OR;
1138
0
  case BT_GT:
1139
0
    *nextTokPtr = ptr + MINBPC(enc);
1140
0
    return XML_TOK_DECL_CLOSE;
1141
0
  case BT_NUM:
1142
0
    return PREFIX(scanPoundName)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1143
0
#  define LEAD_CASE(n)                                                         \
1144
0
  case BT_LEAD##n:                                                             \
1145
0
    if (end - ptr < n)                                                         \
1146
0
      return XML_TOK_PARTIAL_CHAR;                                             \
1147
0
    if (IS_INVALID_CHAR(enc, ptr, n)) {                                        \
1148
0
      *nextTokPtr = ptr;                                                       \
1149
0
      return XML_TOK_INVALID;                                                  \
1150
0
    }                                                                          \
1151
0
    if (IS_NMSTRT_CHAR(enc, ptr, n)) {                                         \
1152
0
      ptr += n;                                                                \
1153
0
      tok = XML_TOK_NAME;                                                      \
1154
0
      break;                                                                   \
1155
0
    }                                                                          \
1156
0
    if (IS_NAME_CHAR(enc, ptr, n)) {                                           \
1157
0
      ptr += n;                                                                \
1158
0
      tok = XML_TOK_NMTOKEN;                                                   \
1159
0
      break;                                                                   \
1160
0
    }                                                                          \
1161
0
    *nextTokPtr = ptr;                                                         \
1162
0
    return XML_TOK_INVALID;
1163
0
    LEAD_CASE(2)
1164
0
    LEAD_CASE(3)
1165
0
    LEAD_CASE(4)
1166
0
#  undef LEAD_CASE
1167
0
  case BT_NMSTRT:
1168
0
  case BT_HEX:
1169
0
    tok = XML_TOK_NAME;
1170
0
    ptr += MINBPC(enc);
1171
0
    break;
1172
0
  case BT_DIGIT:
1173
0
  case BT_NAME:
1174
0
  case BT_MINUS:
1175
0
#  ifdef XML_NS
1176
0
  case BT_COLON:
1177
0
#  endif
1178
0
    tok = XML_TOK_NMTOKEN;
1179
0
    ptr += MINBPC(enc);
1180
0
    break;
1181
0
  case BT_NONASCII:
1182
0
    if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {
1183
0
      ptr += MINBPC(enc);
1184
0
      tok = XML_TOK_NAME;
1185
0
      break;
1186
0
    }
1187
0
    if (IS_NAME_CHAR_MINBPC(enc, ptr)) {
1188
0
      ptr += MINBPC(enc);
1189
0
      tok = XML_TOK_NMTOKEN;
1190
0
      break;
1191
0
    }
1192
    /* fall through */
1193
2
  default:
1194
2
    *nextTokPtr = ptr;
1195
2
    return XML_TOK_INVALID;
1196
303
  }
1197
0
  while (HAS_CHAR(enc, ptr, end)) {
1198
0
    switch (BYTE_TYPE(enc, ptr)) {
1199
0
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1200
0
    case BT_GT:
1201
0
    case BT_RPAR:
1202
0
    case BT_COMMA:
1203
0
    case BT_VERBAR:
1204
0
    case BT_LSQB:
1205
0
    case BT_PERCNT:
1206
0
    case BT_S:
1207
0
    case BT_CR:
1208
0
    case BT_LF:
1209
0
      *nextTokPtr = ptr;
1210
0
      return tok;
1211
0
#  ifdef XML_NS
1212
0
    case BT_COLON:
1213
0
      ptr += MINBPC(enc);
1214
0
      switch (tok) {
1215
0
      case XML_TOK_NAME:
1216
0
        REQUIRE_CHAR(enc, ptr, end);
1217
0
        tok = XML_TOK_PREFIXED_NAME;
1218
0
        switch (BYTE_TYPE(enc, ptr)) {
1219
0
          CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1220
0
        default:
1221
0
          tok = XML_TOK_NMTOKEN;
1222
0
          break;
1223
0
        }
1224
0
        break;
1225
0
      case XML_TOK_PREFIXED_NAME:
1226
0
        tok = XML_TOK_NMTOKEN;
1227
0
        break;
1228
0
      }
1229
0
      break;
1230
0
#  endif
1231
0
    case BT_PLUS:
1232
0
      if (tok == XML_TOK_NMTOKEN) {
1233
0
        *nextTokPtr = ptr;
1234
0
        return XML_TOK_INVALID;
1235
0
      }
1236
0
      *nextTokPtr = ptr + MINBPC(enc);
1237
0
      return XML_TOK_NAME_PLUS;
1238
0
    case BT_AST:
1239
0
      if (tok == XML_TOK_NMTOKEN) {
1240
0
        *nextTokPtr = ptr;
1241
0
        return XML_TOK_INVALID;
1242
0
      }
1243
0
      *nextTokPtr = ptr + MINBPC(enc);
1244
0
      return XML_TOK_NAME_ASTERISK;
1245
0
    case BT_QUEST:
1246
0
      if (tok == XML_TOK_NMTOKEN) {
1247
0
        *nextTokPtr = ptr;
1248
0
        return XML_TOK_INVALID;
1249
0
      }
1250
0
      *nextTokPtr = ptr + MINBPC(enc);
1251
0
      return XML_TOK_NAME_QUESTION;
1252
0
    default:
1253
0
      *nextTokPtr = ptr;
1254
0
      return XML_TOK_INVALID;
1255
0
    }
1256
0
  }
1257
0
  return -tok;
1258
0
}
xmltok.c:normal_prologTok
Line
Count
Source
1018
375
                  const char **nextTokPtr) {
1019
375
  int tok;
1020
375
  if (ptr >= end)
1021
72
    return XML_TOK_NONE;
1022
303
  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
303
  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
158
  case BT_LT: {
1037
158
    ptr += MINBPC(enc);
1038
158
    REQUIRE_CHAR(enc, ptr, end);
1039
158
    switch (BYTE_TYPE(enc, ptr)) {
1040
0
    case BT_EXCL:
1041
0
      return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1042
69
    case BT_QUEST:
1043
69
      return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1044
24
    case BT_NMSTRT:
1045
89
    case BT_HEX:
1046
89
    case BT_NONASCII:
1047
89
    case BT_LEAD2:
1048
89
    case BT_LEAD3:
1049
89
    case BT_LEAD4:
1050
89
      *nextTokPtr = ptr - MINBPC(enc);
1051
89
      return XML_TOK_INSTANCE_START;
1052
158
    }
1053
0
    *nextTokPtr = ptr;
1054
0
    return XML_TOK_INVALID;
1055
158
  }
1056
138
  case BT_CR:
1057
138
    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
138
  case BT_S:
1064
143
  case BT_LF:
1065
281
    for (;;) {
1066
281
      ptr += MINBPC(enc);
1067
281
      if (! HAS_CHAR(enc, ptr, end))
1068
72
        break;
1069
209
      switch (BYTE_TYPE(enc, ptr)) {
1070
0
      case BT_S:
1071
138
      case BT_LF:
1072
138
        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
71
      default:
1079
71
        *nextTokPtr = ptr;
1080
71
        return XML_TOK_PROLOG_S;
1081
209
      }
1082
209
    }
1083
72
    *nextTokPtr = ptr;
1084
72
    return XML_TOK_PROLOG_S;
1085
0
  case BT_PERCNT:
1086
0
    return PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1087
0
  case BT_COMMA:
1088
0
    *nextTokPtr = ptr + MINBPC(enc);
1089
0
    return XML_TOK_COMMA;
1090
0
  case BT_LSQB:
1091
0
    *nextTokPtr = ptr + MINBPC(enc);
1092
0
    return XML_TOK_OPEN_BRACKET;
1093
0
  case BT_RSQB:
1094
0
    ptr += MINBPC(enc);
1095
0
    if (! HAS_CHAR(enc, ptr, end))
1096
0
      return -XML_TOK_CLOSE_BRACKET;
1097
0
    if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) {
1098
0
      REQUIRE_CHARS(enc, ptr, end, 2);
1099
0
      if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_GT)) {
1100
0
        *nextTokPtr = ptr + 2 * MINBPC(enc);
1101
0
        return XML_TOK_COND_SECT_CLOSE;
1102
0
      }
1103
0
    }
1104
0
    *nextTokPtr = ptr;
1105
0
    return XML_TOK_CLOSE_BRACKET;
1106
0
  case BT_LPAR:
1107
0
    *nextTokPtr = ptr + MINBPC(enc);
1108
0
    return XML_TOK_OPEN_PAREN;
1109
0
  case BT_RPAR:
1110
0
    ptr += MINBPC(enc);
1111
0
    if (! HAS_CHAR(enc, ptr, end))
1112
0
      return -XML_TOK_CLOSE_PAREN;
1113
0
    switch (BYTE_TYPE(enc, ptr)) {
1114
0
    case BT_AST:
1115
0
      *nextTokPtr = ptr + MINBPC(enc);
1116
0
      return XML_TOK_CLOSE_PAREN_ASTERISK;
1117
0
    case BT_QUEST:
1118
0
      *nextTokPtr = ptr + MINBPC(enc);
1119
0
      return XML_TOK_CLOSE_PAREN_QUESTION;
1120
0
    case BT_PLUS:
1121
0
      *nextTokPtr = ptr + MINBPC(enc);
1122
0
      return XML_TOK_CLOSE_PAREN_PLUS;
1123
0
    case BT_CR:
1124
0
    case BT_LF:
1125
0
    case BT_S:
1126
0
    case BT_GT:
1127
0
    case BT_COMMA:
1128
0
    case BT_VERBAR:
1129
0
    case BT_RPAR:
1130
0
      *nextTokPtr = ptr;
1131
0
      return XML_TOK_CLOSE_PAREN;
1132
0
    }
1133
0
    *nextTokPtr = ptr;
1134
0
    return XML_TOK_INVALID;
1135
0
  case BT_VERBAR:
1136
0
    *nextTokPtr = ptr + MINBPC(enc);
1137
0
    return XML_TOK_OR;
1138
0
  case BT_GT:
1139
0
    *nextTokPtr = ptr + MINBPC(enc);
1140
0
    return XML_TOK_DECL_CLOSE;
1141
0
  case BT_NUM:
1142
0
    return PREFIX(scanPoundName)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1143
0
#  define LEAD_CASE(n)                                                         \
1144
0
  case BT_LEAD##n:                                                             \
1145
0
    if (end - ptr < n)                                                         \
1146
0
      return XML_TOK_PARTIAL_CHAR;                                             \
1147
0
    if (IS_INVALID_CHAR(enc, ptr, n)) {                                        \
1148
0
      *nextTokPtr = ptr;                                                       \
1149
0
      return XML_TOK_INVALID;                                                  \
1150
0
    }                                                                          \
1151
0
    if (IS_NMSTRT_CHAR(enc, ptr, n)) {                                         \
1152
0
      ptr += n;                                                                \
1153
0
      tok = XML_TOK_NAME;                                                      \
1154
0
      break;                                                                   \
1155
0
    }                                                                          \
1156
0
    if (IS_NAME_CHAR(enc, ptr, n)) {                                           \
1157
0
      ptr += n;                                                                \
1158
0
      tok = XML_TOK_NMTOKEN;                                                   \
1159
0
      break;                                                                   \
1160
0
    }                                                                          \
1161
0
    *nextTokPtr = ptr;                                                         \
1162
0
    return XML_TOK_INVALID;
1163
0
    LEAD_CASE(2)
1164
0
    LEAD_CASE(3)
1165
0
    LEAD_CASE(4)
1166
0
#  undef LEAD_CASE
1167
0
  case BT_NMSTRT:
1168
0
  case BT_HEX:
1169
0
    tok = XML_TOK_NAME;
1170
0
    ptr += MINBPC(enc);
1171
0
    break;
1172
0
  case BT_DIGIT:
1173
0
  case BT_NAME:
1174
0
  case BT_MINUS:
1175
0
#  ifdef XML_NS
1176
0
  case BT_COLON:
1177
0
#  endif
1178
0
    tok = XML_TOK_NMTOKEN;
1179
0
    ptr += MINBPC(enc);
1180
0
    break;
1181
0
  case BT_NONASCII:
1182
0
    if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {
1183
0
      ptr += MINBPC(enc);
1184
0
      tok = XML_TOK_NAME;
1185
0
      break;
1186
0
    }
1187
0
    if (IS_NAME_CHAR_MINBPC(enc, ptr)) {
1188
0
      ptr += MINBPC(enc);
1189
0
      tok = XML_TOK_NMTOKEN;
1190
0
      break;
1191
0
    }
1192
    /* fall through */
1193
2
  default:
1194
2
    *nextTokPtr = ptr;
1195
2
    return XML_TOK_INVALID;
1196
303
  }
1197
0
  while (HAS_CHAR(enc, ptr, end)) {
1198
0
    switch (BYTE_TYPE(enc, ptr)) {
1199
0
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1200
0
    case BT_GT:
1201
0
    case BT_RPAR:
1202
0
    case BT_COMMA:
1203
0
    case BT_VERBAR:
1204
0
    case BT_LSQB:
1205
0
    case BT_PERCNT:
1206
0
    case BT_S:
1207
0
    case BT_CR:
1208
0
    case BT_LF:
1209
0
      *nextTokPtr = ptr;
1210
0
      return tok;
1211
0
#  ifdef XML_NS
1212
0
    case BT_COLON:
1213
0
      ptr += MINBPC(enc);
1214
0
      switch (tok) {
1215
0
      case XML_TOK_NAME:
1216
0
        REQUIRE_CHAR(enc, ptr, end);
1217
0
        tok = XML_TOK_PREFIXED_NAME;
1218
0
        switch (BYTE_TYPE(enc, ptr)) {
1219
0
          CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1220
0
        default:
1221
0
          tok = XML_TOK_NMTOKEN;
1222
0
          break;
1223
0
        }
1224
0
        break;
1225
0
      case XML_TOK_PREFIXED_NAME:
1226
0
        tok = XML_TOK_NMTOKEN;
1227
0
        break;
1228
0
      }
1229
0
      break;
1230
0
#  endif
1231
0
    case BT_PLUS:
1232
0
      if (tok == XML_TOK_NMTOKEN) {
1233
0
        *nextTokPtr = ptr;
1234
0
        return XML_TOK_INVALID;
1235
0
      }
1236
0
      *nextTokPtr = ptr + MINBPC(enc);
1237
0
      return XML_TOK_NAME_PLUS;
1238
0
    case BT_AST:
1239
0
      if (tok == XML_TOK_NMTOKEN) {
1240
0
        *nextTokPtr = ptr;
1241
0
        return XML_TOK_INVALID;
1242
0
      }
1243
0
      *nextTokPtr = ptr + MINBPC(enc);
1244
0
      return XML_TOK_NAME_ASTERISK;
1245
0
    case BT_QUEST:
1246
0
      if (tok == XML_TOK_NMTOKEN) {
1247
0
        *nextTokPtr = ptr;
1248
0
        return XML_TOK_INVALID;
1249
0
      }
1250
0
      *nextTokPtr = ptr + MINBPC(enc);
1251
0
      return XML_TOK_NAME_QUESTION;
1252
0
    default:
1253
0
      *nextTokPtr = ptr;
1254
0
      return XML_TOK_INVALID;
1255
0
    }
1256
0
  }
1257
0
  return -tok;
1258
0
}
Unexecuted instantiation: xmltok.c:little2_prologTok
Unexecuted instantiation: xmltok.c:big2_prologTok
1259
1260
static int PTRCALL
1261
PREFIX(attributeValueTok)(const ENCODING *enc, const char *ptr, const char *end,
1262
135k
                          const char **nextTokPtr) {
1263
135k
  const char *start;
1264
135k
  if (ptr >= end)
1265
728
    return XML_TOK_NONE;
1266
134k
  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
134k
  start = ptr;
1275
890k
  while (HAS_CHAR(enc, ptr, end)) {
1276
890k
    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
6.35k
    case BT_LF:
1295
6.35k
      if (ptr == start) {
1296
3.17k
        *nextTokPtr = ptr + MINBPC(enc);
1297
3.17k
        return XML_TOK_DATA_NEWLINE;
1298
3.17k
      }
1299
3.17k
      *nextTokPtr = ptr;
1300
3.17k
      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
127k
    case BT_S:
1314
127k
      if (ptr == start) {
1315
68.0k
        *nextTokPtr = ptr + MINBPC(enc);
1316
68.0k
        return XML_TOK_ATTRIBUTE_VALUE_S;
1317
68.0k
      }
1318
59.7k
      *nextTokPtr = ptr;
1319
59.7k
      return XML_TOK_DATA_CHARS;
1320
756k
    default:
1321
756k
      ptr += MINBPC(enc);
1322
756k
      break;
1323
890k
    }
1324
890k
  }
1325
707
  *nextTokPtr = ptr;
1326
707
  return XML_TOK_DATA_CHARS;
1327
134k
}
xmltok.c:normal_attributeValueTok
Line
Count
Source
1262
135k
                          const char **nextTokPtr) {
1263
135k
  const char *start;
1264
135k
  if (ptr >= end)
1265
728
    return XML_TOK_NONE;
1266
134k
  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
134k
  start = ptr;
1275
890k
  while (HAS_CHAR(enc, ptr, end)) {
1276
890k
    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
6.35k
    case BT_LF:
1295
6.35k
      if (ptr == start) {
1296
3.17k
        *nextTokPtr = ptr + MINBPC(enc);
1297
3.17k
        return XML_TOK_DATA_NEWLINE;
1298
3.17k
      }
1299
3.17k
      *nextTokPtr = ptr;
1300
3.17k
      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
127k
    case BT_S:
1314
127k
      if (ptr == start) {
1315
68.0k
        *nextTokPtr = ptr + MINBPC(enc);
1316
68.0k
        return XML_TOK_ATTRIBUTE_VALUE_S;
1317
68.0k
      }
1318
59.7k
      *nextTokPtr = ptr;
1319
59.7k
      return XML_TOK_DATA_CHARS;
1320
756k
    default:
1321
756k
      ptr += MINBPC(enc);
1322
756k
      break;
1323
890k
    }
1324
890k
  }
1325
707
  *nextTokPtr = ptr;
1326
707
  return XML_TOK_DATA_CHARS;
1327
134k
}
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
11.1k
                ATTRIBUTE *atts) {
1511
11.1k
  enum { other, inName, inValue } state = inName;
1512
11.1k
  int nAtts = 0;
1513
11.1k
  int open = 0; /* defined when state == inValue;
1514
                   initialization just to shut up compilers */
1515
1516
1.93M
  for (ptr += MINBPC(enc);; ptr += MINBPC(enc)) {
1517
1.93M
    switch (BYTE_TYPE(enc, ptr)) {
1518
0
#  define START_NAME                                                           \
1519
270k
    if (state == other) {                                                      \
1520
23.6k
      if (nAtts < attsMax) {                                                   \
1521
23.6k
        atts[nAtts].name = ptr;                                                \
1522
23.6k
        atts[nAtts].normalized = 1;                                            \
1523
23.6k
      }                                                                        \
1524
23.6k
      state = inName;                                                          \
1525
23.6k
    }
1526
0
#  define LEAD_CASE(n)                                                         \
1527
429
  case BT_LEAD##n: /* NOTE: The encoding has already been validated. */        \
1528
429
    START_NAME ptr += (n - MINBPC(enc));                                       \
1529
429
    break;
1530
0
      LEAD_CASE(2)
1531
429
      LEAD_CASE(3)
1532
0
      LEAD_CASE(4)
1533
0
#  undef LEAD_CASE
1534
0
    case BT_NONASCII:
1535
139k
    case BT_NMSTRT:
1536
270k
    case BT_HEX:
1537
270k
      START_NAME
1538
270k
      break;
1539
0
#  undef START_NAME
1540
47.2k
    case BT_QUOT:
1541
47.2k
      if (state != inValue) {
1542
23.6k
        if (nAtts < attsMax)
1543
23.6k
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1544
23.6k
        state = inValue;
1545
23.6k
        open = BT_QUOT;
1546
23.6k
      } else if (open == BT_QUOT) {
1547
23.6k
        state = other;
1548
23.6k
        if (nAtts < attsMax)
1549
23.6k
          atts[nAtts].valueEnd = ptr;
1550
23.6k
        nAtts++;
1551
23.6k
      }
1552
47.2k
      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
177k
    case BT_S:
1571
177k
      if (state == inName)
1572
11.1k
        state = other;
1573
166k
      else if (state == inValue && nAtts < attsMax && atts[nAtts].normalized
1574
83.8k
               && (ptr == atts[nAtts].valuePtr
1575
83.8k
                   || BYTE_TO_ASCII(enc, ptr) != ASCII_SPACE
1576
83.5k
                   || BYTE_TO_ASCII(enc, ptr + MINBPC(enc)) == ASCII_SPACE
1577
83.5k
                   || BYTE_TYPE(enc, ptr + MINBPC(enc)) == open))
1578
305
        atts[nAtts].normalized = 0;
1579
177k
      break;
1580
0
    case BT_CR:
1581
3.17k
    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
3.17k
      if (state == inName)
1585
0
        state = other;
1586
3.17k
      else if (state == inValue && nAtts < attsMax)
1587
3.17k
        atts[nAtts].normalized = 0;
1588
3.17k
      break;
1589
110
    case BT_GT:
1590
12.6k
    case BT_SOL:
1591
12.6k
      if (state != inValue)
1592
11.1k
        return nAtts;
1593
1.48k
      break;
1594
1.42M
    default:
1595
1.42M
      break;
1596
1.93M
    }
1597
1.93M
  }
1598
  /* not reached */
1599
11.1k
}
xmltok.c:normal_getAtts
Line
Count
Source
1510
11.1k
                ATTRIBUTE *atts) {
1511
11.1k
  enum { other, inName, inValue } state = inName;
1512
11.1k
  int nAtts = 0;
1513
11.1k
  int open = 0; /* defined when state == inValue;
1514
                   initialization just to shut up compilers */
1515
1516
1.93M
  for (ptr += MINBPC(enc);; ptr += MINBPC(enc)) {
1517
1.93M
    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
429
      LEAD_CASE(3)
1532
0
      LEAD_CASE(4)
1533
0
#  undef LEAD_CASE
1534
0
    case BT_NONASCII:
1535
139k
    case BT_NMSTRT:
1536
270k
    case BT_HEX:
1537
270k
      START_NAME
1538
270k
      break;
1539
0
#  undef START_NAME
1540
47.2k
    case BT_QUOT:
1541
47.2k
      if (state != inValue) {
1542
23.6k
        if (nAtts < attsMax)
1543
23.6k
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1544
23.6k
        state = inValue;
1545
23.6k
        open = BT_QUOT;
1546
23.6k
      } else if (open == BT_QUOT) {
1547
23.6k
        state = other;
1548
23.6k
        if (nAtts < attsMax)
1549
23.6k
          atts[nAtts].valueEnd = ptr;
1550
23.6k
        nAtts++;
1551
23.6k
      }
1552
47.2k
      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
177k
    case BT_S:
1571
177k
      if (state == inName)
1572
11.1k
        state = other;
1573
166k
      else if (state == inValue && nAtts < attsMax && atts[nAtts].normalized
1574
83.8k
               && (ptr == atts[nAtts].valuePtr
1575
83.8k
                   || BYTE_TO_ASCII(enc, ptr) != ASCII_SPACE
1576
83.5k
                   || BYTE_TO_ASCII(enc, ptr + MINBPC(enc)) == ASCII_SPACE
1577
83.5k
                   || BYTE_TYPE(enc, ptr + MINBPC(enc)) == open))
1578
305
        atts[nAtts].normalized = 0;
1579
177k
      break;
1580
0
    case BT_CR:
1581
3.17k
    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
3.17k
      if (state == inName)
1585
0
        state = other;
1586
3.17k
      else if (state == inValue && nAtts < attsMax)
1587
3.17k
        atts[nAtts].normalized = 0;
1588
3.17k
      break;
1589
110
    case BT_GT:
1590
12.6k
    case BT_SOL:
1591
12.6k
      if (state != inValue)
1592
11.1k
        return nAtts;
1593
1.48k
      break;
1594
1.42M
    default:
1595
1.42M
      break;
1596
1.93M
    }
1597
1.93M
  }
1598
  /* not reached */
1599
11.1k
}
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
138
                         const char *end1, const char *ptr2) {
1716
138
  UNUSED_P(enc);
1717
1.17k
  for (; *ptr2; ptr1 += MINBPC(enc), ptr2++) {
1718
1.03k
    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
1.03k
    if (! CHAR_MATCHES(enc, ptr1, *ptr2))
1727
0
      return 0;
1728
1.03k
  }
1729
138
  return ptr1 == end1;
1730
138
}
xmltok.c:normal_nameMatchesAscii
Line
Count
Source
1715
138
                         const char *end1, const char *ptr2) {
1716
138
  UNUSED_P(enc);
1717
1.17k
  for (; *ptr2; ptr1 += MINBPC(enc), ptr2++) {
1718
1.03k
    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
1.03k
    if (! CHAR_MATCHES(enc, ptr1, *ptr2))
1727
0
      return 0;
1728
1.03k
  }
1729
138
  return ptr1 == end1;
1730
138
}
Unexecuted instantiation: xmltok.c:little2_nameMatchesAscii
Unexecuted instantiation: xmltok.c:big2_nameMatchesAscii
1731
1732
static int PTRFASTCALL
1733
34.8k
PREFIX(nameLength)(const ENCODING *enc, const char *ptr) {
1734
34.8k
  const char *start = ptr;
1735
192k
  for (;;) {
1736
192k
    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
96.8k
    case BT_NMSTRT:
1747
96.8k
#  ifdef XML_NS
1748
96.9k
    case BT_COLON:
1749
96.9k
#  endif
1750
157k
    case BT_HEX:
1751
157k
    case BT_DIGIT:
1752
157k
    case BT_NAME:
1753
157k
    case BT_MINUS:
1754
157k
      ptr += MINBPC(enc);
1755
157k
      break;
1756
34.8k
    default:
1757
34.8k
      return (int)(ptr - start);
1758
192k
    }
1759
192k
  }
1760
34.8k
}
xmltok.c:normal_nameLength
Line
Count
Source
1733
34.8k
PREFIX(nameLength)(const ENCODING *enc, const char *ptr) {
1734
34.8k
  const char *start = ptr;
1735
192k
  for (;;) {
1736
192k
    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
96.8k
    case BT_NMSTRT:
1747
96.8k
#  ifdef XML_NS
1748
96.9k
    case BT_COLON:
1749
96.9k
#  endif
1750
157k
    case BT_HEX:
1751
157k
    case BT_DIGIT:
1752
157k
    case BT_NAME:
1753
157k
    case BT_MINUS:
1754
157k
      ptr += MINBPC(enc);
1755
157k
      break;
1756
34.8k
    default:
1757
34.8k
      return (int)(ptr - start);
1758
192k
    }
1759
192k
  }
1760
34.8k
}
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 */