Coverage Report

Created: 2026-10-28 06:38

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, 3 times)!
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-2026 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
   Copyright (c) 2026      Nick Begg <nick@stunttruck.net>
21
   Copyright (c) 2026      Kartik Kenchi <netliomax25@gmail.com>
22
   Licensed under the MIT license:
23
24
   Permission is  hereby granted,  free of charge,  to any  person obtaining
25
   a  copy  of  this  software   and  associated  documentation  files  (the
26
   "Software"),  to  deal in  the  Software  without restriction,  including
27
   without  limitation the  rights  to use,  copy,  modify, merge,  publish,
28
   distribute, sublicense, and/or sell copies of the Software, and to permit
29
   persons  to whom  the Software  is  furnished to  do so,  subject to  the
30
   following conditions:
31
32
   The above copyright  notice and this permission notice  shall be included
33
   in all copies or substantial portions of the Software.
34
35
   THE  SOFTWARE  IS  PROVIDED  "AS  IS",  WITHOUT  WARRANTY  OF  ANY  KIND,
36
   EXPRESS  OR IMPLIED,  INCLUDING  BUT  NOT LIMITED  TO  THE WARRANTIES  OF
37
   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
38
   NO EVENT SHALL THE AUTHORS OR  COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
39
   DAMAGES OR  OTHER LIABILITY, WHETHER  IN AN  ACTION OF CONTRACT,  TORT OR
40
   OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
41
   USE OR OTHER DEALINGS IN THE SOFTWARE.
42
43
   SPDX-License-Identifier: MIT
44
*/
45
46
#ifdef XML_TOK_IMPL_C
47
48
#  define INVALID_LEAD_CASE(n, ptr, nextTokPtr)                                \
49
713k
  case BT_LEAD##n:                                                             \
50
713k
    if (end - ptr < n)                                                         \
51
713k
      return XML_TOK_PARTIAL_CHAR;                                             \
52
713k
    if (IS_INVALID_CHAR(enc, ptr, n)) {                                        \
53
131
      *(nextTokPtr) = (ptr);                                                   \
54
131
      return XML_TOK_INVALID;                                                  \
55
131
    }                                                                          \
56
713k
    ptr += n;                                                                  \
57
713k
    break;
58
59
#  define INVALID_CASES(ptr, nextTokPtr)                                       \
60
276k
    INVALID_LEAD_CASE(2, ptr, nextTokPtr)                                      \
61
275k
    INVALID_LEAD_CASE(3, ptr, nextTokPtr)                                      \
62
233k
    INVALID_LEAD_CASE(4, ptr, nextTokPtr)                                      \
63
232k
  case BT_NONXML:                                                              \
64
83
  case BT_MALFORM:                                                             \
65
160
  case BT_TRAIL:                                                               \
66
160
    *(nextTokPtr) = (ptr);                                                     \
67
160
    return XML_TOK_INVALID;
68
69
#  define CHECK_NAME_CASE(n, enc, ptr, end, nextTokPtr)                        \
70
210k
  case BT_LEAD##n:                                                             \
71
210k
    if (end - ptr < n)                                                         \
72
209k
      return XML_TOK_PARTIAL_CHAR;                                             \
73
209k
    if (IS_INVALID_CHAR(enc, ptr, n) || ! IS_NAME_CHAR(enc, ptr, n)) {         \
74
285
      *nextTokPtr = ptr;                                                       \
75
285
      return XML_TOK_INVALID;                                                  \
76
285
    }                                                                          \
77
209k
    ptr += n;                                                                  \
78
209k
    break;
79
80
#  define CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)                          \
81
41.0M
  case BT_NONASCII:                                                            \
82
41.0M
    if (! IS_NAME_CHAR_MINBPC(enc, ptr)) {                                     \
83
48
      *nextTokPtr = ptr;                                                       \
84
48
      return XML_TOK_INVALID;                                                  \
85
48
    }                                                                          \
86
41.0M
    EXPAT_FALLTHROUGH;                                                         \
87
21.6M
  case BT_NMSTRT:                                                              \
88
29.9M
  case BT_HEX:                                                                 \
89
33.8M
  case BT_DIGIT:                                                               \
90
34.2M
  case BT_NAME:                                                                \
91
41.0M
  case BT_MINUS:                                                               \
92
41.0M
    ptr += MINBPC(enc);                                                        \
93
41.0M
    break;                                                                     \
94
41.0M
    CHECK_NAME_CASE(2, enc, ptr, end, nextTokPtr)                              \
95
127k
    CHECK_NAME_CASE(3, enc, ptr, end, nextTokPtr)                              \
96
81.9k
    CHECK_NAME_CASE(4, enc, ptr, end, nextTokPtr)
97
98
#  define CHECK_NMSTRT_CASE(n, enc, ptr, end, nextTokPtr)                      \
99
98.9k
  case BT_LEAD##n:                                                             \
100
98.9k
    if ((end) - (ptr) < (n))                                                   \
101
98.6k
      return XML_TOK_PARTIAL_CHAR;                                             \
102
98.8k
    if (IS_INVALID_CHAR(enc, ptr, n) || ! IS_NMSTRT_CHAR(enc, ptr, n)) {       \
103
186
      *nextTokPtr = ptr;                                                       \
104
186
      return XML_TOK_INVALID;                                                  \
105
186
    }                                                                          \
106
98.8k
    ptr += n;                                                                  \
107
98.6k
    break;
108
109
#  define CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)                        \
110
4.95M
  case BT_NONASCII:                                                            \
111
4.95M
    if (! IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {                                   \
112
0
      *nextTokPtr = ptr;                                                       \
113
0
      return XML_TOK_INVALID;                                                  \
114
0
    }                                                                          \
115
4.95M
    EXPAT_FALLTHROUGH;                                                         \
116
4.77M
  case BT_NMSTRT:                                                              \
117
4.95M
  case BT_HEX:                                                                 \
118
4.95M
    ptr += MINBPC(enc);                                                        \
119
4.95M
    break;                                                                     \
120
4.95M
    CHECK_NMSTRT_CASE(2, enc, ptr, end, nextTokPtr)                            \
121
69.7k
    CHECK_NMSTRT_CASE(3, enc, ptr, end, nextTokPtr)                            \
122
28.8k
    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
348M
    ((end) - (ptr) >= ((count) * MINBPC(enc)))
130
131
16.6M
#  define HAS_CHAR(enc, ptr, end) HAS_CHARS(enc, ptr, end, 1)
132
133
#  define REQUIRE_CHARS(enc, ptr, end, count)                                  \
134
41.5M
    {                                                                          \
135
41.5M
      if (! HAS_CHARS(enc, ptr, end, count)) {                                 \
136
730
        return XML_TOK_PARTIAL;                                                \
137
730
      }                                                                        \
138
41.5M
    }
139
140
41.5M
#  define REQUIRE_CHAR(enc, ptr, end) REQUIRE_CHARS(enc, ptr, end, 1)
141
142
/* ptr points to character following "<!-" */
143
144
static int
145
PREFIX(scanComment)(const ENCODING *enc, const char *ptr, const char *end,
146
12.9k
                    const char **nextTokPtr) {
147
12.9k
  if (HAS_CHAR(enc, ptr, end)) {
148
12.9k
    if (! CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
149
10
      *nextTokPtr = ptr;
150
10
      return XML_TOK_INVALID;
151
10
    }
152
12.9k
    ptr += MINBPC(enc);
153
7.94M
    while (HAS_CHAR(enc, ptr, end)) {
154
7.94M
      switch (BYTE_TYPE(enc, ptr)) {
155
208k
        INVALID_CASES(ptr, nextTokPtr)
156
32.3k
      case BT_MINUS:
157
32.3k
        ptr += MINBPC(enc);
158
32.3k
        REQUIRE_CHAR(enc, ptr, end);
159
32.3k
        if (CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
160
12.7k
          ptr += MINBPC(enc);
161
12.7k
          REQUIRE_CHAR(enc, ptr, end);
162
12.7k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
163
11
            *nextTokPtr = ptr;
164
11
            return XML_TOK_INVALID;
165
11
          }
166
12.7k
          *nextTokPtr = ptr + MINBPC(enc);
167
12.7k
          return XML_TOK_COMMENT;
168
12.7k
        }
169
19.5k
        break;
170
7.81M
      default:
171
7.81M
        ptr += MINBPC(enc);
172
7.81M
        break;
173
7.94M
      }
174
7.94M
    }
175
12.9k
  }
176
86
  return XML_TOK_PARTIAL;
177
12.9k
}
xmltok.c:normal_scanComment
Line
Count
Source
146
12.9k
                    const char **nextTokPtr) {
147
12.9k
  if (HAS_CHAR(enc, ptr, end)) {
148
12.9k
    if (! CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
149
10
      *nextTokPtr = ptr;
150
10
      return XML_TOK_INVALID;
151
10
    }
152
12.9k
    ptr += MINBPC(enc);
153
7.94M
    while (HAS_CHAR(enc, ptr, end)) {
154
7.94M
      switch (BYTE_TYPE(enc, ptr)) {
155
208k
        INVALID_CASES(ptr, nextTokPtr)
156
32.3k
      case BT_MINUS:
157
32.3k
        ptr += MINBPC(enc);
158
32.3k
        REQUIRE_CHAR(enc, ptr, end);
159
32.3k
        if (CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
160
12.7k
          ptr += MINBPC(enc);
161
12.7k
          REQUIRE_CHAR(enc, ptr, end);
162
12.7k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
163
11
            *nextTokPtr = ptr;
164
11
            return XML_TOK_INVALID;
165
11
          }
166
12.7k
          *nextTokPtr = ptr + MINBPC(enc);
167
12.7k
          return XML_TOK_COMMENT;
168
12.7k
        }
169
19.5k
        break;
170
7.81M
      default:
171
7.81M
        ptr += MINBPC(enc);
172
7.81M
        break;
173
7.94M
      }
174
7.94M
    }
175
12.9k
  }
176
86
  return XML_TOK_PARTIAL;
177
12.9k
}
Unexecuted instantiation: xmltok.c:little2_scanComment
Unexecuted instantiation: xmltok.c:big2_scanComment
178
179
/* ptr points to character following "<!" */
180
181
static int
182
PREFIX(scanDecl)(const ENCODING *enc, const char *ptr, const char *end,
183
38.6k
                 const char **nextTokPtr) {
184
38.6k
  REQUIRE_CHAR(enc, ptr, end);
185
38.6k
  switch (BYTE_TYPE(enc, ptr)) {
186
2.15k
  case BT_MINUS:
187
2.15k
    return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
188
1
  case BT_LSQB:
189
1
    *nextTokPtr = ptr + MINBPC(enc);
190
1
    return XML_TOK_COND_SECT_OPEN;
191
1.97k
  case BT_NMSTRT:
192
36.4k
  case BT_HEX:
193
36.4k
    ptr += MINBPC(enc);
194
36.4k
    break;
195
4
  default:
196
4
    *nextTokPtr = ptr;
197
4
    return XML_TOK_INVALID;
198
38.6k
  }
199
248k
  while (HAS_CHAR(enc, ptr, end)) {
200
248k
    switch (BYTE_TYPE(enc, ptr)) {
201
22
    case BT_PERCNT:
202
22
      REQUIRE_CHARS(enc, ptr, end, 2);
203
      /* don't allow <!ENTITY% foo "whatever"> */
204
20
      switch (BYTE_TYPE(enc, ptr + MINBPC(enc))) {
205
2
      case BT_S:
206
3
      case BT_CR:
207
4
      case BT_LF:
208
6
      case BT_PERCNT:
209
6
        *nextTokPtr = ptr;
210
6
        return XML_TOK_INVALID;
211
20
      }
212
14
      EXPAT_FALLTHROUGH;
213
14.1k
    case BT_S:
214
31.5k
    case BT_CR:
215
36.3k
    case BT_LF:
216
36.3k
      *nextTokPtr = ptr;
217
36.3k
      return XML_TOK_DECL_OPEN;
218
192k
    case BT_NMSTRT:
219
212k
    case BT_HEX:
220
212k
      ptr += MINBPC(enc);
221
212k
      break;
222
11
    default:
223
11
      *nextTokPtr = ptr;
224
11
      return XML_TOK_INVALID;
225
248k
    }
226
248k
  }
227
78
  return XML_TOK_PARTIAL;
228
36.4k
}
xmltok.c:normal_scanDecl
Line
Count
Source
183
38.6k
                 const char **nextTokPtr) {
184
38.6k
  REQUIRE_CHAR(enc, ptr, end);
185
38.6k
  switch (BYTE_TYPE(enc, ptr)) {
186
2.15k
  case BT_MINUS:
187
2.15k
    return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
188
1
  case BT_LSQB:
189
1
    *nextTokPtr = ptr + MINBPC(enc);
190
1
    return XML_TOK_COND_SECT_OPEN;
191
1.97k
  case BT_NMSTRT:
192
36.4k
  case BT_HEX:
193
36.4k
    ptr += MINBPC(enc);
194
36.4k
    break;
195
4
  default:
196
4
    *nextTokPtr = ptr;
197
4
    return XML_TOK_INVALID;
198
38.6k
  }
199
248k
  while (HAS_CHAR(enc, ptr, end)) {
200
248k
    switch (BYTE_TYPE(enc, ptr)) {
201
22
    case BT_PERCNT:
202
22
      REQUIRE_CHARS(enc, ptr, end, 2);
203
      /* don't allow <!ENTITY% foo "whatever"> */
204
20
      switch (BYTE_TYPE(enc, ptr + MINBPC(enc))) {
205
2
      case BT_S:
206
3
      case BT_CR:
207
4
      case BT_LF:
208
6
      case BT_PERCNT:
209
6
        *nextTokPtr = ptr;
210
6
        return XML_TOK_INVALID;
211
20
      }
212
14
      EXPAT_FALLTHROUGH;
213
14.1k
    case BT_S:
214
31.5k
    case BT_CR:
215
36.3k
    case BT_LF:
216
36.3k
      *nextTokPtr = ptr;
217
36.3k
      return XML_TOK_DECL_OPEN;
218
192k
    case BT_NMSTRT:
219
212k
    case BT_HEX:
220
212k
      ptr += MINBPC(enc);
221
212k
      break;
222
11
    default:
223
11
      *nextTokPtr = ptr;
224
11
      return XML_TOK_INVALID;
225
248k
    }
226
248k
  }
227
78
  return XML_TOK_PARTIAL;
228
36.4k
}
Unexecuted instantiation: xmltok.c:little2_scanDecl
Unexecuted instantiation: xmltok.c:big2_scanDecl
229
230
static int
231
PREFIX(checkPiTarget)(const ENCODING *enc, const char *ptr, const char *end,
232
36.2k
                      int *tokPtr) {
233
36.2k
  int upper = 0;
234
36.2k
  UNUSED_P(enc);
235
36.2k
  *tokPtr = XML_TOK_PI;
236
36.2k
  if (end - ptr != MINBPC(enc) * 3)
237
29.2k
    return 1;
238
6.99k
  switch (BYTE_TO_ASCII(enc, ptr)) {
239
3.88k
  case ASCII_x:
240
3.88k
    break;
241
917
  case ASCII_X:
242
917
    upper = 1;
243
917
    break;
244
2.19k
  default:
245
2.19k
    return 1;
246
6.99k
  }
247
4.80k
  ptr += MINBPC(enc);
248
4.80k
  switch (BYTE_TO_ASCII(enc, ptr)) {
249
1.08k
  case ASCII_m:
250
1.08k
    break;
251
695
  case ASCII_M:
252
695
    upper = 1;
253
695
    break;
254
3.02k
  default:
255
3.02k
    return 1;
256
4.80k
  }
257
1.78k
  ptr += MINBPC(enc);
258
1.78k
  switch (BYTE_TO_ASCII(enc, ptr)) {
259
515
  case ASCII_l:
260
515
    break;
261
3
  case ASCII_L:
262
3
    upper = 1;
263
3
    break;
264
1.26k
  default:
265
1.26k
    return 1;
266
1.78k
  }
267
518
  if (upper)
268
6
    return 0;
269
512
  *tokPtr = XML_TOK_XML_DECL;
270
512
  return 1;
271
518
}
xmltok.c:normal_checkPiTarget
Line
Count
Source
232
36.2k
                      int *tokPtr) {
233
36.2k
  int upper = 0;
234
36.2k
  UNUSED_P(enc);
235
36.2k
  *tokPtr = XML_TOK_PI;
236
36.2k
  if (end - ptr != MINBPC(enc) * 3)
237
29.2k
    return 1;
238
6.99k
  switch (BYTE_TO_ASCII(enc, ptr)) {
239
3.88k
  case ASCII_x:
240
3.88k
    break;
241
917
  case ASCII_X:
242
917
    upper = 1;
243
917
    break;
244
2.19k
  default:
245
2.19k
    return 1;
246
6.99k
  }
247
4.80k
  ptr += MINBPC(enc);
248
4.80k
  switch (BYTE_TO_ASCII(enc, ptr)) {
249
1.08k
  case ASCII_m:
250
1.08k
    break;
251
695
  case ASCII_M:
252
695
    upper = 1;
253
695
    break;
254
3.02k
  default:
255
3.02k
    return 1;
256
4.80k
  }
257
1.78k
  ptr += MINBPC(enc);
258
1.78k
  switch (BYTE_TO_ASCII(enc, ptr)) {
259
515
  case ASCII_l:
260
515
    break;
261
3
  case ASCII_L:
262
3
    upper = 1;
263
3
    break;
264
1.26k
  default:
265
1.26k
    return 1;
266
1.78k
  }
267
518
  if (upper)
268
6
    return 0;
269
512
  *tokPtr = XML_TOK_XML_DECL;
270
512
  return 1;
271
518
}
Unexecuted instantiation: xmltok.c:little2_checkPiTarget
Unexecuted instantiation: xmltok.c:big2_checkPiTarget
272
273
/* ptr points to character following "<?" */
274
275
static int
276
PREFIX(scanPi)(const ENCODING *enc, const char *ptr, const char *end,
277
36.4k
               const char **nextTokPtr) {
278
36.4k
  int tok;
279
36.4k
  const char *target = ptr;
280
36.4k
  REQUIRE_CHAR(enc, ptr, end);
281
36.4k
  switch (BYTE_TYPE(enc, ptr)) {
282
45.3k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
283
2
  default:
284
2
    *nextTokPtr = ptr;
285
2
    return XML_TOK_INVALID;
286
36.4k
  }
287
729k
  while (HAS_CHAR(enc, ptr, end)) {
288
729k
    switch (BYTE_TYPE(enc, ptr)) {
289
2.54M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
290
5.97k
    case BT_S:
291
15.0k
    case BT_CR:
292
17.2k
    case BT_LF:
293
17.2k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
294
4
        *nextTokPtr = ptr;
295
4
        return XML_TOK_INVALID;
296
4
      }
297
17.2k
      ptr += MINBPC(enc);
298
24.8M
      while (HAS_CHAR(enc, ptr, end)) {
299
24.8M
        switch (BYTE_TYPE(enc, ptr)) {
300
471k
          INVALID_CASES(ptr, nextTokPtr)
301
116k
        case BT_QUEST:
302
116k
          ptr += MINBPC(enc);
303
116k
          REQUIRE_CHAR(enc, ptr, end);
304
116k
          if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
305
17.0k
            *nextTokPtr = ptr + MINBPC(enc);
306
17.0k
            return tok;
307
17.0k
          }
308
99.5k
          break;
309
24.5M
        default:
310
24.5M
          ptr += MINBPC(enc);
311
24.5M
          break;
312
24.8M
        }
313
24.8M
      }
314
174
      return XML_TOK_PARTIAL;
315
18.9k
    case BT_QUEST:
316
18.9k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
317
2
        *nextTokPtr = ptr;
318
2
        return XML_TOK_INVALID;
319
2
      }
320
18.9k
      ptr += MINBPC(enc);
321
18.9k
      REQUIRE_CHAR(enc, ptr, end);
322
18.9k
      if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
323
18.8k
        *nextTokPtr = ptr + MINBPC(enc);
324
18.8k
        return tok;
325
18.8k
      }
326
15
      EXPAT_FALLTHROUGH;
327
33
    default:
328
33
      *nextTokPtr = ptr;
329
33
      return XML_TOK_INVALID;
330
729k
    }
331
729k
  }
332
104
  return XML_TOK_PARTIAL;
333
36.3k
}
xmltok.c:normal_scanPi
Line
Count
Source
277
36.4k
               const char **nextTokPtr) {
278
36.4k
  int tok;
279
36.4k
  const char *target = ptr;
280
36.4k
  REQUIRE_CHAR(enc, ptr, end);
281
36.4k
  switch (BYTE_TYPE(enc, ptr)) {
282
45.3k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
283
2
  default:
284
2
    *nextTokPtr = ptr;
285
2
    return XML_TOK_INVALID;
286
36.4k
  }
287
729k
  while (HAS_CHAR(enc, ptr, end)) {
288
729k
    switch (BYTE_TYPE(enc, ptr)) {
289
2.54M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
290
5.97k
    case BT_S:
291
15.0k
    case BT_CR:
292
17.2k
    case BT_LF:
293
17.2k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
294
4
        *nextTokPtr = ptr;
295
4
        return XML_TOK_INVALID;
296
4
      }
297
17.2k
      ptr += MINBPC(enc);
298
24.8M
      while (HAS_CHAR(enc, ptr, end)) {
299
24.8M
        switch (BYTE_TYPE(enc, ptr)) {
300
471k
          INVALID_CASES(ptr, nextTokPtr)
301
116k
        case BT_QUEST:
302
116k
          ptr += MINBPC(enc);
303
116k
          REQUIRE_CHAR(enc, ptr, end);
304
116k
          if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
305
17.0k
            *nextTokPtr = ptr + MINBPC(enc);
306
17.0k
            return tok;
307
17.0k
          }
308
99.5k
          break;
309
24.5M
        default:
310
24.5M
          ptr += MINBPC(enc);
311
24.5M
          break;
312
24.8M
        }
313
24.8M
      }
314
174
      return XML_TOK_PARTIAL;
315
18.9k
    case BT_QUEST:
316
18.9k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
317
2
        *nextTokPtr = ptr;
318
2
        return XML_TOK_INVALID;
319
2
      }
320
18.9k
      ptr += MINBPC(enc);
321
18.9k
      REQUIRE_CHAR(enc, ptr, end);
322
18.9k
      if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
323
18.8k
        *nextTokPtr = ptr + MINBPC(enc);
324
18.8k
        return tok;
325
18.8k
      }
326
15
      EXPAT_FALLTHROUGH;
327
33
    default:
328
33
      *nextTokPtr = ptr;
329
33
      return XML_TOK_INVALID;
330
729k
    }
331
729k
  }
332
104
  return XML_TOK_PARTIAL;
333
36.3k
}
Unexecuted instantiation: xmltok.c:little2_scanPi
Unexecuted instantiation: xmltok.c:big2_scanPi
334
335
static int
336
PREFIX(scanCdataSection)(const ENCODING *enc, const char *ptr, const char *end,
337
2.35k
                         const char **nextTokPtr) {
338
2.35k
  static const char CDATA_LSQB[]
339
2.35k
      = {ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, ASCII_LSQB};
340
2.35k
  int i;
341
2.35k
  UNUSED_P(enc);
342
  /* CDATA[ */
343
2.35k
  REQUIRE_CHARS(enc, ptr, end, 6);
344
16.0k
  for (i = 0; i < 6; i++, ptr += MINBPC(enc)) {
345
13.8k
    if (! CHAR_MATCHES(enc, ptr, CDATA_LSQB[i])) {
346
58
      *nextTokPtr = ptr;
347
58
      return XML_TOK_INVALID;
348
58
    }
349
13.8k
  }
350
2.26k
  *nextTokPtr = ptr;
351
2.26k
  return XML_TOK_CDATA_SECT_OPEN;
352
2.32k
}
xmltok.c:normal_scanCdataSection
Line
Count
Source
337
2.35k
                         const char **nextTokPtr) {
338
2.35k
  static const char CDATA_LSQB[]
339
2.35k
      = {ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, ASCII_LSQB};
340
2.35k
  int i;
341
2.35k
  UNUSED_P(enc);
342
  /* CDATA[ */
343
2.35k
  REQUIRE_CHARS(enc, ptr, end, 6);
344
16.0k
  for (i = 0; i < 6; i++, ptr += MINBPC(enc)) {
345
13.8k
    if (! CHAR_MATCHES(enc, ptr, CDATA_LSQB[i])) {
346
58
      *nextTokPtr = ptr;
347
58
      return XML_TOK_INVALID;
348
58
    }
349
13.8k
  }
350
2.26k
  *nextTokPtr = ptr;
351
2.26k
  return XML_TOK_CDATA_SECT_OPEN;
352
2.32k
}
Unexecuted instantiation: xmltok.c:little2_scanCdataSection
Unexecuted instantiation: xmltok.c:big2_scanCdataSection
353
354
static int
355
PREFIX(cdataSectionTok)(const ENCODING *enc, const char *ptr, const char *end,
356
4.47M
                        const char **nextTokPtr) {
357
4.47M
  if (ptr >= end)
358
260
    return XML_TOK_NONE;
359
4.47M
  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
4.47M
  switch (BYTE_TYPE(enc, ptr)) {
369
587k
  case BT_RSQB:
370
587k
    ptr += MINBPC(enc);
371
587k
    REQUIRE_CHAR(enc, ptr, end);
372
587k
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
373
318k
      break;
374
269k
    ptr += MINBPC(enc);
375
269k
    REQUIRE_CHAR(enc, ptr, end);
376
269k
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
377
267k
      ptr -= MINBPC(enc);
378
267k
      break;
379
267k
    }
380
2.04k
    *nextTokPtr = ptr + MINBPC(enc);
381
2.04k
    return XML_TOK_CDATA_SECT_CLOSE;
382
1.85M
  case BT_CR:
383
1.85M
    ptr += MINBPC(enc);
384
1.85M
    REQUIRE_CHAR(enc, ptr, end);
385
1.85M
    if (BYTE_TYPE(enc, ptr) == BT_LF)
386
350k
      ptr += MINBPC(enc);
387
1.85M
    *nextTokPtr = ptr;
388
1.85M
    return XML_TOK_DATA_NEWLINE;
389
1.18M
  case BT_LF:
390
1.18M
    *nextTokPtr = ptr + MINBPC(enc);
391
1.18M
    return XML_TOK_DATA_NEWLINE;
392
1.18M
    INVALID_CASES(ptr, nextTokPtr)
393
792k
  default:
394
792k
    ptr += MINBPC(enc);
395
792k
    break;
396
4.47M
  }
397
23.1M
  while (HAS_CHAR(enc, ptr, end)) {
398
23.1M
    switch (BYTE_TYPE(enc, ptr)) {
399
0
#  define LEAD_CASE(n)                                                         \
400
360k
  case BT_LEAD##n:                                                             \
401
360k
    if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) {                       \
402
26
      *nextTokPtr = ptr;                                                       \
403
26
      return XML_TOK_DATA_CHARS;                                               \
404
26
    }                                                                          \
405
360k
    ptr += n;                                                                  \
406
360k
    break;
407
176k
      LEAD_CASE(2)
408
123k
      LEAD_CASE(3)
409
60.9k
      LEAD_CASE(4)
410
0
#  undef LEAD_CASE
411
13
    case BT_NONXML:
412
17
    case BT_MALFORM:
413
27
    case BT_TRAIL:
414
655k
    case BT_CR:
415
971k
    case BT_LF:
416
1.43M
    case BT_RSQB:
417
1.43M
      *nextTokPtr = ptr;
418
1.43M
      return XML_TOK_DATA_CHARS;
419
21.3M
    default:
420
21.3M
      ptr += MINBPC(enc);
421
21.3M
      break;
422
23.1M
    }
423
23.1M
  }
424
83
  *nextTokPtr = ptr;
425
83
  return XML_TOK_DATA_CHARS;
426
1.43M
}
xmltok.c:normal_cdataSectionTok
Line
Count
Source
356
4.47M
                        const char **nextTokPtr) {
357
4.47M
  if (ptr >= end)
358
260
    return XML_TOK_NONE;
359
4.47M
  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
4.47M
  switch (BYTE_TYPE(enc, ptr)) {
369
587k
  case BT_RSQB:
370
587k
    ptr += MINBPC(enc);
371
587k
    REQUIRE_CHAR(enc, ptr, end);
372
587k
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
373
318k
      break;
374
269k
    ptr += MINBPC(enc);
375
269k
    REQUIRE_CHAR(enc, ptr, end);
376
269k
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
377
267k
      ptr -= MINBPC(enc);
378
267k
      break;
379
267k
    }
380
2.04k
    *nextTokPtr = ptr + MINBPC(enc);
381
2.04k
    return XML_TOK_CDATA_SECT_CLOSE;
382
1.85M
  case BT_CR:
383
1.85M
    ptr += MINBPC(enc);
384
1.85M
    REQUIRE_CHAR(enc, ptr, end);
385
1.85M
    if (BYTE_TYPE(enc, ptr) == BT_LF)
386
350k
      ptr += MINBPC(enc);
387
1.85M
    *nextTokPtr = ptr;
388
1.85M
    return XML_TOK_DATA_NEWLINE;
389
1.18M
  case BT_LF:
390
1.18M
    *nextTokPtr = ptr + MINBPC(enc);
391
1.18M
    return XML_TOK_DATA_NEWLINE;
392
1.18M
    INVALID_CASES(ptr, nextTokPtr)
393
792k
  default:
394
792k
    ptr += MINBPC(enc);
395
792k
    break;
396
4.47M
  }
397
23.1M
  while (HAS_CHAR(enc, ptr, end)) {
398
23.1M
    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
176k
      LEAD_CASE(2)
408
123k
      LEAD_CASE(3)
409
60.9k
      LEAD_CASE(4)
410
0
#  undef LEAD_CASE
411
13
    case BT_NONXML:
412
17
    case BT_MALFORM:
413
27
    case BT_TRAIL:
414
655k
    case BT_CR:
415
971k
    case BT_LF:
416
1.43M
    case BT_RSQB:
417
1.43M
      *nextTokPtr = ptr;
418
1.43M
      return XML_TOK_DATA_CHARS;
419
21.3M
    default:
420
21.3M
      ptr += MINBPC(enc);
421
21.3M
      break;
422
23.1M
    }
423
23.1M
  }
424
83
  *nextTokPtr = ptr;
425
83
  return XML_TOK_DATA_CHARS;
426
1.43M
}
Unexecuted instantiation: xmltok.c:little2_cdataSectionTok
Unexecuted instantiation: xmltok.c:big2_cdataSectionTok
427
428
/* ptr points to character following "</" */
429
430
static int
431
PREFIX(scanEndTag)(const ENCODING *enc, const char *ptr, const char *end,
432
143k
                   const char **nextTokPtr) {
433
143k
  REQUIRE_CHAR(enc, ptr, end);
434
143k
  switch (BYTE_TYPE(enc, ptr)) {
435
101k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
436
11
  default:
437
11
    *nextTokPtr = ptr;
438
11
    return XML_TOK_INVALID;
439
143k
  }
440
4.35M
  while (HAS_CHAR(enc, ptr, end)) {
441
4.35M
    switch (BYTE_TYPE(enc, ptr)) {
442
12.9M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
443
533
    case BT_S:
444
1.46k
    case BT_CR:
445
2.45k
    case BT_LF:
446
5.87k
      for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
447
5.87k
        switch (BYTE_TYPE(enc, ptr)) {
448
594
        case BT_S:
449
1.52k
        case BT_CR:
450
3.47k
        case BT_LF:
451
3.47k
          break;
452
2.39k
        case BT_GT:
453
2.39k
          *nextTokPtr = ptr + MINBPC(enc);
454
2.39k
          return XML_TOK_END_TAG;
455
2
        default:
456
2
          *nextTokPtr = ptr;
457
2
          return XML_TOK_INVALID;
458
5.87k
        }
459
5.87k
      }
460
62
      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
141k
    case BT_GT:
469
141k
      *nextTokPtr = ptr + MINBPC(enc);
470
141k
      return XML_TOK_END_TAG;
471
16
    default:
472
16
      *nextTokPtr = ptr;
473
16
      return XML_TOK_INVALID;
474
4.35M
    }
475
4.35M
  }
476
120
  return XML_TOK_PARTIAL;
477
143k
}
xmltok.c:normal_scanEndTag
Line
Count
Source
432
143k
                   const char **nextTokPtr) {
433
143k
  REQUIRE_CHAR(enc, ptr, end);
434
143k
  switch (BYTE_TYPE(enc, ptr)) {
435
101k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
436
11
  default:
437
11
    *nextTokPtr = ptr;
438
11
    return XML_TOK_INVALID;
439
143k
  }
440
4.35M
  while (HAS_CHAR(enc, ptr, end)) {
441
4.35M
    switch (BYTE_TYPE(enc, ptr)) {
442
12.9M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
443
533
    case BT_S:
444
1.46k
    case BT_CR:
445
2.45k
    case BT_LF:
446
5.87k
      for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
447
5.87k
        switch (BYTE_TYPE(enc, ptr)) {
448
594
        case BT_S:
449
1.52k
        case BT_CR:
450
3.47k
        case BT_LF:
451
3.47k
          break;
452
2.39k
        case BT_GT:
453
2.39k
          *nextTokPtr = ptr + MINBPC(enc);
454
2.39k
          return XML_TOK_END_TAG;
455
2
        default:
456
2
          *nextTokPtr = ptr;
457
2
          return XML_TOK_INVALID;
458
5.87k
        }
459
5.87k
      }
460
62
      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
141k
    case BT_GT:
469
141k
      *nextTokPtr = ptr + MINBPC(enc);
470
141k
      return XML_TOK_END_TAG;
471
16
    default:
472
16
      *nextTokPtr = ptr;
473
16
      return XML_TOK_INVALID;
474
4.35M
    }
475
4.35M
  }
476
120
  return XML_TOK_PARTIAL;
477
143k
}
Unexecuted instantiation: xmltok.c:little2_scanEndTag
Unexecuted instantiation: xmltok.c:big2_scanEndTag
478
479
/* ptr points to character following "&#X" */
480
481
static int
482
PREFIX(scanHexCharRef)(const ENCODING *enc, const char *ptr, const char *end,
483
24.7k
                       const char **nextTokPtr) {
484
24.7k
  if (HAS_CHAR(enc, ptr, end)) {
485
24.7k
    switch (BYTE_TYPE(enc, ptr)) {
486
11.3k
    case BT_DIGIT:
487
24.7k
    case BT_HEX:
488
24.7k
      break;
489
5
    default:
490
5
      *nextTokPtr = ptr;
491
5
      return XML_TOK_INVALID;
492
24.7k
    }
493
79.1k
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
494
79.1k
      switch (BYTE_TYPE(enc, ptr)) {
495
32.4k
      case BT_DIGIT:
496
54.3k
      case BT_HEX:
497
54.3k
        break;
498
24.7k
      case BT_SEMI:
499
24.7k
        *nextTokPtr = ptr + MINBPC(enc);
500
24.7k
        return XML_TOK_CHAR_REF;
501
3
      default:
502
3
        *nextTokPtr = ptr;
503
3
        return XML_TOK_INVALID;
504
79.1k
      }
505
79.1k
    }
506
24.7k
  }
507
33
  return XML_TOK_PARTIAL;
508
24.7k
}
xmltok.c:normal_scanHexCharRef
Line
Count
Source
483
24.7k
                       const char **nextTokPtr) {
484
24.7k
  if (HAS_CHAR(enc, ptr, end)) {
485
24.7k
    switch (BYTE_TYPE(enc, ptr)) {
486
11.3k
    case BT_DIGIT:
487
24.7k
    case BT_HEX:
488
24.7k
      break;
489
5
    default:
490
5
      *nextTokPtr = ptr;
491
5
      return XML_TOK_INVALID;
492
24.7k
    }
493
79.1k
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
494
79.1k
      switch (BYTE_TYPE(enc, ptr)) {
495
32.4k
      case BT_DIGIT:
496
54.3k
      case BT_HEX:
497
54.3k
        break;
498
24.7k
      case BT_SEMI:
499
24.7k
        *nextTokPtr = ptr + MINBPC(enc);
500
24.7k
        return XML_TOK_CHAR_REF;
501
3
      default:
502
3
        *nextTokPtr = ptr;
503
3
        return XML_TOK_INVALID;
504
79.1k
      }
505
79.1k
    }
506
24.7k
  }
507
33
  return XML_TOK_PARTIAL;
508
24.7k
}
Unexecuted instantiation: xmltok.c:little2_scanHexCharRef
Unexecuted instantiation: xmltok.c:big2_scanHexCharRef
509
510
/* ptr points to character following "&#" */
511
512
static int
513
PREFIX(scanCharRef)(const ENCODING *enc, const char *ptr, const char *end,
514
33.5k
                    const char **nextTokPtr) {
515
33.5k
  if (HAS_CHAR(enc, ptr, end)) {
516
33.5k
    if (CHAR_MATCHES(enc, ptr, ASCII_x))
517
24.7k
      return PREFIX(scanHexCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
518
8.80k
    switch (BYTE_TYPE(enc, ptr)) {
519
8.78k
    case BT_DIGIT:
520
8.78k
      break;
521
13
    default:
522
13
      *nextTokPtr = ptr;
523
13
      return XML_TOK_INVALID;
524
8.80k
    }
525
30.8k
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
526
30.8k
      switch (BYTE_TYPE(enc, ptr)) {
527
22.0k
      case BT_DIGIT:
528
22.0k
        break;
529
8.76k
      case BT_SEMI:
530
8.76k
        *nextTokPtr = ptr + MINBPC(enc);
531
8.76k
        return XML_TOK_CHAR_REF;
532
2
      default:
533
2
        *nextTokPtr = ptr;
534
2
        return XML_TOK_INVALID;
535
30.8k
      }
536
30.8k
    }
537
8.78k
  }
538
20
  return XML_TOK_PARTIAL;
539
33.5k
}
xmltok.c:normal_scanCharRef
Line
Count
Source
514
33.5k
                    const char **nextTokPtr) {
515
33.5k
  if (HAS_CHAR(enc, ptr, end)) {
516
33.5k
    if (CHAR_MATCHES(enc, ptr, ASCII_x))
517
24.7k
      return PREFIX(scanHexCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
518
8.80k
    switch (BYTE_TYPE(enc, ptr)) {
519
8.78k
    case BT_DIGIT:
520
8.78k
      break;
521
13
    default:
522
13
      *nextTokPtr = ptr;
523
13
      return XML_TOK_INVALID;
524
8.80k
    }
525
30.8k
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
526
30.8k
      switch (BYTE_TYPE(enc, ptr)) {
527
22.0k
      case BT_DIGIT:
528
22.0k
        break;
529
8.76k
      case BT_SEMI:
530
8.76k
        *nextTokPtr = ptr + MINBPC(enc);
531
8.76k
        return XML_TOK_CHAR_REF;
532
2
      default:
533
2
        *nextTokPtr = ptr;
534
2
        return XML_TOK_INVALID;
535
30.8k
      }
536
30.8k
    }
537
8.78k
  }
538
20
  return XML_TOK_PARTIAL;
539
33.5k
}
Unexecuted instantiation: xmltok.c:little2_scanCharRef
Unexecuted instantiation: xmltok.c:big2_scanCharRef
540
541
/* ptr points to character following "&" */
542
543
static int
544
PREFIX(scanRef)(const ENCODING *enc, const char *ptr, const char *end,
545
86.0k
                const char **nextTokPtr) {
546
86.0k
  REQUIRE_CHAR(enc, ptr, end);
547
85.9k
  switch (BYTE_TYPE(enc, ptr)) {
548
63.8k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
549
33.5k
  case BT_NUM:
550
33.5k
    return PREFIX(scanCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
551
9
  default:
552
9
    *nextTokPtr = ptr;
553
9
    return XML_TOK_INVALID;
554
85.9k
  }
555
2.23M
  while (HAS_CHAR(enc, ptr, end)) {
556
2.23M
    switch (BYTE_TYPE(enc, ptr)) {
557
7.44M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
558
52.1k
    case BT_SEMI:
559
52.1k
      *nextTokPtr = ptr + MINBPC(enc);
560
52.1k
      return XML_TOK_ENTITY_REF;
561
14
    default:
562
14
      *nextTokPtr = ptr;
563
14
      return XML_TOK_INVALID;
564
2.23M
    }
565
2.23M
  }
566
102
  return XML_TOK_PARTIAL;
567
52.3k
}
xmltok.c:normal_scanRef
Line
Count
Source
545
86.0k
                const char **nextTokPtr) {
546
86.0k
  REQUIRE_CHAR(enc, ptr, end);
547
85.9k
  switch (BYTE_TYPE(enc, ptr)) {
548
63.8k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
549
33.5k
  case BT_NUM:
550
33.5k
    return PREFIX(scanCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
551
9
  default:
552
9
    *nextTokPtr = ptr;
553
9
    return XML_TOK_INVALID;
554
85.9k
  }
555
2.23M
  while (HAS_CHAR(enc, ptr, end)) {
556
2.23M
    switch (BYTE_TYPE(enc, ptr)) {
557
7.44M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
558
52.1k
    case BT_SEMI:
559
52.1k
      *nextTokPtr = ptr + MINBPC(enc);
560
52.1k
      return XML_TOK_ENTITY_REF;
561
14
    default:
562
14
      *nextTokPtr = ptr;
563
14
      return XML_TOK_INVALID;
564
2.23M
    }
565
2.23M
  }
566
102
  return XML_TOK_PARTIAL;
567
52.3k
}
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
572
PREFIX(scanAtts)(const ENCODING *enc, const char *ptr, const char *end,
573
113k
                 const char **nextTokPtr) {
574
#  ifdef XML_NS
575
  int hadColon = 0;
576
#  endif
577
4.89M
  while (HAS_CHAR(enc, ptr, end)) {
578
4.89M
    switch (BYTE_TYPE(enc, ptr)) {
579
3.89M
      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.25k
    case BT_S:
598
10.5k
    case BT_CR:
599
14.0k
    case BT_LF:
600
28.0k
      for (;;) {
601
28.0k
        int t;
602
603
28.0k
        ptr += MINBPC(enc);
604
28.0k
        REQUIRE_CHAR(enc, ptr, end);
605
27.9k
        t = BYTE_TYPE(enc, ptr);
606
27.9k
        if (t == BT_EQUALS)
607
13.9k
          break;
608
13.9k
        switch (t) {
609
2.61k
        case BT_S:
610
5.39k
        case BT_LF:
611
13.9k
        case BT_CR:
612
13.9k
          break;
613
13
        default:
614
13
          *nextTokPtr = ptr;
615
13
          return XML_TOK_INVALID;
616
13.9k
        }
617
13.9k
      }
618
13.9k
      EXPAT_FALLTHROUGH;
619
3.67M
    case BT_EQUALS: {
620
3.67M
      int open;
621
#  ifdef XML_NS
622
      hadColon = 0;
623
#  endif
624
3.70M
      for (;;) {
625
3.70M
        ptr += MINBPC(enc);
626
3.70M
        REQUIRE_CHAR(enc, ptr, end);
627
3.70M
        open = BYTE_TYPE(enc, ptr);
628
3.70M
        if (open == BT_QUOT || open == BT_APOS)
629
3.67M
          break;
630
32.9k
        switch (open) {
631
4.97k
        case BT_S:
632
13.4k
        case BT_LF:
633
32.9k
        case BT_CR:
634
32.9k
          break;
635
12
        default:
636
12
          *nextTokPtr = ptr;
637
12
          return XML_TOK_INVALID;
638
32.9k
        }
639
32.9k
      }
640
3.67M
      ptr += MINBPC(enc);
641
      /* in attribute value */
642
25.4M
      for (;;) {
643
25.4M
        int t;
644
25.4M
        REQUIRE_CHAR(enc, ptr, end);
645
25.4M
        t = BYTE_TYPE(enc, ptr);
646
25.4M
        if (t == open)
647
3.67M
          break;
648
21.7M
        switch (t) {
649
390k
          INVALID_CASES(ptr, nextTokPtr)
650
32.5k
        case BT_AMP: {
651
32.5k
          int tok = PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, &ptr);
652
32.5k
          if (tok <= 0) {
653
62
            if (tok == XML_TOK_INVALID)
654
24
              *nextTokPtr = ptr;
655
62
            return tok;
656
62
          }
657
32.5k
          break;
658
32.5k
        }
659
32.5k
        case BT_LT:
660
4
          *nextTokPtr = ptr;
661
4
          return XML_TOK_INVALID;
662
21.5M
        default:
663
21.5M
          ptr += MINBPC(enc);
664
21.5M
          break;
665
21.7M
        }
666
21.7M
      }
667
3.67M
      ptr += MINBPC(enc);
668
3.67M
      REQUIRE_CHAR(enc, ptr, end);
669
3.67M
      switch (BYTE_TYPE(enc, ptr)) {
670
1.88M
      case BT_S:
671
3.58M
      case BT_CR:
672
3.63M
      case BT_LF:
673
3.63M
        break;
674
19.1k
      case BT_SOL:
675
19.1k
        goto sol;
676
11.6k
      case BT_GT:
677
11.6k
        goto gt;
678
9
      default:
679
9
        *nextTokPtr = ptr;
680
9
        return XML_TOK_INVALID;
681
3.67M
      }
682
      /* ptr points to closing quote */
683
4.04M
      for (;;) {
684
4.04M
        ptr += MINBPC(enc);
685
4.04M
        REQUIRE_CHAR(enc, ptr, end);
686
4.04M
        switch (BYTE_TYPE(enc, ptr)) {
687
3.56M
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
688
304k
        case BT_S:
689
374k
        case BT_CR:
690
405k
        case BT_LF:
691
405k
          continue;
692
528
        case BT_GT:
693
12.1k
        gt:
694
12.1k
          *nextTokPtr = ptr + MINBPC(enc);
695
12.1k
          return XML_TOK_START_TAG_WITH_ATTS;
696
81.8k
        case BT_SOL:
697
100k
        sol:
698
100k
          ptr += MINBPC(enc);
699
100k
          REQUIRE_CHAR(enc, ptr, end);
700
100k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
701
14
            *nextTokPtr = ptr;
702
14
            return XML_TOK_INVALID;
703
14
          }
704
100k
          *nextTokPtr = ptr + MINBPC(enc);
705
100k
          return XML_TOK_EMPTY_ELEMENT_WITH_ATTS;
706
12
        default:
707
12
          *nextTokPtr = ptr;
708
12
          return XML_TOK_INVALID;
709
4.04M
        }
710
3.55M
        break;
711
4.04M
      }
712
3.55M
      break;
713
3.63M
    }
714
3.55M
    default:
715
28
      *nextTokPtr = ptr;
716
28
      return XML_TOK_INVALID;
717
4.89M
    }
718
4.89M
  }
719
162
  return XML_TOK_PARTIAL;
720
113k
}
xmltok.c:normal_scanAtts
Line
Count
Source
573
113k
                 const char **nextTokPtr) {
574
#  ifdef XML_NS
575
  int hadColon = 0;
576
#  endif
577
4.89M
  while (HAS_CHAR(enc, ptr, end)) {
578
4.89M
    switch (BYTE_TYPE(enc, ptr)) {
579
3.89M
      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.25k
    case BT_S:
598
10.5k
    case BT_CR:
599
14.0k
    case BT_LF:
600
28.0k
      for (;;) {
601
28.0k
        int t;
602
603
28.0k
        ptr += MINBPC(enc);
604
28.0k
        REQUIRE_CHAR(enc, ptr, end);
605
27.9k
        t = BYTE_TYPE(enc, ptr);
606
27.9k
        if (t == BT_EQUALS)
607
13.9k
          break;
608
13.9k
        switch (t) {
609
2.61k
        case BT_S:
610
5.39k
        case BT_LF:
611
13.9k
        case BT_CR:
612
13.9k
          break;
613
13
        default:
614
13
          *nextTokPtr = ptr;
615
13
          return XML_TOK_INVALID;
616
13.9k
        }
617
13.9k
      }
618
13.9k
      EXPAT_FALLTHROUGH;
619
3.67M
    case BT_EQUALS: {
620
3.67M
      int open;
621
#  ifdef XML_NS
622
      hadColon = 0;
623
#  endif
624
3.70M
      for (;;) {
625
3.70M
        ptr += MINBPC(enc);
626
3.70M
        REQUIRE_CHAR(enc, ptr, end);
627
3.70M
        open = BYTE_TYPE(enc, ptr);
628
3.70M
        if (open == BT_QUOT || open == BT_APOS)
629
3.67M
          break;
630
32.9k
        switch (open) {
631
4.97k
        case BT_S:
632
13.4k
        case BT_LF:
633
32.9k
        case BT_CR:
634
32.9k
          break;
635
12
        default:
636
12
          *nextTokPtr = ptr;
637
12
          return XML_TOK_INVALID;
638
32.9k
        }
639
32.9k
      }
640
3.67M
      ptr += MINBPC(enc);
641
      /* in attribute value */
642
25.4M
      for (;;) {
643
25.4M
        int t;
644
25.4M
        REQUIRE_CHAR(enc, ptr, end);
645
25.4M
        t = BYTE_TYPE(enc, ptr);
646
25.4M
        if (t == open)
647
3.67M
          break;
648
21.7M
        switch (t) {
649
390k
          INVALID_CASES(ptr, nextTokPtr)
650
32.5k
        case BT_AMP: {
651
32.5k
          int tok = PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, &ptr);
652
32.5k
          if (tok <= 0) {
653
62
            if (tok == XML_TOK_INVALID)
654
24
              *nextTokPtr = ptr;
655
62
            return tok;
656
62
          }
657
32.5k
          break;
658
32.5k
        }
659
32.5k
        case BT_LT:
660
4
          *nextTokPtr = ptr;
661
4
          return XML_TOK_INVALID;
662
21.5M
        default:
663
21.5M
          ptr += MINBPC(enc);
664
21.5M
          break;
665
21.7M
        }
666
21.7M
      }
667
3.67M
      ptr += MINBPC(enc);
668
3.67M
      REQUIRE_CHAR(enc, ptr, end);
669
3.67M
      switch (BYTE_TYPE(enc, ptr)) {
670
1.88M
      case BT_S:
671
3.58M
      case BT_CR:
672
3.63M
      case BT_LF:
673
3.63M
        break;
674
19.1k
      case BT_SOL:
675
19.1k
        goto sol;
676
11.6k
      case BT_GT:
677
11.6k
        goto gt;
678
9
      default:
679
9
        *nextTokPtr = ptr;
680
9
        return XML_TOK_INVALID;
681
3.67M
      }
682
      /* ptr points to closing quote */
683
4.04M
      for (;;) {
684
4.04M
        ptr += MINBPC(enc);
685
4.04M
        REQUIRE_CHAR(enc, ptr, end);
686
4.04M
        switch (BYTE_TYPE(enc, ptr)) {
687
3.56M
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
688
304k
        case BT_S:
689
374k
        case BT_CR:
690
405k
        case BT_LF:
691
405k
          continue;
692
528
        case BT_GT:
693
12.1k
        gt:
694
12.1k
          *nextTokPtr = ptr + MINBPC(enc);
695
12.1k
          return XML_TOK_START_TAG_WITH_ATTS;
696
81.8k
        case BT_SOL:
697
100k
        sol:
698
100k
          ptr += MINBPC(enc);
699
100k
          REQUIRE_CHAR(enc, ptr, end);
700
100k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
701
14
            *nextTokPtr = ptr;
702
14
            return XML_TOK_INVALID;
703
14
          }
704
100k
          *nextTokPtr = ptr + MINBPC(enc);
705
100k
          return XML_TOK_EMPTY_ELEMENT_WITH_ATTS;
706
12
        default:
707
12
          *nextTokPtr = ptr;
708
12
          return XML_TOK_INVALID;
709
4.04M
        }
710
3.55M
        break;
711
4.04M
      }
712
3.55M
      break;
713
3.63M
    }
714
3.55M
    default:
715
28
      *nextTokPtr = ptr;
716
28
      return XML_TOK_INVALID;
717
4.89M
    }
718
4.89M
  }
719
162
  return XML_TOK_PARTIAL;
720
113k
}
Unexecuted instantiation: xmltok.c:little2_scanAtts
Unexecuted instantiation: xmltok.c:big2_scanAtts
721
722
/* ptr points to character following "<" */
723
724
static int
725
PREFIX(scanLt)(const ENCODING *enc, const char *ptr, const char *end,
726
1.20M
               const char **nextTokPtr) {
727
#  ifdef XML_NS
728
  int hadColon;
729
#  endif
730
1.20M
  REQUIRE_CHAR(enc, ptr, end);
731
1.20M
  switch (BYTE_TYPE(enc, ptr)) {
732
968k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
733
13.1k
  case BT_EXCL:
734
13.1k
    ptr += MINBPC(enc);
735
13.1k
    REQUIRE_CHAR(enc, ptr, end);
736
13.1k
    switch (BYTE_TYPE(enc, ptr)) {
737
10.7k
    case BT_MINUS:
738
10.7k
      return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
739
2.35k
    case BT_LSQB:
740
2.35k
      return PREFIX(scanCdataSection)(enc, ptr + MINBPC(enc), end, nextTokPtr);
741
13.1k
    }
742
4
    *nextTokPtr = ptr;
743
4
    return XML_TOK_INVALID;
744
27.2k
  case BT_QUEST:
745
27.2k
    return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
746
143k
  case BT_SOL:
747
143k
    return PREFIX(scanEndTag)(enc, ptr + MINBPC(enc), end, nextTokPtr);
748
15
  default:
749
15
    *nextTokPtr = ptr;
750
15
    return XML_TOK_INVALID;
751
1.20M
  }
752
#  ifdef XML_NS
753
  hadColon = 0;
754
#  endif
755
  /* we have a start-tag */
756
17.5M
  while (HAS_CHAR(enc, ptr, end)) {
757
17.5M
    switch (BYTE_TYPE(enc, ptr)) {
758
41.1M
      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
110k
    case BT_S:
777
119k
    case BT_CR:
778
123k
    case BT_LF: {
779
123k
      ptr += MINBPC(enc);
780
141k
      while (HAS_CHAR(enc, ptr, end)) {
781
141k
        switch (BYTE_TYPE(enc, ptr)) {
782
107k
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
783
2.66k
        case BT_GT:
784
2.66k
          goto gt;
785
6.57k
        case BT_SOL:
786
6.57k
          goto sol;
787
1.87k
        case BT_S:
788
15.3k
        case BT_CR:
789
17.8k
        case BT_LF:
790
17.8k
          ptr += MINBPC(enc);
791
17.8k
          continue;
792
3
        default:
793
3
          *nextTokPtr = ptr;
794
3
          return XML_TOK_INVALID;
795
141k
        }
796
113k
        return PREFIX(scanAtts)(enc, ptr, end, nextTokPtr);
797
141k
      }
798
68
      return XML_TOK_PARTIAL;
799
123k
    }
800
886k
    case BT_GT:
801
889k
    gt:
802
889k
      *nextTokPtr = ptr + MINBPC(enc);
803
889k
      return XML_TOK_START_TAG_NO_ATTS;
804
14.8k
    case BT_SOL:
805
21.4k
    sol:
806
21.4k
      ptr += MINBPC(enc);
807
21.4k
      REQUIRE_CHAR(enc, ptr, end);
808
21.4k
      if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
809
11
        *nextTokPtr = ptr;
810
11
        return XML_TOK_INVALID;
811
11
      }
812
21.3k
      *nextTokPtr = ptr + MINBPC(enc);
813
21.3k
      return XML_TOK_EMPTY_ELEMENT_NO_ATTS;
814
12
    default:
815
12
      *nextTokPtr = ptr;
816
12
      return XML_TOK_INVALID;
817
17.5M
    }
818
17.5M
  }
819
166
  return XML_TOK_PARTIAL;
820
1.02M
}
xmltok.c:normal_scanLt
Line
Count
Source
726
1.20M
               const char **nextTokPtr) {
727
#  ifdef XML_NS
728
  int hadColon;
729
#  endif
730
1.20M
  REQUIRE_CHAR(enc, ptr, end);
731
1.20M
  switch (BYTE_TYPE(enc, ptr)) {
732
968k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
733
13.1k
  case BT_EXCL:
734
13.1k
    ptr += MINBPC(enc);
735
13.1k
    REQUIRE_CHAR(enc, ptr, end);
736
13.1k
    switch (BYTE_TYPE(enc, ptr)) {
737
10.7k
    case BT_MINUS:
738
10.7k
      return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
739
2.35k
    case BT_LSQB:
740
2.35k
      return PREFIX(scanCdataSection)(enc, ptr + MINBPC(enc), end, nextTokPtr);
741
13.1k
    }
742
4
    *nextTokPtr = ptr;
743
4
    return XML_TOK_INVALID;
744
27.2k
  case BT_QUEST:
745
27.2k
    return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
746
143k
  case BT_SOL:
747
143k
    return PREFIX(scanEndTag)(enc, ptr + MINBPC(enc), end, nextTokPtr);
748
15
  default:
749
15
    *nextTokPtr = ptr;
750
15
    return XML_TOK_INVALID;
751
1.20M
  }
752
#  ifdef XML_NS
753
  hadColon = 0;
754
#  endif
755
  /* we have a start-tag */
756
17.5M
  while (HAS_CHAR(enc, ptr, end)) {
757
17.5M
    switch (BYTE_TYPE(enc, ptr)) {
758
41.1M
      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
110k
    case BT_S:
777
119k
    case BT_CR:
778
123k
    case BT_LF: {
779
123k
      ptr += MINBPC(enc);
780
141k
      while (HAS_CHAR(enc, ptr, end)) {
781
141k
        switch (BYTE_TYPE(enc, ptr)) {
782
107k
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
783
2.66k
        case BT_GT:
784
2.66k
          goto gt;
785
6.57k
        case BT_SOL:
786
6.57k
          goto sol;
787
1.87k
        case BT_S:
788
15.3k
        case BT_CR:
789
17.8k
        case BT_LF:
790
17.8k
          ptr += MINBPC(enc);
791
17.8k
          continue;
792
3
        default:
793
3
          *nextTokPtr = ptr;
794
3
          return XML_TOK_INVALID;
795
141k
        }
796
113k
        return PREFIX(scanAtts)(enc, ptr, end, nextTokPtr);
797
141k
      }
798
68
      return XML_TOK_PARTIAL;
799
123k
    }
800
886k
    case BT_GT:
801
889k
    gt:
802
889k
      *nextTokPtr = ptr + MINBPC(enc);
803
889k
      return XML_TOK_START_TAG_NO_ATTS;
804
14.8k
    case BT_SOL:
805
21.4k
    sol:
806
21.4k
      ptr += MINBPC(enc);
807
21.4k
      REQUIRE_CHAR(enc, ptr, end);
808
21.4k
      if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
809
11
        *nextTokPtr = ptr;
810
11
        return XML_TOK_INVALID;
811
11
      }
812
21.3k
      *nextTokPtr = ptr + MINBPC(enc);
813
21.3k
      return XML_TOK_EMPTY_ELEMENT_NO_ATTS;
814
12
    default:
815
12
      *nextTokPtr = ptr;
816
12
      return XML_TOK_INVALID;
817
17.5M
    }
818
17.5M
  }
819
166
  return XML_TOK_PARTIAL;
820
1.02M
}
Unexecuted instantiation: xmltok.c:little2_scanLt
Unexecuted instantiation: xmltok.c:big2_scanLt
821
822
static int
823
PREFIX(contentTok)(const ENCODING *enc, const char *ptr, const char *end,
824
3.01M
                   const char **nextTokPtr) {
825
3.01M
  if (ptr >= end)
826
3.52k
    return XML_TOK_NONE;
827
3.01M
  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
3.01M
  switch (BYTE_TYPE(enc, ptr)) {
837
1.20M
  case BT_LT:
838
1.20M
    return PREFIX(scanLt)(enc, ptr + MINBPC(enc), end, nextTokPtr);
839
19.6k
  case BT_AMP:
840
19.6k
    return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
841
704k
  case BT_CR:
842
704k
    ptr += MINBPC(enc);
843
704k
    if (! HAS_CHAR(enc, ptr, end))
844
24
      return XML_TOK_TRAILING_CR;
845
704k
    if (BYTE_TYPE(enc, ptr) == BT_LF)
846
122k
      ptr += MINBPC(enc);
847
704k
    *nextTokPtr = ptr;
848
704k
    return XML_TOK_DATA_NEWLINE;
849
542k
  case BT_LF:
850
542k
    *nextTokPtr = ptr + MINBPC(enc);
851
542k
    return XML_TOK_DATA_NEWLINE;
852
39.3k
  case BT_RSQB:
853
39.3k
    ptr += MINBPC(enc);
854
39.3k
    if (! HAS_CHAR(enc, ptr, end))
855
20
      return XML_TOK_TRAILING_RSQB;
856
39.3k
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
857
15.0k
      break;
858
24.2k
    ptr += MINBPC(enc);
859
24.2k
    if (! HAS_CHAR(enc, ptr, end))
860
12
      return XML_TOK_TRAILING_RSQB;
861
24.2k
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
862
24.2k
      ptr -= MINBPC(enc);
863
24.2k
      break;
864
24.2k
    }
865
2
    *nextTokPtr = ptr;
866
2
    return XML_TOK_INVALID;
867
50.5k
    INVALID_CASES(ptr, nextTokPtr)
868
475k
  default:
869
475k
    ptr += MINBPC(enc);
870
475k
    break;
871
3.01M
  }
872
11.4M
  while (HAS_CHAR(enc, ptr, end)) {
873
11.4M
    switch (BYTE_TYPE(enc, ptr)) {
874
0
#  define LEAD_CASE(n)                                                         \
875
111k
  case BT_LEAD##n:                                                             \
876
111k
    if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) {                       \
877
39
      *nextTokPtr = ptr;                                                       \
878
39
      return XML_TOK_DATA_CHARS;                                               \
879
39
    }                                                                          \
880
111k
    ptr += n;                                                                  \
881
111k
    break;
882
61.1k
      LEAD_CASE(2)
883
31.2k
      LEAD_CASE(3)
884
19.2k
      LEAD_CASE(4)
885
0
#  undef LEAD_CASE
886
247k
    case BT_RSQB:
887
247k
      if (HAS_CHARS(enc, ptr, end, 2)) {
888
247k
        if (! CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_RSQB)) {
889
85.9k
          ptr += MINBPC(enc);
890
85.9k
          break;
891
85.9k
        }
892
161k
        if (HAS_CHARS(enc, ptr, end, 3)) {
893
161k
          if (! CHAR_MATCHES(enc, ptr + 2 * MINBPC(enc), ASCII_GT)) {
894
161k
            ptr += MINBPC(enc);
895
161k
            break;
896
161k
          }
897
3
          *nextTokPtr = ptr + 2 * MINBPC(enc);
898
3
          return XML_TOK_INVALID;
899
161k
        }
900
161k
      }
901
10
      EXPAT_FALLTHROUGH;
902
10.0k
    case BT_AMP:
903
173k
    case BT_LT:
904
173k
    case BT_NONXML:
905
173k
    case BT_MALFORM:
906
173k
    case BT_TRAIL:
907
400k
    case BT_CR:
908
538k
    case BT_LF:
909
538k
      *nextTokPtr = ptr;
910
538k
      return XML_TOK_DATA_CHARS;
911
10.5M
    default:
912
10.5M
      ptr += MINBPC(enc);
913
10.5M
      break;
914
11.4M
    }
915
11.4M
  }
916
1.52k
  *nextTokPtr = ptr;
917
1.52k
  return XML_TOK_DATA_CHARS;
918
540k
}
xmltok.c:normal_contentTok
Line
Count
Source
824
3.01M
                   const char **nextTokPtr) {
825
3.01M
  if (ptr >= end)
826
3.52k
    return XML_TOK_NONE;
827
3.01M
  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
3.01M
  switch (BYTE_TYPE(enc, ptr)) {
837
1.20M
  case BT_LT:
838
1.20M
    return PREFIX(scanLt)(enc, ptr + MINBPC(enc), end, nextTokPtr);
839
19.6k
  case BT_AMP:
840
19.6k
    return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
841
704k
  case BT_CR:
842
704k
    ptr += MINBPC(enc);
843
704k
    if (! HAS_CHAR(enc, ptr, end))
844
24
      return XML_TOK_TRAILING_CR;
845
704k
    if (BYTE_TYPE(enc, ptr) == BT_LF)
846
122k
      ptr += MINBPC(enc);
847
704k
    *nextTokPtr = ptr;
848
704k
    return XML_TOK_DATA_NEWLINE;
849
542k
  case BT_LF:
850
542k
    *nextTokPtr = ptr + MINBPC(enc);
851
542k
    return XML_TOK_DATA_NEWLINE;
852
39.3k
  case BT_RSQB:
853
39.3k
    ptr += MINBPC(enc);
854
39.3k
    if (! HAS_CHAR(enc, ptr, end))
855
20
      return XML_TOK_TRAILING_RSQB;
856
39.3k
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
857
15.0k
      break;
858
24.2k
    ptr += MINBPC(enc);
859
24.2k
    if (! HAS_CHAR(enc, ptr, end))
860
12
      return XML_TOK_TRAILING_RSQB;
861
24.2k
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
862
24.2k
      ptr -= MINBPC(enc);
863
24.2k
      break;
864
24.2k
    }
865
2
    *nextTokPtr = ptr;
866
2
    return XML_TOK_INVALID;
867
50.5k
    INVALID_CASES(ptr, nextTokPtr)
868
475k
  default:
869
475k
    ptr += MINBPC(enc);
870
475k
    break;
871
3.01M
  }
872
11.4M
  while (HAS_CHAR(enc, ptr, end)) {
873
11.4M
    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
61.1k
      LEAD_CASE(2)
883
31.2k
      LEAD_CASE(3)
884
19.2k
      LEAD_CASE(4)
885
0
#  undef LEAD_CASE
886
247k
    case BT_RSQB:
887
247k
      if (HAS_CHARS(enc, ptr, end, 2)) {
888
247k
        if (! CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_RSQB)) {
889
85.9k
          ptr += MINBPC(enc);
890
85.9k
          break;
891
85.9k
        }
892
161k
        if (HAS_CHARS(enc, ptr, end, 3)) {
893
161k
          if (! CHAR_MATCHES(enc, ptr + 2 * MINBPC(enc), ASCII_GT)) {
894
161k
            ptr += MINBPC(enc);
895
161k
            break;
896
161k
          }
897
3
          *nextTokPtr = ptr + 2 * MINBPC(enc);
898
3
          return XML_TOK_INVALID;
899
161k
        }
900
161k
      }
901
10
      EXPAT_FALLTHROUGH;
902
10.0k
    case BT_AMP:
903
173k
    case BT_LT:
904
173k
    case BT_NONXML:
905
173k
    case BT_MALFORM:
906
173k
    case BT_TRAIL:
907
400k
    case BT_CR:
908
538k
    case BT_LF:
909
538k
      *nextTokPtr = ptr;
910
538k
      return XML_TOK_DATA_CHARS;
911
10.5M
    default:
912
10.5M
      ptr += MINBPC(enc);
913
10.5M
      break;
914
11.4M
    }
915
11.4M
  }
916
1.52k
  *nextTokPtr = ptr;
917
1.52k
  return XML_TOK_DATA_CHARS;
918
540k
}
Unexecuted instantiation: xmltok.c:little2_contentTok
Unexecuted instantiation: xmltok.c:big2_contentTok
919
920
/* ptr points to character following "%" */
921
922
static int
923
PREFIX(scanPercent)(const ENCODING *enc, const char *ptr, const char *end,
924
6.23k
                    const char **nextTokPtr) {
925
6.23k
  REQUIRE_CHAR(enc, ptr, end);
926
6.21k
  switch (BYTE_TYPE(enc, ptr)) {
927
3.76k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
928
1.01k
  case BT_S:
929
2.70k
  case BT_LF:
930
3.35k
  case BT_CR:
931
3.36k
  case BT_PERCNT:
932
3.36k
    *nextTokPtr = ptr;
933
3.36k
    return XML_TOK_PERCENT;
934
4
  default:
935
4
    *nextTokPtr = ptr;
936
4
    return XML_TOK_INVALID;
937
6.21k
  }
938
25.9k
  while (HAS_CHAR(enc, ptr, end)) {
939
25.9k
    switch (BYTE_TYPE(enc, ptr)) {
940
79.3k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
941
2.63k
    case BT_SEMI:
942
2.63k
      *nextTokPtr = ptr + MINBPC(enc);
943
2.63k
      return XML_TOK_PARAM_ENTITY_REF;
944
28
    default:
945
28
      *nextTokPtr = ptr;
946
28
      return XML_TOK_INVALID;
947
25.9k
    }
948
25.9k
  }
949
130
  return XML_TOK_PARTIAL;
950
2.81k
}
xmltok.c:normal_scanPercent
Line
Count
Source
924
6.23k
                    const char **nextTokPtr) {
925
6.23k
  REQUIRE_CHAR(enc, ptr, end);
926
6.21k
  switch (BYTE_TYPE(enc, ptr)) {
927
3.76k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
928
1.01k
  case BT_S:
929
2.70k
  case BT_LF:
930
3.35k
  case BT_CR:
931
3.36k
  case BT_PERCNT:
932
3.36k
    *nextTokPtr = ptr;
933
3.36k
    return XML_TOK_PERCENT;
934
4
  default:
935
4
    *nextTokPtr = ptr;
936
4
    return XML_TOK_INVALID;
937
6.21k
  }
938
25.9k
  while (HAS_CHAR(enc, ptr, end)) {
939
25.9k
    switch (BYTE_TYPE(enc, ptr)) {
940
79.3k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
941
2.63k
    case BT_SEMI:
942
2.63k
      *nextTokPtr = ptr + MINBPC(enc);
943
2.63k
      return XML_TOK_PARAM_ENTITY_REF;
944
28
    default:
945
28
      *nextTokPtr = ptr;
946
28
      return XML_TOK_INVALID;
947
25.9k
    }
948
25.9k
  }
949
130
  return XML_TOK_PARTIAL;
950
2.81k
}
Unexecuted instantiation: xmltok.c:little2_scanPercent
Unexecuted instantiation: xmltok.c:big2_scanPercent
951
952
static int
953
PREFIX(scanPoundName)(const ENCODING *enc, const char *ptr, const char *end,
954
117k
                      const char **nextTokPtr) {
955
117k
  REQUIRE_CHAR(enc, ptr, end);
956
117k
  switch (BYTE_TYPE(enc, ptr)) {
957
116k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
958
5
  default:
959
5
    *nextTokPtr = ptr;
960
5
    return XML_TOK_INVALID;
961
117k
  }
962
945k
  while (HAS_CHAR(enc, ptr, end)) {
963
945k
    switch (BYTE_TYPE(enc, ptr)) {
964
2.96M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
965
923
    case BT_CR:
966
4.25k
    case BT_LF:
967
114k
    case BT_S:
968
114k
    case BT_RPAR:
969
116k
    case BT_GT:
970
116k
    case BT_PERCNT:
971
117k
    case BT_VERBAR:
972
117k
      *nextTokPtr = ptr;
973
117k
      return XML_TOK_POUND_NAME;
974
21
    default:
975
21
      *nextTokPtr = ptr;
976
21
      return XML_TOK_INVALID;
977
945k
    }
978
945k
  }
979
226
  return -XML_TOK_POUND_NAME;
980
117k
}
xmltok.c:normal_scanPoundName
Line
Count
Source
954
117k
                      const char **nextTokPtr) {
955
117k
  REQUIRE_CHAR(enc, ptr, end);
956
117k
  switch (BYTE_TYPE(enc, ptr)) {
957
116k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
958
5
  default:
959
5
    *nextTokPtr = ptr;
960
5
    return XML_TOK_INVALID;
961
117k
  }
962
945k
  while (HAS_CHAR(enc, ptr, end)) {
963
945k
    switch (BYTE_TYPE(enc, ptr)) {
964
2.96M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
965
923
    case BT_CR:
966
4.25k
    case BT_LF:
967
114k
    case BT_S:
968
114k
    case BT_RPAR:
969
116k
    case BT_GT:
970
116k
    case BT_PERCNT:
971
117k
    case BT_VERBAR:
972
117k
      *nextTokPtr = ptr;
973
117k
      return XML_TOK_POUND_NAME;
974
21
    default:
975
21
      *nextTokPtr = ptr;
976
21
      return XML_TOK_INVALID;
977
945k
    }
978
945k
  }
979
226
  return -XML_TOK_POUND_NAME;
980
117k
}
Unexecuted instantiation: xmltok.c:little2_scanPoundName
Unexecuted instantiation: xmltok.c:big2_scanPoundName
981
982
static int
983
PREFIX(scanLit)(int open, const ENCODING *enc, const char *ptr, const char *end,
984
37.8k
                const char **nextTokPtr) {
985
6.98M
  while (HAS_CHAR(enc, ptr, end)) {
986
6.98M
    int t = BYTE_TYPE(enc, ptr);
987
6.98M
    switch (t) {
988
197k
      INVALID_CASES(ptr, nextTokPtr)
989
14.2k
    case BT_QUOT:
990
39.7k
    case BT_APOS:
991
39.7k
      ptr += MINBPC(enc);
992
39.7k
      if (t != open)
993
2.12k
        break;
994
37.6k
      if (! HAS_CHAR(enc, ptr, end))
995
675
        return -XML_TOK_LITERAL;
996
36.9k
      *nextTokPtr = ptr;
997
36.9k
      switch (BYTE_TYPE(enc, ptr)) {
998
6.65k
      case BT_S:
999
7.27k
      case BT_CR:
1000
20.6k
      case BT_LF:
1001
36.7k
      case BT_GT:
1002
36.7k
      case BT_PERCNT:
1003
36.9k
      case BT_LSQB:
1004
36.9k
        return XML_TOK_LITERAL;
1005
20
      default:
1006
20
        return XML_TOK_INVALID;
1007
36.9k
      }
1008
6.84M
    default:
1009
6.84M
      ptr += MINBPC(enc);
1010
6.84M
      break;
1011
6.98M
    }
1012
6.98M
  }
1013
128
  return XML_TOK_PARTIAL;
1014
37.8k
}
xmltok.c:normal_scanLit
Line
Count
Source
984
37.8k
                const char **nextTokPtr) {
985
6.98M
  while (HAS_CHAR(enc, ptr, end)) {
986
6.98M
    int t = BYTE_TYPE(enc, ptr);
987
6.98M
    switch (t) {
988
197k
      INVALID_CASES(ptr, nextTokPtr)
989
14.2k
    case BT_QUOT:
990
39.7k
    case BT_APOS:
991
39.7k
      ptr += MINBPC(enc);
992
39.7k
      if (t != open)
993
2.12k
        break;
994
37.6k
      if (! HAS_CHAR(enc, ptr, end))
995
675
        return -XML_TOK_LITERAL;
996
36.9k
      *nextTokPtr = ptr;
997
36.9k
      switch (BYTE_TYPE(enc, ptr)) {
998
6.65k
      case BT_S:
999
7.27k
      case BT_CR:
1000
20.6k
      case BT_LF:
1001
36.7k
      case BT_GT:
1002
36.7k
      case BT_PERCNT:
1003
36.9k
      case BT_LSQB:
1004
36.9k
        return XML_TOK_LITERAL;
1005
20
      default:
1006
20
        return XML_TOK_INVALID;
1007
36.9k
      }
1008
6.84M
    default:
1009
6.84M
      ptr += MINBPC(enc);
1010
6.84M
      break;
1011
6.98M
    }
1012
6.98M
  }
1013
128
  return XML_TOK_PARTIAL;
1014
37.8k
}
Unexecuted instantiation: xmltok.c:little2_scanLit
Unexecuted instantiation: xmltok.c:big2_scanLit
1015
1016
static int
1017
PREFIX(prologTok)(const ENCODING *enc, const char *ptr, const char *end,
1018
6.93M
                  const char **nextTokPtr) {
1019
6.93M
  int tok;
1020
6.93M
  if (ptr >= end)
1021
6.18k
    return XML_TOK_NONE;
1022
6.92M
  if (MINBPC(enc) > 1) {
1023
272
    size_t n = end - ptr;
1024
272
    if (n & (MINBPC(enc) - 1)) {
1025
45
      n &= ~(MINBPC(enc) - 1);
1026
45
      if (n == 0)
1027
4
        return XML_TOK_PARTIAL;
1028
41
      end = ptr + n;
1029
41
    }
1030
272
  }
1031
6.92M
  switch (BYTE_TYPE(enc, ptr)) {
1032
12.9k
  case BT_QUOT:
1033
12.9k
    return PREFIX(scanLit)(BT_QUOT, enc, ptr + MINBPC(enc), end, nextTokPtr);
1034
24.9k
  case BT_APOS:
1035
24.9k
    return PREFIX(scanLit)(BT_APOS, enc, ptr + MINBPC(enc), end, nextTokPtr);
1036
53.2k
  case BT_LT: {
1037
53.2k
    ptr += MINBPC(enc);
1038
53.2k
    REQUIRE_CHAR(enc, ptr, end);
1039
53.2k
    switch (BYTE_TYPE(enc, ptr)) {
1040
38.6k
    case BT_EXCL:
1041
38.6k
      return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1042
9.20k
    case BT_QUEST:
1043
9.20k
      return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1044
3.98k
    case BT_NMSTRT:
1045
5.25k
    case BT_HEX:
1046
5.25k
    case BT_NONASCII:
1047
5.34k
    case BT_LEAD2:
1048
5.37k
    case BT_LEAD3:
1049
5.39k
    case BT_LEAD4:
1050
5.39k
      *nextTokPtr = ptr - MINBPC(enc);
1051
5.39k
      return XML_TOK_INSTANCE_START;
1052
53.2k
    }
1053
15
    *nextTokPtr = ptr;
1054
15
    return XML_TOK_INVALID;
1055
53.2k
  }
1056
206k
  case BT_CR:
1057
206k
    if (ptr + MINBPC(enc) == end) {
1058
544
      *nextTokPtr = end;
1059
      /* indicate that this might be part of a CR/LF pair */
1060
544
      return -XML_TOK_PROLOG_S;
1061
544
    }
1062
205k
    EXPAT_FALLTHROUGH;
1063
531k
  case BT_S:
1064
603k
  case BT_LF:
1065
646k
    for (;;) {
1066
646k
      ptr += MINBPC(enc);
1067
646k
      if (! HAS_CHAR(enc, ptr, end))
1068
292
        break;
1069
646k
      switch (BYTE_TYPE(enc, ptr)) {
1070
11.6k
      case BT_S:
1071
20.6k
      case BT_LF:
1072
20.6k
        break;
1073
23.5k
      case BT_CR:
1074
        /* don't split CR/LF pair */
1075
23.5k
        if (ptr + MINBPC(enc) != end)
1076
23.2k
          break;
1077
256
        EXPAT_FALLTHROUGH;
1078
602k
      default:
1079
602k
        *nextTokPtr = ptr;
1080
602k
        return XML_TOK_PROLOG_S;
1081
646k
      }
1082
646k
    }
1083
292
    *nextTokPtr = ptr;
1084
292
    return XML_TOK_PROLOG_S;
1085
6.23k
  case BT_PERCNT:
1086
6.23k
    return PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1087
108k
  case BT_COMMA:
1088
108k
    *nextTokPtr = ptr + MINBPC(enc);
1089
108k
    return XML_TOK_COMMA;
1090
2.60k
  case BT_LSQB:
1091
2.60k
    *nextTokPtr = ptr + MINBPC(enc);
1092
2.60k
    return XML_TOK_OPEN_BRACKET;
1093
868
  case BT_RSQB:
1094
868
    ptr += MINBPC(enc);
1095
868
    if (! HAS_CHAR(enc, ptr, end))
1096
7
      return -XML_TOK_CLOSE_BRACKET;
1097
861
    if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) {
1098
37
      REQUIRE_CHARS(enc, ptr, end, 2);
1099
35
      if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_GT)) {
1100
12
        *nextTokPtr = ptr + 2 * MINBPC(enc);
1101
12
        return XML_TOK_COND_SECT_CLOSE;
1102
12
      }
1103
35
    }
1104
847
    *nextTokPtr = ptr;
1105
847
    return XML_TOK_CLOSE_BRACKET;
1106
4.97M
  case BT_LPAR:
1107
4.97M
    *nextTokPtr = ptr + MINBPC(enc);
1108
4.97M
    return XML_TOK_OPEN_PAREN;
1109
364k
  case BT_RPAR:
1110
364k
    ptr += MINBPC(enc);
1111
364k
    if (! HAS_CHAR(enc, ptr, end))
1112
115
      return -XML_TOK_CLOSE_PAREN;
1113
363k
    switch (BYTE_TYPE(enc, ptr)) {
1114
18.2k
    case BT_AST:
1115
18.2k
      *nextTokPtr = ptr + MINBPC(enc);
1116
18.2k
      return XML_TOK_CLOSE_PAREN_ASTERISK;
1117
46.6k
    case BT_QUEST:
1118
46.6k
      *nextTokPtr = ptr + MINBPC(enc);
1119
46.6k
      return XML_TOK_CLOSE_PAREN_QUESTION;
1120
71.3k
    case BT_PLUS:
1121
71.3k
      *nextTokPtr = ptr + MINBPC(enc);
1122
71.3k
      return XML_TOK_CLOSE_PAREN_PLUS;
1123
7.88k
    case BT_CR:
1124
8.64k
    case BT_LF:
1125
119k
    case BT_S:
1126
120k
    case BT_GT:
1127
182k
    case BT_COMMA:
1128
195k
    case BT_VERBAR:
1129
227k
    case BT_RPAR:
1130
227k
      *nextTokPtr = ptr;
1131
227k
      return XML_TOK_CLOSE_PAREN;
1132
363k
    }
1133
9
    *nextTokPtr = ptr;
1134
9
    return XML_TOK_INVALID;
1135
95.9k
  case BT_VERBAR:
1136
95.9k
    *nextTokPtr = ptr + MINBPC(enc);
1137
95.9k
    return XML_TOK_OR;
1138
32.8k
  case BT_GT:
1139
32.8k
    *nextTokPtr = ptr + MINBPC(enc);
1140
32.8k
    return XML_TOK_DECL_CLOSE;
1141
117k
  case BT_NUM:
1142
117k
    return PREFIX(scanPoundName)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1143
0
#  define LEAD_CASE(n)                                                         \
1144
3.48k
  case BT_LEAD##n:                                                             \
1145
3.48k
    if (end - ptr < n)                                                         \
1146
88
      return XML_TOK_PARTIAL_CHAR;                                             \
1147
3.40k
    if (IS_INVALID_CHAR(enc, ptr, n)) {                                        \
1148
121
      *nextTokPtr = ptr;                                                       \
1149
121
      return XML_TOK_INVALID;                                                  \
1150
121
    }                                                                          \
1151
3.40k
    if (IS_NMSTRT_CHAR(enc, ptr, n)) {                                         \
1152
2.75k
      ptr += n;                                                                \
1153
2.75k
      tok = XML_TOK_NAME;                                                      \
1154
2.75k
      break;                                                                   \
1155
2.75k
    }                                                                          \
1156
3.27k
    if (IS_NAME_CHAR(enc, ptr, n)) {                                           \
1157
459
      ptr += n;                                                                \
1158
459
      tok = XML_TOK_NMTOKEN;                                                   \
1159
459
      break;                                                                   \
1160
459
    }                                                                          \
1161
521
    *nextTokPtr = ptr;                                                         \
1162
62
    return XML_TOK_INVALID;
1163
3.91k
    LEAD_CASE(2)
1164
6.47k
    LEAD_CASE(3)
1165
304
    LEAD_CASE(4)
1166
0
#  undef LEAD_CASE
1167
367k
  case BT_NMSTRT:
1168
519k
  case BT_HEX:
1169
519k
    tok = XML_TOK_NAME;
1170
519k
    ptr += MINBPC(enc);
1171
519k
    break;
1172
547
  case BT_DIGIT:
1173
1.16k
  case BT_NAME:
1174
1.96k
  case BT_MINUS:
1175
#  ifdef XML_NS
1176
  case BT_COLON:
1177
#  endif
1178
1.96k
    tok = XML_TOK_NMTOKEN;
1179
1.96k
    ptr += MINBPC(enc);
1180
1.96k
    break;
1181
200
  case BT_NONASCII:
1182
200
    if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {
1183
151
      ptr += MINBPC(enc);
1184
151
      tok = XML_TOK_NAME;
1185
151
      break;
1186
151
    }
1187
49
    if (IS_NAME_CHAR_MINBPC(enc, ptr)) {
1188
20
      ptr += MINBPC(enc);
1189
20
      tok = XML_TOK_NMTOKEN;
1190
20
      break;
1191
20
    }
1192
29
    EXPAT_FALLTHROUGH;
1193
86
  default:
1194
86
    *nextTokPtr = ptr;
1195
86
    return XML_TOK_INVALID;
1196
6.92M
  }
1197
16.0M
  while (HAS_CHAR(enc, ptr, end)) {
1198
16.0M
    switch (BYTE_TYPE(enc, ptr)) {
1199
49.0M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1200
9.14k
    case BT_GT:
1201
241k
    case BT_RPAR:
1202
241k
    case BT_COMMA:
1203
263k
    case BT_VERBAR:
1204
265k
    case BT_LSQB:
1205
265k
    case BT_PERCNT:
1206
313k
    case BT_S:
1207
438k
    case BT_CR:
1208
468k
    case BT_LF:
1209
468k
      *nextTokPtr = ptr;
1210
468k
      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
42.9k
    case BT_PLUS:
1232
42.9k
      if (tok == XML_TOK_NMTOKEN) {
1233
5
        *nextTokPtr = ptr;
1234
5
        return XML_TOK_INVALID;
1235
5
      }
1236
42.9k
      *nextTokPtr = ptr + MINBPC(enc);
1237
42.9k
      return XML_TOK_NAME_PLUS;
1238
5.43k
    case BT_AST:
1239
5.43k
      if (tok == XML_TOK_NMTOKEN) {
1240
2
        *nextTokPtr = ptr;
1241
2
        return XML_TOK_INVALID;
1242
2
      }
1243
5.42k
      *nextTokPtr = ptr + MINBPC(enc);
1244
5.42k
      return XML_TOK_NAME_ASTERISK;
1245
6.31k
    case BT_QUEST:
1246
6.31k
      if (tok == XML_TOK_NMTOKEN) {
1247
1
        *nextTokPtr = ptr;
1248
1
        return XML_TOK_INVALID;
1249
1
      }
1250
6.31k
      *nextTokPtr = ptr + MINBPC(enc);
1251
6.31k
      return XML_TOK_NAME_QUESTION;
1252
71
    default:
1253
71
      *nextTokPtr = ptr;
1254
71
      return XML_TOK_INVALID;
1255
16.0M
    }
1256
16.0M
  }
1257
843
  return -tok;
1258
524k
}
xmltok.c:normal_prologTok
Line
Count
Source
1018
6.93M
                  const char **nextTokPtr) {
1019
6.93M
  int tok;
1020
6.93M
  if (ptr >= end)
1021
6.18k
    return XML_TOK_NONE;
1022
6.92M
  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
6.92M
  switch (BYTE_TYPE(enc, ptr)) {
1032
12.9k
  case BT_QUOT:
1033
12.9k
    return PREFIX(scanLit)(BT_QUOT, enc, ptr + MINBPC(enc), end, nextTokPtr);
1034
24.9k
  case BT_APOS:
1035
24.9k
    return PREFIX(scanLit)(BT_APOS, enc, ptr + MINBPC(enc), end, nextTokPtr);
1036
53.2k
  case BT_LT: {
1037
53.2k
    ptr += MINBPC(enc);
1038
53.2k
    REQUIRE_CHAR(enc, ptr, end);
1039
53.2k
    switch (BYTE_TYPE(enc, ptr)) {
1040
38.6k
    case BT_EXCL:
1041
38.6k
      return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1042
9.20k
    case BT_QUEST:
1043
9.20k
      return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1044
3.98k
    case BT_NMSTRT:
1045
5.25k
    case BT_HEX:
1046
5.25k
    case BT_NONASCII:
1047
5.34k
    case BT_LEAD2:
1048
5.37k
    case BT_LEAD3:
1049
5.39k
    case BT_LEAD4:
1050
5.39k
      *nextTokPtr = ptr - MINBPC(enc);
1051
5.39k
      return XML_TOK_INSTANCE_START;
1052
53.2k
    }
1053
15
    *nextTokPtr = ptr;
1054
15
    return XML_TOK_INVALID;
1055
53.2k
  }
1056
206k
  case BT_CR:
1057
206k
    if (ptr + MINBPC(enc) == end) {
1058
544
      *nextTokPtr = end;
1059
      /* indicate that this might be part of a CR/LF pair */
1060
544
      return -XML_TOK_PROLOG_S;
1061
544
    }
1062
205k
    EXPAT_FALLTHROUGH;
1063
531k
  case BT_S:
1064
603k
  case BT_LF:
1065
646k
    for (;;) {
1066
646k
      ptr += MINBPC(enc);
1067
646k
      if (! HAS_CHAR(enc, ptr, end))
1068
292
        break;
1069
646k
      switch (BYTE_TYPE(enc, ptr)) {
1070
11.6k
      case BT_S:
1071
20.6k
      case BT_LF:
1072
20.6k
        break;
1073
23.5k
      case BT_CR:
1074
        /* don't split CR/LF pair */
1075
23.5k
        if (ptr + MINBPC(enc) != end)
1076
23.2k
          break;
1077
256
        EXPAT_FALLTHROUGH;
1078
602k
      default:
1079
602k
        *nextTokPtr = ptr;
1080
602k
        return XML_TOK_PROLOG_S;
1081
646k
      }
1082
646k
    }
1083
292
    *nextTokPtr = ptr;
1084
292
    return XML_TOK_PROLOG_S;
1085
6.23k
  case BT_PERCNT:
1086
6.23k
    return PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1087
108k
  case BT_COMMA:
1088
108k
    *nextTokPtr = ptr + MINBPC(enc);
1089
108k
    return XML_TOK_COMMA;
1090
2.60k
  case BT_LSQB:
1091
2.60k
    *nextTokPtr = ptr + MINBPC(enc);
1092
2.60k
    return XML_TOK_OPEN_BRACKET;
1093
868
  case BT_RSQB:
1094
868
    ptr += MINBPC(enc);
1095
868
    if (! HAS_CHAR(enc, ptr, end))
1096
7
      return -XML_TOK_CLOSE_BRACKET;
1097
861
    if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) {
1098
37
      REQUIRE_CHARS(enc, ptr, end, 2);
1099
35
      if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_GT)) {
1100
12
        *nextTokPtr = ptr + 2 * MINBPC(enc);
1101
12
        return XML_TOK_COND_SECT_CLOSE;
1102
12
      }
1103
35
    }
1104
847
    *nextTokPtr = ptr;
1105
847
    return XML_TOK_CLOSE_BRACKET;
1106
4.97M
  case BT_LPAR:
1107
4.97M
    *nextTokPtr = ptr + MINBPC(enc);
1108
4.97M
    return XML_TOK_OPEN_PAREN;
1109
364k
  case BT_RPAR:
1110
364k
    ptr += MINBPC(enc);
1111
364k
    if (! HAS_CHAR(enc, ptr, end))
1112
115
      return -XML_TOK_CLOSE_PAREN;
1113
363k
    switch (BYTE_TYPE(enc, ptr)) {
1114
18.2k
    case BT_AST:
1115
18.2k
      *nextTokPtr = ptr + MINBPC(enc);
1116
18.2k
      return XML_TOK_CLOSE_PAREN_ASTERISK;
1117
46.6k
    case BT_QUEST:
1118
46.6k
      *nextTokPtr = ptr + MINBPC(enc);
1119
46.6k
      return XML_TOK_CLOSE_PAREN_QUESTION;
1120
71.3k
    case BT_PLUS:
1121
71.3k
      *nextTokPtr = ptr + MINBPC(enc);
1122
71.3k
      return XML_TOK_CLOSE_PAREN_PLUS;
1123
7.88k
    case BT_CR:
1124
8.64k
    case BT_LF:
1125
119k
    case BT_S:
1126
120k
    case BT_GT:
1127
182k
    case BT_COMMA:
1128
195k
    case BT_VERBAR:
1129
227k
    case BT_RPAR:
1130
227k
      *nextTokPtr = ptr;
1131
227k
      return XML_TOK_CLOSE_PAREN;
1132
363k
    }
1133
9
    *nextTokPtr = ptr;
1134
9
    return XML_TOK_INVALID;
1135
95.9k
  case BT_VERBAR:
1136
95.9k
    *nextTokPtr = ptr + MINBPC(enc);
1137
95.9k
    return XML_TOK_OR;
1138
32.8k
  case BT_GT:
1139
32.8k
    *nextTokPtr = ptr + MINBPC(enc);
1140
32.8k
    return XML_TOK_DECL_CLOSE;
1141
117k
  case BT_NUM:
1142
117k
    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
3.91k
    LEAD_CASE(2)
1164
6.47k
    LEAD_CASE(3)
1165
184
    LEAD_CASE(4)
1166
0
#  undef LEAD_CASE
1167
367k
  case BT_NMSTRT:
1168
519k
  case BT_HEX:
1169
519k
    tok = XML_TOK_NAME;
1170
519k
    ptr += MINBPC(enc);
1171
519k
    break;
1172
547
  case BT_DIGIT:
1173
1.16k
  case BT_NAME:
1174
1.96k
  case BT_MINUS:
1175
#  ifdef XML_NS
1176
  case BT_COLON:
1177
#  endif
1178
1.96k
    tok = XML_TOK_NMTOKEN;
1179
1.96k
    ptr += MINBPC(enc);
1180
1.96k
    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
0
    EXPAT_FALLTHROUGH;
1193
45
  default:
1194
45
    *nextTokPtr = ptr;
1195
45
    return XML_TOK_INVALID;
1196
6.92M
  }
1197
16.0M
  while (HAS_CHAR(enc, ptr, end)) {
1198
16.0M
    switch (BYTE_TYPE(enc, ptr)) {
1199
48.9M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1200
9.14k
    case BT_GT:
1201
241k
    case BT_RPAR:
1202
241k
    case BT_COMMA:
1203
263k
    case BT_VERBAR:
1204
265k
    case BT_LSQB:
1205
265k
    case BT_PERCNT:
1206
313k
    case BT_S:
1207
438k
    case BT_CR:
1208
468k
    case BT_LF:
1209
468k
      *nextTokPtr = ptr;
1210
468k
      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
42.9k
    case BT_PLUS:
1232
42.9k
      if (tok == XML_TOK_NMTOKEN) {
1233
5
        *nextTokPtr = ptr;
1234
5
        return XML_TOK_INVALID;
1235
5
      }
1236
42.9k
      *nextTokPtr = ptr + MINBPC(enc);
1237
42.9k
      return XML_TOK_NAME_PLUS;
1238
5.43k
    case BT_AST:
1239
5.43k
      if (tok == XML_TOK_NMTOKEN) {
1240
2
        *nextTokPtr = ptr;
1241
2
        return XML_TOK_INVALID;
1242
2
      }
1243
5.42k
      *nextTokPtr = ptr + MINBPC(enc);
1244
5.42k
      return XML_TOK_NAME_ASTERISK;
1245
6.31k
    case BT_QUEST:
1246
6.31k
      if (tok == XML_TOK_NMTOKEN) {
1247
1
        *nextTokPtr = ptr;
1248
1
        return XML_TOK_INVALID;
1249
1
      }
1250
6.31k
      *nextTokPtr = ptr + MINBPC(enc);
1251
6.31k
      return XML_TOK_NAME_QUESTION;
1252
48
    default:
1253
48
      *nextTokPtr = ptr;
1254
48
      return XML_TOK_INVALID;
1255
16.0M
    }
1256
16.0M
  }
1257
795
  return -tok;
1258
524k
}
xmltok.c:little2_prologTok
Line
Count
Source
1018
134
                  const char **nextTokPtr) {
1019
134
  int tok;
1020
134
  if (ptr >= end)
1021
2
    return XML_TOK_NONE;
1022
132
  if (MINBPC(enc) > 1) {
1023
132
    size_t n = end - ptr;
1024
132
    if (n & (MINBPC(enc) - 1)) {
1025
21
      n &= ~(MINBPC(enc) - 1);
1026
21
      if (n == 0)
1027
2
        return XML_TOK_PARTIAL;
1028
19
      end = ptr + n;
1029
19
    }
1030
132
  }
1031
130
  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
0
    EXPAT_FALLTHROUGH;
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
0
        EXPAT_FALLTHROUGH;
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
48
    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
102
  case BT_NONASCII:
1182
102
    if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {
1183
78
      ptr += MINBPC(enc);
1184
78
      tok = XML_TOK_NAME;
1185
78
      break;
1186
78
    }
1187
24
    if (IS_NAME_CHAR_MINBPC(enc, ptr)) {
1188
11
      ptr += MINBPC(enc);
1189
11
      tok = XML_TOK_NMTOKEN;
1190
11
      break;
1191
11
    }
1192
13
    EXPAT_FALLTHROUGH;
1193
18
  default:
1194
18
    *nextTokPtr = ptr;
1195
18
    return XML_TOK_INVALID;
1196
130
  }
1197
1.12k
  while (HAS_CHAR(enc, ptr, end)) {
1198
1.12k
    switch (BYTE_TYPE(enc, ptr)) {
1199
6.41k
      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
13
    default:
1253
13
      *nextTokPtr = ptr;
1254
13
      return XML_TOK_INVALID;
1255
1.12k
    }
1256
1.12k
  }
1257
28
  return -tok;
1258
89
}
xmltok.c:big2_prologTok
Line
Count
Source
1018
142
                  const char **nextTokPtr) {
1019
142
  int tok;
1020
142
  if (ptr >= end)
1021
2
    return XML_TOK_NONE;
1022
140
  if (MINBPC(enc) > 1) {
1023
140
    size_t n = end - ptr;
1024
140
    if (n & (MINBPC(enc) - 1)) {
1025
24
      n &= ~(MINBPC(enc) - 1);
1026
24
      if (n == 0)
1027
2
        return XML_TOK_PARTIAL;
1028
22
      end = ptr + n;
1029
22
    }
1030
140
  }
1031
138
  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
0
    EXPAT_FALLTHROUGH;
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
0
        EXPAT_FALLTHROUGH;
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
72
    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
98
  case BT_NONASCII:
1182
98
    if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {
1183
73
      ptr += MINBPC(enc);
1184
73
      tok = XML_TOK_NAME;
1185
73
      break;
1186
73
    }
1187
25
    if (IS_NAME_CHAR_MINBPC(enc, ptr)) {
1188
9
      ptr += MINBPC(enc);
1189
9
      tok = XML_TOK_NMTOKEN;
1190
9
      break;
1191
9
    }
1192
16
    EXPAT_FALLTHROUGH;
1193
23
  default:
1194
23
    *nextTokPtr = ptr;
1195
23
    return XML_TOK_INVALID;
1196
138
  }
1197
1.37k
  while (HAS_CHAR(enc, ptr, end)) {
1198
1.37k
    switch (BYTE_TYPE(enc, ptr)) {
1199
7.95k
      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
10
    default:
1253
10
      *nextTokPtr = ptr;
1254
10
      return XML_TOK_INVALID;
1255
1.37k
    }
1256
1.37k
  }
1257
20
  return -tok;
1258
82
}
1259
1260
static int
1261
PREFIX(attributeValueTok)(const ENCODING *enc, const char *ptr, const char *end,
1262
5.14M
                          const char **nextTokPtr) {
1263
5.14M
  const char *start;
1264
5.14M
  if (ptr >= end)
1265
52.0k
    return XML_TOK_NONE;
1266
5.09M
  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
5.09M
  start = ptr;
1275
19.9M
  while (HAS_CHAR(enc, ptr, end)) {
1276
19.9M
    switch (BYTE_TYPE(enc, ptr)) {
1277
0
#  define LEAD_CASE(n)                                                         \
1278
265k
  case BT_LEAD##n:                                                             \
1279
265k
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1280
265k
    break;
1281
95.1k
      LEAD_CASE(2)
1282
30.5k
      LEAD_CASE(3)
1283
140k
      LEAD_CASE(4)
1284
0
#  undef LEAD_CASE
1285
45.9k
    case BT_AMP:
1286
45.9k
      if (ptr == start)
1287
33.7k
        return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1288
12.2k
      *nextTokPtr = ptr;
1289
12.2k
      return XML_TOK_DATA_CHARS;
1290
1
    case BT_LT:
1291
      /* this is for inside entity references */
1292
1
      *nextTokPtr = ptr;
1293
1
      return XML_TOK_INVALID;
1294
1.09M
    case BT_LF:
1295
1.09M
      if (ptr == start) {
1296
967k
        *nextTokPtr = ptr + MINBPC(enc);
1297
967k
        return XML_TOK_DATA_NEWLINE;
1298
967k
      }
1299
126k
      *nextTokPtr = ptr;
1300
126k
      return XML_TOK_DATA_CHARS;
1301
3.32M
    case BT_CR:
1302
3.32M
      if (ptr == start) {
1303
2.80M
        ptr += MINBPC(enc);
1304
2.80M
        if (! HAS_CHAR(enc, ptr, end))
1305
785
          return XML_TOK_TRAILING_CR;
1306
2.80M
        if (BYTE_TYPE(enc, ptr) == BT_LF)
1307
488k
          ptr += MINBPC(enc);
1308
2.80M
        *nextTokPtr = ptr;
1309
2.80M
        return XML_TOK_DATA_NEWLINE;
1310
2.80M
      }
1311
517k
      *nextTokPtr = ptr;
1312
517k
      return XML_TOK_DATA_CHARS;
1313
597k
    case BT_S:
1314
597k
      if (ptr == start) {
1315
367k
        *nextTokPtr = ptr + MINBPC(enc);
1316
367k
        return XML_TOK_ATTRIBUTE_VALUE_S;
1317
367k
      }
1318
229k
      *nextTokPtr = ptr;
1319
229k
      return XML_TOK_DATA_CHARS;
1320
14.5M
    default:
1321
14.5M
      ptr += MINBPC(enc);
1322
14.5M
      break;
1323
19.9M
    }
1324
19.9M
  }
1325
29.4k
  *nextTokPtr = ptr;
1326
29.4k
  return XML_TOK_DATA_CHARS;
1327
5.09M
}
xmltok.c:normal_attributeValueTok
Line
Count
Source
1262
5.14M
                          const char **nextTokPtr) {
1263
5.14M
  const char *start;
1264
5.14M
  if (ptr >= end)
1265
52.0k
    return XML_TOK_NONE;
1266
5.09M
  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
5.09M
  start = ptr;
1275
19.9M
  while (HAS_CHAR(enc, ptr, end)) {
1276
19.9M
    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
95.1k
      LEAD_CASE(2)
1282
30.5k
      LEAD_CASE(3)
1283
140k
      LEAD_CASE(4)
1284
0
#  undef LEAD_CASE
1285
45.9k
    case BT_AMP:
1286
45.9k
      if (ptr == start)
1287
33.7k
        return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1288
12.2k
      *nextTokPtr = ptr;
1289
12.2k
      return XML_TOK_DATA_CHARS;
1290
1
    case BT_LT:
1291
      /* this is for inside entity references */
1292
1
      *nextTokPtr = ptr;
1293
1
      return XML_TOK_INVALID;
1294
1.09M
    case BT_LF:
1295
1.09M
      if (ptr == start) {
1296
967k
        *nextTokPtr = ptr + MINBPC(enc);
1297
967k
        return XML_TOK_DATA_NEWLINE;
1298
967k
      }
1299
126k
      *nextTokPtr = ptr;
1300
126k
      return XML_TOK_DATA_CHARS;
1301
3.32M
    case BT_CR:
1302
3.32M
      if (ptr == start) {
1303
2.80M
        ptr += MINBPC(enc);
1304
2.80M
        if (! HAS_CHAR(enc, ptr, end))
1305
785
          return XML_TOK_TRAILING_CR;
1306
2.80M
        if (BYTE_TYPE(enc, ptr) == BT_LF)
1307
488k
          ptr += MINBPC(enc);
1308
2.80M
        *nextTokPtr = ptr;
1309
2.80M
        return XML_TOK_DATA_NEWLINE;
1310
2.80M
      }
1311
517k
      *nextTokPtr = ptr;
1312
517k
      return XML_TOK_DATA_CHARS;
1313
597k
    case BT_S:
1314
597k
      if (ptr == start) {
1315
367k
        *nextTokPtr = ptr + MINBPC(enc);
1316
367k
        return XML_TOK_ATTRIBUTE_VALUE_S;
1317
367k
      }
1318
229k
      *nextTokPtr = ptr;
1319
229k
      return XML_TOK_DATA_CHARS;
1320
14.5M
    default:
1321
14.5M
      ptr += MINBPC(enc);
1322
14.5M
      break;
1323
19.9M
    }
1324
19.9M
  }
1325
29.4k
  *nextTokPtr = ptr;
1326
29.4k
  return XML_TOK_DATA_CHARS;
1327
5.09M
}
Unexecuted instantiation: xmltok.c:little2_attributeValueTok
Unexecuted instantiation: xmltok.c:big2_attributeValueTok
1328
1329
static int
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
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
1449
PREFIX(isPublicId)(const ENCODING *enc, const char *ptr, const char *end,
1450
5.40k
                   const char **badPtr) {
1451
5.40k
  ptr += MINBPC(enc);
1452
5.40k
  end -= MINBPC(enc);
1453
521k
  for (; HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
1454
521k
    switch (BYTE_TYPE(enc, ptr)) {
1455
208k
    case BT_DIGIT:
1456
355k
    case BT_HEX:
1457
356k
    case BT_MINUS:
1458
356k
    case BT_APOS:
1459
356k
    case BT_LPAR:
1460
384k
    case BT_RPAR:
1461
385k
    case BT_PLUS:
1462
385k
    case BT_COMMA:
1463
435k
    case BT_SOL:
1464
436k
    case BT_EQUALS:
1465
439k
    case BT_QUEST:
1466
443k
    case BT_CR:
1467
444k
    case BT_LF:
1468
445k
    case BT_SEMI:
1469
446k
    case BT_EXCL:
1470
447k
    case BT_AST:
1471
450k
    case BT_PERCNT:
1472
456k
    case BT_NUM:
1473
#  ifdef XML_NS
1474
    case BT_COLON:
1475
#  endif
1476
456k
      break;
1477
1.48k
    case BT_S:
1478
1.48k
      if (CHAR_MATCHES(enc, ptr, ASCII_TAB)) {
1479
1
        *badPtr = ptr;
1480
1
        return 0;
1481
1
      }
1482
1.48k
      break;
1483
7.04k
    case BT_NAME:
1484
61.2k
    case BT_NMSTRT:
1485
61.2k
      if (! (BYTE_TO_ASCII(enc, ptr) & ~0x7f))
1486
61.2k
        break;
1487
0
      EXPAT_FALLTHROUGH;
1488
2.09k
    default:
1489
2.09k
      switch (BYTE_TO_ASCII(enc, ptr)) {
1490
1.89k
      case 0x24: /* $ */
1491
2.09k
      case 0x40: /* @ */
1492
2.09k
        break;
1493
4
      default:
1494
4
        *badPtr = ptr;
1495
4
        return 0;
1496
2.09k
      }
1497
2.09k
      break;
1498
521k
    }
1499
521k
  }
1500
5.39k
  return 1;
1501
5.40k
}
xmltok.c:normal_isPublicId
Line
Count
Source
1450
5.40k
                   const char **badPtr) {
1451
5.40k
  ptr += MINBPC(enc);
1452
5.40k
  end -= MINBPC(enc);
1453
521k
  for (; HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
1454
521k
    switch (BYTE_TYPE(enc, ptr)) {
1455
208k
    case BT_DIGIT:
1456
355k
    case BT_HEX:
1457
356k
    case BT_MINUS:
1458
356k
    case BT_APOS:
1459
356k
    case BT_LPAR:
1460
384k
    case BT_RPAR:
1461
385k
    case BT_PLUS:
1462
385k
    case BT_COMMA:
1463
435k
    case BT_SOL:
1464
436k
    case BT_EQUALS:
1465
439k
    case BT_QUEST:
1466
443k
    case BT_CR:
1467
444k
    case BT_LF:
1468
445k
    case BT_SEMI:
1469
446k
    case BT_EXCL:
1470
447k
    case BT_AST:
1471
450k
    case BT_PERCNT:
1472
456k
    case BT_NUM:
1473
#  ifdef XML_NS
1474
    case BT_COLON:
1475
#  endif
1476
456k
      break;
1477
1.48k
    case BT_S:
1478
1.48k
      if (CHAR_MATCHES(enc, ptr, ASCII_TAB)) {
1479
1
        *badPtr = ptr;
1480
1
        return 0;
1481
1
      }
1482
1.48k
      break;
1483
7.04k
    case BT_NAME:
1484
61.2k
    case BT_NMSTRT:
1485
61.2k
      if (! (BYTE_TO_ASCII(enc, ptr) & ~0x7f))
1486
61.2k
        break;
1487
0
      EXPAT_FALLTHROUGH;
1488
2.09k
    default:
1489
2.09k
      switch (BYTE_TO_ASCII(enc, ptr)) {
1490
1.89k
      case 0x24: /* $ */
1491
2.09k
      case 0x40: /* @ */
1492
2.09k
        break;
1493
4
      default:
1494
4
        *badPtr = ptr;
1495
4
        return 0;
1496
2.09k
      }
1497
2.09k
      break;
1498
521k
    }
1499
521k
  }
1500
5.39k
  return 1;
1501
5.40k
}
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
1509
PREFIX(getAtts)(const ENCODING *enc, const char *ptr, int attsMax,
1510
1.02M
                ATTRIBUTE *atts) {
1511
1.02M
  enum { other, inName, inValue } state = inName;
1512
1.02M
  int nAtts = 0;
1513
1.02M
  int open = 0; /* defined when state == inValue;
1514
                   initialization just to shut up compilers */
1515
1516
78.9M
  for (ptr += MINBPC(enc);; ptr += MINBPC(enc)) {
1517
78.9M
    switch (BYTE_TYPE(enc, ptr)) {
1518
0
#  define START_NAME                                                           \
1519
33.5M
    if (state == other) {                                                      \
1520
7.11M
      if (nAtts < attsMax) {                                                   \
1521
3.66M
        atts[nAtts].name = ptr;                                                \
1522
3.66M
        atts[nAtts].normalized = 1;                                            \
1523
3.66M
      }                                                                        \
1524
7.11M
      state = inName;                                                          \
1525
7.11M
    }
1526
0
#  define LEAD_CASE(n)                                                         \
1527
401k
  case BT_LEAD##n: /* NOTE: The encoding has already been validated. */        \
1528
401k
    START_NAME ptr += (n - MINBPC(enc));                                       \
1529
401k
    break;
1530
250k
      LEAD_CASE(2)
1531
94.6k
      LEAD_CASE(3)
1532
56.4k
      LEAD_CASE(4)
1533
0
#  undef LEAD_CASE
1534
0
    case BT_NONASCII:
1535
29.1M
    case BT_NMSTRT:
1536
33.1M
    case BT_HEX:
1537
33.1M
      START_NAME
1538
33.1M
      break;
1539
0
#  undef START_NAME
1540
1.20M
    case BT_QUOT:
1541
1.20M
      if (state != inValue) {
1542
517k
        if (nAtts < attsMax)
1543
367k
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1544
517k
        state = inValue;
1545
517k
        open = BT_QUOT;
1546
690k
      } else if (open == BT_QUOT) {
1547
517k
        state = other;
1548
517k
        if (nAtts < attsMax)
1549
367k
          atts[nAtts].valueEnd = ptr;
1550
517k
        nAtts++;
1551
517k
      }
1552
1.20M
      break;
1553
13.2M
    case BT_APOS:
1554
13.2M
      if (state != inValue) {
1555
6.59M
        if (nAtts < attsMax)
1556
3.30M
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1557
6.59M
        state = inValue;
1558
6.59M
        open = BT_APOS;
1559
6.65M
      } else if (open == BT_APOS) {
1560
6.59M
        state = other;
1561
6.59M
        if (nAtts < attsMax)
1562
3.30M
          atts[nAtts].valueEnd = ptr;
1563
6.59M
        nAtts++;
1564
6.59M
      }
1565
13.2M
      break;
1566
34.4k
    case BT_AMP:
1567
34.4k
      if (nAtts < attsMax)
1568
31.6k
        atts[nAtts].normalized = 0;
1569
34.4k
      break;
1570
4.81M
    case BT_S:
1571
4.81M
      if (state == inName)
1572
112k
        state = other;
1573
4.70M
      else if (state == inValue && nAtts < attsMax && atts[nAtts].normalized
1574
131k
               && (ptr == atts[nAtts].valuePtr
1575
17.3k
                   || BYTE_TO_ASCII(enc, ptr) != ASCII_SPACE
1576
5.73k
                   || BYTE_TO_ASCII(enc, ptr + MINBPC(enc)) == ASCII_SPACE
1577
5.53k
                   || BYTE_TYPE(enc, ptr + MINBPC(enc)) == open))
1578
126k
        atts[nAtts].normalized = 0;
1579
4.81M
      break;
1580
6.27M
    case BT_CR:
1581
7.83M
    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
7.83M
      if (state == inName)
1585
25.0k
        state = other;
1586
7.81M
      else if (state == inValue && nAtts < attsMax)
1587
4.05M
        atts[nAtts].normalized = 0;
1588
7.83M
      break;
1589
934k
    case BT_GT:
1590
1.11M
    case BT_SOL:
1591
1.11M
      if (state != inValue)
1592
1.02M
        return nAtts;
1593
89.9k
      break;
1594
17.2M
    default:
1595
17.2M
      break;
1596
78.9M
    }
1597
78.9M
  }
1598
  /* not reached */
1599
1.02M
}
xmltok.c:normal_getAtts
Line
Count
Source
1510
1.02M
                ATTRIBUTE *atts) {
1511
1.02M
  enum { other, inName, inValue } state = inName;
1512
1.02M
  int nAtts = 0;
1513
1.02M
  int open = 0; /* defined when state == inValue;
1514
                   initialization just to shut up compilers */
1515
1516
78.9M
  for (ptr += MINBPC(enc);; ptr += MINBPC(enc)) {
1517
78.9M
    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
250k
      LEAD_CASE(2)
1531
94.6k
      LEAD_CASE(3)
1532
56.4k
      LEAD_CASE(4)
1533
0
#  undef LEAD_CASE
1534
0
    case BT_NONASCII:
1535
29.1M
    case BT_NMSTRT:
1536
33.1M
    case BT_HEX:
1537
33.1M
      START_NAME
1538
33.1M
      break;
1539
0
#  undef START_NAME
1540
1.20M
    case BT_QUOT:
1541
1.20M
      if (state != inValue) {
1542
517k
        if (nAtts < attsMax)
1543
367k
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1544
517k
        state = inValue;
1545
517k
        open = BT_QUOT;
1546
690k
      } else if (open == BT_QUOT) {
1547
517k
        state = other;
1548
517k
        if (nAtts < attsMax)
1549
367k
          atts[nAtts].valueEnd = ptr;
1550
517k
        nAtts++;
1551
517k
      }
1552
1.20M
      break;
1553
13.2M
    case BT_APOS:
1554
13.2M
      if (state != inValue) {
1555
6.59M
        if (nAtts < attsMax)
1556
3.30M
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1557
6.59M
        state = inValue;
1558
6.59M
        open = BT_APOS;
1559
6.65M
      } else if (open == BT_APOS) {
1560
6.59M
        state = other;
1561
6.59M
        if (nAtts < attsMax)
1562
3.30M
          atts[nAtts].valueEnd = ptr;
1563
6.59M
        nAtts++;
1564
6.59M
      }
1565
13.2M
      break;
1566
34.4k
    case BT_AMP:
1567
34.4k
      if (nAtts < attsMax)
1568
31.6k
        atts[nAtts].normalized = 0;
1569
34.4k
      break;
1570
4.81M
    case BT_S:
1571
4.81M
      if (state == inName)
1572
112k
        state = other;
1573
4.70M
      else if (state == inValue && nAtts < attsMax && atts[nAtts].normalized
1574
131k
               && (ptr == atts[nAtts].valuePtr
1575
17.3k
                   || BYTE_TO_ASCII(enc, ptr) != ASCII_SPACE
1576
5.73k
                   || BYTE_TO_ASCII(enc, ptr + MINBPC(enc)) == ASCII_SPACE
1577
5.53k
                   || BYTE_TYPE(enc, ptr + MINBPC(enc)) == open))
1578
126k
        atts[nAtts].normalized = 0;
1579
4.81M
      break;
1580
6.27M
    case BT_CR:
1581
7.83M
    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
7.83M
      if (state == inName)
1585
25.0k
        state = other;
1586
7.81M
      else if (state == inValue && nAtts < attsMax)
1587
4.05M
        atts[nAtts].normalized = 0;
1588
7.83M
      break;
1589
934k
    case BT_GT:
1590
1.11M
    case BT_SOL:
1591
1.11M
      if (state != inValue)
1592
1.02M
        return nAtts;
1593
89.9k
      break;
1594
17.2M
    default:
1595
17.2M
      break;
1596
78.9M
    }
1597
78.9M
  }
1598
  /* not reached */
1599
1.02M
}
Unexecuted instantiation: xmltok.c:little2_getAtts
Unexecuted instantiation: xmltok.c:big2_getAtts
1600
1601
static int
1602
20.3k
PREFIX(charRefNumber)(const ENCODING *enc, const char *ptr) {
1603
20.3k
  int result = 0;
1604
  /* skip &# */
1605
20.3k
  UNUSED_P(enc);
1606
20.3k
  ptr += 2 * MINBPC(enc);
1607
20.3k
  if (CHAR_MATCHES(enc, ptr, ASCII_x)) {
1608
66.1k
    for (ptr += MINBPC(enc); ! CHAR_MATCHES(enc, ptr, ASCII_SEMI);
1609
50.8k
         ptr += MINBPC(enc)) {
1610
50.8k
      int c = BYTE_TO_ASCII(enc, ptr);
1611
50.8k
      switch (c) {
1612
4.92k
      case ASCII_0:
1613
6.87k
      case ASCII_1:
1614
9.28k
      case ASCII_2:
1615
10.1k
      case ASCII_3:
1616
11.2k
      case ASCII_4:
1617
12.9k
      case ASCII_5:
1618
15.2k
      case ASCII_6:
1619
18.4k
      case ASCII_7:
1620
24.5k
      case ASCII_8:
1621
27.9k
      case ASCII_9:
1622
27.9k
        result <<= 4;
1623
27.9k
        result |= (c - ASCII_0);
1624
27.9k
        break;
1625
4.45k
      case ASCII_A:
1626
5.51k
      case ASCII_B:
1627
5.90k
      case ASCII_C:
1628
7.68k
      case ASCII_D:
1629
9.60k
      case ASCII_E:
1630
14.6k
      case ASCII_F:
1631
14.6k
        result <<= 4;
1632
14.6k
        result += 10 + (c - ASCII_A);
1633
14.6k
        break;
1634
483
      case ASCII_a:
1635
1.00k
      case ASCII_b:
1636
2.35k
      case ASCII_c:
1637
5.23k
      case ASCII_d:
1638
6.81k
      case ASCII_e:
1639
8.28k
      case ASCII_f:
1640
8.28k
        result <<= 4;
1641
8.28k
        result += 10 + (c - ASCII_a);
1642
8.28k
        break;
1643
50.8k
      }
1644
50.8k
      if (result >= 0x110000)
1645
11
        return -1;
1646
50.8k
    }
1647
15.3k
  } else {
1648
22.3k
    for (; ! CHAR_MATCHES(enc, ptr, ASCII_SEMI); ptr += MINBPC(enc)) {
1649
17.3k
      int c = BYTE_TO_ASCII(enc, ptr);
1650
17.3k
      result *= 10;
1651
17.3k
      result += (c - ASCII_0);
1652
17.3k
      if (result >= 0x110000)
1653
6
        return -1;
1654
17.3k
    }
1655
5.01k
  }
1656
20.3k
  return checkCharRefNumber(result);
1657
20.3k
}
xmltok.c:normal_charRefNumber
Line
Count
Source
1602
20.3k
PREFIX(charRefNumber)(const ENCODING *enc, const char *ptr) {
1603
20.3k
  int result = 0;
1604
  /* skip &# */
1605
20.3k
  UNUSED_P(enc);
1606
20.3k
  ptr += 2 * MINBPC(enc);
1607
20.3k
  if (CHAR_MATCHES(enc, ptr, ASCII_x)) {
1608
66.1k
    for (ptr += MINBPC(enc); ! CHAR_MATCHES(enc, ptr, ASCII_SEMI);
1609
50.8k
         ptr += MINBPC(enc)) {
1610
50.8k
      int c = BYTE_TO_ASCII(enc, ptr);
1611
50.8k
      switch (c) {
1612
4.92k
      case ASCII_0:
1613
6.87k
      case ASCII_1:
1614
9.28k
      case ASCII_2:
1615
10.1k
      case ASCII_3:
1616
11.2k
      case ASCII_4:
1617
12.9k
      case ASCII_5:
1618
15.2k
      case ASCII_6:
1619
18.4k
      case ASCII_7:
1620
24.5k
      case ASCII_8:
1621
27.9k
      case ASCII_9:
1622
27.9k
        result <<= 4;
1623
27.9k
        result |= (c - ASCII_0);
1624
27.9k
        break;
1625
4.45k
      case ASCII_A:
1626
5.51k
      case ASCII_B:
1627
5.90k
      case ASCII_C:
1628
7.68k
      case ASCII_D:
1629
9.60k
      case ASCII_E:
1630
14.6k
      case ASCII_F:
1631
14.6k
        result <<= 4;
1632
14.6k
        result += 10 + (c - ASCII_A);
1633
14.6k
        break;
1634
483
      case ASCII_a:
1635
1.00k
      case ASCII_b:
1636
2.35k
      case ASCII_c:
1637
5.23k
      case ASCII_d:
1638
6.81k
      case ASCII_e:
1639
8.28k
      case ASCII_f:
1640
8.28k
        result <<= 4;
1641
8.28k
        result += 10 + (c - ASCII_a);
1642
8.28k
        break;
1643
50.8k
      }
1644
50.8k
      if (result >= 0x110000)
1645
11
        return -1;
1646
50.8k
    }
1647
15.3k
  } else {
1648
22.3k
    for (; ! CHAR_MATCHES(enc, ptr, ASCII_SEMI); ptr += MINBPC(enc)) {
1649
17.3k
      int c = BYTE_TO_ASCII(enc, ptr);
1650
17.3k
      result *= 10;
1651
17.3k
      result += (c - ASCII_0);
1652
17.3k
      if (result >= 0x110000)
1653
6
        return -1;
1654
17.3k
    }
1655
5.01k
  }
1656
20.3k
  return checkCharRefNumber(result);
1657
20.3k
}
Unexecuted instantiation: xmltok.c:little2_charRefNumber
Unexecuted instantiation: xmltok.c:big2_charRefNumber
1658
1659
static int
1660
PREFIX(predefinedEntityName)(const ENCODING *enc, const char *ptr,
1661
40.0k
                             const char *end) {
1662
40.0k
  UNUSED_P(enc);
1663
40.0k
  switch ((end - ptr) / MINBPC(enc)) {
1664
8.14k
  case 2:
1665
8.14k
    if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_t)) {
1666
4.75k
      switch (BYTE_TO_ASCII(enc, ptr)) {
1667
3.71k
      case ASCII_l:
1668
3.71k
        return ASCII_LT;
1669
1.02k
      case ASCII_g:
1670
1.02k
        return ASCII_GT;
1671
4.75k
      }
1672
4.75k
    }
1673
3.40k
    break;
1674
5.40k
  case 3:
1675
5.40k
    if (CHAR_MATCHES(enc, ptr, ASCII_a)) {
1676
3.93k
      ptr += MINBPC(enc);
1677
3.93k
      if (CHAR_MATCHES(enc, ptr, ASCII_m)) {
1678
3.58k
        ptr += MINBPC(enc);
1679
3.58k
        if (CHAR_MATCHES(enc, ptr, ASCII_p))
1680
3.38k
          return ASCII_AMP;
1681
3.58k
      }
1682
3.93k
    }
1683
2.02k
    break;
1684
6.58k
  case 4:
1685
6.58k
    switch (BYTE_TO_ASCII(enc, ptr)) {
1686
4.59k
    case ASCII_q:
1687
4.59k
      ptr += MINBPC(enc);
1688
4.59k
      if (CHAR_MATCHES(enc, ptr, ASCII_u)) {
1689
4.37k
        ptr += MINBPC(enc);
1690
4.37k
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1691
4.13k
          ptr += MINBPC(enc);
1692
4.13k
          if (CHAR_MATCHES(enc, ptr, ASCII_t))
1693
3.87k
            return ASCII_QUOT;
1694
4.13k
        }
1695
4.37k
      }
1696
722
      break;
1697
1.64k
    case ASCII_a:
1698
1.64k
      ptr += MINBPC(enc);
1699
1.64k
      if (CHAR_MATCHES(enc, ptr, ASCII_p)) {
1700
1.23k
        ptr += MINBPC(enc);
1701
1.23k
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1702
1.01k
          ptr += MINBPC(enc);
1703
1.01k
          if (CHAR_MATCHES(enc, ptr, ASCII_s))
1704
758
            return ASCII_APOS;
1705
1.01k
        }
1706
1.23k
      }
1707
883
      break;
1708
6.58k
    }
1709
40.0k
  }
1710
27.2k
  return 0;
1711
40.0k
}
xmltok.c:normal_predefinedEntityName
Line
Count
Source
1661
40.0k
                             const char *end) {
1662
40.0k
  UNUSED_P(enc);
1663
40.0k
  switch ((end - ptr) / MINBPC(enc)) {
1664
8.14k
  case 2:
1665
8.14k
    if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_t)) {
1666
4.75k
      switch (BYTE_TO_ASCII(enc, ptr)) {
1667
3.71k
      case ASCII_l:
1668
3.71k
        return ASCII_LT;
1669
1.02k
      case ASCII_g:
1670
1.02k
        return ASCII_GT;
1671
4.75k
      }
1672
4.75k
    }
1673
3.40k
    break;
1674
5.40k
  case 3:
1675
5.40k
    if (CHAR_MATCHES(enc, ptr, ASCII_a)) {
1676
3.93k
      ptr += MINBPC(enc);
1677
3.93k
      if (CHAR_MATCHES(enc, ptr, ASCII_m)) {
1678
3.58k
        ptr += MINBPC(enc);
1679
3.58k
        if (CHAR_MATCHES(enc, ptr, ASCII_p))
1680
3.38k
          return ASCII_AMP;
1681
3.58k
      }
1682
3.93k
    }
1683
2.02k
    break;
1684
6.58k
  case 4:
1685
6.58k
    switch (BYTE_TO_ASCII(enc, ptr)) {
1686
4.59k
    case ASCII_q:
1687
4.59k
      ptr += MINBPC(enc);
1688
4.59k
      if (CHAR_MATCHES(enc, ptr, ASCII_u)) {
1689
4.37k
        ptr += MINBPC(enc);
1690
4.37k
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1691
4.13k
          ptr += MINBPC(enc);
1692
4.13k
          if (CHAR_MATCHES(enc, ptr, ASCII_t))
1693
3.87k
            return ASCII_QUOT;
1694
4.13k
        }
1695
4.37k
      }
1696
722
      break;
1697
1.64k
    case ASCII_a:
1698
1.64k
      ptr += MINBPC(enc);
1699
1.64k
      if (CHAR_MATCHES(enc, ptr, ASCII_p)) {
1700
1.23k
        ptr += MINBPC(enc);
1701
1.23k
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1702
1.01k
          ptr += MINBPC(enc);
1703
1.01k
          if (CHAR_MATCHES(enc, ptr, ASCII_s))
1704
758
            return ASCII_APOS;
1705
1.01k
        }
1706
1.23k
      }
1707
883
      break;
1708
6.58k
    }
1709
40.0k
  }
1710
27.2k
  return 0;
1711
40.0k
}
Unexecuted instantiation: xmltok.c:little2_predefinedEntityName
Unexecuted instantiation: xmltok.c:big2_predefinedEntityName
1712
1713
static int
1714
PREFIX(nameMatchesAscii)(const ENCODING *enc, const char *ptr1,
1715
271k
                         const char *end1, const char *ptr2) {
1716
271k
  UNUSED_P(enc);
1717
1.50M
  for (; *ptr2; ptr1 += MINBPC(enc), ptr2++) {
1718
1.31M
    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
31
      return 0; /* LCOV_EXCL_LINE */
1725
31
    }
1726
1.31M
    if (! CHAR_MATCHES(enc, ptr1, *ptr2))
1727
84.6k
      return 0;
1728
1.31M
  }
1729
186k
  return ptr1 == end1;
1730
271k
}
xmltok.c:normal_nameMatchesAscii
Line
Count
Source
1715
271k
                         const char *end1, const char *ptr2) {
1716
271k
  UNUSED_P(enc);
1717
1.50M
  for (; *ptr2; ptr1 += MINBPC(enc), ptr2++) {
1718
1.31M
    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
31
      return 0; /* LCOV_EXCL_LINE */
1725
31
    }
1726
1.31M
    if (! CHAR_MATCHES(enc, ptr1, *ptr2))
1727
84.6k
      return 0;
1728
1.31M
  }
1729
186k
  return ptr1 == end1;
1730
271k
}
Unexecuted instantiation: xmltok.c:little2_nameMatchesAscii
Unexecuted instantiation: xmltok.c:big2_nameMatchesAscii
1731
1732
static int
1733
1.38M
PREFIX(nameLength)(const ENCODING *enc, const char *ptr) {
1734
1.38M
  const char *start = ptr;
1735
21.8M
  for (;;) {
1736
21.8M
    switch (BYTE_TYPE(enc, ptr)) {
1737
0
#  define LEAD_CASE(n)                                                         \
1738
78.5k
  case BT_LEAD##n:                                                             \
1739
78.5k
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1740
78.5k
    break;
1741
59.9k
      LEAD_CASE(2)
1742
18.6k
      LEAD_CASE(3)
1743
0
      LEAD_CASE(4)
1744
0
#  undef LEAD_CASE
1745
0
    case BT_NONASCII:
1746
10.9M
    case BT_NMSTRT:
1747
#  ifdef XML_NS
1748
    case BT_COLON:
1749
#  endif
1750
14.3M
    case BT_HEX:
1751
14.5M
    case BT_DIGIT:
1752
14.7M
    case BT_NAME:
1753
20.4M
    case BT_MINUS:
1754
20.4M
      ptr += MINBPC(enc);
1755
20.4M
      break;
1756
1.38M
    default:
1757
1.38M
      return (int)(ptr - start);
1758
21.8M
    }
1759
21.8M
  }
1760
1.38M
}
xmltok.c:normal_nameLength
Line
Count
Source
1733
1.38M
PREFIX(nameLength)(const ENCODING *enc, const char *ptr) {
1734
1.38M
  const char *start = ptr;
1735
21.8M
  for (;;) {
1736
21.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
59.9k
      LEAD_CASE(2)
1742
18.6k
      LEAD_CASE(3)
1743
0
      LEAD_CASE(4)
1744
0
#  undef LEAD_CASE
1745
0
    case BT_NONASCII:
1746
10.9M
    case BT_NMSTRT:
1747
#  ifdef XML_NS
1748
    case BT_COLON:
1749
#  endif
1750
14.3M
    case BT_HEX:
1751
14.5M
    case BT_DIGIT:
1752
14.7M
    case BT_NAME:
1753
20.4M
    case BT_MINUS:
1754
20.4M
      ptr += MINBPC(enc);
1755
20.4M
      break;
1756
1.38M
    default:
1757
1.38M
      return (int)(ptr - start);
1758
21.8M
    }
1759
21.8M
  }
1760
1.38M
}
Unexecuted instantiation: xmltok.c:little2_nameLength
Unexecuted instantiation: xmltok.c:big2_nameLength
1761
1762
static const char *
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
1778
PREFIX(updatePosition)(const ENCODING *enc, const char *ptr, const char *end,
1779
21.0k
                       POSITION *pos) {
1780
140M
  while (HAS_CHAR(enc, ptr, end)) {
1781
140M
    switch (BYTE_TYPE(enc, ptr)) {
1782
0
#  define LEAD_CASE(n)                                                         \
1783
1.38M
  case BT_LEAD##n:                                                             \
1784
1.38M
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1785
1.38M
    pos->columnNumber++;                                                       \
1786
1.38M
    break;
1787
639k
      LEAD_CASE(2)
1788
436k
      LEAD_CASE(3)
1789
306k
      LEAD_CASE(4)
1790
0
#  undef LEAD_CASE
1791
3.82M
    case BT_LF:
1792
3.82M
      pos->columnNumber = 0;
1793
3.82M
      pos->lineNumber++;
1794
3.82M
      ptr += MINBPC(enc);
1795
3.82M
      break;
1796
6.83M
    case BT_CR:
1797
6.83M
      pos->lineNumber++;
1798
6.83M
      ptr += MINBPC(enc);
1799
6.83M
      if (HAS_CHAR(enc, ptr, end) && BYTE_TYPE(enc, ptr) == BT_LF)
1800
1.33M
        ptr += MINBPC(enc);
1801
6.83M
      pos->columnNumber = 0;
1802
6.83M
      break;
1803
128M
    default:
1804
128M
      ptr += MINBPC(enc);
1805
128M
      pos->columnNumber++;
1806
128M
      break;
1807
140M
    }
1808
140M
  }
1809
21.0k
}
xmltok.c:normal_updatePosition
Line
Count
Source
1779
20.5k
                       POSITION *pos) {
1780
140M
  while (HAS_CHAR(enc, ptr, end)) {
1781
140M
    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
639k
      LEAD_CASE(2)
1788
436k
      LEAD_CASE(3)
1789
306k
      LEAD_CASE(4)
1790
0
#  undef LEAD_CASE
1791
3.82M
    case BT_LF:
1792
3.82M
      pos->columnNumber = 0;
1793
3.82M
      pos->lineNumber++;
1794
3.82M
      ptr += MINBPC(enc);
1795
3.82M
      break;
1796
6.83M
    case BT_CR:
1797
6.83M
      pos->lineNumber++;
1798
6.83M
      ptr += MINBPC(enc);
1799
6.83M
      if (HAS_CHAR(enc, ptr, end) && BYTE_TYPE(enc, ptr) == BT_LF)
1800
1.33M
        ptr += MINBPC(enc);
1801
6.83M
      pos->columnNumber = 0;
1802
6.83M
      break;
1803
128M
    default:
1804
128M
      ptr += MINBPC(enc);
1805
128M
      pos->columnNumber++;
1806
128M
      break;
1807
140M
    }
1808
140M
  }
1809
20.5k
}
xmltok.c:little2_updatePosition
Line
Count
Source
1779
242
                       POSITION *pos) {
1780
576
  while (HAS_CHAR(enc, ptr, end)) {
1781
576
    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
576
    default:
1804
576
      ptr += MINBPC(enc);
1805
576
      pos->columnNumber++;
1806
576
      break;
1807
576
    }
1808
576
  }
1809
242
}
xmltok.c:big2_updatePosition
Line
Count
Source
1779
259
                       POSITION *pos) {
1780
972
  while (HAS_CHAR(enc, ptr, end)) {
1781
972
    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
972
    default:
1804
972
      ptr += MINBPC(enc);
1805
972
      pos->columnNumber++;
1806
972
      break;
1807
972
    }
1808
972
  }
1809
259
}
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 */