Coverage Report

Created: 2025-10-12 07:14

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
42
#    define IS_INVALID_CHAR(enc, ptr, n) (0)
46
#  endif
47
48
#  define INVALID_LEAD_CASE(n, ptr, nextTokPtr)                                \
49
831k
  case BT_LEAD##n:                                                             \
50
831k
    if (end - ptr < n)                                                         \
51
831k
      return XML_TOK_PARTIAL_CHAR;                                             \
52
831k
    if (IS_INVALID_CHAR(enc, ptr, n)) {                                        \
53
74
      *(nextTokPtr) = (ptr);                                                   \
54
74
      return XML_TOK_INVALID;                                                  \
55
74
    }                                                                          \
56
831k
    ptr += n;                                                                  \
57
831k
    break;
58
59
#  define INVALID_CASES(ptr, nextTokPtr)                                       \
60
326k
    INVALID_LEAD_CASE(2, ptr, nextTokPtr)                                      \
61
326k
    INVALID_LEAD_CASE(3, ptr, nextTokPtr)                                      \
62
321k
    INVALID_LEAD_CASE(4, ptr, nextTokPtr)                                      \
63
182k
  case BT_NONXML:                                                              \
64
47
  case BT_MALFORM:                                                             \
65
79
  case BT_TRAIL:                                                               \
66
79
    *(nextTokPtr) = (ptr);                                                     \
67
79
    return XML_TOK_INVALID;
68
69
#  define CHECK_NAME_CASE(n, enc, ptr, end, nextTokPtr)                        \
70
427k
  case BT_LEAD##n:                                                             \
71
427k
    if (end - ptr < n)                                                         \
72
427k
      return XML_TOK_PARTIAL_CHAR;                                             \
73
427k
    if (IS_INVALID_CHAR(enc, ptr, n) || ! IS_NAME_CHAR(enc, ptr, n)) {         \
74
233
      *nextTokPtr = ptr;                                                       \
75
233
      return XML_TOK_INVALID;                                                  \
76
233
    }                                                                          \
77
427k
    ptr += n;                                                                  \
78
427k
    break;
79
80
#  define CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)                          \
81
31.2M
  case BT_NONASCII:                                                            \
82
31.2M
    if (! IS_NAME_CHAR_MINBPC(enc, ptr)) {                                     \
83
42
      *nextTokPtr = ptr;                                                       \
84
42
      return XML_TOK_INVALID;                                                  \
85
42
    }                                                                          \
86
31.2M
    /* fall through */                                                         \
87
31.2M
  case BT_NMSTRT:                                                              \
88
26.7M
  case BT_HEX:                                                                 \
89
30.7M
  case BT_DIGIT:                                                               \
90
30.8M
  case BT_NAME:                                                                \
91
31.2M
  case BT_MINUS:                                                               \
92
31.2M
    ptr += MINBPC(enc);                                                        \
93
31.2M
    break;                                                                     \
94
31.2M
    CHECK_NAME_CASE(2, enc, ptr, end, nextTokPtr)                              \
95
262k
    CHECK_NAME_CASE(3, enc, ptr, end, nextTokPtr)                              \
96
262k
    CHECK_NAME_CASE(4, enc, ptr, end, nextTokPtr)
97
98
#  define CHECK_NMSTRT_CASE(n, enc, ptr, end, nextTokPtr)                      \
99
122k
  case BT_LEAD##n:                                                             \
100
122k
    if ((end) - (ptr) < (n))                                                   \
101
121k
      return XML_TOK_PARTIAL_CHAR;                                             \
102
122k
    if (IS_INVALID_CHAR(enc, ptr, n) || ! IS_NMSTRT_CHAR(enc, ptr, n)) {       \
103
114
      *nextTokPtr = ptr;                                                       \
104
114
      return XML_TOK_INVALID;                                                  \
105
114
    }                                                                          \
106
122k
    ptr += n;                                                                  \
107
121k
    break;
108
109
#  define CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)                        \
110
1.73M
  case BT_NONASCII:                                                            \
111
1.73M
    if (! IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {                                   \
112
0
      *nextTokPtr = ptr;                                                       \
113
0
      return XML_TOK_INVALID;                                                  \
114
0
    }                                                                          \
115
1.73M
    /* fall through */                                                         \
116
1.73M
  case BT_NMSTRT:                                                              \
117
1.73M
  case BT_HEX:                                                                 \
118
1.73M
    ptr += MINBPC(enc);                                                        \
119
1.73M
    break;                                                                     \
120
1.73M
    CHECK_NMSTRT_CASE(2, enc, ptr, end, nextTokPtr)                            \
121
73.8k
    CHECK_NMSTRT_CASE(3, enc, ptr, end, nextTokPtr)                            \
122
73.7k
    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
303M
    ((end) - (ptr) >= ((count) * MINBPC(enc)))
130
131
12.0M
#  define HAS_CHAR(enc, ptr, end) HAS_CHARS(enc, ptr, end, 1)
132
133
#  define REQUIRE_CHARS(enc, ptr, end, count)                                  \
134
30.3M
    {                                                                          \
135
30.3M
      if (! HAS_CHARS(enc, ptr, end, count)) {                                 \
136
385
        return XML_TOK_PARTIAL;                                                \
137
385
      }                                                                        \
138
30.3M
    }
139
140
30.3M
#  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
31.9k
                    const char **nextTokPtr) {
147
31.9k
  if (HAS_CHAR(enc, ptr, end)) {
148
31.9k
    if (! CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
149
11
      *nextTokPtr = ptr;
150
11
      return XML_TOK_INVALID;
151
11
    }
152
31.9k
    ptr += MINBPC(enc);
153
5.56M
    while (HAS_CHAR(enc, ptr, end)) {
154
5.56M
      switch (BYTE_TYPE(enc, ptr)) {
155
299k
        INVALID_CASES(ptr, nextTokPtr)
156
66.6k
      case BT_MINUS:
157
66.6k
        ptr += MINBPC(enc);
158
66.6k
        REQUIRE_CHAR(enc, ptr, end);
159
66.6k
        if (CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
160
31.8k
          ptr += MINBPC(enc);
161
31.8k
          REQUIRE_CHAR(enc, ptr, end);
162
31.8k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
163
10
            *nextTokPtr = ptr;
164
10
            return XML_TOK_INVALID;
165
10
          }
166
31.8k
          *nextTokPtr = ptr + MINBPC(enc);
167
31.8k
          return XML_TOK_COMMENT;
168
31.8k
        }
169
34.7k
        break;
170
5.34M
      default:
171
5.34M
        ptr += MINBPC(enc);
172
5.34M
        break;
173
5.56M
      }
174
5.56M
    }
175
31.9k
  }
176
58
  return XML_TOK_PARTIAL;
177
31.9k
}
xmltok.c:normal_scanComment
Line
Count
Source
146
31.9k
                    const char **nextTokPtr) {
147
31.9k
  if (HAS_CHAR(enc, ptr, end)) {
148
31.9k
    if (! CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
149
11
      *nextTokPtr = ptr;
150
11
      return XML_TOK_INVALID;
151
11
    }
152
31.9k
    ptr += MINBPC(enc);
153
5.56M
    while (HAS_CHAR(enc, ptr, end)) {
154
5.56M
      switch (BYTE_TYPE(enc, ptr)) {
155
299k
        INVALID_CASES(ptr, nextTokPtr)
156
66.6k
      case BT_MINUS:
157
66.6k
        ptr += MINBPC(enc);
158
66.6k
        REQUIRE_CHAR(enc, ptr, end);
159
66.6k
        if (CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
160
31.8k
          ptr += MINBPC(enc);
161
31.8k
          REQUIRE_CHAR(enc, ptr, end);
162
31.8k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
163
10
            *nextTokPtr = ptr;
164
10
            return XML_TOK_INVALID;
165
10
          }
166
31.8k
          *nextTokPtr = ptr + MINBPC(enc);
167
31.8k
          return XML_TOK_COMMENT;
168
31.8k
        }
169
34.7k
        break;
170
5.34M
      default:
171
5.34M
        ptr += MINBPC(enc);
172
5.34M
        break;
173
5.56M
      }
174
5.56M
    }
175
31.9k
  }
176
58
  return XML_TOK_PARTIAL;
177
31.9k
}
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
62.2k
                 const char **nextTokPtr) {
184
62.2k
  REQUIRE_CHAR(enc, ptr, end);
185
62.1k
  switch (BYTE_TYPE(enc, ptr)) {
186
2.98k
  case BT_MINUS:
187
2.98k
    return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
188
6
  case BT_LSQB:
189
6
    *nextTokPtr = ptr + MINBPC(enc);
190
6
    return XML_TOK_COND_SECT_OPEN;
191
687
  case BT_NMSTRT:
192
59.1k
  case BT_HEX:
193
59.1k
    ptr += MINBPC(enc);
194
59.1k
    break;
195
4
  default:
196
4
    *nextTokPtr = ptr;
197
4
    return XML_TOK_INVALID;
198
62.1k
  }
199
402k
  while (HAS_CHAR(enc, ptr, end)) {
200
402k
    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
5
      case BT_PERCNT:
209
5
        *nextTokPtr = ptr;
210
5
        return XML_TOK_INVALID;
211
15
      }
212
      /* fall through */
213
20.0k
    case BT_S:
214
54.8k
    case BT_CR:
215
59.1k
    case BT_LF:
216
59.1k
      *nextTokPtr = ptr;
217
59.1k
      return XML_TOK_DECL_OPEN;
218
329k
    case BT_NMSTRT:
219
342k
    case BT_HEX:
220
342k
      ptr += MINBPC(enc);
221
342k
      break;
222
7
    default:
223
7
      *nextTokPtr = ptr;
224
7
      return XML_TOK_INVALID;
225
402k
    }
226
402k
  }
227
56
  return XML_TOK_PARTIAL;
228
59.1k
}
xmltok.c:normal_scanDecl
Line
Count
Source
183
62.2k
                 const char **nextTokPtr) {
184
62.2k
  REQUIRE_CHAR(enc, ptr, end);
185
62.1k
  switch (BYTE_TYPE(enc, ptr)) {
186
2.98k
  case BT_MINUS:
187
2.98k
    return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
188
6
  case BT_LSQB:
189
6
    *nextTokPtr = ptr + MINBPC(enc);
190
6
    return XML_TOK_COND_SECT_OPEN;
191
687
  case BT_NMSTRT:
192
59.1k
  case BT_HEX:
193
59.1k
    ptr += MINBPC(enc);
194
59.1k
    break;
195
4
  default:
196
4
    *nextTokPtr = ptr;
197
4
    return XML_TOK_INVALID;
198
62.1k
  }
199
402k
  while (HAS_CHAR(enc, ptr, end)) {
200
402k
    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
5
      case BT_PERCNT:
209
5
        *nextTokPtr = ptr;
210
5
        return XML_TOK_INVALID;
211
15
      }
212
      /* fall through */
213
20.0k
    case BT_S:
214
54.8k
    case BT_CR:
215
59.1k
    case BT_LF:
216
59.1k
      *nextTokPtr = ptr;
217
59.1k
      return XML_TOK_DECL_OPEN;
218
329k
    case BT_NMSTRT:
219
342k
    case BT_HEX:
220
342k
      ptr += MINBPC(enc);
221
342k
      break;
222
7
    default:
223
7
      *nextTokPtr = ptr;
224
7
      return XML_TOK_INVALID;
225
402k
    }
226
402k
  }
227
56
  return XML_TOK_PARTIAL;
228
59.1k
}
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
35.4k
                      int *tokPtr) {
233
35.4k
  int upper = 0;
234
35.4k
  UNUSED_P(enc);
235
35.4k
  *tokPtr = XML_TOK_PI;
236
35.4k
  if (end - ptr != MINBPC(enc) * 3)
237
22.5k
    return 1;
238
12.8k
  switch (BYTE_TO_ASCII(enc, ptr)) {
239
6.78k
  case ASCII_x:
240
6.78k
    break;
241
3.50k
  case ASCII_X:
242
3.50k
    upper = 1;
243
3.50k
    break;
244
2.59k
  default:
245
2.59k
    return 1;
246
12.8k
  }
247
10.2k
  ptr += MINBPC(enc);
248
10.2k
  switch (BYTE_TO_ASCII(enc, ptr)) {
249
3.23k
  case ASCII_m:
250
3.23k
    break;
251
697
  case ASCII_M:
252
697
    upper = 1;
253
697
    break;
254
6.35k
  default:
255
6.35k
    return 1;
256
10.2k
  }
257
3.93k
  ptr += MINBPC(enc);
258
3.93k
  switch (BYTE_TO_ASCII(enc, ptr)) {
259
1.12k
  case ASCII_l:
260
1.12k
    break;
261
2
  case ASCII_L:
262
2
    upper = 1;
263
2
    break;
264
2.80k
  default:
265
2.80k
    return 1;
266
3.93k
  }
267
1.12k
  if (upper)
268
5
    return 0;
269
1.12k
  *tokPtr = XML_TOK_XML_DECL;
270
1.12k
  return 1;
271
1.12k
}
xmltok.c:normal_checkPiTarget
Line
Count
Source
232
35.4k
                      int *tokPtr) {
233
35.4k
  int upper = 0;
234
35.4k
  UNUSED_P(enc);
235
35.4k
  *tokPtr = XML_TOK_PI;
236
35.4k
  if (end - ptr != MINBPC(enc) * 3)
237
22.5k
    return 1;
238
12.8k
  switch (BYTE_TO_ASCII(enc, ptr)) {
239
6.78k
  case ASCII_x:
240
6.78k
    break;
241
3.50k
  case ASCII_X:
242
3.50k
    upper = 1;
243
3.50k
    break;
244
2.59k
  default:
245
2.59k
    return 1;
246
12.8k
  }
247
10.2k
  ptr += MINBPC(enc);
248
10.2k
  switch (BYTE_TO_ASCII(enc, ptr)) {
249
3.23k
  case ASCII_m:
250
3.23k
    break;
251
697
  case ASCII_M:
252
697
    upper = 1;
253
697
    break;
254
6.35k
  default:
255
6.35k
    return 1;
256
10.2k
  }
257
3.93k
  ptr += MINBPC(enc);
258
3.93k
  switch (BYTE_TO_ASCII(enc, ptr)) {
259
1.12k
  case ASCII_l:
260
1.12k
    break;
261
2
  case ASCII_L:
262
2
    upper = 1;
263
2
    break;
264
2.80k
  default:
265
2.80k
    return 1;
266
3.93k
  }
267
1.12k
  if (upper)
268
5
    return 0;
269
1.12k
  *tokPtr = XML_TOK_XML_DECL;
270
1.12k
  return 1;
271
1.12k
}
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
35.5k
               const char **nextTokPtr) {
278
35.5k
  int tok;
279
35.5k
  const char *target = ptr;
280
35.5k
  REQUIRE_CHAR(enc, ptr, end);
281
35.5k
  switch (BYTE_TYPE(enc, ptr)) {
282
41.1k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
283
3
  default:
284
3
    *nextTokPtr = ptr;
285
3
    return XML_TOK_INVALID;
286
35.5k
  }
287
1.41M
  while (HAS_CHAR(enc, ptr, end)) {
288
1.41M
    switch (BYTE_TYPE(enc, ptr)) {
289
4.53M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
290
8.31k
    case BT_S:
291
11.6k
    case BT_CR:
292
14.4k
    case BT_LF:
293
14.4k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
294
2
        *nextTokPtr = ptr;
295
2
        return XML_TOK_INVALID;
296
2
      }
297
14.4k
      ptr += MINBPC(enc);
298
10.4M
      while (HAS_CHAR(enc, ptr, end)) {
299
10.4M
        switch (BYTE_TYPE(enc, ptr)) {
300
359k
          INVALID_CASES(ptr, nextTokPtr)
301
59.0k
        case BT_QUEST:
302
59.0k
          ptr += MINBPC(enc);
303
59.0k
          REQUIRE_CHAR(enc, ptr, end);
304
59.0k
          if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
305
14.2k
            *nextTokPtr = ptr + MINBPC(enc);
306
14.2k
            return tok;
307
14.2k
          }
308
44.7k
          break;
309
10.2M
        default:
310
10.2M
          ptr += MINBPC(enc);
311
10.2M
          break;
312
10.4M
        }
313
10.4M
      }
314
96
      return XML_TOK_PARTIAL;
315
21.0k
    case BT_QUEST:
316
21.0k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
317
3
        *nextTokPtr = ptr;
318
3
        return XML_TOK_INVALID;
319
3
      }
320
21.0k
      ptr += MINBPC(enc);
321
21.0k
      REQUIRE_CHAR(enc, ptr, end);
322
20.9k
      if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
323
20.9k
        *nextTokPtr = ptr + MINBPC(enc);
324
20.9k
        return tok;
325
20.9k
      }
326
      /* fall through */
327
21
    default:
328
21
      *nextTokPtr = ptr;
329
21
      return XML_TOK_INVALID;
330
1.41M
    }
331
1.41M
  }
332
42
  return XML_TOK_PARTIAL;
333
35.5k
}
xmltok.c:normal_scanPi
Line
Count
Source
277
35.5k
               const char **nextTokPtr) {
278
35.5k
  int tok;
279
35.5k
  const char *target = ptr;
280
35.5k
  REQUIRE_CHAR(enc, ptr, end);
281
35.5k
  switch (BYTE_TYPE(enc, ptr)) {
282
41.1k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
283
3
  default:
284
3
    *nextTokPtr = ptr;
285
3
    return XML_TOK_INVALID;
286
35.5k
  }
287
1.41M
  while (HAS_CHAR(enc, ptr, end)) {
288
1.41M
    switch (BYTE_TYPE(enc, ptr)) {
289
4.53M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
290
8.31k
    case BT_S:
291
11.6k
    case BT_CR:
292
14.4k
    case BT_LF:
293
14.4k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
294
2
        *nextTokPtr = ptr;
295
2
        return XML_TOK_INVALID;
296
2
      }
297
14.4k
      ptr += MINBPC(enc);
298
10.4M
      while (HAS_CHAR(enc, ptr, end)) {
299
10.4M
        switch (BYTE_TYPE(enc, ptr)) {
300
359k
          INVALID_CASES(ptr, nextTokPtr)
301
59.0k
        case BT_QUEST:
302
59.0k
          ptr += MINBPC(enc);
303
59.0k
          REQUIRE_CHAR(enc, ptr, end);
304
59.0k
          if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
305
14.2k
            *nextTokPtr = ptr + MINBPC(enc);
306
14.2k
            return tok;
307
14.2k
          }
308
44.7k
          break;
309
10.2M
        default:
310
10.2M
          ptr += MINBPC(enc);
311
10.2M
          break;
312
10.4M
        }
313
10.4M
      }
314
96
      return XML_TOK_PARTIAL;
315
21.0k
    case BT_QUEST:
316
21.0k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
317
3
        *nextTokPtr = ptr;
318
3
        return XML_TOK_INVALID;
319
3
      }
320
21.0k
      ptr += MINBPC(enc);
321
21.0k
      REQUIRE_CHAR(enc, ptr, end);
322
20.9k
      if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
323
20.9k
        *nextTokPtr = ptr + MINBPC(enc);
324
20.9k
        return tok;
325
20.9k
      }
326
      /* fall through */
327
21
    default:
328
21
      *nextTokPtr = ptr;
329
21
      return XML_TOK_INVALID;
330
1.41M
    }
331
1.41M
  }
332
42
  return XML_TOK_PARTIAL;
333
35.5k
}
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.55k
                         const char **nextTokPtr) {
338
1.55k
  static const char CDATA_LSQB[]
339
1.55k
      = {ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, ASCII_LSQB};
340
1.55k
  int i;
341
1.55k
  UNUSED_P(enc);
342
  /* CDATA[ */
343
1.55k
  REQUIRE_CHARS(enc, ptr, end, 6);
344
10.6k
  for (i = 0; i < 6; i++, ptr += MINBPC(enc)) {
345
9.18k
    if (! CHAR_MATCHES(enc, ptr, CDATA_LSQB[i])) {
346
38
      *nextTokPtr = ptr;
347
38
      return XML_TOK_INVALID;
348
38
    }
349
9.18k
  }
350
1.50k
  *nextTokPtr = ptr;
351
1.50k
  return XML_TOK_CDATA_SECT_OPEN;
352
1.54k
}
xmltok.c:normal_scanCdataSection
Line
Count
Source
337
1.55k
                         const char **nextTokPtr) {
338
1.55k
  static const char CDATA_LSQB[]
339
1.55k
      = {ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, ASCII_LSQB};
340
1.55k
  int i;
341
1.55k
  UNUSED_P(enc);
342
  /* CDATA[ */
343
1.55k
  REQUIRE_CHARS(enc, ptr, end, 6);
344
10.6k
  for (i = 0; i < 6; i++, ptr += MINBPC(enc)) {
345
9.18k
    if (! CHAR_MATCHES(enc, ptr, CDATA_LSQB[i])) {
346
38
      *nextTokPtr = ptr;
347
38
      return XML_TOK_INVALID;
348
38
    }
349
9.18k
  }
350
1.50k
  *nextTokPtr = ptr;
351
1.50k
  return XML_TOK_CDATA_SECT_OPEN;
352
1.54k
}
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
2.71M
                        const char **nextTokPtr) {
357
2.71M
  if (ptr >= end)
358
126
    return XML_TOK_NONE;
359
2.71M
  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
2.71M
  switch (BYTE_TYPE(enc, ptr)) {
369
275k
  case BT_RSQB:
370
275k
    ptr += MINBPC(enc);
371
275k
    REQUIRE_CHAR(enc, ptr, end);
372
275k
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
373
152k
      break;
374
123k
    ptr += MINBPC(enc);
375
123k
    REQUIRE_CHAR(enc, ptr, end);
376
123k
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
377
121k
      ptr -= MINBPC(enc);
378
121k
      break;
379
121k
    }
380
1.39k
    *nextTokPtr = ptr + MINBPC(enc);
381
1.39k
    return XML_TOK_CDATA_SECT_CLOSE;
382
1.18M
  case BT_CR:
383
1.18M
    ptr += MINBPC(enc);
384
1.18M
    REQUIRE_CHAR(enc, ptr, end);
385
1.18M
    if (BYTE_TYPE(enc, ptr) == BT_LF)
386
185k
      ptr += MINBPC(enc);
387
1.18M
    *nextTokPtr = ptr;
388
1.18M
    return XML_TOK_DATA_NEWLINE;
389
646k
  case BT_LF:
390
646k
    *nextTokPtr = ptr + MINBPC(enc);
391
646k
    return XML_TOK_DATA_NEWLINE;
392
646k
    INVALID_CASES(ptr, nextTokPtr)
393
493k
  default:
394
493k
    ptr += MINBPC(enc);
395
493k
    break;
396
2.71M
  }
397
22.0M
  while (HAS_CHAR(enc, ptr, end)) {
398
22.0M
    switch (BYTE_TYPE(enc, ptr)) {
399
0
#  define LEAD_CASE(n)                                                         \
400
434k
  case BT_LEAD##n:                                                             \
401
434k
    if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) {                       \
402
14
      *nextTokPtr = ptr;                                                       \
403
14
      return XML_TOK_DATA_CHARS;                                               \
404
14
    }                                                                          \
405
434k
    ptr += n;                                                                  \
406
434k
    break;
407
204k
      LEAD_CASE(2)
408
190k
      LEAD_CASE(3)
409
39.8k
      LEAD_CASE(4)
410
0
#  undef LEAD_CASE
411
5
    case BT_NONXML:
412
6
    case BT_MALFORM:
413
11
    case BT_TRAIL:
414
424k
    case BT_CR:
415
644k
    case BT_LF:
416
878k
    case BT_RSQB:
417
878k
      *nextTokPtr = ptr;
418
878k
      return XML_TOK_DATA_CHARS;
419
20.7M
    default:
420
20.7M
      ptr += MINBPC(enc);
421
20.7M
      break;
422
22.0M
    }
423
22.0M
  }
424
41
  *nextTokPtr = ptr;
425
41
  return XML_TOK_DATA_CHARS;
426
878k
}
xmltok.c:normal_cdataSectionTok
Line
Count
Source
356
2.71M
                        const char **nextTokPtr) {
357
2.71M
  if (ptr >= end)
358
126
    return XML_TOK_NONE;
359
2.71M
  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
2.71M
  switch (BYTE_TYPE(enc, ptr)) {
369
275k
  case BT_RSQB:
370
275k
    ptr += MINBPC(enc);
371
275k
    REQUIRE_CHAR(enc, ptr, end);
372
275k
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
373
152k
      break;
374
123k
    ptr += MINBPC(enc);
375
123k
    REQUIRE_CHAR(enc, ptr, end);
376
123k
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
377
121k
      ptr -= MINBPC(enc);
378
121k
      break;
379
121k
    }
380
1.39k
    *nextTokPtr = ptr + MINBPC(enc);
381
1.39k
    return XML_TOK_CDATA_SECT_CLOSE;
382
1.18M
  case BT_CR:
383
1.18M
    ptr += MINBPC(enc);
384
1.18M
    REQUIRE_CHAR(enc, ptr, end);
385
1.18M
    if (BYTE_TYPE(enc, ptr) == BT_LF)
386
185k
      ptr += MINBPC(enc);
387
1.18M
    *nextTokPtr = ptr;
388
1.18M
    return XML_TOK_DATA_NEWLINE;
389
646k
  case BT_LF:
390
646k
    *nextTokPtr = ptr + MINBPC(enc);
391
646k
    return XML_TOK_DATA_NEWLINE;
392
646k
    INVALID_CASES(ptr, nextTokPtr)
393
493k
  default:
394
493k
    ptr += MINBPC(enc);
395
493k
    break;
396
2.71M
  }
397
22.0M
  while (HAS_CHAR(enc, ptr, end)) {
398
22.0M
    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
204k
      LEAD_CASE(2)
408
190k
      LEAD_CASE(3)
409
39.8k
      LEAD_CASE(4)
410
0
#  undef LEAD_CASE
411
5
    case BT_NONXML:
412
6
    case BT_MALFORM:
413
11
    case BT_TRAIL:
414
424k
    case BT_CR:
415
644k
    case BT_LF:
416
878k
    case BT_RSQB:
417
878k
      *nextTokPtr = ptr;
418
878k
      return XML_TOK_DATA_CHARS;
419
20.7M
    default:
420
20.7M
      ptr += MINBPC(enc);
421
20.7M
      break;
422
22.0M
    }
423
22.0M
  }
424
41
  *nextTokPtr = ptr;
425
41
  return XML_TOK_DATA_CHARS;
426
878k
}
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
81.0k
                   const char **nextTokPtr) {
433
81.0k
  REQUIRE_CHAR(enc, ptr, end);
434
81.0k
  switch (BYTE_TYPE(enc, ptr)) {
435
86.3k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
436
6
  default:
437
6
    *nextTokPtr = ptr;
438
6
    return XML_TOK_INVALID;
439
81.0k
  }
440
366k
  while (HAS_CHAR(enc, ptr, end)) {
441
366k
    switch (BYTE_TYPE(enc, ptr)) {
442
897k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
443
358
    case BT_S:
444
736
    case BT_CR:
445
2.28k
    case BT_LF:
446
6.19k
      for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
447
6.19k
        switch (BYTE_TYPE(enc, ptr)) {
448
2.53k
        case BT_S:
449
3.41k
        case BT_CR:
450
3.93k
        case BT_LF:
451
3.93k
          break;
452
2.25k
        case BT_GT:
453
2.25k
          *nextTokPtr = ptr + MINBPC(enc);
454
2.25k
          return XML_TOK_END_TAG;
455
2
        default:
456
2
          *nextTokPtr = ptr;
457
2
          return XML_TOK_INVALID;
458
6.19k
        }
459
6.19k
      }
460
32
      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
78.6k
    case BT_GT:
469
78.6k
      *nextTokPtr = ptr + MINBPC(enc);
470
78.6k
      return XML_TOK_END_TAG;
471
18
    default:
472
18
      *nextTokPtr = ptr;
473
18
      return XML_TOK_INVALID;
474
366k
    }
475
366k
  }
476
76
  return XML_TOK_PARTIAL;
477
81.0k
}
xmltok.c:normal_scanEndTag
Line
Count
Source
432
81.0k
                   const char **nextTokPtr) {
433
81.0k
  REQUIRE_CHAR(enc, ptr, end);
434
81.0k
  switch (BYTE_TYPE(enc, ptr)) {
435
86.3k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
436
6
  default:
437
6
    *nextTokPtr = ptr;
438
6
    return XML_TOK_INVALID;
439
81.0k
  }
440
366k
  while (HAS_CHAR(enc, ptr, end)) {
441
366k
    switch (BYTE_TYPE(enc, ptr)) {
442
897k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
443
358
    case BT_S:
444
736
    case BT_CR:
445
2.28k
    case BT_LF:
446
6.19k
      for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
447
6.19k
        switch (BYTE_TYPE(enc, ptr)) {
448
2.53k
        case BT_S:
449
3.41k
        case BT_CR:
450
3.93k
        case BT_LF:
451
3.93k
          break;
452
2.25k
        case BT_GT:
453
2.25k
          *nextTokPtr = ptr + MINBPC(enc);
454
2.25k
          return XML_TOK_END_TAG;
455
2
        default:
456
2
          *nextTokPtr = ptr;
457
2
          return XML_TOK_INVALID;
458
6.19k
        }
459
6.19k
      }
460
32
      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
78.6k
    case BT_GT:
469
78.6k
      *nextTokPtr = ptr + MINBPC(enc);
470
78.6k
      return XML_TOK_END_TAG;
471
18
    default:
472
18
      *nextTokPtr = ptr;
473
18
      return XML_TOK_INVALID;
474
366k
    }
475
366k
  }
476
76
  return XML_TOK_PARTIAL;
477
81.0k
}
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
197k
                       const char **nextTokPtr) {
484
197k
  if (HAS_CHAR(enc, ptr, end)) {
485
197k
    switch (BYTE_TYPE(enc, ptr)) {
486
72.9k
    case BT_DIGIT:
487
197k
    case BT_HEX:
488
197k
      break;
489
8
    default:
490
8
      *nextTokPtr = ptr;
491
8
      return XML_TOK_INVALID;
492
197k
    }
493
739k
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
494
739k
      switch (BYTE_TYPE(enc, ptr)) {
495
320k
      case BT_DIGIT:
496
541k
      case BT_HEX:
497
541k
        break;
498
197k
      case BT_SEMI:
499
197k
        *nextTokPtr = ptr + MINBPC(enc);
500
197k
        return XML_TOK_CHAR_REF;
501
4
      default:
502
4
        *nextTokPtr = ptr;
503
4
        return XML_TOK_INVALID;
504
739k
      }
505
739k
    }
506
197k
  }
507
11
  return XML_TOK_PARTIAL;
508
197k
}
xmltok.c:normal_scanHexCharRef
Line
Count
Source
483
197k
                       const char **nextTokPtr) {
484
197k
  if (HAS_CHAR(enc, ptr, end)) {
485
197k
    switch (BYTE_TYPE(enc, ptr)) {
486
72.9k
    case BT_DIGIT:
487
197k
    case BT_HEX:
488
197k
      break;
489
8
    default:
490
8
      *nextTokPtr = ptr;
491
8
      return XML_TOK_INVALID;
492
197k
    }
493
739k
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
494
739k
      switch (BYTE_TYPE(enc, ptr)) {
495
320k
      case BT_DIGIT:
496
541k
      case BT_HEX:
497
541k
        break;
498
197k
      case BT_SEMI:
499
197k
        *nextTokPtr = ptr + MINBPC(enc);
500
197k
        return XML_TOK_CHAR_REF;
501
4
      default:
502
4
        *nextTokPtr = ptr;
503
4
        return XML_TOK_INVALID;
504
739k
      }
505
739k
    }
506
197k
  }
507
11
  return XML_TOK_PARTIAL;
508
197k
}
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
210k
                    const char **nextTokPtr) {
515
210k
  if (HAS_CHAR(enc, ptr, end)) {
516
210k
    if (CHAR_MATCHES(enc, ptr, ASCII_x))
517
197k
      return PREFIX(scanHexCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
518
12.9k
    switch (BYTE_TYPE(enc, ptr)) {
519
12.9k
    case BT_DIGIT:
520
12.9k
      break;
521
13
    default:
522
13
      *nextTokPtr = ptr;
523
13
      return XML_TOK_INVALID;
524
12.9k
    }
525
27.3k
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
526
27.3k
      switch (BYTE_TYPE(enc, ptr)) {
527
14.4k
      case BT_DIGIT:
528
14.4k
        break;
529
12.9k
      case BT_SEMI:
530
12.9k
        *nextTokPtr = ptr + MINBPC(enc);
531
12.9k
        return XML_TOK_CHAR_REF;
532
1
      default:
533
1
        *nextTokPtr = ptr;
534
1
        return XML_TOK_INVALID;
535
27.3k
      }
536
27.3k
    }
537
12.9k
  }
538
12
  return XML_TOK_PARTIAL;
539
210k
}
xmltok.c:normal_scanCharRef
Line
Count
Source
514
210k
                    const char **nextTokPtr) {
515
210k
  if (HAS_CHAR(enc, ptr, end)) {
516
210k
    if (CHAR_MATCHES(enc, ptr, ASCII_x))
517
197k
      return PREFIX(scanHexCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
518
12.9k
    switch (BYTE_TYPE(enc, ptr)) {
519
12.9k
    case BT_DIGIT:
520
12.9k
      break;
521
13
    default:
522
13
      *nextTokPtr = ptr;
523
13
      return XML_TOK_INVALID;
524
12.9k
    }
525
27.3k
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
526
27.3k
      switch (BYTE_TYPE(enc, ptr)) {
527
14.4k
      case BT_DIGIT:
528
14.4k
        break;
529
12.9k
      case BT_SEMI:
530
12.9k
        *nextTokPtr = ptr + MINBPC(enc);
531
12.9k
        return XML_TOK_CHAR_REF;
532
1
      default:
533
1
        *nextTokPtr = ptr;
534
1
        return XML_TOK_INVALID;
535
27.3k
      }
536
27.3k
    }
537
12.9k
  }
538
12
  return XML_TOK_PARTIAL;
539
210k
}
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
447k
                const char **nextTokPtr) {
546
447k
  REQUIRE_CHAR(enc, ptr, end);
547
447k
  switch (BYTE_TYPE(enc, ptr)) {
548
165k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
549
210k
  case BT_NUM:
550
210k
    return PREFIX(scanCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
551
5
  default:
552
5
    *nextTokPtr = ptr;
553
5
    return XML_TOK_INVALID;
554
447k
  }
555
1.48M
  while (HAS_CHAR(enc, ptr, end)) {
556
1.48M
    switch (BYTE_TYPE(enc, ptr)) {
557
4.65M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
558
236k
    case BT_SEMI:
559
236k
      *nextTokPtr = ptr + MINBPC(enc);
560
236k
      return XML_TOK_ENTITY_REF;
561
12
    default:
562
12
      *nextTokPtr = ptr;
563
12
      return XML_TOK_INVALID;
564
1.48M
    }
565
1.48M
  }
566
54
  return XML_TOK_PARTIAL;
567
236k
}
xmltok.c:normal_scanRef
Line
Count
Source
545
447k
                const char **nextTokPtr) {
546
447k
  REQUIRE_CHAR(enc, ptr, end);
547
447k
  switch (BYTE_TYPE(enc, ptr)) {
548
165k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
549
210k
  case BT_NUM:
550
210k
    return PREFIX(scanCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
551
5
  default:
552
5
    *nextTokPtr = ptr;
553
5
    return XML_TOK_INVALID;
554
447k
  }
555
1.48M
  while (HAS_CHAR(enc, ptr, end)) {
556
1.48M
    switch (BYTE_TYPE(enc, ptr)) {
557
4.65M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
558
236k
    case BT_SEMI:
559
236k
      *nextTokPtr = ptr + MINBPC(enc);
560
236k
      return XML_TOK_ENTITY_REF;
561
12
    default:
562
12
      *nextTokPtr = ptr;
563
12
      return XML_TOK_INVALID;
564
1.48M
    }
565
1.48M
  }
566
54
  return XML_TOK_PARTIAL;
567
236k
}
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
142k
                 const char **nextTokPtr) {
574
#  ifdef XML_NS
575
  int hadColon = 0;
576
#  endif
577
1.51M
  while (HAS_CHAR(enc, ptr, end)) {
578
1.51M
    switch (BYTE_TYPE(enc, ptr)) {
579
1.25M
      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.90k
    case BT_S:
598
15.4k
    case BT_CR:
599
16.8k
    case BT_LF:
600
38.7k
      for (;;) {
601
38.7k
        int t;
602
603
38.7k
        ptr += MINBPC(enc);
604
38.7k
        REQUIRE_CHAR(enc, ptr, end);
605
38.7k
        t = BYTE_TYPE(enc, ptr);
606
38.7k
        if (t == BT_EQUALS)
607
16.8k
          break;
608
21.9k
        switch (t) {
609
5.12k
        case BT_S:
610
7.62k
        case BT_LF:
611
21.9k
        case BT_CR:
612
21.9k
          break;
613
10
        default:
614
10
          *nextTokPtr = ptr;
615
10
          return XML_TOK_INVALID;
616
21.9k
        }
617
21.9k
      }
618
      /* fall through */
619
1.08M
    case BT_EQUALS: {
620
1.08M
      int open;
621
#  ifdef XML_NS
622
      hadColon = 0;
623
#  endif
624
1.17M
      for (;;) {
625
1.17M
        ptr += MINBPC(enc);
626
1.17M
        REQUIRE_CHAR(enc, ptr, end);
627
1.17M
        open = BYTE_TYPE(enc, ptr);
628
1.17M
        if (open == BT_QUOT || open == BT_APOS)
629
1.08M
          break;
630
84.8k
        switch (open) {
631
24.0k
        case BT_S:
632
45.1k
        case BT_LF:
633
84.8k
        case BT_CR:
634
84.8k
          break;
635
16
        default:
636
16
          *nextTokPtr = ptr;
637
16
          return XML_TOK_INVALID;
638
84.8k
        }
639
84.8k
      }
640
1.08M
      ptr += MINBPC(enc);
641
      /* in attribute value */
642
23.6M
      for (;;) {
643
23.6M
        int t;
644
23.6M
        REQUIRE_CHAR(enc, ptr, end);
645
23.6M
        t = BYTE_TYPE(enc, ptr);
646
23.6M
        if (t == open)
647
1.08M
          break;
648
22.5M
        switch (t) {
649
481k
          INVALID_CASES(ptr, nextTokPtr)
650
125k
        case BT_AMP: {
651
125k
          int tok = PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, &ptr);
652
125k
          if (tok <= 0) {
653
33
            if (tok == XML_TOK_INVALID)
654
17
              *nextTokPtr = ptr;
655
33
            return tok;
656
33
          }
657
125k
          break;
658
125k
        }
659
125k
        case BT_LT:
660
4
          *nextTokPtr = ptr;
661
4
          return XML_TOK_INVALID;
662
22.1M
        default:
663
22.1M
          ptr += MINBPC(enc);
664
22.1M
          break;
665
22.5M
        }
666
22.5M
      }
667
1.08M
      ptr += MINBPC(enc);
668
1.08M
      REQUIRE_CHAR(enc, ptr, end);
669
1.08M
      switch (BYTE_TYPE(enc, ptr)) {
670
590k
      case BT_S:
671
1.02M
      case BT_CR:
672
1.05M
      case BT_LF:
673
1.05M
        break;
674
21.5k
      case BT_SOL:
675
21.5k
        goto sol;
676
5.30k
      case BT_GT:
677
5.30k
        goto gt;
678
5
      default:
679
5
        *nextTokPtr = ptr;
680
5
        return XML_TOK_INVALID;
681
1.08M
      }
682
      /* ptr points to closing quote */
683
1.16M
      for (;;) {
684
1.16M
        ptr += MINBPC(enc);
685
1.16M
        REQUIRE_CHAR(enc, ptr, end);
686
1.16M
        switch (BYTE_TYPE(enc, ptr)) {
687
945k
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
688
75.3k
        case BT_S:
689
91.0k
        case BT_CR:
690
102k
        case BT_LF:
691
102k
          continue;
692
1.21k
        case BT_GT:
693
6.51k
        gt:
694
6.51k
          *nextTokPtr = ptr + MINBPC(enc);
695
6.51k
          return XML_TOK_START_TAG_WITH_ATTS;
696
113k
        case BT_SOL:
697
135k
        sol:
698
135k
          ptr += MINBPC(enc);
699
135k
          REQUIRE_CHAR(enc, ptr, end);
700
135k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
701
12
            *nextTokPtr = ptr;
702
12
            return XML_TOK_INVALID;
703
12
          }
704
135k
          *nextTokPtr = ptr + MINBPC(enc);
705
135k
          return XML_TOK_EMPTY_ELEMENT_WITH_ATTS;
706
2
        default:
707
2
          *nextTokPtr = ptr;
708
2
          return XML_TOK_INVALID;
709
1.16M
        }
710
944k
        break;
711
1.16M
      }
712
944k
      break;
713
1.05M
    }
714
944k
    default:
715
6
      *nextTokPtr = ptr;
716
6
      return XML_TOK_INVALID;
717
1.51M
    }
718
1.51M
  }
719
46
  return XML_TOK_PARTIAL;
720
142k
}
xmltok.c:normal_scanAtts
Line
Count
Source
573
142k
                 const char **nextTokPtr) {
574
#  ifdef XML_NS
575
  int hadColon = 0;
576
#  endif
577
1.51M
  while (HAS_CHAR(enc, ptr, end)) {
578
1.51M
    switch (BYTE_TYPE(enc, ptr)) {
579
1.25M
      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.90k
    case BT_S:
598
15.4k
    case BT_CR:
599
16.8k
    case BT_LF:
600
38.7k
      for (;;) {
601
38.7k
        int t;
602
603
38.7k
        ptr += MINBPC(enc);
604
38.7k
        REQUIRE_CHAR(enc, ptr, end);
605
38.7k
        t = BYTE_TYPE(enc, ptr);
606
38.7k
        if (t == BT_EQUALS)
607
16.8k
          break;
608
21.9k
        switch (t) {
609
5.12k
        case BT_S:
610
7.62k
        case BT_LF:
611
21.9k
        case BT_CR:
612
21.9k
          break;
613
10
        default:
614
10
          *nextTokPtr = ptr;
615
10
          return XML_TOK_INVALID;
616
21.9k
        }
617
21.9k
      }
618
      /* fall through */
619
1.08M
    case BT_EQUALS: {
620
1.08M
      int open;
621
#  ifdef XML_NS
622
      hadColon = 0;
623
#  endif
624
1.17M
      for (;;) {
625
1.17M
        ptr += MINBPC(enc);
626
1.17M
        REQUIRE_CHAR(enc, ptr, end);
627
1.17M
        open = BYTE_TYPE(enc, ptr);
628
1.17M
        if (open == BT_QUOT || open == BT_APOS)
629
1.08M
          break;
630
84.8k
        switch (open) {
631
24.0k
        case BT_S:
632
45.1k
        case BT_LF:
633
84.8k
        case BT_CR:
634
84.8k
          break;
635
16
        default:
636
16
          *nextTokPtr = ptr;
637
16
          return XML_TOK_INVALID;
638
84.8k
        }
639
84.8k
      }
640
1.08M
      ptr += MINBPC(enc);
641
      /* in attribute value */
642
23.6M
      for (;;) {
643
23.6M
        int t;
644
23.6M
        REQUIRE_CHAR(enc, ptr, end);
645
23.6M
        t = BYTE_TYPE(enc, ptr);
646
23.6M
        if (t == open)
647
1.08M
          break;
648
22.5M
        switch (t) {
649
481k
          INVALID_CASES(ptr, nextTokPtr)
650
125k
        case BT_AMP: {
651
125k
          int tok = PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, &ptr);
652
125k
          if (tok <= 0) {
653
33
            if (tok == XML_TOK_INVALID)
654
17
              *nextTokPtr = ptr;
655
33
            return tok;
656
33
          }
657
125k
          break;
658
125k
        }
659
125k
        case BT_LT:
660
4
          *nextTokPtr = ptr;
661
4
          return XML_TOK_INVALID;
662
22.1M
        default:
663
22.1M
          ptr += MINBPC(enc);
664
22.1M
          break;
665
22.5M
        }
666
22.5M
      }
667
1.08M
      ptr += MINBPC(enc);
668
1.08M
      REQUIRE_CHAR(enc, ptr, end);
669
1.08M
      switch (BYTE_TYPE(enc, ptr)) {
670
590k
      case BT_S:
671
1.02M
      case BT_CR:
672
1.05M
      case BT_LF:
673
1.05M
        break;
674
21.5k
      case BT_SOL:
675
21.5k
        goto sol;
676
5.30k
      case BT_GT:
677
5.30k
        goto gt;
678
5
      default:
679
5
        *nextTokPtr = ptr;
680
5
        return XML_TOK_INVALID;
681
1.08M
      }
682
      /* ptr points to closing quote */
683
1.16M
      for (;;) {
684
1.16M
        ptr += MINBPC(enc);
685
1.16M
        REQUIRE_CHAR(enc, ptr, end);
686
1.16M
        switch (BYTE_TYPE(enc, ptr)) {
687
945k
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
688
75.3k
        case BT_S:
689
91.0k
        case BT_CR:
690
102k
        case BT_LF:
691
102k
          continue;
692
1.21k
        case BT_GT:
693
6.51k
        gt:
694
6.51k
          *nextTokPtr = ptr + MINBPC(enc);
695
6.51k
          return XML_TOK_START_TAG_WITH_ATTS;
696
113k
        case BT_SOL:
697
135k
        sol:
698
135k
          ptr += MINBPC(enc);
699
135k
          REQUIRE_CHAR(enc, ptr, end);
700
135k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
701
12
            *nextTokPtr = ptr;
702
12
            return XML_TOK_INVALID;
703
12
          }
704
135k
          *nextTokPtr = ptr + MINBPC(enc);
705
135k
          return XML_TOK_EMPTY_ELEMENT_WITH_ATTS;
706
2
        default:
707
2
          *nextTokPtr = ptr;
708
2
          return XML_TOK_INVALID;
709
1.16M
        }
710
944k
        break;
711
1.16M
      }
712
944k
      break;
713
1.05M
    }
714
944k
    default:
715
6
      *nextTokPtr = ptr;
716
6
      return XML_TOK_INVALID;
717
1.51M
    }
718
1.51M
  }
719
46
  return XML_TOK_PARTIAL;
720
142k
}
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
460k
               const char **nextTokPtr) {
727
#  ifdef XML_NS
728
  int hadColon;
729
#  endif
730
460k
  REQUIRE_CHAR(enc, ptr, end);
731
460k
  switch (BYTE_TYPE(enc, ptr)) {
732
290k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
733
30.5k
  case BT_EXCL:
734
30.5k
    ptr += MINBPC(enc);
735
30.5k
    REQUIRE_CHAR(enc, ptr, end);
736
30.5k
    switch (BYTE_TYPE(enc, ptr)) {
737
29.0k
    case BT_MINUS:
738
29.0k
      return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
739
1.55k
    case BT_LSQB:
740
1.55k
      return PREFIX(scanCdataSection)(enc, ptr + MINBPC(enc), end, nextTokPtr);
741
30.5k
    }
742
2
    *nextTokPtr = ptr;
743
2
    return XML_TOK_INVALID;
744
24.6k
  case BT_QUEST:
745
24.6k
    return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
746
81.0k
  case BT_SOL:
747
81.0k
    return PREFIX(scanEndTag)(enc, ptr + MINBPC(enc), end, nextTokPtr);
748
12
  default:
749
12
    *nextTokPtr = ptr;
750
12
    return XML_TOK_INVALID;
751
460k
  }
752
#  ifdef XML_NS
753
  hadColon = 0;
754
#  endif
755
  /* we have a start-tag */
756
12.6M
  while (HAS_CHAR(enc, ptr, end)) {
757
12.6M
    switch (BYTE_TYPE(enc, ptr)) {
758
48.8M
      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
130k
    case BT_S:
777
139k
    case BT_CR:
778
149k
    case BT_LF: {
779
149k
      ptr += MINBPC(enc);
780
176k
      while (HAS_CHAR(enc, ptr, end)) {
781
176k
        switch (BYTE_TYPE(enc, ptr)) {
782
42.0k
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
783
821
        case BT_GT:
784
821
          goto gt;
785
6.60k
        case BT_SOL:
786
6.60k
          goto sol;
787
2.98k
        case BT_S:
788
25.6k
        case BT_CR:
789
27.1k
        case BT_LF:
790
27.1k
          ptr += MINBPC(enc);
791
27.1k
          continue;
792
8
        default:
793
8
          *nextTokPtr = ptr;
794
8
          return XML_TOK_INVALID;
795
176k
        }
796
142k
        return PREFIX(scanAtts)(enc, ptr, end, nextTokPtr);
797
176k
      }
798
44
      return XML_TOK_PARTIAL;
799
149k
    }
800
139k
    case BT_GT:
801
140k
    gt:
802
140k
      *nextTokPtr = ptr + MINBPC(enc);
803
140k
      return XML_TOK_START_TAG_NO_ATTS;
804
35.1k
    case BT_SOL:
805
41.7k
    sol:
806
41.7k
      ptr += MINBPC(enc);
807
41.7k
      REQUIRE_CHAR(enc, ptr, end);
808
41.7k
      if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
809
10
        *nextTokPtr = ptr;
810
10
        return XML_TOK_INVALID;
811
10
      }
812
41.7k
      *nextTokPtr = ptr + MINBPC(enc);
813
41.7k
      return XML_TOK_EMPTY_ELEMENT_NO_ATTS;
814
13
    default:
815
13
      *nextTokPtr = ptr;
816
13
      return XML_TOK_INVALID;
817
12.6M
    }
818
12.6M
  }
819
78
  return XML_TOK_PARTIAL;
820
324k
}
xmltok.c:normal_scanLt
Line
Count
Source
726
460k
               const char **nextTokPtr) {
727
#  ifdef XML_NS
728
  int hadColon;
729
#  endif
730
460k
  REQUIRE_CHAR(enc, ptr, end);
731
460k
  switch (BYTE_TYPE(enc, ptr)) {
732
290k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
733
30.5k
  case BT_EXCL:
734
30.5k
    ptr += MINBPC(enc);
735
30.5k
    REQUIRE_CHAR(enc, ptr, end);
736
30.5k
    switch (BYTE_TYPE(enc, ptr)) {
737
29.0k
    case BT_MINUS:
738
29.0k
      return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
739
1.55k
    case BT_LSQB:
740
1.55k
      return PREFIX(scanCdataSection)(enc, ptr + MINBPC(enc), end, nextTokPtr);
741
30.5k
    }
742
2
    *nextTokPtr = ptr;
743
2
    return XML_TOK_INVALID;
744
24.6k
  case BT_QUEST:
745
24.6k
    return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
746
81.0k
  case BT_SOL:
747
81.0k
    return PREFIX(scanEndTag)(enc, ptr + MINBPC(enc), end, nextTokPtr);
748
12
  default:
749
12
    *nextTokPtr = ptr;
750
12
    return XML_TOK_INVALID;
751
460k
  }
752
#  ifdef XML_NS
753
  hadColon = 0;
754
#  endif
755
  /* we have a start-tag */
756
12.6M
  while (HAS_CHAR(enc, ptr, end)) {
757
12.6M
    switch (BYTE_TYPE(enc, ptr)) {
758
48.8M
      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
130k
    case BT_S:
777
139k
    case BT_CR:
778
149k
    case BT_LF: {
779
149k
      ptr += MINBPC(enc);
780
176k
      while (HAS_CHAR(enc, ptr, end)) {
781
176k
        switch (BYTE_TYPE(enc, ptr)) {
782
42.0k
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
783
821
        case BT_GT:
784
821
          goto gt;
785
6.60k
        case BT_SOL:
786
6.60k
          goto sol;
787
2.98k
        case BT_S:
788
25.6k
        case BT_CR:
789
27.1k
        case BT_LF:
790
27.1k
          ptr += MINBPC(enc);
791
27.1k
          continue;
792
8
        default:
793
8
          *nextTokPtr = ptr;
794
8
          return XML_TOK_INVALID;
795
176k
        }
796
142k
        return PREFIX(scanAtts)(enc, ptr, end, nextTokPtr);
797
176k
      }
798
44
      return XML_TOK_PARTIAL;
799
149k
    }
800
139k
    case BT_GT:
801
140k
    gt:
802
140k
      *nextTokPtr = ptr + MINBPC(enc);
803
140k
      return XML_TOK_START_TAG_NO_ATTS;
804
35.1k
    case BT_SOL:
805
41.7k
    sol:
806
41.7k
      ptr += MINBPC(enc);
807
41.7k
      REQUIRE_CHAR(enc, ptr, end);
808
41.7k
      if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
809
10
        *nextTokPtr = ptr;
810
10
        return XML_TOK_INVALID;
811
10
      }
812
41.7k
      *nextTokPtr = ptr + MINBPC(enc);
813
41.7k
      return XML_TOK_EMPTY_ELEMENT_NO_ATTS;
814
13
    default:
815
13
      *nextTokPtr = ptr;
816
13
      return XML_TOK_INVALID;
817
12.6M
    }
818
12.6M
  }
819
78
  return XML_TOK_PARTIAL;
820
324k
}
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
3.80M
                   const char **nextTokPtr) {
825
3.80M
  if (ptr >= end)
826
2.68k
    return XML_TOK_NONE;
827
3.80M
  if (MINBPC(enc) > 1) {
828
0
    size_t n = end - ptr;
829
0
    if (n & (MINBPC(enc) - 1)) {
830
0
      n &= ~(MINBPC(enc) - 1);
831
0
      if (n == 0)
832
0
        return XML_TOK_PARTIAL;
833
0
      end = ptr + n;
834
0
    }
835
0
  }
836
3.80M
  switch (BYTE_TYPE(enc, ptr)) {
837
460k
  case BT_LT:
838
460k
    return PREFIX(scanLt)(enc, ptr + MINBPC(enc), end, nextTokPtr);
839
60.8k
  case BT_AMP:
840
60.8k
    return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
841
1.51M
  case BT_CR:
842
1.51M
    ptr += MINBPC(enc);
843
1.51M
    if (! HAS_CHAR(enc, ptr, end))
844
12
      return XML_TOK_TRAILING_CR;
845
1.51M
    if (BYTE_TYPE(enc, ptr) == BT_LF)
846
293k
      ptr += MINBPC(enc);
847
1.51M
    *nextTokPtr = ptr;
848
1.51M
    return XML_TOK_DATA_NEWLINE;
849
1.05M
  case BT_LF:
850
1.05M
    *nextTokPtr = ptr + MINBPC(enc);
851
1.05M
    return XML_TOK_DATA_NEWLINE;
852
69.5k
  case BT_RSQB:
853
69.5k
    ptr += MINBPC(enc);
854
69.5k
    if (! HAS_CHAR(enc, ptr, end))
855
6
      return XML_TOK_TRAILING_RSQB;
856
69.5k
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
857
44.9k
      break;
858
24.5k
    ptr += MINBPC(enc);
859
24.5k
    if (! HAS_CHAR(enc, ptr, end))
860
2
      return XML_TOK_TRAILING_RSQB;
861
24.5k
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
862
24.5k
      ptr -= MINBPC(enc);
863
24.5k
      break;
864
24.5k
    }
865
1
    *nextTokPtr = ptr;
866
1
    return XML_TOK_INVALID;
867
106k
    INVALID_CASES(ptr, nextTokPtr)
868
590k
  default:
869
590k
    ptr += MINBPC(enc);
870
590k
    break;
871
3.80M
  }
872
19.6M
  while (HAS_CHAR(enc, ptr, end)) {
873
19.6M
    switch (BYTE_TYPE(enc, ptr)) {
874
0
#  define LEAD_CASE(n)                                                         \
875
252k
  case BT_LEAD##n:                                                             \
876
252k
    if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) {                       \
877
23
      *nextTokPtr = ptr;                                                       \
878
23
      return XML_TOK_DATA_CHARS;                                               \
879
23
    }                                                                          \
880
252k
    ptr += n;                                                                  \
881
252k
    break;
882
146k
      LEAD_CASE(2)
883
63.6k
      LEAD_CASE(3)
884
42.8k
      LEAD_CASE(4)
885
0
#  undef LEAD_CASE
886
353k
    case BT_RSQB:
887
353k
      if (HAS_CHARS(enc, ptr, end, 2)) {
888
353k
        if (! CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_RSQB)) {
889
136k
          ptr += MINBPC(enc);
890
136k
          break;
891
136k
        }
892
217k
        if (HAS_CHARS(enc, ptr, end, 3)) {
893
217k
          if (! CHAR_MATCHES(enc, ptr + 2 * MINBPC(enc), ASCII_GT)) {
894
217k
            ptr += MINBPC(enc);
895
217k
            break;
896
217k
          }
897
3
          *nextTokPtr = ptr + 2 * MINBPC(enc);
898
3
          return XML_TOK_INVALID;
899
217k
        }
900
217k
      }
901
      /* fall through */
902
42.2k
    case BT_AMP:
903
156k
    case BT_LT:
904
156k
    case BT_NONXML:
905
156k
    case BT_MALFORM:
906
156k
    case BT_TRAIL:
907
529k
    case BT_CR:
908
711k
    case BT_LF:
909
711k
      *nextTokPtr = ptr;
910
711k
      return XML_TOK_DATA_CHARS;
911
18.3M
    default:
912
18.3M
      ptr += MINBPC(enc);
913
18.3M
      break;
914
19.6M
    }
915
19.6M
  }
916
1.40k
  *nextTokPtr = ptr;
917
1.40k
  return XML_TOK_DATA_CHARS;
918
712k
}
xmltok.c:normal_contentTok
Line
Count
Source
824
3.80M
                   const char **nextTokPtr) {
825
3.80M
  if (ptr >= end)
826
2.68k
    return XML_TOK_NONE;
827
3.80M
  if (MINBPC(enc) > 1) {
828
0
    size_t n = end - ptr;
829
0
    if (n & (MINBPC(enc) - 1)) {
830
0
      n &= ~(MINBPC(enc) - 1);
831
0
      if (n == 0)
832
0
        return XML_TOK_PARTIAL;
833
0
      end = ptr + n;
834
0
    }
835
0
  }
836
3.80M
  switch (BYTE_TYPE(enc, ptr)) {
837
460k
  case BT_LT:
838
460k
    return PREFIX(scanLt)(enc, ptr + MINBPC(enc), end, nextTokPtr);
839
60.8k
  case BT_AMP:
840
60.8k
    return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
841
1.51M
  case BT_CR:
842
1.51M
    ptr += MINBPC(enc);
843
1.51M
    if (! HAS_CHAR(enc, ptr, end))
844
12
      return XML_TOK_TRAILING_CR;
845
1.51M
    if (BYTE_TYPE(enc, ptr) == BT_LF)
846
293k
      ptr += MINBPC(enc);
847
1.51M
    *nextTokPtr = ptr;
848
1.51M
    return XML_TOK_DATA_NEWLINE;
849
1.05M
  case BT_LF:
850
1.05M
    *nextTokPtr = ptr + MINBPC(enc);
851
1.05M
    return XML_TOK_DATA_NEWLINE;
852
69.5k
  case BT_RSQB:
853
69.5k
    ptr += MINBPC(enc);
854
69.5k
    if (! HAS_CHAR(enc, ptr, end))
855
6
      return XML_TOK_TRAILING_RSQB;
856
69.5k
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
857
44.9k
      break;
858
24.5k
    ptr += MINBPC(enc);
859
24.5k
    if (! HAS_CHAR(enc, ptr, end))
860
2
      return XML_TOK_TRAILING_RSQB;
861
24.5k
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
862
24.5k
      ptr -= MINBPC(enc);
863
24.5k
      break;
864
24.5k
    }
865
1
    *nextTokPtr = ptr;
866
1
    return XML_TOK_INVALID;
867
106k
    INVALID_CASES(ptr, nextTokPtr)
868
590k
  default:
869
590k
    ptr += MINBPC(enc);
870
590k
    break;
871
3.80M
  }
872
19.6M
  while (HAS_CHAR(enc, ptr, end)) {
873
19.6M
    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
146k
      LEAD_CASE(2)
883
63.6k
      LEAD_CASE(3)
884
42.8k
      LEAD_CASE(4)
885
0
#  undef LEAD_CASE
886
353k
    case BT_RSQB:
887
353k
      if (HAS_CHARS(enc, ptr, end, 2)) {
888
353k
        if (! CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_RSQB)) {
889
136k
          ptr += MINBPC(enc);
890
136k
          break;
891
136k
        }
892
217k
        if (HAS_CHARS(enc, ptr, end, 3)) {
893
217k
          if (! CHAR_MATCHES(enc, ptr + 2 * MINBPC(enc), ASCII_GT)) {
894
217k
            ptr += MINBPC(enc);
895
217k
            break;
896
217k
          }
897
3
          *nextTokPtr = ptr + 2 * MINBPC(enc);
898
3
          return XML_TOK_INVALID;
899
217k
        }
900
217k
      }
901
      /* fall through */
902
42.2k
    case BT_AMP:
903
156k
    case BT_LT:
904
156k
    case BT_NONXML:
905
156k
    case BT_MALFORM:
906
156k
    case BT_TRAIL:
907
529k
    case BT_CR:
908
711k
    case BT_LF:
909
711k
      *nextTokPtr = ptr;
910
711k
      return XML_TOK_DATA_CHARS;
911
18.3M
    default:
912
18.3M
      ptr += MINBPC(enc);
913
18.3M
      break;
914
19.6M
    }
915
19.6M
  }
916
1.40k
  *nextTokPtr = ptr;
917
1.40k
  return XML_TOK_DATA_CHARS;
918
712k
}
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
51.7k
                    const char **nextTokPtr) {
925
51.7k
  REQUIRE_CHAR(enc, ptr, end);
926
51.7k
  switch (BYTE_TYPE(enc, ptr)) {
927
65.4k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
928
1.55k
  case BT_S:
929
2.05k
  case BT_LF:
930
2.63k
  case BT_CR:
931
2.64k
  case BT_PERCNT:
932
2.64k
    *nextTokPtr = ptr;
933
2.64k
    return XML_TOK_PERCENT;
934
2
  default:
935
2
    *nextTokPtr = ptr;
936
2
    return XML_TOK_INVALID;
937
51.7k
  }
938
2.30M
  while (HAS_CHAR(enc, ptr, end)) {
939
2.30M
    switch (BYTE_TYPE(enc, ptr)) {
940
8.13M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
941
48.9k
    case BT_SEMI:
942
48.9k
      *nextTokPtr = ptr + MINBPC(enc);
943
48.9k
      return XML_TOK_PARAM_ENTITY_REF;
944
16
    default:
945
16
      *nextTokPtr = ptr;
946
16
      return XML_TOK_INVALID;
947
2.30M
    }
948
2.30M
  }
949
52
  return XML_TOK_PARTIAL;
950
49.0k
}
xmltok.c:normal_scanPercent
Line
Count
Source
924
51.7k
                    const char **nextTokPtr) {
925
51.7k
  REQUIRE_CHAR(enc, ptr, end);
926
51.7k
  switch (BYTE_TYPE(enc, ptr)) {
927
65.4k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
928
1.55k
  case BT_S:
929
2.05k
  case BT_LF:
930
2.63k
  case BT_CR:
931
2.64k
  case BT_PERCNT:
932
2.64k
    *nextTokPtr = ptr;
933
2.64k
    return XML_TOK_PERCENT;
934
2
  default:
935
2
    *nextTokPtr = ptr;
936
2
    return XML_TOK_INVALID;
937
51.7k
  }
938
2.30M
  while (HAS_CHAR(enc, ptr, end)) {
939
2.30M
    switch (BYTE_TYPE(enc, ptr)) {
940
8.13M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
941
48.9k
    case BT_SEMI:
942
48.9k
      *nextTokPtr = ptr + MINBPC(enc);
943
48.9k
      return XML_TOK_PARAM_ENTITY_REF;
944
16
    default:
945
16
      *nextTokPtr = ptr;
946
16
      return XML_TOK_INVALID;
947
2.30M
    }
948
2.30M
  }
949
52
  return XML_TOK_PARTIAL;
950
49.0k
}
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
48.3k
                      const char **nextTokPtr) {
955
48.3k
  REQUIRE_CHAR(enc, ptr, end);
956
48.3k
  switch (BYTE_TYPE(enc, ptr)) {
957
48.1k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
958
1
  default:
959
1
    *nextTokPtr = ptr;
960
1
    return XML_TOK_INVALID;
961
48.3k
  }
962
811k
  while (HAS_CHAR(enc, ptr, end)) {
963
811k
    switch (BYTE_TYPE(enc, ptr)) {
964
2.59M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
965
41.5k
    case BT_CR:
966
43.6k
    case BT_LF:
967
44.0k
    case BT_S:
968
44.2k
    case BT_RPAR:
969
47.8k
    case BT_GT:
970
47.8k
    case BT_PERCNT:
971
48.0k
    case BT_VERBAR:
972
48.0k
      *nextTokPtr = ptr;
973
48.0k
      return XML_TOK_POUND_NAME;
974
17
    default:
975
17
      *nextTokPtr = ptr;
976
17
      return XML_TOK_INVALID;
977
811k
    }
978
811k
  }
979
172
  return -XML_TOK_POUND_NAME;
980
48.3k
}
xmltok.c:normal_scanPoundName
Line
Count
Source
954
48.3k
                      const char **nextTokPtr) {
955
48.3k
  REQUIRE_CHAR(enc, ptr, end);
956
48.3k
  switch (BYTE_TYPE(enc, ptr)) {
957
48.1k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
958
1
  default:
959
1
    *nextTokPtr = ptr;
960
1
    return XML_TOK_INVALID;
961
48.3k
  }
962
811k
  while (HAS_CHAR(enc, ptr, end)) {
963
811k
    switch (BYTE_TYPE(enc, ptr)) {
964
2.59M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
965
41.5k
    case BT_CR:
966
43.6k
    case BT_LF:
967
44.0k
    case BT_S:
968
44.2k
    case BT_RPAR:
969
47.8k
    case BT_GT:
970
47.8k
    case BT_PERCNT:
971
48.0k
    case BT_VERBAR:
972
48.0k
      *nextTokPtr = ptr;
973
48.0k
      return XML_TOK_POUND_NAME;
974
17
    default:
975
17
      *nextTokPtr = ptr;
976
17
      return XML_TOK_INVALID;
977
811k
    }
978
811k
  }
979
172
  return -XML_TOK_POUND_NAME;
980
48.3k
}
Unexecuted instantiation: xmltok.c:little2_scanPoundName
Unexecuted instantiation: xmltok.c:big2_scanPoundName
981
982
static int PTRCALL
983
PREFIX(scanLit)(int open, const ENCODING *enc, const char *ptr, const char *end,
984
39.0k
                const char **nextTokPtr) {
985
7.15M
  while (HAS_CHAR(enc, ptr, end)) {
986
7.15M
    int t = BYTE_TYPE(enc, ptr);
987
7.15M
    switch (t) {
988
193k
      INVALID_CASES(ptr, nextTokPtr)
989
10.5k
    case BT_QUOT:
990
43.6k
    case BT_APOS:
991
43.6k
      ptr += MINBPC(enc);
992
43.6k
      if (t != open)
993
4.68k
        break;
994
38.9k
      if (! HAS_CHAR(enc, ptr, end))
995
461
        return -XML_TOK_LITERAL;
996
38.4k
      *nextTokPtr = ptr;
997
38.4k
      switch (BYTE_TYPE(enc, ptr)) {
998
6.98k
      case BT_S:
999
10.5k
      case BT_CR:
1000
19.4k
      case BT_LF:
1001
38.1k
      case BT_GT:
1002
38.1k
      case BT_PERCNT:
1003
38.4k
      case BT_LSQB:
1004
38.4k
        return XML_TOK_LITERAL;
1005
14
      default:
1006
14
        return XML_TOK_INVALID;
1007
38.4k
      }
1008
7.01M
    default:
1009
7.01M
      ptr += MINBPC(enc);
1010
7.01M
      break;
1011
7.15M
    }
1012
7.15M
  }
1013
86
  return XML_TOK_PARTIAL;
1014
39.0k
}
xmltok.c:normal_scanLit
Line
Count
Source
984
39.0k
                const char **nextTokPtr) {
985
7.15M
  while (HAS_CHAR(enc, ptr, end)) {
986
7.15M
    int t = BYTE_TYPE(enc, ptr);
987
7.15M
    switch (t) {
988
193k
      INVALID_CASES(ptr, nextTokPtr)
989
10.5k
    case BT_QUOT:
990
43.6k
    case BT_APOS:
991
43.6k
      ptr += MINBPC(enc);
992
43.6k
      if (t != open)
993
4.68k
        break;
994
38.9k
      if (! HAS_CHAR(enc, ptr, end))
995
461
        return -XML_TOK_LITERAL;
996
38.4k
      *nextTokPtr = ptr;
997
38.4k
      switch (BYTE_TYPE(enc, ptr)) {
998
6.98k
      case BT_S:
999
10.5k
      case BT_CR:
1000
19.4k
      case BT_LF:
1001
38.1k
      case BT_GT:
1002
38.1k
      case BT_PERCNT:
1003
38.4k
      case BT_LSQB:
1004
38.4k
        return XML_TOK_LITERAL;
1005
14
      default:
1006
14
        return XML_TOK_INVALID;
1007
38.4k
      }
1008
7.01M
    default:
1009
7.01M
      ptr += MINBPC(enc);
1010
7.01M
      break;
1011
7.15M
    }
1012
7.15M
  }
1013
86
  return XML_TOK_PARTIAL;
1014
39.0k
}
Unexecuted instantiation: xmltok.c:little2_scanLit
Unexecuted instantiation: xmltok.c:big2_scanLit
1015
1016
static int PTRCALL
1017
PREFIX(prologTok)(const ENCODING *enc, const char *ptr, const char *end,
1018
3.55M
                  const char **nextTokPtr) {
1019
3.55M
  int tok;
1020
3.55M
  if (ptr >= end)
1021
8.35k
    return XML_TOK_NONE;
1022
3.54M
  if (MINBPC(enc) > 1) {
1023
198
    size_t n = end - ptr;
1024
198
    if (n & (MINBPC(enc) - 1)) {
1025
48
      n &= ~(MINBPC(enc) - 1);
1026
48
      if (n == 0)
1027
4
        return XML_TOK_PARTIAL;
1028
44
      end = ptr + n;
1029
44
    }
1030
198
  }
1031
3.54M
  switch (BYTE_TYPE(enc, ptr)) {
1032
7.29k
  case BT_QUOT:
1033
7.29k
    return PREFIX(scanLit)(BT_QUOT, enc, ptr + MINBPC(enc), end, nextTokPtr);
1034
31.7k
  case BT_APOS:
1035
31.7k
    return PREFIX(scanLit)(BT_APOS, enc, ptr + MINBPC(enc), end, nextTokPtr);
1036
78.6k
  case BT_LT: {
1037
78.6k
    ptr += MINBPC(enc);
1038
78.6k
    REQUIRE_CHAR(enc, ptr, end);
1039
78.6k
    switch (BYTE_TYPE(enc, ptr)) {
1040
62.2k
    case BT_EXCL:
1041
62.2k
      return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1042
10.9k
    case BT_QUEST:
1043
10.9k
      return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1044
4.25k
    case BT_NMSTRT:
1045
5.38k
    case BT_HEX:
1046
5.38k
    case BT_NONASCII:
1047
5.41k
    case BT_LEAD2:
1048
5.45k
    case BT_LEAD3:
1049
5.46k
    case BT_LEAD4:
1050
5.46k
      *nextTokPtr = ptr - MINBPC(enc);
1051
5.46k
      return XML_TOK_INSTANCE_START;
1052
78.6k
    }
1053
20
    *nextTokPtr = ptr;
1054
20
    return XML_TOK_INVALID;
1055
78.6k
  }
1056
160k
  case BT_CR:
1057
160k
    if (ptr + MINBPC(enc) == end) {
1058
339
      *nextTokPtr = end;
1059
      /* indicate that this might be part of a CR/LF pair */
1060
339
      return -XML_TOK_PROLOG_S;
1061
339
    }
1062
    /* fall through */
1063
273k
  case BT_S:
1064
326k
  case BT_LF:
1065
397k
    for (;;) {
1066
397k
      ptr += MINBPC(enc);
1067
397k
      if (! HAS_CHAR(enc, ptr, end))
1068
209
        break;
1069
397k
      switch (BYTE_TYPE(enc, ptr)) {
1070
8.54k
      case BT_S:
1071
15.3k
      case BT_LF:
1072
15.3k
        break;
1073
56.3k
      case BT_CR:
1074
        /* don't split CR/LF pair */
1075
56.3k
        if (ptr + MINBPC(enc) != end)
1076
56.2k
          break;
1077
        /* fall through */
1078
326k
      default:
1079
326k
        *nextTokPtr = ptr;
1080
326k
        return XML_TOK_PROLOG_S;
1081
397k
      }
1082
397k
    }
1083
209
    *nextTokPtr = ptr;
1084
209
    return XML_TOK_PROLOG_S;
1085
51.7k
  case BT_PERCNT:
1086
51.7k
    return PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1087
5.06k
  case BT_COMMA:
1088
5.06k
    *nextTokPtr = ptr + MINBPC(enc);
1089
5.06k
    return XML_TOK_COMMA;
1090
2.47k
  case BT_LSQB:
1091
2.47k
    *nextTokPtr = ptr + MINBPC(enc);
1092
2.47k
    return XML_TOK_OPEN_BRACKET;
1093
1.30k
  case BT_RSQB:
1094
1.30k
    ptr += MINBPC(enc);
1095
1.30k
    if (! HAS_CHAR(enc, ptr, end))
1096
3
      return -XML_TOK_CLOSE_BRACKET;
1097
1.30k
    if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) {
1098
18
      REQUIRE_CHARS(enc, ptr, end, 2);
1099
16
      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
16
    }
1104
1.29k
    *nextTokPtr = ptr;
1105
1.29k
    return XML_TOK_CLOSE_BRACKET;
1106
2.61M
  case BT_LPAR:
1107
2.61M
    *nextTokPtr = ptr + MINBPC(enc);
1108
2.61M
    return XML_TOK_OPEN_PAREN;
1109
70.7k
  case BT_RPAR:
1110
70.7k
    ptr += MINBPC(enc);
1111
70.7k
    if (! HAS_CHAR(enc, ptr, end))
1112
77
      return -XML_TOK_CLOSE_PAREN;
1113
70.6k
    switch (BYTE_TYPE(enc, ptr)) {
1114
4.14k
    case BT_AST:
1115
4.14k
      *nextTokPtr = ptr + MINBPC(enc);
1116
4.14k
      return XML_TOK_CLOSE_PAREN_ASTERISK;
1117
2.70k
    case BT_QUEST:
1118
2.70k
      *nextTokPtr = ptr + MINBPC(enc);
1119
2.70k
      return XML_TOK_CLOSE_PAREN_QUESTION;
1120
4.20k
    case BT_PLUS:
1121
4.20k
      *nextTokPtr = ptr + MINBPC(enc);
1122
4.20k
      return XML_TOK_CLOSE_PAREN_PLUS;
1123
2.21k
    case BT_CR:
1124
2.60k
    case BT_LF:
1125
43.9k
    case BT_S:
1126
45.5k
    case BT_GT:
1127
47.8k
    case BT_COMMA:
1128
52.8k
    case BT_VERBAR:
1129
59.6k
    case BT_RPAR:
1130
59.6k
      *nextTokPtr = ptr;
1131
59.6k
      return XML_TOK_CLOSE_PAREN;
1132
70.6k
    }
1133
15
    *nextTokPtr = ptr;
1134
15
    return XML_TOK_INVALID;
1135
18.1k
  case BT_VERBAR:
1136
18.1k
    *nextTokPtr = ptr + MINBPC(enc);
1137
18.1k
    return XML_TOK_OR;
1138
56.7k
  case BT_GT:
1139
56.7k
    *nextTokPtr = ptr + MINBPC(enc);
1140
56.7k
    return XML_TOK_DECL_CLOSE;
1141
48.3k
  case BT_NUM:
1142
48.3k
    return PREFIX(scanPoundName)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1143
0
#  define LEAD_CASE(n)                                                         \
1144
7.71k
  case BT_LEAD##n:                                                             \
1145
7.71k
    if (end - ptr < n)                                                         \
1146
58
      return XML_TOK_PARTIAL_CHAR;                                             \
1147
7.65k
    if (IS_INVALID_CHAR(enc, ptr, n)) {                                        \
1148
68
      *nextTokPtr = ptr;                                                       \
1149
68
      return XML_TOK_INVALID;                                                  \
1150
68
    }                                                                          \
1151
7.65k
    if (IS_NMSTRT_CHAR(enc, ptr, n)) {                                         \
1152
6.25k
      ptr += n;                                                                \
1153
6.25k
      tok = XML_TOK_NAME;                                                      \
1154
6.25k
      break;                                                                   \
1155
6.25k
    }                                                                          \
1156
7.58k
    if (IS_NAME_CHAR(enc, ptr, n)) {                                           \
1157
1.28k
      ptr += n;                                                                \
1158
1.28k
      tok = XML_TOK_NMTOKEN;                                                   \
1159
1.28k
      break;                                                                   \
1160
1.28k
    }                                                                          \
1161
1.33k
    *nextTokPtr = ptr;                                                         \
1162
52
    return XML_TOK_INVALID;
1163
7.25k
    LEAD_CASE(2)
1164
16.8k
    LEAD_CASE(3)
1165
206
    LEAD_CASE(4)
1166
0
#  undef LEAD_CASE
1167
128k
  case BT_NMSTRT:
1168
216k
  case BT_HEX:
1169
216k
    tok = XML_TOK_NAME;
1170
216k
    ptr += MINBPC(enc);
1171
216k
    break;
1172
2.78k
  case BT_DIGIT:
1173
3.02k
  case BT_NAME:
1174
3.47k
  case BT_MINUS:
1175
#  ifdef XML_NS
1176
  case BT_COLON:
1177
#  endif
1178
3.47k
    tok = XML_TOK_NMTOKEN;
1179
3.47k
    ptr += MINBPC(enc);
1180
3.47k
    break;
1181
147
  case BT_NONASCII:
1182
147
    if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {
1183
117
      ptr += MINBPC(enc);
1184
117
      tok = XML_TOK_NAME;
1185
117
      break;
1186
117
    }
1187
30
    if (IS_NAME_CHAR_MINBPC(enc, ptr)) {
1188
10
      ptr += MINBPC(enc);
1189
10
      tok = XML_TOK_NMTOKEN;
1190
10
      break;
1191
10
    }
1192
    /* fall through */
1193
78
  default:
1194
78
    *nextTokPtr = ptr;
1195
78
    return XML_TOK_INVALID;
1196
3.54M
  }
1197
13.2M
  while (HAS_CHAR(enc, ptr, end)) {
1198
13.2M
    switch (BYTE_TYPE(enc, ptr)) {
1199
36.8M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1200
28.3k
    case BT_GT:
1201
81.2k
    case BT_RPAR:
1202
81.6k
    case BT_COMMA:
1203
89.0k
    case BT_VERBAR:
1204
91.1k
    case BT_LSQB:
1205
91.1k
    case BT_PERCNT:
1206
130k
    case BT_S:
1207
202k
    case BT_CR:
1208
223k
    case BT_LF:
1209
223k
      *nextTokPtr = ptr;
1210
223k
      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
1.76k
    case BT_PLUS:
1232
1.76k
      if (tok == XML_TOK_NMTOKEN) {
1233
1
        *nextTokPtr = ptr;
1234
1
        return XML_TOK_INVALID;
1235
1
      }
1236
1.76k
      *nextTokPtr = ptr + MINBPC(enc);
1237
1.76k
      return XML_TOK_NAME_PLUS;
1238
1.66k
    case BT_AST:
1239
1.66k
      if (tok == XML_TOK_NMTOKEN) {
1240
1
        *nextTokPtr = ptr;
1241
1
        return XML_TOK_INVALID;
1242
1
      }
1243
1.66k
      *nextTokPtr = ptr + MINBPC(enc);
1244
1.66k
      return XML_TOK_NAME_ASTERISK;
1245
493
    case BT_QUEST:
1246
493
      if (tok == XML_TOK_NMTOKEN) {
1247
1
        *nextTokPtr = ptr;
1248
1
        return XML_TOK_INVALID;
1249
1
      }
1250
492
      *nextTokPtr = ptr + MINBPC(enc);
1251
492
      return XML_TOK_NAME_QUESTION;
1252
64
    default:
1253
64
      *nextTokPtr = ptr;
1254
64
      return XML_TOK_INVALID;
1255
13.2M
    }
1256
13.2M
  }
1257
534
  return -tok;
1258
227k
}
xmltok.c:normal_prologTok
Line
Count
Source
1018
3.55M
                  const char **nextTokPtr) {
1019
3.55M
  int tok;
1020
3.55M
  if (ptr >= end)
1021
8.35k
    return XML_TOK_NONE;
1022
3.54M
  if (MINBPC(enc) > 1) {
1023
0
    size_t n = end - ptr;
1024
0
    if (n & (MINBPC(enc) - 1)) {
1025
0
      n &= ~(MINBPC(enc) - 1);
1026
0
      if (n == 0)
1027
0
        return XML_TOK_PARTIAL;
1028
0
      end = ptr + n;
1029
0
    }
1030
0
  }
1031
3.54M
  switch (BYTE_TYPE(enc, ptr)) {
1032
7.29k
  case BT_QUOT:
1033
7.29k
    return PREFIX(scanLit)(BT_QUOT, enc, ptr + MINBPC(enc), end, nextTokPtr);
1034
31.7k
  case BT_APOS:
1035
31.7k
    return PREFIX(scanLit)(BT_APOS, enc, ptr + MINBPC(enc), end, nextTokPtr);
1036
78.6k
  case BT_LT: {
1037
78.6k
    ptr += MINBPC(enc);
1038
78.6k
    REQUIRE_CHAR(enc, ptr, end);
1039
78.6k
    switch (BYTE_TYPE(enc, ptr)) {
1040
62.2k
    case BT_EXCL:
1041
62.2k
      return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1042
10.9k
    case BT_QUEST:
1043
10.9k
      return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1044
4.25k
    case BT_NMSTRT:
1045
5.38k
    case BT_HEX:
1046
5.38k
    case BT_NONASCII:
1047
5.41k
    case BT_LEAD2:
1048
5.45k
    case BT_LEAD3:
1049
5.46k
    case BT_LEAD4:
1050
5.46k
      *nextTokPtr = ptr - MINBPC(enc);
1051
5.46k
      return XML_TOK_INSTANCE_START;
1052
78.6k
    }
1053
20
    *nextTokPtr = ptr;
1054
20
    return XML_TOK_INVALID;
1055
78.6k
  }
1056
160k
  case BT_CR:
1057
160k
    if (ptr + MINBPC(enc) == end) {
1058
339
      *nextTokPtr = end;
1059
      /* indicate that this might be part of a CR/LF pair */
1060
339
      return -XML_TOK_PROLOG_S;
1061
339
    }
1062
    /* fall through */
1063
273k
  case BT_S:
1064
326k
  case BT_LF:
1065
397k
    for (;;) {
1066
397k
      ptr += MINBPC(enc);
1067
397k
      if (! HAS_CHAR(enc, ptr, end))
1068
209
        break;
1069
397k
      switch (BYTE_TYPE(enc, ptr)) {
1070
8.54k
      case BT_S:
1071
15.3k
      case BT_LF:
1072
15.3k
        break;
1073
56.3k
      case BT_CR:
1074
        /* don't split CR/LF pair */
1075
56.3k
        if (ptr + MINBPC(enc) != end)
1076
56.2k
          break;
1077
        /* fall through */
1078
326k
      default:
1079
326k
        *nextTokPtr = ptr;
1080
326k
        return XML_TOK_PROLOG_S;
1081
397k
      }
1082
397k
    }
1083
209
    *nextTokPtr = ptr;
1084
209
    return XML_TOK_PROLOG_S;
1085
51.7k
  case BT_PERCNT:
1086
51.7k
    return PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1087
5.06k
  case BT_COMMA:
1088
5.06k
    *nextTokPtr = ptr + MINBPC(enc);
1089
5.06k
    return XML_TOK_COMMA;
1090
2.47k
  case BT_LSQB:
1091
2.47k
    *nextTokPtr = ptr + MINBPC(enc);
1092
2.47k
    return XML_TOK_OPEN_BRACKET;
1093
1.30k
  case BT_RSQB:
1094
1.30k
    ptr += MINBPC(enc);
1095
1.30k
    if (! HAS_CHAR(enc, ptr, end))
1096
3
      return -XML_TOK_CLOSE_BRACKET;
1097
1.30k
    if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) {
1098
18
      REQUIRE_CHARS(enc, ptr, end, 2);
1099
16
      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
16
    }
1104
1.29k
    *nextTokPtr = ptr;
1105
1.29k
    return XML_TOK_CLOSE_BRACKET;
1106
2.61M
  case BT_LPAR:
1107
2.61M
    *nextTokPtr = ptr + MINBPC(enc);
1108
2.61M
    return XML_TOK_OPEN_PAREN;
1109
70.7k
  case BT_RPAR:
1110
70.7k
    ptr += MINBPC(enc);
1111
70.7k
    if (! HAS_CHAR(enc, ptr, end))
1112
77
      return -XML_TOK_CLOSE_PAREN;
1113
70.6k
    switch (BYTE_TYPE(enc, ptr)) {
1114
4.14k
    case BT_AST:
1115
4.14k
      *nextTokPtr = ptr + MINBPC(enc);
1116
4.14k
      return XML_TOK_CLOSE_PAREN_ASTERISK;
1117
2.70k
    case BT_QUEST:
1118
2.70k
      *nextTokPtr = ptr + MINBPC(enc);
1119
2.70k
      return XML_TOK_CLOSE_PAREN_QUESTION;
1120
4.20k
    case BT_PLUS:
1121
4.20k
      *nextTokPtr = ptr + MINBPC(enc);
1122
4.20k
      return XML_TOK_CLOSE_PAREN_PLUS;
1123
2.21k
    case BT_CR:
1124
2.60k
    case BT_LF:
1125
43.9k
    case BT_S:
1126
45.5k
    case BT_GT:
1127
47.8k
    case BT_COMMA:
1128
52.8k
    case BT_VERBAR:
1129
59.6k
    case BT_RPAR:
1130
59.6k
      *nextTokPtr = ptr;
1131
59.6k
      return XML_TOK_CLOSE_PAREN;
1132
70.6k
    }
1133
15
    *nextTokPtr = ptr;
1134
15
    return XML_TOK_INVALID;
1135
18.1k
  case BT_VERBAR:
1136
18.1k
    *nextTokPtr = ptr + MINBPC(enc);
1137
18.1k
    return XML_TOK_OR;
1138
56.7k
  case BT_GT:
1139
56.7k
    *nextTokPtr = ptr + MINBPC(enc);
1140
56.7k
    return XML_TOK_DECL_CLOSE;
1141
48.3k
  case BT_NUM:
1142
48.3k
    return PREFIX(scanPoundName)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1143
0
#  define LEAD_CASE(n)                                                         \
1144
0
  case BT_LEAD##n:                                                             \
1145
0
    if (end - ptr < n)                                                         \
1146
0
      return XML_TOK_PARTIAL_CHAR;                                             \
1147
0
    if (IS_INVALID_CHAR(enc, ptr, n)) {                                        \
1148
0
      *nextTokPtr = ptr;                                                       \
1149
0
      return XML_TOK_INVALID;                                                  \
1150
0
    }                                                                          \
1151
0
    if (IS_NMSTRT_CHAR(enc, ptr, n)) {                                         \
1152
0
      ptr += n;                                                                \
1153
0
      tok = XML_TOK_NAME;                                                      \
1154
0
      break;                                                                   \
1155
0
    }                                                                          \
1156
0
    if (IS_NAME_CHAR(enc, ptr, n)) {                                           \
1157
0
      ptr += n;                                                                \
1158
0
      tok = XML_TOK_NMTOKEN;                                                   \
1159
0
      break;                                                                   \
1160
0
    }                                                                          \
1161
0
    *nextTokPtr = ptr;                                                         \
1162
0
    return XML_TOK_INVALID;
1163
7.25k
    LEAD_CASE(2)
1164
16.8k
    LEAD_CASE(3)
1165
110
    LEAD_CASE(4)
1166
0
#  undef LEAD_CASE
1167
128k
  case BT_NMSTRT:
1168
216k
  case BT_HEX:
1169
216k
    tok = XML_TOK_NAME;
1170
216k
    ptr += MINBPC(enc);
1171
216k
    break;
1172
2.78k
  case BT_DIGIT:
1173
3.02k
  case BT_NAME:
1174
3.47k
  case BT_MINUS:
1175
#  ifdef XML_NS
1176
  case BT_COLON:
1177
#  endif
1178
3.47k
    tok = XML_TOK_NMTOKEN;
1179
3.47k
    ptr += MINBPC(enc);
1180
3.47k
    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
47
  default:
1194
47
    *nextTokPtr = ptr;
1195
47
    return XML_TOK_INVALID;
1196
3.54M
  }
1197
13.0M
  while (HAS_CHAR(enc, ptr, end)) {
1198
13.0M
    switch (BYTE_TYPE(enc, ptr)) {
1199
36.2M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1200
28.3k
    case BT_GT:
1201
81.2k
    case BT_RPAR:
1202
81.6k
    case BT_COMMA:
1203
89.0k
    case BT_VERBAR:
1204
91.1k
    case BT_LSQB:
1205
91.1k
    case BT_PERCNT:
1206
130k
    case BT_S:
1207
202k
    case BT_CR:
1208
223k
    case BT_LF:
1209
223k
      *nextTokPtr = ptr;
1210
223k
      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
1.76k
    case BT_PLUS:
1232
1.76k
      if (tok == XML_TOK_NMTOKEN) {
1233
1
        *nextTokPtr = ptr;
1234
1
        return XML_TOK_INVALID;
1235
1
      }
1236
1.76k
      *nextTokPtr = ptr + MINBPC(enc);
1237
1.76k
      return XML_TOK_NAME_PLUS;
1238
1.66k
    case BT_AST:
1239
1.66k
      if (tok == XML_TOK_NMTOKEN) {
1240
1
        *nextTokPtr = ptr;
1241
1
        return XML_TOK_INVALID;
1242
1
      }
1243
1.66k
      *nextTokPtr = ptr + MINBPC(enc);
1244
1.66k
      return XML_TOK_NAME_ASTERISK;
1245
493
    case BT_QUEST:
1246
493
      if (tok == XML_TOK_NMTOKEN) {
1247
1
        *nextTokPtr = ptr;
1248
1
        return XML_TOK_INVALID;
1249
1
      }
1250
492
      *nextTokPtr = ptr + MINBPC(enc);
1251
492
      return XML_TOK_NAME_QUESTION;
1252
48
    default:
1253
48
      *nextTokPtr = ptr;
1254
48
      return XML_TOK_INVALID;
1255
13.0M
    }
1256
13.0M
  }
1257
496
  return -tok;
1258
227k
}
xmltok.c:little2_prologTok
Line
Count
Source
1018
102
                  const char **nextTokPtr) {
1019
102
  int tok;
1020
102
  if (ptr >= end)
1021
2
    return XML_TOK_NONE;
1022
100
  if (MINBPC(enc) > 1) {
1023
100
    size_t n = end - ptr;
1024
100
    if (n & (MINBPC(enc) - 1)) {
1025
30
      n &= ~(MINBPC(enc) - 1);
1026
30
      if (n == 0)
1027
2
        return XML_TOK_PARTIAL;
1028
28
      end = ptr + n;
1029
28
    }
1030
100
  }
1031
98
  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
24
    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
80
  case BT_NONASCII:
1182
80
    if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {
1183
64
      ptr += MINBPC(enc);
1184
64
      tok = XML_TOK_NAME;
1185
64
      break;
1186
64
    }
1187
16
    if (IS_NAME_CHAR_MINBPC(enc, ptr)) {
1188
4
      ptr += MINBPC(enc);
1189
4
      tok = XML_TOK_NMTOKEN;
1190
4
      break;
1191
4
    }
1192
    /* fall through */
1193
18
  default:
1194
18
    *nextTokPtr = ptr;
1195
18
    return XML_TOK_INVALID;
1196
98
  }
1197
125k
  while (HAS_CHAR(enc, ptr, end)) {
1198
125k
    switch (BYTE_TYPE(enc, ptr)) {
1199
626k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1200
0
    case BT_GT:
1201
0
    case BT_RPAR:
1202
0
    case BT_COMMA:
1203
0
    case BT_VERBAR:
1204
0
    case BT_LSQB:
1205
0
    case BT_PERCNT:
1206
0
    case BT_S:
1207
0
    case BT_CR:
1208
0
    case BT_LF:
1209
0
      *nextTokPtr = ptr;
1210
0
      return tok;
1211
#  ifdef XML_NS
1212
    case BT_COLON:
1213
      ptr += MINBPC(enc);
1214
      switch (tok) {
1215
      case XML_TOK_NAME:
1216
        REQUIRE_CHAR(enc, ptr, end);
1217
        tok = XML_TOK_PREFIXED_NAME;
1218
        switch (BYTE_TYPE(enc, ptr)) {
1219
          CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1220
        default:
1221
          tok = XML_TOK_NMTOKEN;
1222
          break;
1223
        }
1224
        break;
1225
      case XML_TOK_PREFIXED_NAME:
1226
        tok = XML_TOK_NMTOKEN;
1227
        break;
1228
      }
1229
      break;
1230
#  endif
1231
0
    case BT_PLUS:
1232
0
      if (tok == XML_TOK_NMTOKEN) {
1233
0
        *nextTokPtr = ptr;
1234
0
        return XML_TOK_INVALID;
1235
0
      }
1236
0
      *nextTokPtr = ptr + MINBPC(enc);
1237
0
      return XML_TOK_NAME_PLUS;
1238
0
    case BT_AST:
1239
0
      if (tok == XML_TOK_NMTOKEN) {
1240
0
        *nextTokPtr = ptr;
1241
0
        return XML_TOK_INVALID;
1242
0
      }
1243
0
      *nextTokPtr = ptr + MINBPC(enc);
1244
0
      return XML_TOK_NAME_ASTERISK;
1245
0
    case BT_QUEST:
1246
0
      if (tok == XML_TOK_NMTOKEN) {
1247
0
        *nextTokPtr = ptr;
1248
0
        return XML_TOK_INVALID;
1249
0
      }
1250
0
      *nextTokPtr = ptr + MINBPC(enc);
1251
0
      return XML_TOK_NAME_QUESTION;
1252
7
    default:
1253
7
      *nextTokPtr = ptr;
1254
7
      return XML_TOK_INVALID;
1255
125k
    }
1256
125k
  }
1257
20
  return -tok;
1258
68
}
xmltok.c:big2_prologTok
Line
Count
Source
1018
100
                  const char **nextTokPtr) {
1019
100
  int tok;
1020
100
  if (ptr >= end)
1021
2
    return XML_TOK_NONE;
1022
98
  if (MINBPC(enc) > 1) {
1023
98
    size_t n = end - ptr;
1024
98
    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
98
  }
1031
96
  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
72
    LEAD_CASE(4)
1166
0
#  undef LEAD_CASE
1167
0
  case BT_NMSTRT:
1168
0
  case BT_HEX:
1169
0
    tok = XML_TOK_NAME;
1170
0
    ptr += MINBPC(enc);
1171
0
    break;
1172
0
  case BT_DIGIT:
1173
0
  case BT_NAME:
1174
0
  case BT_MINUS:
1175
#  ifdef XML_NS
1176
  case BT_COLON:
1177
#  endif
1178
0
    tok = XML_TOK_NMTOKEN;
1179
0
    ptr += MINBPC(enc);
1180
0
    break;
1181
67
  case BT_NONASCII:
1182
67
    if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {
1183
53
      ptr += MINBPC(enc);
1184
53
      tok = XML_TOK_NAME;
1185
53
      break;
1186
53
    }
1187
14
    if (IS_NAME_CHAR_MINBPC(enc, ptr)) {
1188
6
      ptr += MINBPC(enc);
1189
6
      tok = XML_TOK_NMTOKEN;
1190
6
      break;
1191
6
    }
1192
    /* fall through */
1193
13
  default:
1194
13
    *nextTokPtr = ptr;
1195
13
    return XML_TOK_INVALID;
1196
96
  }
1197
626
  while (HAS_CHAR(enc, ptr, end)) {
1198
626
    switch (BYTE_TYPE(enc, ptr)) {
1199
2.96k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1200
0
    case BT_GT:
1201
0
    case BT_RPAR:
1202
0
    case BT_COMMA:
1203
0
    case BT_VERBAR:
1204
0
    case BT_LSQB:
1205
0
    case BT_PERCNT:
1206
0
    case BT_S:
1207
0
    case BT_CR:
1208
0
    case BT_LF:
1209
0
      *nextTokPtr = ptr;
1210
0
      return tok;
1211
#  ifdef XML_NS
1212
    case BT_COLON:
1213
      ptr += MINBPC(enc);
1214
      switch (tok) {
1215
      case XML_TOK_NAME:
1216
        REQUIRE_CHAR(enc, ptr, end);
1217
        tok = XML_TOK_PREFIXED_NAME;
1218
        switch (BYTE_TYPE(enc, ptr)) {
1219
          CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1220
        default:
1221
          tok = XML_TOK_NMTOKEN;
1222
          break;
1223
        }
1224
        break;
1225
      case XML_TOK_PREFIXED_NAME:
1226
        tok = XML_TOK_NMTOKEN;
1227
        break;
1228
      }
1229
      break;
1230
#  endif
1231
0
    case BT_PLUS:
1232
0
      if (tok == XML_TOK_NMTOKEN) {
1233
0
        *nextTokPtr = ptr;
1234
0
        return XML_TOK_INVALID;
1235
0
      }
1236
0
      *nextTokPtr = ptr + MINBPC(enc);
1237
0
      return XML_TOK_NAME_PLUS;
1238
0
    case BT_AST:
1239
0
      if (tok == XML_TOK_NMTOKEN) {
1240
0
        *nextTokPtr = ptr;
1241
0
        return XML_TOK_INVALID;
1242
0
      }
1243
0
      *nextTokPtr = ptr + MINBPC(enc);
1244
0
      return XML_TOK_NAME_ASTERISK;
1245
0
    case BT_QUEST:
1246
0
      if (tok == XML_TOK_NMTOKEN) {
1247
0
        *nextTokPtr = ptr;
1248
0
        return XML_TOK_INVALID;
1249
0
      }
1250
0
      *nextTokPtr = ptr + MINBPC(enc);
1251
0
      return XML_TOK_NAME_QUESTION;
1252
9
    default:
1253
9
      *nextTokPtr = ptr;
1254
9
      return XML_TOK_INVALID;
1255
626
    }
1256
626
  }
1257
18
  return -tok;
1258
59
}
1259
1260
static int PTRCALL
1261
PREFIX(attributeValueTok)(const ENCODING *enc, const char *ptr, const char *end,
1262
4.04M
                          const char **nextTokPtr) {
1263
4.04M
  const char *start;
1264
4.04M
  if (ptr >= end)
1265
88.7k
    return XML_TOK_NONE;
1266
3.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
3.96M
  start = ptr;
1275
26.5M
  while (HAS_CHAR(enc, ptr, end)) {
1276
26.5M
    switch (BYTE_TYPE(enc, ptr)) {
1277
0
#  define LEAD_CASE(n)                                                         \
1278
316k
  case BT_LEAD##n:                                                             \
1279
316k
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1280
316k
    break;
1281
104k
      LEAD_CASE(2)
1282
114k
      LEAD_CASE(3)
1283
97.6k
      LEAD_CASE(4)
1284
0
#  undef LEAD_CASE
1285
355k
    case BT_AMP:
1286
355k
      if (ptr == start)
1287
260k
        return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1288
95.5k
      *nextTokPtr = ptr;
1289
95.5k
      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
1.02M
    case BT_LF:
1295
1.02M
      if (ptr == start) {
1296
736k
        *nextTokPtr = ptr + MINBPC(enc);
1297
736k
        return XML_TOK_DATA_NEWLINE;
1298
736k
      }
1299
291k
      *nextTokPtr = ptr;
1300
291k
      return XML_TOK_DATA_CHARS;
1301
1.30M
    case BT_CR:
1302
1.30M
      if (ptr == start) {
1303
957k
        ptr += MINBPC(enc);
1304
957k
        if (! HAS_CHAR(enc, ptr, end))
1305
9.70k
          return XML_TOK_TRAILING_CR;
1306
947k
        if (BYTE_TYPE(enc, ptr) == BT_LF)
1307
317k
          ptr += MINBPC(enc);
1308
947k
        *nextTokPtr = ptr;
1309
947k
        return XML_TOK_DATA_NEWLINE;
1310
957k
      }
1311
349k
      *nextTokPtr = ptr;
1312
349k
      return XML_TOK_DATA_CHARS;
1313
1.20M
    case BT_S:
1314
1.20M
      if (ptr == start) {
1315
675k
        *nextTokPtr = ptr + MINBPC(enc);
1316
675k
        return XML_TOK_ATTRIBUTE_VALUE_S;
1317
675k
      }
1318
524k
      *nextTokPtr = ptr;
1319
524k
      return XML_TOK_DATA_CHARS;
1320
22.3M
    default:
1321
22.3M
      ptr += MINBPC(enc);
1322
22.3M
      break;
1323
26.5M
    }
1324
26.5M
  }
1325
67.9k
  *nextTokPtr = ptr;
1326
67.9k
  return XML_TOK_DATA_CHARS;
1327
3.96M
}
xmltok.c:normal_attributeValueTok
Line
Count
Source
1262
4.04M
                          const char **nextTokPtr) {
1263
4.04M
  const char *start;
1264
4.04M
  if (ptr >= end)
1265
88.7k
    return XML_TOK_NONE;
1266
3.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
3.96M
  start = ptr;
1275
26.5M
  while (HAS_CHAR(enc, ptr, end)) {
1276
26.5M
    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
104k
      LEAD_CASE(2)
1282
114k
      LEAD_CASE(3)
1283
97.6k
      LEAD_CASE(4)
1284
0
#  undef LEAD_CASE
1285
355k
    case BT_AMP:
1286
355k
      if (ptr == start)
1287
260k
        return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1288
95.5k
      *nextTokPtr = ptr;
1289
95.5k
      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
1.02M
    case BT_LF:
1295
1.02M
      if (ptr == start) {
1296
736k
        *nextTokPtr = ptr + MINBPC(enc);
1297
736k
        return XML_TOK_DATA_NEWLINE;
1298
736k
      }
1299
291k
      *nextTokPtr = ptr;
1300
291k
      return XML_TOK_DATA_CHARS;
1301
1.30M
    case BT_CR:
1302
1.30M
      if (ptr == start) {
1303
957k
        ptr += MINBPC(enc);
1304
957k
        if (! HAS_CHAR(enc, ptr, end))
1305
9.70k
          return XML_TOK_TRAILING_CR;
1306
947k
        if (BYTE_TYPE(enc, ptr) == BT_LF)
1307
317k
          ptr += MINBPC(enc);
1308
947k
        *nextTokPtr = ptr;
1309
947k
        return XML_TOK_DATA_NEWLINE;
1310
957k
      }
1311
349k
      *nextTokPtr = ptr;
1312
349k
      return XML_TOK_DATA_CHARS;
1313
1.20M
    case BT_S:
1314
1.20M
      if (ptr == start) {
1315
675k
        *nextTokPtr = ptr + MINBPC(enc);
1316
675k
        return XML_TOK_ATTRIBUTE_VALUE_S;
1317
675k
      }
1318
524k
      *nextTokPtr = ptr;
1319
524k
      return XML_TOK_DATA_CHARS;
1320
22.3M
    default:
1321
22.3M
      ptr += MINBPC(enc);
1322
22.3M
      break;
1323
26.5M
    }
1324
26.5M
  }
1325
67.9k
  *nextTokPtr = ptr;
1326
67.9k
  return XML_TOK_DATA_CHARS;
1327
3.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.06k
                   const char **badPtr) {
1451
4.06k
  ptr += MINBPC(enc);
1452
4.06k
  end -= MINBPC(enc);
1453
1.09M
  for (; HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
1454
1.09M
    switch (BYTE_TYPE(enc, ptr)) {
1455
418k
    case BT_DIGIT:
1456
642k
    case BT_HEX:
1457
643k
    case BT_MINUS:
1458
644k
    case BT_APOS:
1459
645k
    case BT_LPAR:
1460
722k
    case BT_RPAR:
1461
724k
    case BT_PLUS:
1462
736k
    case BT_COMMA:
1463
836k
    case BT_SOL:
1464
838k
    case BT_EQUALS:
1465
845k
    case BT_QUEST:
1466
869k
    case BT_CR:
1467
876k
    case BT_LF:
1468
884k
    case BT_SEMI:
1469
884k
    case BT_EXCL:
1470
909k
    case BT_AST:
1471
914k
    case BT_PERCNT:
1472
926k
    case BT_NUM:
1473
#  ifdef XML_NS
1474
    case BT_COLON:
1475
#  endif
1476
926k
      break;
1477
2.95k
    case BT_S:
1478
2.95k
      if (CHAR_MATCHES(enc, ptr, ASCII_TAB)) {
1479
1
        *badPtr = ptr;
1480
1
        return 0;
1481
1
      }
1482
2.95k
      break;
1483
5.96k
    case BT_NAME:
1484
163k
    case BT_NMSTRT:
1485
163k
      if (! (BYTE_TO_ASCII(enc, ptr) & ~0x7f))
1486
163k
        break;
1487
      /* fall through */
1488
3.09k
    default:
1489
3.09k
      switch (BYTE_TO_ASCII(enc, ptr)) {
1490
2.87k
      case 0x24: /* $ */
1491
3.08k
      case 0x40: /* @ */
1492
3.08k
        break;
1493
7
      default:
1494
7
        *badPtr = ptr;
1495
7
        return 0;
1496
3.09k
      }
1497
3.08k
      break;
1498
1.09M
    }
1499
1.09M
  }
1500
4.05k
  return 1;
1501
4.06k
}
xmltok.c:normal_isPublicId
Line
Count
Source
1450
4.06k
                   const char **badPtr) {
1451
4.06k
  ptr += MINBPC(enc);
1452
4.06k
  end -= MINBPC(enc);
1453
1.09M
  for (; HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
1454
1.09M
    switch (BYTE_TYPE(enc, ptr)) {
1455
418k
    case BT_DIGIT:
1456
642k
    case BT_HEX:
1457
643k
    case BT_MINUS:
1458
644k
    case BT_APOS:
1459
645k
    case BT_LPAR:
1460
722k
    case BT_RPAR:
1461
724k
    case BT_PLUS:
1462
736k
    case BT_COMMA:
1463
836k
    case BT_SOL:
1464
838k
    case BT_EQUALS:
1465
845k
    case BT_QUEST:
1466
869k
    case BT_CR:
1467
876k
    case BT_LF:
1468
884k
    case BT_SEMI:
1469
884k
    case BT_EXCL:
1470
909k
    case BT_AST:
1471
914k
    case BT_PERCNT:
1472
926k
    case BT_NUM:
1473
#  ifdef XML_NS
1474
    case BT_COLON:
1475
#  endif
1476
926k
      break;
1477
2.95k
    case BT_S:
1478
2.95k
      if (CHAR_MATCHES(enc, ptr, ASCII_TAB)) {
1479
1
        *badPtr = ptr;
1480
1
        return 0;
1481
1
      }
1482
2.95k
      break;
1483
5.96k
    case BT_NAME:
1484
163k
    case BT_NMSTRT:
1485
163k
      if (! (BYTE_TO_ASCII(enc, ptr) & ~0x7f))
1486
163k
        break;
1487
      /* fall through */
1488
3.09k
    default:
1489
3.09k
      switch (BYTE_TO_ASCII(enc, ptr)) {
1490
2.87k
      case 0x24: /* $ */
1491
3.08k
      case 0x40: /* @ */
1492
3.08k
        break;
1493
7
      default:
1494
7
        *badPtr = ptr;
1495
7
        return 0;
1496
3.09k
      }
1497
3.08k
      break;
1498
1.09M
    }
1499
1.09M
  }
1500
4.05k
  return 1;
1501
4.06k
}
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
323k
                ATTRIBUTE *atts) {
1511
323k
  enum { other, inName, inValue } state = inName;
1512
323k
  int nAtts = 0;
1513
323k
  int open = 0; /* defined when state == inValue;
1514
                   initialization just to shut up compilers */
1515
1516
47.3M
  for (ptr += MINBPC(enc);; ptr += MINBPC(enc)) {
1517
47.3M
    switch (BYTE_TYPE(enc, ptr)) {
1518
0
#  define START_NAME                                                           \
1519
31.8M
    if (state == other) {                                                      \
1520
2.00M
      if (nAtts < attsMax) {                                                   \
1521
1.08M
        atts[nAtts].name = ptr;                                                \
1522
1.08M
        atts[nAtts].normalized = 1;                                            \
1523
1.08M
      }                                                                        \
1524
2.00M
      state = inName;                                                          \
1525
2.00M
    }
1526
0
#  define LEAD_CASE(n)                                                         \
1527
369k
  case BT_LEAD##n: /* NOTE: The encoding has already been validated. */        \
1528
369k
    START_NAME ptr += (n - MINBPC(enc));                                       \
1529
369k
    break;
1530
128k
      LEAD_CASE(2)
1531
179k
      LEAD_CASE(3)
1532
62.2k
      LEAD_CASE(4)
1533
0
#  undef LEAD_CASE
1534
0
    case BT_NONASCII:
1535
29.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
578k
    case BT_QUOT:
1541
578k
      if (state != inValue) {
1542
261k
        if (nAtts < attsMax)
1543
212k
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1544
261k
        state = inValue;
1545
261k
        open = BT_QUOT;
1546
316k
      } else if (open == BT_QUOT) {
1547
261k
        state = other;
1548
261k
        if (nAtts < attsMax)
1549
212k
          atts[nAtts].valueEnd = ptr;
1550
261k
        nAtts++;
1551
261k
      }
1552
578k
      break;
1553
3.89M
    case BT_APOS:
1554
3.89M
      if (state != inValue) {
1555
1.74M
        if (nAtts < attsMax)
1556
873k
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1557
1.74M
        state = inValue;
1558
1.74M
        open = BT_APOS;
1559
2.14M
      } else if (open == BT_APOS) {
1560
1.74M
        state = other;
1561
1.74M
        if (nAtts < attsMax)
1562
873k
          atts[nAtts].valueEnd = ptr;
1563
1.74M
        nAtts++;
1564
1.74M
      }
1565
3.89M
      break;
1566
126k
    case BT_AMP:
1567
126k
      if (nAtts < attsMax)
1568
125k
        atts[nAtts].normalized = 0;
1569
126k
      break;
1570
2.09M
    case BT_S:
1571
2.09M
      if (state == inName)
1572
146k
        state = other;
1573
1.95M
      else if (state == inValue && nAtts < attsMax && atts[nAtts].normalized
1574
65.6k
               && (ptr == atts[nAtts].valuePtr
1575
21.7k
                   || BYTE_TO_ASCII(enc, ptr) != ASCII_SPACE
1576
14.9k
                   || BYTE_TO_ASCII(enc, ptr + MINBPC(enc)) == ASCII_SPACE
1577
12.9k
                   || BYTE_TYPE(enc, ptr + MINBPC(enc)) == open))
1578
53.1k
        atts[nAtts].normalized = 0;
1579
2.09M
      break;
1580
1.86M
    case BT_CR:
1581
2.94M
    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
2.94M
      if (state == inName)
1585
33.4k
        state = other;
1586
2.91M
      else if (state == inValue && nAtts < attsMax)
1587
1.83M
        atts[nAtts].normalized = 0;
1588
2.94M
      break;
1589
296k
    case BT_GT:
1590
489k
    case BT_SOL:
1591
489k
      if (state != inValue)
1592
323k
        return nAtts;
1593
165k
      break;
1594
5.36M
    default:
1595
5.36M
      break;
1596
47.3M
    }
1597
47.3M
  }
1598
  /* not reached */
1599
323k
}
xmltok.c:normal_getAtts
Line
Count
Source
1510
323k
                ATTRIBUTE *atts) {
1511
323k
  enum { other, inName, inValue } state = inName;
1512
323k
  int nAtts = 0;
1513
323k
  int open = 0; /* defined when state == inValue;
1514
                   initialization just to shut up compilers */
1515
1516
47.3M
  for (ptr += MINBPC(enc);; ptr += MINBPC(enc)) {
1517
47.3M
    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
128k
      LEAD_CASE(2)
1531
179k
      LEAD_CASE(3)
1532
62.2k
      LEAD_CASE(4)
1533
0
#  undef LEAD_CASE
1534
0
    case BT_NONASCII:
1535
29.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
578k
    case BT_QUOT:
1541
578k
      if (state != inValue) {
1542
261k
        if (nAtts < attsMax)
1543
212k
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1544
261k
        state = inValue;
1545
261k
        open = BT_QUOT;
1546
316k
      } else if (open == BT_QUOT) {
1547
261k
        state = other;
1548
261k
        if (nAtts < attsMax)
1549
212k
          atts[nAtts].valueEnd = ptr;
1550
261k
        nAtts++;
1551
261k
      }
1552
578k
      break;
1553
3.89M
    case BT_APOS:
1554
3.89M
      if (state != inValue) {
1555
1.74M
        if (nAtts < attsMax)
1556
873k
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1557
1.74M
        state = inValue;
1558
1.74M
        open = BT_APOS;
1559
2.14M
      } else if (open == BT_APOS) {
1560
1.74M
        state = other;
1561
1.74M
        if (nAtts < attsMax)
1562
873k
          atts[nAtts].valueEnd = ptr;
1563
1.74M
        nAtts++;
1564
1.74M
      }
1565
3.89M
      break;
1566
126k
    case BT_AMP:
1567
126k
      if (nAtts < attsMax)
1568
125k
        atts[nAtts].normalized = 0;
1569
126k
      break;
1570
2.09M
    case BT_S:
1571
2.09M
      if (state == inName)
1572
146k
        state = other;
1573
1.95M
      else if (state == inValue && nAtts < attsMax && atts[nAtts].normalized
1574
65.6k
               && (ptr == atts[nAtts].valuePtr
1575
21.7k
                   || BYTE_TO_ASCII(enc, ptr) != ASCII_SPACE
1576
14.9k
                   || BYTE_TO_ASCII(enc, ptr + MINBPC(enc)) == ASCII_SPACE
1577
12.9k
                   || BYTE_TYPE(enc, ptr + MINBPC(enc)) == open))
1578
53.1k
        atts[nAtts].normalized = 0;
1579
2.09M
      break;
1580
1.86M
    case BT_CR:
1581
2.94M
    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
2.94M
      if (state == inName)
1585
33.4k
        state = other;
1586
2.91M
      else if (state == inValue && nAtts < attsMax)
1587
1.83M
        atts[nAtts].normalized = 0;
1588
2.94M
      break;
1589
296k
    case BT_GT:
1590
489k
    case BT_SOL:
1591
489k
      if (state != inValue)
1592
323k
        return nAtts;
1593
165k
      break;
1594
5.36M
    default:
1595
5.36M
      break;
1596
47.3M
    }
1597
47.3M
  }
1598
  /* not reached */
1599
323k
}
Unexecuted instantiation: xmltok.c:little2_getAtts
Unexecuted instantiation: xmltok.c:big2_getAtts
1600
1601
static int PTRFASTCALL
1602
121k
PREFIX(charRefNumber)(const ENCODING *enc, const char *ptr) {
1603
121k
  int result = 0;
1604
  /* skip &# */
1605
121k
  UNUSED_P(enc);
1606
121k
  ptr += 2 * MINBPC(enc);
1607
121k
  if (CHAR_MATCHES(enc, ptr, ASCII_x)) {
1608
517k
    for (ptr += MINBPC(enc); ! CHAR_MATCHES(enc, ptr, ASCII_SEMI);
1609
408k
         ptr += MINBPC(enc)) {
1610
408k
      int c = BYTE_TO_ASCII(enc, ptr);
1611
408k
      switch (c) {
1612
5.23k
      case ASCII_0:
1613
37.9k
      case ASCII_1:
1614
80.9k
      case ASCII_2:
1615
85.0k
      case ASCII_3:
1616
127k
      case ASCII_4:
1617
157k
      case ASCII_5:
1618
159k
      case ASCII_6:
1619
174k
      case ASCII_7:
1620
198k
      case ASCII_8:
1621
219k
      case ASCII_9:
1622
219k
        result <<= 4;
1623
219k
        result |= (c - ASCII_0);
1624
219k
        break;
1625
46.6k
      case ASCII_A:
1626
58.5k
      case ASCII_B:
1627
59.9k
      case ASCII_C:
1628
76.0k
      case ASCII_D:
1629
86.2k
      case ASCII_E:
1630
108k
      case ASCII_F:
1631
108k
        result <<= 4;
1632
108k
        result += 10 + (c - ASCII_A);
1633
108k
        break;
1634
798
      case ASCII_a:
1635
14.9k
      case ASCII_b:
1636
16.1k
      case ASCII_c:
1637
44.6k
      case ASCII_d:
1638
52.5k
      case ASCII_e:
1639
80.6k
      case ASCII_f:
1640
80.6k
        result <<= 4;
1641
80.6k
        result += 10 + (c - ASCII_a);
1642
80.6k
        break;
1643
408k
      }
1644
408k
      if (result >= 0x110000)
1645
11
        return -1;
1646
408k
    }
1647
109k
  } else {
1648
37.5k
    for (; ! CHAR_MATCHES(enc, ptr, ASCII_SEMI); ptr += MINBPC(enc)) {
1649
25.2k
      int c = BYTE_TO_ASCII(enc, ptr);
1650
25.2k
      result *= 10;
1651
25.2k
      result += (c - ASCII_0);
1652
25.2k
      if (result >= 0x110000)
1653
3
        return -1;
1654
25.2k
    }
1655
12.3k
  }
1656
121k
  return checkCharRefNumber(result);
1657
121k
}
xmltok.c:normal_charRefNumber
Line
Count
Source
1602
121k
PREFIX(charRefNumber)(const ENCODING *enc, const char *ptr) {
1603
121k
  int result = 0;
1604
  /* skip &# */
1605
121k
  UNUSED_P(enc);
1606
121k
  ptr += 2 * MINBPC(enc);
1607
121k
  if (CHAR_MATCHES(enc, ptr, ASCII_x)) {
1608
517k
    for (ptr += MINBPC(enc); ! CHAR_MATCHES(enc, ptr, ASCII_SEMI);
1609
408k
         ptr += MINBPC(enc)) {
1610
408k
      int c = BYTE_TO_ASCII(enc, ptr);
1611
408k
      switch (c) {
1612
5.23k
      case ASCII_0:
1613
37.9k
      case ASCII_1:
1614
80.9k
      case ASCII_2:
1615
85.0k
      case ASCII_3:
1616
127k
      case ASCII_4:
1617
157k
      case ASCII_5:
1618
159k
      case ASCII_6:
1619
174k
      case ASCII_7:
1620
198k
      case ASCII_8:
1621
219k
      case ASCII_9:
1622
219k
        result <<= 4;
1623
219k
        result |= (c - ASCII_0);
1624
219k
        break;
1625
46.6k
      case ASCII_A:
1626
58.5k
      case ASCII_B:
1627
59.9k
      case ASCII_C:
1628
76.0k
      case ASCII_D:
1629
86.2k
      case ASCII_E:
1630
108k
      case ASCII_F:
1631
108k
        result <<= 4;
1632
108k
        result += 10 + (c - ASCII_A);
1633
108k
        break;
1634
798
      case ASCII_a:
1635
14.9k
      case ASCII_b:
1636
16.1k
      case ASCII_c:
1637
44.6k
      case ASCII_d:
1638
52.5k
      case ASCII_e:
1639
80.6k
      case ASCII_f:
1640
80.6k
        result <<= 4;
1641
80.6k
        result += 10 + (c - ASCII_a);
1642
80.6k
        break;
1643
408k
      }
1644
408k
      if (result >= 0x110000)
1645
11
        return -1;
1646
408k
    }
1647
109k
  } else {
1648
37.5k
    for (; ! CHAR_MATCHES(enc, ptr, ASCII_SEMI); ptr += MINBPC(enc)) {
1649
25.2k
      int c = BYTE_TO_ASCII(enc, ptr);
1650
25.2k
      result *= 10;
1651
25.2k
      result += (c - ASCII_0);
1652
25.2k
      if (result >= 0x110000)
1653
3
        return -1;
1654
25.2k
    }
1655
12.3k
  }
1656
121k
  return checkCharRefNumber(result);
1657
121k
}
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
209k
                             const char *end) {
1662
209k
  UNUSED_P(enc);
1663
209k
  switch ((end - ptr) / MINBPC(enc)) {
1664
12.8k
  case 2:
1665
12.8k
    if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_t)) {
1666
3.73k
      switch (BYTE_TO_ASCII(enc, ptr)) {
1667
484
      case ASCII_l:
1668
484
        return ASCII_LT;
1669
64
      case ASCII_g:
1670
64
        return ASCII_GT;
1671
3.73k
      }
1672
3.73k
    }
1673
12.2k
    break;
1674
47.2k
  case 3:
1675
47.2k
    if (CHAR_MATCHES(enc, ptr, ASCII_a)) {
1676
33.3k
      ptr += MINBPC(enc);
1677
33.3k
      if (CHAR_MATCHES(enc, ptr, ASCII_m)) {
1678
30.4k
        ptr += MINBPC(enc);
1679
30.4k
        if (CHAR_MATCHES(enc, ptr, ASCII_p))
1680
30.2k
          return ASCII_AMP;
1681
30.4k
      }
1682
33.3k
    }
1683
16.9k
    break;
1684
32.4k
  case 4:
1685
32.4k
    switch (BYTE_TO_ASCII(enc, ptr)) {
1686
15.4k
    case ASCII_q:
1687
15.4k
      ptr += MINBPC(enc);
1688
15.4k
      if (CHAR_MATCHES(enc, ptr, ASCII_u)) {
1689
14.2k
        ptr += MINBPC(enc);
1690
14.2k
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1691
13.5k
          ptr += MINBPC(enc);
1692
13.5k
          if (CHAR_MATCHES(enc, ptr, ASCII_t))
1693
12.9k
            return ASCII_QUOT;
1694
13.5k
        }
1695
14.2k
      }
1696
2.43k
      break;
1697
3.09k
    case ASCII_a:
1698
3.09k
      ptr += MINBPC(enc);
1699
3.09k
      if (CHAR_MATCHES(enc, ptr, ASCII_p)) {
1700
1.32k
        ptr += MINBPC(enc);
1701
1.32k
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1702
908
          ptr += MINBPC(enc);
1703
908
          if (CHAR_MATCHES(enc, ptr, ASCII_s))
1704
578
            return ASCII_APOS;
1705
908
        }
1706
1.32k
      }
1707
2.51k
      break;
1708
32.4k
    }
1709
209k
  }
1710
165k
  return 0;
1711
209k
}
xmltok.c:normal_predefinedEntityName
Line
Count
Source
1661
209k
                             const char *end) {
1662
209k
  UNUSED_P(enc);
1663
209k
  switch ((end - ptr) / MINBPC(enc)) {
1664
12.8k
  case 2:
1665
12.8k
    if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_t)) {
1666
3.73k
      switch (BYTE_TO_ASCII(enc, ptr)) {
1667
484
      case ASCII_l:
1668
484
        return ASCII_LT;
1669
64
      case ASCII_g:
1670
64
        return ASCII_GT;
1671
3.73k
      }
1672
3.73k
    }
1673
12.2k
    break;
1674
47.2k
  case 3:
1675
47.2k
    if (CHAR_MATCHES(enc, ptr, ASCII_a)) {
1676
33.3k
      ptr += MINBPC(enc);
1677
33.3k
      if (CHAR_MATCHES(enc, ptr, ASCII_m)) {
1678
30.4k
        ptr += MINBPC(enc);
1679
30.4k
        if (CHAR_MATCHES(enc, ptr, ASCII_p))
1680
30.2k
          return ASCII_AMP;
1681
30.4k
      }
1682
33.3k
    }
1683
16.9k
    break;
1684
32.4k
  case 4:
1685
32.4k
    switch (BYTE_TO_ASCII(enc, ptr)) {
1686
15.4k
    case ASCII_q:
1687
15.4k
      ptr += MINBPC(enc);
1688
15.4k
      if (CHAR_MATCHES(enc, ptr, ASCII_u)) {
1689
14.2k
        ptr += MINBPC(enc);
1690
14.2k
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1691
13.5k
          ptr += MINBPC(enc);
1692
13.5k
          if (CHAR_MATCHES(enc, ptr, ASCII_t))
1693
12.9k
            return ASCII_QUOT;
1694
13.5k
        }
1695
14.2k
      }
1696
2.43k
      break;
1697
3.09k
    case ASCII_a:
1698
3.09k
      ptr += MINBPC(enc);
1699
3.09k
      if (CHAR_MATCHES(enc, ptr, ASCII_p)) {
1700
1.32k
        ptr += MINBPC(enc);
1701
1.32k
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1702
908
          ptr += MINBPC(enc);
1703
908
          if (CHAR_MATCHES(enc, ptr, ASCII_s))
1704
578
            return ASCII_APOS;
1705
908
        }
1706
1.32k
      }
1707
2.51k
      break;
1708
32.4k
    }
1709
209k
  }
1710
165k
  return 0;
1711
209k
}
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
229k
                         const char *end1, const char *ptr2) {
1716
229k
  UNUSED_P(enc);
1717
1.09M
  for (; *ptr2; ptr1 += MINBPC(enc), ptr2++) {
1718
952k
    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
35
      return 0; /* LCOV_EXCL_LINE */
1725
35
    }
1726
952k
    if (! CHAR_MATCHES(enc, ptr1, *ptr2))
1727
85.4k
      return 0;
1728
952k
  }
1729
143k
  return ptr1 == end1;
1730
229k
}
xmltok.c:normal_nameMatchesAscii
Line
Count
Source
1715
229k
                         const char *end1, const char *ptr2) {
1716
229k
  UNUSED_P(enc);
1717
1.09M
  for (; *ptr2; ptr1 += MINBPC(enc), ptr2++) {
1718
952k
    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
35
      return 0; /* LCOV_EXCL_LINE */
1725
35
    }
1726
952k
    if (! CHAR_MATCHES(enc, ptr1, *ptr2))
1727
85.4k
      return 0;
1728
952k
  }
1729
143k
  return ptr1 == end1;
1730
229k
}
Unexecuted instantiation: xmltok.c:little2_nameMatchesAscii
Unexecuted instantiation: xmltok.c:big2_nameMatchesAscii
1731
1732
static int PTRFASTCALL
1733
569k
PREFIX(nameLength)(const ENCODING *enc, const char *ptr) {
1734
569k
  const char *start = ptr;
1735
13.7M
  for (;;) {
1736
13.7M
    switch (BYTE_TYPE(enc, ptr)) {
1737
0
#  define LEAD_CASE(n)                                                         \
1738
97.4k
  case BT_LEAD##n:                                                             \
1739
97.4k
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1740
97.4k
    break;
1741
43.7k
      LEAD_CASE(2)
1742
53.7k
      LEAD_CASE(3)
1743
0
      LEAD_CASE(4)
1744
0
#  undef LEAD_CASE
1745
0
    case BT_NONASCII:
1746
12.3M
    case BT_NMSTRT:
1747
#  ifdef XML_NS
1748
    case BT_COLON:
1749
#  endif
1750
12.9M
    case BT_HEX:
1751
12.9M
    case BT_DIGIT:
1752
13.0M
    case BT_NAME:
1753
13.0M
    case BT_MINUS:
1754
13.0M
      ptr += MINBPC(enc);
1755
13.0M
      break;
1756
569k
    default:
1757
569k
      return (int)(ptr - start);
1758
13.7M
    }
1759
13.7M
  }
1760
569k
}
xmltok.c:normal_nameLength
Line
Count
Source
1733
569k
PREFIX(nameLength)(const ENCODING *enc, const char *ptr) {
1734
569k
  const char *start = ptr;
1735
13.7M
  for (;;) {
1736
13.7M
    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
43.7k
      LEAD_CASE(2)
1742
53.7k
      LEAD_CASE(3)
1743
0
      LEAD_CASE(4)
1744
0
#  undef LEAD_CASE
1745
0
    case BT_NONASCII:
1746
12.3M
    case BT_NMSTRT:
1747
#  ifdef XML_NS
1748
    case BT_COLON:
1749
#  endif
1750
12.9M
    case BT_HEX:
1751
12.9M
    case BT_DIGIT:
1752
13.0M
    case BT_NAME:
1753
13.0M
    case BT_MINUS:
1754
13.0M
      ptr += MINBPC(enc);
1755
13.0M
      break;
1756
569k
    default:
1757
569k
      return (int)(ptr - start);
1758
13.7M
    }
1759
13.7M
  }
1760
569k
}
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
15.5k
                       POSITION *pos) {
1780
128M
  while (HAS_CHAR(enc, ptr, end)) {
1781
128M
    switch (BYTE_TYPE(enc, ptr)) {
1782
0
#  define LEAD_CASE(n)                                                         \
1783
1.97M
  case BT_LEAD##n:                                                             \
1784
1.97M
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1785
1.97M
    pos->columnNumber++;                                                       \
1786
1.97M
    break;
1787
868k
      LEAD_CASE(2)
1788
857k
      LEAD_CASE(3)
1789
252k
      LEAD_CASE(4)
1790
0
#  undef LEAD_CASE
1791
3.02M
    case BT_LF:
1792
3.02M
      pos->columnNumber = 0;
1793
3.02M
      pos->lineNumber++;
1794
3.02M
      ptr += MINBPC(enc);
1795
3.02M
      break;
1796
4.60M
    case BT_CR:
1797
4.60M
      pos->lineNumber++;
1798
4.60M
      ptr += MINBPC(enc);
1799
4.60M
      if (HAS_CHAR(enc, ptr, end) && BYTE_TYPE(enc, ptr) == BT_LF)
1800
934k
        ptr += MINBPC(enc);
1801
4.60M
      pos->columnNumber = 0;
1802
4.60M
      break;
1803
118M
    default:
1804
118M
      ptr += MINBPC(enc);
1805
118M
      pos->columnNumber++;
1806
118M
      break;
1807
128M
    }
1808
128M
  }
1809
15.5k
}
xmltok.c:normal_updatePosition
Line
Count
Source
1779
15.1k
                       POSITION *pos) {
1780
127M
  while (HAS_CHAR(enc, ptr, end)) {
1781
127M
    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
868k
      LEAD_CASE(2)
1788
857k
      LEAD_CASE(3)
1789
252k
      LEAD_CASE(4)
1790
0
#  undef LEAD_CASE
1791
3.02M
    case BT_LF:
1792
3.02M
      pos->columnNumber = 0;
1793
3.02M
      pos->lineNumber++;
1794
3.02M
      ptr += MINBPC(enc);
1795
3.02M
      break;
1796
4.60M
    case BT_CR:
1797
4.60M
      pos->lineNumber++;
1798
4.60M
      ptr += MINBPC(enc);
1799
4.60M
      if (HAS_CHAR(enc, ptr, end) && BYTE_TYPE(enc, ptr) == BT_LF)
1800
934k
        ptr += MINBPC(enc);
1801
4.60M
      pos->columnNumber = 0;
1802
4.60M
      break;
1803
118M
    default:
1804
118M
      ptr += MINBPC(enc);
1805
118M
      pos->columnNumber++;
1806
118M
      break;
1807
127M
    }
1808
127M
  }
1809
15.1k
}
xmltok.c:little2_updatePosition
Line
Count
Source
1779
183
                       POSITION *pos) {
1780
125k
  while (HAS_CHAR(enc, ptr, end)) {
1781
125k
    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
125k
    default:
1804
125k
      ptr += MINBPC(enc);
1805
125k
      pos->columnNumber++;
1806
125k
      break;
1807
125k
    }
1808
125k
  }
1809
183
}
xmltok.c:big2_updatePosition
Line
Count
Source
1779
180
                       POSITION *pos) {
1780
576
  while (HAS_CHAR(enc, ptr, end)) {
1781
576
    switch (BYTE_TYPE(enc, ptr)) {
1782
0
#  define LEAD_CASE(n)                                                         \
1783
0
  case BT_LEAD##n:                                                             \
1784
0
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1785
0
    pos->columnNumber++;                                                       \
1786
0
    break;
1787
0
      LEAD_CASE(2)
1788
0
      LEAD_CASE(3)
1789
0
      LEAD_CASE(4)
1790
0
#  undef LEAD_CASE
1791
0
    case BT_LF:
1792
0
      pos->columnNumber = 0;
1793
0
      pos->lineNumber++;
1794
0
      ptr += MINBPC(enc);
1795
0
      break;
1796
0
    case BT_CR:
1797
0
      pos->lineNumber++;
1798
0
      ptr += MINBPC(enc);
1799
0
      if (HAS_CHAR(enc, ptr, end) && BYTE_TYPE(enc, ptr) == BT_LF)
1800
0
        ptr += MINBPC(enc);
1801
0
      pos->columnNumber = 0;
1802
0
      break;
1803
576
    default:
1804
576
      ptr += MINBPC(enc);
1805
576
      pos->columnNumber++;
1806
576
      break;
1807
576
    }
1808
576
  }
1809
180
}
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 */