Coverage Report

Created: 2025-10-14 06:50

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/CMake/Utilities/cmexpat/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
45
#    define IS_INVALID_CHAR(enc, ptr, n) (0)
46
#  endif
47
48
#  define INVALID_LEAD_CASE(n, ptr, nextTokPtr)                                \
49
825k
  case BT_LEAD##n:                                                             \
50
825k
    if (end - ptr < n)                                                         \
51
825k
      return XML_TOK_PARTIAL_CHAR;                                             \
52
825k
    if (IS_INVALID_CHAR(enc, ptr, n)) {                                        \
53
81
      *(nextTokPtr) = (ptr);                                                   \
54
81
      return XML_TOK_INVALID;                                                  \
55
81
    }                                                                          \
56
825k
    ptr += n;                                                                  \
57
825k
    break;
58
59
#  define INVALID_CASES(ptr, nextTokPtr)                                       \
60
322k
    INVALID_LEAD_CASE(2, ptr, nextTokPtr)                                      \
61
332k
    INVALID_LEAD_CASE(3, ptr, nextTokPtr)                                      \
62
332k
    INVALID_LEAD_CASE(4, ptr, nextTokPtr)                                      \
63
170k
  case BT_NONXML:                                                              \
64
51
  case BT_MALFORM:                                                             \
65
85
  case BT_TRAIL:                                                               \
66
85
    *(nextTokPtr) = (ptr);                                                     \
67
85
    return XML_TOK_INVALID;
68
69
#  define CHECK_NAME_CASE(n, enc, ptr, end, nextTokPtr)                        \
70
381k
  case BT_LEAD##n:                                                             \
71
381k
    if (end - ptr < n)                                                         \
72
380k
      return XML_TOK_PARTIAL_CHAR;                                             \
73
381k
    if (IS_INVALID_CHAR(enc, ptr, n) || ! IS_NAME_CHAR(enc, ptr, n)) {         \
74
253
      *nextTokPtr = ptr;                                                       \
75
253
      return XML_TOK_INVALID;                                                  \
76
253
    }                                                                          \
77
381k
    ptr += n;                                                                  \
78
380k
    break;
79
80
#  define CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)                          \
81
30.4M
  case BT_NONASCII:                                                            \
82
30.4M
    if (! IS_NAME_CHAR_MINBPC(enc, ptr)) {                                     \
83
48
      *nextTokPtr = ptr;                                                       \
84
48
      return XML_TOK_INVALID;                                                  \
85
48
    }                                                                          \
86
30.4M
    /* fall through */                                                         \
87
30.4M
  case BT_NMSTRT:                                                              \
88
26.6M
  case BT_HEX:                                                                 \
89
29.9M
  case BT_DIGIT:                                                               \
90
30.0M
  case BT_NAME:                                                                \
91
30.4M
  case BT_MINUS:                                                               \
92
30.4M
    ptr += MINBPC(enc);                                                        \
93
30.4M
    break;                                                                     \
94
30.4M
    CHECK_NAME_CASE(2, enc, ptr, end, nextTokPtr)                              \
95
226k
    CHECK_NAME_CASE(3, enc, ptr, end, nextTokPtr)                              \
96
226k
    CHECK_NAME_CASE(4, enc, ptr, end, nextTokPtr)
97
98
#  define CHECK_NMSTRT_CASE(n, enc, ptr, end, nextTokPtr)                      \
99
132k
  case BT_LEAD##n:                                                             \
100
132k
    if ((end) - (ptr) < (n))                                                   \
101
132k
      return XML_TOK_PARTIAL_CHAR;                                             \
102
132k
    if (IS_INVALID_CHAR(enc, ptr, n) || ! IS_NMSTRT_CHAR(enc, ptr, n)) {       \
103
133
      *nextTokPtr = ptr;                                                       \
104
133
      return XML_TOK_INVALID;                                                  \
105
133
    }                                                                          \
106
132k
    ptr += n;                                                                  \
107
132k
    break;
108
109
#  define CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)                        \
110
2.46M
  case BT_NONASCII:                                                            \
111
2.46M
    if (! IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {                                   \
112
0
      *nextTokPtr = ptr;                                                       \
113
0
      return XML_TOK_INVALID;                                                  \
114
0
    }                                                                          \
115
2.46M
    /* fall through */                                                         \
116
2.46M
  case BT_NMSTRT:                                                              \
117
2.46M
  case BT_HEX:                                                                 \
118
2.46M
    ptr += MINBPC(enc);                                                        \
119
2.46M
    break;                                                                     \
120
2.46M
    CHECK_NMSTRT_CASE(2, enc, ptr, end, nextTokPtr)                            \
121
87.4k
    CHECK_NMSTRT_CASE(3, enc, ptr, end, nextTokPtr)                            \
122
87.3k
    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
297M
    ((end) - (ptr) >= ((count) * MINBPC(enc)))
130
131
10.9M
#  define HAS_CHAR(enc, ptr, end) HAS_CHARS(enc, ptr, end, 1)
132
133
#  define REQUIRE_CHARS(enc, ptr, end, count)                                  \
134
33.9M
    {                                                                          \
135
33.9M
      if (! HAS_CHARS(enc, ptr, end, count)) {                                 \
136
485
        return XML_TOK_PARTIAL;                                                \
137
485
      }                                                                        \
138
33.9M
    }
139
140
33.9M
#  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
26.6k
                    const char **nextTokPtr) {
147
26.6k
  if (HAS_CHAR(enc, ptr, end)) {
148
26.6k
    if (! CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
149
11
      *nextTokPtr = ptr;
150
11
      return XML_TOK_INVALID;
151
11
    }
152
26.6k
    ptr += MINBPC(enc);
153
4.52M
    while (HAS_CHAR(enc, ptr, end)) {
154
4.52M
      switch (BYTE_TYPE(enc, ptr)) {
155
252k
        INVALID_CASES(ptr, nextTokPtr)
156
48.8k
      case BT_MINUS:
157
48.8k
        ptr += MINBPC(enc);
158
48.8k
        REQUIRE_CHAR(enc, ptr, end);
159
48.8k
        if (CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
160
26.5k
          ptr += MINBPC(enc);
161
26.5k
          REQUIRE_CHAR(enc, ptr, end);
162
26.4k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
163
11
            *nextTokPtr = ptr;
164
11
            return XML_TOK_INVALID;
165
11
          }
166
26.4k
          *nextTokPtr = ptr + MINBPC(enc);
167
26.4k
          return XML_TOK_COMMENT;
168
26.4k
        }
169
22.3k
        break;
170
4.34M
      default:
171
4.34M
        ptr += MINBPC(enc);
172
4.34M
        break;
173
4.52M
      }
174
4.52M
    }
175
26.6k
  }
176
70
  return XML_TOK_PARTIAL;
177
26.6k
}
xmltok.c:normal_scanComment
Line
Count
Source
146
26.6k
                    const char **nextTokPtr) {
147
26.6k
  if (HAS_CHAR(enc, ptr, end)) {
148
26.6k
    if (! CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
149
11
      *nextTokPtr = ptr;
150
11
      return XML_TOK_INVALID;
151
11
    }
152
26.6k
    ptr += MINBPC(enc);
153
4.52M
    while (HAS_CHAR(enc, ptr, end)) {
154
4.52M
      switch (BYTE_TYPE(enc, ptr)) {
155
252k
        INVALID_CASES(ptr, nextTokPtr)
156
48.8k
      case BT_MINUS:
157
48.8k
        ptr += MINBPC(enc);
158
48.8k
        REQUIRE_CHAR(enc, ptr, end);
159
48.8k
        if (CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
160
26.5k
          ptr += MINBPC(enc);
161
26.5k
          REQUIRE_CHAR(enc, ptr, end);
162
26.4k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
163
11
            *nextTokPtr = ptr;
164
11
            return XML_TOK_INVALID;
165
11
          }
166
26.4k
          *nextTokPtr = ptr + MINBPC(enc);
167
26.4k
          return XML_TOK_COMMENT;
168
26.4k
        }
169
22.3k
        break;
170
4.34M
      default:
171
4.34M
        ptr += MINBPC(enc);
172
4.34M
        break;
173
4.52M
      }
174
4.52M
    }
175
26.6k
  }
176
70
  return XML_TOK_PARTIAL;
177
26.6k
}
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
55.5k
                 const char **nextTokPtr) {
184
55.5k
  REQUIRE_CHAR(enc, ptr, end);
185
55.5k
  switch (BYTE_TYPE(enc, ptr)) {
186
2.84k
  case BT_MINUS:
187
2.84k
    return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
188
3
  case BT_LSQB:
189
3
    *nextTokPtr = ptr + MINBPC(enc);
190
3
    return XML_TOK_COND_SECT_OPEN;
191
889
  case BT_NMSTRT:
192
52.6k
  case BT_HEX:
193
52.6k
    ptr += MINBPC(enc);
194
52.6k
    break;
195
2
  default:
196
2
    *nextTokPtr = ptr;
197
2
    return XML_TOK_INVALID;
198
55.5k
  }
199
357k
  while (HAS_CHAR(enc, ptr, end)) {
200
357k
    switch (BYTE_TYPE(enc, ptr)) {
201
18
    case BT_PERCNT:
202
18
      REQUIRE_CHARS(enc, ptr, end, 2);
203
      /* don't allow <!ENTITY% foo "whatever"> */
204
16
      switch (BYTE_TYPE(enc, ptr + MINBPC(enc))) {
205
1
      case BT_S:
206
2
      case BT_CR:
207
3
      case BT_LF:
208
4
      case BT_PERCNT:
209
4
        *nextTokPtr = ptr;
210
4
        return XML_TOK_INVALID;
211
16
      }
212
      /* fall through */
213
17.4k
    case BT_S:
214
48.1k
    case BT_CR:
215
52.5k
    case BT_LF:
216
52.5k
      *nextTokPtr = ptr;
217
52.5k
      return XML_TOK_DECL_OPEN;
218
289k
    case BT_NMSTRT:
219
304k
    case BT_HEX:
220
304k
      ptr += MINBPC(enc);
221
304k
      break;
222
10
    default:
223
10
      *nextTokPtr = ptr;
224
10
      return XML_TOK_INVALID;
225
357k
    }
226
357k
  }
227
64
  return XML_TOK_PARTIAL;
228
52.6k
}
xmltok.c:normal_scanDecl
Line
Count
Source
183
55.5k
                 const char **nextTokPtr) {
184
55.5k
  REQUIRE_CHAR(enc, ptr, end);
185
55.5k
  switch (BYTE_TYPE(enc, ptr)) {
186
2.84k
  case BT_MINUS:
187
2.84k
    return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
188
3
  case BT_LSQB:
189
3
    *nextTokPtr = ptr + MINBPC(enc);
190
3
    return XML_TOK_COND_SECT_OPEN;
191
889
  case BT_NMSTRT:
192
52.6k
  case BT_HEX:
193
52.6k
    ptr += MINBPC(enc);
194
52.6k
    break;
195
2
  default:
196
2
    *nextTokPtr = ptr;
197
2
    return XML_TOK_INVALID;
198
55.5k
  }
199
357k
  while (HAS_CHAR(enc, ptr, end)) {
200
357k
    switch (BYTE_TYPE(enc, ptr)) {
201
18
    case BT_PERCNT:
202
18
      REQUIRE_CHARS(enc, ptr, end, 2);
203
      /* don't allow <!ENTITY% foo "whatever"> */
204
16
      switch (BYTE_TYPE(enc, ptr + MINBPC(enc))) {
205
1
      case BT_S:
206
2
      case BT_CR:
207
3
      case BT_LF:
208
4
      case BT_PERCNT:
209
4
        *nextTokPtr = ptr;
210
4
        return XML_TOK_INVALID;
211
16
      }
212
      /* fall through */
213
17.4k
    case BT_S:
214
48.1k
    case BT_CR:
215
52.5k
    case BT_LF:
216
52.5k
      *nextTokPtr = ptr;
217
52.5k
      return XML_TOK_DECL_OPEN;
218
289k
    case BT_NMSTRT:
219
304k
    case BT_HEX:
220
304k
      ptr += MINBPC(enc);
221
304k
      break;
222
10
    default:
223
10
      *nextTokPtr = ptr;
224
10
      return XML_TOK_INVALID;
225
357k
    }
226
357k
  }
227
64
  return XML_TOK_PARTIAL;
228
52.6k
}
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
32.9k
                      int *tokPtr) {
233
32.9k
  int upper = 0;
234
32.9k
  UNUSED_P(enc);
235
32.9k
  *tokPtr = XML_TOK_PI;
236
32.9k
  if (end - ptr != MINBPC(enc) * 3)
237
21.4k
    return 1;
238
11.5k
  switch (BYTE_TO_ASCII(enc, ptr)) {
239
7.06k
  case ASCII_x:
240
7.06k
    break;
241
1.34k
  case ASCII_X:
242
1.34k
    upper = 1;
243
1.34k
    break;
244
3.16k
  default:
245
3.16k
    return 1;
246
11.5k
  }
247
8.40k
  ptr += MINBPC(enc);
248
8.40k
  switch (BYTE_TO_ASCII(enc, ptr)) {
249
2.35k
  case ASCII_m:
250
2.35k
    break;
251
516
  case ASCII_M:
252
516
    upper = 1;
253
516
    break;
254
5.53k
  default:
255
5.53k
    return 1;
256
8.40k
  }
257
2.86k
  ptr += MINBPC(enc);
258
2.86k
  switch (BYTE_TO_ASCII(enc, ptr)) {
259
1.13k
  case ASCII_l:
260
1.13k
    break;
261
2
  case ASCII_L:
262
2
    upper = 1;
263
2
    break;
264
1.73k
  default:
265
1.73k
    return 1;
266
2.86k
  }
267
1.13k
  if (upper)
268
5
    return 0;
269
1.13k
  *tokPtr = XML_TOK_XML_DECL;
270
1.13k
  return 1;
271
1.13k
}
xmltok.c:normal_checkPiTarget
Line
Count
Source
232
32.9k
                      int *tokPtr) {
233
32.9k
  int upper = 0;
234
32.9k
  UNUSED_P(enc);
235
32.9k
  *tokPtr = XML_TOK_PI;
236
32.9k
  if (end - ptr != MINBPC(enc) * 3)
237
21.4k
    return 1;
238
11.5k
  switch (BYTE_TO_ASCII(enc, ptr)) {
239
7.06k
  case ASCII_x:
240
7.06k
    break;
241
1.34k
  case ASCII_X:
242
1.34k
    upper = 1;
243
1.34k
    break;
244
3.16k
  default:
245
3.16k
    return 1;
246
11.5k
  }
247
8.40k
  ptr += MINBPC(enc);
248
8.40k
  switch (BYTE_TO_ASCII(enc, ptr)) {
249
2.35k
  case ASCII_m:
250
2.35k
    break;
251
516
  case ASCII_M:
252
516
    upper = 1;
253
516
    break;
254
5.53k
  default:
255
5.53k
    return 1;
256
8.40k
  }
257
2.86k
  ptr += MINBPC(enc);
258
2.86k
  switch (BYTE_TO_ASCII(enc, ptr)) {
259
1.13k
  case ASCII_l:
260
1.13k
    break;
261
2
  case ASCII_L:
262
2
    upper = 1;
263
2
    break;
264
1.73k
  default:
265
1.73k
    return 1;
266
2.86k
  }
267
1.13k
  if (upper)
268
5
    return 0;
269
1.13k
  *tokPtr = XML_TOK_XML_DECL;
270
1.13k
  return 1;
271
1.13k
}
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
33.1k
               const char **nextTokPtr) {
278
33.1k
  int tok;
279
33.1k
  const char *target = ptr;
280
33.1k
  REQUIRE_CHAR(enc, ptr, end);
281
33.1k
  switch (BYTE_TYPE(enc, ptr)) {
282
38.2k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
283
4
  default:
284
4
    *nextTokPtr = ptr;
285
4
    return XML_TOK_INVALID;
286
33.1k
  }
287
1.20M
  while (HAS_CHAR(enc, ptr, end)) {
288
1.20M
    switch (BYTE_TYPE(enc, ptr)) {
289
3.96M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
290
8.73k
    case BT_S:
291
11.3k
    case BT_CR:
292
14.3k
    case BT_LF:
293
14.3k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
294
2
        *nextTokPtr = ptr;
295
2
        return XML_TOK_INVALID;
296
2
      }
297
14.2k
      ptr += MINBPC(enc);
298
11.1M
      while (HAS_CHAR(enc, ptr, end)) {
299
11.1M
        switch (BYTE_TYPE(enc, ptr)) {
300
402k
          INVALID_CASES(ptr, nextTokPtr)
301
62.1k
        case BT_QUEST:
302
62.1k
          ptr += MINBPC(enc);
303
62.1k
          REQUIRE_CHAR(enc, ptr, end);
304
62.1k
          if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
305
14.1k
            *nextTokPtr = ptr + MINBPC(enc);
306
14.1k
            return tok;
307
14.1k
          }
308
48.0k
          break;
309
10.8M
        default:
310
10.8M
          ptr += MINBPC(enc);
311
10.8M
          break;
312
11.1M
        }
313
11.1M
      }
314
98
      return XML_TOK_PARTIAL;
315
18.6k
    case BT_QUEST:
316
18.6k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
317
3
        *nextTokPtr = ptr;
318
3
        return XML_TOK_INVALID;
319
3
      }
320
18.6k
      ptr += MINBPC(enc);
321
18.6k
      REQUIRE_CHAR(enc, ptr, end);
322
18.6k
      if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
323
18.6k
        *nextTokPtr = ptr + MINBPC(enc);
324
18.6k
        return tok;
325
18.6k
      }
326
      /* fall through */
327
27
    default:
328
27
      *nextTokPtr = ptr;
329
27
      return XML_TOK_INVALID;
330
1.20M
    }
331
1.20M
  }
332
54
  return XML_TOK_PARTIAL;
333
33.0k
}
xmltok.c:normal_scanPi
Line
Count
Source
277
33.1k
               const char **nextTokPtr) {
278
33.1k
  int tok;
279
33.1k
  const char *target = ptr;
280
33.1k
  REQUIRE_CHAR(enc, ptr, end);
281
33.1k
  switch (BYTE_TYPE(enc, ptr)) {
282
38.2k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
283
4
  default:
284
4
    *nextTokPtr = ptr;
285
4
    return XML_TOK_INVALID;
286
33.1k
  }
287
1.20M
  while (HAS_CHAR(enc, ptr, end)) {
288
1.20M
    switch (BYTE_TYPE(enc, ptr)) {
289
3.96M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
290
8.73k
    case BT_S:
291
11.3k
    case BT_CR:
292
14.3k
    case BT_LF:
293
14.3k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
294
2
        *nextTokPtr = ptr;
295
2
        return XML_TOK_INVALID;
296
2
      }
297
14.2k
      ptr += MINBPC(enc);
298
11.1M
      while (HAS_CHAR(enc, ptr, end)) {
299
11.1M
        switch (BYTE_TYPE(enc, ptr)) {
300
402k
          INVALID_CASES(ptr, nextTokPtr)
301
62.1k
        case BT_QUEST:
302
62.1k
          ptr += MINBPC(enc);
303
62.1k
          REQUIRE_CHAR(enc, ptr, end);
304
62.1k
          if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
305
14.1k
            *nextTokPtr = ptr + MINBPC(enc);
306
14.1k
            return tok;
307
14.1k
          }
308
48.0k
          break;
309
10.8M
        default:
310
10.8M
          ptr += MINBPC(enc);
311
10.8M
          break;
312
11.1M
        }
313
11.1M
      }
314
98
      return XML_TOK_PARTIAL;
315
18.6k
    case BT_QUEST:
316
18.6k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
317
3
        *nextTokPtr = ptr;
318
3
        return XML_TOK_INVALID;
319
3
      }
320
18.6k
      ptr += MINBPC(enc);
321
18.6k
      REQUIRE_CHAR(enc, ptr, end);
322
18.6k
      if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
323
18.6k
        *nextTokPtr = ptr + MINBPC(enc);
324
18.6k
        return tok;
325
18.6k
      }
326
      /* fall through */
327
27
    default:
328
27
      *nextTokPtr = ptr;
329
27
      return XML_TOK_INVALID;
330
1.20M
    }
331
1.20M
  }
332
54
  return XML_TOK_PARTIAL;
333
33.0k
}
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
1.84k
                         const char **nextTokPtr) {
338
1.84k
  static const char CDATA_LSQB[]
339
1.84k
      = {ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, ASCII_LSQB};
340
1.84k
  int i;
341
1.84k
  UNUSED_P(enc);
342
  /* CDATA[ */
343
1.84k
  REQUIRE_CHARS(enc, ptr, end, 6);
344
12.6k
  for (i = 0; i < 6; i++, ptr += MINBPC(enc)) {
345
10.8k
    if (! CHAR_MATCHES(enc, ptr, CDATA_LSQB[i])) {
346
47
      *nextTokPtr = ptr;
347
47
      return XML_TOK_INVALID;
348
47
    }
349
10.8k
  }
350
1.78k
  *nextTokPtr = ptr;
351
1.78k
  return XML_TOK_CDATA_SECT_OPEN;
352
1.82k
}
xmltok.c:normal_scanCdataSection
Line
Count
Source
337
1.84k
                         const char **nextTokPtr) {
338
1.84k
  static const char CDATA_LSQB[]
339
1.84k
      = {ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, ASCII_LSQB};
340
1.84k
  int i;
341
1.84k
  UNUSED_P(enc);
342
  /* CDATA[ */
343
1.84k
  REQUIRE_CHARS(enc, ptr, end, 6);
344
12.6k
  for (i = 0; i < 6; i++, ptr += MINBPC(enc)) {
345
10.8k
    if (! CHAR_MATCHES(enc, ptr, CDATA_LSQB[i])) {
346
47
      *nextTokPtr = ptr;
347
47
      return XML_TOK_INVALID;
348
47
    }
349
10.8k
  }
350
1.78k
  *nextTokPtr = ptr;
351
1.78k
  return XML_TOK_CDATA_SECT_OPEN;
352
1.82k
}
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
3.09M
                        const char **nextTokPtr) {
357
3.09M
  if (ptr >= end)
358
140
    return XML_TOK_NONE;
359
3.09M
  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
3.09M
  switch (BYTE_TYPE(enc, ptr)) {
369
365k
  case BT_RSQB:
370
365k
    ptr += MINBPC(enc);
371
365k
    REQUIRE_CHAR(enc, ptr, end);
372
365k
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
373
201k
      break;
374
164k
    ptr += MINBPC(enc);
375
164k
    REQUIRE_CHAR(enc, ptr, end);
376
164k
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
377
162k
      ptr -= MINBPC(enc);
378
162k
      break;
379
162k
    }
380
1.66k
    *nextTokPtr = ptr + MINBPC(enc);
381
1.66k
    return XML_TOK_CDATA_SECT_CLOSE;
382
1.33M
  case BT_CR:
383
1.33M
    ptr += MINBPC(enc);
384
1.33M
    REQUIRE_CHAR(enc, ptr, end);
385
1.33M
    if (BYTE_TYPE(enc, ptr) == BT_LF)
386
204k
      ptr += MINBPC(enc);
387
1.33M
    *nextTokPtr = ptr;
388
1.33M
    return XML_TOK_DATA_NEWLINE;
389
719k
  case BT_LF:
390
719k
    *nextTokPtr = ptr + MINBPC(enc);
391
719k
    return XML_TOK_DATA_NEWLINE;
392
719k
    INVALID_CASES(ptr, nextTokPtr)
393
564k
  default:
394
564k
    ptr += MINBPC(enc);
395
564k
    break;
396
3.09M
  }
397
23.2M
  while (HAS_CHAR(enc, ptr, end)) {
398
23.2M
    switch (BYTE_TYPE(enc, ptr)) {
399
0
#  define LEAD_CASE(n)                                                         \
400
448k
  case BT_LEAD##n:                                                             \
401
448k
    if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) {                       \
402
13
      *nextTokPtr = ptr;                                                       \
403
13
      return XML_TOK_DATA_CHARS;                                               \
404
13
    }                                                                          \
405
448k
    ptr += n;                                                                  \
406
448k
    break;
407
208k
      LEAD_CASE(2)
408
191k
      LEAD_CASE(3)
409
49.0k
      LEAD_CASE(4)
410
0
#  undef LEAD_CASE
411
6
    case BT_NONXML:
412
7
    case BT_MALFORM:
413
11
    case BT_TRAIL:
414
483k
    case BT_CR:
415
732k
    case BT_LF:
416
1.04M
    case BT_RSQB:
417
1.04M
      *nextTokPtr = ptr;
418
1.04M
      return XML_TOK_DATA_CHARS;
419
21.7M
    default:
420
21.7M
      ptr += MINBPC(enc);
421
21.7M
      break;
422
23.2M
    }
423
23.2M
  }
424
46
  *nextTokPtr = ptr;
425
46
  return XML_TOK_DATA_CHARS;
426
1.04M
}
xmltok.c:normal_cdataSectionTok
Line
Count
Source
356
3.09M
                        const char **nextTokPtr) {
357
3.09M
  if (ptr >= end)
358
140
    return XML_TOK_NONE;
359
3.09M
  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
3.09M
  switch (BYTE_TYPE(enc, ptr)) {
369
365k
  case BT_RSQB:
370
365k
    ptr += MINBPC(enc);
371
365k
    REQUIRE_CHAR(enc, ptr, end);
372
365k
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
373
201k
      break;
374
164k
    ptr += MINBPC(enc);
375
164k
    REQUIRE_CHAR(enc, ptr, end);
376
164k
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
377
162k
      ptr -= MINBPC(enc);
378
162k
      break;
379
162k
    }
380
1.66k
    *nextTokPtr = ptr + MINBPC(enc);
381
1.66k
    return XML_TOK_CDATA_SECT_CLOSE;
382
1.33M
  case BT_CR:
383
1.33M
    ptr += MINBPC(enc);
384
1.33M
    REQUIRE_CHAR(enc, ptr, end);
385
1.33M
    if (BYTE_TYPE(enc, ptr) == BT_LF)
386
204k
      ptr += MINBPC(enc);
387
1.33M
    *nextTokPtr = ptr;
388
1.33M
    return XML_TOK_DATA_NEWLINE;
389
719k
  case BT_LF:
390
719k
    *nextTokPtr = ptr + MINBPC(enc);
391
719k
    return XML_TOK_DATA_NEWLINE;
392
719k
    INVALID_CASES(ptr, nextTokPtr)
393
564k
  default:
394
564k
    ptr += MINBPC(enc);
395
564k
    break;
396
3.09M
  }
397
23.2M
  while (HAS_CHAR(enc, ptr, end)) {
398
23.2M
    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
208k
      LEAD_CASE(2)
408
191k
      LEAD_CASE(3)
409
49.0k
      LEAD_CASE(4)
410
0
#  undef LEAD_CASE
411
6
    case BT_NONXML:
412
7
    case BT_MALFORM:
413
11
    case BT_TRAIL:
414
483k
    case BT_CR:
415
732k
    case BT_LF:
416
1.04M
    case BT_RSQB:
417
1.04M
      *nextTokPtr = ptr;
418
1.04M
      return XML_TOK_DATA_CHARS;
419
21.7M
    default:
420
21.7M
      ptr += MINBPC(enc);
421
21.7M
      break;
422
23.2M
    }
423
23.2M
  }
424
46
  *nextTokPtr = ptr;
425
46
  return XML_TOK_DATA_CHARS;
426
1.04M
}
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
168k
                   const char **nextTokPtr) {
433
168k
  REQUIRE_CHAR(enc, ptr, end);
434
168k
  switch (BYTE_TYPE(enc, ptr)) {
435
175k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
436
10
  default:
437
10
    *nextTokPtr = ptr;
438
10
    return XML_TOK_INVALID;
439
168k
  }
440
606k
  while (HAS_CHAR(enc, ptr, end)) {
441
606k
    switch (BYTE_TYPE(enc, ptr)) {
442
1.34M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
443
415
    case BT_S:
444
831
    case BT_CR:
445
2.04k
    case BT_LF:
446
17.7k
      for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
447
17.7k
        switch (BYTE_TYPE(enc, ptr)) {
448
12.8k
        case BT_S:
449
14.4k
        case BT_CR:
450
15.6k
        case BT_LF:
451
15.6k
          break;
452
2.00k
        case BT_GT:
453
2.00k
          *nextTokPtr = ptr + MINBPC(enc);
454
2.00k
          return XML_TOK_END_TAG;
455
1
        default:
456
1
          *nextTokPtr = ptr;
457
1
          return XML_TOK_INVALID;
458
17.7k
        }
459
17.7k
      }
460
36
      return XML_TOK_PARTIAL;
461
#  ifdef XML_NS
462
    case BT_COLON:
463
      /* no need to check qname syntax here,
464
         since end-tag must match exactly */
465
      ptr += MINBPC(enc);
466
      break;
467
#  endif
468
166k
    case BT_GT:
469
166k
      *nextTokPtr = ptr + MINBPC(enc);
470
166k
      return XML_TOK_END_TAG;
471
22
    default:
472
22
      *nextTokPtr = ptr;
473
22
      return XML_TOK_INVALID;
474
606k
    }
475
606k
  }
476
76
  return XML_TOK_PARTIAL;
477
168k
}
xmltok.c:normal_scanEndTag
Line
Count
Source
432
168k
                   const char **nextTokPtr) {
433
168k
  REQUIRE_CHAR(enc, ptr, end);
434
168k
  switch (BYTE_TYPE(enc, ptr)) {
435
175k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
436
10
  default:
437
10
    *nextTokPtr = ptr;
438
10
    return XML_TOK_INVALID;
439
168k
  }
440
606k
  while (HAS_CHAR(enc, ptr, end)) {
441
606k
    switch (BYTE_TYPE(enc, ptr)) {
442
1.34M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
443
415
    case BT_S:
444
831
    case BT_CR:
445
2.04k
    case BT_LF:
446
17.7k
      for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
447
17.7k
        switch (BYTE_TYPE(enc, ptr)) {
448
12.8k
        case BT_S:
449
14.4k
        case BT_CR:
450
15.6k
        case BT_LF:
451
15.6k
          break;
452
2.00k
        case BT_GT:
453
2.00k
          *nextTokPtr = ptr + MINBPC(enc);
454
2.00k
          return XML_TOK_END_TAG;
455
1
        default:
456
1
          *nextTokPtr = ptr;
457
1
          return XML_TOK_INVALID;
458
17.7k
        }
459
17.7k
      }
460
36
      return XML_TOK_PARTIAL;
461
#  ifdef XML_NS
462
    case BT_COLON:
463
      /* no need to check qname syntax here,
464
         since end-tag must match exactly */
465
      ptr += MINBPC(enc);
466
      break;
467
#  endif
468
166k
    case BT_GT:
469
166k
      *nextTokPtr = ptr + MINBPC(enc);
470
166k
      return XML_TOK_END_TAG;
471
22
    default:
472
22
      *nextTokPtr = ptr;
473
22
      return XML_TOK_INVALID;
474
606k
    }
475
606k
  }
476
76
  return XML_TOK_PARTIAL;
477
168k
}
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
198k
                       const char **nextTokPtr) {
484
198k
  if (HAS_CHAR(enc, ptr, end)) {
485
198k
    switch (BYTE_TYPE(enc, ptr)) {
486
70.2k
    case BT_DIGIT:
487
198k
    case BT_HEX:
488
198k
      break;
489
6
    default:
490
6
      *nextTokPtr = ptr;
491
6
      return XML_TOK_INVALID;
492
198k
    }
493
745k
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
494
745k
      switch (BYTE_TYPE(enc, ptr)) {
495
322k
      case BT_DIGIT:
496
547k
      case BT_HEX:
497
547k
        break;
498
198k
      case BT_SEMI:
499
198k
        *nextTokPtr = ptr + MINBPC(enc);
500
198k
        return XML_TOK_CHAR_REF;
501
3
      default:
502
3
        *nextTokPtr = ptr;
503
3
        return XML_TOK_INVALID;
504
745k
      }
505
745k
    }
506
198k
  }
507
11
  return XML_TOK_PARTIAL;
508
198k
}
xmltok.c:normal_scanHexCharRef
Line
Count
Source
483
198k
                       const char **nextTokPtr) {
484
198k
  if (HAS_CHAR(enc, ptr, end)) {
485
198k
    switch (BYTE_TYPE(enc, ptr)) {
486
70.2k
    case BT_DIGIT:
487
198k
    case BT_HEX:
488
198k
      break;
489
6
    default:
490
6
      *nextTokPtr = ptr;
491
6
      return XML_TOK_INVALID;
492
198k
    }
493
745k
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
494
745k
      switch (BYTE_TYPE(enc, ptr)) {
495
322k
      case BT_DIGIT:
496
547k
      case BT_HEX:
497
547k
        break;
498
198k
      case BT_SEMI:
499
198k
        *nextTokPtr = ptr + MINBPC(enc);
500
198k
        return XML_TOK_CHAR_REF;
501
3
      default:
502
3
        *nextTokPtr = ptr;
503
3
        return XML_TOK_INVALID;
504
745k
      }
505
745k
    }
506
198k
  }
507
11
  return XML_TOK_PARTIAL;
508
198k
}
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
204k
                    const char **nextTokPtr) {
515
204k
  if (HAS_CHAR(enc, ptr, end)) {
516
204k
    if (CHAR_MATCHES(enc, ptr, ASCII_x))
517
198k
      return PREFIX(scanHexCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
518
6.45k
    switch (BYTE_TYPE(enc, ptr)) {
519
6.44k
    case BT_DIGIT:
520
6.44k
      break;
521
13
    default:
522
13
      *nextTokPtr = ptr;
523
13
      return XML_TOK_INVALID;
524
6.45k
    }
525
15.6k
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
526
15.6k
      switch (BYTE_TYPE(enc, ptr)) {
527
9.18k
      case BT_DIGIT:
528
9.18k
        break;
529
6.43k
      case BT_SEMI:
530
6.43k
        *nextTokPtr = ptr + MINBPC(enc);
531
6.43k
        return XML_TOK_CHAR_REF;
532
1
      default:
533
1
        *nextTokPtr = ptr;
534
1
        return XML_TOK_INVALID;
535
15.6k
      }
536
15.6k
    }
537
6.44k
  }
538
19
  return XML_TOK_PARTIAL;
539
204k
}
xmltok.c:normal_scanCharRef
Line
Count
Source
514
204k
                    const char **nextTokPtr) {
515
204k
  if (HAS_CHAR(enc, ptr, end)) {
516
204k
    if (CHAR_MATCHES(enc, ptr, ASCII_x))
517
198k
      return PREFIX(scanHexCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
518
6.45k
    switch (BYTE_TYPE(enc, ptr)) {
519
6.44k
    case BT_DIGIT:
520
6.44k
      break;
521
13
    default:
522
13
      *nextTokPtr = ptr;
523
13
      return XML_TOK_INVALID;
524
6.45k
    }
525
15.6k
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
526
15.6k
      switch (BYTE_TYPE(enc, ptr)) {
527
9.18k
      case BT_DIGIT:
528
9.18k
        break;
529
6.43k
      case BT_SEMI:
530
6.43k
        *nextTokPtr = ptr + MINBPC(enc);
531
6.43k
        return XML_TOK_CHAR_REF;
532
1
      default:
533
1
        *nextTokPtr = ptr;
534
1
        return XML_TOK_INVALID;
535
15.6k
      }
536
15.6k
    }
537
6.44k
  }
538
19
  return XML_TOK_PARTIAL;
539
204k
}
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
425k
                const char **nextTokPtr) {
546
425k
  REQUIRE_CHAR(enc, ptr, end);
547
425k
  switch (BYTE_TYPE(enc, ptr)) {
548
153k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
549
204k
  case BT_NUM:
550
204k
    return PREFIX(scanCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
551
5
  default:
552
5
    *nextTokPtr = ptr;
553
5
    return XML_TOK_INVALID;
554
425k
  }
555
1.66M
  while (HAS_CHAR(enc, ptr, end)) {
556
1.66M
    switch (BYTE_TYPE(enc, ptr)) {
557
5.27M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
558
221k
    case BT_SEMI:
559
221k
      *nextTokPtr = ptr + MINBPC(enc);
560
221k
      return XML_TOK_ENTITY_REF;
561
13
    default:
562
13
      *nextTokPtr = ptr;
563
13
      return XML_TOK_INVALID;
564
1.66M
    }
565
1.66M
  }
566
68
  return XML_TOK_PARTIAL;
567
221k
}
xmltok.c:normal_scanRef
Line
Count
Source
545
425k
                const char **nextTokPtr) {
546
425k
  REQUIRE_CHAR(enc, ptr, end);
547
425k
  switch (BYTE_TYPE(enc, ptr)) {
548
153k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
549
204k
  case BT_NUM:
550
204k
    return PREFIX(scanCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
551
5
  default:
552
5
    *nextTokPtr = ptr;
553
5
    return XML_TOK_INVALID;
554
425k
  }
555
1.66M
  while (HAS_CHAR(enc, ptr, end)) {
556
1.66M
    switch (BYTE_TYPE(enc, ptr)) {
557
5.27M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
558
221k
    case BT_SEMI:
559
221k
      *nextTokPtr = ptr + MINBPC(enc);
560
221k
      return XML_TOK_ENTITY_REF;
561
13
    default:
562
13
      *nextTokPtr = ptr;
563
13
      return XML_TOK_INVALID;
564
1.66M
    }
565
1.66M
  }
566
68
  return XML_TOK_PARTIAL;
567
221k
}
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
162k
                 const char **nextTokPtr) {
574
#  ifdef XML_NS
575
  int hadColon = 0;
576
#  endif
577
2.10M
  while (HAS_CHAR(enc, ptr, end)) {
578
2.10M
    switch (BYTE_TYPE(enc, ptr)) {
579
1.43M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
580
#  ifdef XML_NS
581
    case BT_COLON:
582
      if (hadColon) {
583
        *nextTokPtr = ptr;
584
        return XML_TOK_INVALID;
585
      }
586
      hadColon = 1;
587
      ptr += MINBPC(enc);
588
      REQUIRE_CHAR(enc, ptr, end);
589
      switch (BYTE_TYPE(enc, ptr)) {
590
        CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
591
      default:
592
        *nextTokPtr = ptr;
593
        return XML_TOK_INVALID;
594
      }
595
      break;
596
#  endif
597
1.64k
    case BT_S:
598
12.4k
    case BT_CR:
599
13.5k
    case BT_LF:
600
44.2k
      for (;;) {
601
44.2k
        int t;
602
603
44.2k
        ptr += MINBPC(enc);
604
44.2k
        REQUIRE_CHAR(enc, ptr, end);
605
44.1k
        t = BYTE_TYPE(enc, ptr);
606
44.1k
        if (t == BT_EQUALS)
607
13.4k
          break;
608
30.7k
        switch (t) {
609
3.73k
        case BT_S:
610
5.25k
        case BT_LF:
611
30.6k
        case BT_CR:
612
30.6k
          break;
613
10
        default:
614
10
          *nextTokPtr = ptr;
615
10
          return XML_TOK_INVALID;
616
30.7k
        }
617
30.7k
      }
618
      /* fall through */
619
1.60M
    case BT_EQUALS: {
620
1.60M
      int open;
621
#  ifdef XML_NS
622
      hadColon = 0;
623
#  endif
624
1.67M
      for (;;) {
625
1.67M
        ptr += MINBPC(enc);
626
1.67M
        REQUIRE_CHAR(enc, ptr, end);
627
1.67M
        open = BYTE_TYPE(enc, ptr);
628
1.67M
        if (open == BT_QUOT || open == BT_APOS)
629
1.60M
          break;
630
67.7k
        switch (open) {
631
18.0k
        case BT_S:
632
34.6k
        case BT_LF:
633
67.6k
        case BT_CR:
634
67.6k
          break;
635
18
        default:
636
18
          *nextTokPtr = ptr;
637
18
          return XML_TOK_INVALID;
638
67.7k
        }
639
67.7k
      }
640
1.60M
      ptr += MINBPC(enc);
641
      /* in attribute value */
642
25.1M
      for (;;) {
643
25.1M
        int t;
644
25.1M
        REQUIRE_CHAR(enc, ptr, end);
645
25.1M
        t = BYTE_TYPE(enc, ptr);
646
25.1M
        if (t == open)
647
1.60M
          break;
648
23.5M
        switch (t) {
649
474k
          INVALID_CASES(ptr, nextTokPtr)
650
129k
        case BT_AMP: {
651
129k
          int tok = PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, &ptr);
652
129k
          if (tok <= 0) {
653
38
            if (tok == XML_TOK_INVALID)
654
16
              *nextTokPtr = ptr;
655
38
            return tok;
656
38
          }
657
129k
          break;
658
129k
        }
659
129k
        case BT_LT:
660
3
          *nextTokPtr = ptr;
661
3
          return XML_TOK_INVALID;
662
23.1M
        default:
663
23.1M
          ptr += MINBPC(enc);
664
23.1M
          break;
665
23.5M
        }
666
23.5M
      }
667
1.60M
      ptr += MINBPC(enc);
668
1.60M
      REQUIRE_CHAR(enc, ptr, end);
669
1.60M
      switch (BYTE_TYPE(enc, ptr)) {
670
873k
      case BT_S:
671
1.54M
      case BT_CR:
672
1.58M
      case BT_LF:
673
1.58M
        break;
674
16.7k
      case BT_SOL:
675
16.7k
        goto sol;
676
3.65k
      case BT_GT:
677
3.65k
        goto gt;
678
8
      default:
679
8
        *nextTokPtr = ptr;
680
8
        return XML_TOK_INVALID;
681
1.60M
      }
682
      /* ptr points to closing quote */
683
1.73M
      for (;;) {
684
1.73M
        ptr += MINBPC(enc);
685
1.73M
        REQUIRE_CHAR(enc, ptr, end);
686
1.73M
        switch (BYTE_TYPE(enc, ptr)) {
687
1.44M
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
688
108k
        case BT_S:
689
133k
        case BT_CR:
690
153k
        case BT_LF:
691
153k
          continue;
692
817
        case BT_GT:
693
4.46k
        gt:
694
4.46k
          *nextTokPtr = ptr + MINBPC(enc);
695
4.46k
          return XML_TOK_START_TAG_WITH_ATTS;
696
140k
        case BT_SOL:
697
157k
        sol:
698
157k
          ptr += MINBPC(enc);
699
157k
          REQUIRE_CHAR(enc, ptr, end);
700
157k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
701
14
            *nextTokPtr = ptr;
702
14
            return XML_TOK_INVALID;
703
14
          }
704
157k
          *nextTokPtr = ptr + MINBPC(enc);
705
157k
          return XML_TOK_EMPTY_ELEMENT_WITH_ATTS;
706
2
        default:
707
2
          *nextTokPtr = ptr;
708
2
          return XML_TOK_INVALID;
709
1.73M
        }
710
1.44M
        break;
711
1.73M
      }
712
1.44M
      break;
713
1.58M
    }
714
1.44M
    default:
715
10
      *nextTokPtr = ptr;
716
10
      return XML_TOK_INVALID;
717
2.10M
    }
718
2.10M
  }
719
66
  return XML_TOK_PARTIAL;
720
162k
}
xmltok.c:normal_scanAtts
Line
Count
Source
573
162k
                 const char **nextTokPtr) {
574
#  ifdef XML_NS
575
  int hadColon = 0;
576
#  endif
577
2.10M
  while (HAS_CHAR(enc, ptr, end)) {
578
2.10M
    switch (BYTE_TYPE(enc, ptr)) {
579
1.43M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
580
#  ifdef XML_NS
581
    case BT_COLON:
582
      if (hadColon) {
583
        *nextTokPtr = ptr;
584
        return XML_TOK_INVALID;
585
      }
586
      hadColon = 1;
587
      ptr += MINBPC(enc);
588
      REQUIRE_CHAR(enc, ptr, end);
589
      switch (BYTE_TYPE(enc, ptr)) {
590
        CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
591
      default:
592
        *nextTokPtr = ptr;
593
        return XML_TOK_INVALID;
594
      }
595
      break;
596
#  endif
597
1.64k
    case BT_S:
598
12.4k
    case BT_CR:
599
13.5k
    case BT_LF:
600
44.2k
      for (;;) {
601
44.2k
        int t;
602
603
44.2k
        ptr += MINBPC(enc);
604
44.2k
        REQUIRE_CHAR(enc, ptr, end);
605
44.1k
        t = BYTE_TYPE(enc, ptr);
606
44.1k
        if (t == BT_EQUALS)
607
13.4k
          break;
608
30.7k
        switch (t) {
609
3.73k
        case BT_S:
610
5.25k
        case BT_LF:
611
30.6k
        case BT_CR:
612
30.6k
          break;
613
10
        default:
614
10
          *nextTokPtr = ptr;
615
10
          return XML_TOK_INVALID;
616
30.7k
        }
617
30.7k
      }
618
      /* fall through */
619
1.60M
    case BT_EQUALS: {
620
1.60M
      int open;
621
#  ifdef XML_NS
622
      hadColon = 0;
623
#  endif
624
1.67M
      for (;;) {
625
1.67M
        ptr += MINBPC(enc);
626
1.67M
        REQUIRE_CHAR(enc, ptr, end);
627
1.67M
        open = BYTE_TYPE(enc, ptr);
628
1.67M
        if (open == BT_QUOT || open == BT_APOS)
629
1.60M
          break;
630
67.7k
        switch (open) {
631
18.0k
        case BT_S:
632
34.6k
        case BT_LF:
633
67.6k
        case BT_CR:
634
67.6k
          break;
635
18
        default:
636
18
          *nextTokPtr = ptr;
637
18
          return XML_TOK_INVALID;
638
67.7k
        }
639
67.7k
      }
640
1.60M
      ptr += MINBPC(enc);
641
      /* in attribute value */
642
25.1M
      for (;;) {
643
25.1M
        int t;
644
25.1M
        REQUIRE_CHAR(enc, ptr, end);
645
25.1M
        t = BYTE_TYPE(enc, ptr);
646
25.1M
        if (t == open)
647
1.60M
          break;
648
23.5M
        switch (t) {
649
474k
          INVALID_CASES(ptr, nextTokPtr)
650
129k
        case BT_AMP: {
651
129k
          int tok = PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, &ptr);
652
129k
          if (tok <= 0) {
653
38
            if (tok == XML_TOK_INVALID)
654
16
              *nextTokPtr = ptr;
655
38
            return tok;
656
38
          }
657
129k
          break;
658
129k
        }
659
129k
        case BT_LT:
660
3
          *nextTokPtr = ptr;
661
3
          return XML_TOK_INVALID;
662
23.1M
        default:
663
23.1M
          ptr += MINBPC(enc);
664
23.1M
          break;
665
23.5M
        }
666
23.5M
      }
667
1.60M
      ptr += MINBPC(enc);
668
1.60M
      REQUIRE_CHAR(enc, ptr, end);
669
1.60M
      switch (BYTE_TYPE(enc, ptr)) {
670
873k
      case BT_S:
671
1.54M
      case BT_CR:
672
1.58M
      case BT_LF:
673
1.58M
        break;
674
16.7k
      case BT_SOL:
675
16.7k
        goto sol;
676
3.65k
      case BT_GT:
677
3.65k
        goto gt;
678
8
      default:
679
8
        *nextTokPtr = ptr;
680
8
        return XML_TOK_INVALID;
681
1.60M
      }
682
      /* ptr points to closing quote */
683
1.73M
      for (;;) {
684
1.73M
        ptr += MINBPC(enc);
685
1.73M
        REQUIRE_CHAR(enc, ptr, end);
686
1.73M
        switch (BYTE_TYPE(enc, ptr)) {
687
1.44M
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
688
108k
        case BT_S:
689
133k
        case BT_CR:
690
153k
        case BT_LF:
691
153k
          continue;
692
817
        case BT_GT:
693
4.46k
        gt:
694
4.46k
          *nextTokPtr = ptr + MINBPC(enc);
695
4.46k
          return XML_TOK_START_TAG_WITH_ATTS;
696
140k
        case BT_SOL:
697
157k
        sol:
698
157k
          ptr += MINBPC(enc);
699
157k
          REQUIRE_CHAR(enc, ptr, end);
700
157k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
701
14
            *nextTokPtr = ptr;
702
14
            return XML_TOK_INVALID;
703
14
          }
704
157k
          *nextTokPtr = ptr + MINBPC(enc);
705
157k
          return XML_TOK_EMPTY_ELEMENT_WITH_ATTS;
706
2
        default:
707
2
          *nextTokPtr = ptr;
708
2
          return XML_TOK_INVALID;
709
1.73M
        }
710
1.44M
        break;
711
1.73M
      }
712
1.44M
      break;
713
1.58M
    }
714
1.44M
    default:
715
10
      *nextTokPtr = ptr;
716
10
      return XML_TOK_INVALID;
717
2.10M
    }
718
2.10M
  }
719
66
  return XML_TOK_PARTIAL;
720
162k
}
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
675k
               const char **nextTokPtr) {
727
#  ifdef XML_NS
728
  int hadColon;
729
#  endif
730
675k
  REQUIRE_CHAR(enc, ptr, end);
731
675k
  switch (BYTE_TYPE(enc, ptr)) {
732
433k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
733
25.6k
  case BT_EXCL:
734
25.6k
    ptr += MINBPC(enc);
735
25.6k
    REQUIRE_CHAR(enc, ptr, end);
736
25.6k
    switch (BYTE_TYPE(enc, ptr)) {
737
23.7k
    case BT_MINUS:
738
23.7k
      return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
739
1.84k
    case BT_LSQB:
740
1.84k
      return PREFIX(scanCdataSection)(enc, ptr + MINBPC(enc), end, nextTokPtr);
741
25.6k
    }
742
3
    *nextTokPtr = ptr;
743
3
    return XML_TOK_INVALID;
744
20.7k
  case BT_QUEST:
745
20.7k
    return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
746
168k
  case BT_SOL:
747
168k
    return PREFIX(scanEndTag)(enc, ptr + MINBPC(enc), end, nextTokPtr);
748
14
  default:
749
14
    *nextTokPtr = ptr;
750
14
    return XML_TOK_INVALID;
751
675k
  }
752
#  ifdef XML_NS
753
  hadColon = 0;
754
#  endif
755
  /* we have a start-tag */
756
11.2M
  while (HAS_CHAR(enc, ptr, end)) {
757
11.2M
    switch (BYTE_TYPE(enc, ptr)) {
758
43.0M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
759
#  ifdef XML_NS
760
    case BT_COLON:
761
      if (hadColon) {
762
        *nextTokPtr = ptr;
763
        return XML_TOK_INVALID;
764
      }
765
      hadColon = 1;
766
      ptr += MINBPC(enc);
767
      REQUIRE_CHAR(enc, ptr, end);
768
      switch (BYTE_TYPE(enc, ptr)) {
769
        CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
770
      default:
771
        *nextTokPtr = ptr;
772
        return XML_TOK_INVALID;
773
      }
774
      break;
775
#  endif
776
156k
    case BT_S:
777
163k
    case BT_CR:
778
172k
    case BT_LF: {
779
172k
      ptr += MINBPC(enc);
780
194k
      while (HAS_CHAR(enc, ptr, end)) {
781
194k
        switch (BYTE_TYPE(enc, ptr)) {
782
34.2k
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
783
779
        case BT_GT:
784
779
          goto gt;
785
8.90k
        case BT_SOL:
786
8.90k
          goto sol;
787
1.92k
        case BT_S:
788
20.9k
        case BT_CR:
789
22.3k
        case BT_LF:
790
22.3k
          ptr += MINBPC(enc);
791
22.3k
          continue;
792
8
        default:
793
8
          *nextTokPtr = ptr;
794
8
          return XML_TOK_INVALID;
795
194k
        }
796
162k
        return PREFIX(scanAtts)(enc, ptr, end, nextTokPtr);
797
194k
      }
798
50
      return XML_TOK_PARTIAL;
799
172k
    }
800
260k
    case BT_GT:
801
261k
    gt:
802
261k
      *nextTokPtr = ptr + MINBPC(enc);
803
261k
      return XML_TOK_START_TAG_NO_ATTS;
804
27.7k
    case BT_SOL:
805
36.6k
    sol:
806
36.6k
      ptr += MINBPC(enc);
807
36.6k
      REQUIRE_CHAR(enc, ptr, end);
808
36.6k
      if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
809
11
        *nextTokPtr = ptr;
810
11
        return XML_TOK_INVALID;
811
11
      }
812
36.6k
      *nextTokPtr = ptr + MINBPC(enc);
813
36.6k
      return XML_TOK_EMPTY_ELEMENT_NO_ATTS;
814
16
    default:
815
16
      *nextTokPtr = ptr;
816
16
      return XML_TOK_INVALID;
817
11.2M
    }
818
11.2M
  }
819
94
  return XML_TOK_PARTIAL;
820
460k
}
xmltok.c:normal_scanLt
Line
Count
Source
726
675k
               const char **nextTokPtr) {
727
#  ifdef XML_NS
728
  int hadColon;
729
#  endif
730
675k
  REQUIRE_CHAR(enc, ptr, end);
731
675k
  switch (BYTE_TYPE(enc, ptr)) {
732
433k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
733
25.6k
  case BT_EXCL:
734
25.6k
    ptr += MINBPC(enc);
735
25.6k
    REQUIRE_CHAR(enc, ptr, end);
736
25.6k
    switch (BYTE_TYPE(enc, ptr)) {
737
23.7k
    case BT_MINUS:
738
23.7k
      return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
739
1.84k
    case BT_LSQB:
740
1.84k
      return PREFIX(scanCdataSection)(enc, ptr + MINBPC(enc), end, nextTokPtr);
741
25.6k
    }
742
3
    *nextTokPtr = ptr;
743
3
    return XML_TOK_INVALID;
744
20.7k
  case BT_QUEST:
745
20.7k
    return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
746
168k
  case BT_SOL:
747
168k
    return PREFIX(scanEndTag)(enc, ptr + MINBPC(enc), end, nextTokPtr);
748
14
  default:
749
14
    *nextTokPtr = ptr;
750
14
    return XML_TOK_INVALID;
751
675k
  }
752
#  ifdef XML_NS
753
  hadColon = 0;
754
#  endif
755
  /* we have a start-tag */
756
11.2M
  while (HAS_CHAR(enc, ptr, end)) {
757
11.2M
    switch (BYTE_TYPE(enc, ptr)) {
758
43.0M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
759
#  ifdef XML_NS
760
    case BT_COLON:
761
      if (hadColon) {
762
        *nextTokPtr = ptr;
763
        return XML_TOK_INVALID;
764
      }
765
      hadColon = 1;
766
      ptr += MINBPC(enc);
767
      REQUIRE_CHAR(enc, ptr, end);
768
      switch (BYTE_TYPE(enc, ptr)) {
769
        CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
770
      default:
771
        *nextTokPtr = ptr;
772
        return XML_TOK_INVALID;
773
      }
774
      break;
775
#  endif
776
156k
    case BT_S:
777
163k
    case BT_CR:
778
172k
    case BT_LF: {
779
172k
      ptr += MINBPC(enc);
780
194k
      while (HAS_CHAR(enc, ptr, end)) {
781
194k
        switch (BYTE_TYPE(enc, ptr)) {
782
34.2k
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
783
779
        case BT_GT:
784
779
          goto gt;
785
8.90k
        case BT_SOL:
786
8.90k
          goto sol;
787
1.92k
        case BT_S:
788
20.9k
        case BT_CR:
789
22.3k
        case BT_LF:
790
22.3k
          ptr += MINBPC(enc);
791
22.3k
          continue;
792
8
        default:
793
8
          *nextTokPtr = ptr;
794
8
          return XML_TOK_INVALID;
795
194k
        }
796
162k
        return PREFIX(scanAtts)(enc, ptr, end, nextTokPtr);
797
194k
      }
798
50
      return XML_TOK_PARTIAL;
799
172k
    }
800
260k
    case BT_GT:
801
261k
    gt:
802
261k
      *nextTokPtr = ptr + MINBPC(enc);
803
261k
      return XML_TOK_START_TAG_NO_ATTS;
804
27.7k
    case BT_SOL:
805
36.6k
    sol:
806
36.6k
      ptr += MINBPC(enc);
807
36.6k
      REQUIRE_CHAR(enc, ptr, end);
808
36.6k
      if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
809
11
        *nextTokPtr = ptr;
810
11
        return XML_TOK_INVALID;
811
11
      }
812
36.6k
      *nextTokPtr = ptr + MINBPC(enc);
813
36.6k
      return XML_TOK_EMPTY_ELEMENT_NO_ATTS;
814
16
    default:
815
16
      *nextTokPtr = ptr;
816
16
      return XML_TOK_INVALID;
817
11.2M
    }
818
11.2M
  }
819
94
  return XML_TOK_PARTIAL;
820
460k
}
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
4.06M
                   const char **nextTokPtr) {
825
4.06M
  if (ptr >= end)
826
2.84k
    return XML_TOK_NONE;
827
4.06M
  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
4.06M
  switch (BYTE_TYPE(enc, ptr)) {
837
675k
  case BT_LT:
838
675k
    return PREFIX(scanLt)(enc, ptr + MINBPC(enc), end, nextTokPtr);
839
58.1k
  case BT_AMP:
840
58.1k
    return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
841
1.51M
  case BT_CR:
842
1.51M
    ptr += MINBPC(enc);
843
1.51M
    if (! HAS_CHAR(enc, ptr, end))
844
14
      return XML_TOK_TRAILING_CR;
845
1.51M
    if (BYTE_TYPE(enc, ptr) == BT_LF)
846
331k
      ptr += MINBPC(enc);
847
1.51M
    *nextTokPtr = ptr;
848
1.51M
    return XML_TOK_DATA_NEWLINE;
849
1.15M
  case BT_LF:
850
1.15M
    *nextTokPtr = ptr + MINBPC(enc);
851
1.15M
    return XML_TOK_DATA_NEWLINE;
852
65.6k
  case BT_RSQB:
853
65.6k
    ptr += MINBPC(enc);
854
65.6k
    if (! HAS_CHAR(enc, ptr, end))
855
6
      return XML_TOK_TRAILING_RSQB;
856
65.6k
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
857
46.2k
      break;
858
19.4k
    ptr += MINBPC(enc);
859
19.4k
    if (! HAS_CHAR(enc, ptr, end))
860
2
      return XML_TOK_TRAILING_RSQB;
861
19.4k
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
862
19.4k
      ptr -= MINBPC(enc);
863
19.4k
      break;
864
19.4k
    }
865
1
    *nextTokPtr = ptr;
866
1
    return XML_TOK_INVALID;
867
98.9k
    INVALID_CASES(ptr, nextTokPtr)
868
546k
  default:
869
546k
    ptr += MINBPC(enc);
870
546k
    break;
871
4.06M
  }
872
15.7M
  while (HAS_CHAR(enc, ptr, end)) {
873
15.7M
    switch (BYTE_TYPE(enc, ptr)) {
874
0
#  define LEAD_CASE(n)                                                         \
875
231k
  case BT_LEAD##n:                                                             \
876
231k
    if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) {                       \
877
27
      *nextTokPtr = ptr;                                                       \
878
27
      return XML_TOK_DATA_CHARS;                                               \
879
27
    }                                                                          \
880
231k
    ptr += n;                                                                  \
881
231k
    break;
882
130k
      LEAD_CASE(2)
883
57.3k
      LEAD_CASE(3)
884
44.5k
      LEAD_CASE(4)
885
0
#  undef LEAD_CASE
886
252k
    case BT_RSQB:
887
252k
      if (HAS_CHARS(enc, ptr, end, 2)) {
888
252k
        if (! CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_RSQB)) {
889
88.6k
          ptr += MINBPC(enc);
890
88.6k
          break;
891
88.6k
        }
892
163k
        if (HAS_CHARS(enc, ptr, end, 3)) {
893
163k
          if (! CHAR_MATCHES(enc, ptr + 2 * MINBPC(enc), ASCII_GT)) {
894
163k
            ptr += MINBPC(enc);
895
163k
            break;
896
163k
          }
897
4
          *nextTokPtr = ptr + 2 * MINBPC(enc);
898
4
          return XML_TOK_INVALID;
899
163k
        }
900
163k
      }
901
      /* fall through */
902
47.9k
    case BT_AMP:
903
142k
    case BT_LT:
904
142k
    case BT_NONXML:
905
142k
    case BT_MALFORM:
906
142k
    case BT_TRAIL:
907
493k
    case BT_CR:
908
660k
    case BT_LF:
909
660k
      *nextTokPtr = ptr;
910
660k
      return XML_TOK_DATA_CHARS;
911
14.5M
    default:
912
14.5M
      ptr += MINBPC(enc);
913
14.5M
      break;
914
15.7M
    }
915
15.7M
  }
916
1.35k
  *nextTokPtr = ptr;
917
1.35k
  return XML_TOK_DATA_CHARS;
918
661k
}
xmltok.c:normal_contentTok
Line
Count
Source
824
4.06M
                   const char **nextTokPtr) {
825
4.06M
  if (ptr >= end)
826
2.84k
    return XML_TOK_NONE;
827
4.06M
  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
4.06M
  switch (BYTE_TYPE(enc, ptr)) {
837
675k
  case BT_LT:
838
675k
    return PREFIX(scanLt)(enc, ptr + MINBPC(enc), end, nextTokPtr);
839
58.1k
  case BT_AMP:
840
58.1k
    return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
841
1.51M
  case BT_CR:
842
1.51M
    ptr += MINBPC(enc);
843
1.51M
    if (! HAS_CHAR(enc, ptr, end))
844
14
      return XML_TOK_TRAILING_CR;
845
1.51M
    if (BYTE_TYPE(enc, ptr) == BT_LF)
846
331k
      ptr += MINBPC(enc);
847
1.51M
    *nextTokPtr = ptr;
848
1.51M
    return XML_TOK_DATA_NEWLINE;
849
1.15M
  case BT_LF:
850
1.15M
    *nextTokPtr = ptr + MINBPC(enc);
851
1.15M
    return XML_TOK_DATA_NEWLINE;
852
65.6k
  case BT_RSQB:
853
65.6k
    ptr += MINBPC(enc);
854
65.6k
    if (! HAS_CHAR(enc, ptr, end))
855
6
      return XML_TOK_TRAILING_RSQB;
856
65.6k
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
857
46.2k
      break;
858
19.4k
    ptr += MINBPC(enc);
859
19.4k
    if (! HAS_CHAR(enc, ptr, end))
860
2
      return XML_TOK_TRAILING_RSQB;
861
19.4k
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
862
19.4k
      ptr -= MINBPC(enc);
863
19.4k
      break;
864
19.4k
    }
865
1
    *nextTokPtr = ptr;
866
1
    return XML_TOK_INVALID;
867
98.9k
    INVALID_CASES(ptr, nextTokPtr)
868
546k
  default:
869
546k
    ptr += MINBPC(enc);
870
546k
    break;
871
4.06M
  }
872
15.7M
  while (HAS_CHAR(enc, ptr, end)) {
873
15.7M
    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
130k
      LEAD_CASE(2)
883
57.3k
      LEAD_CASE(3)
884
44.5k
      LEAD_CASE(4)
885
0
#  undef LEAD_CASE
886
252k
    case BT_RSQB:
887
252k
      if (HAS_CHARS(enc, ptr, end, 2)) {
888
252k
        if (! CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_RSQB)) {
889
88.6k
          ptr += MINBPC(enc);
890
88.6k
          break;
891
88.6k
        }
892
163k
        if (HAS_CHARS(enc, ptr, end, 3)) {
893
163k
          if (! CHAR_MATCHES(enc, ptr + 2 * MINBPC(enc), ASCII_GT)) {
894
163k
            ptr += MINBPC(enc);
895
163k
            break;
896
163k
          }
897
4
          *nextTokPtr = ptr + 2 * MINBPC(enc);
898
4
          return XML_TOK_INVALID;
899
163k
        }
900
163k
      }
901
      /* fall through */
902
47.9k
    case BT_AMP:
903
142k
    case BT_LT:
904
142k
    case BT_NONXML:
905
142k
    case BT_MALFORM:
906
142k
    case BT_TRAIL:
907
493k
    case BT_CR:
908
660k
    case BT_LF:
909
660k
      *nextTokPtr = ptr;
910
660k
      return XML_TOK_DATA_CHARS;
911
14.5M
    default:
912
14.5M
      ptr += MINBPC(enc);
913
14.5M
      break;
914
15.7M
    }
915
15.7M
  }
916
1.35k
  *nextTokPtr = ptr;
917
1.35k
  return XML_TOK_DATA_CHARS;
918
661k
}
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
50.0k
                    const char **nextTokPtr) {
925
50.0k
  REQUIRE_CHAR(enc, ptr, end);
926
50.0k
  switch (BYTE_TYPE(enc, ptr)) {
927
80.6k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
928
2.58k
  case BT_S:
929
3.22k
  case BT_LF:
930
4.09k
  case BT_CR:
931
4.09k
  case BT_PERCNT:
932
4.09k
    *nextTokPtr = ptr;
933
4.09k
    return XML_TOK_PERCENT;
934
2
  default:
935
2
    *nextTokPtr = ptr;
936
2
    return XML_TOK_INVALID;
937
50.0k
  }
938
2.58M
  while (HAS_CHAR(enc, ptr, end)) {
939
2.58M
    switch (BYTE_TYPE(enc, ptr)) {
940
9.35M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
941
45.7k
    case BT_SEMI:
942
45.7k
      *nextTokPtr = ptr + MINBPC(enc);
943
45.7k
      return XML_TOK_PARAM_ENTITY_REF;
944
21
    default:
945
21
      *nextTokPtr = ptr;
946
21
      return XML_TOK_INVALID;
947
2.58M
    }
948
2.58M
  }
949
72
  return XML_TOK_PARTIAL;
950
45.9k
}
xmltok.c:normal_scanPercent
Line
Count
Source
924
50.0k
                    const char **nextTokPtr) {
925
50.0k
  REQUIRE_CHAR(enc, ptr, end);
926
50.0k
  switch (BYTE_TYPE(enc, ptr)) {
927
80.6k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
928
2.58k
  case BT_S:
929
3.22k
  case BT_LF:
930
4.09k
  case BT_CR:
931
4.09k
  case BT_PERCNT:
932
4.09k
    *nextTokPtr = ptr;
933
4.09k
    return XML_TOK_PERCENT;
934
2
  default:
935
2
    *nextTokPtr = ptr;
936
2
    return XML_TOK_INVALID;
937
50.0k
  }
938
2.58M
  while (HAS_CHAR(enc, ptr, end)) {
939
2.58M
    switch (BYTE_TYPE(enc, ptr)) {
940
9.35M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
941
45.7k
    case BT_SEMI:
942
45.7k
      *nextTokPtr = ptr + MINBPC(enc);
943
45.7k
      return XML_TOK_PARAM_ENTITY_REF;
944
21
    default:
945
21
      *nextTokPtr = ptr;
946
21
      return XML_TOK_INVALID;
947
2.58M
    }
948
2.58M
  }
949
72
  return XML_TOK_PARTIAL;
950
45.9k
}
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
65.3k
                      const char **nextTokPtr) {
955
65.3k
  REQUIRE_CHAR(enc, ptr, end);
956
65.3k
  switch (BYTE_TYPE(enc, ptr)) {
957
65.0k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
958
1
  default:
959
1
    *nextTokPtr = ptr;
960
1
    return XML_TOK_INVALID;
961
65.3k
  }
962
944k
  while (HAS_CHAR(enc, ptr, end)) {
963
944k
    switch (BYTE_TYPE(enc, ptr)) {
964
3.01M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
965
58.6k
    case BT_CR:
966
61.1k
    case BT_LF:
967
61.5k
    case BT_S:
968
61.7k
    case BT_RPAR:
969
64.8k
    case BT_GT:
970
64.8k
    case BT_PERCNT:
971
65.0k
    case BT_VERBAR:
972
65.0k
      *nextTokPtr = ptr;
973
65.0k
      return XML_TOK_POUND_NAME;
974
19
    default:
975
19
      *nextTokPtr = ptr;
976
19
      return XML_TOK_INVALID;
977
944k
    }
978
944k
  }
979
206
  return -XML_TOK_POUND_NAME;
980
65.3k
}
xmltok.c:normal_scanPoundName
Line
Count
Source
954
65.3k
                      const char **nextTokPtr) {
955
65.3k
  REQUIRE_CHAR(enc, ptr, end);
956
65.3k
  switch (BYTE_TYPE(enc, ptr)) {
957
65.0k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
958
1
  default:
959
1
    *nextTokPtr = ptr;
960
1
    return XML_TOK_INVALID;
961
65.3k
  }
962
944k
  while (HAS_CHAR(enc, ptr, end)) {
963
944k
    switch (BYTE_TYPE(enc, ptr)) {
964
3.01M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
965
58.6k
    case BT_CR:
966
61.1k
    case BT_LF:
967
61.5k
    case BT_S:
968
61.7k
    case BT_RPAR:
969
64.8k
    case BT_GT:
970
64.8k
    case BT_PERCNT:
971
65.0k
    case BT_VERBAR:
972
65.0k
      *nextTokPtr = ptr;
973
65.0k
      return XML_TOK_POUND_NAME;
974
19
    default:
975
19
      *nextTokPtr = ptr;
976
19
      return XML_TOK_INVALID;
977
944k
    }
978
944k
  }
979
206
  return -XML_TOK_POUND_NAME;
980
65.3k
}
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
38.1k
                const char **nextTokPtr) {
985
6.02M
  while (HAS_CHAR(enc, ptr, end)) {
986
6.02M
    int t = BYTE_TYPE(enc, ptr);
987
6.02M
    switch (t) {
988
196k
      INVALID_CASES(ptr, nextTokPtr)
989
15.3k
    case BT_QUOT:
990
47.5k
    case BT_APOS:
991
47.5k
      ptr += MINBPC(enc);
992
47.5k
      if (t != open)
993
9.54k
        break;
994
37.9k
      if (! HAS_CHAR(enc, ptr, end))
995
492
        return -XML_TOK_LITERAL;
996
37.4k
      *nextTokPtr = ptr;
997
37.4k
      switch (BYTE_TYPE(enc, ptr)) {
998
7.91k
      case BT_S:
999
10.8k
      case BT_CR:
1000
18.9k
      case BT_LF:
1001
37.1k
      case BT_GT:
1002
37.1k
      case BT_PERCNT:
1003
37.4k
      case BT_LSQB:
1004
37.4k
        return XML_TOK_LITERAL;
1005
16
      default:
1006
16
        return XML_TOK_INVALID;
1007
37.4k
      }
1008
5.87M
    default:
1009
5.87M
      ptr += MINBPC(enc);
1010
5.87M
      break;
1011
6.02M
    }
1012
6.02M
  }
1013
90
  return XML_TOK_PARTIAL;
1014
38.1k
}
xmltok.c:normal_scanLit
Line
Count
Source
984
38.1k
                const char **nextTokPtr) {
985
6.02M
  while (HAS_CHAR(enc, ptr, end)) {
986
6.02M
    int t = BYTE_TYPE(enc, ptr);
987
6.02M
    switch (t) {
988
196k
      INVALID_CASES(ptr, nextTokPtr)
989
15.3k
    case BT_QUOT:
990
47.5k
    case BT_APOS:
991
47.5k
      ptr += MINBPC(enc);
992
47.5k
      if (t != open)
993
9.54k
        break;
994
37.9k
      if (! HAS_CHAR(enc, ptr, end))
995
492
        return -XML_TOK_LITERAL;
996
37.4k
      *nextTokPtr = ptr;
997
37.4k
      switch (BYTE_TYPE(enc, ptr)) {
998
7.91k
      case BT_S:
999
10.8k
      case BT_CR:
1000
18.9k
      case BT_LF:
1001
37.1k
      case BT_GT:
1002
37.1k
      case BT_PERCNT:
1003
37.4k
      case BT_LSQB:
1004
37.4k
        return XML_TOK_LITERAL;
1005
16
      default:
1006
16
        return XML_TOK_INVALID;
1007
37.4k
      }
1008
5.87M
    default:
1009
5.87M
      ptr += MINBPC(enc);
1010
5.87M
      break;
1011
6.02M
    }
1012
6.02M
  }
1013
90
  return XML_TOK_PARTIAL;
1014
38.1k
}
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
3.62M
                  const char **nextTokPtr) {
1019
3.62M
  int tok;
1020
3.62M
  if (ptr >= end)
1021
8.21k
    return XML_TOK_NONE;
1022
3.62M
  if (MINBPC(enc) > 1) {
1023
215
    size_t n = end - ptr;
1024
215
    if (n & (MINBPC(enc) - 1)) {
1025
48
      n &= ~(MINBPC(enc) - 1);
1026
48
      if (n == 0)
1027
4
        return XML_TOK_PARTIAL;
1028
44
      end = ptr + n;
1029
44
    }
1030
215
  }
1031
3.62M
  switch (BYTE_TYPE(enc, ptr)) {
1032
8.65k
  case BT_QUOT:
1033
8.65k
    return PREFIX(scanLit)(BT_QUOT, enc, ptr + MINBPC(enc), end, nextTokPtr);
1034
29.4k
  case BT_APOS:
1035
29.4k
    return PREFIX(scanLit)(BT_APOS, enc, ptr + MINBPC(enc), end, nextTokPtr);
1036
73.5k
  case BT_LT: {
1037
73.5k
    ptr += MINBPC(enc);
1038
73.5k
    REQUIRE_CHAR(enc, ptr, end);
1039
73.5k
    switch (BYTE_TYPE(enc, ptr)) {
1040
55.5k
    case BT_EXCL:
1041
55.5k
      return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1042
12.3k
    case BT_QUEST:
1043
12.3k
      return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1044
4.40k
    case BT_NMSTRT:
1045
5.54k
    case BT_HEX:
1046
5.54k
    case BT_NONASCII:
1047
5.56k
    case BT_LEAD2:
1048
5.61k
    case BT_LEAD3:
1049
5.61k
    case BT_LEAD4:
1050
5.61k
      *nextTokPtr = ptr - MINBPC(enc);
1051
5.61k
      return XML_TOK_INSTANCE_START;
1052
73.5k
    }
1053
18
    *nextTokPtr = ptr;
1054
18
    return XML_TOK_INVALID;
1055
73.5k
  }
1056
190k
  case BT_CR:
1057
190k
    if (ptr + MINBPC(enc) == end) {
1058
375
      *nextTokPtr = end;
1059
      /* indicate that this might be part of a CR/LF pair */
1060
375
      return -XML_TOK_PROLOG_S;
1061
375
    }
1062
    /* fall through */
1063
322k
  case BT_S:
1064
372k
  case BT_LF:
1065
498k
    for (;;) {
1066
498k
      ptr += MINBPC(enc);
1067
498k
      if (! HAS_CHAR(enc, ptr, end))
1068
202
        break;
1069
497k
      switch (BYTE_TYPE(enc, ptr)) {
1070
9.45k
      case BT_S:
1071
16.4k
      case BT_LF:
1072
16.4k
        break;
1073
109k
      case BT_CR:
1074
        /* don't split CR/LF pair */
1075
109k
        if (ptr + MINBPC(enc) != end)
1076
109k
          break;
1077
        /* fall through */
1078
372k
      default:
1079
372k
        *nextTokPtr = ptr;
1080
372k
        return XML_TOK_PROLOG_S;
1081
497k
      }
1082
497k
    }
1083
202
    *nextTokPtr = ptr;
1084
202
    return XML_TOK_PROLOG_S;
1085
50.0k
  case BT_PERCNT:
1086
50.0k
    return PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1087
7.05k
  case BT_COMMA:
1088
7.05k
    *nextTokPtr = ptr + MINBPC(enc);
1089
7.05k
    return XML_TOK_COMMA;
1090
2.56k
  case BT_LSQB:
1091
2.56k
    *nextTokPtr = ptr + MINBPC(enc);
1092
2.56k
    return XML_TOK_OPEN_BRACKET;
1093
1.28k
  case BT_RSQB:
1094
1.28k
    ptr += MINBPC(enc);
1095
1.28k
    if (! HAS_CHAR(enc, ptr, end))
1096
3
      return -XML_TOK_CLOSE_BRACKET;
1097
1.27k
    if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) {
1098
23
      REQUIRE_CHARS(enc, ptr, end, 2);
1099
21
      if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_GT)) {
1100
2
        *nextTokPtr = ptr + 2 * MINBPC(enc);
1101
2
        return XML_TOK_COND_SECT_CLOSE;
1102
2
      }
1103
21
    }
1104
1.27k
    *nextTokPtr = ptr;
1105
1.27k
    return XML_TOK_CLOSE_BRACKET;
1106
2.52M
  case BT_LPAR:
1107
2.52M
    *nextTokPtr = ptr + MINBPC(enc);
1108
2.52M
    return XML_TOK_OPEN_PAREN;
1109
97.4k
  case BT_RPAR:
1110
97.4k
    ptr += MINBPC(enc);
1111
97.4k
    if (! HAS_CHAR(enc, ptr, end))
1112
87
      return -XML_TOK_CLOSE_PAREN;
1113
97.4k
    switch (BYTE_TYPE(enc, ptr)) {
1114
5.36k
    case BT_AST:
1115
5.36k
      *nextTokPtr = ptr + MINBPC(enc);
1116
5.36k
      return XML_TOK_CLOSE_PAREN_ASTERISK;
1117
3.81k
    case BT_QUEST:
1118
3.81k
      *nextTokPtr = ptr + MINBPC(enc);
1119
3.81k
      return XML_TOK_CLOSE_PAREN_QUESTION;
1120
5.53k
    case BT_PLUS:
1121
5.53k
      *nextTokPtr = ptr + MINBPC(enc);
1122
5.53k
      return XML_TOK_CLOSE_PAREN_PLUS;
1123
2.98k
    case BT_CR:
1124
3.52k
    case BT_LF:
1125
61.9k
    case BT_S:
1126
63.5k
    case BT_GT:
1127
66.8k
    case BT_COMMA:
1128
73.6k
    case BT_VERBAR:
1129
82.6k
    case BT_RPAR:
1130
82.6k
      *nextTokPtr = ptr;
1131
82.6k
      return XML_TOK_CLOSE_PAREN;
1132
97.4k
    }
1133
23
    *nextTokPtr = ptr;
1134
23
    return XML_TOK_INVALID;
1135
48.8k
  case BT_VERBAR:
1136
48.8k
    *nextTokPtr = ptr + MINBPC(enc);
1137
48.8k
    return XML_TOK_OR;
1138
49.9k
  case BT_GT:
1139
49.9k
    *nextTokPtr = ptr + MINBPC(enc);
1140
49.9k
    return XML_TOK_DECL_CLOSE;
1141
65.3k
  case BT_NUM:
1142
65.3k
    return PREFIX(scanPoundName)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1143
0
#  define LEAD_CASE(n)                                                         \
1144
7.54k
  case BT_LEAD##n:                                                             \
1145
7.54k
    if (end - ptr < n)                                                         \
1146
66
      return XML_TOK_PARTIAL_CHAR;                                             \
1147
7.48k
    if (IS_INVALID_CHAR(enc, ptr, n)) {                                        \
1148
84
      *nextTokPtr = ptr;                                                       \
1149
84
      return XML_TOK_INVALID;                                                  \
1150
84
    }                                                                          \
1151
7.48k
    if (IS_NMSTRT_CHAR(enc, ptr, n)) {                                         \
1152
5.48k
      ptr += n;                                                                \
1153
5.48k
      tok = XML_TOK_NAME;                                                      \
1154
5.48k
      break;                                                                   \
1155
5.48k
    }                                                                          \
1156
7.39k
    if (IS_NAME_CHAR(enc, ptr, n)) {                                           \
1157
1.85k
      ptr += n;                                                                \
1158
1.85k
      tok = XML_TOK_NMTOKEN;                                                   \
1159
1.85k
      break;                                                                   \
1160
1.85k
    }                                                                          \
1161
1.91k
    *nextTokPtr = ptr;                                                         \
1162
58
    return XML_TOK_INVALID;
1163
10.5k
    LEAD_CASE(2)
1164
13.5k
    LEAD_CASE(3)
1165
238
    LEAD_CASE(4)
1166
0
#  undef LEAD_CASE
1167
158k
  case BT_NMSTRT:
1168
257k
  case BT_HEX:
1169
257k
    tok = XML_TOK_NAME;
1170
257k
    ptr += MINBPC(enc);
1171
257k
    break;
1172
7.87k
  case BT_DIGIT:
1173
17.8k
  case BT_NAME:
1174
18.7k
  case BT_MINUS:
1175
#  ifdef XML_NS
1176
  case BT_COLON:
1177
#  endif
1178
18.7k
    tok = XML_TOK_NMTOKEN;
1179
18.7k
    ptr += MINBPC(enc);
1180
18.7k
    break;
1181
161
  case BT_NONASCII:
1182
161
    if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {
1183
130
      ptr += MINBPC(enc);
1184
130
      tok = XML_TOK_NAME;
1185
130
      break;
1186
130
    }
1187
31
    if (IS_NAME_CHAR_MINBPC(enc, ptr)) {
1188
9
      ptr += MINBPC(enc);
1189
9
      tok = XML_TOK_NMTOKEN;
1190
9
      break;
1191
9
    }
1192
    /* fall through */
1193
88
  default:
1194
88
    *nextTokPtr = ptr;
1195
88
    return XML_TOK_INVALID;
1196
3.62M
  }
1197
13.2M
  while (HAS_CHAR(enc, ptr, end)) {
1198
13.2M
    switch (BYTE_TYPE(enc, ptr)) {
1199
38.2M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1200
22.8k
    case BT_GT:
1201
96.7k
    case BT_RPAR:
1202
97.1k
    case BT_COMMA:
1203
131k
    case BT_VERBAR:
1204
133k
    case BT_LSQB:
1205
133k
    case BT_PERCNT:
1206
174k
    case BT_S:
1207
260k
    case BT_CR:
1208
277k
    case BT_LF:
1209
277k
      *nextTokPtr = ptr;
1210
277k
      return tok;
1211
#  ifdef XML_NS
1212
    case BT_COLON:
1213
      ptr += MINBPC(enc);
1214
      switch (tok) {
1215
      case XML_TOK_NAME:
1216
        REQUIRE_CHAR(enc, ptr, end);
1217
        tok = XML_TOK_PREFIXED_NAME;
1218
        switch (BYTE_TYPE(enc, ptr)) {
1219
          CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1220
        default:
1221
          tok = XML_TOK_NMTOKEN;
1222
          break;
1223
        }
1224
        break;
1225
      case XML_TOK_PREFIXED_NAME:
1226
        tok = XML_TOK_NMTOKEN;
1227
        break;
1228
      }
1229
      break;
1230
#  endif
1231
2.36k
    case BT_PLUS:
1232
2.36k
      if (tok == XML_TOK_NMTOKEN) {
1233
2
        *nextTokPtr = ptr;
1234
2
        return XML_TOK_INVALID;
1235
2
      }
1236
2.36k
      *nextTokPtr = ptr + MINBPC(enc);
1237
2.36k
      return XML_TOK_NAME_PLUS;
1238
2.22k
    case BT_AST:
1239
2.22k
      if (tok == XML_TOK_NMTOKEN) {
1240
1
        *nextTokPtr = ptr;
1241
1
        return XML_TOK_INVALID;
1242
1
      }
1243
2.22k
      *nextTokPtr = ptr + MINBPC(enc);
1244
2.22k
      return XML_TOK_NAME_ASTERISK;
1245
461
    case BT_QUEST:
1246
461
      if (tok == XML_TOK_NMTOKEN) {
1247
1
        *nextTokPtr = ptr;
1248
1
        return XML_TOK_INVALID;
1249
1
      }
1250
460
      *nextTokPtr = ptr + MINBPC(enc);
1251
460
      return XML_TOK_NAME_QUESTION;
1252
66
    default:
1253
66
      *nextTokPtr = ptr;
1254
66
      return XML_TOK_INVALID;
1255
13.2M
    }
1256
13.2M
  }
1257
634
  return -tok;
1258
283k
}
xmltok.c:normal_prologTok
Line
Count
Source
1018
3.62M
                  const char **nextTokPtr) {
1019
3.62M
  int tok;
1020
3.62M
  if (ptr >= end)
1021
8.21k
    return XML_TOK_NONE;
1022
3.62M
  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
3.62M
  switch (BYTE_TYPE(enc, ptr)) {
1032
8.65k
  case BT_QUOT:
1033
8.65k
    return PREFIX(scanLit)(BT_QUOT, enc, ptr + MINBPC(enc), end, nextTokPtr);
1034
29.4k
  case BT_APOS:
1035
29.4k
    return PREFIX(scanLit)(BT_APOS, enc, ptr + MINBPC(enc), end, nextTokPtr);
1036
73.5k
  case BT_LT: {
1037
73.5k
    ptr += MINBPC(enc);
1038
73.5k
    REQUIRE_CHAR(enc, ptr, end);
1039
73.5k
    switch (BYTE_TYPE(enc, ptr)) {
1040
55.5k
    case BT_EXCL:
1041
55.5k
      return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1042
12.3k
    case BT_QUEST:
1043
12.3k
      return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1044
4.40k
    case BT_NMSTRT:
1045
5.54k
    case BT_HEX:
1046
5.54k
    case BT_NONASCII:
1047
5.56k
    case BT_LEAD2:
1048
5.61k
    case BT_LEAD3:
1049
5.61k
    case BT_LEAD4:
1050
5.61k
      *nextTokPtr = ptr - MINBPC(enc);
1051
5.61k
      return XML_TOK_INSTANCE_START;
1052
73.5k
    }
1053
18
    *nextTokPtr = ptr;
1054
18
    return XML_TOK_INVALID;
1055
73.5k
  }
1056
190k
  case BT_CR:
1057
190k
    if (ptr + MINBPC(enc) == end) {
1058
375
      *nextTokPtr = end;
1059
      /* indicate that this might be part of a CR/LF pair */
1060
375
      return -XML_TOK_PROLOG_S;
1061
375
    }
1062
    /* fall through */
1063
322k
  case BT_S:
1064
372k
  case BT_LF:
1065
498k
    for (;;) {
1066
498k
      ptr += MINBPC(enc);
1067
498k
      if (! HAS_CHAR(enc, ptr, end))
1068
202
        break;
1069
497k
      switch (BYTE_TYPE(enc, ptr)) {
1070
9.45k
      case BT_S:
1071
16.4k
      case BT_LF:
1072
16.4k
        break;
1073
109k
      case BT_CR:
1074
        /* don't split CR/LF pair */
1075
109k
        if (ptr + MINBPC(enc) != end)
1076
109k
          break;
1077
        /* fall through */
1078
372k
      default:
1079
372k
        *nextTokPtr = ptr;
1080
372k
        return XML_TOK_PROLOG_S;
1081
497k
      }
1082
497k
    }
1083
202
    *nextTokPtr = ptr;
1084
202
    return XML_TOK_PROLOG_S;
1085
50.0k
  case BT_PERCNT:
1086
50.0k
    return PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1087
7.05k
  case BT_COMMA:
1088
7.05k
    *nextTokPtr = ptr + MINBPC(enc);
1089
7.05k
    return XML_TOK_COMMA;
1090
2.56k
  case BT_LSQB:
1091
2.56k
    *nextTokPtr = ptr + MINBPC(enc);
1092
2.56k
    return XML_TOK_OPEN_BRACKET;
1093
1.28k
  case BT_RSQB:
1094
1.28k
    ptr += MINBPC(enc);
1095
1.28k
    if (! HAS_CHAR(enc, ptr, end))
1096
3
      return -XML_TOK_CLOSE_BRACKET;
1097
1.27k
    if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) {
1098
23
      REQUIRE_CHARS(enc, ptr, end, 2);
1099
21
      if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_GT)) {
1100
2
        *nextTokPtr = ptr + 2 * MINBPC(enc);
1101
2
        return XML_TOK_COND_SECT_CLOSE;
1102
2
      }
1103
21
    }
1104
1.27k
    *nextTokPtr = ptr;
1105
1.27k
    return XML_TOK_CLOSE_BRACKET;
1106
2.52M
  case BT_LPAR:
1107
2.52M
    *nextTokPtr = ptr + MINBPC(enc);
1108
2.52M
    return XML_TOK_OPEN_PAREN;
1109
97.4k
  case BT_RPAR:
1110
97.4k
    ptr += MINBPC(enc);
1111
97.4k
    if (! HAS_CHAR(enc, ptr, end))
1112
87
      return -XML_TOK_CLOSE_PAREN;
1113
97.4k
    switch (BYTE_TYPE(enc, ptr)) {
1114
5.36k
    case BT_AST:
1115
5.36k
      *nextTokPtr = ptr + MINBPC(enc);
1116
5.36k
      return XML_TOK_CLOSE_PAREN_ASTERISK;
1117
3.81k
    case BT_QUEST:
1118
3.81k
      *nextTokPtr = ptr + MINBPC(enc);
1119
3.81k
      return XML_TOK_CLOSE_PAREN_QUESTION;
1120
5.53k
    case BT_PLUS:
1121
5.53k
      *nextTokPtr = ptr + MINBPC(enc);
1122
5.53k
      return XML_TOK_CLOSE_PAREN_PLUS;
1123
2.98k
    case BT_CR:
1124
3.52k
    case BT_LF:
1125
61.9k
    case BT_S:
1126
63.5k
    case BT_GT:
1127
66.8k
    case BT_COMMA:
1128
73.6k
    case BT_VERBAR:
1129
82.6k
    case BT_RPAR:
1130
82.6k
      *nextTokPtr = ptr;
1131
82.6k
      return XML_TOK_CLOSE_PAREN;
1132
97.4k
    }
1133
23
    *nextTokPtr = ptr;
1134
23
    return XML_TOK_INVALID;
1135
48.8k
  case BT_VERBAR:
1136
48.8k
    *nextTokPtr = ptr + MINBPC(enc);
1137
48.8k
    return XML_TOK_OR;
1138
49.9k
  case BT_GT:
1139
49.9k
    *nextTokPtr = ptr + MINBPC(enc);
1140
49.9k
    return XML_TOK_DECL_CLOSE;
1141
65.3k
  case BT_NUM:
1142
65.3k
    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
10.5k
    LEAD_CASE(2)
1164
13.5k
    LEAD_CASE(3)
1165
130
    LEAD_CASE(4)
1166
0
#  undef LEAD_CASE
1167
158k
  case BT_NMSTRT:
1168
257k
  case BT_HEX:
1169
257k
    tok = XML_TOK_NAME;
1170
257k
    ptr += MINBPC(enc);
1171
257k
    break;
1172
7.87k
  case BT_DIGIT:
1173
17.8k
  case BT_NAME:
1174
18.7k
  case BT_MINUS:
1175
#  ifdef XML_NS
1176
  case BT_COLON:
1177
#  endif
1178
18.7k
    tok = XML_TOK_NMTOKEN;
1179
18.7k
    ptr += MINBPC(enc);
1180
18.7k
    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
55
  default:
1194
55
    *nextTokPtr = ptr;
1195
55
    return XML_TOK_INVALID;
1196
3.62M
  }
1197
13.1M
  while (HAS_CHAR(enc, ptr, end)) {
1198
13.1M
    switch (BYTE_TYPE(enc, ptr)) {
1199
37.5M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1200
22.8k
    case BT_GT:
1201
96.7k
    case BT_RPAR:
1202
97.1k
    case BT_COMMA:
1203
131k
    case BT_VERBAR:
1204
133k
    case BT_LSQB:
1205
133k
    case BT_PERCNT:
1206
174k
    case BT_S:
1207
260k
    case BT_CR:
1208
277k
    case BT_LF:
1209
277k
      *nextTokPtr = ptr;
1210
277k
      return tok;
1211
#  ifdef XML_NS
1212
    case BT_COLON:
1213
      ptr += MINBPC(enc);
1214
      switch (tok) {
1215
      case XML_TOK_NAME:
1216
        REQUIRE_CHAR(enc, ptr, end);
1217
        tok = XML_TOK_PREFIXED_NAME;
1218
        switch (BYTE_TYPE(enc, ptr)) {
1219
          CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1220
        default:
1221
          tok = XML_TOK_NMTOKEN;
1222
          break;
1223
        }
1224
        break;
1225
      case XML_TOK_PREFIXED_NAME:
1226
        tok = XML_TOK_NMTOKEN;
1227
        break;
1228
      }
1229
      break;
1230
#  endif
1231
2.36k
    case BT_PLUS:
1232
2.36k
      if (tok == XML_TOK_NMTOKEN) {
1233
2
        *nextTokPtr = ptr;
1234
2
        return XML_TOK_INVALID;
1235
2
      }
1236
2.36k
      *nextTokPtr = ptr + MINBPC(enc);
1237
2.36k
      return XML_TOK_NAME_PLUS;
1238
2.22k
    case BT_AST:
1239
2.22k
      if (tok == XML_TOK_NMTOKEN) {
1240
1
        *nextTokPtr = ptr;
1241
1
        return XML_TOK_INVALID;
1242
1
      }
1243
2.22k
      *nextTokPtr = ptr + MINBPC(enc);
1244
2.22k
      return XML_TOK_NAME_ASTERISK;
1245
461
    case BT_QUEST:
1246
461
      if (tok == XML_TOK_NMTOKEN) {
1247
1
        *nextTokPtr = ptr;
1248
1
        return XML_TOK_INVALID;
1249
1
      }
1250
460
      *nextTokPtr = ptr + MINBPC(enc);
1251
460
      return XML_TOK_NAME_QUESTION;
1252
50
    default:
1253
50
      *nextTokPtr = ptr;
1254
50
      return XML_TOK_INVALID;
1255
13.1M
    }
1256
13.1M
  }
1257
594
  return -tok;
1258
283k
}
xmltok.c:little2_prologTok
Line
Count
Source
1018
114
                  const char **nextTokPtr) {
1019
114
  int tok;
1020
114
  if (ptr >= end)
1021
2
    return XML_TOK_NONE;
1022
112
  if (MINBPC(enc) > 1) {
1023
112
    size_t n = end - ptr;
1024
112
    if (n & (MINBPC(enc) - 1)) {
1025
28
      n &= ~(MINBPC(enc) - 1);
1026
28
      if (n == 0)
1027
2
        return XML_TOK_PARTIAL;
1028
26
      end = ptr + n;
1029
26
    }
1030
112
  }
1031
110
  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
0
  case BT_LT: {
1037
0
    ptr += MINBPC(enc);
1038
0
    REQUIRE_CHAR(enc, ptr, end);
1039
0
    switch (BYTE_TYPE(enc, ptr)) {
1040
0
    case BT_EXCL:
1041
0
      return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1042
0
    case BT_QUEST:
1043
0
      return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1044
0
    case BT_NMSTRT:
1045
0
    case BT_HEX:
1046
0
    case BT_NONASCII:
1047
0
    case BT_LEAD2:
1048
0
    case BT_LEAD3:
1049
0
    case BT_LEAD4:
1050
0
      *nextTokPtr = ptr - MINBPC(enc);
1051
0
      return XML_TOK_INSTANCE_START;
1052
0
    }
1053
0
    *nextTokPtr = ptr;
1054
0
    return XML_TOK_INVALID;
1055
0
  }
1056
0
  case BT_CR:
1057
0
    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
0
  case BT_S:
1064
0
  case BT_LF:
1065
0
    for (;;) {
1066
0
      ptr += MINBPC(enc);
1067
0
      if (! HAS_CHAR(enc, ptr, end))
1068
0
        break;
1069
0
      switch (BYTE_TYPE(enc, ptr)) {
1070
0
      case BT_S:
1071
0
      case BT_LF:
1072
0
        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
0
      default:
1079
0
        *nextTokPtr = ptr;
1080
0
        return XML_TOK_PROLOG_S;
1081
0
      }
1082
0
    }
1083
0
    *nextTokPtr = ptr;
1084
0
    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
28
    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
#  ifdef XML_NS
1176
  case BT_COLON:
1177
#  endif
1178
0
    tok = XML_TOK_NMTOKEN;
1179
0
    ptr += MINBPC(enc);
1180
0
    break;
1181
91
  case BT_NONASCII:
1182
91
    if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {
1183
76
      ptr += MINBPC(enc);
1184
76
      tok = XML_TOK_NAME;
1185
76
      break;
1186
76
    }
1187
15
    if (IS_NAME_CHAR_MINBPC(enc, ptr)) {
1188
3
      ptr += MINBPC(enc);
1189
3
      tok = XML_TOK_NMTOKEN;
1190
3
      break;
1191
3
    }
1192
    /* fall through */
1193
18
  default:
1194
18
    *nextTokPtr = ptr;
1195
18
    return XML_TOK_INVALID;
1196
110
  }
1197
137k
  while (HAS_CHAR(enc, ptr, end)) {
1198
137k
    switch (BYTE_TYPE(enc, ptr)) {
1199
686k
      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
#  ifdef XML_NS
1212
    case BT_COLON:
1213
      ptr += MINBPC(enc);
1214
      switch (tok) {
1215
      case XML_TOK_NAME:
1216
        REQUIRE_CHAR(enc, ptr, end);
1217
        tok = XML_TOK_PREFIXED_NAME;
1218
        switch (BYTE_TYPE(enc, ptr)) {
1219
          CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1220
        default:
1221
          tok = XML_TOK_NMTOKEN;
1222
          break;
1223
        }
1224
        break;
1225
      case XML_TOK_PREFIXED_NAME:
1226
        tok = XML_TOK_NMTOKEN;
1227
        break;
1228
      }
1229
      break;
1230
#  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
7
    default:
1253
7
      *nextTokPtr = ptr;
1254
7
      return XML_TOK_INVALID;
1255
137k
    }
1256
137k
  }
1257
20
  return -tok;
1258
79
}
xmltok.c:big2_prologTok
Line
Count
Source
1018
105
                  const char **nextTokPtr) {
1019
105
  int tok;
1020
105
  if (ptr >= end)
1021
2
    return XML_TOK_NONE;
1022
103
  if (MINBPC(enc) > 1) {
1023
103
    size_t n = end - ptr;
1024
103
    if (n & (MINBPC(enc) - 1)) {
1025
20
      n &= ~(MINBPC(enc) - 1);
1026
20
      if (n == 0)
1027
2
        return XML_TOK_PARTIAL;
1028
18
      end = ptr + n;
1029
18
    }
1030
103
  }
1031
101
  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
0
  case BT_LT: {
1037
0
    ptr += MINBPC(enc);
1038
0
    REQUIRE_CHAR(enc, ptr, end);
1039
0
    switch (BYTE_TYPE(enc, ptr)) {
1040
0
    case BT_EXCL:
1041
0
      return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1042
0
    case BT_QUEST:
1043
0
      return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1044
0
    case BT_NMSTRT:
1045
0
    case BT_HEX:
1046
0
    case BT_NONASCII:
1047
0
    case BT_LEAD2:
1048
0
    case BT_LEAD3:
1049
0
    case BT_LEAD4:
1050
0
      *nextTokPtr = ptr - MINBPC(enc);
1051
0
      return XML_TOK_INSTANCE_START;
1052
0
    }
1053
0
    *nextTokPtr = ptr;
1054
0
    return XML_TOK_INVALID;
1055
0
  }
1056
0
  case BT_CR:
1057
0
    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
0
  case BT_S:
1064
0
  case BT_LF:
1065
0
    for (;;) {
1066
0
      ptr += MINBPC(enc);
1067
0
      if (! HAS_CHAR(enc, ptr, end))
1068
0
        break;
1069
0
      switch (BYTE_TYPE(enc, ptr)) {
1070
0
      case BT_S:
1071
0
      case BT_LF:
1072
0
        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
0
      default:
1079
0
        *nextTokPtr = ptr;
1080
0
        return XML_TOK_PROLOG_S;
1081
0
      }
1082
0
    }
1083
0
    *nextTokPtr = ptr;
1084
0
    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
80
    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
#  ifdef XML_NS
1176
  case BT_COLON:
1177
#  endif
1178
0
    tok = XML_TOK_NMTOKEN;
1179
0
    ptr += MINBPC(enc);
1180
0
    break;
1181
70
  case BT_NONASCII:
1182
70
    if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {
1183
54
      ptr += MINBPC(enc);
1184
54
      tok = XML_TOK_NAME;
1185
54
      break;
1186
54
    }
1187
16
    if (IS_NAME_CHAR_MINBPC(enc, ptr)) {
1188
6
      ptr += MINBPC(enc);
1189
6
      tok = XML_TOK_NMTOKEN;
1190
6
      break;
1191
6
    }
1192
    /* fall through */
1193
15
  default:
1194
15
    *nextTokPtr = ptr;
1195
15
    return XML_TOK_INVALID;
1196
101
  }
1197
627
  while (HAS_CHAR(enc, ptr, end)) {
1198
627
    switch (BYTE_TYPE(enc, ptr)) {
1199
2.97k
      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
#  ifdef XML_NS
1212
    case BT_COLON:
1213
      ptr += MINBPC(enc);
1214
      switch (tok) {
1215
      case XML_TOK_NAME:
1216
        REQUIRE_CHAR(enc, ptr, end);
1217
        tok = XML_TOK_PREFIXED_NAME;
1218
        switch (BYTE_TYPE(enc, ptr)) {
1219
          CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1220
        default:
1221
          tok = XML_TOK_NMTOKEN;
1222
          break;
1223
        }
1224
        break;
1225
      case XML_TOK_PREFIXED_NAME:
1226
        tok = XML_TOK_NMTOKEN;
1227
        break;
1228
      }
1229
      break;
1230
#  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
9
    default:
1253
9
      *nextTokPtr = ptr;
1254
9
      return XML_TOK_INVALID;
1255
627
    }
1256
627
  }
1257
20
  return -tok;
1258
60
}
1259
1260
static int PTRCALL
1261
PREFIX(attributeValueTok)(const ENCODING *enc, const char *ptr, const char *end,
1262
2.92M
                          const char **nextTokPtr) {
1263
2.92M
  const char *start;
1264
2.92M
  if (ptr >= end)
1265
76.9k
    return XML_TOK_NONE;
1266
2.85M
  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
2.85M
  start = ptr;
1275
25.1M
  while (HAS_CHAR(enc, ptr, end)) {
1276
25.1M
    switch (BYTE_TYPE(enc, ptr)) {
1277
0
#  define LEAD_CASE(n)                                                         \
1278
300k
  case BT_LEAD##n:                                                             \
1279
300k
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1280
300k
    break;
1281
103k
      LEAD_CASE(2)
1282
110k
      LEAD_CASE(3)
1283
86.9k
      LEAD_CASE(4)
1284
0
#  undef LEAD_CASE
1285
326k
    case BT_AMP:
1286
326k
      if (ptr == start)
1287
238k
        return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1288
87.8k
      *nextTokPtr = ptr;
1289
87.8k
      return XML_TOK_DATA_CHARS;
1290
2
    case BT_LT:
1291
      /* this is for inside entity references */
1292
2
      *nextTokPtr = ptr;
1293
2
      return XML_TOK_INVALID;
1294
827k
    case BT_LF:
1295
827k
      if (ptr == start) {
1296
628k
        *nextTokPtr = ptr + MINBPC(enc);
1297
628k
        return XML_TOK_DATA_NEWLINE;
1298
628k
      }
1299
199k
      *nextTokPtr = ptr;
1300
199k
      return XML_TOK_DATA_CHARS;
1301
1.04M
    case BT_CR:
1302
1.04M
      if (ptr == start) {
1303
782k
        ptr += MINBPC(enc);
1304
782k
        if (! HAS_CHAR(enc, ptr, end))
1305
7.27k
          return XML_TOK_TRAILING_CR;
1306
774k
        if (BYTE_TYPE(enc, ptr) == BT_LF)
1307
261k
          ptr += MINBPC(enc);
1308
774k
        *nextTokPtr = ptr;
1309
774k
        return XML_TOK_DATA_NEWLINE;
1310
782k
      }
1311
264k
      *nextTokPtr = ptr;
1312
264k
      return XML_TOK_DATA_CHARS;
1313
590k
    case BT_S:
1314
590k
      if (ptr == start) {
1315
346k
        *nextTokPtr = ptr + MINBPC(enc);
1316
346k
        return XML_TOK_ATTRIBUTE_VALUE_S;
1317
346k
      }
1318
244k
      *nextTokPtr = ptr;
1319
244k
      return XML_TOK_DATA_CHARS;
1320
22.0M
    default:
1321
22.0M
      ptr += MINBPC(enc);
1322
22.0M
      break;
1323
25.1M
    }
1324
25.1M
  }
1325
58.6k
  *nextTokPtr = ptr;
1326
58.6k
  return XML_TOK_DATA_CHARS;
1327
2.85M
}
xmltok.c:normal_attributeValueTok
Line
Count
Source
1262
2.92M
                          const char **nextTokPtr) {
1263
2.92M
  const char *start;
1264
2.92M
  if (ptr >= end)
1265
76.9k
    return XML_TOK_NONE;
1266
2.85M
  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
2.85M
  start = ptr;
1275
25.1M
  while (HAS_CHAR(enc, ptr, end)) {
1276
25.1M
    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
103k
      LEAD_CASE(2)
1282
110k
      LEAD_CASE(3)
1283
86.9k
      LEAD_CASE(4)
1284
0
#  undef LEAD_CASE
1285
326k
    case BT_AMP:
1286
326k
      if (ptr == start)
1287
238k
        return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1288
87.8k
      *nextTokPtr = ptr;
1289
87.8k
      return XML_TOK_DATA_CHARS;
1290
2
    case BT_LT:
1291
      /* this is for inside entity references */
1292
2
      *nextTokPtr = ptr;
1293
2
      return XML_TOK_INVALID;
1294
827k
    case BT_LF:
1295
827k
      if (ptr == start) {
1296
628k
        *nextTokPtr = ptr + MINBPC(enc);
1297
628k
        return XML_TOK_DATA_NEWLINE;
1298
628k
      }
1299
199k
      *nextTokPtr = ptr;
1300
199k
      return XML_TOK_DATA_CHARS;
1301
1.04M
    case BT_CR:
1302
1.04M
      if (ptr == start) {
1303
782k
        ptr += MINBPC(enc);
1304
782k
        if (! HAS_CHAR(enc, ptr, end))
1305
7.27k
          return XML_TOK_TRAILING_CR;
1306
774k
        if (BYTE_TYPE(enc, ptr) == BT_LF)
1307
261k
          ptr += MINBPC(enc);
1308
774k
        *nextTokPtr = ptr;
1309
774k
        return XML_TOK_DATA_NEWLINE;
1310
782k
      }
1311
264k
      *nextTokPtr = ptr;
1312
264k
      return XML_TOK_DATA_CHARS;
1313
590k
    case BT_S:
1314
590k
      if (ptr == start) {
1315
346k
        *nextTokPtr = ptr + MINBPC(enc);
1316
346k
        return XML_TOK_ATTRIBUTE_VALUE_S;
1317
346k
      }
1318
244k
      *nextTokPtr = ptr;
1319
244k
      return XML_TOK_DATA_CHARS;
1320
22.0M
    default:
1321
22.0M
      ptr += MINBPC(enc);
1322
22.0M
      break;
1323
25.1M
    }
1324
25.1M
  }
1325
58.6k
  *nextTokPtr = ptr;
1326
58.6k
  return XML_TOK_DATA_CHARS;
1327
2.85M
}
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
                         const char **nextTokPtr) {
1399
  int level = 0;
1400
  if (MINBPC(enc) > 1) {
1401
    size_t n = end - ptr;
1402
    if (n & (MINBPC(enc) - 1)) {
1403
      n &= ~(MINBPC(enc) - 1);
1404
      end = ptr + n;
1405
    }
1406
  }
1407
  while (HAS_CHAR(enc, ptr, end)) {
1408
    switch (BYTE_TYPE(enc, ptr)) {
1409
      INVALID_CASES(ptr, nextTokPtr)
1410
    case BT_LT:
1411
      ptr += MINBPC(enc);
1412
      REQUIRE_CHAR(enc, ptr, end);
1413
      if (CHAR_MATCHES(enc, ptr, ASCII_EXCL)) {
1414
        ptr += MINBPC(enc);
1415
        REQUIRE_CHAR(enc, ptr, end);
1416
        if (CHAR_MATCHES(enc, ptr, ASCII_LSQB)) {
1417
          ++level;
1418
          ptr += MINBPC(enc);
1419
        }
1420
      }
1421
      break;
1422
    case BT_RSQB:
1423
      ptr += MINBPC(enc);
1424
      REQUIRE_CHAR(enc, ptr, end);
1425
      if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) {
1426
        ptr += MINBPC(enc);
1427
        REQUIRE_CHAR(enc, ptr, end);
1428
        if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
1429
          ptr += MINBPC(enc);
1430
          if (level == 0) {
1431
            *nextTokPtr = ptr;
1432
            return XML_TOK_IGNORE_SECT;
1433
          }
1434
          --level;
1435
        }
1436
      }
1437
      break;
1438
    default:
1439
      ptr += MINBPC(enc);
1440
      break;
1441
    }
1442
  }
1443
  return XML_TOK_PARTIAL;
1444
}
1445
1446
#  endif /* XML_DTD */
1447
1448
static int PTRCALL
1449
PREFIX(isPublicId)(const ENCODING *enc, const char *ptr, const char *end,
1450
5.17k
                   const char **badPtr) {
1451
5.17k
  ptr += MINBPC(enc);
1452
5.17k
  end -= MINBPC(enc);
1453
1.20M
  for (; HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
1454
1.20M
    switch (BYTE_TYPE(enc, ptr)) {
1455
438k
    case BT_DIGIT:
1456
675k
    case BT_HEX:
1457
676k
    case BT_MINUS:
1458
678k
    case BT_APOS:
1459
680k
    case BT_LPAR:
1460
765k
    case BT_RPAR:
1461
768k
    case BT_PLUS:
1462
786k
    case BT_COMMA:
1463
891k
    case BT_SOL:
1464
893k
    case BT_EQUALS:
1465
902k
    case BT_QUEST:
1466
928k
    case BT_CR:
1467
935k
    case BT_LF:
1468
950k
    case BT_SEMI:
1469
951k
    case BT_EXCL:
1470
998k
    case BT_AST:
1471
1.00M
    case BT_PERCNT:
1472
1.01M
    case BT_NUM:
1473
#  ifdef XML_NS
1474
    case BT_COLON:
1475
#  endif
1476
1.01M
      break;
1477
2.89k
    case BT_S:
1478
2.89k
      if (CHAR_MATCHES(enc, ptr, ASCII_TAB)) {
1479
1
        *badPtr = ptr;
1480
1
        return 0;
1481
1
      }
1482
2.89k
      break;
1483
6.52k
    case BT_NAME:
1484
178k
    case BT_NMSTRT:
1485
178k
      if (! (BYTE_TO_ASCII(enc, ptr) & ~0x7f))
1486
178k
        break;
1487
      /* fall through */
1488
4.53k
    default:
1489
4.53k
      switch (BYTE_TO_ASCII(enc, ptr)) {
1490
3.39k
      case 0x24: /* $ */
1491
4.53k
      case 0x40: /* @ */
1492
4.53k
        break;
1493
6
      default:
1494
6
        *badPtr = ptr;
1495
6
        return 0;
1496
4.53k
      }
1497
4.53k
      break;
1498
1.20M
    }
1499
1.20M
  }
1500
5.16k
  return 1;
1501
5.17k
}
xmltok.c:normal_isPublicId
Line
Count
Source
1450
5.17k
                   const char **badPtr) {
1451
5.17k
  ptr += MINBPC(enc);
1452
5.17k
  end -= MINBPC(enc);
1453
1.20M
  for (; HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
1454
1.20M
    switch (BYTE_TYPE(enc, ptr)) {
1455
438k
    case BT_DIGIT:
1456
675k
    case BT_HEX:
1457
676k
    case BT_MINUS:
1458
678k
    case BT_APOS:
1459
680k
    case BT_LPAR:
1460
765k
    case BT_RPAR:
1461
768k
    case BT_PLUS:
1462
786k
    case BT_COMMA:
1463
891k
    case BT_SOL:
1464
893k
    case BT_EQUALS:
1465
902k
    case BT_QUEST:
1466
928k
    case BT_CR:
1467
935k
    case BT_LF:
1468
950k
    case BT_SEMI:
1469
951k
    case BT_EXCL:
1470
998k
    case BT_AST:
1471
1.00M
    case BT_PERCNT:
1472
1.01M
    case BT_NUM:
1473
#  ifdef XML_NS
1474
    case BT_COLON:
1475
#  endif
1476
1.01M
      break;
1477
2.89k
    case BT_S:
1478
2.89k
      if (CHAR_MATCHES(enc, ptr, ASCII_TAB)) {
1479
1
        *badPtr = ptr;
1480
1
        return 0;
1481
1
      }
1482
2.89k
      break;
1483
6.52k
    case BT_NAME:
1484
178k
    case BT_NMSTRT:
1485
178k
      if (! (BYTE_TO_ASCII(enc, ptr) & ~0x7f))
1486
178k
        break;
1487
      /* fall through */
1488
4.53k
    default:
1489
4.53k
      switch (BYTE_TO_ASCII(enc, ptr)) {
1490
3.39k
      case 0x24: /* $ */
1491
4.53k
      case 0x40: /* @ */
1492
4.53k
        break;
1493
6
      default:
1494
6
        *badPtr = ptr;
1495
6
        return 0;
1496
4.53k
      }
1497
4.53k
      break;
1498
1.20M
    }
1499
1.20M
  }
1500
5.16k
  return 1;
1501
5.17k
}
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
459k
                ATTRIBUTE *atts) {
1511
459k
  enum { other, inName, inValue } state = inName;
1512
459k
  int nAtts = 0;
1513
459k
  int open = 0; /* defined when state == inValue;
1514
                   initialization just to shut up compilers */
1515
1516
52.0M
  for (ptr += MINBPC(enc);; ptr += MINBPC(enc)) {
1517
52.0M
    switch (BYTE_TYPE(enc, ptr)) {
1518
0
#  define START_NAME                                                           \
1519
33.4M
    if (state == other) {                                                      \
1520
3.02M
      if (nAtts < attsMax) {                                                   \
1521
1.60M
        atts[nAtts].name = ptr;                                                \
1522
1.60M
        atts[nAtts].normalized = 1;                                            \
1523
1.60M
      }                                                                        \
1524
3.02M
      state = inName;                                                          \
1525
3.02M
    }
1526
0
#  define LEAD_CASE(n)                                                         \
1527
341k
  case BT_LEAD##n: /* NOTE: The encoding has already been validated. */        \
1528
341k
    START_NAME ptr += (n - MINBPC(enc));                                       \
1529
341k
    break;
1530
106k
      LEAD_CASE(2)
1531
179k
      LEAD_CASE(3)
1532
56.1k
      LEAD_CASE(4)
1533
0
#  undef LEAD_CASE
1534
0
    case BT_NONASCII:
1535
31.1M
    case BT_NMSTRT:
1536
33.0M
    case BT_HEX:
1537
33.0M
      START_NAME
1538
33.0M
      break;
1539
0
#  undef START_NAME
1540
695k
    case BT_QUOT:
1541
695k
      if (state != inValue) {
1542
304k
        if (nAtts < attsMax)
1543
242k
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1544
304k
        state = inValue;
1545
304k
        open = BT_QUOT;
1546
391k
      } else if (open == BT_QUOT) {
1547
304k
        state = other;
1548
304k
        if (nAtts < attsMax)
1549
242k
          atts[nAtts].valueEnd = ptr;
1550
304k
        nAtts++;
1551
304k
      }
1552
695k
      break;
1553
5.63M
    case BT_APOS:
1554
5.63M
      if (state != inValue) {
1555
2.71M
        if (nAtts < attsMax)
1556
1.36M
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1557
2.71M
        state = inValue;
1558
2.71M
        open = BT_APOS;
1559
2.91M
      } else if (open == BT_APOS) {
1560
2.71M
        state = other;
1561
2.71M
        if (nAtts < attsMax)
1562
1.36M
          atts[nAtts].valueEnd = ptr;
1563
2.71M
        nAtts++;
1564
2.71M
      }
1565
5.63M
      break;
1566
114k
    case BT_AMP:
1567
114k
      if (nAtts < attsMax)
1568
114k
        atts[nAtts].normalized = 0;
1569
114k
      break;
1570
2.43M
    case BT_S:
1571
2.43M
      if (state == inName)
1572
166k
        state = other;
1573
2.26M
      else if (state == inValue && nAtts < attsMax && atts[nAtts].normalized
1574
74.4k
               && (ptr == atts[nAtts].valuePtr
1575
14.8k
                   || BYTE_TO_ASCII(enc, ptr) != ASCII_SPACE
1576
8.46k
                   || BYTE_TO_ASCII(enc, ptr + MINBPC(enc)) == ASCII_SPACE
1577
7.07k
                   || BYTE_TYPE(enc, ptr + MINBPC(enc)) == open))
1578
68.0k
        atts[nAtts].normalized = 0;
1579
2.43M
      break;
1580
2.19M
    case BT_CR:
1581
3.16M
    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.16M
      if (state == inName)
1585
29.0k
        state = other;
1586
3.13M
      else if (state == inValue && nAtts < attsMax)
1587
1.55M
        atts[nAtts].normalized = 0;
1588
3.16M
      break;
1589
325k
    case BT_GT:
1590
533k
    case BT_SOL:
1591
533k
      if (state != inValue)
1592
459k
        return nAtts;
1593
74.0k
      break;
1594
6.10M
    default:
1595
6.10M
      break;
1596
52.0M
    }
1597
52.0M
  }
1598
  /* not reached */
1599
459k
}
xmltok.c:normal_getAtts
Line
Count
Source
1510
459k
                ATTRIBUTE *atts) {
1511
459k
  enum { other, inName, inValue } state = inName;
1512
459k
  int nAtts = 0;
1513
459k
  int open = 0; /* defined when state == inValue;
1514
                   initialization just to shut up compilers */
1515
1516
52.0M
  for (ptr += MINBPC(enc);; ptr += MINBPC(enc)) {
1517
52.0M
    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
106k
      LEAD_CASE(2)
1531
179k
      LEAD_CASE(3)
1532
56.1k
      LEAD_CASE(4)
1533
0
#  undef LEAD_CASE
1534
0
    case BT_NONASCII:
1535
31.1M
    case BT_NMSTRT:
1536
33.0M
    case BT_HEX:
1537
33.0M
      START_NAME
1538
33.0M
      break;
1539
0
#  undef START_NAME
1540
695k
    case BT_QUOT:
1541
695k
      if (state != inValue) {
1542
304k
        if (nAtts < attsMax)
1543
242k
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1544
304k
        state = inValue;
1545
304k
        open = BT_QUOT;
1546
391k
      } else if (open == BT_QUOT) {
1547
304k
        state = other;
1548
304k
        if (nAtts < attsMax)
1549
242k
          atts[nAtts].valueEnd = ptr;
1550
304k
        nAtts++;
1551
304k
      }
1552
695k
      break;
1553
5.63M
    case BT_APOS:
1554
5.63M
      if (state != inValue) {
1555
2.71M
        if (nAtts < attsMax)
1556
1.36M
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1557
2.71M
        state = inValue;
1558
2.71M
        open = BT_APOS;
1559
2.91M
      } else if (open == BT_APOS) {
1560
2.71M
        state = other;
1561
2.71M
        if (nAtts < attsMax)
1562
1.36M
          atts[nAtts].valueEnd = ptr;
1563
2.71M
        nAtts++;
1564
2.71M
      }
1565
5.63M
      break;
1566
114k
    case BT_AMP:
1567
114k
      if (nAtts < attsMax)
1568
114k
        atts[nAtts].normalized = 0;
1569
114k
      break;
1570
2.43M
    case BT_S:
1571
2.43M
      if (state == inName)
1572
166k
        state = other;
1573
2.26M
      else if (state == inValue && nAtts < attsMax && atts[nAtts].normalized
1574
74.4k
               && (ptr == atts[nAtts].valuePtr
1575
14.8k
                   || BYTE_TO_ASCII(enc, ptr) != ASCII_SPACE
1576
8.46k
                   || BYTE_TO_ASCII(enc, ptr + MINBPC(enc)) == ASCII_SPACE
1577
7.07k
                   || BYTE_TYPE(enc, ptr + MINBPC(enc)) == open))
1578
68.0k
        atts[nAtts].normalized = 0;
1579
2.43M
      break;
1580
2.19M
    case BT_CR:
1581
3.16M
    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.16M
      if (state == inName)
1585
29.0k
        state = other;
1586
3.13M
      else if (state == inValue && nAtts < attsMax)
1587
1.55M
        atts[nAtts].normalized = 0;
1588
3.16M
      break;
1589
325k
    case BT_GT:
1590
533k
    case BT_SOL:
1591
533k
      if (state != inValue)
1592
459k
        return nAtts;
1593
74.0k
      break;
1594
6.10M
    default:
1595
6.10M
      break;
1596
52.0M
    }
1597
52.0M
  }
1598
  /* not reached */
1599
459k
}
Unexecuted instantiation: xmltok.c:little2_getAtts
Unexecuted instantiation: xmltok.c:big2_getAtts
1600
1601
static int PTRFASTCALL
1602
106k
PREFIX(charRefNumber)(const ENCODING *enc, const char *ptr) {
1603
106k
  int result = 0;
1604
  /* skip &# */
1605
106k
  UNUSED_P(enc);
1606
106k
  ptr += 2 * MINBPC(enc);
1607
106k
  if (CHAR_MATCHES(enc, ptr, ASCII_x)) {
1608
486k
    for (ptr += MINBPC(enc); ! CHAR_MATCHES(enc, ptr, ASCII_SEMI);
1609
385k
         ptr += MINBPC(enc)) {
1610
385k
      int c = BYTE_TO_ASCII(enc, ptr);
1611
385k
      switch (c) {
1612
6.54k
      case ASCII_0:
1613
34.8k
      case ASCII_1:
1614
71.7k
      case ASCII_2:
1615
80.7k
      case ASCII_3:
1616
117k
      case ASCII_4:
1617
144k
      case ASCII_5:
1618
148k
      case ASCII_6:
1619
162k
      case ASCII_7:
1620
181k
      case ASCII_8:
1621
201k
      case ASCII_9:
1622
201k
        result <<= 4;
1623
201k
        result |= (c - ASCII_0);
1624
201k
        break;
1625
49.5k
      case ASCII_A:
1626
59.8k
      case ASCII_B:
1627
61.2k
      case ASCII_C:
1628
76.6k
      case ASCII_D:
1629
88.2k
      case ASCII_E:
1630
109k
      case ASCII_F:
1631
109k
        result <<= 4;
1632
109k
        result += 10 + (c - ASCII_A);
1633
109k
        break;
1634
872
      case ASCII_a:
1635
14.2k
      case ASCII_b:
1636
15.1k
      case ASCII_c:
1637
39.5k
      case ASCII_d:
1638
50.6k
      case ASCII_e:
1639
74.4k
      case ASCII_f:
1640
74.4k
        result <<= 4;
1641
74.4k
        result += 10 + (c - ASCII_a);
1642
74.4k
        break;
1643
385k
      }
1644
385k
      if (result >= 0x110000)
1645
10
        return -1;
1646
385k
    }
1647
101k
  } else {
1648
18.6k
    for (; ! CHAR_MATCHES(enc, ptr, ASCII_SEMI); ptr += MINBPC(enc)) {
1649
12.9k
      int c = BYTE_TO_ASCII(enc, ptr);
1650
12.9k
      result *= 10;
1651
12.9k
      result += (c - ASCII_0);
1652
12.9k
      if (result >= 0x110000)
1653
3
        return -1;
1654
12.9k
    }
1655
5.68k
  }
1656
106k
  return checkCharRefNumber(result);
1657
106k
}
xmltok.c:normal_charRefNumber
Line
Count
Source
1602
106k
PREFIX(charRefNumber)(const ENCODING *enc, const char *ptr) {
1603
106k
  int result = 0;
1604
  /* skip &# */
1605
106k
  UNUSED_P(enc);
1606
106k
  ptr += 2 * MINBPC(enc);
1607
106k
  if (CHAR_MATCHES(enc, ptr, ASCII_x)) {
1608
486k
    for (ptr += MINBPC(enc); ! CHAR_MATCHES(enc, ptr, ASCII_SEMI);
1609
385k
         ptr += MINBPC(enc)) {
1610
385k
      int c = BYTE_TO_ASCII(enc, ptr);
1611
385k
      switch (c) {
1612
6.54k
      case ASCII_0:
1613
34.8k
      case ASCII_1:
1614
71.7k
      case ASCII_2:
1615
80.7k
      case ASCII_3:
1616
117k
      case ASCII_4:
1617
144k
      case ASCII_5:
1618
148k
      case ASCII_6:
1619
162k
      case ASCII_7:
1620
181k
      case ASCII_8:
1621
201k
      case ASCII_9:
1622
201k
        result <<= 4;
1623
201k
        result |= (c - ASCII_0);
1624
201k
        break;
1625
49.5k
      case ASCII_A:
1626
59.8k
      case ASCII_B:
1627
61.2k
      case ASCII_C:
1628
76.6k
      case ASCII_D:
1629
88.2k
      case ASCII_E:
1630
109k
      case ASCII_F:
1631
109k
        result <<= 4;
1632
109k
        result += 10 + (c - ASCII_A);
1633
109k
        break;
1634
872
      case ASCII_a:
1635
14.2k
      case ASCII_b:
1636
15.1k
      case ASCII_c:
1637
39.5k
      case ASCII_d:
1638
50.6k
      case ASCII_e:
1639
74.4k
      case ASCII_f:
1640
74.4k
        result <<= 4;
1641
74.4k
        result += 10 + (c - ASCII_a);
1642
74.4k
        break;
1643
385k
      }
1644
385k
      if (result >= 0x110000)
1645
10
        return -1;
1646
385k
    }
1647
101k
  } else {
1648
18.6k
    for (; ! CHAR_MATCHES(enc, ptr, ASCII_SEMI); ptr += MINBPC(enc)) {
1649
12.9k
      int c = BYTE_TO_ASCII(enc, ptr);
1650
12.9k
      result *= 10;
1651
12.9k
      result += (c - ASCII_0);
1652
12.9k
      if (result >= 0x110000)
1653
3
        return -1;
1654
12.9k
    }
1655
5.68k
  }
1656
106k
  return checkCharRefNumber(result);
1657
106k
}
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
198k
                             const char *end) {
1662
198k
  UNUSED_P(enc);
1663
198k
  switch ((end - ptr) / MINBPC(enc)) {
1664
36.2k
  case 2:
1665
36.2k
    if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_t)) {
1666
1.94k
      switch (BYTE_TO_ASCII(enc, ptr)) {
1667
535
      case ASCII_l:
1668
535
        return ASCII_LT;
1669
66
      case ASCII_g:
1670
66
        return ASCII_GT;
1671
1.94k
      }
1672
1.94k
    }
1673
35.6k
    break;
1674
39.1k
  case 3:
1675
39.1k
    if (CHAR_MATCHES(enc, ptr, ASCII_a)) {
1676
29.6k
      ptr += MINBPC(enc);
1677
29.6k
      if (CHAR_MATCHES(enc, ptr, ASCII_m)) {
1678
28.6k
        ptr += MINBPC(enc);
1679
28.6k
        if (CHAR_MATCHES(enc, ptr, ASCII_p))
1680
28.4k
          return ASCII_AMP;
1681
28.6k
      }
1682
29.6k
    }
1683
10.7k
    break;
1684
52.4k
  case 4:
1685
52.4k
    switch (BYTE_TO_ASCII(enc, ptr)) {
1686
6.41k
    case ASCII_q:
1687
6.41k
      ptr += MINBPC(enc);
1688
6.41k
      if (CHAR_MATCHES(enc, ptr, ASCII_u)) {
1689
5.62k
        ptr += MINBPC(enc);
1690
5.62k
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1691
5.15k
          ptr += MINBPC(enc);
1692
5.15k
          if (CHAR_MATCHES(enc, ptr, ASCII_t))
1693
4.43k
            return ASCII_QUOT;
1694
5.15k
        }
1695
5.62k
      }
1696
1.97k
      break;
1697
25.9k
    case ASCII_a:
1698
25.9k
      ptr += MINBPC(enc);
1699
25.9k
      if (CHAR_MATCHES(enc, ptr, ASCII_p)) {
1700
20.4k
        ptr += MINBPC(enc);
1701
20.4k
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1702
20.1k
          ptr += MINBPC(enc);
1703
20.1k
          if (CHAR_MATCHES(enc, ptr, ASCII_s))
1704
13.3k
            return ASCII_APOS;
1705
20.1k
        }
1706
20.4k
      }
1707
12.6k
      break;
1708
52.4k
    }
1709
198k
  }
1710
151k
  return 0;
1711
198k
}
xmltok.c:normal_predefinedEntityName
Line
Count
Source
1661
198k
                             const char *end) {
1662
198k
  UNUSED_P(enc);
1663
198k
  switch ((end - ptr) / MINBPC(enc)) {
1664
36.2k
  case 2:
1665
36.2k
    if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_t)) {
1666
1.94k
      switch (BYTE_TO_ASCII(enc, ptr)) {
1667
535
      case ASCII_l:
1668
535
        return ASCII_LT;
1669
66
      case ASCII_g:
1670
66
        return ASCII_GT;
1671
1.94k
      }
1672
1.94k
    }
1673
35.6k
    break;
1674
39.1k
  case 3:
1675
39.1k
    if (CHAR_MATCHES(enc, ptr, ASCII_a)) {
1676
29.6k
      ptr += MINBPC(enc);
1677
29.6k
      if (CHAR_MATCHES(enc, ptr, ASCII_m)) {
1678
28.6k
        ptr += MINBPC(enc);
1679
28.6k
        if (CHAR_MATCHES(enc, ptr, ASCII_p))
1680
28.4k
          return ASCII_AMP;
1681
28.6k
      }
1682
29.6k
    }
1683
10.7k
    break;
1684
52.4k
  case 4:
1685
52.4k
    switch (BYTE_TO_ASCII(enc, ptr)) {
1686
6.41k
    case ASCII_q:
1687
6.41k
      ptr += MINBPC(enc);
1688
6.41k
      if (CHAR_MATCHES(enc, ptr, ASCII_u)) {
1689
5.62k
        ptr += MINBPC(enc);
1690
5.62k
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1691
5.15k
          ptr += MINBPC(enc);
1692
5.15k
          if (CHAR_MATCHES(enc, ptr, ASCII_t))
1693
4.43k
            return ASCII_QUOT;
1694
5.15k
        }
1695
5.62k
      }
1696
1.97k
      break;
1697
25.9k
    case ASCII_a:
1698
25.9k
      ptr += MINBPC(enc);
1699
25.9k
      if (CHAR_MATCHES(enc, ptr, ASCII_p)) {
1700
20.4k
        ptr += MINBPC(enc);
1701
20.4k
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1702
20.1k
          ptr += MINBPC(enc);
1703
20.1k
          if (CHAR_MATCHES(enc, ptr, ASCII_s))
1704
13.3k
            return ASCII_APOS;
1705
20.1k
        }
1706
20.4k
      }
1707
12.6k
      break;
1708
52.4k
    }
1709
198k
  }
1710
151k
  return 0;
1711
198k
}
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
232k
                         const char *end1, const char *ptr2) {
1716
232k
  UNUSED_P(enc);
1717
1.18M
  for (; *ptr2; ptr1 += MINBPC(enc), ptr2++) {
1718
1.03M
    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
37
      return 0; /* LCOV_EXCL_LINE */
1725
37
    }
1726
1.03M
    if (! CHAR_MATCHES(enc, ptr1, *ptr2))
1727
79.2k
      return 0;
1728
1.03M
  }
1729
153k
  return ptr1 == end1;
1730
232k
}
xmltok.c:normal_nameMatchesAscii
Line
Count
Source
1715
232k
                         const char *end1, const char *ptr2) {
1716
232k
  UNUSED_P(enc);
1717
1.18M
  for (; *ptr2; ptr1 += MINBPC(enc), ptr2++) {
1718
1.03M
    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
37
      return 0; /* LCOV_EXCL_LINE */
1725
37
    }
1726
1.03M
    if (! CHAR_MATCHES(enc, ptr1, *ptr2))
1727
79.2k
      return 0;
1728
1.03M
  }
1729
153k
  return ptr1 == end1;
1730
232k
}
Unexecuted instantiation: xmltok.c:little2_nameMatchesAscii
Unexecuted instantiation: xmltok.c:big2_nameMatchesAscii
1731
1732
static int PTRFASTCALL
1733
809k
PREFIX(nameLength)(const ENCODING *enc, const char *ptr) {
1734
809k
  const char *start = ptr;
1735
12.8M
  for (;;) {
1736
12.8M
    switch (BYTE_TYPE(enc, ptr)) {
1737
0
#  define LEAD_CASE(n)                                                         \
1738
81.9k
  case BT_LEAD##n:                                                             \
1739
81.9k
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1740
81.9k
    break;
1741
36.9k
      LEAD_CASE(2)
1742
44.9k
      LEAD_CASE(3)
1743
0
      LEAD_CASE(4)
1744
0
#  undef LEAD_CASE
1745
0
    case BT_NONASCII:
1746
11.0M
    case BT_NMSTRT:
1747
#  ifdef XML_NS
1748
    case BT_COLON:
1749
#  endif
1750
11.8M
    case BT_HEX:
1751
11.8M
    case BT_DIGIT:
1752
11.9M
    case BT_NAME:
1753
11.9M
    case BT_MINUS:
1754
11.9M
      ptr += MINBPC(enc);
1755
11.9M
      break;
1756
809k
    default:
1757
809k
      return (int)(ptr - start);
1758
12.8M
    }
1759
12.8M
  }
1760
809k
}
xmltok.c:normal_nameLength
Line
Count
Source
1733
809k
PREFIX(nameLength)(const ENCODING *enc, const char *ptr) {
1734
809k
  const char *start = ptr;
1735
12.8M
  for (;;) {
1736
12.8M
    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
36.9k
      LEAD_CASE(2)
1742
44.9k
      LEAD_CASE(3)
1743
0
      LEAD_CASE(4)
1744
0
#  undef LEAD_CASE
1745
0
    case BT_NONASCII:
1746
11.0M
    case BT_NMSTRT:
1747
#  ifdef XML_NS
1748
    case BT_COLON:
1749
#  endif
1750
11.8M
    case BT_HEX:
1751
11.8M
    case BT_DIGIT:
1752
11.9M
    case BT_NAME:
1753
11.9M
    case BT_MINUS:
1754
11.9M
      ptr += MINBPC(enc);
1755
11.9M
      break;
1756
809k
    default:
1757
809k
      return (int)(ptr - start);
1758
12.8M
    }
1759
12.8M
  }
1760
809k
}
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
17.1k
                       POSITION *pos) {
1780
125M
  while (HAS_CHAR(enc, ptr, end)) {
1781
125M
    switch (BYTE_TYPE(enc, ptr)) {
1782
0
#  define LEAD_CASE(n)                                                         \
1783
1.93M
  case BT_LEAD##n:                                                             \
1784
1.93M
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1785
1.93M
    pos->columnNumber++;                                                       \
1786
1.93M
    break;
1787
841k
      LEAD_CASE(2)
1788
837k
      LEAD_CASE(3)
1789
253k
      LEAD_CASE(4)
1790
0
#  undef LEAD_CASE
1791
3.09M
    case BT_LF:
1792
3.09M
      pos->columnNumber = 0;
1793
3.09M
      pos->lineNumber++;
1794
3.09M
      ptr += MINBPC(enc);
1795
3.09M
      break;
1796
4.70M
    case BT_CR:
1797
4.70M
      pos->lineNumber++;
1798
4.70M
      ptr += MINBPC(enc);
1799
4.70M
      if (HAS_CHAR(enc, ptr, end) && BYTE_TYPE(enc, ptr) == BT_LF)
1800
923k
        ptr += MINBPC(enc);
1801
4.70M
      pos->columnNumber = 0;
1802
4.70M
      break;
1803
115M
    default:
1804
115M
      ptr += MINBPC(enc);
1805
115M
      pos->columnNumber++;
1806
115M
      break;
1807
125M
    }
1808
125M
  }
1809
17.1k
}
xmltok.c:normal_updatePosition
Line
Count
Source
1779
16.7k
                       POSITION *pos) {
1780
125M
  while (HAS_CHAR(enc, ptr, end)) {
1781
125M
    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
841k
      LEAD_CASE(2)
1788
837k
      LEAD_CASE(3)
1789
253k
      LEAD_CASE(4)
1790
0
#  undef LEAD_CASE
1791
3.09M
    case BT_LF:
1792
3.09M
      pos->columnNumber = 0;
1793
3.09M
      pos->lineNumber++;
1794
3.09M
      ptr += MINBPC(enc);
1795
3.09M
      break;
1796
4.70M
    case BT_CR:
1797
4.70M
      pos->lineNumber++;
1798
4.70M
      ptr += MINBPC(enc);
1799
4.70M
      if (HAS_CHAR(enc, ptr, end) && BYTE_TYPE(enc, ptr) == BT_LF)
1800
923k
        ptr += MINBPC(enc);
1801
4.70M
      pos->columnNumber = 0;
1802
4.70M
      break;
1803
115M
    default:
1804
115M
      ptr += MINBPC(enc);
1805
115M
      pos->columnNumber++;
1806
115M
      break;
1807
125M
    }
1808
125M
  }
1809
16.7k
}
xmltok.c:little2_updatePosition
Line
Count
Source
1779
206
                       POSITION *pos) {
1780
136k
  while (HAS_CHAR(enc, ptr, end)) {
1781
136k
    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
136k
    default:
1804
136k
      ptr += MINBPC(enc);
1805
136k
      pos->columnNumber++;
1806
136k
      break;
1807
136k
    }
1808
136k
  }
1809
206
}
xmltok.c:big2_updatePosition
Line
Count
Source
1779
188
                       POSITION *pos) {
1780
420
  while (HAS_CHAR(enc, ptr, end)) {
1781
420
    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
420
    default:
1804
420
      ptr += MINBPC(enc);
1805
420
      pos->columnNumber++;
1806
420
      break;
1807
420
    }
1808
420
  }
1809
188
}
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 */