Coverage Report

Created: 2026-01-17 06:58

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/CMake/Utilities/cmexpat/lib/xmltok_impl.c
Line
Count
Source
1
/* This file is included (from xmltok.c, 1-3 times depending on XML_MIN_SIZE)!
2
                            __  __            _
3
                         ___\ \/ /_ __   __ _| |_
4
                        / _ \\  /| '_ \ / _` | __|
5
                       |  __//  \| |_) | (_| | |_
6
                        \___/_/\_\ .__/ \__,_|\__|
7
                                 |_| XML parser
8
9
   Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
10
   Copyright (c) 2000      Clark Cooper <coopercc@users.sourceforge.net>
11
   Copyright (c) 2002      Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
12
   Copyright (c) 2002-2016 Karl Waclawek <karl@waclawek.net>
13
   Copyright (c) 2016-2022 Sebastian Pipping <sebastian@pipping.org>
14
   Copyright (c) 2017      Rhodri James <rhodri@wildebeest.org.uk>
15
   Copyright (c) 2018      Benjamin Peterson <benjamin@python.org>
16
   Copyright (c) 2018      Anton Maklakov <antmak.pub@gmail.com>
17
   Copyright (c) 2019      David Loffredo <loffredo@steptools.com>
18
   Copyright (c) 2020      Boris Kolpackov <boris@codesynthesis.com>
19
   Copyright (c) 2022      Martin Ettl <ettl.martin78@googlemail.com>
20
   Licensed under the MIT license:
21
22
   Permission is  hereby granted,  free of charge,  to any  person obtaining
23
   a  copy  of  this  software   and  associated  documentation  files  (the
24
   "Software"),  to  deal in  the  Software  without restriction,  including
25
   without  limitation the  rights  to use,  copy,  modify, merge,  publish,
26
   distribute, sublicense, and/or sell copies of the Software, and to permit
27
   persons  to whom  the Software  is  furnished to  do so,  subject to  the
28
   following conditions:
29
30
   The above copyright  notice and this permission notice  shall be included
31
   in all copies or substantial portions of the Software.
32
33
   THE  SOFTWARE  IS  PROVIDED  "AS  IS",  WITHOUT  WARRANTY  OF  ANY  KIND,
34
   EXPRESS  OR IMPLIED,  INCLUDING  BUT  NOT LIMITED  TO  THE WARRANTIES  OF
35
   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
36
   NO EVENT SHALL THE AUTHORS OR  COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
37
   DAMAGES OR  OTHER LIABILITY, WHETHER  IN AN  ACTION OF CONTRACT,  TORT OR
38
   OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
39
   USE OR OTHER DEALINGS IN THE SOFTWARE.
40
*/
41
42
#ifdef XML_TOK_IMPL_C
43
44
#  ifndef IS_INVALID_CHAR // i.e. for UTF-16 and XML_MIN_SIZE not defined
45
68
#    define IS_INVALID_CHAR(enc, ptr, n) (0)
46
#  endif
47
48
#  define INVALID_LEAD_CASE(n, ptr, nextTokPtr)                                \
49
936k
  case BT_LEAD##n:                                                             \
50
936k
    if (end - ptr < n)                                                         \
51
936k
      return XML_TOK_PARTIAL_CHAR;                                             \
52
936k
    if (IS_INVALID_CHAR(enc, ptr, n)) {                                        \
53
94
      *(nextTokPtr) = (ptr);                                                   \
54
94
      return XML_TOK_INVALID;                                                  \
55
94
    }                                                                          \
56
936k
    ptr += n;                                                                  \
57
936k
    break;
58
59
#  define INVALID_CASES(ptr, nextTokPtr)                                       \
60
461k
    INVALID_LEAD_CASE(2, ptr, nextTokPtr)                                      \
61
461k
    INVALID_LEAD_CASE(3, ptr, nextTokPtr)                                      \
62
311k
    INVALID_LEAD_CASE(4, ptr, nextTokPtr)                                      \
63
163k
  case BT_NONXML:                                                              \
64
56
  case BT_MALFORM:                                                             \
65
104
  case BT_TRAIL:                                                               \
66
104
    *(nextTokPtr) = (ptr);                                                     \
67
104
    return XML_TOK_INVALID;
68
69
#  define CHECK_NAME_CASE(n, enc, ptr, end, nextTokPtr)                        \
70
313k
  case BT_LEAD##n:                                                             \
71
313k
    if (end - ptr < n)                                                         \
72
312k
      return XML_TOK_PARTIAL_CHAR;                                             \
73
312k
    if (IS_INVALID_CHAR(enc, ptr, n) || ! IS_NAME_CHAR(enc, ptr, n)) {         \
74
251
      *nextTokPtr = ptr;                                                       \
75
251
      return XML_TOK_INVALID;                                                  \
76
251
    }                                                                          \
77
312k
    ptr += n;                                                                  \
78
312k
    break;
79
80
#  define CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)                          \
81
23.8M
  case BT_NONASCII:                                                            \
82
23.8M
    if (! IS_NAME_CHAR_MINBPC(enc, ptr)) {                                     \
83
44
      *nextTokPtr = ptr;                                                       \
84
44
      return XML_TOK_INVALID;                                                  \
85
44
    }                                                                          \
86
23.8M
    /* fall through */                                                         \
87
23.8M
  case BT_NMSTRT:                                                              \
88
20.8M
  case BT_HEX:                                                                 \
89
23.6M
  case BT_DIGIT:                                                               \
90
23.7M
  case BT_NAME:                                                                \
91
23.8M
  case BT_MINUS:                                                               \
92
23.8M
    ptr += MINBPC(enc);                                                        \
93
23.8M
    break;                                                                     \
94
23.8M
    CHECK_NAME_CASE(2, enc, ptr, end, nextTokPtr)                              \
95
188k
    CHECK_NAME_CASE(3, enc, ptr, end, nextTokPtr)                              \
96
188k
    CHECK_NAME_CASE(4, enc, ptr, end, nextTokPtr)
97
98
#  define CHECK_NMSTRT_CASE(n, enc, ptr, end, nextTokPtr)                      \
99
165k
  case BT_LEAD##n:                                                             \
100
165k
    if ((end) - (ptr) < (n))                                                   \
101
165k
      return XML_TOK_PARTIAL_CHAR;                                             \
102
165k
    if (IS_INVALID_CHAR(enc, ptr, n) || ! IS_NMSTRT_CHAR(enc, ptr, n)) {       \
103
163
      *nextTokPtr = ptr;                                                       \
104
163
      return XML_TOK_INVALID;                                                  \
105
163
    }                                                                          \
106
165k
    ptr += n;                                                                  \
107
165k
    break;
108
109
#  define CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)                        \
110
3.76M
  case BT_NONASCII:                                                            \
111
3.76M
    if (! IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {                                   \
112
0
      *nextTokPtr = ptr;                                                       \
113
0
      return XML_TOK_INVALID;                                                  \
114
0
    }                                                                          \
115
3.76M
    /* fall through */                                                         \
116
3.76M
  case BT_NMSTRT:                                                              \
117
3.76M
  case BT_HEX:                                                                 \
118
3.76M
    ptr += MINBPC(enc);                                                        \
119
3.76M
    break;                                                                     \
120
3.76M
    CHECK_NMSTRT_CASE(2, enc, ptr, end, nextTokPtr)                            \
121
109k
    CHECK_NMSTRT_CASE(3, enc, ptr, end, nextTokPtr)                            \
122
109k
    CHECK_NMSTRT_CASE(4, enc, ptr, end, nextTokPtr)
123
124
#  ifndef PREFIX
125
#    define PREFIX(ident) ident
126
#  endif
127
128
#  define HAS_CHARS(enc, ptr, end, count)                                      \
129
297M
    ((end) - (ptr) >= ((count) * MINBPC(enc)))
130
131
11.3M
#  define HAS_CHAR(enc, ptr, end) HAS_CHARS(enc, ptr, end, 1)
132
133
#  define REQUIRE_CHARS(enc, ptr, end, count)                                  \
134
33.0M
    {                                                                          \
135
33.0M
      if (! HAS_CHARS(enc, ptr, end, count)) {                                 \
136
467
        return XML_TOK_PARTIAL;                                                \
137
467
      }                                                                        \
138
33.0M
    }
139
140
33.0M
#  define REQUIRE_CHAR(enc, ptr, end) REQUIRE_CHARS(enc, ptr, end, 1)
141
142
/* ptr points to character following "<!-" */
143
144
static int PTRCALL
145
PREFIX(scanComment)(const ENCODING *enc, const char *ptr, const char *end,
146
25.5k
                    const char **nextTokPtr) {
147
25.5k
  if (HAS_CHAR(enc, ptr, end)) {
148
25.5k
    if (! CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
149
11
      *nextTokPtr = ptr;
150
11
      return XML_TOK_INVALID;
151
11
    }
152
25.4k
    ptr += MINBPC(enc);
153
4.22M
    while (HAS_CHAR(enc, ptr, end)) {
154
4.22M
      switch (BYTE_TYPE(enc, ptr)) {
155
218k
        INVALID_CASES(ptr, nextTokPtr)
156
50.0k
      case BT_MINUS:
157
50.0k
        ptr += MINBPC(enc);
158
50.0k
        REQUIRE_CHAR(enc, ptr, end);
159
50.0k
        if (CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
160
25.3k
          ptr += MINBPC(enc);
161
25.3k
          REQUIRE_CHAR(enc, ptr, end);
162
25.3k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
163
7
            *nextTokPtr = ptr;
164
7
            return XML_TOK_INVALID;
165
7
          }
166
25.3k
          *nextTokPtr = ptr + MINBPC(enc);
167
25.3k
          return XML_TOK_COMMENT;
168
25.3k
        }
169
24.6k
        break;
170
4.06M
      default:
171
4.06M
        ptr += MINBPC(enc);
172
4.06M
        break;
173
4.22M
      }
174
4.22M
    }
175
25.4k
  }
176
58
  return XML_TOK_PARTIAL;
177
25.5k
}
xmltok.c:normal_scanComment
Line
Count
Source
146
25.5k
                    const char **nextTokPtr) {
147
25.5k
  if (HAS_CHAR(enc, ptr, end)) {
148
25.5k
    if (! CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
149
11
      *nextTokPtr = ptr;
150
11
      return XML_TOK_INVALID;
151
11
    }
152
25.4k
    ptr += MINBPC(enc);
153
4.22M
    while (HAS_CHAR(enc, ptr, end)) {
154
4.22M
      switch (BYTE_TYPE(enc, ptr)) {
155
218k
        INVALID_CASES(ptr, nextTokPtr)
156
50.0k
      case BT_MINUS:
157
50.0k
        ptr += MINBPC(enc);
158
50.0k
        REQUIRE_CHAR(enc, ptr, end);
159
50.0k
        if (CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
160
25.3k
          ptr += MINBPC(enc);
161
25.3k
          REQUIRE_CHAR(enc, ptr, end);
162
25.3k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
163
7
            *nextTokPtr = ptr;
164
7
            return XML_TOK_INVALID;
165
7
          }
166
25.3k
          *nextTokPtr = ptr + MINBPC(enc);
167
25.3k
          return XML_TOK_COMMENT;
168
25.3k
        }
169
24.6k
        break;
170
4.06M
      default:
171
4.06M
        ptr += MINBPC(enc);
172
4.06M
        break;
173
4.22M
      }
174
4.22M
    }
175
25.4k
  }
176
58
  return XML_TOK_PARTIAL;
177
25.5k
}
Unexecuted instantiation: xmltok.c:little2_scanComment
Unexecuted instantiation: xmltok.c:big2_scanComment
178
179
/* ptr points to character following "<!" */
180
181
static int PTRCALL
182
PREFIX(scanDecl)(const ENCODING *enc, const char *ptr, const char *end,
183
57.2k
                 const char **nextTokPtr) {
184
57.2k
  REQUIRE_CHAR(enc, ptr, end);
185
57.2k
  switch (BYTE_TYPE(enc, ptr)) {
186
1.87k
  case BT_MINUS:
187
1.87k
    return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
188
2
  case BT_LSQB:
189
2
    *nextTokPtr = ptr + MINBPC(enc);
190
2
    return XML_TOK_COND_SECT_OPEN;
191
892
  case BT_NMSTRT:
192
55.3k
  case BT_HEX:
193
55.3k
    ptr += MINBPC(enc);
194
55.3k
    break;
195
3
  default:
196
3
    *nextTokPtr = ptr;
197
3
    return XML_TOK_INVALID;
198
57.2k
  }
199
394k
  while (HAS_CHAR(enc, ptr, end)) {
200
394k
    switch (BYTE_TYPE(enc, ptr)) {
201
20
    case BT_PERCNT:
202
20
      REQUIRE_CHARS(enc, ptr, end, 2);
203
      /* don't allow <!ENTITY% foo "whatever"> */
204
16
      switch (BYTE_TYPE(enc, ptr + MINBPC(enc))) {
205
1
      case BT_S:
206
2
      case BT_CR:
207
3
      case BT_LF:
208
4
      case BT_PERCNT:
209
4
        *nextTokPtr = ptr;
210
4
        return XML_TOK_INVALID;
211
16
      }
212
      /* fall through */
213
19.5k
    case BT_S:
214
50.1k
    case BT_CR:
215
55.2k
    case BT_LF:
216
55.2k
      *nextTokPtr = ptr;
217
55.2k
      return XML_TOK_DECL_OPEN;
218
304k
    case BT_NMSTRT:
219
338k
    case BT_HEX:
220
338k
      ptr += MINBPC(enc);
221
338k
      break;
222
16
    default:
223
16
      *nextTokPtr = ptr;
224
16
      return XML_TOK_INVALID;
225
394k
    }
226
394k
  }
227
64
  return XML_TOK_PARTIAL;
228
55.3k
}
xmltok.c:normal_scanDecl
Line
Count
Source
183
57.2k
                 const char **nextTokPtr) {
184
57.2k
  REQUIRE_CHAR(enc, ptr, end);
185
57.2k
  switch (BYTE_TYPE(enc, ptr)) {
186
1.87k
  case BT_MINUS:
187
1.87k
    return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
188
2
  case BT_LSQB:
189
2
    *nextTokPtr = ptr + MINBPC(enc);
190
2
    return XML_TOK_COND_SECT_OPEN;
191
892
  case BT_NMSTRT:
192
55.3k
  case BT_HEX:
193
55.3k
    ptr += MINBPC(enc);
194
55.3k
    break;
195
3
  default:
196
3
    *nextTokPtr = ptr;
197
3
    return XML_TOK_INVALID;
198
57.2k
  }
199
394k
  while (HAS_CHAR(enc, ptr, end)) {
200
394k
    switch (BYTE_TYPE(enc, ptr)) {
201
20
    case BT_PERCNT:
202
20
      REQUIRE_CHARS(enc, ptr, end, 2);
203
      /* don't allow <!ENTITY% foo "whatever"> */
204
16
      switch (BYTE_TYPE(enc, ptr + MINBPC(enc))) {
205
1
      case BT_S:
206
2
      case BT_CR:
207
3
      case BT_LF:
208
4
      case BT_PERCNT:
209
4
        *nextTokPtr = ptr;
210
4
        return XML_TOK_INVALID;
211
16
      }
212
      /* fall through */
213
19.5k
    case BT_S:
214
50.1k
    case BT_CR:
215
55.2k
    case BT_LF:
216
55.2k
      *nextTokPtr = ptr;
217
55.2k
      return XML_TOK_DECL_OPEN;
218
304k
    case BT_NMSTRT:
219
338k
    case BT_HEX:
220
338k
      ptr += MINBPC(enc);
221
338k
      break;
222
16
    default:
223
16
      *nextTokPtr = ptr;
224
16
      return XML_TOK_INVALID;
225
394k
    }
226
394k
  }
227
64
  return XML_TOK_PARTIAL;
228
55.3k
}
Unexecuted instantiation: xmltok.c:little2_scanDecl
Unexecuted instantiation: xmltok.c:big2_scanDecl
229
230
static int PTRCALL
231
PREFIX(checkPiTarget)(const ENCODING *enc, const char *ptr, const char *end,
232
47.1k
                      int *tokPtr) {
233
47.1k
  int upper = 0;
234
47.1k
  UNUSED_P(enc);
235
47.1k
  *tokPtr = XML_TOK_PI;
236
47.1k
  if (end - ptr != MINBPC(enc) * 3)
237
33.8k
    return 1;
238
13.3k
  switch (BYTE_TO_ASCII(enc, ptr)) {
239
5.36k
  case ASCII_x:
240
5.36k
    break;
241
3.11k
  case ASCII_X:
242
3.11k
    upper = 1;
243
3.11k
    break;
244
4.85k
  default:
245
4.85k
    return 1;
246
13.3k
  }
247
8.47k
  ptr += MINBPC(enc);
248
8.47k
  switch (BYTE_TO_ASCII(enc, ptr)) {
249
2.31k
  case ASCII_m:
250
2.31k
    break;
251
1.18k
  case ASCII_M:
252
1.18k
    upper = 1;
253
1.18k
    break;
254
4.97k
  default:
255
4.97k
    return 1;
256
8.47k
  }
257
3.50k
  ptr += MINBPC(enc);
258
3.50k
  switch (BYTE_TO_ASCII(enc, ptr)) {
259
1.12k
  case ASCII_l:
260
1.12k
    break;
261
2
  case ASCII_L:
262
2
    upper = 1;
263
2
    break;
264
2.37k
  default:
265
2.37k
    return 1;
266
3.50k
  }
267
1.13k
  if (upper)
268
4
    return 0;
269
1.12k
  *tokPtr = XML_TOK_XML_DECL;
270
1.12k
  return 1;
271
1.13k
}
xmltok.c:normal_checkPiTarget
Line
Count
Source
232
47.1k
                      int *tokPtr) {
233
47.1k
  int upper = 0;
234
47.1k
  UNUSED_P(enc);
235
47.1k
  *tokPtr = XML_TOK_PI;
236
47.1k
  if (end - ptr != MINBPC(enc) * 3)
237
33.8k
    return 1;
238
13.3k
  switch (BYTE_TO_ASCII(enc, ptr)) {
239
5.36k
  case ASCII_x:
240
5.36k
    break;
241
3.11k
  case ASCII_X:
242
3.11k
    upper = 1;
243
3.11k
    break;
244
4.85k
  default:
245
4.85k
    return 1;
246
13.3k
  }
247
8.47k
  ptr += MINBPC(enc);
248
8.47k
  switch (BYTE_TO_ASCII(enc, ptr)) {
249
2.31k
  case ASCII_m:
250
2.31k
    break;
251
1.18k
  case ASCII_M:
252
1.18k
    upper = 1;
253
1.18k
    break;
254
4.97k
  default:
255
4.97k
    return 1;
256
8.47k
  }
257
3.50k
  ptr += MINBPC(enc);
258
3.50k
  switch (BYTE_TO_ASCII(enc, ptr)) {
259
1.12k
  case ASCII_l:
260
1.12k
    break;
261
2
  case ASCII_L:
262
2
    upper = 1;
263
2
    break;
264
2.37k
  default:
265
2.37k
    return 1;
266
3.50k
  }
267
1.13k
  if (upper)
268
4
    return 0;
269
1.12k
  *tokPtr = XML_TOK_XML_DECL;
270
1.12k
  return 1;
271
1.13k
}
Unexecuted instantiation: xmltok.c:little2_checkPiTarget
Unexecuted instantiation: xmltok.c:big2_checkPiTarget
272
273
/* ptr points to character following "<?" */
274
275
static int PTRCALL
276
PREFIX(scanPi)(const ENCODING *enc, const char *ptr, const char *end,
277
47.3k
               const char **nextTokPtr) {
278
47.3k
  int tok;
279
47.3k
  const char *target = ptr;
280
47.3k
  REQUIRE_CHAR(enc, ptr, end);
281
47.3k
  switch (BYTE_TYPE(enc, ptr)) {
282
64.4k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
283
3
  default:
284
3
    *nextTokPtr = ptr;
285
3
    return XML_TOK_INVALID;
286
47.3k
  }
287
1.49M
  while (HAS_CHAR(enc, ptr, end)) {
288
1.49M
    switch (BYTE_TYPE(enc, ptr)) {
289
5.32M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
290
13.0k
    case BT_S:
291
15.1k
    case BT_CR:
292
18.6k
    case BT_LF:
293
18.6k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
294
2
        *nextTokPtr = ptr;
295
2
        return XML_TOK_INVALID;
296
2
      }
297
18.6k
      ptr += MINBPC(enc);
298
11.3M
      while (HAS_CHAR(enc, ptr, end)) {
299
11.3M
        switch (BYTE_TYPE(enc, ptr)) {
300
660k
          INVALID_CASES(ptr, nextTokPtr)
301
89.3k
        case BT_QUEST:
302
89.3k
          ptr += MINBPC(enc);
303
89.3k
          REQUIRE_CHAR(enc, ptr, end);
304
89.3k
          if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
305
18.4k
            *nextTokPtr = ptr + MINBPC(enc);
306
18.4k
            return tok;
307
18.4k
          }
308
70.9k
          break;
309
10.9M
        default:
310
10.9M
          ptr += MINBPC(enc);
311
10.9M
          break;
312
11.3M
        }
313
11.3M
      }
314
104
      return XML_TOK_PARTIAL;
315
28.5k
    case BT_QUEST:
316
28.5k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
317
2
        *nextTokPtr = ptr;
318
2
        return XML_TOK_INVALID;
319
2
      }
320
28.5k
      ptr += MINBPC(enc);
321
28.5k
      REQUIRE_CHAR(enc, ptr, end);
322
28.5k
      if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
323
28.4k
        *nextTokPtr = ptr + MINBPC(enc);
324
28.4k
        return tok;
325
28.4k
      }
326
      /* fall through */
327
22
    default:
328
22
      *nextTokPtr = ptr;
329
22
      return XML_TOK_INVALID;
330
1.49M
    }
331
1.49M
  }
332
66
  return XML_TOK_PARTIAL;
333
47.2k
}
xmltok.c:normal_scanPi
Line
Count
Source
277
47.3k
               const char **nextTokPtr) {
278
47.3k
  int tok;
279
47.3k
  const char *target = ptr;
280
47.3k
  REQUIRE_CHAR(enc, ptr, end);
281
47.3k
  switch (BYTE_TYPE(enc, ptr)) {
282
64.4k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
283
3
  default:
284
3
    *nextTokPtr = ptr;
285
3
    return XML_TOK_INVALID;
286
47.3k
  }
287
1.49M
  while (HAS_CHAR(enc, ptr, end)) {
288
1.49M
    switch (BYTE_TYPE(enc, ptr)) {
289
5.32M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
290
13.0k
    case BT_S:
291
15.1k
    case BT_CR:
292
18.6k
    case BT_LF:
293
18.6k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
294
2
        *nextTokPtr = ptr;
295
2
        return XML_TOK_INVALID;
296
2
      }
297
18.6k
      ptr += MINBPC(enc);
298
11.3M
      while (HAS_CHAR(enc, ptr, end)) {
299
11.3M
        switch (BYTE_TYPE(enc, ptr)) {
300
660k
          INVALID_CASES(ptr, nextTokPtr)
301
89.3k
        case BT_QUEST:
302
89.3k
          ptr += MINBPC(enc);
303
89.3k
          REQUIRE_CHAR(enc, ptr, end);
304
89.3k
          if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
305
18.4k
            *nextTokPtr = ptr + MINBPC(enc);
306
18.4k
            return tok;
307
18.4k
          }
308
70.9k
          break;
309
10.9M
        default:
310
10.9M
          ptr += MINBPC(enc);
311
10.9M
          break;
312
11.3M
        }
313
11.3M
      }
314
104
      return XML_TOK_PARTIAL;
315
28.5k
    case BT_QUEST:
316
28.5k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
317
2
        *nextTokPtr = ptr;
318
2
        return XML_TOK_INVALID;
319
2
      }
320
28.5k
      ptr += MINBPC(enc);
321
28.5k
      REQUIRE_CHAR(enc, ptr, end);
322
28.5k
      if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
323
28.4k
        *nextTokPtr = ptr + MINBPC(enc);
324
28.4k
        return tok;
325
28.4k
      }
326
      /* fall through */
327
22
    default:
328
22
      *nextTokPtr = ptr;
329
22
      return XML_TOK_INVALID;
330
1.49M
    }
331
1.49M
  }
332
66
  return XML_TOK_PARTIAL;
333
47.2k
}
Unexecuted instantiation: xmltok.c:little2_scanPi
Unexecuted instantiation: xmltok.c:big2_scanPi
334
335
static int PTRCALL
336
PREFIX(scanCdataSection)(const ENCODING *enc, const char *ptr, const char *end,
337
2.44k
                         const char **nextTokPtr) {
338
2.44k
  static const char CDATA_LSQB[]
339
2.44k
      = {ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, ASCII_LSQB};
340
2.44k
  int i;
341
2.44k
  UNUSED_P(enc);
342
  /* CDATA[ */
343
2.44k
  REQUIRE_CHARS(enc, ptr, end, 6);
344
16.8k
  for (i = 0; i < 6; i++, ptr += MINBPC(enc)) {
345
14.4k
    if (! CHAR_MATCHES(enc, ptr, CDATA_LSQB[i])) {
346
42
      *nextTokPtr = ptr;
347
42
      return XML_TOK_INVALID;
348
42
    }
349
14.4k
  }
350
2.38k
  *nextTokPtr = ptr;
351
2.38k
  return XML_TOK_CDATA_SECT_OPEN;
352
2.42k
}
xmltok.c:normal_scanCdataSection
Line
Count
Source
337
2.44k
                         const char **nextTokPtr) {
338
2.44k
  static const char CDATA_LSQB[]
339
2.44k
      = {ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, ASCII_LSQB};
340
2.44k
  int i;
341
2.44k
  UNUSED_P(enc);
342
  /* CDATA[ */
343
2.44k
  REQUIRE_CHARS(enc, ptr, end, 6);
344
16.8k
  for (i = 0; i < 6; i++, ptr += MINBPC(enc)) {
345
14.4k
    if (! CHAR_MATCHES(enc, ptr, CDATA_LSQB[i])) {
346
42
      *nextTokPtr = ptr;
347
42
      return XML_TOK_INVALID;
348
42
    }
349
14.4k
  }
350
2.38k
  *nextTokPtr = ptr;
351
2.38k
  return XML_TOK_CDATA_SECT_OPEN;
352
2.42k
}
Unexecuted instantiation: xmltok.c:little2_scanCdataSection
Unexecuted instantiation: xmltok.c:big2_scanCdataSection
353
354
static int PTRCALL
355
PREFIX(cdataSectionTok)(const ENCODING *enc, const char *ptr, const char *end,
356
5.17M
                        const char **nextTokPtr) {
357
5.17M
  if (ptr >= end)
358
130
    return XML_TOK_NONE;
359
5.17M
  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
5.17M
  switch (BYTE_TYPE(enc, ptr)) {
369
999k
  case BT_RSQB:
370
999k
    ptr += MINBPC(enc);
371
999k
    REQUIRE_CHAR(enc, ptr, end);
372
999k
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
373
531k
      break;
374
468k
    ptr += MINBPC(enc);
375
468k
    REQUIRE_CHAR(enc, ptr, end);
376
468k
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
377
466k
      ptr -= MINBPC(enc);
378
466k
      break;
379
466k
    }
380
2.26k
    *nextTokPtr = ptr + MINBPC(enc);
381
2.26k
    return XML_TOK_CDATA_SECT_CLOSE;
382
1.75M
  case BT_CR:
383
1.75M
    ptr += MINBPC(enc);
384
1.75M
    REQUIRE_CHAR(enc, ptr, end);
385
1.75M
    if (BYTE_TYPE(enc, ptr) == BT_LF)
386
361k
      ptr += MINBPC(enc);
387
1.75M
    *nextTokPtr = ptr;
388
1.75M
    return XML_TOK_DATA_NEWLINE;
389
1.42M
  case BT_LF:
390
1.42M
    *nextTokPtr = ptr + MINBPC(enc);
391
1.42M
    return XML_TOK_DATA_NEWLINE;
392
1.42M
    INVALID_CASES(ptr, nextTokPtr)
393
830k
  default:
394
830k
    ptr += MINBPC(enc);
395
830k
    break;
396
5.17M
  }
397
26.1M
  while (HAS_CHAR(enc, ptr, end)) {
398
26.1M
    switch (BYTE_TYPE(enc, ptr)) {
399
0
#  define LEAD_CASE(n)                                                         \
400
396k
  case BT_LEAD##n:                                                             \
401
396k
    if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) {                       \
402
21
      *nextTokPtr = ptr;                                                       \
403
21
      return XML_TOK_DATA_CHARS;                                               \
404
21
    }                                                                          \
405
396k
    ptr += n;                                                                  \
406
396k
    break;
407
159k
      LEAD_CASE(2)
408
153k
      LEAD_CASE(3)
409
83.4k
      LEAD_CASE(4)
410
0
#  undef LEAD_CASE
411
4
    case BT_NONXML:
412
6
    case BT_MALFORM:
413
18
    case BT_TRAIL:
414
754k
    case BT_CR:
415
1.19M
    case BT_LF:
416
1.99M
    case BT_RSQB:
417
1.99M
      *nextTokPtr = ptr;
418
1.99M
      return XML_TOK_DATA_CHARS;
419
23.7M
    default:
420
23.7M
      ptr += MINBPC(enc);
421
23.7M
      break;
422
26.1M
    }
423
26.1M
  }
424
39
  *nextTokPtr = ptr;
425
39
  return XML_TOK_DATA_CHARS;
426
1.99M
}
xmltok.c:normal_cdataSectionTok
Line
Count
Source
356
5.17M
                        const char **nextTokPtr) {
357
5.17M
  if (ptr >= end)
358
130
    return XML_TOK_NONE;
359
5.17M
  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
5.17M
  switch (BYTE_TYPE(enc, ptr)) {
369
999k
  case BT_RSQB:
370
999k
    ptr += MINBPC(enc);
371
999k
    REQUIRE_CHAR(enc, ptr, end);
372
999k
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
373
531k
      break;
374
468k
    ptr += MINBPC(enc);
375
468k
    REQUIRE_CHAR(enc, ptr, end);
376
468k
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
377
466k
      ptr -= MINBPC(enc);
378
466k
      break;
379
466k
    }
380
2.26k
    *nextTokPtr = ptr + MINBPC(enc);
381
2.26k
    return XML_TOK_CDATA_SECT_CLOSE;
382
1.75M
  case BT_CR:
383
1.75M
    ptr += MINBPC(enc);
384
1.75M
    REQUIRE_CHAR(enc, ptr, end);
385
1.75M
    if (BYTE_TYPE(enc, ptr) == BT_LF)
386
361k
      ptr += MINBPC(enc);
387
1.75M
    *nextTokPtr = ptr;
388
1.75M
    return XML_TOK_DATA_NEWLINE;
389
1.42M
  case BT_LF:
390
1.42M
    *nextTokPtr = ptr + MINBPC(enc);
391
1.42M
    return XML_TOK_DATA_NEWLINE;
392
1.42M
    INVALID_CASES(ptr, nextTokPtr)
393
830k
  default:
394
830k
    ptr += MINBPC(enc);
395
830k
    break;
396
5.17M
  }
397
26.1M
  while (HAS_CHAR(enc, ptr, end)) {
398
26.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
159k
      LEAD_CASE(2)
408
153k
      LEAD_CASE(3)
409
83.4k
      LEAD_CASE(4)
410
0
#  undef LEAD_CASE
411
4
    case BT_NONXML:
412
6
    case BT_MALFORM:
413
18
    case BT_TRAIL:
414
754k
    case BT_CR:
415
1.19M
    case BT_LF:
416
1.99M
    case BT_RSQB:
417
1.99M
      *nextTokPtr = ptr;
418
1.99M
      return XML_TOK_DATA_CHARS;
419
23.7M
    default:
420
23.7M
      ptr += MINBPC(enc);
421
23.7M
      break;
422
26.1M
    }
423
26.1M
  }
424
39
  *nextTokPtr = ptr;
425
39
  return XML_TOK_DATA_CHARS;
426
1.99M
}
Unexecuted instantiation: xmltok.c:little2_cdataSectionTok
Unexecuted instantiation: xmltok.c:big2_cdataSectionTok
427
428
/* ptr points to character following "</" */
429
430
static int PTRCALL
431
PREFIX(scanEndTag)(const ENCODING *enc, const char *ptr, const char *end,
432
57.5k
                   const char **nextTokPtr) {
433
57.5k
  REQUIRE_CHAR(enc, ptr, end);
434
57.5k
  switch (BYTE_TYPE(enc, ptr)) {
435
65.3k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
436
9
  default:
437
9
    *nextTokPtr = ptr;
438
9
    return XML_TOK_INVALID;
439
57.5k
  }
440
886k
  while (HAS_CHAR(enc, ptr, end)) {
441
886k
    switch (BYTE_TYPE(enc, ptr)) {
442
2.48M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
443
340
    case BT_S:
444
1.42k
    case BT_CR:
445
4.24k
    case BT_LF:
446
14.2k
      for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
447
14.2k
        switch (BYTE_TYPE(enc, ptr)) {
448
2.49k
        case BT_S:
449
3.58k
        case BT_CR:
450
10.0k
        case BT_LF:
451
10.0k
          break;
452
4.21k
        case BT_GT:
453
4.21k
          *nextTokPtr = ptr + MINBPC(enc);
454
4.21k
          return XML_TOK_END_TAG;
455
3
        default:
456
3
          *nextTokPtr = ptr;
457
3
          return XML_TOK_INVALID;
458
14.2k
        }
459
14.2k
      }
460
36
      return XML_TOK_PARTIAL;
461
#  ifdef XML_NS
462
    case BT_COLON:
463
      /* no need to check qname syntax here,
464
         since end-tag must match exactly */
465
      ptr += MINBPC(enc);
466
      break;
467
#  endif
468
53.1k
    case BT_GT:
469
53.1k
      *nextTokPtr = ptr + MINBPC(enc);
470
53.1k
      return XML_TOK_END_TAG;
471
9
    default:
472
9
      *nextTokPtr = ptr;
473
9
      return XML_TOK_INVALID;
474
886k
    }
475
886k
  }
476
62
  return XML_TOK_PARTIAL;
477
57.5k
}
xmltok.c:normal_scanEndTag
Line
Count
Source
432
57.5k
                   const char **nextTokPtr) {
433
57.5k
  REQUIRE_CHAR(enc, ptr, end);
434
57.5k
  switch (BYTE_TYPE(enc, ptr)) {
435
65.3k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
436
9
  default:
437
9
    *nextTokPtr = ptr;
438
9
    return XML_TOK_INVALID;
439
57.5k
  }
440
886k
  while (HAS_CHAR(enc, ptr, end)) {
441
886k
    switch (BYTE_TYPE(enc, ptr)) {
442
2.48M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
443
340
    case BT_S:
444
1.42k
    case BT_CR:
445
4.24k
    case BT_LF:
446
14.2k
      for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
447
14.2k
        switch (BYTE_TYPE(enc, ptr)) {
448
2.49k
        case BT_S:
449
3.58k
        case BT_CR:
450
10.0k
        case BT_LF:
451
10.0k
          break;
452
4.21k
        case BT_GT:
453
4.21k
          *nextTokPtr = ptr + MINBPC(enc);
454
4.21k
          return XML_TOK_END_TAG;
455
3
        default:
456
3
          *nextTokPtr = ptr;
457
3
          return XML_TOK_INVALID;
458
14.2k
        }
459
14.2k
      }
460
36
      return XML_TOK_PARTIAL;
461
#  ifdef XML_NS
462
    case BT_COLON:
463
      /* no need to check qname syntax here,
464
         since end-tag must match exactly */
465
      ptr += MINBPC(enc);
466
      break;
467
#  endif
468
53.1k
    case BT_GT:
469
53.1k
      *nextTokPtr = ptr + MINBPC(enc);
470
53.1k
      return XML_TOK_END_TAG;
471
9
    default:
472
9
      *nextTokPtr = ptr;
473
9
      return XML_TOK_INVALID;
474
886k
    }
475
886k
  }
476
62
  return XML_TOK_PARTIAL;
477
57.5k
}
Unexecuted instantiation: xmltok.c:little2_scanEndTag
Unexecuted instantiation: xmltok.c:big2_scanEndTag
478
479
/* ptr points to character following "&#X" */
480
481
static int PTRCALL
482
PREFIX(scanHexCharRef)(const ENCODING *enc, const char *ptr, const char *end,
483
160k
                       const char **nextTokPtr) {
484
160k
  if (HAS_CHAR(enc, ptr, end)) {
485
160k
    switch (BYTE_TYPE(enc, ptr)) {
486
64.8k
    case BT_DIGIT:
487
160k
    case BT_HEX:
488
160k
      break;
489
4
    default:
490
4
      *nextTokPtr = ptr;
491
4
      return XML_TOK_INVALID;
492
160k
    }
493
580k
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
494
580k
      switch (BYTE_TYPE(enc, ptr)) {
495
312k
      case BT_DIGIT:
496
419k
      case BT_HEX:
497
419k
        break;
498
160k
      case BT_SEMI:
499
160k
        *nextTokPtr = ptr + MINBPC(enc);
500
160k
        return XML_TOK_CHAR_REF;
501
3
      default:
502
3
        *nextTokPtr = ptr;
503
3
        return XML_TOK_INVALID;
504
580k
      }
505
580k
    }
506
160k
  }
507
12
  return XML_TOK_PARTIAL;
508
160k
}
xmltok.c:normal_scanHexCharRef
Line
Count
Source
483
160k
                       const char **nextTokPtr) {
484
160k
  if (HAS_CHAR(enc, ptr, end)) {
485
160k
    switch (BYTE_TYPE(enc, ptr)) {
486
64.8k
    case BT_DIGIT:
487
160k
    case BT_HEX:
488
160k
      break;
489
4
    default:
490
4
      *nextTokPtr = ptr;
491
4
      return XML_TOK_INVALID;
492
160k
    }
493
580k
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
494
580k
      switch (BYTE_TYPE(enc, ptr)) {
495
312k
      case BT_DIGIT:
496
419k
      case BT_HEX:
497
419k
        break;
498
160k
      case BT_SEMI:
499
160k
        *nextTokPtr = ptr + MINBPC(enc);
500
160k
        return XML_TOK_CHAR_REF;
501
3
      default:
502
3
        *nextTokPtr = ptr;
503
3
        return XML_TOK_INVALID;
504
580k
      }
505
580k
    }
506
160k
  }
507
12
  return XML_TOK_PARTIAL;
508
160k
}
Unexecuted instantiation: xmltok.c:little2_scanHexCharRef
Unexecuted instantiation: xmltok.c:big2_scanHexCharRef
509
510
/* ptr points to character following "&#" */
511
512
static int PTRCALL
513
PREFIX(scanCharRef)(const ENCODING *enc, const char *ptr, const char *end,
514
167k
                    const char **nextTokPtr) {
515
167k
  if (HAS_CHAR(enc, ptr, end)) {
516
167k
    if (CHAR_MATCHES(enc, ptr, ASCII_x))
517
160k
      return PREFIX(scanHexCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
518
6.91k
    switch (BYTE_TYPE(enc, ptr)) {
519
6.90k
    case BT_DIGIT:
520
6.90k
      break;
521
13
    default:
522
13
      *nextTokPtr = ptr;
523
13
      return XML_TOK_INVALID;
524
6.91k
    }
525
22.1k
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
526
22.1k
      switch (BYTE_TYPE(enc, ptr)) {
527
15.2k
      case BT_DIGIT:
528
15.2k
        break;
529
6.88k
      case BT_SEMI:
530
6.88k
        *nextTokPtr = ptr + MINBPC(enc);
531
6.88k
        return XML_TOK_CHAR_REF;
532
2
      default:
533
2
        *nextTokPtr = ptr;
534
2
        return XML_TOK_INVALID;
535
22.1k
      }
536
22.1k
    }
537
6.90k
  }
538
18
  return XML_TOK_PARTIAL;
539
167k
}
xmltok.c:normal_scanCharRef
Line
Count
Source
514
167k
                    const char **nextTokPtr) {
515
167k
  if (HAS_CHAR(enc, ptr, end)) {
516
167k
    if (CHAR_MATCHES(enc, ptr, ASCII_x))
517
160k
      return PREFIX(scanHexCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
518
6.91k
    switch (BYTE_TYPE(enc, ptr)) {
519
6.90k
    case BT_DIGIT:
520
6.90k
      break;
521
13
    default:
522
13
      *nextTokPtr = ptr;
523
13
      return XML_TOK_INVALID;
524
6.91k
    }
525
22.1k
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
526
22.1k
      switch (BYTE_TYPE(enc, ptr)) {
527
15.2k
      case BT_DIGIT:
528
15.2k
        break;
529
6.88k
      case BT_SEMI:
530
6.88k
        *nextTokPtr = ptr + MINBPC(enc);
531
6.88k
        return XML_TOK_CHAR_REF;
532
2
      default:
533
2
        *nextTokPtr = ptr;
534
2
        return XML_TOK_INVALID;
535
22.1k
      }
536
22.1k
    }
537
6.90k
  }
538
18
  return XML_TOK_PARTIAL;
539
167k
}
Unexecuted instantiation: xmltok.c:little2_scanCharRef
Unexecuted instantiation: xmltok.c:big2_scanCharRef
540
541
/* ptr points to character following "&" */
542
543
static int PTRCALL
544
PREFIX(scanRef)(const ENCODING *enc, const char *ptr, const char *end,
545
536k
                const char **nextTokPtr) {
546
536k
  REQUIRE_CHAR(enc, ptr, end);
547
536k
  switch (BYTE_TYPE(enc, ptr)) {
548
215k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
549
167k
  case BT_NUM:
550
167k
    return PREFIX(scanCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
551
3
  default:
552
3
    *nextTokPtr = ptr;
553
3
    return XML_TOK_INVALID;
554
536k
  }
555
2.07M
  while (HAS_CHAR(enc, ptr, end)) {
556
2.07M
    switch (BYTE_TYPE(enc, ptr)) {
557
6.25M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
558
369k
    case BT_SEMI:
559
369k
      *nextTokPtr = ptr + MINBPC(enc);
560
369k
      return XML_TOK_ENTITY_REF;
561
16
    default:
562
16
      *nextTokPtr = ptr;
563
16
      return XML_TOK_INVALID;
564
2.07M
    }
565
2.07M
  }
566
56
  return XML_TOK_PARTIAL;
567
369k
}
xmltok.c:normal_scanRef
Line
Count
Source
545
536k
                const char **nextTokPtr) {
546
536k
  REQUIRE_CHAR(enc, ptr, end);
547
536k
  switch (BYTE_TYPE(enc, ptr)) {
548
215k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
549
167k
  case BT_NUM:
550
167k
    return PREFIX(scanCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
551
3
  default:
552
3
    *nextTokPtr = ptr;
553
3
    return XML_TOK_INVALID;
554
536k
  }
555
2.07M
  while (HAS_CHAR(enc, ptr, end)) {
556
2.07M
    switch (BYTE_TYPE(enc, ptr)) {
557
6.25M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
558
369k
    case BT_SEMI:
559
369k
      *nextTokPtr = ptr + MINBPC(enc);
560
369k
      return XML_TOK_ENTITY_REF;
561
16
    default:
562
16
      *nextTokPtr = ptr;
563
16
      return XML_TOK_INVALID;
564
2.07M
    }
565
2.07M
  }
566
56
  return XML_TOK_PARTIAL;
567
369k
}
Unexecuted instantiation: xmltok.c:little2_scanRef
Unexecuted instantiation: xmltok.c:big2_scanRef
568
569
/* ptr points to character following first character of attribute name */
570
571
static int PTRCALL
572
PREFIX(scanAtts)(const ENCODING *enc, const char *ptr, const char *end,
573
54.5k
                 const char **nextTokPtr) {
574
#  ifdef XML_NS
575
  int hadColon = 0;
576
#  endif
577
4.03M
  while (HAS_CHAR(enc, ptr, end)) {
578
4.03M
    switch (BYTE_TYPE(enc, ptr)) {
579
3.39M
      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
4.45k
    case BT_S:
598
20.0k
    case BT_CR:
599
22.4k
    case BT_LF:
600
46.4k
      for (;;) {
601
46.4k
        int t;
602
603
46.4k
        ptr += MINBPC(enc);
604
46.4k
        REQUIRE_CHAR(enc, ptr, end);
605
46.3k
        t = BYTE_TYPE(enc, ptr);
606
46.3k
        if (t == BT_EQUALS)
607
22.3k
          break;
608
24.0k
        switch (t) {
609
5.36k
        case BT_S:
610
7.27k
        case BT_LF:
611
23.9k
        case BT_CR:
612
23.9k
          break;
613
10
        default:
614
10
          *nextTokPtr = ptr;
615
10
          return XML_TOK_INVALID;
616
24.0k
        }
617
24.0k
      }
618
      /* fall through */
619
3.01M
    case BT_EQUALS: {
620
3.01M
      int open;
621
#  ifdef XML_NS
622
      hadColon = 0;
623
#  endif
624
3.08M
      for (;;) {
625
3.08M
        ptr += MINBPC(enc);
626
3.08M
        REQUIRE_CHAR(enc, ptr, end);
627
3.08M
        open = BYTE_TYPE(enc, ptr);
628
3.08M
        if (open == BT_QUOT || open == BT_APOS)
629
3.01M
          break;
630
73.4k
        switch (open) {
631
15.3k
        case BT_S:
632
30.7k
        case BT_LF:
633
73.4k
        case BT_CR:
634
73.4k
          break;
635
13
        default:
636
13
          *nextTokPtr = ptr;
637
13
          return XML_TOK_INVALID;
638
73.4k
        }
639
73.4k
      }
640
3.01M
      ptr += MINBPC(enc);
641
      /* in attribute value */
642
18.7M
      for (;;) {
643
18.7M
        int t;
644
18.7M
        REQUIRE_CHAR(enc, ptr, end);
645
18.7M
        t = BYTE_TYPE(enc, ptr);
646
18.7M
        if (t == open)
647
3.00M
          break;
648
15.7M
        switch (t) {
649
348k
          INVALID_CASES(ptr, nextTokPtr)
650
111k
        case BT_AMP: {
651
111k
          int tok = PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, &ptr);
652
111k
          if (tok <= 0) {
653
49
            if (tok == XML_TOK_INVALID)
654
25
              *nextTokPtr = ptr;
655
49
            return tok;
656
49
          }
657
111k
          break;
658
111k
        }
659
111k
        case BT_LT:
660
8
          *nextTokPtr = ptr;
661
8
          return XML_TOK_INVALID;
662
15.4M
        default:
663
15.4M
          ptr += MINBPC(enc);
664
15.4M
          break;
665
15.7M
        }
666
15.7M
      }
667
3.00M
      ptr += MINBPC(enc);
668
3.00M
      REQUIRE_CHAR(enc, ptr, end);
669
3.00M
      switch (BYTE_TYPE(enc, ptr)) {
670
1.54M
      case BT_S:
671
2.94M
      case BT_CR:
672
2.96M
      case BT_LF:
673
2.96M
        break;
674
35.4k
      case BT_SOL:
675
35.4k
        goto sol;
676
4.88k
      case BT_GT:
677
4.88k
        goto gt;
678
2
      default:
679
2
        *nextTokPtr = ptr;
680
2
        return XML_TOK_INVALID;
681
3.00M
      }
682
      /* ptr points to closing quote */
683
3.25M
      for (;;) {
684
3.25M
        ptr += MINBPC(enc);
685
3.25M
        REQUIRE_CHAR(enc, ptr, end);
686
3.25M
        switch (BYTE_TYPE(enc, ptr)) {
687
2.95M
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
688
199k
        case BT_S:
689
253k
        case BT_CR:
690
287k
        case BT_LF:
691
287k
          continue;
692
424
        case BT_GT:
693
5.31k
        gt:
694
5.31k
          *nextTokPtr = ptr + MINBPC(enc);
695
5.31k
          return XML_TOK_START_TAG_WITH_ATTS;
696
13.2k
        case BT_SOL:
697
48.6k
        sol:
698
48.6k
          ptr += MINBPC(enc);
699
48.6k
          REQUIRE_CHAR(enc, ptr, end);
700
48.6k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
701
6
            *nextTokPtr = ptr;
702
6
            return XML_TOK_INVALID;
703
6
          }
704
48.6k
          *nextTokPtr = ptr + MINBPC(enc);
705
48.6k
          return XML_TOK_EMPTY_ELEMENT_WITH_ATTS;
706
1
        default:
707
1
          *nextTokPtr = ptr;
708
1
          return XML_TOK_INVALID;
709
3.25M
        }
710
2.95M
        break;
711
3.25M
      }
712
2.95M
      break;
713
2.96M
    }
714
2.95M
    default:
715
9
      *nextTokPtr = ptr;
716
9
      return XML_TOK_INVALID;
717
4.03M
    }
718
4.03M
  }
719
80
  return XML_TOK_PARTIAL;
720
54.5k
}
xmltok.c:normal_scanAtts
Line
Count
Source
573
54.5k
                 const char **nextTokPtr) {
574
#  ifdef XML_NS
575
  int hadColon = 0;
576
#  endif
577
4.03M
  while (HAS_CHAR(enc, ptr, end)) {
578
4.03M
    switch (BYTE_TYPE(enc, ptr)) {
579
3.39M
      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
4.45k
    case BT_S:
598
20.0k
    case BT_CR:
599
22.4k
    case BT_LF:
600
46.4k
      for (;;) {
601
46.4k
        int t;
602
603
46.4k
        ptr += MINBPC(enc);
604
46.4k
        REQUIRE_CHAR(enc, ptr, end);
605
46.3k
        t = BYTE_TYPE(enc, ptr);
606
46.3k
        if (t == BT_EQUALS)
607
22.3k
          break;
608
24.0k
        switch (t) {
609
5.36k
        case BT_S:
610
7.27k
        case BT_LF:
611
23.9k
        case BT_CR:
612
23.9k
          break;
613
10
        default:
614
10
          *nextTokPtr = ptr;
615
10
          return XML_TOK_INVALID;
616
24.0k
        }
617
24.0k
      }
618
      /* fall through */
619
3.01M
    case BT_EQUALS: {
620
3.01M
      int open;
621
#  ifdef XML_NS
622
      hadColon = 0;
623
#  endif
624
3.08M
      for (;;) {
625
3.08M
        ptr += MINBPC(enc);
626
3.08M
        REQUIRE_CHAR(enc, ptr, end);
627
3.08M
        open = BYTE_TYPE(enc, ptr);
628
3.08M
        if (open == BT_QUOT || open == BT_APOS)
629
3.01M
          break;
630
73.4k
        switch (open) {
631
15.3k
        case BT_S:
632
30.7k
        case BT_LF:
633
73.4k
        case BT_CR:
634
73.4k
          break;
635
13
        default:
636
13
          *nextTokPtr = ptr;
637
13
          return XML_TOK_INVALID;
638
73.4k
        }
639
73.4k
      }
640
3.01M
      ptr += MINBPC(enc);
641
      /* in attribute value */
642
18.7M
      for (;;) {
643
18.7M
        int t;
644
18.7M
        REQUIRE_CHAR(enc, ptr, end);
645
18.7M
        t = BYTE_TYPE(enc, ptr);
646
18.7M
        if (t == open)
647
3.00M
          break;
648
15.7M
        switch (t) {
649
348k
          INVALID_CASES(ptr, nextTokPtr)
650
111k
        case BT_AMP: {
651
111k
          int tok = PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, &ptr);
652
111k
          if (tok <= 0) {
653
49
            if (tok == XML_TOK_INVALID)
654
25
              *nextTokPtr = ptr;
655
49
            return tok;
656
49
          }
657
111k
          break;
658
111k
        }
659
111k
        case BT_LT:
660
8
          *nextTokPtr = ptr;
661
8
          return XML_TOK_INVALID;
662
15.4M
        default:
663
15.4M
          ptr += MINBPC(enc);
664
15.4M
          break;
665
15.7M
        }
666
15.7M
      }
667
3.00M
      ptr += MINBPC(enc);
668
3.00M
      REQUIRE_CHAR(enc, ptr, end);
669
3.00M
      switch (BYTE_TYPE(enc, ptr)) {
670
1.54M
      case BT_S:
671
2.94M
      case BT_CR:
672
2.96M
      case BT_LF:
673
2.96M
        break;
674
35.4k
      case BT_SOL:
675
35.4k
        goto sol;
676
4.88k
      case BT_GT:
677
4.88k
        goto gt;
678
2
      default:
679
2
        *nextTokPtr = ptr;
680
2
        return XML_TOK_INVALID;
681
3.00M
      }
682
      /* ptr points to closing quote */
683
3.25M
      for (;;) {
684
3.25M
        ptr += MINBPC(enc);
685
3.25M
        REQUIRE_CHAR(enc, ptr, end);
686
3.25M
        switch (BYTE_TYPE(enc, ptr)) {
687
2.95M
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
688
199k
        case BT_S:
689
253k
        case BT_CR:
690
287k
        case BT_LF:
691
287k
          continue;
692
424
        case BT_GT:
693
5.31k
        gt:
694
5.31k
          *nextTokPtr = ptr + MINBPC(enc);
695
5.31k
          return XML_TOK_START_TAG_WITH_ATTS;
696
13.2k
        case BT_SOL:
697
48.6k
        sol:
698
48.6k
          ptr += MINBPC(enc);
699
48.6k
          REQUIRE_CHAR(enc, ptr, end);
700
48.6k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
701
6
            *nextTokPtr = ptr;
702
6
            return XML_TOK_INVALID;
703
6
          }
704
48.6k
          *nextTokPtr = ptr + MINBPC(enc);
705
48.6k
          return XML_TOK_EMPTY_ELEMENT_WITH_ATTS;
706
1
        default:
707
1
          *nextTokPtr = ptr;
708
1
          return XML_TOK_INVALID;
709
3.25M
        }
710
2.95M
        break;
711
3.25M
      }
712
2.95M
      break;
713
2.96M
    }
714
2.95M
    default:
715
9
      *nextTokPtr = ptr;
716
9
      return XML_TOK_INVALID;
717
4.03M
    }
718
4.03M
  }
719
80
  return XML_TOK_PARTIAL;
720
54.5k
}
Unexecuted instantiation: xmltok.c:little2_scanAtts
Unexecuted instantiation: xmltok.c:big2_scanAtts
721
722
/* ptr points to character following "<" */
723
724
static int PTRCALL
725
PREFIX(scanLt)(const ENCODING *enc, const char *ptr, const char *end,
726
426k
               const char **nextTokPtr) {
727
#  ifdef XML_NS
728
  int hadColon;
729
#  endif
730
426k
  REQUIRE_CHAR(enc, ptr, end);
731
426k
  switch (BYTE_TYPE(enc, ptr)) {
732
276k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
733
26.0k
  case BT_EXCL:
734
26.0k
    ptr += MINBPC(enc);
735
26.0k
    REQUIRE_CHAR(enc, ptr, end);
736
26.0k
    switch (BYTE_TYPE(enc, ptr)) {
737
23.6k
    case BT_MINUS:
738
23.6k
      return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
739
2.44k
    case BT_LSQB:
740
2.44k
      return PREFIX(scanCdataSection)(enc, ptr + MINBPC(enc), end, nextTokPtr);
741
26.0k
    }
742
2
    *nextTokPtr = ptr;
743
2
    return XML_TOK_INVALID;
744
39.8k
  case BT_QUEST:
745
39.8k
    return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
746
57.5k
  case BT_SOL:
747
57.5k
    return PREFIX(scanEndTag)(enc, ptr + MINBPC(enc), end, nextTokPtr);
748
6
  default:
749
6
    *nextTokPtr = ptr;
750
6
    return XML_TOK_INVALID;
751
426k
  }
752
#  ifdef XML_NS
753
  hadColon = 0;
754
#  endif
755
  /* we have a start-tag */
756
8.29M
  while (HAS_CHAR(enc, ptr, end)) {
757
8.29M
    switch (BYTE_TYPE(enc, ptr)) {
758
31.3M
      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
48.0k
    case BT_S:
777
59.8k
    case BT_CR:
778
66.5k
    case BT_LF: {
779
66.5k
      ptr += MINBPC(enc);
780
113k
      while (HAS_CHAR(enc, ptr, end)) {
781
113k
        switch (BYTE_TYPE(enc, ptr)) {
782
36.9k
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
783
1.39k
        case BT_GT:
784
1.39k
          goto gt;
785
10.5k
        case BT_SOL:
786
10.5k
          goto sol;
787
4.20k
        case BT_S:
788
37.1k
        case BT_CR:
789
46.7k
        case BT_LF:
790
46.7k
          ptr += MINBPC(enc);
791
46.7k
          continue;
792
2
        default:
793
2
          *nextTokPtr = ptr;
794
2
          return XML_TOK_INVALID;
795
113k
        }
796
54.5k
        return PREFIX(scanAtts)(enc, ptr, end, nextTokPtr);
797
113k
      }
798
50
      return XML_TOK_PARTIAL;
799
66.5k
    }
800
169k
    case BT_GT:
801
171k
    gt:
802
171k
      *nextTokPtr = ptr + MINBPC(enc);
803
171k
      return XML_TOK_START_TAG_NO_ATTS;
804
66.0k
    case BT_SOL:
805
76.5k
    sol:
806
76.5k
      ptr += MINBPC(enc);
807
76.5k
      REQUIRE_CHAR(enc, ptr, end);
808
76.5k
      if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
809
11
        *nextTokPtr = ptr;
810
11
        return XML_TOK_INVALID;
811
11
      }
812
76.5k
      *nextTokPtr = ptr + MINBPC(enc);
813
76.5k
      return XML_TOK_EMPTY_ELEMENT_NO_ATTS;
814
10
    default:
815
10
      *nextTokPtr = ptr;
816
10
      return XML_TOK_INVALID;
817
8.29M
    }
818
8.29M
  }
819
152
  return XML_TOK_PARTIAL;
820
302k
}
xmltok.c:normal_scanLt
Line
Count
Source
726
426k
               const char **nextTokPtr) {
727
#  ifdef XML_NS
728
  int hadColon;
729
#  endif
730
426k
  REQUIRE_CHAR(enc, ptr, end);
731
426k
  switch (BYTE_TYPE(enc, ptr)) {
732
276k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
733
26.0k
  case BT_EXCL:
734
26.0k
    ptr += MINBPC(enc);
735
26.0k
    REQUIRE_CHAR(enc, ptr, end);
736
26.0k
    switch (BYTE_TYPE(enc, ptr)) {
737
23.6k
    case BT_MINUS:
738
23.6k
      return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
739
2.44k
    case BT_LSQB:
740
2.44k
      return PREFIX(scanCdataSection)(enc, ptr + MINBPC(enc), end, nextTokPtr);
741
26.0k
    }
742
2
    *nextTokPtr = ptr;
743
2
    return XML_TOK_INVALID;
744
39.8k
  case BT_QUEST:
745
39.8k
    return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
746
57.5k
  case BT_SOL:
747
57.5k
    return PREFIX(scanEndTag)(enc, ptr + MINBPC(enc), end, nextTokPtr);
748
6
  default:
749
6
    *nextTokPtr = ptr;
750
6
    return XML_TOK_INVALID;
751
426k
  }
752
#  ifdef XML_NS
753
  hadColon = 0;
754
#  endif
755
  /* we have a start-tag */
756
8.29M
  while (HAS_CHAR(enc, ptr, end)) {
757
8.29M
    switch (BYTE_TYPE(enc, ptr)) {
758
31.3M
      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
48.0k
    case BT_S:
777
59.8k
    case BT_CR:
778
66.5k
    case BT_LF: {
779
66.5k
      ptr += MINBPC(enc);
780
113k
      while (HAS_CHAR(enc, ptr, end)) {
781
113k
        switch (BYTE_TYPE(enc, ptr)) {
782
36.9k
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
783
1.39k
        case BT_GT:
784
1.39k
          goto gt;
785
10.5k
        case BT_SOL:
786
10.5k
          goto sol;
787
4.20k
        case BT_S:
788
37.1k
        case BT_CR:
789
46.7k
        case BT_LF:
790
46.7k
          ptr += MINBPC(enc);
791
46.7k
          continue;
792
2
        default:
793
2
          *nextTokPtr = ptr;
794
2
          return XML_TOK_INVALID;
795
113k
        }
796
54.5k
        return PREFIX(scanAtts)(enc, ptr, end, nextTokPtr);
797
113k
      }
798
50
      return XML_TOK_PARTIAL;
799
66.5k
    }
800
169k
    case BT_GT:
801
171k
    gt:
802
171k
      *nextTokPtr = ptr + MINBPC(enc);
803
171k
      return XML_TOK_START_TAG_NO_ATTS;
804
66.0k
    case BT_SOL:
805
76.5k
    sol:
806
76.5k
      ptr += MINBPC(enc);
807
76.5k
      REQUIRE_CHAR(enc, ptr, end);
808
76.5k
      if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
809
11
        *nextTokPtr = ptr;
810
11
        return XML_TOK_INVALID;
811
11
      }
812
76.5k
      *nextTokPtr = ptr + MINBPC(enc);
813
76.5k
      return XML_TOK_EMPTY_ELEMENT_NO_ATTS;
814
10
    default:
815
10
      *nextTokPtr = ptr;
816
10
      return XML_TOK_INVALID;
817
8.29M
    }
818
8.29M
  }
819
152
  return XML_TOK_PARTIAL;
820
302k
}
Unexecuted instantiation: xmltok.c:little2_scanLt
Unexecuted instantiation: xmltok.c:big2_scanLt
821
822
static int PTRCALL
823
PREFIX(contentTok)(const ENCODING *enc, const char *ptr, const char *end,
824
4.70M
                   const char **nextTokPtr) {
825
4.70M
  if (ptr >= end)
826
2.50k
    return XML_TOK_NONE;
827
4.69M
  if (MINBPC(enc) > 1) {
828
0
    size_t n = end - ptr;
829
0
    if (n & (MINBPC(enc) - 1)) {
830
0
      n &= ~(MINBPC(enc) - 1);
831
0
      if (n == 0)
832
0
        return XML_TOK_PARTIAL;
833
0
      end = ptr + n;
834
0
    }
835
0
  }
836
4.69M
  switch (BYTE_TYPE(enc, ptr)) {
837
426k
  case BT_LT:
838
426k
    return PREFIX(scanLt)(enc, ptr + MINBPC(enc), end, nextTokPtr);
839
33.5k
  case BT_AMP:
840
33.5k
    return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
841
1.80M
  case BT_CR:
842
1.80M
    ptr += MINBPC(enc);
843
1.80M
    if (! HAS_CHAR(enc, ptr, end))
844
18
      return XML_TOK_TRAILING_CR;
845
1.80M
    if (BYTE_TYPE(enc, ptr) == BT_LF)
846
352k
      ptr += MINBPC(enc);
847
1.80M
    *nextTokPtr = ptr;
848
1.80M
    return XML_TOK_DATA_NEWLINE;
849
1.37M
  case BT_LF:
850
1.37M
    *nextTokPtr = ptr + MINBPC(enc);
851
1.37M
    return XML_TOK_DATA_NEWLINE;
852
87.8k
  case BT_RSQB:
853
87.8k
    ptr += MINBPC(enc);
854
87.8k
    if (! HAS_CHAR(enc, ptr, end))
855
6
      return XML_TOK_TRAILING_RSQB;
856
87.7k
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
857
30.4k
      break;
858
57.3k
    ptr += MINBPC(enc);
859
57.3k
    if (! HAS_CHAR(enc, ptr, end))
860
4
      return XML_TOK_TRAILING_RSQB;
861
57.3k
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
862
57.3k
      ptr -= MINBPC(enc);
863
57.3k
      break;
864
57.3k
    }
865
1
    *nextTokPtr = ptr;
866
1
    return XML_TOK_INVALID;
867
103k
    INVALID_CASES(ptr, nextTokPtr)
868
913k
  default:
869
913k
    ptr += MINBPC(enc);
870
913k
    break;
871
4.69M
  }
872
25.3M
  while (HAS_CHAR(enc, ptr, end)) {
873
25.3M
    switch (BYTE_TYPE(enc, ptr)) {
874
0
#  define LEAD_CASE(n)                                                         \
875
199k
  case BT_LEAD##n:                                                             \
876
199k
    if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) {                       \
877
35
      *nextTokPtr = ptr;                                                       \
878
35
      return XML_TOK_DATA_CHARS;                                               \
879
35
    }                                                                          \
880
199k
    ptr += n;                                                                  \
881
199k
    break;
882
109k
      LEAD_CASE(2)
883
42.9k
      LEAD_CASE(3)
884
46.9k
      LEAD_CASE(4)
885
0
#  undef LEAD_CASE
886
583k
    case BT_RSQB:
887
583k
      if (HAS_CHARS(enc, ptr, end, 2)) {
888
583k
        if (! CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_RSQB)) {
889
194k
          ptr += MINBPC(enc);
890
194k
          break;
891
194k
        }
892
389k
        if (HAS_CHARS(enc, ptr, end, 3)) {
893
389k
          if (! CHAR_MATCHES(enc, ptr + 2 * MINBPC(enc), ASCII_GT)) {
894
389k
            ptr += MINBPC(enc);
895
389k
            break;
896
389k
          }
897
2
          *nextTokPtr = ptr + 2 * MINBPC(enc);
898
2
          return XML_TOK_INVALID;
899
389k
        }
900
389k
      }
901
      /* fall through */
902
20.1k
    case BT_AMP:
903
172k
    case BT_LT:
904
172k
    case BT_NONXML:
905
172k
    case BT_MALFORM:
906
172k
    case BT_TRAIL:
907
745k
    case BT_CR:
908
1.05M
    case BT_LF:
909
1.05M
      *nextTokPtr = ptr;
910
1.05M
      return XML_TOK_DATA_CHARS;
911
23.5M
    default:
912
23.5M
      ptr += MINBPC(enc);
913
23.5M
      break;
914
25.3M
    }
915
25.3M
  }
916
1.17k
  *nextTokPtr = ptr;
917
1.17k
  return XML_TOK_DATA_CHARS;
918
1.05M
}
xmltok.c:normal_contentTok
Line
Count
Source
824
4.70M
                   const char **nextTokPtr) {
825
4.70M
  if (ptr >= end)
826
2.50k
    return XML_TOK_NONE;
827
4.69M
  if (MINBPC(enc) > 1) {
828
0
    size_t n = end - ptr;
829
0
    if (n & (MINBPC(enc) - 1)) {
830
0
      n &= ~(MINBPC(enc) - 1);
831
0
      if (n == 0)
832
0
        return XML_TOK_PARTIAL;
833
0
      end = ptr + n;
834
0
    }
835
0
  }
836
4.69M
  switch (BYTE_TYPE(enc, ptr)) {
837
426k
  case BT_LT:
838
426k
    return PREFIX(scanLt)(enc, ptr + MINBPC(enc), end, nextTokPtr);
839
33.5k
  case BT_AMP:
840
33.5k
    return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
841
1.80M
  case BT_CR:
842
1.80M
    ptr += MINBPC(enc);
843
1.80M
    if (! HAS_CHAR(enc, ptr, end))
844
18
      return XML_TOK_TRAILING_CR;
845
1.80M
    if (BYTE_TYPE(enc, ptr) == BT_LF)
846
352k
      ptr += MINBPC(enc);
847
1.80M
    *nextTokPtr = ptr;
848
1.80M
    return XML_TOK_DATA_NEWLINE;
849
1.37M
  case BT_LF:
850
1.37M
    *nextTokPtr = ptr + MINBPC(enc);
851
1.37M
    return XML_TOK_DATA_NEWLINE;
852
87.8k
  case BT_RSQB:
853
87.8k
    ptr += MINBPC(enc);
854
87.8k
    if (! HAS_CHAR(enc, ptr, end))
855
6
      return XML_TOK_TRAILING_RSQB;
856
87.7k
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
857
30.4k
      break;
858
57.3k
    ptr += MINBPC(enc);
859
57.3k
    if (! HAS_CHAR(enc, ptr, end))
860
4
      return XML_TOK_TRAILING_RSQB;
861
57.3k
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
862
57.3k
      ptr -= MINBPC(enc);
863
57.3k
      break;
864
57.3k
    }
865
1
    *nextTokPtr = ptr;
866
1
    return XML_TOK_INVALID;
867
103k
    INVALID_CASES(ptr, nextTokPtr)
868
913k
  default:
869
913k
    ptr += MINBPC(enc);
870
913k
    break;
871
4.69M
  }
872
25.3M
  while (HAS_CHAR(enc, ptr, end)) {
873
25.3M
    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
109k
      LEAD_CASE(2)
883
42.9k
      LEAD_CASE(3)
884
46.9k
      LEAD_CASE(4)
885
0
#  undef LEAD_CASE
886
583k
    case BT_RSQB:
887
583k
      if (HAS_CHARS(enc, ptr, end, 2)) {
888
583k
        if (! CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_RSQB)) {
889
194k
          ptr += MINBPC(enc);
890
194k
          break;
891
194k
        }
892
389k
        if (HAS_CHARS(enc, ptr, end, 3)) {
893
389k
          if (! CHAR_MATCHES(enc, ptr + 2 * MINBPC(enc), ASCII_GT)) {
894
389k
            ptr += MINBPC(enc);
895
389k
            break;
896
389k
          }
897
2
          *nextTokPtr = ptr + 2 * MINBPC(enc);
898
2
          return XML_TOK_INVALID;
899
389k
        }
900
389k
      }
901
      /* fall through */
902
20.1k
    case BT_AMP:
903
172k
    case BT_LT:
904
172k
    case BT_NONXML:
905
172k
    case BT_MALFORM:
906
172k
    case BT_TRAIL:
907
745k
    case BT_CR:
908
1.05M
    case BT_LF:
909
1.05M
      *nextTokPtr = ptr;
910
1.05M
      return XML_TOK_DATA_CHARS;
911
23.5M
    default:
912
23.5M
      ptr += MINBPC(enc);
913
23.5M
      break;
914
25.3M
    }
915
25.3M
  }
916
1.17k
  *nextTokPtr = ptr;
917
1.17k
  return XML_TOK_DATA_CHARS;
918
1.05M
}
Unexecuted instantiation: xmltok.c:little2_contentTok
Unexecuted instantiation: xmltok.c:big2_contentTok
919
920
/* ptr points to character following "%" */
921
922
static int PTRCALL
923
PREFIX(scanPercent)(const ENCODING *enc, const char *ptr, const char *end,
924
19.2k
                    const char **nextTokPtr) {
925
19.2k
  REQUIRE_CHAR(enc, ptr, end);
926
19.1k
  switch (BYTE_TYPE(enc, ptr)) {
927
30.5k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
928
492
  case BT_S:
929
1.05k
  case BT_LF:
930
1.58k
  case BT_CR:
931
1.58k
  case BT_PERCNT:
932
1.58k
    *nextTokPtr = ptr;
933
1.58k
    return XML_TOK_PERCENT;
934
3
  default:
935
3
    *nextTokPtr = ptr;
936
3
    return XML_TOK_INVALID;
937
19.1k
  }
938
421k
  while (HAS_CHAR(enc, ptr, end)) {
939
421k
    switch (BYTE_TYPE(enc, ptr)) {
940
1.24M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
941
17.4k
    case BT_SEMI:
942
17.4k
      *nextTokPtr = ptr + MINBPC(enc);
943
17.4k
      return XML_TOK_PARAM_ENTITY_REF;
944
23
    default:
945
23
      *nextTokPtr = ptr;
946
23
      return XML_TOK_INVALID;
947
421k
    }
948
421k
  }
949
56
  return XML_TOK_PARTIAL;
950
17.5k
}
xmltok.c:normal_scanPercent
Line
Count
Source
924
19.2k
                    const char **nextTokPtr) {
925
19.2k
  REQUIRE_CHAR(enc, ptr, end);
926
19.1k
  switch (BYTE_TYPE(enc, ptr)) {
927
30.5k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
928
492
  case BT_S:
929
1.05k
  case BT_LF:
930
1.58k
  case BT_CR:
931
1.58k
  case BT_PERCNT:
932
1.58k
    *nextTokPtr = ptr;
933
1.58k
    return XML_TOK_PERCENT;
934
3
  default:
935
3
    *nextTokPtr = ptr;
936
3
    return XML_TOK_INVALID;
937
19.1k
  }
938
421k
  while (HAS_CHAR(enc, ptr, end)) {
939
421k
    switch (BYTE_TYPE(enc, ptr)) {
940
1.24M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
941
17.4k
    case BT_SEMI:
942
17.4k
      *nextTokPtr = ptr + MINBPC(enc);
943
17.4k
      return XML_TOK_PARAM_ENTITY_REF;
944
23
    default:
945
23
      *nextTokPtr = ptr;
946
23
      return XML_TOK_INVALID;
947
421k
    }
948
421k
  }
949
56
  return XML_TOK_PARTIAL;
950
17.5k
}
Unexecuted instantiation: xmltok.c:little2_scanPercent
Unexecuted instantiation: xmltok.c:big2_scanPercent
951
952
static int PTRCALL
953
PREFIX(scanPoundName)(const ENCODING *enc, const char *ptr, const char *end,
954
129k
                      const char **nextTokPtr) {
955
129k
  REQUIRE_CHAR(enc, ptr, end);
956
129k
  switch (BYTE_TYPE(enc, ptr)) {
957
128k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
958
3
  default:
959
3
    *nextTokPtr = ptr;
960
3
    return XML_TOK_INVALID;
961
129k
  }
962
980k
  while (HAS_CHAR(enc, ptr, end)) {
963
980k
    switch (BYTE_TYPE(enc, ptr)) {
964
3.08M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
965
45.9k
    case BT_CR:
966
51.5k
    case BT_LF:
967
124k
    case BT_S:
968
125k
    case BT_RPAR:
969
128k
    case BT_GT:
970
128k
    case BT_PERCNT:
971
128k
    case BT_VERBAR:
972
128k
      *nextTokPtr = ptr;
973
128k
      return XML_TOK_POUND_NAME;
974
10
    default:
975
10
      *nextTokPtr = ptr;
976
10
      return XML_TOK_INVALID;
977
980k
    }
978
980k
  }
979
194
  return -XML_TOK_POUND_NAME;
980
129k
}
xmltok.c:normal_scanPoundName
Line
Count
Source
954
129k
                      const char **nextTokPtr) {
955
129k
  REQUIRE_CHAR(enc, ptr, end);
956
129k
  switch (BYTE_TYPE(enc, ptr)) {
957
128k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
958
3
  default:
959
3
    *nextTokPtr = ptr;
960
3
    return XML_TOK_INVALID;
961
129k
  }
962
980k
  while (HAS_CHAR(enc, ptr, end)) {
963
980k
    switch (BYTE_TYPE(enc, ptr)) {
964
3.08M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
965
45.9k
    case BT_CR:
966
51.5k
    case BT_LF:
967
124k
    case BT_S:
968
125k
    case BT_RPAR:
969
128k
    case BT_GT:
970
128k
    case BT_PERCNT:
971
128k
    case BT_VERBAR:
972
128k
      *nextTokPtr = ptr;
973
128k
      return XML_TOK_POUND_NAME;
974
10
    default:
975
10
      *nextTokPtr = ptr;
976
10
      return XML_TOK_INVALID;
977
980k
    }
978
980k
  }
979
194
  return -XML_TOK_POUND_NAME;
980
129k
}
Unexecuted instantiation: xmltok.c:little2_scanPoundName
Unexecuted instantiation: xmltok.c:big2_scanPoundName
981
982
static int PTRCALL
983
PREFIX(scanLit)(int open, const ENCODING *enc, const char *ptr, const char *end,
984
44.8k
                const char **nextTokPtr) {
985
7.18M
  while (HAS_CHAR(enc, ptr, end)) {
986
7.18M
    int t = BYTE_TYPE(enc, ptr);
987
7.18M
    switch (t) {
988
206k
      INVALID_CASES(ptr, nextTokPtr)
989
8.91k
    case BT_QUOT:
990
47.6k
    case BT_APOS:
991
47.6k
      ptr += MINBPC(enc);
992
47.6k
      if (t != open)
993
2.93k
        break;
994
44.6k
      if (! HAS_CHAR(enc, ptr, end))
995
397
        return -XML_TOK_LITERAL;
996
44.2k
      *nextTokPtr = ptr;
997
44.2k
      switch (BYTE_TYPE(enc, ptr)) {
998
5.33k
      case BT_S:
999
8.84k
      case BT_CR:
1000
19.8k
      case BT_LF:
1001
43.8k
      case BT_GT:
1002
43.8k
      case BT_PERCNT:
1003
44.2k
      case BT_LSQB:
1004
44.2k
        return XML_TOK_LITERAL;
1005
13
      default:
1006
13
        return XML_TOK_INVALID;
1007
44.2k
      }
1008
7.03M
    default:
1009
7.03M
      ptr += MINBPC(enc);
1010
7.03M
      break;
1011
7.18M
    }
1012
7.18M
  }
1013
102
  return XML_TOK_PARTIAL;
1014
44.8k
}
xmltok.c:normal_scanLit
Line
Count
Source
984
44.8k
                const char **nextTokPtr) {
985
7.18M
  while (HAS_CHAR(enc, ptr, end)) {
986
7.18M
    int t = BYTE_TYPE(enc, ptr);
987
7.18M
    switch (t) {
988
206k
      INVALID_CASES(ptr, nextTokPtr)
989
8.91k
    case BT_QUOT:
990
47.6k
    case BT_APOS:
991
47.6k
      ptr += MINBPC(enc);
992
47.6k
      if (t != open)
993
2.93k
        break;
994
44.6k
      if (! HAS_CHAR(enc, ptr, end))
995
397
        return -XML_TOK_LITERAL;
996
44.2k
      *nextTokPtr = ptr;
997
44.2k
      switch (BYTE_TYPE(enc, ptr)) {
998
5.33k
      case BT_S:
999
8.84k
      case BT_CR:
1000
19.8k
      case BT_LF:
1001
43.8k
      case BT_GT:
1002
43.8k
      case BT_PERCNT:
1003
44.2k
      case BT_LSQB:
1004
44.2k
        return XML_TOK_LITERAL;
1005
13
      default:
1006
13
        return XML_TOK_INVALID;
1007
44.2k
      }
1008
7.03M
    default:
1009
7.03M
      ptr += MINBPC(enc);
1010
7.03M
      break;
1011
7.18M
    }
1012
7.18M
  }
1013
102
  return XML_TOK_PARTIAL;
1014
44.8k
}
Unexecuted instantiation: xmltok.c:little2_scanLit
Unexecuted instantiation: xmltok.c:big2_scanLit
1015
1016
static int PTRCALL
1017
PREFIX(prologTok)(const ENCODING *enc, const char *ptr, const char *end,
1018
2.97M
                  const char **nextTokPtr) {
1019
2.97M
  int tok;
1020
2.97M
  if (ptr >= end)
1021
8.07k
    return XML_TOK_NONE;
1022
2.96M
  if (MINBPC(enc) > 1) {
1023
226
    size_t n = end - ptr;
1024
226
    if (n & (MINBPC(enc) - 1)) {
1025
51
      n &= ~(MINBPC(enc) - 1);
1026
51
      if (n == 0)
1027
4
        return XML_TOK_PARTIAL;
1028
47
      end = ptr + n;
1029
47
    }
1030
226
  }
1031
2.96M
  switch (BYTE_TYPE(enc, ptr)) {
1032
6.78k
  case BT_QUOT:
1033
6.78k
    return PREFIX(scanLit)(BT_QUOT, enc, ptr + MINBPC(enc), end, nextTokPtr);
1034
38.0k
  case BT_APOS:
1035
38.0k
    return PREFIX(scanLit)(BT_APOS, enc, ptr + MINBPC(enc), end, nextTokPtr);
1036
70.3k
  case BT_LT: {
1037
70.3k
    ptr += MINBPC(enc);
1038
70.3k
    REQUIRE_CHAR(enc, ptr, end);
1039
70.3k
    switch (BYTE_TYPE(enc, ptr)) {
1040
57.2k
    case BT_EXCL:
1041
57.2k
      return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1042
7.50k
    case BT_QUEST:
1043
7.50k
      return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1044
4.26k
    case BT_NMSTRT:
1045
5.49k
    case BT_HEX:
1046
5.49k
    case BT_NONASCII:
1047
5.55k
    case BT_LEAD2:
1048
5.57k
    case BT_LEAD3:
1049
5.58k
    case BT_LEAD4:
1050
5.58k
      *nextTokPtr = ptr - MINBPC(enc);
1051
5.58k
      return XML_TOK_INSTANCE_START;
1052
70.3k
    }
1053
17
    *nextTokPtr = ptr;
1054
17
    return XML_TOK_INVALID;
1055
70.3k
  }
1056
245k
  case BT_CR:
1057
245k
    if (ptr + MINBPC(enc) == end) {
1058
296
      *nextTokPtr = end;
1059
      /* indicate that this might be part of a CR/LF pair */
1060
296
      return -XML_TOK_PROLOG_S;
1061
296
    }
1062
    /* fall through */
1063
512k
  case BT_S:
1064
568k
  case BT_LF:
1065
595k
    for (;;) {
1066
595k
      ptr += MINBPC(enc);
1067
595k
      if (! HAS_CHAR(enc, ptr, end))
1068
190
        break;
1069
595k
      switch (BYTE_TYPE(enc, ptr)) {
1070
13.2k
      case BT_S:
1071
21.3k
      case BT_LF:
1072
21.3k
        break;
1073
5.72k
      case BT_CR:
1074
        /* don't split CR/LF pair */
1075
5.72k
        if (ptr + MINBPC(enc) != end)
1076
5.58k
          break;
1077
        /* fall through */
1078
568k
      default:
1079
568k
        *nextTokPtr = ptr;
1080
568k
        return XML_TOK_PROLOG_S;
1081
595k
      }
1082
595k
    }
1083
190
    *nextTokPtr = ptr;
1084
190
    return XML_TOK_PROLOG_S;
1085
19.2k
  case BT_PERCNT:
1086
19.2k
    return PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1087
1.25k
  case BT_COMMA:
1088
1.25k
    *nextTokPtr = ptr + MINBPC(enc);
1089
1.25k
    return XML_TOK_COMMA;
1090
2.54k
  case BT_LSQB:
1091
2.54k
    *nextTokPtr = ptr + MINBPC(enc);
1092
2.54k
    return XML_TOK_OPEN_BRACKET;
1093
1.35k
  case BT_RSQB:
1094
1.35k
    ptr += MINBPC(enc);
1095
1.35k
    if (! HAS_CHAR(enc, ptr, end))
1096
7
      return -XML_TOK_CLOSE_BRACKET;
1097
1.35k
    if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) {
1098
26
      REQUIRE_CHARS(enc, ptr, end, 2);
1099
24
      if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_GT)) {
1100
1
        *nextTokPtr = ptr + 2 * MINBPC(enc);
1101
1
        return XML_TOK_COND_SECT_CLOSE;
1102
1
      }
1103
24
    }
1104
1.34k
    *nextTokPtr = ptr;
1105
1.34k
    return XML_TOK_CLOSE_BRACKET;
1106
1.54M
  case BT_LPAR:
1107
1.54M
    *nextTokPtr = ptr + MINBPC(enc);
1108
1.54M
    return XML_TOK_OPEN_PAREN;
1109
137k
  case BT_RPAR:
1110
137k
    ptr += MINBPC(enc);
1111
137k
    if (! HAS_CHAR(enc, ptr, end))
1112
91
      return -XML_TOK_CLOSE_PAREN;
1113
137k
    switch (BYTE_TYPE(enc, ptr)) {
1114
3.05k
    case BT_AST:
1115
3.05k
      *nextTokPtr = ptr + MINBPC(enc);
1116
3.05k
      return XML_TOK_CLOSE_PAREN_ASTERISK;
1117
658
    case BT_QUEST:
1118
658
      *nextTokPtr = ptr + MINBPC(enc);
1119
658
      return XML_TOK_CLOSE_PAREN_QUESTION;
1120
963
    case BT_PLUS:
1121
963
      *nextTokPtr = ptr + MINBPC(enc);
1122
963
      return XML_TOK_CLOSE_PAREN_PLUS;
1123
7.14k
    case BT_CR:
1124
7.58k
    case BT_LF:
1125
123k
    case BT_S:
1126
124k
    case BT_GT:
1127
125k
    case BT_COMMA:
1128
129k
    case BT_VERBAR:
1129
133k
    case BT_RPAR:
1130
133k
      *nextTokPtr = ptr;
1131
133k
      return XML_TOK_CLOSE_PAREN;
1132
137k
    }
1133
10
    *nextTokPtr = ptr;
1134
10
    return XML_TOK_INVALID;
1135
12.1k
  case BT_VERBAR:
1136
12.1k
    *nextTokPtr = ptr + MINBPC(enc);
1137
12.1k
    return XML_TOK_OR;
1138
52.8k
  case BT_GT:
1139
52.8k
    *nextTokPtr = ptr + MINBPC(enc);
1140
52.8k
    return XML_TOK_DECL_CLOSE;
1141
129k
  case BT_NUM:
1142
129k
    return PREFIX(scanPoundName)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1143
0
#  define LEAD_CASE(n)                                                         \
1144
5.36k
  case BT_LEAD##n:                                                             \
1145
5.36k
    if (end - ptr < n)                                                         \
1146
70
      return XML_TOK_PARTIAL_CHAR;                                             \
1147
5.29k
    if (IS_INVALID_CHAR(enc, ptr, n)) {                                        \
1148
80
      *nextTokPtr = ptr;                                                       \
1149
80
      return XML_TOK_INVALID;                                                  \
1150
80
    }                                                                          \
1151
5.29k
    if (IS_NMSTRT_CHAR(enc, ptr, n)) {                                         \
1152
3.98k
      ptr += n;                                                                \
1153
3.98k
      tok = XML_TOK_NAME;                                                      \
1154
3.98k
      break;                                                                   \
1155
3.98k
    }                                                                          \
1156
5.21k
    if (IS_NAME_CHAR(enc, ptr, n)) {                                           \
1157
1.15k
      ptr += n;                                                                \
1158
1.15k
      tok = XML_TOK_NMTOKEN;                                                   \
1159
1.15k
      break;                                                                   \
1160
1.15k
    }                                                                          \
1161
1.22k
    *nextTokPtr = ptr;                                                         \
1162
70
    return XML_TOK_INVALID;
1163
4.86k
    LEAD_CASE(2)
1164
11.9k
    LEAD_CASE(3)
1165
258
    LEAD_CASE(4)
1166
0
#  undef LEAD_CASE
1167
208k
  case BT_NMSTRT:
1168
375k
  case BT_HEX:
1169
375k
    tok = XML_TOK_NAME;
1170
375k
    ptr += MINBPC(enc);
1171
375k
    break;
1172
741
  case BT_DIGIT:
1173
1.02k
  case BT_NAME:
1174
1.41k
  case BT_MINUS:
1175
#  ifdef XML_NS
1176
  case BT_COLON:
1177
#  endif
1178
1.41k
    tok = XML_TOK_NMTOKEN;
1179
1.41k
    ptr += MINBPC(enc);
1180
1.41k
    break;
1181
170
  case BT_NONASCII:
1182
170
    if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {
1183
132
      ptr += MINBPC(enc);
1184
132
      tok = XML_TOK_NAME;
1185
132
      break;
1186
132
    }
1187
38
    if (IS_NAME_CHAR_MINBPC(enc, ptr)) {
1188
16
      ptr += MINBPC(enc);
1189
16
      tok = XML_TOK_NMTOKEN;
1190
16
      break;
1191
16
    }
1192
    /* fall through */
1193
76
  default:
1194
76
    *nextTokPtr = ptr;
1195
76
    return XML_TOK_INVALID;
1196
2.96M
  }
1197
10.3M
  while (HAS_CHAR(enc, ptr, end)) {
1198
10.3M
    switch (BYTE_TYPE(enc, ptr)) {
1199
28.5M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1200
19.1k
    case BT_GT:
1201
146k
    case BT_RPAR:
1202
146k
    case BT_COMMA:
1203
152k
    case BT_VERBAR:
1204
154k
    case BT_LSQB:
1205
154k
    case BT_PERCNT:
1206
205k
    case BT_S:
1207
355k
    case BT_CR:
1208
379k
    case BT_LF:
1209
379k
      *nextTokPtr = ptr;
1210
379k
      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
286
    case BT_PLUS:
1232
286
      if (tok == XML_TOK_NMTOKEN) {
1233
1
        *nextTokPtr = ptr;
1234
1
        return XML_TOK_INVALID;
1235
1
      }
1236
285
      *nextTokPtr = ptr + MINBPC(enc);
1237
285
      return XML_TOK_NAME_PLUS;
1238
1.06k
    case BT_AST:
1239
1.06k
      if (tok == XML_TOK_NMTOKEN) {
1240
1
        *nextTokPtr = ptr;
1241
1
        return XML_TOK_INVALID;
1242
1
      }
1243
1.05k
      *nextTokPtr = ptr + MINBPC(enc);
1244
1.05k
      return XML_TOK_NAME_ASTERISK;
1245
752
    case BT_QUEST:
1246
752
      if (tok == XML_TOK_NMTOKEN) {
1247
2
        *nextTokPtr = ptr;
1248
2
        return XML_TOK_INVALID;
1249
2
      }
1250
750
      *nextTokPtr = ptr + MINBPC(enc);
1251
750
      return XML_TOK_NAME_QUESTION;
1252
62
    default:
1253
62
      *nextTokPtr = ptr;
1254
62
      return XML_TOK_INVALID;
1255
10.3M
    }
1256
10.3M
  }
1257
593
  return -tok;
1258
382k
}
xmltok.c:normal_prologTok
Line
Count
Source
1018
2.97M
                  const char **nextTokPtr) {
1019
2.97M
  int tok;
1020
2.97M
  if (ptr >= end)
1021
8.07k
    return XML_TOK_NONE;
1022
2.96M
  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
2.96M
  switch (BYTE_TYPE(enc, ptr)) {
1032
6.78k
  case BT_QUOT:
1033
6.78k
    return PREFIX(scanLit)(BT_QUOT, enc, ptr + MINBPC(enc), end, nextTokPtr);
1034
38.0k
  case BT_APOS:
1035
38.0k
    return PREFIX(scanLit)(BT_APOS, enc, ptr + MINBPC(enc), end, nextTokPtr);
1036
70.3k
  case BT_LT: {
1037
70.3k
    ptr += MINBPC(enc);
1038
70.3k
    REQUIRE_CHAR(enc, ptr, end);
1039
70.3k
    switch (BYTE_TYPE(enc, ptr)) {
1040
57.2k
    case BT_EXCL:
1041
57.2k
      return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1042
7.50k
    case BT_QUEST:
1043
7.50k
      return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1044
4.26k
    case BT_NMSTRT:
1045
5.49k
    case BT_HEX:
1046
5.49k
    case BT_NONASCII:
1047
5.55k
    case BT_LEAD2:
1048
5.57k
    case BT_LEAD3:
1049
5.58k
    case BT_LEAD4:
1050
5.58k
      *nextTokPtr = ptr - MINBPC(enc);
1051
5.58k
      return XML_TOK_INSTANCE_START;
1052
70.3k
    }
1053
17
    *nextTokPtr = ptr;
1054
17
    return XML_TOK_INVALID;
1055
70.3k
  }
1056
245k
  case BT_CR:
1057
245k
    if (ptr + MINBPC(enc) == end) {
1058
296
      *nextTokPtr = end;
1059
      /* indicate that this might be part of a CR/LF pair */
1060
296
      return -XML_TOK_PROLOG_S;
1061
296
    }
1062
    /* fall through */
1063
512k
  case BT_S:
1064
568k
  case BT_LF:
1065
595k
    for (;;) {
1066
595k
      ptr += MINBPC(enc);
1067
595k
      if (! HAS_CHAR(enc, ptr, end))
1068
190
        break;
1069
595k
      switch (BYTE_TYPE(enc, ptr)) {
1070
13.2k
      case BT_S:
1071
21.3k
      case BT_LF:
1072
21.3k
        break;
1073
5.72k
      case BT_CR:
1074
        /* don't split CR/LF pair */
1075
5.72k
        if (ptr + MINBPC(enc) != end)
1076
5.58k
          break;
1077
        /* fall through */
1078
568k
      default:
1079
568k
        *nextTokPtr = ptr;
1080
568k
        return XML_TOK_PROLOG_S;
1081
595k
      }
1082
595k
    }
1083
190
    *nextTokPtr = ptr;
1084
190
    return XML_TOK_PROLOG_S;
1085
19.2k
  case BT_PERCNT:
1086
19.2k
    return PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1087
1.25k
  case BT_COMMA:
1088
1.25k
    *nextTokPtr = ptr + MINBPC(enc);
1089
1.25k
    return XML_TOK_COMMA;
1090
2.54k
  case BT_LSQB:
1091
2.54k
    *nextTokPtr = ptr + MINBPC(enc);
1092
2.54k
    return XML_TOK_OPEN_BRACKET;
1093
1.35k
  case BT_RSQB:
1094
1.35k
    ptr += MINBPC(enc);
1095
1.35k
    if (! HAS_CHAR(enc, ptr, end))
1096
7
      return -XML_TOK_CLOSE_BRACKET;
1097
1.35k
    if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) {
1098
26
      REQUIRE_CHARS(enc, ptr, end, 2);
1099
24
      if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_GT)) {
1100
1
        *nextTokPtr = ptr + 2 * MINBPC(enc);
1101
1
        return XML_TOK_COND_SECT_CLOSE;
1102
1
      }
1103
24
    }
1104
1.34k
    *nextTokPtr = ptr;
1105
1.34k
    return XML_TOK_CLOSE_BRACKET;
1106
1.54M
  case BT_LPAR:
1107
1.54M
    *nextTokPtr = ptr + MINBPC(enc);
1108
1.54M
    return XML_TOK_OPEN_PAREN;
1109
137k
  case BT_RPAR:
1110
137k
    ptr += MINBPC(enc);
1111
137k
    if (! HAS_CHAR(enc, ptr, end))
1112
91
      return -XML_TOK_CLOSE_PAREN;
1113
137k
    switch (BYTE_TYPE(enc, ptr)) {
1114
3.05k
    case BT_AST:
1115
3.05k
      *nextTokPtr = ptr + MINBPC(enc);
1116
3.05k
      return XML_TOK_CLOSE_PAREN_ASTERISK;
1117
658
    case BT_QUEST:
1118
658
      *nextTokPtr = ptr + MINBPC(enc);
1119
658
      return XML_TOK_CLOSE_PAREN_QUESTION;
1120
963
    case BT_PLUS:
1121
963
      *nextTokPtr = ptr + MINBPC(enc);
1122
963
      return XML_TOK_CLOSE_PAREN_PLUS;
1123
7.14k
    case BT_CR:
1124
7.58k
    case BT_LF:
1125
123k
    case BT_S:
1126
124k
    case BT_GT:
1127
125k
    case BT_COMMA:
1128
129k
    case BT_VERBAR:
1129
133k
    case BT_RPAR:
1130
133k
      *nextTokPtr = ptr;
1131
133k
      return XML_TOK_CLOSE_PAREN;
1132
137k
    }
1133
10
    *nextTokPtr = ptr;
1134
10
    return XML_TOK_INVALID;
1135
12.1k
  case BT_VERBAR:
1136
12.1k
    *nextTokPtr = ptr + MINBPC(enc);
1137
12.1k
    return XML_TOK_OR;
1138
52.8k
  case BT_GT:
1139
52.8k
    *nextTokPtr = ptr + MINBPC(enc);
1140
52.8k
    return XML_TOK_DECL_CLOSE;
1141
129k
  case BT_NUM:
1142
129k
    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
4.86k
    LEAD_CASE(2)
1164
11.9k
    LEAD_CASE(3)
1165
144
    LEAD_CASE(4)
1166
0
#  undef LEAD_CASE
1167
208k
  case BT_NMSTRT:
1168
375k
  case BT_HEX:
1169
375k
    tok = XML_TOK_NAME;
1170
375k
    ptr += MINBPC(enc);
1171
375k
    break;
1172
741
  case BT_DIGIT:
1173
1.02k
  case BT_NAME:
1174
1.41k
  case BT_MINUS:
1175
#  ifdef XML_NS
1176
  case BT_COLON:
1177
#  endif
1178
1.41k
    tok = XML_TOK_NMTOKEN;
1179
1.41k
    ptr += MINBPC(enc);
1180
1.41k
    break;
1181
0
  case BT_NONASCII:
1182
0
    if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {
1183
0
      ptr += MINBPC(enc);
1184
0
      tok = XML_TOK_NAME;
1185
0
      break;
1186
0
    }
1187
0
    if (IS_NAME_CHAR_MINBPC(enc, ptr)) {
1188
0
      ptr += MINBPC(enc);
1189
0
      tok = XML_TOK_NMTOKEN;
1190
0
      break;
1191
0
    }
1192
    /* fall through */
1193
44
  default:
1194
44
    *nextTokPtr = ptr;
1195
44
    return XML_TOK_INVALID;
1196
2.96M
  }
1197
10.3M
  while (HAS_CHAR(enc, ptr, end)) {
1198
10.3M
    switch (BYTE_TYPE(enc, ptr)) {
1199
28.4M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1200
19.1k
    case BT_GT:
1201
146k
    case BT_RPAR:
1202
146k
    case BT_COMMA:
1203
152k
    case BT_VERBAR:
1204
154k
    case BT_LSQB:
1205
154k
    case BT_PERCNT:
1206
205k
    case BT_S:
1207
355k
    case BT_CR:
1208
379k
    case BT_LF:
1209
379k
      *nextTokPtr = ptr;
1210
379k
      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
286
    case BT_PLUS:
1232
286
      if (tok == XML_TOK_NMTOKEN) {
1233
1
        *nextTokPtr = ptr;
1234
1
        return XML_TOK_INVALID;
1235
1
      }
1236
285
      *nextTokPtr = ptr + MINBPC(enc);
1237
285
      return XML_TOK_NAME_PLUS;
1238
1.06k
    case BT_AST:
1239
1.06k
      if (tok == XML_TOK_NMTOKEN) {
1240
1
        *nextTokPtr = ptr;
1241
1
        return XML_TOK_INVALID;
1242
1
      }
1243
1.05k
      *nextTokPtr = ptr + MINBPC(enc);
1244
1.05k
      return XML_TOK_NAME_ASTERISK;
1245
752
    case BT_QUEST:
1246
752
      if (tok == XML_TOK_NMTOKEN) {
1247
2
        *nextTokPtr = ptr;
1248
2
        return XML_TOK_INVALID;
1249
2
      }
1250
750
      *nextTokPtr = ptr + MINBPC(enc);
1251
750
      return XML_TOK_NAME_QUESTION;
1252
44
    default:
1253
44
      *nextTokPtr = ptr;
1254
44
      return XML_TOK_INVALID;
1255
10.3M
    }
1256
10.3M
  }
1257
553
  return -tok;
1258
382k
}
xmltok.c:little2_prologTok
Line
Count
Source
1018
125
                  const char **nextTokPtr) {
1019
125
  int tok;
1020
125
  if (ptr >= end)
1021
2
    return XML_TOK_NONE;
1022
123
  if (MINBPC(enc) > 1) {
1023
123
    size_t n = end - ptr;
1024
123
    if (n & (MINBPC(enc) - 1)) {
1025
32
      n &= ~(MINBPC(enc) - 1);
1026
32
      if (n == 0)
1027
2
        return XML_TOK_PARTIAL;
1028
30
      end = ptr + n;
1029
30
    }
1030
123
  }
1031
121
  switch (BYTE_TYPE(enc, ptr)) {
1032
0
  case BT_QUOT:
1033
0
    return PREFIX(scanLit)(BT_QUOT, enc, ptr + MINBPC(enc), end, nextTokPtr);
1034
0
  case BT_APOS:
1035
0
    return PREFIX(scanLit)(BT_APOS, enc, ptr + MINBPC(enc), end, nextTokPtr);
1036
0
  case BT_LT: {
1037
0
    ptr += MINBPC(enc);
1038
0
    REQUIRE_CHAR(enc, ptr, end);
1039
0
    switch (BYTE_TYPE(enc, ptr)) {
1040
0
    case BT_EXCL:
1041
0
      return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1042
0
    case BT_QUEST:
1043
0
      return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1044
0
    case BT_NMSTRT:
1045
0
    case BT_HEX:
1046
0
    case BT_NONASCII:
1047
0
    case BT_LEAD2:
1048
0
    case BT_LEAD3:
1049
0
    case BT_LEAD4:
1050
0
      *nextTokPtr = ptr - MINBPC(enc);
1051
0
      return XML_TOK_INSTANCE_START;
1052
0
    }
1053
0
    *nextTokPtr = ptr;
1054
0
    return XML_TOK_INVALID;
1055
0
  }
1056
0
  case BT_CR:
1057
0
    if (ptr + MINBPC(enc) == end) {
1058
0
      *nextTokPtr = end;
1059
      /* indicate that this might be part of a CR/LF pair */
1060
0
      return -XML_TOK_PROLOG_S;
1061
0
    }
1062
    /* fall through */
1063
0
  case BT_S:
1064
0
  case BT_LF:
1065
0
    for (;;) {
1066
0
      ptr += MINBPC(enc);
1067
0
      if (! HAS_CHAR(enc, ptr, end))
1068
0
        break;
1069
0
      switch (BYTE_TYPE(enc, ptr)) {
1070
0
      case BT_S:
1071
0
      case BT_LF:
1072
0
        break;
1073
0
      case BT_CR:
1074
        /* don't split CR/LF pair */
1075
0
        if (ptr + MINBPC(enc) != end)
1076
0
          break;
1077
        /* fall through */
1078
0
      default:
1079
0
        *nextTokPtr = ptr;
1080
0
        return XML_TOK_PROLOG_S;
1081
0
      }
1082
0
    }
1083
0
    *nextTokPtr = ptr;
1084
0
    return XML_TOK_PROLOG_S;
1085
0
  case BT_PERCNT:
1086
0
    return PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1087
0
  case BT_COMMA:
1088
0
    *nextTokPtr = ptr + MINBPC(enc);
1089
0
    return XML_TOK_COMMA;
1090
0
  case BT_LSQB:
1091
0
    *nextTokPtr = ptr + MINBPC(enc);
1092
0
    return XML_TOK_OPEN_BRACKET;
1093
0
  case BT_RSQB:
1094
0
    ptr += MINBPC(enc);
1095
0
    if (! HAS_CHAR(enc, ptr, end))
1096
0
      return -XML_TOK_CLOSE_BRACKET;
1097
0
    if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) {
1098
0
      REQUIRE_CHARS(enc, ptr, end, 2);
1099
0
      if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_GT)) {
1100
0
        *nextTokPtr = ptr + 2 * MINBPC(enc);
1101
0
        return XML_TOK_COND_SECT_CLOSE;
1102
0
      }
1103
0
    }
1104
0
    *nextTokPtr = ptr;
1105
0
    return XML_TOK_CLOSE_BRACKET;
1106
0
  case BT_LPAR:
1107
0
    *nextTokPtr = ptr + MINBPC(enc);
1108
0
    return XML_TOK_OPEN_PAREN;
1109
0
  case BT_RPAR:
1110
0
    ptr += MINBPC(enc);
1111
0
    if (! HAS_CHAR(enc, ptr, end))
1112
0
      return -XML_TOK_CLOSE_PAREN;
1113
0
    switch (BYTE_TYPE(enc, ptr)) {
1114
0
    case BT_AST:
1115
0
      *nextTokPtr = ptr + MINBPC(enc);
1116
0
      return XML_TOK_CLOSE_PAREN_ASTERISK;
1117
0
    case BT_QUEST:
1118
0
      *nextTokPtr = ptr + MINBPC(enc);
1119
0
      return XML_TOK_CLOSE_PAREN_QUESTION;
1120
0
    case BT_PLUS:
1121
0
      *nextTokPtr = ptr + MINBPC(enc);
1122
0
      return XML_TOK_CLOSE_PAREN_PLUS;
1123
0
    case BT_CR:
1124
0
    case BT_LF:
1125
0
    case BT_S:
1126
0
    case BT_GT:
1127
0
    case BT_COMMA:
1128
0
    case BT_VERBAR:
1129
0
    case BT_RPAR:
1130
0
      *nextTokPtr = ptr;
1131
0
      return XML_TOK_CLOSE_PAREN;
1132
0
    }
1133
0
    *nextTokPtr = ptr;
1134
0
    return XML_TOK_INVALID;
1135
0
  case BT_VERBAR:
1136
0
    *nextTokPtr = ptr + MINBPC(enc);
1137
0
    return XML_TOK_OR;
1138
0
  case BT_GT:
1139
0
    *nextTokPtr = ptr + MINBPC(enc);
1140
0
    return XML_TOK_DECL_CLOSE;
1141
0
  case BT_NUM:
1142
0
    return PREFIX(scanPoundName)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1143
0
#  define LEAD_CASE(n)                                                         \
1144
0
  case BT_LEAD##n:                                                             \
1145
0
    if (end - ptr < n)                                                         \
1146
0
      return XML_TOK_PARTIAL_CHAR;                                             \
1147
0
    if (IS_INVALID_CHAR(enc, ptr, n)) {                                        \
1148
0
      *nextTokPtr = ptr;                                                       \
1149
0
      return XML_TOK_INVALID;                                                  \
1150
0
    }                                                                          \
1151
0
    if (IS_NMSTRT_CHAR(enc, ptr, n)) {                                         \
1152
0
      ptr += n;                                                                \
1153
0
      tok = XML_TOK_NAME;                                                      \
1154
0
      break;                                                                   \
1155
0
    }                                                                          \
1156
0
    if (IS_NAME_CHAR(enc, ptr, n)) {                                           \
1157
0
      ptr += n;                                                                \
1158
0
      tok = XML_TOK_NMTOKEN;                                                   \
1159
0
      break;                                                                   \
1160
0
    }                                                                          \
1161
0
    *nextTokPtr = ptr;                                                         \
1162
0
    return XML_TOK_INVALID;
1163
0
    LEAD_CASE(2)
1164
0
    LEAD_CASE(3)
1165
58
    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
94
  case BT_NONASCII:
1182
94
    if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {
1183
76
      ptr += MINBPC(enc);
1184
76
      tok = XML_TOK_NAME;
1185
76
      break;
1186
76
    }
1187
18
    if (IS_NAME_CHAR_MINBPC(enc, ptr)) {
1188
7
      ptr += MINBPC(enc);
1189
7
      tok = XML_TOK_NMTOKEN;
1190
7
      break;
1191
7
    }
1192
    /* fall through */
1193
16
  default:
1194
16
    *nextTokPtr = ptr;
1195
16
    return XML_TOK_INVALID;
1196
121
  }
1197
12.7k
  while (HAS_CHAR(enc, ptr, end)) {
1198
12.7k
    switch (BYTE_TYPE(enc, ptr)) {
1199
63.4k
      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
11
    default:
1253
11
      *nextTokPtr = ptr;
1254
11
      return XML_TOK_INVALID;
1255
12.7k
    }
1256
12.7k
  }
1257
22
  return -tok;
1258
83
}
xmltok.c:big2_prologTok
Line
Count
Source
1018
105
                  const char **nextTokPtr) {
1019
105
  int tok;
1020
105
  if (ptr >= end)
1021
2
    return XML_TOK_NONE;
1022
103
  if (MINBPC(enc) > 1) {
1023
103
    size_t n = end - ptr;
1024
103
    if (n & (MINBPC(enc) - 1)) {
1025
19
      n &= ~(MINBPC(enc) - 1);
1026
19
      if (n == 0)
1027
2
        return XML_TOK_PARTIAL;
1028
17
      end = ptr + n;
1029
17
    }
1030
103
  }
1031
101
  switch (BYTE_TYPE(enc, ptr)) {
1032
0
  case BT_QUOT:
1033
0
    return PREFIX(scanLit)(BT_QUOT, enc, ptr + MINBPC(enc), end, nextTokPtr);
1034
0
  case BT_APOS:
1035
0
    return PREFIX(scanLit)(BT_APOS, enc, ptr + MINBPC(enc), end, nextTokPtr);
1036
0
  case BT_LT: {
1037
0
    ptr += MINBPC(enc);
1038
0
    REQUIRE_CHAR(enc, ptr, end);
1039
0
    switch (BYTE_TYPE(enc, ptr)) {
1040
0
    case BT_EXCL:
1041
0
      return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1042
0
    case BT_QUEST:
1043
0
      return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1044
0
    case BT_NMSTRT:
1045
0
    case BT_HEX:
1046
0
    case BT_NONASCII:
1047
0
    case BT_LEAD2:
1048
0
    case BT_LEAD3:
1049
0
    case BT_LEAD4:
1050
0
      *nextTokPtr = ptr - MINBPC(enc);
1051
0
      return XML_TOK_INSTANCE_START;
1052
0
    }
1053
0
    *nextTokPtr = ptr;
1054
0
    return XML_TOK_INVALID;
1055
0
  }
1056
0
  case BT_CR:
1057
0
    if (ptr + MINBPC(enc) == end) {
1058
0
      *nextTokPtr = end;
1059
      /* indicate that this might be part of a CR/LF pair */
1060
0
      return -XML_TOK_PROLOG_S;
1061
0
    }
1062
    /* fall through */
1063
0
  case BT_S:
1064
0
  case BT_LF:
1065
0
    for (;;) {
1066
0
      ptr += MINBPC(enc);
1067
0
      if (! HAS_CHAR(enc, ptr, end))
1068
0
        break;
1069
0
      switch (BYTE_TYPE(enc, ptr)) {
1070
0
      case BT_S:
1071
0
      case BT_LF:
1072
0
        break;
1073
0
      case BT_CR:
1074
        /* don't split CR/LF pair */
1075
0
        if (ptr + MINBPC(enc) != end)
1076
0
          break;
1077
        /* fall through */
1078
0
      default:
1079
0
        *nextTokPtr = ptr;
1080
0
        return XML_TOK_PROLOG_S;
1081
0
      }
1082
0
    }
1083
0
    *nextTokPtr = ptr;
1084
0
    return XML_TOK_PROLOG_S;
1085
0
  case BT_PERCNT:
1086
0
    return PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1087
0
  case BT_COMMA:
1088
0
    *nextTokPtr = ptr + MINBPC(enc);
1089
0
    return XML_TOK_COMMA;
1090
0
  case BT_LSQB:
1091
0
    *nextTokPtr = ptr + MINBPC(enc);
1092
0
    return XML_TOK_OPEN_BRACKET;
1093
0
  case BT_RSQB:
1094
0
    ptr += MINBPC(enc);
1095
0
    if (! HAS_CHAR(enc, ptr, end))
1096
0
      return -XML_TOK_CLOSE_BRACKET;
1097
0
    if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) {
1098
0
      REQUIRE_CHARS(enc, ptr, end, 2);
1099
0
      if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_GT)) {
1100
0
        *nextTokPtr = ptr + 2 * MINBPC(enc);
1101
0
        return XML_TOK_COND_SECT_CLOSE;
1102
0
      }
1103
0
    }
1104
0
    *nextTokPtr = ptr;
1105
0
    return XML_TOK_CLOSE_BRACKET;
1106
0
  case BT_LPAR:
1107
0
    *nextTokPtr = ptr + MINBPC(enc);
1108
0
    return XML_TOK_OPEN_PAREN;
1109
0
  case BT_RPAR:
1110
0
    ptr += MINBPC(enc);
1111
0
    if (! HAS_CHAR(enc, ptr, end))
1112
0
      return -XML_TOK_CLOSE_PAREN;
1113
0
    switch (BYTE_TYPE(enc, ptr)) {
1114
0
    case BT_AST:
1115
0
      *nextTokPtr = ptr + MINBPC(enc);
1116
0
      return XML_TOK_CLOSE_PAREN_ASTERISK;
1117
0
    case BT_QUEST:
1118
0
      *nextTokPtr = ptr + MINBPC(enc);
1119
0
      return XML_TOK_CLOSE_PAREN_QUESTION;
1120
0
    case BT_PLUS:
1121
0
      *nextTokPtr = ptr + MINBPC(enc);
1122
0
      return XML_TOK_CLOSE_PAREN_PLUS;
1123
0
    case BT_CR:
1124
0
    case BT_LF:
1125
0
    case BT_S:
1126
0
    case BT_GT:
1127
0
    case BT_COMMA:
1128
0
    case BT_VERBAR:
1129
0
    case BT_RPAR:
1130
0
      *nextTokPtr = ptr;
1131
0
      return XML_TOK_CLOSE_PAREN;
1132
0
    }
1133
0
    *nextTokPtr = ptr;
1134
0
    return XML_TOK_INVALID;
1135
0
  case BT_VERBAR:
1136
0
    *nextTokPtr = ptr + MINBPC(enc);
1137
0
    return XML_TOK_OR;
1138
0
  case BT_GT:
1139
0
    *nextTokPtr = ptr + MINBPC(enc);
1140
0
    return XML_TOK_DECL_CLOSE;
1141
0
  case BT_NUM:
1142
0
    return PREFIX(scanPoundName)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1143
0
#  define LEAD_CASE(n)                                                         \
1144
0
  case BT_LEAD##n:                                                             \
1145
0
    if (end - ptr < n)                                                         \
1146
0
      return XML_TOK_PARTIAL_CHAR;                                             \
1147
0
    if (IS_INVALID_CHAR(enc, ptr, n)) {                                        \
1148
0
      *nextTokPtr = ptr;                                                       \
1149
0
      return XML_TOK_INVALID;                                                  \
1150
0
    }                                                                          \
1151
0
    if (IS_NMSTRT_CHAR(enc, ptr, n)) {                                         \
1152
0
      ptr += n;                                                                \
1153
0
      tok = XML_TOK_NAME;                                                      \
1154
0
      break;                                                                   \
1155
0
    }                                                                          \
1156
0
    if (IS_NAME_CHAR(enc, ptr, n)) {                                           \
1157
0
      ptr += n;                                                                \
1158
0
      tok = XML_TOK_NMTOKEN;                                                   \
1159
0
      break;                                                                   \
1160
0
    }                                                                          \
1161
0
    *nextTokPtr = ptr;                                                         \
1162
0
    return XML_TOK_INVALID;
1163
0
    LEAD_CASE(2)
1164
0
    LEAD_CASE(3)
1165
56
    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
76
  case BT_NONASCII:
1182
76
    if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {
1183
56
      ptr += MINBPC(enc);
1184
56
      tok = XML_TOK_NAME;
1185
56
      break;
1186
56
    }
1187
20
    if (IS_NAME_CHAR_MINBPC(enc, ptr)) {
1188
9
      ptr += MINBPC(enc);
1189
9
      tok = XML_TOK_NMTOKEN;
1190
9
      break;
1191
9
    }
1192
    /* fall through */
1193
16
  default:
1194
16
    *nextTokPtr = ptr;
1195
16
    return XML_TOK_INVALID;
1196
101
  }
1197
4.14k
  while (HAS_CHAR(enc, ptr, end)) {
1198
4.14k
    switch (BYTE_TYPE(enc, ptr)) {
1199
20.5k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1200
0
    case BT_GT:
1201
0
    case BT_RPAR:
1202
0
    case BT_COMMA:
1203
0
    case BT_VERBAR:
1204
0
    case BT_LSQB:
1205
0
    case BT_PERCNT:
1206
0
    case BT_S:
1207
0
    case BT_CR:
1208
0
    case BT_LF:
1209
0
      *nextTokPtr = ptr;
1210
0
      return tok;
1211
#  ifdef XML_NS
1212
    case BT_COLON:
1213
      ptr += MINBPC(enc);
1214
      switch (tok) {
1215
      case XML_TOK_NAME:
1216
        REQUIRE_CHAR(enc, ptr, end);
1217
        tok = XML_TOK_PREFIXED_NAME;
1218
        switch (BYTE_TYPE(enc, ptr)) {
1219
          CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1220
        default:
1221
          tok = XML_TOK_NMTOKEN;
1222
          break;
1223
        }
1224
        break;
1225
      case XML_TOK_PREFIXED_NAME:
1226
        tok = XML_TOK_NMTOKEN;
1227
        break;
1228
      }
1229
      break;
1230
#  endif
1231
0
    case BT_PLUS:
1232
0
      if (tok == XML_TOK_NMTOKEN) {
1233
0
        *nextTokPtr = ptr;
1234
0
        return XML_TOK_INVALID;
1235
0
      }
1236
0
      *nextTokPtr = ptr + MINBPC(enc);
1237
0
      return XML_TOK_NAME_PLUS;
1238
0
    case BT_AST:
1239
0
      if (tok == XML_TOK_NMTOKEN) {
1240
0
        *nextTokPtr = ptr;
1241
0
        return XML_TOK_INVALID;
1242
0
      }
1243
0
      *nextTokPtr = ptr + MINBPC(enc);
1244
0
      return XML_TOK_NAME_ASTERISK;
1245
0
    case BT_QUEST:
1246
0
      if (tok == XML_TOK_NMTOKEN) {
1247
0
        *nextTokPtr = ptr;
1248
0
        return XML_TOK_INVALID;
1249
0
      }
1250
0
      *nextTokPtr = ptr + MINBPC(enc);
1251
0
      return XML_TOK_NAME_QUESTION;
1252
7
    default:
1253
7
      *nextTokPtr = ptr;
1254
7
      return XML_TOK_INVALID;
1255
4.14k
    }
1256
4.14k
  }
1257
18
  return -tok;
1258
65
}
1259
1260
static int PTRCALL
1261
PREFIX(attributeValueTok)(const ENCODING *enc, const char *ptr, const char *end,
1262
2.60M
                          const char **nextTokPtr) {
1263
2.60M
  const char *start;
1264
2.60M
  if (ptr >= end)
1265
106k
    return XML_TOK_NONE;
1266
2.49M
  else if (! HAS_CHAR(enc, ptr, end)) {
1267
    /* This line cannot be executed.  The incoming data has already
1268
     * been tokenized once, so incomplete characters like this have
1269
     * already been eliminated from the input.  Retaining the paranoia
1270
     * check is still valuable, however.
1271
     */
1272
0
    return XML_TOK_PARTIAL; /* LCOV_EXCL_LINE */
1273
0
  }
1274
2.49M
  start = ptr;
1275
18.8M
  while (HAS_CHAR(enc, ptr, end)) {
1276
18.8M
    switch (BYTE_TYPE(enc, ptr)) {
1277
0
#  define LEAD_CASE(n)                                                         \
1278
234k
  case BT_LEAD##n:                                                             \
1279
234k
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1280
234k
    break;
1281
57.3k
      LEAD_CASE(2)
1282
86.6k
      LEAD_CASE(3)
1283
90.6k
      LEAD_CASE(4)
1284
0
#  undef LEAD_CASE
1285
553k
    case BT_AMP:
1286
553k
      if (ptr == start)
1287
391k
        return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1288
161k
      *nextTokPtr = ptr;
1289
161k
      return XML_TOK_DATA_CHARS;
1290
3
    case BT_LT:
1291
      /* this is for inside entity references */
1292
3
      *nextTokPtr = ptr;
1293
3
      return XML_TOK_INVALID;
1294
642k
    case BT_LF:
1295
642k
      if (ptr == start) {
1296
506k
        *nextTokPtr = ptr + MINBPC(enc);
1297
506k
        return XML_TOK_DATA_NEWLINE;
1298
506k
      }
1299
135k
      *nextTokPtr = ptr;
1300
135k
      return XML_TOK_DATA_CHARS;
1301
848k
    case BT_CR:
1302
848k
      if (ptr == start) {
1303
615k
        ptr += MINBPC(enc);
1304
615k
        if (! HAS_CHAR(enc, ptr, end))
1305
4.95k
          return XML_TOK_TRAILING_CR;
1306
610k
        if (BYTE_TYPE(enc, ptr) == BT_LF)
1307
197k
          ptr += MINBPC(enc);
1308
610k
        *nextTokPtr = ptr;
1309
610k
        return XML_TOK_DATA_NEWLINE;
1310
615k
      }
1311
232k
      *nextTokPtr = ptr;
1312
232k
      return XML_TOK_DATA_CHARS;
1313
362k
    case BT_S:
1314
362k
      if (ptr == start) {
1315
204k
        *nextTokPtr = ptr + MINBPC(enc);
1316
204k
        return XML_TOK_ATTRIBUTE_VALUE_S;
1317
204k
      }
1318
157k
      *nextTokPtr = ptr;
1319
157k
      return XML_TOK_DATA_CHARS;
1320
16.1M
    default:
1321
16.1M
      ptr += MINBPC(enc);
1322
16.1M
      break;
1323
18.8M
    }
1324
18.8M
  }
1325
89.0k
  *nextTokPtr = ptr;
1326
89.0k
  return XML_TOK_DATA_CHARS;
1327
2.49M
}
xmltok.c:normal_attributeValueTok
Line
Count
Source
1262
2.60M
                          const char **nextTokPtr) {
1263
2.60M
  const char *start;
1264
2.60M
  if (ptr >= end)
1265
106k
    return XML_TOK_NONE;
1266
2.49M
  else if (! HAS_CHAR(enc, ptr, end)) {
1267
    /* This line cannot be executed.  The incoming data has already
1268
     * been tokenized once, so incomplete characters like this have
1269
     * already been eliminated from the input.  Retaining the paranoia
1270
     * check is still valuable, however.
1271
     */
1272
0
    return XML_TOK_PARTIAL; /* LCOV_EXCL_LINE */
1273
0
  }
1274
2.49M
  start = ptr;
1275
18.8M
  while (HAS_CHAR(enc, ptr, end)) {
1276
18.8M
    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
57.3k
      LEAD_CASE(2)
1282
86.6k
      LEAD_CASE(3)
1283
90.6k
      LEAD_CASE(4)
1284
0
#  undef LEAD_CASE
1285
553k
    case BT_AMP:
1286
553k
      if (ptr == start)
1287
391k
        return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1288
161k
      *nextTokPtr = ptr;
1289
161k
      return XML_TOK_DATA_CHARS;
1290
3
    case BT_LT:
1291
      /* this is for inside entity references */
1292
3
      *nextTokPtr = ptr;
1293
3
      return XML_TOK_INVALID;
1294
642k
    case BT_LF:
1295
642k
      if (ptr == start) {
1296
506k
        *nextTokPtr = ptr + MINBPC(enc);
1297
506k
        return XML_TOK_DATA_NEWLINE;
1298
506k
      }
1299
135k
      *nextTokPtr = ptr;
1300
135k
      return XML_TOK_DATA_CHARS;
1301
848k
    case BT_CR:
1302
848k
      if (ptr == start) {
1303
615k
        ptr += MINBPC(enc);
1304
615k
        if (! HAS_CHAR(enc, ptr, end))
1305
4.95k
          return XML_TOK_TRAILING_CR;
1306
610k
        if (BYTE_TYPE(enc, ptr) == BT_LF)
1307
197k
          ptr += MINBPC(enc);
1308
610k
        *nextTokPtr = ptr;
1309
610k
        return XML_TOK_DATA_NEWLINE;
1310
615k
      }
1311
232k
      *nextTokPtr = ptr;
1312
232k
      return XML_TOK_DATA_CHARS;
1313
362k
    case BT_S:
1314
362k
      if (ptr == start) {
1315
204k
        *nextTokPtr = ptr + MINBPC(enc);
1316
204k
        return XML_TOK_ATTRIBUTE_VALUE_S;
1317
204k
      }
1318
157k
      *nextTokPtr = ptr;
1319
157k
      return XML_TOK_DATA_CHARS;
1320
16.1M
    default:
1321
16.1M
      ptr += MINBPC(enc);
1322
16.1M
      break;
1323
18.8M
    }
1324
18.8M
  }
1325
89.0k
  *nextTokPtr = ptr;
1326
89.0k
  return XML_TOK_DATA_CHARS;
1327
2.49M
}
Unexecuted instantiation: xmltok.c:little2_attributeValueTok
Unexecuted instantiation: xmltok.c:big2_attributeValueTok
1328
1329
static int PTRCALL
1330
PREFIX(entityValueTok)(const ENCODING *enc, const char *ptr, const char *end,
1331
0
                       const char **nextTokPtr) {
1332
0
  const char *start;
1333
0
  if (ptr >= end)
1334
0
    return XML_TOK_NONE;
1335
0
  else if (! HAS_CHAR(enc, ptr, end)) {
1336
    /* This line cannot be executed.  The incoming data has already
1337
     * been tokenized once, so incomplete characters like this have
1338
     * already been eliminated from the input.  Retaining the paranoia
1339
     * check is still valuable, however.
1340
     */
1341
0
    return XML_TOK_PARTIAL; /* LCOV_EXCL_LINE */
1342
0
  }
1343
0
  start = ptr;
1344
0
  while (HAS_CHAR(enc, ptr, end)) {
1345
0
    switch (BYTE_TYPE(enc, ptr)) {
1346
0
#  define LEAD_CASE(n)                                                         \
1347
0
  case BT_LEAD##n:                                                             \
1348
0
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1349
0
    break;
1350
0
      LEAD_CASE(2)
1351
0
      LEAD_CASE(3)
1352
0
      LEAD_CASE(4)
1353
0
#  undef LEAD_CASE
1354
0
    case BT_AMP:
1355
0
      if (ptr == start)
1356
0
        return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1357
0
      *nextTokPtr = ptr;
1358
0
      return XML_TOK_DATA_CHARS;
1359
0
    case BT_PERCNT:
1360
0
      if (ptr == start) {
1361
0
        int tok = PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1362
0
        return (tok == XML_TOK_PERCENT) ? XML_TOK_INVALID : tok;
1363
0
      }
1364
0
      *nextTokPtr = ptr;
1365
0
      return XML_TOK_DATA_CHARS;
1366
0
    case BT_LF:
1367
0
      if (ptr == start) {
1368
0
        *nextTokPtr = ptr + MINBPC(enc);
1369
0
        return XML_TOK_DATA_NEWLINE;
1370
0
      }
1371
0
      *nextTokPtr = ptr;
1372
0
      return XML_TOK_DATA_CHARS;
1373
0
    case BT_CR:
1374
0
      if (ptr == start) {
1375
0
        ptr += MINBPC(enc);
1376
0
        if (! HAS_CHAR(enc, ptr, end))
1377
0
          return XML_TOK_TRAILING_CR;
1378
0
        if (BYTE_TYPE(enc, ptr) == BT_LF)
1379
0
          ptr += MINBPC(enc);
1380
0
        *nextTokPtr = ptr;
1381
0
        return XML_TOK_DATA_NEWLINE;
1382
0
      }
1383
0
      *nextTokPtr = ptr;
1384
0
      return XML_TOK_DATA_CHARS;
1385
0
    default:
1386
0
      ptr += MINBPC(enc);
1387
0
      break;
1388
0
    }
1389
0
  }
1390
0
  *nextTokPtr = ptr;
1391
0
  return XML_TOK_DATA_CHARS;
1392
0
}
Unexecuted instantiation: xmltok.c:normal_entityValueTok
Unexecuted instantiation: xmltok.c:little2_entityValueTok
Unexecuted instantiation: xmltok.c:big2_entityValueTok
1393
1394
#  ifdef XML_DTD
1395
1396
static int PTRCALL
1397
PREFIX(ignoreSectionTok)(const ENCODING *enc, const char *ptr, const char *end,
1398
                         const char **nextTokPtr) {
1399
  int level = 0;
1400
  if (MINBPC(enc) > 1) {
1401
    size_t n = end - ptr;
1402
    if (n & (MINBPC(enc) - 1)) {
1403
      n &= ~(MINBPC(enc) - 1);
1404
      end = ptr + n;
1405
    }
1406
  }
1407
  while (HAS_CHAR(enc, ptr, end)) {
1408
    switch (BYTE_TYPE(enc, ptr)) {
1409
      INVALID_CASES(ptr, nextTokPtr)
1410
    case BT_LT:
1411
      ptr += MINBPC(enc);
1412
      REQUIRE_CHAR(enc, ptr, end);
1413
      if (CHAR_MATCHES(enc, ptr, ASCII_EXCL)) {
1414
        ptr += MINBPC(enc);
1415
        REQUIRE_CHAR(enc, ptr, end);
1416
        if (CHAR_MATCHES(enc, ptr, ASCII_LSQB)) {
1417
          ++level;
1418
          ptr += MINBPC(enc);
1419
        }
1420
      }
1421
      break;
1422
    case BT_RSQB:
1423
      ptr += MINBPC(enc);
1424
      REQUIRE_CHAR(enc, ptr, end);
1425
      if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) {
1426
        ptr += MINBPC(enc);
1427
        REQUIRE_CHAR(enc, ptr, end);
1428
        if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
1429
          ptr += MINBPC(enc);
1430
          if (level == 0) {
1431
            *nextTokPtr = ptr;
1432
            return XML_TOK_IGNORE_SECT;
1433
          }
1434
          --level;
1435
        }
1436
      }
1437
      break;
1438
    default:
1439
      ptr += MINBPC(enc);
1440
      break;
1441
    }
1442
  }
1443
  return XML_TOK_PARTIAL;
1444
}
1445
1446
#  endif /* XML_DTD */
1447
1448
static int PTRCALL
1449
PREFIX(isPublicId)(const ENCODING *enc, const char *ptr, const char *end,
1450
2.65k
                   const char **badPtr) {
1451
2.65k
  ptr += MINBPC(enc);
1452
2.65k
  end -= MINBPC(enc);
1453
592k
  for (; HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
1454
592k
    switch (BYTE_TYPE(enc, ptr)) {
1455
230k
    case BT_DIGIT:
1456
354k
    case BT_HEX:
1457
355k
    case BT_MINUS:
1458
356k
    case BT_APOS:
1459
357k
    case BT_LPAR:
1460
395k
    case BT_RPAR:
1461
396k
    case BT_PLUS:
1462
397k
    case BT_COMMA:
1463
453k
    case BT_SOL:
1464
458k
    case BT_EQUALS:
1465
462k
    case BT_QUEST:
1466
465k
    case BT_CR:
1467
467k
    case BT_LF:
1468
468k
    case BT_SEMI:
1469
468k
    case BT_EXCL:
1470
489k
    case BT_AST:
1471
493k
    case BT_PERCNT:
1472
499k
    case BT_NUM:
1473
#  ifdef XML_NS
1474
    case BT_COLON:
1475
#  endif
1476
499k
      break;
1477
2.68k
    case BT_S:
1478
2.68k
      if (CHAR_MATCHES(enc, ptr, ASCII_TAB)) {
1479
2
        *badPtr = ptr;
1480
2
        return 0;
1481
2
      }
1482
2.68k
      break;
1483
3.20k
    case BT_NAME:
1484
86.9k
    case BT_NMSTRT:
1485
86.9k
      if (! (BYTE_TO_ASCII(enc, ptr) & ~0x7f))
1486
86.9k
        break;
1487
      /* fall through */
1488
2.89k
    default:
1489
2.89k
      switch (BYTE_TO_ASCII(enc, ptr)) {
1490
1.49k
      case 0x24: /* $ */
1491
2.88k
      case 0x40: /* @ */
1492
2.88k
        break;
1493
15
      default:
1494
15
        *badPtr = ptr;
1495
15
        return 0;
1496
2.89k
      }
1497
2.88k
      break;
1498
592k
    }
1499
592k
  }
1500
2.63k
  return 1;
1501
2.65k
}
xmltok.c:normal_isPublicId
Line
Count
Source
1450
2.65k
                   const char **badPtr) {
1451
2.65k
  ptr += MINBPC(enc);
1452
2.65k
  end -= MINBPC(enc);
1453
592k
  for (; HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
1454
592k
    switch (BYTE_TYPE(enc, ptr)) {
1455
230k
    case BT_DIGIT:
1456
354k
    case BT_HEX:
1457
355k
    case BT_MINUS:
1458
356k
    case BT_APOS:
1459
357k
    case BT_LPAR:
1460
395k
    case BT_RPAR:
1461
396k
    case BT_PLUS:
1462
397k
    case BT_COMMA:
1463
453k
    case BT_SOL:
1464
458k
    case BT_EQUALS:
1465
462k
    case BT_QUEST:
1466
465k
    case BT_CR:
1467
467k
    case BT_LF:
1468
468k
    case BT_SEMI:
1469
468k
    case BT_EXCL:
1470
489k
    case BT_AST:
1471
493k
    case BT_PERCNT:
1472
499k
    case BT_NUM:
1473
#  ifdef XML_NS
1474
    case BT_COLON:
1475
#  endif
1476
499k
      break;
1477
2.68k
    case BT_S:
1478
2.68k
      if (CHAR_MATCHES(enc, ptr, ASCII_TAB)) {
1479
2
        *badPtr = ptr;
1480
2
        return 0;
1481
2
      }
1482
2.68k
      break;
1483
3.20k
    case BT_NAME:
1484
86.9k
    case BT_NMSTRT:
1485
86.9k
      if (! (BYTE_TO_ASCII(enc, ptr) & ~0x7f))
1486
86.9k
        break;
1487
      /* fall through */
1488
2.89k
    default:
1489
2.89k
      switch (BYTE_TO_ASCII(enc, ptr)) {
1490
1.49k
      case 0x24: /* $ */
1491
2.88k
      case 0x40: /* @ */
1492
2.88k
        break;
1493
15
      default:
1494
15
        *badPtr = ptr;
1495
15
        return 0;
1496
2.89k
      }
1497
2.88k
      break;
1498
592k
    }
1499
592k
  }
1500
2.63k
  return 1;
1501
2.65k
}
Unexecuted instantiation: xmltok.c:little2_isPublicId
Unexecuted instantiation: xmltok.c:big2_isPublicId
1502
1503
/* This must only be called for a well-formed start-tag or empty
1504
   element tag.  Returns the number of attributes.  Pointers to the
1505
   first attsMax attributes are stored in atts.
1506
*/
1507
1508
static int PTRCALL
1509
PREFIX(getAtts)(const ENCODING *enc, const char *ptr, int attsMax,
1510
301k
                ATTRIBUTE *atts) {
1511
301k
  enum { other, inName, inValue } state = inName;
1512
301k
  int nAtts = 0;
1513
301k
  int open = 0; /* defined when state == inValue;
1514
                   initialization just to shut up compilers */
1515
1516
56.4M
  for (ptr += MINBPC(enc);; ptr += MINBPC(enc)) {
1517
56.4M
    switch (BYTE_TYPE(enc, ptr)) {
1518
0
#  define START_NAME                                                           \
1519
28.0M
    if (state == other) {                                                      \
1520
5.78M
      if (nAtts < attsMax) {                                                   \
1521
2.93M
        atts[nAtts].name = ptr;                                                \
1522
2.93M
        atts[nAtts].normalized = 1;                                            \
1523
2.93M
      }                                                                        \
1524
5.78M
      state = inName;                                                          \
1525
5.78M
    }
1526
0
#  define LEAD_CASE(n)                                                         \
1527
347k
  case BT_LEAD##n: /* NOTE: The encoding has already been validated. */        \
1528
347k
    START_NAME ptr += (n - MINBPC(enc));                                       \
1529
347k
    break;
1530
123k
      LEAD_CASE(2)
1531
172k
      LEAD_CASE(3)
1532
52.7k
      LEAD_CASE(4)
1533
0
#  undef LEAD_CASE
1534
0
    case BT_NONASCII:
1535
25.9M
    case BT_NMSTRT:
1536
27.7M
    case BT_HEX:
1537
27.7M
      START_NAME
1538
27.7M
      break;
1539
0
#  undef START_NAME
1540
592k
    case BT_QUOT:
1541
592k
      if (state != inValue) {
1542
201k
        if (nAtts < attsMax)
1543
134k
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1544
201k
        state = inValue;
1545
201k
        open = BT_QUOT;
1546
390k
      } else if (open == BT_QUOT) {
1547
201k
        state = other;
1548
201k
        if (nAtts < attsMax)
1549
134k
          atts[nAtts].valueEnd = ptr;
1550
201k
        nAtts++;
1551
201k
      }
1552
592k
      break;
1553
11.2M
    case BT_APOS:
1554
11.2M
      if (state != inValue) {
1555
5.58M
        if (nAtts < attsMax)
1556
2.79M
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1557
5.58M
        state = inValue;
1558
5.58M
        open = BT_APOS;
1559
5.62M
      } else if (open == BT_APOS) {
1560
5.58M
        state = other;
1561
5.58M
        if (nAtts < attsMax)
1562
2.79M
          atts[nAtts].valueEnd = ptr;
1563
5.58M
        nAtts++;
1564
5.58M
      }
1565
11.2M
      break;
1566
107k
    case BT_AMP:
1567
107k
      if (nAtts < attsMax)
1568
107k
        atts[nAtts].normalized = 0;
1569
107k
      break;
1570
3.84M
    case BT_S:
1571
3.84M
      if (state == inName)
1572
56.7k
        state = other;
1573
3.78M
      else if (state == inValue && nAtts < attsMax && atts[nAtts].normalized
1574
142k
               && (ptr == atts[nAtts].valuePtr
1575
25.5k
                   || BYTE_TO_ASCII(enc, ptr) != ASCII_SPACE
1576
13.0k
                   || BYTE_TO_ASCII(enc, ptr + MINBPC(enc)) == ASCII_SPACE
1577
11.9k
                   || BYTE_TYPE(enc, ptr + MINBPC(enc)) == open))
1578
131k
        atts[nAtts].normalized = 0;
1579
3.84M
      break;
1580
3.40M
    case BT_CR:
1581
4.09M
    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
4.09M
      if (state == inName)
1585
36.2k
        state = other;
1586
4.05M
      else if (state == inValue && nAtts < attsMax)
1587
1.01M
        atts[nAtts].normalized = 0;
1588
4.09M
      break;
1589
195k
    case BT_GT:
1590
330k
    case BT_SOL:
1591
330k
      if (state != inValue)
1592
301k
        return nAtts;
1593
28.1k
      break;
1594
8.21M
    default:
1595
8.21M
      break;
1596
56.4M
    }
1597
56.4M
  }
1598
  /* not reached */
1599
301k
}
xmltok.c:normal_getAtts
Line
Count
Source
1510
301k
                ATTRIBUTE *atts) {
1511
301k
  enum { other, inName, inValue } state = inName;
1512
301k
  int nAtts = 0;
1513
301k
  int open = 0; /* defined when state == inValue;
1514
                   initialization just to shut up compilers */
1515
1516
56.4M
  for (ptr += MINBPC(enc);; ptr += MINBPC(enc)) {
1517
56.4M
    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
123k
      LEAD_CASE(2)
1531
172k
      LEAD_CASE(3)
1532
52.7k
      LEAD_CASE(4)
1533
0
#  undef LEAD_CASE
1534
0
    case BT_NONASCII:
1535
25.9M
    case BT_NMSTRT:
1536
27.7M
    case BT_HEX:
1537
27.7M
      START_NAME
1538
27.7M
      break;
1539
0
#  undef START_NAME
1540
592k
    case BT_QUOT:
1541
592k
      if (state != inValue) {
1542
201k
        if (nAtts < attsMax)
1543
134k
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1544
201k
        state = inValue;
1545
201k
        open = BT_QUOT;
1546
390k
      } else if (open == BT_QUOT) {
1547
201k
        state = other;
1548
201k
        if (nAtts < attsMax)
1549
134k
          atts[nAtts].valueEnd = ptr;
1550
201k
        nAtts++;
1551
201k
      }
1552
592k
      break;
1553
11.2M
    case BT_APOS:
1554
11.2M
      if (state != inValue) {
1555
5.58M
        if (nAtts < attsMax)
1556
2.79M
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1557
5.58M
        state = inValue;
1558
5.58M
        open = BT_APOS;
1559
5.62M
      } else if (open == BT_APOS) {
1560
5.58M
        state = other;
1561
5.58M
        if (nAtts < attsMax)
1562
2.79M
          atts[nAtts].valueEnd = ptr;
1563
5.58M
        nAtts++;
1564
5.58M
      }
1565
11.2M
      break;
1566
107k
    case BT_AMP:
1567
107k
      if (nAtts < attsMax)
1568
107k
        atts[nAtts].normalized = 0;
1569
107k
      break;
1570
3.84M
    case BT_S:
1571
3.84M
      if (state == inName)
1572
56.7k
        state = other;
1573
3.78M
      else if (state == inValue && nAtts < attsMax && atts[nAtts].normalized
1574
142k
               && (ptr == atts[nAtts].valuePtr
1575
25.5k
                   || BYTE_TO_ASCII(enc, ptr) != ASCII_SPACE
1576
13.0k
                   || BYTE_TO_ASCII(enc, ptr + MINBPC(enc)) == ASCII_SPACE
1577
11.9k
                   || BYTE_TYPE(enc, ptr + MINBPC(enc)) == open))
1578
131k
        atts[nAtts].normalized = 0;
1579
3.84M
      break;
1580
3.40M
    case BT_CR:
1581
4.09M
    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
4.09M
      if (state == inName)
1585
36.2k
        state = other;
1586
4.05M
      else if (state == inValue && nAtts < attsMax)
1587
1.01M
        atts[nAtts].normalized = 0;
1588
4.09M
      break;
1589
195k
    case BT_GT:
1590
330k
    case BT_SOL:
1591
330k
      if (state != inValue)
1592
301k
        return nAtts;
1593
28.1k
      break;
1594
8.21M
    default:
1595
8.21M
      break;
1596
56.4M
    }
1597
56.4M
  }
1598
  /* not reached */
1599
301k
}
Unexecuted instantiation: xmltok.c:little2_getAtts
Unexecuted instantiation: xmltok.c:big2_getAtts
1600
1601
static int PTRFASTCALL
1602
92.5k
PREFIX(charRefNumber)(const ENCODING *enc, const char *ptr) {
1603
92.5k
  int result = 0;
1604
  /* skip &# */
1605
92.5k
  UNUSED_P(enc);
1606
92.5k
  ptr += 2 * MINBPC(enc);
1607
92.5k
  if (CHAR_MATCHES(enc, ptr, ASCII_x)) {
1608
401k
    for (ptr += MINBPC(enc); ! CHAR_MATCHES(enc, ptr, ASCII_SEMI);
1609
314k
         ptr += MINBPC(enc)) {
1610
314k
      int c = BYTE_TO_ASCII(enc, ptr);
1611
314k
      switch (c) {
1612
7.62k
      case ASCII_0:
1613
32.5k
      case ASCII_1:
1614
68.5k
      case ASCII_2:
1615
72.2k
      case ASCII_3:
1616
114k
      case ASCII_4:
1617
143k
      case ASCII_5:
1618
145k
      case ASCII_6:
1619
164k
      case ASCII_7:
1620
196k
      case ASCII_8:
1621
204k
      case ASCII_9:
1622
204k
        result <<= 4;
1623
204k
        result |= (c - ASCII_0);
1624
204k
        break;
1625
29.9k
      case ASCII_A:
1626
30.9k
      case ASCII_B:
1627
32.0k
      case ASCII_C:
1628
33.8k
      case ASCII_D:
1629
35.5k
      case ASCII_E:
1630
58.1k
      case ASCII_F:
1631
58.1k
        result <<= 4;
1632
58.1k
        result += 10 + (c - ASCII_A);
1633
58.1k
        break;
1634
1.07k
      case ASCII_a:
1635
15.3k
      case ASCII_b:
1636
16.3k
      case ASCII_c:
1637
45.5k
      case ASCII_d:
1638
47.2k
      case ASCII_e:
1639
52.1k
      case ASCII_f:
1640
52.1k
        result <<= 4;
1641
52.1k
        result += 10 + (c - ASCII_a);
1642
52.1k
        break;
1643
314k
      }
1644
314k
      if (result >= 0x110000)
1645
14
        return -1;
1646
314k
    }
1647
86.7k
  } else {
1648
24.2k
    for (; ! CHAR_MATCHES(enc, ptr, ASCII_SEMI); ptr += MINBPC(enc)) {
1649
18.4k
      int c = BYTE_TO_ASCII(enc, ptr);
1650
18.4k
      result *= 10;
1651
18.4k
      result += (c - ASCII_0);
1652
18.4k
      if (result >= 0x110000)
1653
6
        return -1;
1654
18.4k
    }
1655
5.83k
  }
1656
92.5k
  return checkCharRefNumber(result);
1657
92.5k
}
xmltok.c:normal_charRefNumber
Line
Count
Source
1602
92.5k
PREFIX(charRefNumber)(const ENCODING *enc, const char *ptr) {
1603
92.5k
  int result = 0;
1604
  /* skip &# */
1605
92.5k
  UNUSED_P(enc);
1606
92.5k
  ptr += 2 * MINBPC(enc);
1607
92.5k
  if (CHAR_MATCHES(enc, ptr, ASCII_x)) {
1608
401k
    for (ptr += MINBPC(enc); ! CHAR_MATCHES(enc, ptr, ASCII_SEMI);
1609
314k
         ptr += MINBPC(enc)) {
1610
314k
      int c = BYTE_TO_ASCII(enc, ptr);
1611
314k
      switch (c) {
1612
7.62k
      case ASCII_0:
1613
32.5k
      case ASCII_1:
1614
68.5k
      case ASCII_2:
1615
72.2k
      case ASCII_3:
1616
114k
      case ASCII_4:
1617
143k
      case ASCII_5:
1618
145k
      case ASCII_6:
1619
164k
      case ASCII_7:
1620
196k
      case ASCII_8:
1621
204k
      case ASCII_9:
1622
204k
        result <<= 4;
1623
204k
        result |= (c - ASCII_0);
1624
204k
        break;
1625
29.9k
      case ASCII_A:
1626
30.9k
      case ASCII_B:
1627
32.0k
      case ASCII_C:
1628
33.8k
      case ASCII_D:
1629
35.5k
      case ASCII_E:
1630
58.1k
      case ASCII_F:
1631
58.1k
        result <<= 4;
1632
58.1k
        result += 10 + (c - ASCII_A);
1633
58.1k
        break;
1634
1.07k
      case ASCII_a:
1635
15.3k
      case ASCII_b:
1636
16.3k
      case ASCII_c:
1637
45.5k
      case ASCII_d:
1638
47.2k
      case ASCII_e:
1639
52.1k
      case ASCII_f:
1640
52.1k
        result <<= 4;
1641
52.1k
        result += 10 + (c - ASCII_a);
1642
52.1k
        break;
1643
314k
      }
1644
314k
      if (result >= 0x110000)
1645
14
        return -1;
1646
314k
    }
1647
86.7k
  } else {
1648
24.2k
    for (; ! CHAR_MATCHES(enc, ptr, ASCII_SEMI); ptr += MINBPC(enc)) {
1649
18.4k
      int c = BYTE_TO_ASCII(enc, ptr);
1650
18.4k
      result *= 10;
1651
18.4k
      result += (c - ASCII_0);
1652
18.4k
      if (result >= 0x110000)
1653
6
        return -1;
1654
18.4k
    }
1655
5.83k
  }
1656
92.5k
  return checkCharRefNumber(result);
1657
92.5k
}
Unexecuted instantiation: xmltok.c:little2_charRefNumber
Unexecuted instantiation: xmltok.c:big2_charRefNumber
1658
1659
static int PTRCALL
1660
PREFIX(predefinedEntityName)(const ENCODING *enc, const char *ptr,
1661
345k
                             const char *end) {
1662
345k
  UNUSED_P(enc);
1663
345k
  switch ((end - ptr) / MINBPC(enc)) {
1664
22.7k
  case 2:
1665
22.7k
    if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_t)) {
1666
3.78k
      switch (BYTE_TO_ASCII(enc, ptr)) {
1667
737
      case ASCII_l:
1668
737
        return ASCII_LT;
1669
250
      case ASCII_g:
1670
250
        return ASCII_GT;
1671
3.78k
      }
1672
3.78k
    }
1673
21.7k
    break;
1674
60.3k
  case 3:
1675
60.3k
    if (CHAR_MATCHES(enc, ptr, ASCII_a)) {
1676
47.2k
      ptr += MINBPC(enc);
1677
47.2k
      if (CHAR_MATCHES(enc, ptr, ASCII_m)) {
1678
42.6k
        ptr += MINBPC(enc);
1679
42.6k
        if (CHAR_MATCHES(enc, ptr, ASCII_p))
1680
42.4k
          return ASCII_AMP;
1681
42.6k
      }
1682
47.2k
    }
1683
17.9k
    break;
1684
47.3k
  case 4:
1685
47.3k
    switch (BYTE_TO_ASCII(enc, ptr)) {
1686
14.1k
    case ASCII_q:
1687
14.1k
      ptr += MINBPC(enc);
1688
14.1k
      if (CHAR_MATCHES(enc, ptr, ASCII_u)) {
1689
12.9k
        ptr += MINBPC(enc);
1690
12.9k
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1691
12.4k
          ptr += MINBPC(enc);
1692
12.4k
          if (CHAR_MATCHES(enc, ptr, ASCII_t))
1693
12.2k
            return ASCII_QUOT;
1694
12.4k
        }
1695
12.9k
      }
1696
1.88k
      break;
1697
13.1k
    case ASCII_a:
1698
13.1k
      ptr += MINBPC(enc);
1699
13.1k
      if (CHAR_MATCHES(enc, ptr, ASCII_p)) {
1700
2.04k
        ptr += MINBPC(enc);
1701
2.04k
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1702
1.28k
          ptr += MINBPC(enc);
1703
1.28k
          if (CHAR_MATCHES(enc, ptr, ASCII_s))
1704
677
            return ASCII_APOS;
1705
1.28k
        }
1706
2.04k
      }
1707
12.4k
      break;
1708
47.3k
    }
1709
345k
  }
1710
289k
  return 0;
1711
345k
}
xmltok.c:normal_predefinedEntityName
Line
Count
Source
1661
345k
                             const char *end) {
1662
345k
  UNUSED_P(enc);
1663
345k
  switch ((end - ptr) / MINBPC(enc)) {
1664
22.7k
  case 2:
1665
22.7k
    if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_t)) {
1666
3.78k
      switch (BYTE_TO_ASCII(enc, ptr)) {
1667
737
      case ASCII_l:
1668
737
        return ASCII_LT;
1669
250
      case ASCII_g:
1670
250
        return ASCII_GT;
1671
3.78k
      }
1672
3.78k
    }
1673
21.7k
    break;
1674
60.3k
  case 3:
1675
60.3k
    if (CHAR_MATCHES(enc, ptr, ASCII_a)) {
1676
47.2k
      ptr += MINBPC(enc);
1677
47.2k
      if (CHAR_MATCHES(enc, ptr, ASCII_m)) {
1678
42.6k
        ptr += MINBPC(enc);
1679
42.6k
        if (CHAR_MATCHES(enc, ptr, ASCII_p))
1680
42.4k
          return ASCII_AMP;
1681
42.6k
      }
1682
47.2k
    }
1683
17.9k
    break;
1684
47.3k
  case 4:
1685
47.3k
    switch (BYTE_TO_ASCII(enc, ptr)) {
1686
14.1k
    case ASCII_q:
1687
14.1k
      ptr += MINBPC(enc);
1688
14.1k
      if (CHAR_MATCHES(enc, ptr, ASCII_u)) {
1689
12.9k
        ptr += MINBPC(enc);
1690
12.9k
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1691
12.4k
          ptr += MINBPC(enc);
1692
12.4k
          if (CHAR_MATCHES(enc, ptr, ASCII_t))
1693
12.2k
            return ASCII_QUOT;
1694
12.4k
        }
1695
12.9k
      }
1696
1.88k
      break;
1697
13.1k
    case ASCII_a:
1698
13.1k
      ptr += MINBPC(enc);
1699
13.1k
      if (CHAR_MATCHES(enc, ptr, ASCII_p)) {
1700
2.04k
        ptr += MINBPC(enc);
1701
2.04k
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1702
1.28k
          ptr += MINBPC(enc);
1703
1.28k
          if (CHAR_MATCHES(enc, ptr, ASCII_s))
1704
677
            return ASCII_APOS;
1705
1.28k
        }
1706
2.04k
      }
1707
12.4k
      break;
1708
47.3k
    }
1709
345k
  }
1710
289k
  return 0;
1711
345k
}
Unexecuted instantiation: xmltok.c:little2_predefinedEntityName
Unexecuted instantiation: xmltok.c:big2_predefinedEntityName
1712
1713
static int PTRCALL
1714
PREFIX(nameMatchesAscii)(const ENCODING *enc, const char *ptr1,
1715
327k
                         const char *end1, const char *ptr2) {
1716
327k
  UNUSED_P(enc);
1717
1.78M
  for (; *ptr2; ptr1 += MINBPC(enc), ptr2++) {
1718
1.56M
    if (end1 - ptr1 < MINBPC(enc)) {
1719
      /* This line cannot be executed.  The incoming data has already
1720
       * been tokenized once, so incomplete characters like this have
1721
       * already been eliminated from the input.  Retaining the
1722
       * paranoia check is still valuable, however.
1723
       */
1724
37
      return 0; /* LCOV_EXCL_LINE */
1725
37
    }
1726
1.56M
    if (! CHAR_MATCHES(enc, ptr1, *ptr2))
1727
104k
      return 0;
1728
1.56M
  }
1729
222k
  return ptr1 == end1;
1730
327k
}
xmltok.c:normal_nameMatchesAscii
Line
Count
Source
1715
327k
                         const char *end1, const char *ptr2) {
1716
327k
  UNUSED_P(enc);
1717
1.78M
  for (; *ptr2; ptr1 += MINBPC(enc), ptr2++) {
1718
1.56M
    if (end1 - ptr1 < MINBPC(enc)) {
1719
      /* This line cannot be executed.  The incoming data has already
1720
       * been tokenized once, so incomplete characters like this have
1721
       * already been eliminated from the input.  Retaining the
1722
       * paranoia check is still valuable, however.
1723
       */
1724
37
      return 0; /* LCOV_EXCL_LINE */
1725
37
    }
1726
1.56M
    if (! CHAR_MATCHES(enc, ptr1, *ptr2))
1727
104k
      return 0;
1728
1.56M
  }
1729
222k
  return ptr1 == end1;
1730
327k
}
Unexecuted instantiation: xmltok.c:little2_nameMatchesAscii
Unexecuted instantiation: xmltok.c:big2_nameMatchesAscii
1731
1732
static int PTRFASTCALL
1733
434k
PREFIX(nameLength)(const ENCODING *enc, const char *ptr) {
1734
434k
  const char *start = ptr;
1735
10.3M
  for (;;) {
1736
10.3M
    switch (BYTE_TYPE(enc, ptr)) {
1737
0
#  define LEAD_CASE(n)                                                         \
1738
130k
  case BT_LEAD##n:                                                             \
1739
130k
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1740
130k
    break;
1741
69.2k
      LEAD_CASE(2)
1742
61.3k
      LEAD_CASE(3)
1743
0
      LEAD_CASE(4)
1744
0
#  undef LEAD_CASE
1745
0
    case BT_NONASCII:
1746
8.12M
    case BT_NMSTRT:
1747
#  ifdef XML_NS
1748
    case BT_COLON:
1749
#  endif
1750
9.50M
    case BT_HEX:
1751
9.71M
    case BT_DIGIT:
1752
9.73M
    case BT_NAME:
1753
9.79M
    case BT_MINUS:
1754
9.79M
      ptr += MINBPC(enc);
1755
9.79M
      break;
1756
434k
    default:
1757
434k
      return (int)(ptr - start);
1758
10.3M
    }
1759
10.3M
  }
1760
434k
}
xmltok.c:normal_nameLength
Line
Count
Source
1733
434k
PREFIX(nameLength)(const ENCODING *enc, const char *ptr) {
1734
434k
  const char *start = ptr;
1735
10.3M
  for (;;) {
1736
10.3M
    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
69.2k
      LEAD_CASE(2)
1742
61.3k
      LEAD_CASE(3)
1743
0
      LEAD_CASE(4)
1744
0
#  undef LEAD_CASE
1745
0
    case BT_NONASCII:
1746
8.12M
    case BT_NMSTRT:
1747
#  ifdef XML_NS
1748
    case BT_COLON:
1749
#  endif
1750
9.50M
    case BT_HEX:
1751
9.71M
    case BT_DIGIT:
1752
9.73M
    case BT_NAME:
1753
9.79M
    case BT_MINUS:
1754
9.79M
      ptr += MINBPC(enc);
1755
9.79M
      break;
1756
434k
    default:
1757
434k
      return (int)(ptr - start);
1758
10.3M
    }
1759
10.3M
  }
1760
434k
}
Unexecuted instantiation: xmltok.c:little2_nameLength
Unexecuted instantiation: xmltok.c:big2_nameLength
1761
1762
static const char *PTRFASTCALL
1763
0
PREFIX(skipS)(const ENCODING *enc, const char *ptr) {
1764
0
  for (;;) {
1765
0
    switch (BYTE_TYPE(enc, ptr)) {
1766
0
    case BT_LF:
1767
0
    case BT_CR:
1768
0
    case BT_S:
1769
0
      ptr += MINBPC(enc);
1770
0
      break;
1771
0
    default:
1772
0
      return ptr;
1773
0
    }
1774
0
  }
1775
0
}
Unexecuted instantiation: xmltok.c:normal_skipS
Unexecuted instantiation: xmltok.c:little2_skipS
Unexecuted instantiation: xmltok.c:big2_skipS
1776
1777
static void PTRCALL
1778
PREFIX(updatePosition)(const ENCODING *enc, const char *ptr, const char *end,
1779
16.5k
                       POSITION *pos) {
1780
123M
  while (HAS_CHAR(enc, ptr, end)) {
1781
123M
    switch (BYTE_TYPE(enc, ptr)) {
1782
0
#  define LEAD_CASE(n)                                                         \
1783
1.90M
  case BT_LEAD##n:                                                             \
1784
1.90M
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1785
1.90M
    pos->columnNumber++;                                                       \
1786
1.90M
    break;
1787
872k
      LEAD_CASE(2)
1788
745k
      LEAD_CASE(3)
1789
289k
      LEAD_CASE(4)
1790
0
#  undef LEAD_CASE
1791
3.99M
    case BT_LF:
1792
3.99M
      pos->columnNumber = 0;
1793
3.99M
      pos->lineNumber++;
1794
3.99M
      ptr += MINBPC(enc);
1795
3.99M
      break;
1796
5.16M
    case BT_CR:
1797
5.16M
      pos->lineNumber++;
1798
5.16M
      ptr += MINBPC(enc);
1799
5.16M
      if (HAS_CHAR(enc, ptr, end) && BYTE_TYPE(enc, ptr) == BT_LF)
1800
1.07M
        ptr += MINBPC(enc);
1801
5.16M
      pos->columnNumber = 0;
1802
5.16M
      break;
1803
112M
    default:
1804
112M
      ptr += MINBPC(enc);
1805
112M
      pos->columnNumber++;
1806
112M
      break;
1807
123M
    }
1808
123M
  }
1809
16.5k
}
xmltok.c:normal_updatePosition
Line
Count
Source
1779
16.1k
                       POSITION *pos) {
1780
123M
  while (HAS_CHAR(enc, ptr, end)) {
1781
123M
    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
872k
      LEAD_CASE(2)
1788
745k
      LEAD_CASE(3)
1789
289k
      LEAD_CASE(4)
1790
0
#  undef LEAD_CASE
1791
3.99M
    case BT_LF:
1792
3.99M
      pos->columnNumber = 0;
1793
3.99M
      pos->lineNumber++;
1794
3.99M
      ptr += MINBPC(enc);
1795
3.99M
      break;
1796
5.16M
    case BT_CR:
1797
5.16M
      pos->lineNumber++;
1798
5.16M
      ptr += MINBPC(enc);
1799
5.16M
      if (HAS_CHAR(enc, ptr, end) && BYTE_TYPE(enc, ptr) == BT_LF)
1800
1.07M
        ptr += MINBPC(enc);
1801
5.16M
      pos->columnNumber = 0;
1802
5.16M
      break;
1803
112M
    default:
1804
112M
      ptr += MINBPC(enc);
1805
112M
      pos->columnNumber++;
1806
112M
      break;
1807
123M
    }
1808
123M
  }
1809
16.1k
}
xmltok.c:little2_updatePosition
Line
Count
Source
1779
225
                       POSITION *pos) {
1780
604
  while (HAS_CHAR(enc, ptr, end)) {
1781
604
    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
604
    default:
1804
604
      ptr += MINBPC(enc);
1805
604
      pos->columnNumber++;
1806
604
      break;
1807
604
    }
1808
604
  }
1809
225
}
xmltok.c:big2_updatePosition
Line
Count
Source
1779
190
                       POSITION *pos) {
1780
4.10k
  while (HAS_CHAR(enc, ptr, end)) {
1781
4.10k
    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
4.10k
    default:
1804
4.10k
      ptr += MINBPC(enc);
1805
4.10k
      pos->columnNumber++;
1806
4.10k
      break;
1807
4.10k
    }
1808
4.10k
  }
1809
190
}
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 */