Coverage Report

Created: 2025-11-08 06:32

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
72
#    define IS_INVALID_CHAR(enc, ptr, n) (0)
46
#  endif
47
48
#  define INVALID_LEAD_CASE(n, ptr, nextTokPtr)                                \
49
803k
  case BT_LEAD##n:                                                             \
50
803k
    if (end - ptr < n)                                                         \
51
803k
      return XML_TOK_PARTIAL_CHAR;                                             \
52
803k
    if (IS_INVALID_CHAR(enc, ptr, n)) {                                        \
53
78
      *(nextTokPtr) = (ptr);                                                   \
54
78
      return XML_TOK_INVALID;                                                  \
55
78
    }                                                                          \
56
803k
    ptr += n;                                                                  \
57
803k
    break;
58
59
#  define INVALID_CASES(ptr, nextTokPtr)                                       \
60
337k
    INVALID_LEAD_CASE(2, ptr, nextTokPtr)                                      \
61
336k
    INVALID_LEAD_CASE(3, ptr, nextTokPtr)                                      \
62
326k
    INVALID_LEAD_CASE(4, ptr, nextTokPtr)                                      \
63
140k
  case BT_NONXML:                                                              \
64
48
  case BT_MALFORM:                                                             \
65
88
  case BT_TRAIL:                                                               \
66
88
    *(nextTokPtr) = (ptr);                                                     \
67
88
    return XML_TOK_INVALID;
68
69
#  define CHECK_NAME_CASE(n, enc, ptr, end, nextTokPtr)                        \
70
445k
  case BT_LEAD##n:                                                             \
71
445k
    if (end - ptr < n)                                                         \
72
445k
      return XML_TOK_PARTIAL_CHAR;                                             \
73
445k
    if (IS_INVALID_CHAR(enc, ptr, n) || ! IS_NAME_CHAR(enc, ptr, n)) {         \
74
256
      *nextTokPtr = ptr;                                                       \
75
256
      return XML_TOK_INVALID;                                                  \
76
256
    }                                                                          \
77
445k
    ptr += n;                                                                  \
78
445k
    break;
79
80
#  define CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)                          \
81
31.8M
  case BT_NONASCII:                                                            \
82
31.8M
    if (! IS_NAME_CHAR_MINBPC(enc, ptr)) {                                     \
83
44
      *nextTokPtr = ptr;                                                       \
84
44
      return XML_TOK_INVALID;                                                  \
85
44
    }                                                                          \
86
31.8M
    /* fall through */                                                         \
87
31.8M
  case BT_NMSTRT:                                                              \
88
27.3M
  case BT_HEX:                                                                 \
89
31.4M
  case BT_DIGIT:                                                               \
90
31.5M
  case BT_NAME:                                                                \
91
31.8M
  case BT_MINUS:                                                               \
92
31.8M
    ptr += MINBPC(enc);                                                        \
93
31.8M
    break;                                                                     \
94
31.8M
    CHECK_NAME_CASE(2, enc, ptr, end, nextTokPtr)                              \
95
269k
    CHECK_NAME_CASE(3, enc, ptr, end, nextTokPtr)                              \
96
268k
    CHECK_NAME_CASE(4, enc, ptr, end, nextTokPtr)
97
98
#  define CHECK_NMSTRT_CASE(n, enc, ptr, end, nextTokPtr)                      \
99
211k
  case BT_LEAD##n:                                                             \
100
211k
    if ((end) - (ptr) < (n))                                                   \
101
211k
      return XML_TOK_PARTIAL_CHAR;                                             \
102
211k
    if (IS_INVALID_CHAR(enc, ptr, n) || ! IS_NMSTRT_CHAR(enc, ptr, n)) {       \
103
143
      *nextTokPtr = ptr;                                                       \
104
143
      return XML_TOK_INVALID;                                                  \
105
143
    }                                                                          \
106
211k
    ptr += n;                                                                  \
107
211k
    break;
108
109
#  define CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)                        \
110
3.27M
  case BT_NONASCII:                                                            \
111
3.27M
    if (! IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {                                   \
112
0
      *nextTokPtr = ptr;                                                       \
113
0
      return XML_TOK_INVALID;                                                  \
114
0
    }                                                                          \
115
3.27M
    /* fall through */                                                         \
116
3.27M
  case BT_NMSTRT:                                                              \
117
3.27M
  case BT_HEX:                                                                 \
118
3.27M
    ptr += MINBPC(enc);                                                        \
119
3.27M
    break;                                                                     \
120
3.27M
    CHECK_NMSTRT_CASE(2, enc, ptr, end, nextTokPtr)                            \
121
145k
    CHECK_NMSTRT_CASE(3, enc, ptr, end, nextTokPtr)                            \
122
145k
    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
301M
    ((end) - (ptr) >= ((count) * MINBPC(enc)))
130
131
9.19M
#  define HAS_CHAR(enc, ptr, end) HAS_CHARS(enc, ptr, end, 1)
132
133
#  define REQUIRE_CHARS(enc, ptr, end, count)                                  \
134
34.5M
    {                                                                          \
135
34.5M
      if (! HAS_CHARS(enc, ptr, end, count)) {                                 \
136
527
        return XML_TOK_PARTIAL;                                                \
137
527
      }                                                                        \
138
34.5M
    }
139
140
34.5M
#  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
14.7k
                    const char **nextTokPtr) {
147
14.7k
  if (HAS_CHAR(enc, ptr, end)) {
148
14.7k
    if (! CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
149
11
      *nextTokPtr = ptr;
150
11
      return XML_TOK_INVALID;
151
11
    }
152
14.7k
    ptr += MINBPC(enc);
153
6.26M
    while (HAS_CHAR(enc, ptr, end)) {
154
6.26M
      switch (BYTE_TYPE(enc, ptr)) {
155
271k
        INVALID_CASES(ptr, nextTokPtr)
156
36.4k
      case BT_MINUS:
157
36.4k
        ptr += MINBPC(enc);
158
36.4k
        REQUIRE_CHAR(enc, ptr, end);
159
36.4k
        if (CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
160
14.6k
          ptr += MINBPC(enc);
161
14.6k
          REQUIRE_CHAR(enc, ptr, end);
162
14.6k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
163
8
            *nextTokPtr = ptr;
164
8
            return XML_TOK_INVALID;
165
8
          }
166
14.6k
          *nextTokPtr = ptr + MINBPC(enc);
167
14.6k
          return XML_TOK_COMMENT;
168
14.6k
        }
169
21.8k
        break;
170
6.09M
      default:
171
6.09M
        ptr += MINBPC(enc);
172
6.09M
        break;
173
6.26M
      }
174
6.26M
    }
175
14.7k
  }
176
74
  return XML_TOK_PARTIAL;
177
14.7k
}
xmltok.c:normal_scanComment
Line
Count
Source
146
14.7k
                    const char **nextTokPtr) {
147
14.7k
  if (HAS_CHAR(enc, ptr, end)) {
148
14.7k
    if (! CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
149
11
      *nextTokPtr = ptr;
150
11
      return XML_TOK_INVALID;
151
11
    }
152
14.7k
    ptr += MINBPC(enc);
153
6.26M
    while (HAS_CHAR(enc, ptr, end)) {
154
6.26M
      switch (BYTE_TYPE(enc, ptr)) {
155
271k
        INVALID_CASES(ptr, nextTokPtr)
156
36.4k
      case BT_MINUS:
157
36.4k
        ptr += MINBPC(enc);
158
36.4k
        REQUIRE_CHAR(enc, ptr, end);
159
36.4k
        if (CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
160
14.6k
          ptr += MINBPC(enc);
161
14.6k
          REQUIRE_CHAR(enc, ptr, end);
162
14.6k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
163
8
            *nextTokPtr = ptr;
164
8
            return XML_TOK_INVALID;
165
8
          }
166
14.6k
          *nextTokPtr = ptr + MINBPC(enc);
167
14.6k
          return XML_TOK_COMMENT;
168
14.6k
        }
169
21.8k
        break;
170
6.09M
      default:
171
6.09M
        ptr += MINBPC(enc);
172
6.09M
        break;
173
6.26M
      }
174
6.26M
    }
175
14.7k
  }
176
74
  return XML_TOK_PARTIAL;
177
14.7k
}
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
86.1k
                 const char **nextTokPtr) {
184
86.1k
  REQUIRE_CHAR(enc, ptr, end);
185
86.1k
  switch (BYTE_TYPE(enc, ptr)) {
186
2.09k
  case BT_MINUS:
187
2.09k
    return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
188
4
  case BT_LSQB:
189
4
    *nextTokPtr = ptr + MINBPC(enc);
190
4
    return XML_TOK_COND_SECT_OPEN;
191
1.08k
  case BT_NMSTRT:
192
84.0k
  case BT_HEX:
193
84.0k
    ptr += MINBPC(enc);
194
84.0k
    break;
195
3
  default:
196
3
    *nextTokPtr = ptr;
197
3
    return XML_TOK_INVALID;
198
86.1k
  }
199
590k
  while (HAS_CHAR(enc, ptr, end)) {
200
590k
    switch (BYTE_TYPE(enc, ptr)) {
201
17
    case BT_PERCNT:
202
17
      REQUIRE_CHARS(enc, ptr, end, 2);
203
      /* don't allow <!ENTITY% foo "whatever"> */
204
15
      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
15
      }
212
      /* fall through */
213
45.2k
    case BT_S:
214
79.7k
    case BT_CR:
215
83.9k
    case BT_LF:
216
83.9k
      *nextTokPtr = ptr;
217
83.9k
      return XML_TOK_DECL_OPEN;
218
476k
    case BT_NMSTRT:
219
506k
    case BT_HEX:
220
506k
      ptr += MINBPC(enc);
221
506k
      break;
222
12
    default:
223
12
      *nextTokPtr = ptr;
224
12
      return XML_TOK_INVALID;
225
590k
    }
226
590k
  }
227
70
  return XML_TOK_PARTIAL;
228
84.0k
}
xmltok.c:normal_scanDecl
Line
Count
Source
183
86.1k
                 const char **nextTokPtr) {
184
86.1k
  REQUIRE_CHAR(enc, ptr, end);
185
86.1k
  switch (BYTE_TYPE(enc, ptr)) {
186
2.09k
  case BT_MINUS:
187
2.09k
    return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
188
4
  case BT_LSQB:
189
4
    *nextTokPtr = ptr + MINBPC(enc);
190
4
    return XML_TOK_COND_SECT_OPEN;
191
1.08k
  case BT_NMSTRT:
192
84.0k
  case BT_HEX:
193
84.0k
    ptr += MINBPC(enc);
194
84.0k
    break;
195
3
  default:
196
3
    *nextTokPtr = ptr;
197
3
    return XML_TOK_INVALID;
198
86.1k
  }
199
590k
  while (HAS_CHAR(enc, ptr, end)) {
200
590k
    switch (BYTE_TYPE(enc, ptr)) {
201
17
    case BT_PERCNT:
202
17
      REQUIRE_CHARS(enc, ptr, end, 2);
203
      /* don't allow <!ENTITY% foo "whatever"> */
204
15
      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
15
      }
212
      /* fall through */
213
45.2k
    case BT_S:
214
79.7k
    case BT_CR:
215
83.9k
    case BT_LF:
216
83.9k
      *nextTokPtr = ptr;
217
83.9k
      return XML_TOK_DECL_OPEN;
218
476k
    case BT_NMSTRT:
219
506k
    case BT_HEX:
220
506k
      ptr += MINBPC(enc);
221
506k
      break;
222
12
    default:
223
12
      *nextTokPtr = ptr;
224
12
      return XML_TOK_INVALID;
225
590k
    }
226
590k
  }
227
70
  return XML_TOK_PARTIAL;
228
84.0k
}
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
33.2k
                      int *tokPtr) {
233
33.2k
  int upper = 0;
234
33.2k
  UNUSED_P(enc);
235
33.2k
  *tokPtr = XML_TOK_PI;
236
33.2k
  if (end - ptr != MINBPC(enc) * 3)
237
20.2k
    return 1;
238
12.9k
  switch (BYTE_TO_ASCII(enc, ptr)) {
239
6.83k
  case ASCII_x:
240
6.83k
    break;
241
956
  case ASCII_X:
242
956
    upper = 1;
243
956
    break;
244
5.15k
  default:
245
5.15k
    return 1;
246
12.9k
  }
247
7.78k
  ptr += MINBPC(enc);
248
7.78k
  switch (BYTE_TO_ASCII(enc, ptr)) {
249
2.08k
  case ASCII_m:
250
2.08k
    break;
251
544
  case ASCII_M:
252
544
    upper = 1;
253
544
    break;
254
5.16k
  default:
255
5.16k
    return 1;
256
7.78k
  }
257
2.62k
  ptr += MINBPC(enc);
258
2.62k
  switch (BYTE_TO_ASCII(enc, ptr)) {
259
1.16k
  case ASCII_l:
260
1.16k
    break;
261
2
  case ASCII_L:
262
2
    upper = 1;
263
2
    break;
264
1.46k
  default:
265
1.46k
    return 1;
266
2.62k
  }
267
1.16k
  if (upper)
268
5
    return 0;
269
1.15k
  *tokPtr = XML_TOK_XML_DECL;
270
1.15k
  return 1;
271
1.16k
}
xmltok.c:normal_checkPiTarget
Line
Count
Source
232
33.2k
                      int *tokPtr) {
233
33.2k
  int upper = 0;
234
33.2k
  UNUSED_P(enc);
235
33.2k
  *tokPtr = XML_TOK_PI;
236
33.2k
  if (end - ptr != MINBPC(enc) * 3)
237
20.2k
    return 1;
238
12.9k
  switch (BYTE_TO_ASCII(enc, ptr)) {
239
6.83k
  case ASCII_x:
240
6.83k
    break;
241
956
  case ASCII_X:
242
956
    upper = 1;
243
956
    break;
244
5.15k
  default:
245
5.15k
    return 1;
246
12.9k
  }
247
7.78k
  ptr += MINBPC(enc);
248
7.78k
  switch (BYTE_TO_ASCII(enc, ptr)) {
249
2.08k
  case ASCII_m:
250
2.08k
    break;
251
544
  case ASCII_M:
252
544
    upper = 1;
253
544
    break;
254
5.16k
  default:
255
5.16k
    return 1;
256
7.78k
  }
257
2.62k
  ptr += MINBPC(enc);
258
2.62k
  switch (BYTE_TO_ASCII(enc, ptr)) {
259
1.16k
  case ASCII_l:
260
1.16k
    break;
261
2
  case ASCII_L:
262
2
    upper = 1;
263
2
    break;
264
1.46k
  default:
265
1.46k
    return 1;
266
2.62k
  }
267
1.16k
  if (upper)
268
5
    return 0;
269
1.15k
  *tokPtr = XML_TOK_XML_DECL;
270
1.15k
  return 1;
271
1.16k
}
Unexecuted instantiation: xmltok.c:little2_checkPiTarget
Unexecuted instantiation: xmltok.c:big2_checkPiTarget
272
273
/* ptr points to character following "<?" */
274
275
static int PTRCALL
276
PREFIX(scanPi)(const ENCODING *enc, const char *ptr, const char *end,
277
33.3k
               const char **nextTokPtr) {
278
33.3k
  int tok;
279
33.3k
  const char *target = ptr;
280
33.3k
  REQUIRE_CHAR(enc, ptr, end);
281
33.3k
  switch (BYTE_TYPE(enc, ptr)) {
282
35.2k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
283
5
  default:
284
5
    *nextTokPtr = ptr;
285
5
    return XML_TOK_INVALID;
286
33.3k
  }
287
1.08M
  while (HAS_CHAR(enc, ptr, end)) {
288
1.08M
    switch (BYTE_TYPE(enc, ptr)) {
289
3.80M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
290
10.2k
    case BT_S:
291
12.1k
    case BT_CR:
292
16.9k
    case BT_LF:
293
16.9k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
294
2
        *nextTokPtr = ptr;
295
2
        return XML_TOK_INVALID;
296
2
      }
297
16.9k
      ptr += MINBPC(enc);
298
11.3M
      while (HAS_CHAR(enc, ptr, end)) {
299
11.3M
        switch (BYTE_TYPE(enc, ptr)) {
300
381k
          INVALID_CASES(ptr, nextTokPtr)
301
71.9k
        case BT_QUEST:
302
71.9k
          ptr += MINBPC(enc);
303
71.9k
          REQUIRE_CHAR(enc, ptr, end);
304
71.9k
          if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
305
16.7k
            *nextTokPtr = ptr + MINBPC(enc);
306
16.7k
            return tok;
307
16.7k
          }
308
55.1k
          break;
309
11.1M
        default:
310
11.1M
          ptr += MINBPC(enc);
311
11.1M
          break;
312
11.3M
        }
313
11.3M
      }
314
126
      return XML_TOK_PARTIAL;
315
16.3k
    case BT_QUEST:
316
16.3k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
317
3
        *nextTokPtr = ptr;
318
3
        return XML_TOK_INVALID;
319
3
      }
320
16.3k
      ptr += MINBPC(enc);
321
16.3k
      REQUIRE_CHAR(enc, ptr, end);
322
16.2k
      if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
323
16.2k
        *nextTokPtr = ptr + MINBPC(enc);
324
16.2k
        return tok;
325
16.2k
      }
326
      /* fall through */
327
28
    default:
328
28
      *nextTokPtr = ptr;
329
28
      return XML_TOK_INVALID;
330
1.08M
    }
331
1.08M
  }
332
64
  return XML_TOK_PARTIAL;
333
33.3k
}
xmltok.c:normal_scanPi
Line
Count
Source
277
33.3k
               const char **nextTokPtr) {
278
33.3k
  int tok;
279
33.3k
  const char *target = ptr;
280
33.3k
  REQUIRE_CHAR(enc, ptr, end);
281
33.3k
  switch (BYTE_TYPE(enc, ptr)) {
282
35.2k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
283
5
  default:
284
5
    *nextTokPtr = ptr;
285
5
    return XML_TOK_INVALID;
286
33.3k
  }
287
1.08M
  while (HAS_CHAR(enc, ptr, end)) {
288
1.08M
    switch (BYTE_TYPE(enc, ptr)) {
289
3.80M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
290
10.2k
    case BT_S:
291
12.1k
    case BT_CR:
292
16.9k
    case BT_LF:
293
16.9k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
294
2
        *nextTokPtr = ptr;
295
2
        return XML_TOK_INVALID;
296
2
      }
297
16.9k
      ptr += MINBPC(enc);
298
11.3M
      while (HAS_CHAR(enc, ptr, end)) {
299
11.3M
        switch (BYTE_TYPE(enc, ptr)) {
300
381k
          INVALID_CASES(ptr, nextTokPtr)
301
71.9k
        case BT_QUEST:
302
71.9k
          ptr += MINBPC(enc);
303
71.9k
          REQUIRE_CHAR(enc, ptr, end);
304
71.9k
          if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
305
16.7k
            *nextTokPtr = ptr + MINBPC(enc);
306
16.7k
            return tok;
307
16.7k
          }
308
55.1k
          break;
309
11.1M
        default:
310
11.1M
          ptr += MINBPC(enc);
311
11.1M
          break;
312
11.3M
        }
313
11.3M
      }
314
126
      return XML_TOK_PARTIAL;
315
16.3k
    case BT_QUEST:
316
16.3k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
317
3
        *nextTokPtr = ptr;
318
3
        return XML_TOK_INVALID;
319
3
      }
320
16.3k
      ptr += MINBPC(enc);
321
16.3k
      REQUIRE_CHAR(enc, ptr, end);
322
16.2k
      if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
323
16.2k
        *nextTokPtr = ptr + MINBPC(enc);
324
16.2k
        return tok;
325
16.2k
      }
326
      /* fall through */
327
28
    default:
328
28
      *nextTokPtr = ptr;
329
28
      return XML_TOK_INVALID;
330
1.08M
    }
331
1.08M
  }
332
64
  return XML_TOK_PARTIAL;
333
33.3k
}
Unexecuted instantiation: xmltok.c:little2_scanPi
Unexecuted instantiation: xmltok.c:big2_scanPi
334
335
static int PTRCALL
336
PREFIX(scanCdataSection)(const ENCODING *enc, const char *ptr, const char *end,
337
1.87k
                         const char **nextTokPtr) {
338
1.87k
  static const char CDATA_LSQB[]
339
1.87k
      = {ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, ASCII_LSQB};
340
1.87k
  int i;
341
1.87k
  UNUSED_P(enc);
342
  /* CDATA[ */
343
1.87k
  REQUIRE_CHARS(enc, ptr, end, 6);
344
12.7k
  for (i = 0; i < 6; i++, ptr += MINBPC(enc)) {
345
10.9k
    if (! CHAR_MATCHES(enc, ptr, CDATA_LSQB[i])) {
346
50
      *nextTokPtr = ptr;
347
50
      return XML_TOK_INVALID;
348
50
    }
349
10.9k
  }
350
1.80k
  *nextTokPtr = ptr;
351
1.80k
  return XML_TOK_CDATA_SECT_OPEN;
352
1.85k
}
xmltok.c:normal_scanCdataSection
Line
Count
Source
337
1.87k
                         const char **nextTokPtr) {
338
1.87k
  static const char CDATA_LSQB[]
339
1.87k
      = {ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, ASCII_LSQB};
340
1.87k
  int i;
341
1.87k
  UNUSED_P(enc);
342
  /* CDATA[ */
343
1.87k
  REQUIRE_CHARS(enc, ptr, end, 6);
344
12.7k
  for (i = 0; i < 6; i++, ptr += MINBPC(enc)) {
345
10.9k
    if (! CHAR_MATCHES(enc, ptr, CDATA_LSQB[i])) {
346
50
      *nextTokPtr = ptr;
347
50
      return XML_TOK_INVALID;
348
50
    }
349
10.9k
  }
350
1.80k
  *nextTokPtr = ptr;
351
1.80k
  return XML_TOK_CDATA_SECT_OPEN;
352
1.85k
}
Unexecuted instantiation: xmltok.c:little2_scanCdataSection
Unexecuted instantiation: xmltok.c:big2_scanCdataSection
353
354
static int PTRCALL
355
PREFIX(cdataSectionTok)(const ENCODING *enc, const char *ptr, const char *end,
356
3.74M
                        const char **nextTokPtr) {
357
3.74M
  if (ptr >= end)
358
154
    return XML_TOK_NONE;
359
3.74M
  if (MINBPC(enc) > 1) {
360
0
    size_t n = end - ptr;
361
0
    if (n & (MINBPC(enc) - 1)) {
362
0
      n &= ~(MINBPC(enc) - 1);
363
0
      if (n == 0)
364
0
        return XML_TOK_PARTIAL;
365
0
      end = ptr + n;
366
0
    }
367
0
  }
368
3.74M
  switch (BYTE_TYPE(enc, ptr)) {
369
395k
  case BT_RSQB:
370
395k
    ptr += MINBPC(enc);
371
395k
    REQUIRE_CHAR(enc, ptr, end);
372
395k
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
373
199k
      break;
374
196k
    ptr += MINBPC(enc);
375
196k
    REQUIRE_CHAR(enc, ptr, end);
376
196k
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
377
194k
      ptr -= MINBPC(enc);
378
194k
      break;
379
194k
    }
380
1.67k
    *nextTokPtr = ptr + MINBPC(enc);
381
1.67k
    return XML_TOK_CDATA_SECT_CLOSE;
382
1.46M
  case BT_CR:
383
1.46M
    ptr += MINBPC(enc);
384
1.46M
    REQUIRE_CHAR(enc, ptr, end);
385
1.46M
    if (BYTE_TYPE(enc, ptr) == BT_LF)
386
403k
      ptr += MINBPC(enc);
387
1.46M
    *nextTokPtr = ptr;
388
1.46M
    return XML_TOK_DATA_NEWLINE;
389
1.18M
  case BT_LF:
390
1.18M
    *nextTokPtr = ptr + MINBPC(enc);
391
1.18M
    return XML_TOK_DATA_NEWLINE;
392
1.18M
    INVALID_CASES(ptr, nextTokPtr)
393
638k
  default:
394
638k
    ptr += MINBPC(enc);
395
638k
    break;
396
3.74M
  }
397
28.2M
  while (HAS_CHAR(enc, ptr, end)) {
398
28.2M
    switch (BYTE_TYPE(enc, ptr)) {
399
0
#  define LEAD_CASE(n)                                                         \
400
427k
  case BT_LEAD##n:                                                             \
401
427k
    if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) {                       \
402
13
      *nextTokPtr = ptr;                                                       \
403
13
      return XML_TOK_DATA_CHARS;                                               \
404
13
    }                                                                          \
405
427k
    ptr += n;                                                                  \
406
427k
    break;
407
173k
      LEAD_CASE(2)
408
194k
      LEAD_CASE(3)
409
60.2k
      LEAD_CASE(4)
410
0
#  undef LEAD_CASE
411
9
    case BT_NONXML:
412
10
    case BT_MALFORM:
413
16
    case BT_TRAIL:
414
447k
    case BT_CR:
415
753k
    case BT_LF:
416
1.10M
    case BT_RSQB:
417
1.10M
      *nextTokPtr = ptr;
418
1.10M
      return XML_TOK_DATA_CHARS;
419
26.6M
    default:
420
26.6M
      ptr += MINBPC(enc);
421
26.6M
      break;
422
28.2M
    }
423
28.2M
  }
424
41
  *nextTokPtr = ptr;
425
41
  return XML_TOK_DATA_CHARS;
426
1.10M
}
xmltok.c:normal_cdataSectionTok
Line
Count
Source
356
3.74M
                        const char **nextTokPtr) {
357
3.74M
  if (ptr >= end)
358
154
    return XML_TOK_NONE;
359
3.74M
  if (MINBPC(enc) > 1) {
360
0
    size_t n = end - ptr;
361
0
    if (n & (MINBPC(enc) - 1)) {
362
0
      n &= ~(MINBPC(enc) - 1);
363
0
      if (n == 0)
364
0
        return XML_TOK_PARTIAL;
365
0
      end = ptr + n;
366
0
    }
367
0
  }
368
3.74M
  switch (BYTE_TYPE(enc, ptr)) {
369
395k
  case BT_RSQB:
370
395k
    ptr += MINBPC(enc);
371
395k
    REQUIRE_CHAR(enc, ptr, end);
372
395k
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
373
199k
      break;
374
196k
    ptr += MINBPC(enc);
375
196k
    REQUIRE_CHAR(enc, ptr, end);
376
196k
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
377
194k
      ptr -= MINBPC(enc);
378
194k
      break;
379
194k
    }
380
1.67k
    *nextTokPtr = ptr + MINBPC(enc);
381
1.67k
    return XML_TOK_CDATA_SECT_CLOSE;
382
1.46M
  case BT_CR:
383
1.46M
    ptr += MINBPC(enc);
384
1.46M
    REQUIRE_CHAR(enc, ptr, end);
385
1.46M
    if (BYTE_TYPE(enc, ptr) == BT_LF)
386
403k
      ptr += MINBPC(enc);
387
1.46M
    *nextTokPtr = ptr;
388
1.46M
    return XML_TOK_DATA_NEWLINE;
389
1.18M
  case BT_LF:
390
1.18M
    *nextTokPtr = ptr + MINBPC(enc);
391
1.18M
    return XML_TOK_DATA_NEWLINE;
392
1.18M
    INVALID_CASES(ptr, nextTokPtr)
393
638k
  default:
394
638k
    ptr += MINBPC(enc);
395
638k
    break;
396
3.74M
  }
397
28.2M
  while (HAS_CHAR(enc, ptr, end)) {
398
28.2M
    switch (BYTE_TYPE(enc, ptr)) {
399
0
#  define LEAD_CASE(n)                                                         \
400
0
  case BT_LEAD##n:                                                             \
401
0
    if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) {                       \
402
0
      *nextTokPtr = ptr;                                                       \
403
0
      return XML_TOK_DATA_CHARS;                                               \
404
0
    }                                                                          \
405
0
    ptr += n;                                                                  \
406
0
    break;
407
173k
      LEAD_CASE(2)
408
194k
      LEAD_CASE(3)
409
60.2k
      LEAD_CASE(4)
410
0
#  undef LEAD_CASE
411
9
    case BT_NONXML:
412
10
    case BT_MALFORM:
413
16
    case BT_TRAIL:
414
447k
    case BT_CR:
415
753k
    case BT_LF:
416
1.10M
    case BT_RSQB:
417
1.10M
      *nextTokPtr = ptr;
418
1.10M
      return XML_TOK_DATA_CHARS;
419
26.6M
    default:
420
26.6M
      ptr += MINBPC(enc);
421
26.6M
      break;
422
28.2M
    }
423
28.2M
  }
424
41
  *nextTokPtr = ptr;
425
41
  return XML_TOK_DATA_CHARS;
426
1.10M
}
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
54.2k
                   const char **nextTokPtr) {
433
54.2k
  REQUIRE_CHAR(enc, ptr, end);
434
54.1k
  switch (BYTE_TYPE(enc, ptr)) {
435
61.6k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
436
9
  default:
437
9
    *nextTokPtr = ptr;
438
9
    return XML_TOK_INVALID;
439
54.1k
  }
440
734k
  while (HAS_CHAR(enc, ptr, end)) {
441
734k
    switch (BYTE_TYPE(enc, ptr)) {
442
2.03M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
443
588
    case BT_S:
444
1.34k
    case BT_CR:
445
5.72k
    case BT_LF:
446
13.1k
      for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
447
13.1k
        switch (BYTE_TYPE(enc, ptr)) {
448
1.08k
        case BT_S:
449
2.87k
        case BT_CR:
450
7.49k
        case BT_LF:
451
7.49k
          break;
452
5.68k
        case BT_GT:
453
5.68k
          *nextTokPtr = ptr + MINBPC(enc);
454
5.68k
          return XML_TOK_END_TAG;
455
4
        default:
456
4
          *nextTokPtr = ptr;
457
4
          return XML_TOK_INVALID;
458
13.1k
        }
459
13.1k
      }
460
38
      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
48.3k
    case BT_GT:
469
48.3k
      *nextTokPtr = ptr + MINBPC(enc);
470
48.3k
      return XML_TOK_END_TAG;
471
9
    default:
472
9
      *nextTokPtr = ptr;
473
9
      return XML_TOK_INVALID;
474
734k
    }
475
734k
  }
476
98
  return XML_TOK_PARTIAL;
477
54.1k
}
xmltok.c:normal_scanEndTag
Line
Count
Source
432
54.2k
                   const char **nextTokPtr) {
433
54.2k
  REQUIRE_CHAR(enc, ptr, end);
434
54.1k
  switch (BYTE_TYPE(enc, ptr)) {
435
61.6k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
436
9
  default:
437
9
    *nextTokPtr = ptr;
438
9
    return XML_TOK_INVALID;
439
54.1k
  }
440
734k
  while (HAS_CHAR(enc, ptr, end)) {
441
734k
    switch (BYTE_TYPE(enc, ptr)) {
442
2.03M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
443
588
    case BT_S:
444
1.34k
    case BT_CR:
445
5.72k
    case BT_LF:
446
13.1k
      for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
447
13.1k
        switch (BYTE_TYPE(enc, ptr)) {
448
1.08k
        case BT_S:
449
2.87k
        case BT_CR:
450
7.49k
        case BT_LF:
451
7.49k
          break;
452
5.68k
        case BT_GT:
453
5.68k
          *nextTokPtr = ptr + MINBPC(enc);
454
5.68k
          return XML_TOK_END_TAG;
455
4
        default:
456
4
          *nextTokPtr = ptr;
457
4
          return XML_TOK_INVALID;
458
13.1k
        }
459
13.1k
      }
460
38
      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
48.3k
    case BT_GT:
469
48.3k
      *nextTokPtr = ptr + MINBPC(enc);
470
48.3k
      return XML_TOK_END_TAG;
471
9
    default:
472
9
      *nextTokPtr = ptr;
473
9
      return XML_TOK_INVALID;
474
734k
    }
475
734k
  }
476
98
  return XML_TOK_PARTIAL;
477
54.1k
}
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
241k
                       const char **nextTokPtr) {
484
241k
  if (HAS_CHAR(enc, ptr, end)) {
485
241k
    switch (BYTE_TYPE(enc, ptr)) {
486
82.7k
    case BT_DIGIT:
487
241k
    case BT_HEX:
488
241k
      break;
489
2
    default:
490
2
      *nextTokPtr = ptr;
491
2
      return XML_TOK_INVALID;
492
241k
    }
493
879k
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
494
879k
      switch (BYTE_TYPE(enc, ptr)) {
495
388k
      case BT_DIGIT:
496
638k
      case BT_HEX:
497
638k
        break;
498
240k
      case BT_SEMI:
499
240k
        *nextTokPtr = ptr + MINBPC(enc);
500
240k
        return XML_TOK_CHAR_REF;
501
7
      default:
502
7
        *nextTokPtr = ptr;
503
7
        return XML_TOK_INVALID;
504
879k
      }
505
879k
    }
506
241k
  }
507
29
  return XML_TOK_PARTIAL;
508
241k
}
xmltok.c:normal_scanHexCharRef
Line
Count
Source
483
241k
                       const char **nextTokPtr) {
484
241k
  if (HAS_CHAR(enc, ptr, end)) {
485
241k
    switch (BYTE_TYPE(enc, ptr)) {
486
82.7k
    case BT_DIGIT:
487
241k
    case BT_HEX:
488
241k
      break;
489
2
    default:
490
2
      *nextTokPtr = ptr;
491
2
      return XML_TOK_INVALID;
492
241k
    }
493
879k
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
494
879k
      switch (BYTE_TYPE(enc, ptr)) {
495
388k
      case BT_DIGIT:
496
638k
      case BT_HEX:
497
638k
        break;
498
240k
      case BT_SEMI:
499
240k
        *nextTokPtr = ptr + MINBPC(enc);
500
240k
        return XML_TOK_CHAR_REF;
501
7
      default:
502
7
        *nextTokPtr = ptr;
503
7
        return XML_TOK_INVALID;
504
879k
      }
505
879k
    }
506
241k
  }
507
29
  return XML_TOK_PARTIAL;
508
241k
}
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
247k
                    const char **nextTokPtr) {
515
247k
  if (HAS_CHAR(enc, ptr, end)) {
516
247k
    if (CHAR_MATCHES(enc, ptr, ASCII_x))
517
241k
      return PREFIX(scanHexCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
518
6.59k
    switch (BYTE_TYPE(enc, ptr)) {
519
6.57k
    case BT_DIGIT:
520
6.57k
      break;
521
14
    default:
522
14
      *nextTokPtr = ptr;
523
14
      return XML_TOK_INVALID;
524
6.59k
    }
525
19.0k
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
526
19.0k
      switch (BYTE_TYPE(enc, ptr)) {
527
12.4k
      case BT_DIGIT:
528
12.4k
        break;
529
6.56k
      case BT_SEMI:
530
6.56k
        *nextTokPtr = ptr + MINBPC(enc);
531
6.56k
        return XML_TOK_CHAR_REF;
532
1
      default:
533
1
        *nextTokPtr = ptr;
534
1
        return XML_TOK_INVALID;
535
19.0k
      }
536
19.0k
    }
537
6.57k
  }
538
18
  return XML_TOK_PARTIAL;
539
247k
}
xmltok.c:normal_scanCharRef
Line
Count
Source
514
247k
                    const char **nextTokPtr) {
515
247k
  if (HAS_CHAR(enc, ptr, end)) {
516
247k
    if (CHAR_MATCHES(enc, ptr, ASCII_x))
517
241k
      return PREFIX(scanHexCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
518
6.59k
    switch (BYTE_TYPE(enc, ptr)) {
519
6.57k
    case BT_DIGIT:
520
6.57k
      break;
521
14
    default:
522
14
      *nextTokPtr = ptr;
523
14
      return XML_TOK_INVALID;
524
6.59k
    }
525
19.0k
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
526
19.0k
      switch (BYTE_TYPE(enc, ptr)) {
527
12.4k
      case BT_DIGIT:
528
12.4k
        break;
529
6.56k
      case BT_SEMI:
530
6.56k
        *nextTokPtr = ptr + MINBPC(enc);
531
6.56k
        return XML_TOK_CHAR_REF;
532
1
      default:
533
1
        *nextTokPtr = ptr;
534
1
        return XML_TOK_INVALID;
535
19.0k
      }
536
19.0k
    }
537
6.57k
  }
538
18
  return XML_TOK_PARTIAL;
539
247k
}
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
503k
                const char **nextTokPtr) {
546
503k
  REQUIRE_CHAR(enc, ptr, end);
547
503k
  switch (BYTE_TYPE(enc, ptr)) {
548
237k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
549
247k
  case BT_NUM:
550
247k
    return PREFIX(scanCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
551
5
  default:
552
5
    *nextTokPtr = ptr;
553
5
    return XML_TOK_INVALID;
554
503k
  }
555
2.67M
  while (HAS_CHAR(enc, ptr, end)) {
556
2.67M
    switch (BYTE_TYPE(enc, ptr)) {
557
8.96M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
558
255k
    case BT_SEMI:
559
255k
      *nextTokPtr = ptr + MINBPC(enc);
560
255k
      return XML_TOK_ENTITY_REF;
561
13
    default:
562
13
      *nextTokPtr = ptr;
563
13
      return XML_TOK_INVALID;
564
2.67M
    }
565
2.67M
  }
566
60
  return XML_TOK_PARTIAL;
567
255k
}
xmltok.c:normal_scanRef
Line
Count
Source
545
503k
                const char **nextTokPtr) {
546
503k
  REQUIRE_CHAR(enc, ptr, end);
547
503k
  switch (BYTE_TYPE(enc, ptr)) {
548
237k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
549
247k
  case BT_NUM:
550
247k
    return PREFIX(scanCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
551
5
  default:
552
5
    *nextTokPtr = ptr;
553
5
    return XML_TOK_INVALID;
554
503k
  }
555
2.67M
  while (HAS_CHAR(enc, ptr, end)) {
556
2.67M
    switch (BYTE_TYPE(enc, ptr)) {
557
8.96M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
558
255k
    case BT_SEMI:
559
255k
      *nextTokPtr = ptr + MINBPC(enc);
560
255k
      return XML_TOK_ENTITY_REF;
561
13
    default:
562
13
      *nextTokPtr = ptr;
563
13
      return XML_TOK_INVALID;
564
2.67M
    }
565
2.67M
  }
566
60
  return XML_TOK_PARTIAL;
567
255k
}
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
39.2k
                 const char **nextTokPtr) {
574
#  ifdef XML_NS
575
  int hadColon = 0;
576
#  endif
577
3.05M
  while (HAS_CHAR(enc, ptr, end)) {
578
3.05M
    switch (BYTE_TYPE(enc, ptr)) {
579
1.83M
      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
2.05k
    case BT_S:
598
13.7k
    case BT_CR:
599
14.7k
    case BT_LF:
600
27.9k
      for (;;) {
601
27.9k
        int t;
602
603
27.9k
        ptr += MINBPC(enc);
604
27.9k
        REQUIRE_CHAR(enc, ptr, end);
605
27.8k
        t = BYTE_TYPE(enc, ptr);
606
27.8k
        if (t == BT_EQUALS)
607
14.6k
          break;
608
13.1k
        switch (t) {
609
2.71k
        case BT_S:
610
3.44k
        case BT_LF:
611
13.1k
        case BT_CR:
612
13.1k
          break;
613
14
        default:
614
14
          *nextTokPtr = ptr;
615
14
          return XML_TOK_INVALID;
616
13.1k
        }
617
13.1k
      }
618
      /* fall through */
619
2.51M
    case BT_EQUALS: {
620
2.51M
      int open;
621
#  ifdef XML_NS
622
      hadColon = 0;
623
#  endif
624
2.56M
      for (;;) {
625
2.56M
        ptr += MINBPC(enc);
626
2.56M
        REQUIRE_CHAR(enc, ptr, end);
627
2.56M
        open = BYTE_TYPE(enc, ptr);
628
2.56M
        if (open == BT_QUOT || open == BT_APOS)
629
2.51M
          break;
630
56.8k
        switch (open) {
631
12.1k
        case BT_S:
632
25.0k
        case BT_LF:
633
56.8k
        case BT_CR:
634
56.8k
          break;
635
16
        default:
636
16
          *nextTokPtr = ptr;
637
16
          return XML_TOK_INVALID;
638
56.8k
        }
639
56.8k
      }
640
2.51M
      ptr += MINBPC(enc);
641
      /* in attribute value */
642
22.9M
      for (;;) {
643
22.9M
        int t;
644
22.9M
        REQUIRE_CHAR(enc, ptr, end);
645
22.9M
        t = BYTE_TYPE(enc, ptr);
646
22.9M
        if (t == open)
647
2.51M
          break;
648
20.3M
        switch (t) {
649
550k
          INVALID_CASES(ptr, nextTokPtr)
650
155k
        case BT_AMP: {
651
155k
          int tok = PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, &ptr);
652
155k
          if (tok <= 0) {
653
40
            if (tok == XML_TOK_INVALID)
654
22
              *nextTokPtr = ptr;
655
40
            return tok;
656
40
          }
657
155k
          break;
658
155k
        }
659
155k
        case BT_LT:
660
4
          *nextTokPtr = ptr;
661
4
          return XML_TOK_INVALID;
662
19.9M
        default:
663
19.9M
          ptr += MINBPC(enc);
664
19.9M
          break;
665
20.3M
        }
666
20.3M
      }
667
2.51M
      ptr += MINBPC(enc);
668
2.51M
      REQUIRE_CHAR(enc, ptr, end);
669
2.51M
      switch (BYTE_TYPE(enc, ptr)) {
670
1.28M
      case BT_S:
671
2.43M
      case BT_CR:
672
2.48M
      case BT_LF:
673
2.48M
        break;
674
21.8k
      case BT_SOL:
675
21.8k
        goto sol;
676
4.78k
      case BT_GT:
677
4.78k
        goto gt;
678
6
      default:
679
6
        *nextTokPtr = ptr;
680
6
        return XML_TOK_INVALID;
681
2.51M
      }
682
      /* ptr points to closing quote */
683
2.72M
      for (;;) {
684
2.72M
        ptr += MINBPC(enc);
685
2.72M
        REQUIRE_CHAR(enc, ptr, end);
686
2.72M
        switch (BYTE_TYPE(enc, ptr)) {
687
2.46M
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
688
167k
        case BT_S:
689
212k
        case BT_CR:
690
246k
        case BT_LF:
691
246k
          continue;
692
940
        case BT_GT:
693
5.72k
        gt:
694
5.72k
          *nextTokPtr = ptr + MINBPC(enc);
695
5.72k
          return XML_TOK_START_TAG_WITH_ATTS;
696
11.1k
        case BT_SOL:
697
32.9k
        sol:
698
32.9k
          ptr += MINBPC(enc);
699
32.9k
          REQUIRE_CHAR(enc, ptr, end);
700
32.9k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
701
10
            *nextTokPtr = ptr;
702
10
            return XML_TOK_INVALID;
703
10
          }
704
32.9k
          *nextTokPtr = ptr + MINBPC(enc);
705
32.9k
          return XML_TOK_EMPTY_ELEMENT_WITH_ATTS;
706
6
        default:
707
6
          *nextTokPtr = ptr;
708
6
          return XML_TOK_INVALID;
709
2.72M
        }
710
2.47M
        break;
711
2.72M
      }
712
2.47M
      break;
713
2.48M
    }
714
2.47M
    default:
715
14
      *nextTokPtr = ptr;
716
14
      return XML_TOK_INVALID;
717
3.05M
    }
718
3.05M
  }
719
106
  return XML_TOK_PARTIAL;
720
39.2k
}
xmltok.c:normal_scanAtts
Line
Count
Source
573
39.2k
                 const char **nextTokPtr) {
574
#  ifdef XML_NS
575
  int hadColon = 0;
576
#  endif
577
3.05M
  while (HAS_CHAR(enc, ptr, end)) {
578
3.05M
    switch (BYTE_TYPE(enc, ptr)) {
579
1.83M
      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
2.05k
    case BT_S:
598
13.7k
    case BT_CR:
599
14.7k
    case BT_LF:
600
27.9k
      for (;;) {
601
27.9k
        int t;
602
603
27.9k
        ptr += MINBPC(enc);
604
27.9k
        REQUIRE_CHAR(enc, ptr, end);
605
27.8k
        t = BYTE_TYPE(enc, ptr);
606
27.8k
        if (t == BT_EQUALS)
607
14.6k
          break;
608
13.1k
        switch (t) {
609
2.71k
        case BT_S:
610
3.44k
        case BT_LF:
611
13.1k
        case BT_CR:
612
13.1k
          break;
613
14
        default:
614
14
          *nextTokPtr = ptr;
615
14
          return XML_TOK_INVALID;
616
13.1k
        }
617
13.1k
      }
618
      /* fall through */
619
2.51M
    case BT_EQUALS: {
620
2.51M
      int open;
621
#  ifdef XML_NS
622
      hadColon = 0;
623
#  endif
624
2.56M
      for (;;) {
625
2.56M
        ptr += MINBPC(enc);
626
2.56M
        REQUIRE_CHAR(enc, ptr, end);
627
2.56M
        open = BYTE_TYPE(enc, ptr);
628
2.56M
        if (open == BT_QUOT || open == BT_APOS)
629
2.51M
          break;
630
56.8k
        switch (open) {
631
12.1k
        case BT_S:
632
25.0k
        case BT_LF:
633
56.8k
        case BT_CR:
634
56.8k
          break;
635
16
        default:
636
16
          *nextTokPtr = ptr;
637
16
          return XML_TOK_INVALID;
638
56.8k
        }
639
56.8k
      }
640
2.51M
      ptr += MINBPC(enc);
641
      /* in attribute value */
642
22.9M
      for (;;) {
643
22.9M
        int t;
644
22.9M
        REQUIRE_CHAR(enc, ptr, end);
645
22.9M
        t = BYTE_TYPE(enc, ptr);
646
22.9M
        if (t == open)
647
2.51M
          break;
648
20.3M
        switch (t) {
649
550k
          INVALID_CASES(ptr, nextTokPtr)
650
155k
        case BT_AMP: {
651
155k
          int tok = PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, &ptr);
652
155k
          if (tok <= 0) {
653
40
            if (tok == XML_TOK_INVALID)
654
22
              *nextTokPtr = ptr;
655
40
            return tok;
656
40
          }
657
155k
          break;
658
155k
        }
659
155k
        case BT_LT:
660
4
          *nextTokPtr = ptr;
661
4
          return XML_TOK_INVALID;
662
19.9M
        default:
663
19.9M
          ptr += MINBPC(enc);
664
19.9M
          break;
665
20.3M
        }
666
20.3M
      }
667
2.51M
      ptr += MINBPC(enc);
668
2.51M
      REQUIRE_CHAR(enc, ptr, end);
669
2.51M
      switch (BYTE_TYPE(enc, ptr)) {
670
1.28M
      case BT_S:
671
2.43M
      case BT_CR:
672
2.48M
      case BT_LF:
673
2.48M
        break;
674
21.8k
      case BT_SOL:
675
21.8k
        goto sol;
676
4.78k
      case BT_GT:
677
4.78k
        goto gt;
678
6
      default:
679
6
        *nextTokPtr = ptr;
680
6
        return XML_TOK_INVALID;
681
2.51M
      }
682
      /* ptr points to closing quote */
683
2.72M
      for (;;) {
684
2.72M
        ptr += MINBPC(enc);
685
2.72M
        REQUIRE_CHAR(enc, ptr, end);
686
2.72M
        switch (BYTE_TYPE(enc, ptr)) {
687
2.46M
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
688
167k
        case BT_S:
689
212k
        case BT_CR:
690
246k
        case BT_LF:
691
246k
          continue;
692
940
        case BT_GT:
693
5.72k
        gt:
694
5.72k
          *nextTokPtr = ptr + MINBPC(enc);
695
5.72k
          return XML_TOK_START_TAG_WITH_ATTS;
696
11.1k
        case BT_SOL:
697
32.9k
        sol:
698
32.9k
          ptr += MINBPC(enc);
699
32.9k
          REQUIRE_CHAR(enc, ptr, end);
700
32.9k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
701
10
            *nextTokPtr = ptr;
702
10
            return XML_TOK_INVALID;
703
10
          }
704
32.9k
          *nextTokPtr = ptr + MINBPC(enc);
705
32.9k
          return XML_TOK_EMPTY_ELEMENT_WITH_ATTS;
706
6
        default:
707
6
          *nextTokPtr = ptr;
708
6
          return XML_TOK_INVALID;
709
2.72M
        }
710
2.47M
        break;
711
2.72M
      }
712
2.47M
      break;
713
2.48M
    }
714
2.47M
    default:
715
14
      *nextTokPtr = ptr;
716
14
      return XML_TOK_INVALID;
717
3.05M
    }
718
3.05M
  }
719
106
  return XML_TOK_PARTIAL;
720
39.2k
}
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
533k
               const char **nextTokPtr) {
727
#  ifdef XML_NS
728
  int hadColon;
729
#  endif
730
533k
  REQUIRE_CHAR(enc, ptr, end);
731
533k
  switch (BYTE_TYPE(enc, ptr)) {
732
387k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
733
14.5k
  case BT_EXCL:
734
14.5k
    ptr += MINBPC(enc);
735
14.5k
    REQUIRE_CHAR(enc, ptr, end);
736
14.5k
    switch (BYTE_TYPE(enc, ptr)) {
737
12.7k
    case BT_MINUS:
738
12.7k
      return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
739
1.87k
    case BT_LSQB:
740
1.87k
      return PREFIX(scanCdataSection)(enc, ptr + MINBPC(enc), end, nextTokPtr);
741
14.5k
    }
742
2
    *nextTokPtr = ptr;
743
2
    return XML_TOK_INVALID;
744
23.6k
  case BT_QUEST:
745
23.6k
    return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
746
54.2k
  case BT_SOL:
747
54.2k
    return PREFIX(scanEndTag)(enc, ptr + MINBPC(enc), end, nextTokPtr);
748
7
  default:
749
7
    *nextTokPtr = ptr;
750
7
    return XML_TOK_INVALID;
751
533k
  }
752
#  ifdef XML_NS
753
  hadColon = 0;
754
#  endif
755
  /* we have a start-tag */
756
8.63M
  while (HAS_CHAR(enc, ptr, end)) {
757
8.63M
    switch (BYTE_TYPE(enc, ptr)) {
758
32.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
38.7k
    case BT_S:
777
47.6k
    case BT_CR:
778
52.8k
    case BT_LF: {
779
52.8k
      ptr += MINBPC(enc);
780
75.8k
      while (HAS_CHAR(enc, ptr, end)) {
781
75.8k
        switch (BYTE_TYPE(enc, ptr)) {
782
28.8k
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
783
978
        case BT_GT:
784
978
          goto gt;
785
12.5k
        case BT_SOL:
786
12.5k
          goto sol;
787
2.63k
        case BT_S:
788
21.9k
        case BT_CR:
789
23.0k
        case BT_LF:
790
23.0k
          ptr += MINBPC(enc);
791
23.0k
          continue;
792
14
        default:
793
14
          *nextTokPtr = ptr;
794
14
          return XML_TOK_INVALID;
795
75.8k
        }
796
39.2k
        return PREFIX(scanAtts)(enc, ptr, end, nextTokPtr);
797
75.8k
      }
798
54
      return XML_TOK_PARTIAL;
799
52.8k
    }
800
357k
    case BT_GT:
801
358k
    gt:
802
358k
      *nextTokPtr = ptr + MINBPC(enc);
803
358k
      return XML_TOK_START_TAG_NO_ATTS;
804
30.2k
    case BT_SOL:
805
42.8k
    sol:
806
42.8k
      ptr += MINBPC(enc);
807
42.8k
      REQUIRE_CHAR(enc, ptr, end);
808
42.7k
      if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
809
14
        *nextTokPtr = ptr;
810
14
        return XML_TOK_INVALID;
811
14
      }
812
42.7k
      *nextTokPtr = ptr + MINBPC(enc);
813
42.7k
      return XML_TOK_EMPTY_ELEMENT_NO_ATTS;
814
12
    default:
815
12
      *nextTokPtr = ptr;
816
12
      return XML_TOK_INVALID;
817
8.63M
    }
818
8.63M
  }
819
120
  return XML_TOK_PARTIAL;
820
441k
}
xmltok.c:normal_scanLt
Line
Count
Source
726
533k
               const char **nextTokPtr) {
727
#  ifdef XML_NS
728
  int hadColon;
729
#  endif
730
533k
  REQUIRE_CHAR(enc, ptr, end);
731
533k
  switch (BYTE_TYPE(enc, ptr)) {
732
387k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
733
14.5k
  case BT_EXCL:
734
14.5k
    ptr += MINBPC(enc);
735
14.5k
    REQUIRE_CHAR(enc, ptr, end);
736
14.5k
    switch (BYTE_TYPE(enc, ptr)) {
737
12.7k
    case BT_MINUS:
738
12.7k
      return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
739
1.87k
    case BT_LSQB:
740
1.87k
      return PREFIX(scanCdataSection)(enc, ptr + MINBPC(enc), end, nextTokPtr);
741
14.5k
    }
742
2
    *nextTokPtr = ptr;
743
2
    return XML_TOK_INVALID;
744
23.6k
  case BT_QUEST:
745
23.6k
    return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
746
54.2k
  case BT_SOL:
747
54.2k
    return PREFIX(scanEndTag)(enc, ptr + MINBPC(enc), end, nextTokPtr);
748
7
  default:
749
7
    *nextTokPtr = ptr;
750
7
    return XML_TOK_INVALID;
751
533k
  }
752
#  ifdef XML_NS
753
  hadColon = 0;
754
#  endif
755
  /* we have a start-tag */
756
8.63M
  while (HAS_CHAR(enc, ptr, end)) {
757
8.63M
    switch (BYTE_TYPE(enc, ptr)) {
758
32.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
38.7k
    case BT_S:
777
47.6k
    case BT_CR:
778
52.8k
    case BT_LF: {
779
52.8k
      ptr += MINBPC(enc);
780
75.8k
      while (HAS_CHAR(enc, ptr, end)) {
781
75.8k
        switch (BYTE_TYPE(enc, ptr)) {
782
28.8k
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
783
978
        case BT_GT:
784
978
          goto gt;
785
12.5k
        case BT_SOL:
786
12.5k
          goto sol;
787
2.63k
        case BT_S:
788
21.9k
        case BT_CR:
789
23.0k
        case BT_LF:
790
23.0k
          ptr += MINBPC(enc);
791
23.0k
          continue;
792
14
        default:
793
14
          *nextTokPtr = ptr;
794
14
          return XML_TOK_INVALID;
795
75.8k
        }
796
39.2k
        return PREFIX(scanAtts)(enc, ptr, end, nextTokPtr);
797
75.8k
      }
798
54
      return XML_TOK_PARTIAL;
799
52.8k
    }
800
357k
    case BT_GT:
801
358k
    gt:
802
358k
      *nextTokPtr = ptr + MINBPC(enc);
803
358k
      return XML_TOK_START_TAG_NO_ATTS;
804
30.2k
    case BT_SOL:
805
42.8k
    sol:
806
42.8k
      ptr += MINBPC(enc);
807
42.8k
      REQUIRE_CHAR(enc, ptr, end);
808
42.7k
      if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
809
14
        *nextTokPtr = ptr;
810
14
        return XML_TOK_INVALID;
811
14
      }
812
42.7k
      *nextTokPtr = ptr + MINBPC(enc);
813
42.7k
      return XML_TOK_EMPTY_ELEMENT_NO_ATTS;
814
12
    default:
815
12
      *nextTokPtr = ptr;
816
12
      return XML_TOK_INVALID;
817
8.63M
    }
818
8.63M
  }
819
120
  return XML_TOK_PARTIAL;
820
441k
}
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
2.88M
                   const char **nextTokPtr) {
825
2.88M
  if (ptr >= end)
826
2.91k
    return XML_TOK_NONE;
827
2.87M
  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
2.87M
  switch (BYTE_TYPE(enc, ptr)) {
837
533k
  case BT_LT:
838
533k
    return PREFIX(scanLt)(enc, ptr + MINBPC(enc), end, nextTokPtr);
839
31.7k
  case BT_AMP:
840
31.7k
    return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
841
1.00M
  case BT_CR:
842
1.00M
    ptr += MINBPC(enc);
843
1.00M
    if (! HAS_CHAR(enc, ptr, end))
844
14
      return XML_TOK_TRAILING_CR;
845
1.00M
    if (BYTE_TYPE(enc, ptr) == BT_LF)
846
225k
      ptr += MINBPC(enc);
847
1.00M
    *nextTokPtr = ptr;
848
1.00M
    return XML_TOK_DATA_NEWLINE;
849
762k
  case BT_LF:
850
762k
    *nextTokPtr = ptr + MINBPC(enc);
851
762k
    return XML_TOK_DATA_NEWLINE;
852
57.0k
  case BT_RSQB:
853
57.0k
    ptr += MINBPC(enc);
854
57.0k
    if (! HAS_CHAR(enc, ptr, end))
855
6
      return XML_TOK_TRAILING_RSQB;
856
57.0k
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
857
31.4k
      break;
858
25.6k
    ptr += MINBPC(enc);
859
25.6k
    if (! HAS_CHAR(enc, ptr, end))
860
2
      return XML_TOK_TRAILING_RSQB;
861
25.6k
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
862
25.6k
      ptr -= MINBPC(enc);
863
25.6k
      break;
864
25.6k
    }
865
1
    *nextTokPtr = ptr;
866
1
    return XML_TOK_INVALID;
867
112k
    INVALID_CASES(ptr, nextTokPtr)
868
434k
  default:
869
434k
    ptr += MINBPC(enc);
870
434k
    break;
871
2.87M
  }
872
13.1M
  while (HAS_CHAR(enc, ptr, end)) {
873
13.1M
    switch (BYTE_TYPE(enc, ptr)) {
874
0
#  define LEAD_CASE(n)                                                         \
875
129k
  case BT_LEAD##n:                                                             \
876
129k
    if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) {                       \
877
27
      *nextTokPtr = ptr;                                                       \
878
27
      return XML_TOK_DATA_CHARS;                                               \
879
27
    }                                                                          \
880
129k
    ptr += n;                                                                  \
881
129k
    break;
882
74.2k
      LEAD_CASE(2)
883
27.4k
      LEAD_CASE(3)
884
28.0k
      LEAD_CASE(4)
885
0
#  undef LEAD_CASE
886
274k
    case BT_RSQB:
887
274k
      if (HAS_CHARS(enc, ptr, end, 2)) {
888
274k
        if (! CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_RSQB)) {
889
98.3k
          ptr += MINBPC(enc);
890
98.3k
          break;
891
98.3k
        }
892
175k
        if (HAS_CHARS(enc, ptr, end, 3)) {
893
175k
          if (! CHAR_MATCHES(enc, ptr + 2 * MINBPC(enc), ASCII_GT)) {
894
175k
            ptr += MINBPC(enc);
895
175k
            break;
896
175k
          }
897
2
          *nextTokPtr = ptr + 2 * MINBPC(enc);
898
2
          return XML_TOK_INVALID;
899
175k
        }
900
175k
      }
901
      /* fall through */
902
16.2k
    case BT_AMP:
903
128k
    case BT_LT:
904
128k
    case BT_NONXML:
905
128k
    case BT_MALFORM:
906
128k
    case BT_TRAIL:
907
383k
    case BT_CR:
908
546k
    case BT_LF:
909
546k
      *nextTokPtr = ptr;
910
546k
      return XML_TOK_DATA_CHARS;
911
12.2M
    default:
912
12.2M
      ptr += MINBPC(enc);
913
12.2M
      break;
914
13.1M
    }
915
13.1M
  }
916
1.31k
  *nextTokPtr = ptr;
917
1.31k
  return XML_TOK_DATA_CHARS;
918
547k
}
xmltok.c:normal_contentTok
Line
Count
Source
824
2.88M
                   const char **nextTokPtr) {
825
2.88M
  if (ptr >= end)
826
2.91k
    return XML_TOK_NONE;
827
2.87M
  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
2.87M
  switch (BYTE_TYPE(enc, ptr)) {
837
533k
  case BT_LT:
838
533k
    return PREFIX(scanLt)(enc, ptr + MINBPC(enc), end, nextTokPtr);
839
31.7k
  case BT_AMP:
840
31.7k
    return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
841
1.00M
  case BT_CR:
842
1.00M
    ptr += MINBPC(enc);
843
1.00M
    if (! HAS_CHAR(enc, ptr, end))
844
14
      return XML_TOK_TRAILING_CR;
845
1.00M
    if (BYTE_TYPE(enc, ptr) == BT_LF)
846
225k
      ptr += MINBPC(enc);
847
1.00M
    *nextTokPtr = ptr;
848
1.00M
    return XML_TOK_DATA_NEWLINE;
849
762k
  case BT_LF:
850
762k
    *nextTokPtr = ptr + MINBPC(enc);
851
762k
    return XML_TOK_DATA_NEWLINE;
852
57.0k
  case BT_RSQB:
853
57.0k
    ptr += MINBPC(enc);
854
57.0k
    if (! HAS_CHAR(enc, ptr, end))
855
6
      return XML_TOK_TRAILING_RSQB;
856
57.0k
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
857
31.4k
      break;
858
25.6k
    ptr += MINBPC(enc);
859
25.6k
    if (! HAS_CHAR(enc, ptr, end))
860
2
      return XML_TOK_TRAILING_RSQB;
861
25.6k
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
862
25.6k
      ptr -= MINBPC(enc);
863
25.6k
      break;
864
25.6k
    }
865
1
    *nextTokPtr = ptr;
866
1
    return XML_TOK_INVALID;
867
112k
    INVALID_CASES(ptr, nextTokPtr)
868
434k
  default:
869
434k
    ptr += MINBPC(enc);
870
434k
    break;
871
2.87M
  }
872
13.1M
  while (HAS_CHAR(enc, ptr, end)) {
873
13.1M
    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
74.2k
      LEAD_CASE(2)
883
27.4k
      LEAD_CASE(3)
884
28.0k
      LEAD_CASE(4)
885
0
#  undef LEAD_CASE
886
274k
    case BT_RSQB:
887
274k
      if (HAS_CHARS(enc, ptr, end, 2)) {
888
274k
        if (! CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_RSQB)) {
889
98.3k
          ptr += MINBPC(enc);
890
98.3k
          break;
891
98.3k
        }
892
175k
        if (HAS_CHARS(enc, ptr, end, 3)) {
893
175k
          if (! CHAR_MATCHES(enc, ptr + 2 * MINBPC(enc), ASCII_GT)) {
894
175k
            ptr += MINBPC(enc);
895
175k
            break;
896
175k
          }
897
2
          *nextTokPtr = ptr + 2 * MINBPC(enc);
898
2
          return XML_TOK_INVALID;
899
175k
        }
900
175k
      }
901
      /* fall through */
902
16.2k
    case BT_AMP:
903
128k
    case BT_LT:
904
128k
    case BT_NONXML:
905
128k
    case BT_MALFORM:
906
128k
    case BT_TRAIL:
907
383k
    case BT_CR:
908
546k
    case BT_LF:
909
546k
      *nextTokPtr = ptr;
910
546k
      return XML_TOK_DATA_CHARS;
911
12.2M
    default:
912
12.2M
      ptr += MINBPC(enc);
913
12.2M
      break;
914
13.1M
    }
915
13.1M
  }
916
1.31k
  *nextTokPtr = ptr;
917
1.31k
  return XML_TOK_DATA_CHARS;
918
547k
}
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
80.1k
                    const char **nextTokPtr) {
925
80.1k
  REQUIRE_CHAR(enc, ptr, end);
926
80.1k
  switch (BYTE_TYPE(enc, ptr)) {
927
145k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
928
1.55k
  case BT_S:
929
2.17k
  case BT_LF:
930
2.85k
  case BT_CR:
931
2.85k
  case BT_PERCNT:
932
2.85k
    *nextTokPtr = ptr;
933
2.85k
    return XML_TOK_PERCENT;
934
1
  default:
935
1
    *nextTokPtr = ptr;
936
1
    return XML_TOK_INVALID;
937
80.1k
  }
938
2.13M
  while (HAS_CHAR(enc, ptr, end)) {
939
2.13M
    switch (BYTE_TYPE(enc, ptr)) {
940
7.49M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
941
77.0k
    case BT_SEMI:
942
77.0k
      *nextTokPtr = ptr + MINBPC(enc);
943
77.0k
      return XML_TOK_PARAM_ENTITY_REF;
944
22
    default:
945
22
      *nextTokPtr = ptr;
946
22
      return XML_TOK_INVALID;
947
2.13M
    }
948
2.13M
  }
949
76
  return XML_TOK_PARTIAL;
950
77.2k
}
xmltok.c:normal_scanPercent
Line
Count
Source
924
80.1k
                    const char **nextTokPtr) {
925
80.1k
  REQUIRE_CHAR(enc, ptr, end);
926
80.1k
  switch (BYTE_TYPE(enc, ptr)) {
927
145k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
928
1.55k
  case BT_S:
929
2.17k
  case BT_LF:
930
2.85k
  case BT_CR:
931
2.85k
  case BT_PERCNT:
932
2.85k
    *nextTokPtr = ptr;
933
2.85k
    return XML_TOK_PERCENT;
934
1
  default:
935
1
    *nextTokPtr = ptr;
936
1
    return XML_TOK_INVALID;
937
80.1k
  }
938
2.13M
  while (HAS_CHAR(enc, ptr, end)) {
939
2.13M
    switch (BYTE_TYPE(enc, ptr)) {
940
7.49M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
941
77.0k
    case BT_SEMI:
942
77.0k
      *nextTokPtr = ptr + MINBPC(enc);
943
77.0k
      return XML_TOK_PARAM_ENTITY_REF;
944
22
    default:
945
22
      *nextTokPtr = ptr;
946
22
      return XML_TOK_INVALID;
947
2.13M
    }
948
2.13M
  }
949
76
  return XML_TOK_PARTIAL;
950
77.2k
}
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
111k
                      const char **nextTokPtr) {
955
111k
  REQUIRE_CHAR(enc, ptr, end);
956
111k
  switch (BYTE_TYPE(enc, ptr)) {
957
111k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
958
4
  default:
959
4
    *nextTokPtr = ptr;
960
4
    return XML_TOK_INVALID;
961
111k
  }
962
958k
  while (HAS_CHAR(enc, ptr, end)) {
963
958k
    switch (BYTE_TYPE(enc, ptr)) {
964
3.02M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
965
83.5k
    case BT_CR:
966
106k
    case BT_LF:
967
107k
    case BT_S:
968
107k
    case BT_RPAR:
969
110k
    case BT_GT:
970
110k
    case BT_PERCNT:
971
111k
    case BT_VERBAR:
972
111k
      *nextTokPtr = ptr;
973
111k
      return XML_TOK_POUND_NAME;
974
18
    default:
975
18
      *nextTokPtr = ptr;
976
18
      return XML_TOK_INVALID;
977
958k
    }
978
958k
  }
979
210
  return -XML_TOK_POUND_NAME;
980
111k
}
xmltok.c:normal_scanPoundName
Line
Count
Source
954
111k
                      const char **nextTokPtr) {
955
111k
  REQUIRE_CHAR(enc, ptr, end);
956
111k
  switch (BYTE_TYPE(enc, ptr)) {
957
111k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
958
4
  default:
959
4
    *nextTokPtr = ptr;
960
4
    return XML_TOK_INVALID;
961
111k
  }
962
958k
  while (HAS_CHAR(enc, ptr, end)) {
963
958k
    switch (BYTE_TYPE(enc, ptr)) {
964
3.02M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
965
83.5k
    case BT_CR:
966
106k
    case BT_LF:
967
107k
    case BT_S:
968
107k
    case BT_RPAR:
969
110k
    case BT_GT:
970
110k
    case BT_PERCNT:
971
111k
    case BT_VERBAR:
972
111k
      *nextTokPtr = ptr;
973
111k
      return XML_TOK_POUND_NAME;
974
18
    default:
975
18
      *nextTokPtr = ptr;
976
18
      return XML_TOK_INVALID;
977
958k
    }
978
958k
  }
979
210
  return -XML_TOK_POUND_NAME;
980
111k
}
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
62.5k
                const char **nextTokPtr) {
985
6.81M
  while (HAS_CHAR(enc, ptr, end)) {
986
6.81M
    int t = BYTE_TYPE(enc, ptr);
987
6.81M
    switch (t) {
988
151k
      INVALID_CASES(ptr, nextTokPtr)
989
12.2k
    case BT_QUOT:
990
66.7k
    case BT_APOS:
991
66.7k
      ptr += MINBPC(enc);
992
66.7k
      if (t != open)
993
4.44k
        break;
994
62.3k
      if (! HAS_CHAR(enc, ptr, end))
995
469
        return -XML_TOK_LITERAL;
996
61.8k
      *nextTokPtr = ptr;
997
61.8k
      switch (BYTE_TYPE(enc, ptr)) {
998
7.22k
      case BT_S:
999
11.1k
      case BT_CR:
1000
19.3k
      case BT_LF:
1001
61.5k
      case BT_GT:
1002
61.5k
      case BT_PERCNT:
1003
61.8k
      case BT_LSQB:
1004
61.8k
        return XML_TOK_LITERAL;
1005
20
      default:
1006
20
        return XML_TOK_INVALID;
1007
61.8k
      }
1008
6.66M
    default:
1009
6.66M
      ptr += MINBPC(enc);
1010
6.66M
      break;
1011
6.81M
    }
1012
6.81M
  }
1013
108
  return XML_TOK_PARTIAL;
1014
62.5k
}
xmltok.c:normal_scanLit
Line
Count
Source
984
62.5k
                const char **nextTokPtr) {
985
6.81M
  while (HAS_CHAR(enc, ptr, end)) {
986
6.81M
    int t = BYTE_TYPE(enc, ptr);
987
6.81M
    switch (t) {
988
151k
      INVALID_CASES(ptr, nextTokPtr)
989
12.2k
    case BT_QUOT:
990
66.7k
    case BT_APOS:
991
66.7k
      ptr += MINBPC(enc);
992
66.7k
      if (t != open)
993
4.44k
        break;
994
62.3k
      if (! HAS_CHAR(enc, ptr, end))
995
469
        return -XML_TOK_LITERAL;
996
61.8k
      *nextTokPtr = ptr;
997
61.8k
      switch (BYTE_TYPE(enc, ptr)) {
998
7.22k
      case BT_S:
999
11.1k
      case BT_CR:
1000
19.3k
      case BT_LF:
1001
61.5k
      case BT_GT:
1002
61.5k
      case BT_PERCNT:
1003
61.8k
      case BT_LSQB:
1004
61.8k
        return XML_TOK_LITERAL;
1005
20
      default:
1006
20
        return XML_TOK_INVALID;
1007
61.8k
      }
1008
6.66M
    default:
1009
6.66M
      ptr += MINBPC(enc);
1010
6.66M
      break;
1011
6.81M
    }
1012
6.81M
  }
1013
108
  return XML_TOK_PARTIAL;
1014
62.5k
}
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.95M
                  const char **nextTokPtr) {
1019
2.95M
  int tok;
1020
2.95M
  if (ptr >= end)
1021
8.17k
    return XML_TOK_NONE;
1022
2.94M
  if (MINBPC(enc) > 1) {
1023
234
    size_t n = end - ptr;
1024
234
    if (n & (MINBPC(enc) - 1)) {
1025
42
      n &= ~(MINBPC(enc) - 1);
1026
42
      if (n == 0)
1027
4
        return XML_TOK_PARTIAL;
1028
38
      end = ptr + n;
1029
38
    }
1030
234
  }
1031
2.94M
  switch (BYTE_TYPE(enc, ptr)) {
1032
8.92k
  case BT_QUOT:
1033
8.92k
    return PREFIX(scanLit)(BT_QUOT, enc, ptr + MINBPC(enc), end, nextTokPtr);
1034
53.5k
  case BT_APOS:
1035
53.5k
    return PREFIX(scanLit)(BT_APOS, enc, ptr + MINBPC(enc), end, nextTokPtr);
1036
101k
  case BT_LT: {
1037
101k
    ptr += MINBPC(enc);
1038
101k
    REQUIRE_CHAR(enc, ptr, end);
1039
101k
    switch (BYTE_TYPE(enc, ptr)) {
1040
86.1k
    case BT_EXCL:
1041
86.1k
      return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1042
9.72k
    case BT_QUEST:
1043
9.72k
      return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1044
4.65k
    case BT_NMSTRT:
1045
5.76k
    case BT_HEX:
1046
5.76k
    case BT_NONASCII:
1047
5.79k
    case BT_LEAD2:
1048
5.82k
    case BT_LEAD3:
1049
5.83k
    case BT_LEAD4:
1050
5.83k
      *nextTokPtr = ptr - MINBPC(enc);
1051
5.83k
      return XML_TOK_INSTANCE_START;
1052
101k
    }
1053
34
    *nextTokPtr = ptr;
1054
34
    return XML_TOK_INVALID;
1055
101k
  }
1056
305k
  case BT_CR:
1057
305k
    if (ptr + MINBPC(enc) == end) {
1058
387
      *nextTokPtr = end;
1059
      /* indicate that this might be part of a CR/LF pair */
1060
387
      return -XML_TOK_PROLOG_S;
1061
387
    }
1062
    /* fall through */
1063
552k
  case BT_S:
1064
618k
  case BT_LF:
1065
690k
    for (;;) {
1066
690k
      ptr += MINBPC(enc);
1067
690k
      if (! HAS_CHAR(enc, ptr, end))
1068
200
        break;
1069
689k
      switch (BYTE_TYPE(enc, ptr)) {
1070
5.61k
      case BT_S:
1071
15.0k
      case BT_LF:
1072
15.0k
        break;
1073
56.7k
      case BT_CR:
1074
        /* don't split CR/LF pair */
1075
56.7k
        if (ptr + MINBPC(enc) != end)
1076
56.5k
          break;
1077
        /* fall through */
1078
618k
      default:
1079
618k
        *nextTokPtr = ptr;
1080
618k
        return XML_TOK_PROLOG_S;
1081
689k
      }
1082
689k
    }
1083
200
    *nextTokPtr = ptr;
1084
200
    return XML_TOK_PROLOG_S;
1085
80.1k
  case BT_PERCNT:
1086
80.1k
    return PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1087
2.55k
  case BT_COMMA:
1088
2.55k
    *nextTokPtr = ptr + MINBPC(enc);
1089
2.55k
    return XML_TOK_COMMA;
1090
2.62k
  case BT_LSQB:
1091
2.62k
    *nextTokPtr = ptr + MINBPC(enc);
1092
2.62k
    return XML_TOK_OPEN_BRACKET;
1093
1.33k
  case BT_RSQB:
1094
1.33k
    ptr += MINBPC(enc);
1095
1.33k
    if (! HAS_CHAR(enc, ptr, end))
1096
3
      return -XML_TOK_CLOSE_BRACKET;
1097
1.33k
    if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) {
1098
22
      REQUIRE_CHARS(enc, ptr, end, 2);
1099
20
      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
20
    }
1104
1.32k
    *nextTokPtr = ptr;
1105
1.32k
    return XML_TOK_CLOSE_BRACKET;
1106
1.34M
  case BT_LPAR:
1107
1.34M
    *nextTokPtr = ptr + MINBPC(enc);
1108
1.34M
    return XML_TOK_OPEN_PAREN;
1109
119k
  case BT_RPAR:
1110
119k
    ptr += MINBPC(enc);
1111
119k
    if (! HAS_CHAR(enc, ptr, end))
1112
85
      return -XML_TOK_CLOSE_PAREN;
1113
119k
    switch (BYTE_TYPE(enc, ptr)) {
1114
2.25k
    case BT_AST:
1115
2.25k
      *nextTokPtr = ptr + MINBPC(enc);
1116
2.25k
      return XML_TOK_CLOSE_PAREN_ASTERISK;
1117
1.02k
    case BT_QUEST:
1118
1.02k
      *nextTokPtr = ptr + MINBPC(enc);
1119
1.02k
      return XML_TOK_CLOSE_PAREN_QUESTION;
1120
2.09k
    case BT_PLUS:
1121
2.09k
      *nextTokPtr = ptr + MINBPC(enc);
1122
2.09k
      return XML_TOK_CLOSE_PAREN_PLUS;
1123
22.3k
    case BT_CR:
1124
22.8k
    case BT_LF:
1125
106k
    case BT_S:
1126
107k
    case BT_GT:
1127
109k
    case BT_COMMA:
1128
110k
    case BT_VERBAR:
1129
114k
    case BT_RPAR:
1130
114k
      *nextTokPtr = ptr;
1131
114k
      return XML_TOK_CLOSE_PAREN;
1132
119k
    }
1133
7
    *nextTokPtr = ptr;
1134
7
    return XML_TOK_INVALID;
1135
10.6k
  case BT_VERBAR:
1136
10.6k
    *nextTokPtr = ptr + MINBPC(enc);
1137
10.6k
    return XML_TOK_OR;
1138
81.3k
  case BT_GT:
1139
81.3k
    *nextTokPtr = ptr + MINBPC(enc);
1140
81.3k
    return XML_TOK_DECL_CLOSE;
1141
111k
  case BT_NUM:
1142
111k
    return PREFIX(scanPoundName)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1143
0
#  define LEAD_CASE(n)                                                         \
1144
8.62k
  case BT_LEAD##n:                                                             \
1145
8.62k
    if (end - ptr < n)                                                         \
1146
81
      return XML_TOK_PARTIAL_CHAR;                                             \
1147
8.56k
    if (IS_INVALID_CHAR(enc, ptr, n)) {                                        \
1148
84
      *nextTokPtr = ptr;                                                       \
1149
84
      return XML_TOK_INVALID;                                                  \
1150
84
    }                                                                          \
1151
8.56k
    if (IS_NMSTRT_CHAR(enc, ptr, n)) {                                         \
1152
5.58k
      ptr += n;                                                                \
1153
5.58k
      tok = XML_TOK_NAME;                                                      \
1154
5.58k
      break;                                                                   \
1155
5.58k
    }                                                                          \
1156
8.48k
    if (IS_NAME_CHAR(enc, ptr, n)) {                                           \
1157
2.82k
      ptr += n;                                                                \
1158
2.82k
      tok = XML_TOK_NMTOKEN;                                                   \
1159
2.82k
      break;                                                                   \
1160
2.82k
    }                                                                          \
1161
2.90k
    *nextTokPtr = ptr;                                                         \
1162
81
    return XML_TOK_INVALID;
1163
13.1k
    LEAD_CASE(2)
1164
15.0k
    LEAD_CASE(3)
1165
302
    LEAD_CASE(4)
1166
0
#  undef LEAD_CASE
1167
225k
  case BT_NMSTRT:
1168
400k
  case BT_HEX:
1169
400k
    tok = XML_TOK_NAME;
1170
400k
    ptr += MINBPC(enc);
1171
400k
    break;
1172
585
  case BT_DIGIT:
1173
1.15k
  case BT_NAME:
1174
1.54k
  case BT_MINUS:
1175
#  ifdef XML_NS
1176
  case BT_COLON:
1177
#  endif
1178
1.54k
    tok = XML_TOK_NMTOKEN;
1179
1.54k
    ptr += MINBPC(enc);
1180
1.54k
    break;
1181
178
  case BT_NONASCII:
1182
178
    if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {
1183
141
      ptr += MINBPC(enc);
1184
141
      tok = XML_TOK_NAME;
1185
141
      break;
1186
141
    }
1187
37
    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
75
  default:
1194
75
    *nextTokPtr = ptr;
1195
75
    return XML_TOK_INVALID;
1196
2.94M
  }
1197
16.8M
  while (HAS_CHAR(enc, ptr, end)) {
1198
16.8M
    switch (BYTE_TYPE(enc, ptr)) {
1199
47.8M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1200
29.4k
    case BT_GT:
1201
139k
    case BT_RPAR:
1202
139k
    case BT_COMMA:
1203
145k
    case BT_VERBAR:
1204
147k
    case BT_LSQB:
1205
147k
    case BT_PERCNT:
1206
254k
    case BT_S:
1207
387k
    case BT_CR:
1208
408k
    case BT_LF:
1209
408k
      *nextTokPtr = ptr;
1210
408k
      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
403
    case BT_PLUS:
1232
403
      if (tok == XML_TOK_NMTOKEN) {
1233
1
        *nextTokPtr = ptr;
1234
1
        return XML_TOK_INVALID;
1235
1
      }
1236
402
      *nextTokPtr = ptr + MINBPC(enc);
1237
402
      return XML_TOK_NAME_PLUS;
1238
1.13k
    case BT_AST:
1239
1.13k
      if (tok == XML_TOK_NMTOKEN) {
1240
1
        *nextTokPtr = ptr;
1241
1
        return XML_TOK_INVALID;
1242
1
      }
1243
1.13k
      *nextTokPtr = ptr + MINBPC(enc);
1244
1.13k
      return XML_TOK_NAME_ASTERISK;
1245
344
    case BT_QUEST:
1246
344
      if (tok == XML_TOK_NMTOKEN) {
1247
1
        *nextTokPtr = ptr;
1248
1
        return XML_TOK_INVALID;
1249
1
      }
1250
343
      *nextTokPtr = ptr + MINBPC(enc);
1251
343
      return XML_TOK_NAME_QUESTION;
1252
55
    default:
1253
55
      *nextTokPtr = ptr;
1254
55
      return XML_TOK_INVALID;
1255
16.8M
    }
1256
16.8M
  }
1257
660
  return -tok;
1258
410k
}
xmltok.c:normal_prologTok
Line
Count
Source
1018
2.95M
                  const char **nextTokPtr) {
1019
2.95M
  int tok;
1020
2.95M
  if (ptr >= end)
1021
8.17k
    return XML_TOK_NONE;
1022
2.94M
  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.94M
  switch (BYTE_TYPE(enc, ptr)) {
1032
8.92k
  case BT_QUOT:
1033
8.92k
    return PREFIX(scanLit)(BT_QUOT, enc, ptr + MINBPC(enc), end, nextTokPtr);
1034
53.5k
  case BT_APOS:
1035
53.5k
    return PREFIX(scanLit)(BT_APOS, enc, ptr + MINBPC(enc), end, nextTokPtr);
1036
101k
  case BT_LT: {
1037
101k
    ptr += MINBPC(enc);
1038
101k
    REQUIRE_CHAR(enc, ptr, end);
1039
101k
    switch (BYTE_TYPE(enc, ptr)) {
1040
86.1k
    case BT_EXCL:
1041
86.1k
      return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1042
9.72k
    case BT_QUEST:
1043
9.72k
      return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1044
4.65k
    case BT_NMSTRT:
1045
5.76k
    case BT_HEX:
1046
5.76k
    case BT_NONASCII:
1047
5.79k
    case BT_LEAD2:
1048
5.82k
    case BT_LEAD3:
1049
5.83k
    case BT_LEAD4:
1050
5.83k
      *nextTokPtr = ptr - MINBPC(enc);
1051
5.83k
      return XML_TOK_INSTANCE_START;
1052
101k
    }
1053
34
    *nextTokPtr = ptr;
1054
34
    return XML_TOK_INVALID;
1055
101k
  }
1056
305k
  case BT_CR:
1057
305k
    if (ptr + MINBPC(enc) == end) {
1058
387
      *nextTokPtr = end;
1059
      /* indicate that this might be part of a CR/LF pair */
1060
387
      return -XML_TOK_PROLOG_S;
1061
387
    }
1062
    /* fall through */
1063
552k
  case BT_S:
1064
618k
  case BT_LF:
1065
690k
    for (;;) {
1066
690k
      ptr += MINBPC(enc);
1067
690k
      if (! HAS_CHAR(enc, ptr, end))
1068
200
        break;
1069
689k
      switch (BYTE_TYPE(enc, ptr)) {
1070
5.61k
      case BT_S:
1071
15.0k
      case BT_LF:
1072
15.0k
        break;
1073
56.7k
      case BT_CR:
1074
        /* don't split CR/LF pair */
1075
56.7k
        if (ptr + MINBPC(enc) != end)
1076
56.5k
          break;
1077
        /* fall through */
1078
618k
      default:
1079
618k
        *nextTokPtr = ptr;
1080
618k
        return XML_TOK_PROLOG_S;
1081
689k
      }
1082
689k
    }
1083
200
    *nextTokPtr = ptr;
1084
200
    return XML_TOK_PROLOG_S;
1085
80.1k
  case BT_PERCNT:
1086
80.1k
    return PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1087
2.55k
  case BT_COMMA:
1088
2.55k
    *nextTokPtr = ptr + MINBPC(enc);
1089
2.55k
    return XML_TOK_COMMA;
1090
2.62k
  case BT_LSQB:
1091
2.62k
    *nextTokPtr = ptr + MINBPC(enc);
1092
2.62k
    return XML_TOK_OPEN_BRACKET;
1093
1.33k
  case BT_RSQB:
1094
1.33k
    ptr += MINBPC(enc);
1095
1.33k
    if (! HAS_CHAR(enc, ptr, end))
1096
3
      return -XML_TOK_CLOSE_BRACKET;
1097
1.33k
    if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) {
1098
22
      REQUIRE_CHARS(enc, ptr, end, 2);
1099
20
      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
20
    }
1104
1.32k
    *nextTokPtr = ptr;
1105
1.32k
    return XML_TOK_CLOSE_BRACKET;
1106
1.34M
  case BT_LPAR:
1107
1.34M
    *nextTokPtr = ptr + MINBPC(enc);
1108
1.34M
    return XML_TOK_OPEN_PAREN;
1109
119k
  case BT_RPAR:
1110
119k
    ptr += MINBPC(enc);
1111
119k
    if (! HAS_CHAR(enc, ptr, end))
1112
85
      return -XML_TOK_CLOSE_PAREN;
1113
119k
    switch (BYTE_TYPE(enc, ptr)) {
1114
2.25k
    case BT_AST:
1115
2.25k
      *nextTokPtr = ptr + MINBPC(enc);
1116
2.25k
      return XML_TOK_CLOSE_PAREN_ASTERISK;
1117
1.02k
    case BT_QUEST:
1118
1.02k
      *nextTokPtr = ptr + MINBPC(enc);
1119
1.02k
      return XML_TOK_CLOSE_PAREN_QUESTION;
1120
2.09k
    case BT_PLUS:
1121
2.09k
      *nextTokPtr = ptr + MINBPC(enc);
1122
2.09k
      return XML_TOK_CLOSE_PAREN_PLUS;
1123
22.3k
    case BT_CR:
1124
22.8k
    case BT_LF:
1125
106k
    case BT_S:
1126
107k
    case BT_GT:
1127
109k
    case BT_COMMA:
1128
110k
    case BT_VERBAR:
1129
114k
    case BT_RPAR:
1130
114k
      *nextTokPtr = ptr;
1131
114k
      return XML_TOK_CLOSE_PAREN;
1132
119k
    }
1133
7
    *nextTokPtr = ptr;
1134
7
    return XML_TOK_INVALID;
1135
10.6k
  case BT_VERBAR:
1136
10.6k
    *nextTokPtr = ptr + MINBPC(enc);
1137
10.6k
    return XML_TOK_OR;
1138
81.3k
  case BT_GT:
1139
81.3k
    *nextTokPtr = ptr + MINBPC(enc);
1140
81.3k
    return XML_TOK_DECL_CLOSE;
1141
111k
  case BT_NUM:
1142
111k
    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
13.1k
    LEAD_CASE(2)
1164
15.0k
    LEAD_CASE(3)
1165
182
    LEAD_CASE(4)
1166
0
#  undef LEAD_CASE
1167
225k
  case BT_NMSTRT:
1168
400k
  case BT_HEX:
1169
400k
    tok = XML_TOK_NAME;
1170
400k
    ptr += MINBPC(enc);
1171
400k
    break;
1172
585
  case BT_DIGIT:
1173
1.15k
  case BT_NAME:
1174
1.54k
  case BT_MINUS:
1175
#  ifdef XML_NS
1176
  case BT_COLON:
1177
#  endif
1178
1.54k
    tok = XML_TOK_NMTOKEN;
1179
1.54k
    ptr += MINBPC(enc);
1180
1.54k
    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.94M
  }
1197
16.8M
  while (HAS_CHAR(enc, ptr, end)) {
1198
16.8M
    switch (BYTE_TYPE(enc, ptr)) {
1199
47.7M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1200
29.4k
    case BT_GT:
1201
139k
    case BT_RPAR:
1202
139k
    case BT_COMMA:
1203
145k
    case BT_VERBAR:
1204
147k
    case BT_LSQB:
1205
147k
    case BT_PERCNT:
1206
254k
    case BT_S:
1207
387k
    case BT_CR:
1208
408k
    case BT_LF:
1209
408k
      *nextTokPtr = ptr;
1210
408k
      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
403
    case BT_PLUS:
1232
403
      if (tok == XML_TOK_NMTOKEN) {
1233
1
        *nextTokPtr = ptr;
1234
1
        return XML_TOK_INVALID;
1235
1
      }
1236
402
      *nextTokPtr = ptr + MINBPC(enc);
1237
402
      return XML_TOK_NAME_PLUS;
1238
1.13k
    case BT_AST:
1239
1.13k
      if (tok == XML_TOK_NMTOKEN) {
1240
1
        *nextTokPtr = ptr;
1241
1
        return XML_TOK_INVALID;
1242
1
      }
1243
1.13k
      *nextTokPtr = ptr + MINBPC(enc);
1244
1.13k
      return XML_TOK_NAME_ASTERISK;
1245
344
    case BT_QUEST:
1246
344
      if (tok == XML_TOK_NMTOKEN) {
1247
1
        *nextTokPtr = ptr;
1248
1
        return XML_TOK_INVALID;
1249
1
      }
1250
343
      *nextTokPtr = ptr + MINBPC(enc);
1251
343
      return XML_TOK_NAME_QUESTION;
1252
37
    default:
1253
37
      *nextTokPtr = ptr;
1254
37
      return XML_TOK_INVALID;
1255
16.8M
    }
1256
16.8M
  }
1257
614
  return -tok;
1258
410k
}
xmltok.c:little2_prologTok
Line
Count
Source
1018
120
                  const char **nextTokPtr) {
1019
120
  int tok;
1020
120
  if (ptr >= end)
1021
2
    return XML_TOK_NONE;
1022
118
  if (MINBPC(enc) > 1) {
1023
118
    size_t n = end - ptr;
1024
118
    if (n & (MINBPC(enc) - 1)) {
1025
24
      n &= ~(MINBPC(enc) - 1);
1026
24
      if (n == 0)
1027
2
        return XML_TOK_PARTIAL;
1028
22
      end = ptr + n;
1029
22
    }
1030
118
  }
1031
116
  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
52
    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
92
  case BT_NONASCII:
1182
92
    if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {
1183
77
      ptr += MINBPC(enc);
1184
77
      tok = XML_TOK_NAME;
1185
77
      break;
1186
77
    }
1187
15
    if (IS_NAME_CHAR_MINBPC(enc, ptr)) {
1188
5
      ptr += MINBPC(enc);
1189
5
      tok = XML_TOK_NMTOKEN;
1190
5
      break;
1191
5
    }
1192
    /* fall through */
1193
15
  default:
1194
15
    *nextTokPtr = ptr;
1195
15
    return XML_TOK_INVALID;
1196
116
  }
1197
3.62k
  while (HAS_CHAR(enc, ptr, end)) {
1198
3.62k
    switch (BYTE_TYPE(enc, ptr)) {
1199
17.9k
      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
8
    default:
1253
8
      *nextTokPtr = ptr;
1254
8
      return XML_TOK_INVALID;
1255
3.62k
    }
1256
3.62k
  }
1257
24
  return -tok;
1258
82
}
xmltok.c:big2_prologTok
Line
Count
Source
1018
118
                  const char **nextTokPtr) {
1019
118
  int tok;
1020
118
  if (ptr >= end)
1021
2
    return XML_TOK_NONE;
1022
116
  if (MINBPC(enc) > 1) {
1023
116
    size_t n = end - ptr;
1024
116
    if (n & (MINBPC(enc) - 1)) {
1025
18
      n &= ~(MINBPC(enc) - 1);
1026
18
      if (n == 0)
1027
2
        return XML_TOK_PARTIAL;
1028
16
      end = ptr + n;
1029
16
    }
1030
116
  }
1031
114
  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
68
    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
86
  case BT_NONASCII:
1182
86
    if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {
1183
64
      ptr += MINBPC(enc);
1184
64
      tok = XML_TOK_NAME;
1185
64
      break;
1186
64
    }
1187
22
    if (IS_NAME_CHAR_MINBPC(enc, ptr)) {
1188
11
      ptr += MINBPC(enc);
1189
11
      tok = XML_TOK_NMTOKEN;
1190
11
      break;
1191
11
    }
1192
    /* fall through */
1193
16
  default:
1194
16
    *nextTokPtr = ptr;
1195
16
    return XML_TOK_INVALID;
1196
114
  }
1197
2.33k
  while (HAS_CHAR(enc, ptr, end)) {
1198
2.33k
    switch (BYTE_TYPE(enc, ptr)) {
1199
11.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
10
    default:
1253
10
      *nextTokPtr = ptr;
1254
10
      return XML_TOK_INVALID;
1255
2.33k
    }
1256
2.33k
  }
1257
22
  return -tok;
1258
75
}
1259
1260
static int PTRCALL
1261
PREFIX(attributeValueTok)(const ENCODING *enc, const char *ptr, const char *end,
1262
2.07M
                          const char **nextTokPtr) {
1263
2.07M
  const char *start;
1264
2.07M
  if (ptr >= end)
1265
108k
    return XML_TOK_NONE;
1266
1.96M
  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
1.96M
  start = ptr;
1275
22.4M
  while (HAS_CHAR(enc, ptr, end)) {
1276
22.4M
    switch (BYTE_TYPE(enc, ptr)) {
1277
0
#  define LEAD_CASE(n)                                                         \
1278
226k
  case BT_LEAD##n:                                                             \
1279
226k
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1280
226k
    break;
1281
58.3k
      LEAD_CASE(2)
1282
101k
      LEAD_CASE(3)
1283
66.9k
      LEAD_CASE(4)
1284
0
#  undef LEAD_CASE
1285
421k
    case BT_AMP:
1286
421k
      if (ptr == start)
1287
316k
        return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1288
104k
      *nextTokPtr = ptr;
1289
104k
      return XML_TOK_DATA_CHARS;
1290
2
    case BT_LT:
1291
      /* this is for inside entity references */
1292
2
      *nextTokPtr = ptr;
1293
2
      return XML_TOK_INVALID;
1294
478k
    case BT_LF:
1295
478k
      if (ptr == start) {
1296
349k
        *nextTokPtr = ptr + MINBPC(enc);
1297
349k
        return XML_TOK_DATA_NEWLINE;
1298
349k
      }
1299
128k
      *nextTokPtr = ptr;
1300
128k
      return XML_TOK_DATA_CHARS;
1301
780k
    case BT_CR:
1302
780k
      if (ptr == start) {
1303
548k
        ptr += MINBPC(enc);
1304
548k
        if (! HAS_CHAR(enc, ptr, end))
1305
3.93k
          return XML_TOK_TRAILING_CR;
1306
544k
        if (BYTE_TYPE(enc, ptr) == BT_LF)
1307
89.2k
          ptr += MINBPC(enc);
1308
544k
        *nextTokPtr = ptr;
1309
544k
        return XML_TOK_DATA_NEWLINE;
1310
548k
      }
1311
232k
      *nextTokPtr = ptr;
1312
232k
      return XML_TOK_DATA_CHARS;
1313
194k
    case BT_S:
1314
194k
      if (ptr == start) {
1315
131k
        *nextTokPtr = ptr + MINBPC(enc);
1316
131k
        return XML_TOK_ATTRIBUTE_VALUE_S;
1317
131k
      }
1318
63.1k
      *nextTokPtr = ptr;
1319
63.1k
      return XML_TOK_DATA_CHARS;
1320
20.3M
    default:
1321
20.3M
      ptr += MINBPC(enc);
1322
20.3M
      break;
1323
22.4M
    }
1324
22.4M
  }
1325
91.6k
  *nextTokPtr = ptr;
1326
91.6k
  return XML_TOK_DATA_CHARS;
1327
1.96M
}
xmltok.c:normal_attributeValueTok
Line
Count
Source
1262
2.07M
                          const char **nextTokPtr) {
1263
2.07M
  const char *start;
1264
2.07M
  if (ptr >= end)
1265
108k
    return XML_TOK_NONE;
1266
1.96M
  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
1.96M
  start = ptr;
1275
22.4M
  while (HAS_CHAR(enc, ptr, end)) {
1276
22.4M
    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
58.3k
      LEAD_CASE(2)
1282
101k
      LEAD_CASE(3)
1283
66.9k
      LEAD_CASE(4)
1284
0
#  undef LEAD_CASE
1285
421k
    case BT_AMP:
1286
421k
      if (ptr == start)
1287
316k
        return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1288
104k
      *nextTokPtr = ptr;
1289
104k
      return XML_TOK_DATA_CHARS;
1290
2
    case BT_LT:
1291
      /* this is for inside entity references */
1292
2
      *nextTokPtr = ptr;
1293
2
      return XML_TOK_INVALID;
1294
478k
    case BT_LF:
1295
478k
      if (ptr == start) {
1296
349k
        *nextTokPtr = ptr + MINBPC(enc);
1297
349k
        return XML_TOK_DATA_NEWLINE;
1298
349k
      }
1299
128k
      *nextTokPtr = ptr;
1300
128k
      return XML_TOK_DATA_CHARS;
1301
780k
    case BT_CR:
1302
780k
      if (ptr == start) {
1303
548k
        ptr += MINBPC(enc);
1304
548k
        if (! HAS_CHAR(enc, ptr, end))
1305
3.93k
          return XML_TOK_TRAILING_CR;
1306
544k
        if (BYTE_TYPE(enc, ptr) == BT_LF)
1307
89.2k
          ptr += MINBPC(enc);
1308
544k
        *nextTokPtr = ptr;
1309
544k
        return XML_TOK_DATA_NEWLINE;
1310
548k
      }
1311
232k
      *nextTokPtr = ptr;
1312
232k
      return XML_TOK_DATA_CHARS;
1313
194k
    case BT_S:
1314
194k
      if (ptr == start) {
1315
131k
        *nextTokPtr = ptr + MINBPC(enc);
1316
131k
        return XML_TOK_ATTRIBUTE_VALUE_S;
1317
131k
      }
1318
63.1k
      *nextTokPtr = ptr;
1319
63.1k
      return XML_TOK_DATA_CHARS;
1320
20.3M
    default:
1321
20.3M
      ptr += MINBPC(enc);
1322
20.3M
      break;
1323
22.4M
    }
1324
22.4M
  }
1325
91.6k
  *nextTokPtr = ptr;
1326
91.6k
  return XML_TOK_DATA_CHARS;
1327
1.96M
}
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
4.69k
                   const char **badPtr) {
1451
4.69k
  ptr += MINBPC(enc);
1452
4.69k
  end -= MINBPC(enc);
1453
827k
  for (; HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
1454
827k
    switch (BYTE_TYPE(enc, ptr)) {
1455
340k
    case BT_DIGIT:
1456
525k
    case BT_HEX:
1457
526k
    case BT_MINUS:
1458
526k
    case BT_APOS:
1459
527k
    case BT_LPAR:
1460
587k
    case BT_RPAR:
1461
588k
    case BT_PLUS:
1462
596k
    case BT_COMMA:
1463
679k
    case BT_SOL:
1464
680k
    case BT_EQUALS:
1465
685k
    case BT_QUEST:
1466
690k
    case BT_CR:
1467
692k
    case BT_LF:
1468
693k
    case BT_SEMI:
1469
693k
    case BT_EXCL:
1470
695k
    case BT_AST:
1471
699k
    case BT_PERCNT:
1472
709k
    case BT_NUM:
1473
#  ifdef XML_NS
1474
    case BT_COLON:
1475
#  endif
1476
709k
      break;
1477
2.68k
    case BT_S:
1478
2.68k
      if (CHAR_MATCHES(enc, ptr, ASCII_TAB)) {
1479
1
        *badPtr = ptr;
1480
1
        return 0;
1481
1
      }
1482
2.68k
      break;
1483
4.84k
    case BT_NAME:
1484
111k
    case BT_NMSTRT:
1485
111k
      if (! (BYTE_TO_ASCII(enc, ptr) & ~0x7f))
1486
111k
        break;
1487
      /* fall through */
1488
4.18k
    default:
1489
4.18k
      switch (BYTE_TO_ASCII(enc, ptr)) {
1490
2.56k
      case 0x24: /* $ */
1491
4.17k
      case 0x40: /* @ */
1492
4.17k
        break;
1493
10
      default:
1494
10
        *badPtr = ptr;
1495
10
        return 0;
1496
4.18k
      }
1497
4.17k
      break;
1498
827k
    }
1499
827k
  }
1500
4.68k
  return 1;
1501
4.69k
}
xmltok.c:normal_isPublicId
Line
Count
Source
1450
4.69k
                   const char **badPtr) {
1451
4.69k
  ptr += MINBPC(enc);
1452
4.69k
  end -= MINBPC(enc);
1453
827k
  for (; HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
1454
827k
    switch (BYTE_TYPE(enc, ptr)) {
1455
340k
    case BT_DIGIT:
1456
525k
    case BT_HEX:
1457
526k
    case BT_MINUS:
1458
526k
    case BT_APOS:
1459
527k
    case BT_LPAR:
1460
587k
    case BT_RPAR:
1461
588k
    case BT_PLUS:
1462
596k
    case BT_COMMA:
1463
679k
    case BT_SOL:
1464
680k
    case BT_EQUALS:
1465
685k
    case BT_QUEST:
1466
690k
    case BT_CR:
1467
692k
    case BT_LF:
1468
693k
    case BT_SEMI:
1469
693k
    case BT_EXCL:
1470
695k
    case BT_AST:
1471
699k
    case BT_PERCNT:
1472
709k
    case BT_NUM:
1473
#  ifdef XML_NS
1474
    case BT_COLON:
1475
#  endif
1476
709k
      break;
1477
2.68k
    case BT_S:
1478
2.68k
      if (CHAR_MATCHES(enc, ptr, ASCII_TAB)) {
1479
1
        *badPtr = ptr;
1480
1
        return 0;
1481
1
      }
1482
2.68k
      break;
1483
4.84k
    case BT_NAME:
1484
111k
    case BT_NMSTRT:
1485
111k
      if (! (BYTE_TO_ASCII(enc, ptr) & ~0x7f))
1486
111k
        break;
1487
      /* fall through */
1488
4.18k
    default:
1489
4.18k
      switch (BYTE_TO_ASCII(enc, ptr)) {
1490
2.56k
      case 0x24: /* $ */
1491
4.17k
      case 0x40: /* @ */
1492
4.17k
        break;
1493
10
      default:
1494
10
        *badPtr = ptr;
1495
10
        return 0;
1496
4.18k
      }
1497
4.17k
      break;
1498
827k
    }
1499
827k
  }
1500
4.68k
  return 1;
1501
4.69k
}
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
440k
                ATTRIBUTE *atts) {
1511
440k
  enum { other, inName, inValue } state = inName;
1512
440k
  int nAtts = 0;
1513
440k
  int open = 0; /* defined when state == inValue;
1514
                   initialization just to shut up compilers */
1515
1516
58.0M
  for (ptr += MINBPC(enc);; ptr += MINBPC(enc)) {
1517
58.0M
    switch (BYTE_TYPE(enc, ptr)) {
1518
0
#  define START_NAME                                                           \
1519
32.0M
    if (state == other) {                                                      \
1520
4.95M
      if (nAtts < attsMax) {                                                   \
1521
2.50M
        atts[nAtts].name = ptr;                                                \
1522
2.50M
        atts[nAtts].normalized = 1;                                            \
1523
2.50M
      }                                                                        \
1524
4.95M
      state = inName;                                                          \
1525
4.95M
    }
1526
0
#  define LEAD_CASE(n)                                                         \
1527
531k
  case BT_LEAD##n: /* NOTE: The encoding has already been validated. */        \
1528
531k
    START_NAME ptr += (n - MINBPC(enc));                                       \
1529
531k
    break;
1530
222k
      LEAD_CASE(2)
1531
258k
      LEAD_CASE(3)
1532
50.7k
      LEAD_CASE(4)
1533
0
#  undef LEAD_CASE
1534
0
    case BT_NONASCII:
1535
30.0M
    case BT_NMSTRT:
1536
31.5M
    case BT_HEX:
1537
31.5M
      START_NAME
1538
31.5M
      break;
1539
0
#  undef START_NAME
1540
612k
    case BT_QUOT:
1541
612k
      if (state != inValue) {
1542
227k
        if (nAtts < attsMax)
1543
141k
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1544
227k
        state = inValue;
1545
227k
        open = BT_QUOT;
1546
384k
      } else if (open == BT_QUOT) {
1547
227k
        state = other;
1548
227k
        if (nAtts < attsMax)
1549
141k
          atts[nAtts].valueEnd = ptr;
1550
227k
        nAtts++;
1551
227k
      }
1552
612k
      break;
1553
9.48M
    case BT_APOS:
1554
9.48M
      if (state != inValue) {
1555
4.72M
        if (nAtts < attsMax)
1556
2.36M
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1557
4.72M
        state = inValue;
1558
4.72M
        open = BT_APOS;
1559
4.76M
      } else if (open == BT_APOS) {
1560
4.72M
        state = other;
1561
4.72M
        if (nAtts < attsMax)
1562
2.36M
          atts[nAtts].valueEnd = ptr;
1563
4.72M
        nAtts++;
1564
4.72M
      }
1565
9.48M
      break;
1566
154k
    case BT_AMP:
1567
154k
      if (nAtts < attsMax)
1568
153k
        atts[nAtts].normalized = 0;
1569
154k
      break;
1570
3.18M
    case BT_S:
1571
3.18M
      if (state == inName)
1572
43.4k
        state = other;
1573
3.14M
      else if (state == inValue && nAtts < attsMax && atts[nAtts].normalized
1574
113k
               && (ptr == atts[nAtts].valuePtr
1575
17.4k
                   || BYTE_TO_ASCII(enc, ptr) != ASCII_SPACE
1576
10.9k
                   || BYTE_TO_ASCII(enc, ptr + MINBPC(enc)) == ASCII_SPACE
1577
9.18k
                   || BYTE_TYPE(enc, ptr + MINBPC(enc)) == open))
1578
106k
        atts[nAtts].normalized = 0;
1579
3.18M
      break;
1580
2.84M
    case BT_CR:
1581
3.42M
    case BT_LF:
1582
      /* This case ensures that the first attribute name is counted
1583
         Apart from that we could just change state on the quote. */
1584
3.42M
      if (state == inName)
1585
26.5k
        state = other;
1586
3.39M
      else if (state == inValue && nAtts < attsMax)
1587
773k
        atts[nAtts].normalized = 0;
1588
3.42M
      break;
1589
373k
    case BT_GT:
1590
518k
    case BT_SOL:
1591
518k
      if (state != inValue)
1592
440k
        return nAtts;
1593
77.5k
      break;
1594
8.61M
    default:
1595
8.61M
      break;
1596
58.0M
    }
1597
58.0M
  }
1598
  /* not reached */
1599
440k
}
xmltok.c:normal_getAtts
Line
Count
Source
1510
440k
                ATTRIBUTE *atts) {
1511
440k
  enum { other, inName, inValue } state = inName;
1512
440k
  int nAtts = 0;
1513
440k
  int open = 0; /* defined when state == inValue;
1514
                   initialization just to shut up compilers */
1515
1516
58.0M
  for (ptr += MINBPC(enc);; ptr += MINBPC(enc)) {
1517
58.0M
    switch (BYTE_TYPE(enc, ptr)) {
1518
0
#  define START_NAME                                                           \
1519
0
    if (state == other) {                                                      \
1520
0
      if (nAtts < attsMax) {                                                   \
1521
0
        atts[nAtts].name = ptr;                                                \
1522
0
        atts[nAtts].normalized = 1;                                            \
1523
0
      }                                                                        \
1524
0
      state = inName;                                                          \
1525
0
    }
1526
0
#  define LEAD_CASE(n)                                                         \
1527
0
  case BT_LEAD##n: /* NOTE: The encoding has already been validated. */        \
1528
0
    START_NAME ptr += (n - MINBPC(enc));                                       \
1529
0
    break;
1530
222k
      LEAD_CASE(2)
1531
258k
      LEAD_CASE(3)
1532
50.7k
      LEAD_CASE(4)
1533
0
#  undef LEAD_CASE
1534
0
    case BT_NONASCII:
1535
30.0M
    case BT_NMSTRT:
1536
31.5M
    case BT_HEX:
1537
31.5M
      START_NAME
1538
31.5M
      break;
1539
0
#  undef START_NAME
1540
612k
    case BT_QUOT:
1541
612k
      if (state != inValue) {
1542
227k
        if (nAtts < attsMax)
1543
141k
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1544
227k
        state = inValue;
1545
227k
        open = BT_QUOT;
1546
384k
      } else if (open == BT_QUOT) {
1547
227k
        state = other;
1548
227k
        if (nAtts < attsMax)
1549
141k
          atts[nAtts].valueEnd = ptr;
1550
227k
        nAtts++;
1551
227k
      }
1552
612k
      break;
1553
9.48M
    case BT_APOS:
1554
9.48M
      if (state != inValue) {
1555
4.72M
        if (nAtts < attsMax)
1556
2.36M
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1557
4.72M
        state = inValue;
1558
4.72M
        open = BT_APOS;
1559
4.76M
      } else if (open == BT_APOS) {
1560
4.72M
        state = other;
1561
4.72M
        if (nAtts < attsMax)
1562
2.36M
          atts[nAtts].valueEnd = ptr;
1563
4.72M
        nAtts++;
1564
4.72M
      }
1565
9.48M
      break;
1566
154k
    case BT_AMP:
1567
154k
      if (nAtts < attsMax)
1568
153k
        atts[nAtts].normalized = 0;
1569
154k
      break;
1570
3.18M
    case BT_S:
1571
3.18M
      if (state == inName)
1572
43.4k
        state = other;
1573
3.14M
      else if (state == inValue && nAtts < attsMax && atts[nAtts].normalized
1574
113k
               && (ptr == atts[nAtts].valuePtr
1575
17.4k
                   || BYTE_TO_ASCII(enc, ptr) != ASCII_SPACE
1576
10.9k
                   || BYTE_TO_ASCII(enc, ptr + MINBPC(enc)) == ASCII_SPACE
1577
9.18k
                   || BYTE_TYPE(enc, ptr + MINBPC(enc)) == open))
1578
106k
        atts[nAtts].normalized = 0;
1579
3.18M
      break;
1580
2.84M
    case BT_CR:
1581
3.42M
    case BT_LF:
1582
      /* This case ensures that the first attribute name is counted
1583
         Apart from that we could just change state on the quote. */
1584
3.42M
      if (state == inName)
1585
26.5k
        state = other;
1586
3.39M
      else if (state == inValue && nAtts < attsMax)
1587
773k
        atts[nAtts].normalized = 0;
1588
3.42M
      break;
1589
373k
    case BT_GT:
1590
518k
    case BT_SOL:
1591
518k
      if (state != inValue)
1592
440k
        return nAtts;
1593
77.5k
      break;
1594
8.61M
    default:
1595
8.61M
      break;
1596
58.0M
    }
1597
58.0M
  }
1598
  /* not reached */
1599
440k
}
Unexecuted instantiation: xmltok.c:little2_getAtts
Unexecuted instantiation: xmltok.c:big2_getAtts
1600
1601
static int PTRFASTCALL
1602
146k
PREFIX(charRefNumber)(const ENCODING *enc, const char *ptr) {
1603
146k
  int result = 0;
1604
  /* skip &# */
1605
146k
  UNUSED_P(enc);
1606
146k
  ptr += 2 * MINBPC(enc);
1607
146k
  if (CHAR_MATCHES(enc, ptr, ASCII_x)) {
1608
660k
    for (ptr += MINBPC(enc); ! CHAR_MATCHES(enc, ptr, ASCII_SEMI);
1609
518k
         ptr += MINBPC(enc)) {
1610
518k
      int c = BYTE_TO_ASCII(enc, ptr);
1611
518k
      switch (c) {
1612
4.70k
      case ASCII_0:
1613
34.7k
      case ASCII_1:
1614
79.5k
      case ASCII_2:
1615
103k
      case ASCII_3:
1616
156k
      case ASCII_4:
1617
194k
      case ASCII_5:
1618
198k
      case ASCII_6:
1619
219k
      case ASCII_7:
1620
248k
      case ASCII_8:
1621
259k
      case ASCII_9:
1622
259k
        result <<= 4;
1623
259k
        result |= (c - ASCII_0);
1624
259k
        break;
1625
46.0k
      case ASCII_A:
1626
75.3k
      case ASCII_B:
1627
76.0k
      case ASCII_C:
1628
107k
      case ASCII_D:
1629
112k
      case ASCII_E:
1630
146k
      case ASCII_F:
1631
146k
        result <<= 4;
1632
146k
        result += 10 + (c - ASCII_A);
1633
146k
        break;
1634
1.08k
      case ASCII_a:
1635
19.9k
      case ASCII_b:
1636
20.8k
      case ASCII_c:
1637
57.5k
      case ASCII_d:
1638
62.3k
      case ASCII_e:
1639
112k
      case ASCII_f:
1640
112k
        result <<= 4;
1641
112k
        result += 10 + (c - ASCII_a);
1642
112k
        break;
1643
518k
      }
1644
518k
      if (result >= 0x110000)
1645
16
        return -1;
1646
518k
    }
1647
142k
  } else {
1648
16.9k
    for (; ! CHAR_MATCHES(enc, ptr, ASCII_SEMI); ptr += MINBPC(enc)) {
1649
12.5k
      int c = BYTE_TO_ASCII(enc, ptr);
1650
12.5k
      result *= 10;
1651
12.5k
      result += (c - ASCII_0);
1652
12.5k
      if (result >= 0x110000)
1653
2
        return -1;
1654
12.5k
    }
1655
4.44k
  }
1656
146k
  return checkCharRefNumber(result);
1657
146k
}
xmltok.c:normal_charRefNumber
Line
Count
Source
1602
146k
PREFIX(charRefNumber)(const ENCODING *enc, const char *ptr) {
1603
146k
  int result = 0;
1604
  /* skip &# */
1605
146k
  UNUSED_P(enc);
1606
146k
  ptr += 2 * MINBPC(enc);
1607
146k
  if (CHAR_MATCHES(enc, ptr, ASCII_x)) {
1608
660k
    for (ptr += MINBPC(enc); ! CHAR_MATCHES(enc, ptr, ASCII_SEMI);
1609
518k
         ptr += MINBPC(enc)) {
1610
518k
      int c = BYTE_TO_ASCII(enc, ptr);
1611
518k
      switch (c) {
1612
4.70k
      case ASCII_0:
1613
34.7k
      case ASCII_1:
1614
79.5k
      case ASCII_2:
1615
103k
      case ASCII_3:
1616
156k
      case ASCII_4:
1617
194k
      case ASCII_5:
1618
198k
      case ASCII_6:
1619
219k
      case ASCII_7:
1620
248k
      case ASCII_8:
1621
259k
      case ASCII_9:
1622
259k
        result <<= 4;
1623
259k
        result |= (c - ASCII_0);
1624
259k
        break;
1625
46.0k
      case ASCII_A:
1626
75.3k
      case ASCII_B:
1627
76.0k
      case ASCII_C:
1628
107k
      case ASCII_D:
1629
112k
      case ASCII_E:
1630
146k
      case ASCII_F:
1631
146k
        result <<= 4;
1632
146k
        result += 10 + (c - ASCII_A);
1633
146k
        break;
1634
1.08k
      case ASCII_a:
1635
19.9k
      case ASCII_b:
1636
20.8k
      case ASCII_c:
1637
57.5k
      case ASCII_d:
1638
62.3k
      case ASCII_e:
1639
112k
      case ASCII_f:
1640
112k
        result <<= 4;
1641
112k
        result += 10 + (c - ASCII_a);
1642
112k
        break;
1643
518k
      }
1644
518k
      if (result >= 0x110000)
1645
16
        return -1;
1646
518k
    }
1647
142k
  } else {
1648
16.9k
    for (; ! CHAR_MATCHES(enc, ptr, ASCII_SEMI); ptr += MINBPC(enc)) {
1649
12.5k
      int c = BYTE_TO_ASCII(enc, ptr);
1650
12.5k
      result *= 10;
1651
12.5k
      result += (c - ASCII_0);
1652
12.5k
      if (result >= 0x110000)
1653
2
        return -1;
1654
12.5k
    }
1655
4.44k
  }
1656
146k
  return checkCharRefNumber(result);
1657
146k
}
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
212k
                             const char *end) {
1662
212k
  UNUSED_P(enc);
1663
212k
  switch ((end - ptr) / MINBPC(enc)) {
1664
15.3k
  case 2:
1665
15.3k
    if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_t)) {
1666
2.79k
      switch (BYTE_TO_ASCII(enc, ptr)) {
1667
493
      case ASCII_l:
1668
493
        return ASCII_LT;
1669
399
      case ASCII_g:
1670
399
        return ASCII_GT;
1671
2.79k
      }
1672
2.79k
    }
1673
14.4k
    break;
1674
50.8k
  case 3:
1675
50.8k
    if (CHAR_MATCHES(enc, ptr, ASCII_a)) {
1676
40.7k
      ptr += MINBPC(enc);
1677
40.7k
      if (CHAR_MATCHES(enc, ptr, ASCII_m)) {
1678
39.4k
        ptr += MINBPC(enc);
1679
39.4k
        if (CHAR_MATCHES(enc, ptr, ASCII_p))
1680
39.2k
          return ASCII_AMP;
1681
39.4k
      }
1682
40.7k
    }
1683
11.5k
    break;
1684
47.3k
  case 4:
1685
47.3k
    switch (BYTE_TO_ASCII(enc, ptr)) {
1686
10.1k
    case ASCII_q:
1687
10.1k
      ptr += MINBPC(enc);
1688
10.1k
      if (CHAR_MATCHES(enc, ptr, ASCII_u)) {
1689
9.10k
        ptr += MINBPC(enc);
1690
9.10k
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1691
8.73k
          ptr += MINBPC(enc);
1692
8.73k
          if (CHAR_MATCHES(enc, ptr, ASCII_t))
1693
8.31k
            return ASCII_QUOT;
1694
8.73k
        }
1695
9.10k
      }
1696
1.85k
      break;
1697
3.59k
    case ASCII_a:
1698
3.59k
      ptr += MINBPC(enc);
1699
3.59k
      if (CHAR_MATCHES(enc, ptr, ASCII_p)) {
1700
992
        ptr += MINBPC(enc);
1701
992
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1702
648
          ptr += MINBPC(enc);
1703
648
          if (CHAR_MATCHES(enc, ptr, ASCII_s))
1704
208
            return ASCII_APOS;
1705
648
        }
1706
992
      }
1707
3.38k
      break;
1708
47.3k
    }
1709
212k
  }
1710
163k
  return 0;
1711
212k
}
xmltok.c:normal_predefinedEntityName
Line
Count
Source
1661
212k
                             const char *end) {
1662
212k
  UNUSED_P(enc);
1663
212k
  switch ((end - ptr) / MINBPC(enc)) {
1664
15.3k
  case 2:
1665
15.3k
    if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_t)) {
1666
2.79k
      switch (BYTE_TO_ASCII(enc, ptr)) {
1667
493
      case ASCII_l:
1668
493
        return ASCII_LT;
1669
399
      case ASCII_g:
1670
399
        return ASCII_GT;
1671
2.79k
      }
1672
2.79k
    }
1673
14.4k
    break;
1674
50.8k
  case 3:
1675
50.8k
    if (CHAR_MATCHES(enc, ptr, ASCII_a)) {
1676
40.7k
      ptr += MINBPC(enc);
1677
40.7k
      if (CHAR_MATCHES(enc, ptr, ASCII_m)) {
1678
39.4k
        ptr += MINBPC(enc);
1679
39.4k
        if (CHAR_MATCHES(enc, ptr, ASCII_p))
1680
39.2k
          return ASCII_AMP;
1681
39.4k
      }
1682
40.7k
    }
1683
11.5k
    break;
1684
47.3k
  case 4:
1685
47.3k
    switch (BYTE_TO_ASCII(enc, ptr)) {
1686
10.1k
    case ASCII_q:
1687
10.1k
      ptr += MINBPC(enc);
1688
10.1k
      if (CHAR_MATCHES(enc, ptr, ASCII_u)) {
1689
9.10k
        ptr += MINBPC(enc);
1690
9.10k
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1691
8.73k
          ptr += MINBPC(enc);
1692
8.73k
          if (CHAR_MATCHES(enc, ptr, ASCII_t))
1693
8.31k
            return ASCII_QUOT;
1694
8.73k
        }
1695
9.10k
      }
1696
1.85k
      break;
1697
3.59k
    case ASCII_a:
1698
3.59k
      ptr += MINBPC(enc);
1699
3.59k
      if (CHAR_MATCHES(enc, ptr, ASCII_p)) {
1700
992
        ptr += MINBPC(enc);
1701
992
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1702
648
          ptr += MINBPC(enc);
1703
648
          if (CHAR_MATCHES(enc, ptr, ASCII_s))
1704
208
            return ASCII_APOS;
1705
648
        }
1706
992
      }
1707
3.38k
      break;
1708
47.3k
    }
1709
212k
  }
1710
163k
  return 0;
1711
212k
}
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
482k
                         const char *end1, const char *ptr2) {
1716
482k
  UNUSED_P(enc);
1717
2.27M
  for (; *ptr2; ptr1 += MINBPC(enc), ptr2++) {
1718
2.01M
    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
38
      return 0; /* LCOV_EXCL_LINE */
1725
38
    }
1726
2.01M
    if (! CHAR_MATCHES(enc, ptr1, *ptr2))
1727
229k
      return 0;
1728
2.01M
  }
1729
252k
  return ptr1 == end1;
1730
482k
}
xmltok.c:normal_nameMatchesAscii
Line
Count
Source
1715
482k
                         const char *end1, const char *ptr2) {
1716
482k
  UNUSED_P(enc);
1717
2.27M
  for (; *ptr2; ptr1 += MINBPC(enc), ptr2++) {
1718
2.01M
    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
38
      return 0; /* LCOV_EXCL_LINE */
1725
38
    }
1726
2.01M
    if (! CHAR_MATCHES(enc, ptr1, *ptr2))
1727
229k
      return 0;
1728
2.01M
  }
1729
252k
  return ptr1 == end1;
1730
482k
}
Unexecuted instantiation: xmltok.c:little2_nameMatchesAscii
Unexecuted instantiation: xmltok.c:big2_nameMatchesAscii
1731
1732
static int PTRFASTCALL
1733
552k
PREFIX(nameLength)(const ENCODING *enc, const char *ptr) {
1734
552k
  const char *start = ptr;
1735
10.2M
  for (;;) {
1736
10.2M
    switch (BYTE_TYPE(enc, ptr)) {
1737
0
#  define LEAD_CASE(n)                                                         \
1738
86.3k
  case BT_LEAD##n:                                                             \
1739
86.3k
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1740
86.3k
    break;
1741
37.5k
      LEAD_CASE(2)
1742
48.8k
      LEAD_CASE(3)
1743
0
      LEAD_CASE(4)
1744
0
#  undef LEAD_CASE
1745
0
    case BT_NONASCII:
1746
8.39M
    case BT_NMSTRT:
1747
#  ifdef XML_NS
1748
    case BT_COLON:
1749
#  endif
1750
9.43M
    case BT_HEX:
1751
9.54M
    case BT_DIGIT:
1752
9.55M
    case BT_NAME:
1753
9.60M
    case BT_MINUS:
1754
9.60M
      ptr += MINBPC(enc);
1755
9.60M
      break;
1756
552k
    default:
1757
552k
      return (int)(ptr - start);
1758
10.2M
    }
1759
10.2M
  }
1760
552k
}
xmltok.c:normal_nameLength
Line
Count
Source
1733
552k
PREFIX(nameLength)(const ENCODING *enc, const char *ptr) {
1734
552k
  const char *start = ptr;
1735
10.2M
  for (;;) {
1736
10.2M
    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
37.5k
      LEAD_CASE(2)
1742
48.8k
      LEAD_CASE(3)
1743
0
      LEAD_CASE(4)
1744
0
#  undef LEAD_CASE
1745
0
    case BT_NONASCII:
1746
8.39M
    case BT_NMSTRT:
1747
#  ifdef XML_NS
1748
    case BT_COLON:
1749
#  endif
1750
9.43M
    case BT_HEX:
1751
9.54M
    case BT_DIGIT:
1752
9.55M
    case BT_NAME:
1753
9.60M
    case BT_MINUS:
1754
9.60M
      ptr += MINBPC(enc);
1755
9.60M
      break;
1756
552k
    default:
1757
552k
      return (int)(ptr - start);
1758
10.2M
    }
1759
10.2M
  }
1760
552k
}
Unexecuted instantiation: xmltok.c:little2_nameLength
Unexecuted instantiation: xmltok.c:big2_nameLength
1761
1762
static const char *PTRFASTCALL
1763
0
PREFIX(skipS)(const ENCODING *enc, const char *ptr) {
1764
0
  for (;;) {
1765
0
    switch (BYTE_TYPE(enc, ptr)) {
1766
0
    case BT_LF:
1767
0
    case BT_CR:
1768
0
    case BT_S:
1769
0
      ptr += MINBPC(enc);
1770
0
      break;
1771
0
    default:
1772
0
      return ptr;
1773
0
    }
1774
0
  }
1775
0
}
Unexecuted instantiation: xmltok.c:normal_skipS
Unexecuted instantiation: xmltok.c:little2_skipS
Unexecuted instantiation: xmltok.c:big2_skipS
1776
1777
static void PTRCALL
1778
PREFIX(updatePosition)(const ENCODING *enc, const char *ptr, const char *end,
1779
17.9k
                       POSITION *pos) {
1780
125M
  while (HAS_CHAR(enc, ptr, end)) {
1781
125M
    switch (BYTE_TYPE(enc, ptr)) {
1782
0
#  define LEAD_CASE(n)                                                         \
1783
1.87M
  case BT_LEAD##n:                                                             \
1784
1.87M
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1785
1.87M
    pos->columnNumber++;                                                       \
1786
1.87M
    break;
1787
777k
      LEAD_CASE(2)
1788
874k
      LEAD_CASE(3)
1789
222k
      LEAD_CASE(4)
1790
0
#  undef LEAD_CASE
1791
2.99M
    case BT_LF:
1792
2.99M
      pos->columnNumber = 0;
1793
2.99M
      pos->lineNumber++;
1794
2.99M
      ptr += MINBPC(enc);
1795
2.99M
      break;
1796
4.21M
    case BT_CR:
1797
4.21M
      pos->lineNumber++;
1798
4.21M
      ptr += MINBPC(enc);
1799
4.21M
      if (HAS_CHAR(enc, ptr, end) && BYTE_TYPE(enc, ptr) == BT_LF)
1800
918k
        ptr += MINBPC(enc);
1801
4.21M
      pos->columnNumber = 0;
1802
4.21M
      break;
1803
116M
    default:
1804
116M
      ptr += MINBPC(enc);
1805
116M
      pos->columnNumber++;
1806
116M
      break;
1807
125M
    }
1808
125M
  }
1809
17.9k
}
xmltok.c:normal_updatePosition
Line
Count
Source
1779
17.4k
                       POSITION *pos) {
1780
125M
  while (HAS_CHAR(enc, ptr, end)) {
1781
125M
    switch (BYTE_TYPE(enc, ptr)) {
1782
0
#  define LEAD_CASE(n)                                                         \
1783
0
  case BT_LEAD##n:                                                             \
1784
0
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1785
0
    pos->columnNumber++;                                                       \
1786
0
    break;
1787
777k
      LEAD_CASE(2)
1788
874k
      LEAD_CASE(3)
1789
222k
      LEAD_CASE(4)
1790
0
#  undef LEAD_CASE
1791
2.99M
    case BT_LF:
1792
2.99M
      pos->columnNumber = 0;
1793
2.99M
      pos->lineNumber++;
1794
2.99M
      ptr += MINBPC(enc);
1795
2.99M
      break;
1796
4.21M
    case BT_CR:
1797
4.21M
      pos->lineNumber++;
1798
4.21M
      ptr += MINBPC(enc);
1799
4.21M
      if (HAS_CHAR(enc, ptr, end) && BYTE_TYPE(enc, ptr) == BT_LF)
1800
918k
        ptr += MINBPC(enc);
1801
4.21M
      pos->columnNumber = 0;
1802
4.21M
      break;
1803
116M
    default:
1804
116M
      ptr += MINBPC(enc);
1805
116M
      pos->columnNumber++;
1806
116M
      break;
1807
125M
    }
1808
125M
  }
1809
17.4k
}
xmltok.c:little2_updatePosition
Line
Count
Source
1779
216
                       POSITION *pos) {
1780
3.32k
  while (HAS_CHAR(enc, ptr, end)) {
1781
3.32k
    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
3.32k
    default:
1804
3.32k
      ptr += MINBPC(enc);
1805
3.32k
      pos->columnNumber++;
1806
3.32k
      break;
1807
3.32k
    }
1808
3.32k
  }
1809
216
}
xmltok.c:big2_updatePosition
Line
Count
Source
1779
212
                       POSITION *pos) {
1780
2.15k
  while (HAS_CHAR(enc, ptr, end)) {
1781
2.15k
    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
2.15k
    default:
1804
2.15k
      ptr += MINBPC(enc);
1805
2.15k
      pos->columnNumber++;
1806
2.15k
      break;
1807
2.15k
    }
1808
2.15k
  }
1809
212
}
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 */