Coverage Report

Created: 2025-12-05 06:47

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
63
#    define IS_INVALID_CHAR(enc, ptr, n) (0)
46
#  endif
47
48
#  define INVALID_LEAD_CASE(n, ptr, nextTokPtr)                                \
49
875k
  case BT_LEAD##n:                                                             \
50
875k
    if (end - ptr < n)                                                         \
51
875k
      return XML_TOK_PARTIAL_CHAR;                                             \
52
875k
    if (IS_INVALID_CHAR(enc, ptr, n)) {                                        \
53
79
      *(nextTokPtr) = (ptr);                                                   \
54
79
      return XML_TOK_INVALID;                                                  \
55
79
    }                                                                          \
56
875k
    ptr += n;                                                                  \
57
875k
    break;
58
59
#  define INVALID_CASES(ptr, nextTokPtr)                                       \
60
426k
    INVALID_LEAD_CASE(2, ptr, nextTokPtr)                                      \
61
426k
    INVALID_LEAD_CASE(3, ptr, nextTokPtr)                                      \
62
308k
    INVALID_LEAD_CASE(4, ptr, nextTokPtr)                                      \
63
140k
  case BT_NONXML:                                                              \
64
45
  case BT_MALFORM:                                                             \
65
78
  case BT_TRAIL:                                                               \
66
78
    *(nextTokPtr) = (ptr);                                                     \
67
78
    return XML_TOK_INVALID;
68
69
#  define CHECK_NAME_CASE(n, enc, ptr, end, nextTokPtr)                        \
70
460k
  case BT_LEAD##n:                                                             \
71
460k
    if (end - ptr < n)                                                         \
72
459k
      return XML_TOK_PARTIAL_CHAR;                                             \
73
460k
    if (IS_INVALID_CHAR(enc, ptr, n) || ! IS_NAME_CHAR(enc, ptr, n)) {         \
74
238
      *nextTokPtr = ptr;                                                       \
75
238
      return XML_TOK_INVALID;                                                  \
76
238
    }                                                                          \
77
460k
    ptr += n;                                                                  \
78
459k
    break;
79
80
#  define CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)                          \
81
28.8M
  case BT_NONASCII:                                                            \
82
28.8M
    if (! IS_NAME_CHAR_MINBPC(enc, ptr)) {                                     \
83
38
      *nextTokPtr = ptr;                                                       \
84
38
      return XML_TOK_INVALID;                                                  \
85
38
    }                                                                          \
86
28.8M
    /* fall through */                                                         \
87
28.8M
  case BT_NMSTRT:                                                              \
88
25.7M
  case BT_HEX:                                                                 \
89
28.4M
  case BT_DIGIT:                                                               \
90
28.6M
  case BT_NAME:                                                                \
91
28.8M
  case BT_MINUS:                                                               \
92
28.8M
    ptr += MINBPC(enc);                                                        \
93
28.8M
    break;                                                                     \
94
28.8M
    CHECK_NAME_CASE(2, enc, ptr, end, nextTokPtr)                              \
95
258k
    CHECK_NAME_CASE(3, enc, ptr, end, nextTokPtr)                              \
96
201k
    CHECK_NAME_CASE(4, enc, ptr, end, nextTokPtr)
97
98
#  define CHECK_NMSTRT_CASE(n, enc, ptr, end, nextTokPtr)                      \
99
303k
  case BT_LEAD##n:                                                             \
100
303k
    if ((end) - (ptr) < (n))                                                   \
101
303k
      return XML_TOK_PARTIAL_CHAR;                                             \
102
303k
    if (IS_INVALID_CHAR(enc, ptr, n) || ! IS_NMSTRT_CHAR(enc, ptr, n)) {       \
103
135
      *nextTokPtr = ptr;                                                       \
104
135
      return XML_TOK_INVALID;                                                  \
105
135
    }                                                                          \
106
303k
    ptr += n;                                                                  \
107
303k
    break;
108
109
#  define CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)                        \
110
1.97M
  case BT_NONASCII:                                                            \
111
1.97M
    if (! IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {                                   \
112
0
      *nextTokPtr = ptr;                                                       \
113
0
      return XML_TOK_INVALID;                                                  \
114
0
    }                                                                          \
115
1.97M
    /* fall through */                                                         \
116
1.97M
  case BT_NMSTRT:                                                              \
117
1.97M
  case BT_HEX:                                                                 \
118
1.97M
    ptr += MINBPC(enc);                                                        \
119
1.97M
    break;                                                                     \
120
1.97M
    CHECK_NMSTRT_CASE(2, enc, ptr, end, nextTokPtr)                            \
121
179k
    CHECK_NMSTRT_CASE(3, enc, ptr, end, nextTokPtr)                            \
122
179k
    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
293M
    ((end) - (ptr) >= ((count) * MINBPC(enc)))
130
131
10.2M
#  define HAS_CHAR(enc, ptr, end) HAS_CHARS(enc, ptr, end, 1)
132
133
#  define REQUIRE_CHARS(enc, ptr, end, count)                                  \
134
26.4M
    {                                                                          \
135
26.4M
      if (! HAS_CHARS(enc, ptr, end, count)) {                                 \
136
497
        return XML_TOK_PARTIAL;                                                \
137
497
      }                                                                        \
138
26.4M
    }
139
140
26.4M
#  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
20.3k
                    const char **nextTokPtr) {
147
20.3k
  if (HAS_CHAR(enc, ptr, end)) {
148
20.2k
    if (! CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
149
9
      *nextTokPtr = ptr;
150
9
      return XML_TOK_INVALID;
151
9
    }
152
20.2k
    ptr += MINBPC(enc);
153
4.26M
    while (HAS_CHAR(enc, ptr, end)) {
154
4.26M
      switch (BYTE_TYPE(enc, ptr)) {
155
233k
        INVALID_CASES(ptr, nextTokPtr)
156
33.5k
      case BT_MINUS:
157
33.5k
        ptr += MINBPC(enc);
158
33.5k
        REQUIRE_CHAR(enc, ptr, end);
159
33.5k
        if (CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
160
20.1k
          ptr += MINBPC(enc);
161
20.1k
          REQUIRE_CHAR(enc, ptr, end);
162
20.1k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
163
6
            *nextTokPtr = ptr;
164
6
            return XML_TOK_INVALID;
165
6
          }
166
20.1k
          *nextTokPtr = ptr + MINBPC(enc);
167
20.1k
          return XML_TOK_COMMENT;
168
20.1k
        }
169
13.3k
        break;
170
4.11M
      default:
171
4.11M
        ptr += MINBPC(enc);
172
4.11M
        break;
173
4.26M
      }
174
4.26M
    }
175
20.2k
  }
176
62
  return XML_TOK_PARTIAL;
177
20.3k
}
xmltok.c:normal_scanComment
Line
Count
Source
146
20.3k
                    const char **nextTokPtr) {
147
20.3k
  if (HAS_CHAR(enc, ptr, end)) {
148
20.2k
    if (! CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
149
9
      *nextTokPtr = ptr;
150
9
      return XML_TOK_INVALID;
151
9
    }
152
20.2k
    ptr += MINBPC(enc);
153
4.26M
    while (HAS_CHAR(enc, ptr, end)) {
154
4.26M
      switch (BYTE_TYPE(enc, ptr)) {
155
233k
        INVALID_CASES(ptr, nextTokPtr)
156
33.5k
      case BT_MINUS:
157
33.5k
        ptr += MINBPC(enc);
158
33.5k
        REQUIRE_CHAR(enc, ptr, end);
159
33.5k
        if (CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
160
20.1k
          ptr += MINBPC(enc);
161
20.1k
          REQUIRE_CHAR(enc, ptr, end);
162
20.1k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
163
6
            *nextTokPtr = ptr;
164
6
            return XML_TOK_INVALID;
165
6
          }
166
20.1k
          *nextTokPtr = ptr + MINBPC(enc);
167
20.1k
          return XML_TOK_COMMENT;
168
20.1k
        }
169
13.3k
        break;
170
4.11M
      default:
171
4.11M
        ptr += MINBPC(enc);
172
4.11M
        break;
173
4.26M
      }
174
4.26M
    }
175
20.2k
  }
176
62
  return XML_TOK_PARTIAL;
177
20.3k
}
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
75.1k
                 const char **nextTokPtr) {
184
75.1k
  REQUIRE_CHAR(enc, ptr, end);
185
75.0k
  switch (BYTE_TYPE(enc, ptr)) {
186
2.69k
  case BT_MINUS:
187
2.69k
    return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
188
4
  case BT_LSQB:
189
4
    *nextTokPtr = ptr + MINBPC(enc);
190
4
    return XML_TOK_COND_SECT_OPEN;
191
924
  case BT_NMSTRT:
192
72.3k
  case BT_HEX:
193
72.3k
    ptr += MINBPC(enc);
194
72.3k
    break;
195
3
  default:
196
3
    *nextTokPtr = ptr;
197
3
    return XML_TOK_INVALID;
198
75.0k
  }
199
589k
  while (HAS_CHAR(enc, ptr, end)) {
200
589k
    switch (BYTE_TYPE(enc, ptr)) {
201
15
    case BT_PERCNT:
202
15
      REQUIRE_CHARS(enc, ptr, end, 2);
203
      /* don't allow <!ENTITY% foo "whatever"> */
204
13
      switch (BYTE_TYPE(enc, ptr + MINBPC(enc))) {
205
1
      case BT_S:
206
2
      case BT_CR:
207
3
      case BT_LF:
208
4
      case BT_PERCNT:
209
4
        *nextTokPtr = ptr;
210
4
        return XML_TOK_INVALID;
211
13
      }
212
      /* fall through */
213
39.9k
    case BT_S:
214
67.5k
    case BT_CR:
215
72.3k
    case BT_LF:
216
72.3k
      *nextTokPtr = ptr;
217
72.3k
      return XML_TOK_DECL_OPEN;
218
408k
    case BT_NMSTRT:
219
517k
    case BT_HEX:
220
517k
      ptr += MINBPC(enc);
221
517k
      break;
222
14
    default:
223
14
      *nextTokPtr = ptr;
224
14
      return XML_TOK_INVALID;
225
589k
    }
226
589k
  }
227
42
  return XML_TOK_PARTIAL;
228
72.3k
}
xmltok.c:normal_scanDecl
Line
Count
Source
183
75.1k
                 const char **nextTokPtr) {
184
75.1k
  REQUIRE_CHAR(enc, ptr, end);
185
75.0k
  switch (BYTE_TYPE(enc, ptr)) {
186
2.69k
  case BT_MINUS:
187
2.69k
    return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
188
4
  case BT_LSQB:
189
4
    *nextTokPtr = ptr + MINBPC(enc);
190
4
    return XML_TOK_COND_SECT_OPEN;
191
924
  case BT_NMSTRT:
192
72.3k
  case BT_HEX:
193
72.3k
    ptr += MINBPC(enc);
194
72.3k
    break;
195
3
  default:
196
3
    *nextTokPtr = ptr;
197
3
    return XML_TOK_INVALID;
198
75.0k
  }
199
589k
  while (HAS_CHAR(enc, ptr, end)) {
200
589k
    switch (BYTE_TYPE(enc, ptr)) {
201
15
    case BT_PERCNT:
202
15
      REQUIRE_CHARS(enc, ptr, end, 2);
203
      /* don't allow <!ENTITY% foo "whatever"> */
204
13
      switch (BYTE_TYPE(enc, ptr + MINBPC(enc))) {
205
1
      case BT_S:
206
2
      case BT_CR:
207
3
      case BT_LF:
208
4
      case BT_PERCNT:
209
4
        *nextTokPtr = ptr;
210
4
        return XML_TOK_INVALID;
211
13
      }
212
      /* fall through */
213
39.9k
    case BT_S:
214
67.5k
    case BT_CR:
215
72.3k
    case BT_LF:
216
72.3k
      *nextTokPtr = ptr;
217
72.3k
      return XML_TOK_DECL_OPEN;
218
408k
    case BT_NMSTRT:
219
517k
    case BT_HEX:
220
517k
      ptr += MINBPC(enc);
221
517k
      break;
222
14
    default:
223
14
      *nextTokPtr = ptr;
224
14
      return XML_TOK_INVALID;
225
589k
    }
226
589k
  }
227
42
  return XML_TOK_PARTIAL;
228
72.3k
}
Unexecuted instantiation: xmltok.c:little2_scanDecl
Unexecuted instantiation: xmltok.c:big2_scanDecl
229
230
static int PTRCALL
231
PREFIX(checkPiTarget)(const ENCODING *enc, const char *ptr, const char *end,
232
47.0k
                      int *tokPtr) {
233
47.0k
  int upper = 0;
234
47.0k
  UNUSED_P(enc);
235
47.0k
  *tokPtr = XML_TOK_PI;
236
47.0k
  if (end - ptr != MINBPC(enc) * 3)
237
31.1k
    return 1;
238
15.8k
  switch (BYTE_TO_ASCII(enc, ptr)) {
239
11.0k
  case ASCII_x:
240
11.0k
    break;
241
1.71k
  case ASCII_X:
242
1.71k
    upper = 1;
243
1.71k
    break;
244
3.14k
  default:
245
3.14k
    return 1;
246
15.8k
  }
247
12.7k
  ptr += MINBPC(enc);
248
12.7k
  switch (BYTE_TO_ASCII(enc, ptr)) {
249
1.93k
  case ASCII_m:
250
1.93k
    break;
251
1.35k
  case ASCII_M:
252
1.35k
    upper = 1;
253
1.35k
    break;
254
9.43k
  default:
255
9.43k
    return 1;
256
12.7k
  }
257
3.28k
  ptr += MINBPC(enc);
258
3.28k
  switch (BYTE_TO_ASCII(enc, ptr)) {
259
1.15k
  case ASCII_l:
260
1.15k
    break;
261
2
  case ASCII_L:
262
2
    upper = 1;
263
2
    break;
264
2.12k
  default:
265
2.12k
    return 1;
266
3.28k
  }
267
1.15k
  if (upper)
268
4
    return 0;
269
1.15k
  *tokPtr = XML_TOK_XML_DECL;
270
1.15k
  return 1;
271
1.15k
}
xmltok.c:normal_checkPiTarget
Line
Count
Source
232
47.0k
                      int *tokPtr) {
233
47.0k
  int upper = 0;
234
47.0k
  UNUSED_P(enc);
235
47.0k
  *tokPtr = XML_TOK_PI;
236
47.0k
  if (end - ptr != MINBPC(enc) * 3)
237
31.1k
    return 1;
238
15.8k
  switch (BYTE_TO_ASCII(enc, ptr)) {
239
11.0k
  case ASCII_x:
240
11.0k
    break;
241
1.71k
  case ASCII_X:
242
1.71k
    upper = 1;
243
1.71k
    break;
244
3.14k
  default:
245
3.14k
    return 1;
246
15.8k
  }
247
12.7k
  ptr += MINBPC(enc);
248
12.7k
  switch (BYTE_TO_ASCII(enc, ptr)) {
249
1.93k
  case ASCII_m:
250
1.93k
    break;
251
1.35k
  case ASCII_M:
252
1.35k
    upper = 1;
253
1.35k
    break;
254
9.43k
  default:
255
9.43k
    return 1;
256
12.7k
  }
257
3.28k
  ptr += MINBPC(enc);
258
3.28k
  switch (BYTE_TO_ASCII(enc, ptr)) {
259
1.15k
  case ASCII_l:
260
1.15k
    break;
261
2
  case ASCII_L:
262
2
    upper = 1;
263
2
    break;
264
2.12k
  default:
265
2.12k
    return 1;
266
3.28k
  }
267
1.15k
  if (upper)
268
4
    return 0;
269
1.15k
  *tokPtr = XML_TOK_XML_DECL;
270
1.15k
  return 1;
271
1.15k
}
Unexecuted instantiation: xmltok.c:little2_checkPiTarget
Unexecuted instantiation: xmltok.c:big2_checkPiTarget
272
273
/* ptr points to character following "<?" */
274
275
static int PTRCALL
276
PREFIX(scanPi)(const ENCODING *enc, const char *ptr, const char *end,
277
47.1k
               const char **nextTokPtr) {
278
47.1k
  int tok;
279
47.1k
  const char *target = ptr;
280
47.1k
  REQUIRE_CHAR(enc, ptr, end);
281
47.1k
  switch (BYTE_TYPE(enc, ptr)) {
282
52.7k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
283
5
  default:
284
5
    *nextTokPtr = ptr;
285
5
    return XML_TOK_INVALID;
286
47.1k
  }
287
2.42M
  while (HAS_CHAR(enc, ptr, end)) {
288
2.42M
    switch (BYTE_TYPE(enc, ptr)) {
289
9.10M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
290
13.6k
    case BT_S:
291
14.9k
    case BT_CR:
292
17.1k
    case BT_LF:
293
17.1k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
294
2
        *nextTokPtr = ptr;
295
2
        return XML_TOK_INVALID;
296
2
      }
297
17.1k
      ptr += MINBPC(enc);
298
11.9M
      while (HAS_CHAR(enc, ptr, end)) {
299
11.9M
        switch (BYTE_TYPE(enc, ptr)) {
300
317k
          INVALID_CASES(ptr, nextTokPtr)
301
87.9k
        case BT_QUEST:
302
87.9k
          ptr += MINBPC(enc);
303
87.9k
          REQUIRE_CHAR(enc, ptr, end);
304
87.9k
          if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
305
16.9k
            *nextTokPtr = ptr + MINBPC(enc);
306
16.9k
            return tok;
307
16.9k
          }
308
70.9k
          break;
309
11.7M
        default:
310
11.7M
          ptr += MINBPC(enc);
311
11.7M
          break;
312
11.9M
        }
313
11.9M
      }
314
112
      return XML_TOK_PARTIAL;
315
29.9k
    case BT_QUEST:
316
29.9k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
317
2
        *nextTokPtr = ptr;
318
2
        return XML_TOK_INVALID;
319
2
      }
320
29.9k
      ptr += MINBPC(enc);
321
29.9k
      REQUIRE_CHAR(enc, ptr, end);
322
29.8k
      if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
323
29.8k
        *nextTokPtr = ptr + MINBPC(enc);
324
29.8k
        return tok;
325
29.8k
      }
326
      /* fall through */
327
21
    default:
328
21
      *nextTokPtr = ptr;
329
21
      return XML_TOK_INVALID;
330
2.42M
    }
331
2.42M
  }
332
58
  return XML_TOK_PARTIAL;
333
47.1k
}
xmltok.c:normal_scanPi
Line
Count
Source
277
47.1k
               const char **nextTokPtr) {
278
47.1k
  int tok;
279
47.1k
  const char *target = ptr;
280
47.1k
  REQUIRE_CHAR(enc, ptr, end);
281
47.1k
  switch (BYTE_TYPE(enc, ptr)) {
282
52.7k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
283
5
  default:
284
5
    *nextTokPtr = ptr;
285
5
    return XML_TOK_INVALID;
286
47.1k
  }
287
2.42M
  while (HAS_CHAR(enc, ptr, end)) {
288
2.42M
    switch (BYTE_TYPE(enc, ptr)) {
289
9.10M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
290
13.6k
    case BT_S:
291
14.9k
    case BT_CR:
292
17.1k
    case BT_LF:
293
17.1k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
294
2
        *nextTokPtr = ptr;
295
2
        return XML_TOK_INVALID;
296
2
      }
297
17.1k
      ptr += MINBPC(enc);
298
11.9M
      while (HAS_CHAR(enc, ptr, end)) {
299
11.9M
        switch (BYTE_TYPE(enc, ptr)) {
300
317k
          INVALID_CASES(ptr, nextTokPtr)
301
87.9k
        case BT_QUEST:
302
87.9k
          ptr += MINBPC(enc);
303
87.9k
          REQUIRE_CHAR(enc, ptr, end);
304
87.9k
          if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
305
16.9k
            *nextTokPtr = ptr + MINBPC(enc);
306
16.9k
            return tok;
307
16.9k
          }
308
70.9k
          break;
309
11.7M
        default:
310
11.7M
          ptr += MINBPC(enc);
311
11.7M
          break;
312
11.9M
        }
313
11.9M
      }
314
112
      return XML_TOK_PARTIAL;
315
29.9k
    case BT_QUEST:
316
29.9k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
317
2
        *nextTokPtr = ptr;
318
2
        return XML_TOK_INVALID;
319
2
      }
320
29.9k
      ptr += MINBPC(enc);
321
29.9k
      REQUIRE_CHAR(enc, ptr, end);
322
29.8k
      if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
323
29.8k
        *nextTokPtr = ptr + MINBPC(enc);
324
29.8k
        return tok;
325
29.8k
      }
326
      /* fall through */
327
21
    default:
328
21
      *nextTokPtr = ptr;
329
21
      return XML_TOK_INVALID;
330
2.42M
    }
331
2.42M
  }
332
58
  return XML_TOK_PARTIAL;
333
47.1k
}
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
3.65k
                         const char **nextTokPtr) {
338
3.65k
  static const char CDATA_LSQB[]
339
3.65k
      = {ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, ASCII_LSQB};
340
3.65k
  int i;
341
3.65k
  UNUSED_P(enc);
342
  /* CDATA[ */
343
3.65k
  REQUIRE_CHARS(enc, ptr, end, 6);
344
25.3k
  for (i = 0; i < 6; i++, ptr += MINBPC(enc)) {
345
21.7k
    if (! CHAR_MATCHES(enc, ptr, CDATA_LSQB[i])) {
346
49
      *nextTokPtr = ptr;
347
49
      return XML_TOK_INVALID;
348
49
    }
349
21.7k
  }
350
3.59k
  *nextTokPtr = ptr;
351
3.59k
  return XML_TOK_CDATA_SECT_OPEN;
352
3.64k
}
xmltok.c:normal_scanCdataSection
Line
Count
Source
337
3.65k
                         const char **nextTokPtr) {
338
3.65k
  static const char CDATA_LSQB[]
339
3.65k
      = {ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, ASCII_LSQB};
340
3.65k
  int i;
341
3.65k
  UNUSED_P(enc);
342
  /* CDATA[ */
343
3.65k
  REQUIRE_CHARS(enc, ptr, end, 6);
344
25.3k
  for (i = 0; i < 6; i++, ptr += MINBPC(enc)) {
345
21.7k
    if (! CHAR_MATCHES(enc, ptr, CDATA_LSQB[i])) {
346
49
      *nextTokPtr = ptr;
347
49
      return XML_TOK_INVALID;
348
49
    }
349
21.7k
  }
350
3.59k
  *nextTokPtr = ptr;
351
3.59k
  return XML_TOK_CDATA_SECT_OPEN;
352
3.64k
}
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
6.06M
                        const char **nextTokPtr) {
357
6.06M
  if (ptr >= end)
358
148
    return XML_TOK_NONE;
359
6.06M
  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
6.06M
  switch (BYTE_TYPE(enc, ptr)) {
369
849k
  case BT_RSQB:
370
849k
    ptr += MINBPC(enc);
371
849k
    REQUIRE_CHAR(enc, ptr, end);
372
849k
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
373
421k
      break;
374
427k
    ptr += MINBPC(enc);
375
427k
    REQUIRE_CHAR(enc, ptr, end);
376
427k
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
377
424k
      ptr -= MINBPC(enc);
378
424k
      break;
379
424k
    }
380
3.47k
    *nextTokPtr = ptr + MINBPC(enc);
381
3.47k
    return XML_TOK_CDATA_SECT_CLOSE;
382
2.34M
  case BT_CR:
383
2.34M
    ptr += MINBPC(enc);
384
2.34M
    REQUIRE_CHAR(enc, ptr, end);
385
2.34M
    if (BYTE_TYPE(enc, ptr) == BT_LF)
386
365k
      ptr += MINBPC(enc);
387
2.34M
    *nextTokPtr = ptr;
388
2.34M
    return XML_TOK_DATA_NEWLINE;
389
1.49M
  case BT_LF:
390
1.49M
    *nextTokPtr = ptr + MINBPC(enc);
391
1.49M
    return XML_TOK_DATA_NEWLINE;
392
1.49M
    INVALID_CASES(ptr, nextTokPtr)
393
1.10M
  default:
394
1.10M
    ptr += MINBPC(enc);
395
1.10M
    break;
396
6.06M
  }
397
29.7M
  while (HAS_CHAR(enc, ptr, end)) {
398
29.7M
    switch (BYTE_TYPE(enc, ptr)) {
399
0
#  define LEAD_CASE(n)                                                         \
400
377k
  case BT_LEAD##n:                                                             \
401
377k
    if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) {                       \
402
16
      *nextTokPtr = ptr;                                                       \
403
16
      return XML_TOK_DATA_CHARS;                                               \
404
16
    }                                                                          \
405
377k
    ptr += n;                                                                  \
406
377k
    break;
407
166k
      LEAD_CASE(2)
408
117k
      LEAD_CASE(3)
409
93.9k
      LEAD_CASE(4)
410
0
#  undef LEAD_CASE
411
2
    case BT_NONXML:
412
4
    case BT_MALFORM:
413
9
    case BT_TRAIL:
414
862k
    case BT_CR:
415
1.46M
    case BT_LF:
416
2.21M
    case BT_RSQB:
417
2.21M
      *nextTokPtr = ptr;
418
2.21M
      return XML_TOK_DATA_CHARS;
419
27.1M
    default:
420
27.1M
      ptr += MINBPC(enc);
421
27.1M
      break;
422
29.7M
    }
423
29.7M
  }
424
50
  *nextTokPtr = ptr;
425
50
  return XML_TOK_DATA_CHARS;
426
2.21M
}
xmltok.c:normal_cdataSectionTok
Line
Count
Source
356
6.06M
                        const char **nextTokPtr) {
357
6.06M
  if (ptr >= end)
358
148
    return XML_TOK_NONE;
359
6.06M
  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
6.06M
  switch (BYTE_TYPE(enc, ptr)) {
369
849k
  case BT_RSQB:
370
849k
    ptr += MINBPC(enc);
371
849k
    REQUIRE_CHAR(enc, ptr, end);
372
849k
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
373
421k
      break;
374
427k
    ptr += MINBPC(enc);
375
427k
    REQUIRE_CHAR(enc, ptr, end);
376
427k
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
377
424k
      ptr -= MINBPC(enc);
378
424k
      break;
379
424k
    }
380
3.47k
    *nextTokPtr = ptr + MINBPC(enc);
381
3.47k
    return XML_TOK_CDATA_SECT_CLOSE;
382
2.34M
  case BT_CR:
383
2.34M
    ptr += MINBPC(enc);
384
2.34M
    REQUIRE_CHAR(enc, ptr, end);
385
2.34M
    if (BYTE_TYPE(enc, ptr) == BT_LF)
386
365k
      ptr += MINBPC(enc);
387
2.34M
    *nextTokPtr = ptr;
388
2.34M
    return XML_TOK_DATA_NEWLINE;
389
1.49M
  case BT_LF:
390
1.49M
    *nextTokPtr = ptr + MINBPC(enc);
391
1.49M
    return XML_TOK_DATA_NEWLINE;
392
1.49M
    INVALID_CASES(ptr, nextTokPtr)
393
1.10M
  default:
394
1.10M
    ptr += MINBPC(enc);
395
1.10M
    break;
396
6.06M
  }
397
29.7M
  while (HAS_CHAR(enc, ptr, end)) {
398
29.7M
    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
166k
      LEAD_CASE(2)
408
117k
      LEAD_CASE(3)
409
93.9k
      LEAD_CASE(4)
410
0
#  undef LEAD_CASE
411
2
    case BT_NONXML:
412
4
    case BT_MALFORM:
413
9
    case BT_TRAIL:
414
862k
    case BT_CR:
415
1.46M
    case BT_LF:
416
2.21M
    case BT_RSQB:
417
2.21M
      *nextTokPtr = ptr;
418
2.21M
      return XML_TOK_DATA_CHARS;
419
27.1M
    default:
420
27.1M
      ptr += MINBPC(enc);
421
27.1M
      break;
422
29.7M
    }
423
29.7M
  }
424
50
  *nextTokPtr = ptr;
425
50
  return XML_TOK_DATA_CHARS;
426
2.21M
}
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
68.0k
                   const char **nextTokPtr) {
433
68.0k
  REQUIRE_CHAR(enc, ptr, end);
434
68.0k
  switch (BYTE_TYPE(enc, ptr)) {
435
70.9k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
436
8
  default:
437
8
    *nextTokPtr = ptr;
438
8
    return XML_TOK_INVALID;
439
68.0k
  }
440
241k
  while (HAS_CHAR(enc, ptr, end)) {
441
241k
    switch (BYTE_TYPE(enc, ptr)) {
442
511k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
443
589
    case BT_S:
444
1.13k
    case BT_CR:
445
12.6k
    case BT_LF:
446
29.6k
      for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
447
29.6k
        switch (BYTE_TYPE(enc, ptr)) {
448
1.94k
        case BT_S:
449
4.71k
        case BT_CR:
450
16.9k
        case BT_LF:
451
16.9k
          break;
452
12.6k
        case BT_GT:
453
12.6k
          *nextTokPtr = ptr + MINBPC(enc);
454
12.6k
          return XML_TOK_END_TAG;
455
5
        default:
456
5
          *nextTokPtr = ptr;
457
5
          return XML_TOK_INVALID;
458
29.6k
        }
459
29.6k
      }
460
34
      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
55.2k
    case BT_GT:
469
55.2k
      *nextTokPtr = ptr + MINBPC(enc);
470
55.2k
      return XML_TOK_END_TAG;
471
10
    default:
472
10
      *nextTokPtr = ptr;
473
10
      return XML_TOK_INVALID;
474
241k
    }
475
241k
  }
476
86
  return XML_TOK_PARTIAL;
477
68.0k
}
xmltok.c:normal_scanEndTag
Line
Count
Source
432
68.0k
                   const char **nextTokPtr) {
433
68.0k
  REQUIRE_CHAR(enc, ptr, end);
434
68.0k
  switch (BYTE_TYPE(enc, ptr)) {
435
70.9k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
436
8
  default:
437
8
    *nextTokPtr = ptr;
438
8
    return XML_TOK_INVALID;
439
68.0k
  }
440
241k
  while (HAS_CHAR(enc, ptr, end)) {
441
241k
    switch (BYTE_TYPE(enc, ptr)) {
442
511k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
443
589
    case BT_S:
444
1.13k
    case BT_CR:
445
12.6k
    case BT_LF:
446
29.6k
      for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
447
29.6k
        switch (BYTE_TYPE(enc, ptr)) {
448
1.94k
        case BT_S:
449
4.71k
        case BT_CR:
450
16.9k
        case BT_LF:
451
16.9k
          break;
452
12.6k
        case BT_GT:
453
12.6k
          *nextTokPtr = ptr + MINBPC(enc);
454
12.6k
          return XML_TOK_END_TAG;
455
5
        default:
456
5
          *nextTokPtr = ptr;
457
5
          return XML_TOK_INVALID;
458
29.6k
        }
459
29.6k
      }
460
34
      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
55.2k
    case BT_GT:
469
55.2k
      *nextTokPtr = ptr + MINBPC(enc);
470
55.2k
      return XML_TOK_END_TAG;
471
10
    default:
472
10
      *nextTokPtr = ptr;
473
10
      return XML_TOK_INVALID;
474
241k
    }
475
241k
  }
476
86
  return XML_TOK_PARTIAL;
477
68.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
146k
                       const char **nextTokPtr) {
484
146k
  if (HAS_CHAR(enc, ptr, end)) {
485
146k
    switch (BYTE_TYPE(enc, ptr)) {
486
58.6k
    case BT_DIGIT:
487
146k
    case BT_HEX:
488
146k
      break;
489
2
    default:
490
2
      *nextTokPtr = ptr;
491
2
      return XML_TOK_INVALID;
492
146k
    }
493
527k
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
494
527k
      switch (BYTE_TYPE(enc, ptr)) {
495
266k
      case BT_DIGIT:
496
381k
      case BT_HEX:
497
381k
        break;
498
146k
      case BT_SEMI:
499
146k
        *nextTokPtr = ptr + MINBPC(enc);
500
146k
        return XML_TOK_CHAR_REF;
501
1
      default:
502
1
        *nextTokPtr = ptr;
503
1
        return XML_TOK_INVALID;
504
527k
      }
505
527k
    }
506
146k
  }
507
23
  return XML_TOK_PARTIAL;
508
146k
}
xmltok.c:normal_scanHexCharRef
Line
Count
Source
483
146k
                       const char **nextTokPtr) {
484
146k
  if (HAS_CHAR(enc, ptr, end)) {
485
146k
    switch (BYTE_TYPE(enc, ptr)) {
486
58.6k
    case BT_DIGIT:
487
146k
    case BT_HEX:
488
146k
      break;
489
2
    default:
490
2
      *nextTokPtr = ptr;
491
2
      return XML_TOK_INVALID;
492
146k
    }
493
527k
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
494
527k
      switch (BYTE_TYPE(enc, ptr)) {
495
266k
      case BT_DIGIT:
496
381k
      case BT_HEX:
497
381k
        break;
498
146k
      case BT_SEMI:
499
146k
        *nextTokPtr = ptr + MINBPC(enc);
500
146k
        return XML_TOK_CHAR_REF;
501
1
      default:
502
1
        *nextTokPtr = ptr;
503
1
        return XML_TOK_INVALID;
504
527k
      }
505
527k
    }
506
146k
  }
507
23
  return XML_TOK_PARTIAL;
508
146k
}
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
152k
                    const char **nextTokPtr) {
515
152k
  if (HAS_CHAR(enc, ptr, end)) {
516
152k
    if (CHAR_MATCHES(enc, ptr, ASCII_x))
517
146k
      return PREFIX(scanHexCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
518
6.44k
    switch (BYTE_TYPE(enc, ptr)) {
519
6.43k
    case BT_DIGIT:
520
6.43k
      break;
521
12
    default:
522
12
      *nextTokPtr = ptr;
523
12
      return XML_TOK_INVALID;
524
6.44k
    }
525
22.2k
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
526
22.2k
      switch (BYTE_TYPE(enc, ptr)) {
527
15.8k
      case BT_DIGIT:
528
15.8k
        break;
529
6.42k
      case BT_SEMI:
530
6.42k
        *nextTokPtr = ptr + MINBPC(enc);
531
6.42k
        return XML_TOK_CHAR_REF;
532
1
      default:
533
1
        *nextTokPtr = ptr;
534
1
        return XML_TOK_INVALID;
535
22.2k
      }
536
22.2k
    }
537
6.43k
  }
538
15
  return XML_TOK_PARTIAL;
539
152k
}
xmltok.c:normal_scanCharRef
Line
Count
Source
514
152k
                    const char **nextTokPtr) {
515
152k
  if (HAS_CHAR(enc, ptr, end)) {
516
152k
    if (CHAR_MATCHES(enc, ptr, ASCII_x))
517
146k
      return PREFIX(scanHexCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
518
6.44k
    switch (BYTE_TYPE(enc, ptr)) {
519
6.43k
    case BT_DIGIT:
520
6.43k
      break;
521
12
    default:
522
12
      *nextTokPtr = ptr;
523
12
      return XML_TOK_INVALID;
524
6.44k
    }
525
22.2k
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
526
22.2k
      switch (BYTE_TYPE(enc, ptr)) {
527
15.8k
      case BT_DIGIT:
528
15.8k
        break;
529
6.42k
      case BT_SEMI:
530
6.42k
        *nextTokPtr = ptr + MINBPC(enc);
531
6.42k
        return XML_TOK_CHAR_REF;
532
1
      default:
533
1
        *nextTokPtr = ptr;
534
1
        return XML_TOK_INVALID;
535
22.2k
      }
536
22.2k
    }
537
6.43k
  }
538
15
  return XML_TOK_PARTIAL;
539
152k
}
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
424k
                const char **nextTokPtr) {
546
424k
  REQUIRE_CHAR(enc, ptr, end);
547
424k
  switch (BYTE_TYPE(enc, ptr)) {
548
225k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
549
152k
  case BT_NUM:
550
152k
    return PREFIX(scanCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
551
5
  default:
552
5
    *nextTokPtr = ptr;
553
5
    return XML_TOK_INVALID;
554
424k
  }
555
2.75M
  while (HAS_CHAR(enc, ptr, end)) {
556
2.75M
    switch (BYTE_TYPE(enc, ptr)) {
557
8.88M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
558
271k
    case BT_SEMI:
559
271k
      *nextTokPtr = ptr + MINBPC(enc);
560
271k
      return XML_TOK_ENTITY_REF;
561
10
    default:
562
10
      *nextTokPtr = ptr;
563
10
      return XML_TOK_INVALID;
564
2.75M
    }
565
2.75M
  }
566
58
  return XML_TOK_PARTIAL;
567
271k
}
xmltok.c:normal_scanRef
Line
Count
Source
545
424k
                const char **nextTokPtr) {
546
424k
  REQUIRE_CHAR(enc, ptr, end);
547
424k
  switch (BYTE_TYPE(enc, ptr)) {
548
225k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
549
152k
  case BT_NUM:
550
152k
    return PREFIX(scanCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
551
5
  default:
552
5
    *nextTokPtr = ptr;
553
5
    return XML_TOK_INVALID;
554
424k
  }
555
2.75M
  while (HAS_CHAR(enc, ptr, end)) {
556
2.75M
    switch (BYTE_TYPE(enc, ptr)) {
557
8.88M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
558
271k
    case BT_SEMI:
559
271k
      *nextTokPtr = ptr + MINBPC(enc);
560
271k
      return XML_TOK_ENTITY_REF;
561
10
    default:
562
10
      *nextTokPtr = ptr;
563
10
      return XML_TOK_INVALID;
564
2.75M
    }
565
2.75M
  }
566
58
  return XML_TOK_PARTIAL;
567
271k
}
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
44.7k
                 const char **nextTokPtr) {
574
#  ifdef XML_NS
575
  int hadColon = 0;
576
#  endif
577
1.61M
  while (HAS_CHAR(enc, ptr, end)) {
578
1.61M
    switch (BYTE_TYPE(enc, ptr)) {
579
1.16M
      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.43k
    case BT_S:
598
14.3k
    case BT_CR:
599
17.3k
    case BT_LF:
600
36.8k
      for (;;) {
601
36.8k
        int t;
602
603
36.8k
        ptr += MINBPC(enc);
604
36.8k
        REQUIRE_CHAR(enc, ptr, end);
605
36.7k
        t = BYTE_TYPE(enc, ptr);
606
36.7k
        if (t == BT_EQUALS)
607
17.2k
          break;
608
19.5k
        switch (t) {
609
3.45k
        case BT_S:
610
7.36k
        case BT_LF:
611
19.5k
        case BT_CR:
612
19.5k
          break;
613
11
        default:
614
11
          *nextTokPtr = ptr;
615
11
          return XML_TOK_INVALID;
616
19.5k
        }
617
19.5k
      }
618
      /* fall through */
619
1.27M
    case BT_EQUALS: {
620
1.27M
      int open;
621
#  ifdef XML_NS
622
      hadColon = 0;
623
#  endif
624
1.32M
      for (;;) {
625
1.32M
        ptr += MINBPC(enc);
626
1.32M
        REQUIRE_CHAR(enc, ptr, end);
627
1.32M
        open = BYTE_TYPE(enc, ptr);
628
1.32M
        if (open == BT_QUOT || open == BT_APOS)
629
1.27M
          break;
630
54.8k
        switch (open) {
631
11.1k
        case BT_S:
632
22.5k
        case BT_LF:
633
54.8k
        case BT_CR:
634
54.8k
          break;
635
13
        default:
636
13
          *nextTokPtr = ptr;
637
13
          return XML_TOK_INVALID;
638
54.8k
        }
639
54.8k
      }
640
1.27M
      ptr += MINBPC(enc);
641
      /* in attribute value */
642
17.0M
      for (;;) {
643
17.0M
        int t;
644
17.0M
        REQUIRE_CHAR(enc, ptr, end);
645
17.0M
        t = BYTE_TYPE(enc, ptr);
646
17.0M
        if (t == open)
647
1.27M
          break;
648
15.8M
        switch (t) {
649
321k
          INVALID_CASES(ptr, nextTokPtr)
650
147k
        case BT_AMP: {
651
147k
          int tok = PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, &ptr);
652
147k
          if (tok <= 0) {
653
22
            if (tok == XML_TOK_INVALID)
654
12
              *nextTokPtr = ptr;
655
22
            return tok;
656
22
          }
657
147k
          break;
658
147k
        }
659
147k
        case BT_LT:
660
6
          *nextTokPtr = ptr;
661
6
          return XML_TOK_INVALID;
662
15.5M
        default:
663
15.5M
          ptr += MINBPC(enc);
664
15.5M
          break;
665
15.8M
        }
666
15.8M
      }
667
1.27M
      ptr += MINBPC(enc);
668
1.27M
      REQUIRE_CHAR(enc, ptr, end);
669
1.27M
      switch (BYTE_TYPE(enc, ptr)) {
670
631k
      case BT_S:
671
1.19M
      case BT_CR:
672
1.23M
      case BT_LF:
673
1.23M
        break;
674
28.8k
      case BT_SOL:
675
28.8k
        goto sol;
676
3.36k
      case BT_GT:
677
3.36k
        goto gt;
678
3
      default:
679
3
        *nextTokPtr = ptr;
680
3
        return XML_TOK_INVALID;
681
1.27M
      }
682
      /* ptr points to closing quote */
683
1.36M
      for (;;) {
684
1.36M
        ptr += MINBPC(enc);
685
1.36M
        REQUIRE_CHAR(enc, ptr, end);
686
1.36M
        switch (BYTE_TYPE(enc, ptr)) {
687
1.22M
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
688
84.9k
        case BT_S:
689
106k
        case BT_CR:
690
124k
        case BT_LF:
691
124k
          continue;
692
627
        case BT_GT:
693
3.98k
        gt:
694
3.98k
          *nextTokPtr = ptr + MINBPC(enc);
695
3.98k
          return XML_TOK_START_TAG_WITH_ATTS;
696
11.3k
        case BT_SOL:
697
40.2k
        sol:
698
40.2k
          ptr += MINBPC(enc);
699
40.2k
          REQUIRE_CHAR(enc, ptr, end);
700
40.2k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
701
6
            *nextTokPtr = ptr;
702
6
            return XML_TOK_INVALID;
703
6
          }
704
40.2k
          *nextTokPtr = ptr + MINBPC(enc);
705
40.2k
          return XML_TOK_EMPTY_ELEMENT_WITH_ATTS;
706
4
        default:
707
4
          *nextTokPtr = ptr;
708
4
          return XML_TOK_INVALID;
709
1.36M
        }
710
1.22M
        break;
711
1.36M
      }
712
1.22M
      break;
713
1.23M
    }
714
1.22M
    default:
715
16
      *nextTokPtr = ptr;
716
16
      return XML_TOK_INVALID;
717
1.61M
    }
718
1.61M
  }
719
66
  return XML_TOK_PARTIAL;
720
44.7k
}
xmltok.c:normal_scanAtts
Line
Count
Source
573
44.7k
                 const char **nextTokPtr) {
574
#  ifdef XML_NS
575
  int hadColon = 0;
576
#  endif
577
1.61M
  while (HAS_CHAR(enc, ptr, end)) {
578
1.61M
    switch (BYTE_TYPE(enc, ptr)) {
579
1.16M
      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.43k
    case BT_S:
598
14.3k
    case BT_CR:
599
17.3k
    case BT_LF:
600
36.8k
      for (;;) {
601
36.8k
        int t;
602
603
36.8k
        ptr += MINBPC(enc);
604
36.8k
        REQUIRE_CHAR(enc, ptr, end);
605
36.7k
        t = BYTE_TYPE(enc, ptr);
606
36.7k
        if (t == BT_EQUALS)
607
17.2k
          break;
608
19.5k
        switch (t) {
609
3.45k
        case BT_S:
610
7.36k
        case BT_LF:
611
19.5k
        case BT_CR:
612
19.5k
          break;
613
11
        default:
614
11
          *nextTokPtr = ptr;
615
11
          return XML_TOK_INVALID;
616
19.5k
        }
617
19.5k
      }
618
      /* fall through */
619
1.27M
    case BT_EQUALS: {
620
1.27M
      int open;
621
#  ifdef XML_NS
622
      hadColon = 0;
623
#  endif
624
1.32M
      for (;;) {
625
1.32M
        ptr += MINBPC(enc);
626
1.32M
        REQUIRE_CHAR(enc, ptr, end);
627
1.32M
        open = BYTE_TYPE(enc, ptr);
628
1.32M
        if (open == BT_QUOT || open == BT_APOS)
629
1.27M
          break;
630
54.8k
        switch (open) {
631
11.1k
        case BT_S:
632
22.5k
        case BT_LF:
633
54.8k
        case BT_CR:
634
54.8k
          break;
635
13
        default:
636
13
          *nextTokPtr = ptr;
637
13
          return XML_TOK_INVALID;
638
54.8k
        }
639
54.8k
      }
640
1.27M
      ptr += MINBPC(enc);
641
      /* in attribute value */
642
17.0M
      for (;;) {
643
17.0M
        int t;
644
17.0M
        REQUIRE_CHAR(enc, ptr, end);
645
17.0M
        t = BYTE_TYPE(enc, ptr);
646
17.0M
        if (t == open)
647
1.27M
          break;
648
15.8M
        switch (t) {
649
321k
          INVALID_CASES(ptr, nextTokPtr)
650
147k
        case BT_AMP: {
651
147k
          int tok = PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, &ptr);
652
147k
          if (tok <= 0) {
653
22
            if (tok == XML_TOK_INVALID)
654
12
              *nextTokPtr = ptr;
655
22
            return tok;
656
22
          }
657
147k
          break;
658
147k
        }
659
147k
        case BT_LT:
660
6
          *nextTokPtr = ptr;
661
6
          return XML_TOK_INVALID;
662
15.5M
        default:
663
15.5M
          ptr += MINBPC(enc);
664
15.5M
          break;
665
15.8M
        }
666
15.8M
      }
667
1.27M
      ptr += MINBPC(enc);
668
1.27M
      REQUIRE_CHAR(enc, ptr, end);
669
1.27M
      switch (BYTE_TYPE(enc, ptr)) {
670
631k
      case BT_S:
671
1.19M
      case BT_CR:
672
1.23M
      case BT_LF:
673
1.23M
        break;
674
28.8k
      case BT_SOL:
675
28.8k
        goto sol;
676
3.36k
      case BT_GT:
677
3.36k
        goto gt;
678
3
      default:
679
3
        *nextTokPtr = ptr;
680
3
        return XML_TOK_INVALID;
681
1.27M
      }
682
      /* ptr points to closing quote */
683
1.36M
      for (;;) {
684
1.36M
        ptr += MINBPC(enc);
685
1.36M
        REQUIRE_CHAR(enc, ptr, end);
686
1.36M
        switch (BYTE_TYPE(enc, ptr)) {
687
1.22M
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
688
84.9k
        case BT_S:
689
106k
        case BT_CR:
690
124k
        case BT_LF:
691
124k
          continue;
692
627
        case BT_GT:
693
3.98k
        gt:
694
3.98k
          *nextTokPtr = ptr + MINBPC(enc);
695
3.98k
          return XML_TOK_START_TAG_WITH_ATTS;
696
11.3k
        case BT_SOL:
697
40.2k
        sol:
698
40.2k
          ptr += MINBPC(enc);
699
40.2k
          REQUIRE_CHAR(enc, ptr, end);
700
40.2k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
701
6
            *nextTokPtr = ptr;
702
6
            return XML_TOK_INVALID;
703
6
          }
704
40.2k
          *nextTokPtr = ptr + MINBPC(enc);
705
40.2k
          return XML_TOK_EMPTY_ELEMENT_WITH_ATTS;
706
4
        default:
707
4
          *nextTokPtr = ptr;
708
4
          return XML_TOK_INVALID;
709
1.36M
        }
710
1.22M
        break;
711
1.36M
      }
712
1.22M
      break;
713
1.23M
    }
714
1.22M
    default:
715
16
      *nextTokPtr = ptr;
716
16
      return XML_TOK_INVALID;
717
1.61M
    }
718
1.61M
  }
719
66
  return XML_TOK_PARTIAL;
720
44.7k
}
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
458k
               const char **nextTokPtr) {
727
#  ifdef XML_NS
728
  int hadColon;
729
#  endif
730
458k
  REQUIRE_CHAR(enc, ptr, end);
731
458k
  switch (BYTE_TYPE(enc, ptr)) {
732
308k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
733
21.2k
  case BT_EXCL:
734
21.2k
    ptr += MINBPC(enc);
735
21.2k
    REQUIRE_CHAR(enc, ptr, end);
736
21.2k
    switch (BYTE_TYPE(enc, ptr)) {
737
17.6k
    case BT_MINUS:
738
17.6k
      return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
739
3.65k
    case BT_LSQB:
740
3.65k
      return PREFIX(scanCdataSection)(enc, ptr + MINBPC(enc), end, nextTokPtr);
741
21.2k
    }
742
1
    *nextTokPtr = ptr;
743
1
    return XML_TOK_INVALID;
744
25.8k
  case BT_QUEST:
745
25.8k
    return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
746
68.0k
  case BT_SOL:
747
68.0k
    return PREFIX(scanEndTag)(enc, ptr + MINBPC(enc), end, nextTokPtr);
748
7
  default:
749
7
    *nextTokPtr = ptr;
750
7
    return XML_TOK_INVALID;
751
458k
  }
752
#  ifdef XML_NS
753
  hadColon = 0;
754
#  endif
755
  /* we have a start-tag */
756
8.02M
  while (HAS_CHAR(enc, ptr, end)) {
757
8.02M
    switch (BYTE_TYPE(enc, ptr)) {
758
30.1M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
759
#  ifdef XML_NS
760
    case BT_COLON:
761
      if (hadColon) {
762
        *nextTokPtr = ptr;
763
        return XML_TOK_INVALID;
764
      }
765
      hadColon = 1;
766
      ptr += MINBPC(enc);
767
      REQUIRE_CHAR(enc, ptr, end);
768
      switch (BYTE_TYPE(enc, ptr)) {
769
        CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
770
      default:
771
        *nextTokPtr = ptr;
772
        return XML_TOK_INVALID;
773
      }
774
      break;
775
#  endif
776
35.9k
    case BT_S:
777
49.9k
    case BT_CR:
778
55.6k
    case BT_LF: {
779
55.6k
      ptr += MINBPC(enc);
780
79.7k
      while (HAS_CHAR(enc, ptr, end)) {
781
79.7k
        switch (BYTE_TYPE(enc, ptr)) {
782
41.0k
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
783
651
        case BT_GT:
784
651
          goto gt;
785
10.1k
        case BT_SOL:
786
10.1k
          goto sol;
787
2.62k
        case BT_S:
788
23.1k
        case BT_CR:
789
24.1k
        case BT_LF:
790
24.1k
          ptr += MINBPC(enc);
791
24.1k
          continue;
792
15
        default:
793
15
          *nextTokPtr = ptr;
794
15
          return XML_TOK_INVALID;
795
79.7k
        }
796
44.7k
        return PREFIX(scanAtts)(enc, ptr, end, nextTokPtr);
797
79.7k
      }
798
42
      return XML_TOK_PARTIAL;
799
55.6k
    }
800
241k
    case BT_GT:
801
242k
    gt:
802
242k
      *nextTokPtr = ptr + MINBPC(enc);
803
242k
      return XML_TOK_START_TAG_NO_ATTS;
804
45.5k
    case BT_SOL:
805
55.7k
    sol:
806
55.7k
      ptr += MINBPC(enc);
807
55.7k
      REQUIRE_CHAR(enc, ptr, end);
808
55.7k
      if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
809
16
        *nextTokPtr = ptr;
810
16
        return XML_TOK_INVALID;
811
16
      }
812
55.6k
      *nextTokPtr = ptr + MINBPC(enc);
813
55.6k
      return XML_TOK_EMPTY_ELEMENT_NO_ATTS;
814
11
    default:
815
11
      *nextTokPtr = ptr;
816
11
      return XML_TOK_INVALID;
817
8.02M
    }
818
8.02M
  }
819
108
  return XML_TOK_PARTIAL;
820
342k
}
xmltok.c:normal_scanLt
Line
Count
Source
726
458k
               const char **nextTokPtr) {
727
#  ifdef XML_NS
728
  int hadColon;
729
#  endif
730
458k
  REQUIRE_CHAR(enc, ptr, end);
731
458k
  switch (BYTE_TYPE(enc, ptr)) {
732
308k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
733
21.2k
  case BT_EXCL:
734
21.2k
    ptr += MINBPC(enc);
735
21.2k
    REQUIRE_CHAR(enc, ptr, end);
736
21.2k
    switch (BYTE_TYPE(enc, ptr)) {
737
17.6k
    case BT_MINUS:
738
17.6k
      return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
739
3.65k
    case BT_LSQB:
740
3.65k
      return PREFIX(scanCdataSection)(enc, ptr + MINBPC(enc), end, nextTokPtr);
741
21.2k
    }
742
1
    *nextTokPtr = ptr;
743
1
    return XML_TOK_INVALID;
744
25.8k
  case BT_QUEST:
745
25.8k
    return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
746
68.0k
  case BT_SOL:
747
68.0k
    return PREFIX(scanEndTag)(enc, ptr + MINBPC(enc), end, nextTokPtr);
748
7
  default:
749
7
    *nextTokPtr = ptr;
750
7
    return XML_TOK_INVALID;
751
458k
  }
752
#  ifdef XML_NS
753
  hadColon = 0;
754
#  endif
755
  /* we have a start-tag */
756
8.02M
  while (HAS_CHAR(enc, ptr, end)) {
757
8.02M
    switch (BYTE_TYPE(enc, ptr)) {
758
30.1M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
759
#  ifdef XML_NS
760
    case BT_COLON:
761
      if (hadColon) {
762
        *nextTokPtr = ptr;
763
        return XML_TOK_INVALID;
764
      }
765
      hadColon = 1;
766
      ptr += MINBPC(enc);
767
      REQUIRE_CHAR(enc, ptr, end);
768
      switch (BYTE_TYPE(enc, ptr)) {
769
        CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
770
      default:
771
        *nextTokPtr = ptr;
772
        return XML_TOK_INVALID;
773
      }
774
      break;
775
#  endif
776
35.9k
    case BT_S:
777
49.9k
    case BT_CR:
778
55.6k
    case BT_LF: {
779
55.6k
      ptr += MINBPC(enc);
780
79.7k
      while (HAS_CHAR(enc, ptr, end)) {
781
79.7k
        switch (BYTE_TYPE(enc, ptr)) {
782
41.0k
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
783
651
        case BT_GT:
784
651
          goto gt;
785
10.1k
        case BT_SOL:
786
10.1k
          goto sol;
787
2.62k
        case BT_S:
788
23.1k
        case BT_CR:
789
24.1k
        case BT_LF:
790
24.1k
          ptr += MINBPC(enc);
791
24.1k
          continue;
792
15
        default:
793
15
          *nextTokPtr = ptr;
794
15
          return XML_TOK_INVALID;
795
79.7k
        }
796
44.7k
        return PREFIX(scanAtts)(enc, ptr, end, nextTokPtr);
797
79.7k
      }
798
42
      return XML_TOK_PARTIAL;
799
55.6k
    }
800
241k
    case BT_GT:
801
242k
    gt:
802
242k
      *nextTokPtr = ptr + MINBPC(enc);
803
242k
      return XML_TOK_START_TAG_NO_ATTS;
804
45.5k
    case BT_SOL:
805
55.7k
    sol:
806
55.7k
      ptr += MINBPC(enc);
807
55.7k
      REQUIRE_CHAR(enc, ptr, end);
808
55.7k
      if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
809
16
        *nextTokPtr = ptr;
810
16
        return XML_TOK_INVALID;
811
16
      }
812
55.6k
      *nextTokPtr = ptr + MINBPC(enc);
813
55.6k
      return XML_TOK_EMPTY_ELEMENT_NO_ATTS;
814
11
    default:
815
11
      *nextTokPtr = ptr;
816
11
      return XML_TOK_INVALID;
817
8.02M
    }
818
8.02M
  }
819
108
  return XML_TOK_PARTIAL;
820
342k
}
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.69M
                   const char **nextTokPtr) {
825
3.69M
  if (ptr >= end)
826
4.34k
    return XML_TOK_NONE;
827
3.68M
  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.68M
  switch (BYTE_TYPE(enc, ptr)) {
837
458k
  case BT_LT:
838
458k
    return PREFIX(scanLt)(enc, ptr + MINBPC(enc), end, nextTokPtr);
839
39.1k
  case BT_AMP:
840
39.1k
    return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
841
1.36M
  case BT_CR:
842
1.36M
    ptr += MINBPC(enc);
843
1.36M
    if (! HAS_CHAR(enc, ptr, end))
844
20
      return XML_TOK_TRAILING_CR;
845
1.36M
    if (BYTE_TYPE(enc, ptr) == BT_LF)
846
277k
      ptr += MINBPC(enc);
847
1.36M
    *nextTokPtr = ptr;
848
1.36M
    return XML_TOK_DATA_NEWLINE;
849
993k
  case BT_LF:
850
993k
    *nextTokPtr = ptr + MINBPC(enc);
851
993k
    return XML_TOK_DATA_NEWLINE;
852
48.5k
  case BT_RSQB:
853
48.5k
    ptr += MINBPC(enc);
854
48.5k
    if (! HAS_CHAR(enc, ptr, end))
855
8
      return XML_TOK_TRAILING_RSQB;
856
48.5k
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
857
14.1k
      break;
858
34.3k
    ptr += MINBPC(enc);
859
34.3k
    if (! HAS_CHAR(enc, ptr, end))
860
2
      return XML_TOK_TRAILING_RSQB;
861
34.3k
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
862
34.3k
      ptr -= MINBPC(enc);
863
34.3k
      break;
864
34.3k
    }
865
1
    *nextTokPtr = ptr;
866
1
    return XML_TOK_INVALID;
867
250k
    INVALID_CASES(ptr, nextTokPtr)
868
652k
  default:
869
652k
    ptr += MINBPC(enc);
870
652k
    break;
871
3.68M
  }
872
18.2M
  while (HAS_CHAR(enc, ptr, end)) {
873
18.2M
    switch (BYTE_TYPE(enc, ptr)) {
874
0
#  define LEAD_CASE(n)                                                         \
875
140k
  case BT_LEAD##n:                                                             \
876
140k
    if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) {                       \
877
24
      *nextTokPtr = ptr;                                                       \
878
24
      return XML_TOK_DATA_CHARS;                                               \
879
24
    }                                                                          \
880
140k
    ptr += n;                                                                  \
881
140k
    break;
882
81.8k
      LEAD_CASE(2)
883
22.0k
      LEAD_CASE(3)
884
36.6k
      LEAD_CASE(4)
885
0
#  undef LEAD_CASE
886
290k
    case BT_RSQB:
887
290k
      if (HAS_CHARS(enc, ptr, end, 2)) {
888
290k
        if (! CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_RSQB)) {
889
102k
          ptr += MINBPC(enc);
890
102k
          break;
891
102k
        }
892
188k
        if (HAS_CHARS(enc, ptr, end, 3)) {
893
188k
          if (! CHAR_MATCHES(enc, ptr + 2 * MINBPC(enc), ASCII_GT)) {
894
188k
            ptr += MINBPC(enc);
895
188k
            break;
896
188k
          }
897
3
          *nextTokPtr = ptr + 2 * MINBPC(enc);
898
3
          return XML_TOK_INVALID;
899
188k
        }
900
188k
      }
901
      /* fall through */
902
23.4k
    case BT_AMP:
903
158k
    case BT_LT:
904
158k
    case BT_NONXML:
905
158k
    case BT_MALFORM:
906
158k
    case BT_TRAIL:
907
511k
    case BT_CR:
908
823k
    case BT_LF:
909
823k
      *nextTokPtr = ptr;
910
823k
      return XML_TOK_DATA_CHARS;
911
16.9M
    default:
912
16.9M
      ptr += MINBPC(enc);
913
16.9M
      break;
914
18.2M
    }
915
18.2M
  }
916
2.96k
  *nextTokPtr = ptr;
917
2.96k
  return XML_TOK_DATA_CHARS;
918
826k
}
xmltok.c:normal_contentTok
Line
Count
Source
824
3.69M
                   const char **nextTokPtr) {
825
3.69M
  if (ptr >= end)
826
4.34k
    return XML_TOK_NONE;
827
3.68M
  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.68M
  switch (BYTE_TYPE(enc, ptr)) {
837
458k
  case BT_LT:
838
458k
    return PREFIX(scanLt)(enc, ptr + MINBPC(enc), end, nextTokPtr);
839
39.1k
  case BT_AMP:
840
39.1k
    return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
841
1.36M
  case BT_CR:
842
1.36M
    ptr += MINBPC(enc);
843
1.36M
    if (! HAS_CHAR(enc, ptr, end))
844
20
      return XML_TOK_TRAILING_CR;
845
1.36M
    if (BYTE_TYPE(enc, ptr) == BT_LF)
846
277k
      ptr += MINBPC(enc);
847
1.36M
    *nextTokPtr = ptr;
848
1.36M
    return XML_TOK_DATA_NEWLINE;
849
993k
  case BT_LF:
850
993k
    *nextTokPtr = ptr + MINBPC(enc);
851
993k
    return XML_TOK_DATA_NEWLINE;
852
48.5k
  case BT_RSQB:
853
48.5k
    ptr += MINBPC(enc);
854
48.5k
    if (! HAS_CHAR(enc, ptr, end))
855
8
      return XML_TOK_TRAILING_RSQB;
856
48.5k
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
857
14.1k
      break;
858
34.3k
    ptr += MINBPC(enc);
859
34.3k
    if (! HAS_CHAR(enc, ptr, end))
860
2
      return XML_TOK_TRAILING_RSQB;
861
34.3k
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
862
34.3k
      ptr -= MINBPC(enc);
863
34.3k
      break;
864
34.3k
    }
865
1
    *nextTokPtr = ptr;
866
1
    return XML_TOK_INVALID;
867
250k
    INVALID_CASES(ptr, nextTokPtr)
868
652k
  default:
869
652k
    ptr += MINBPC(enc);
870
652k
    break;
871
3.68M
  }
872
18.2M
  while (HAS_CHAR(enc, ptr, end)) {
873
18.2M
    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
81.8k
      LEAD_CASE(2)
883
22.0k
      LEAD_CASE(3)
884
36.6k
      LEAD_CASE(4)
885
0
#  undef LEAD_CASE
886
290k
    case BT_RSQB:
887
290k
      if (HAS_CHARS(enc, ptr, end, 2)) {
888
290k
        if (! CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_RSQB)) {
889
102k
          ptr += MINBPC(enc);
890
102k
          break;
891
102k
        }
892
188k
        if (HAS_CHARS(enc, ptr, end, 3)) {
893
188k
          if (! CHAR_MATCHES(enc, ptr + 2 * MINBPC(enc), ASCII_GT)) {
894
188k
            ptr += MINBPC(enc);
895
188k
            break;
896
188k
          }
897
3
          *nextTokPtr = ptr + 2 * MINBPC(enc);
898
3
          return XML_TOK_INVALID;
899
188k
        }
900
188k
      }
901
      /* fall through */
902
23.4k
    case BT_AMP:
903
158k
    case BT_LT:
904
158k
    case BT_NONXML:
905
158k
    case BT_MALFORM:
906
158k
    case BT_TRAIL:
907
511k
    case BT_CR:
908
823k
    case BT_LF:
909
823k
      *nextTokPtr = ptr;
910
823k
      return XML_TOK_DATA_CHARS;
911
16.9M
    default:
912
16.9M
      ptr += MINBPC(enc);
913
16.9M
      break;
914
18.2M
    }
915
18.2M
  }
916
2.96k
  *nextTokPtr = ptr;
917
2.96k
  return XML_TOK_DATA_CHARS;
918
826k
}
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
176k
                    const char **nextTokPtr) {
925
176k
  REQUIRE_CHAR(enc, ptr, end);
926
176k
  switch (BYTE_TYPE(enc, ptr)) {
927
345k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
928
679
  case BT_S:
929
1.32k
  case BT_LF:
930
1.93k
  case BT_CR:
931
1.93k
  case BT_PERCNT:
932
1.93k
    *nextTokPtr = ptr;
933
1.93k
    return XML_TOK_PERCENT;
934
2
  default:
935
2
    *nextTokPtr = ptr;
936
2
    return XML_TOK_INVALID;
937
176k
  }
938
2.11M
  while (HAS_CHAR(enc, ptr, end)) {
939
2.11M
    switch (BYTE_TYPE(enc, ptr)) {
940
6.12M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
941
174k
    case BT_SEMI:
942
174k
      *nextTokPtr = ptr + MINBPC(enc);
943
174k
      return XML_TOK_PARAM_ENTITY_REF;
944
17
    default:
945
17
      *nextTokPtr = ptr;
946
17
      return XML_TOK_INVALID;
947
2.11M
    }
948
2.11M
  }
949
70
  return XML_TOK_PARTIAL;
950
174k
}
xmltok.c:normal_scanPercent
Line
Count
Source
924
176k
                    const char **nextTokPtr) {
925
176k
  REQUIRE_CHAR(enc, ptr, end);
926
176k
  switch (BYTE_TYPE(enc, ptr)) {
927
345k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
928
679
  case BT_S:
929
1.32k
  case BT_LF:
930
1.93k
  case BT_CR:
931
1.93k
  case BT_PERCNT:
932
1.93k
    *nextTokPtr = ptr;
933
1.93k
    return XML_TOK_PERCENT;
934
2
  default:
935
2
    *nextTokPtr = ptr;
936
2
    return XML_TOK_INVALID;
937
176k
  }
938
2.11M
  while (HAS_CHAR(enc, ptr, end)) {
939
2.11M
    switch (BYTE_TYPE(enc, ptr)) {
940
6.12M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
941
174k
    case BT_SEMI:
942
174k
      *nextTokPtr = ptr + MINBPC(enc);
943
174k
      return XML_TOK_PARAM_ENTITY_REF;
944
17
    default:
945
17
      *nextTokPtr = ptr;
946
17
      return XML_TOK_INVALID;
947
2.11M
    }
948
2.11M
  }
949
70
  return XML_TOK_PARTIAL;
950
174k
}
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
107k
                      const char **nextTokPtr) {
955
107k
  REQUIRE_CHAR(enc, ptr, end);
956
107k
  switch (BYTE_TYPE(enc, ptr)) {
957
107k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
958
3
  default:
959
3
    *nextTokPtr = ptr;
960
3
    return XML_TOK_INVALID;
961
107k
  }
962
858k
  while (HAS_CHAR(enc, ptr, end)) {
963
858k
    switch (BYTE_TYPE(enc, ptr)) {
964
2.70M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
965
81.6k
    case BT_CR:
966
103k
    case BT_LF:
967
104k
    case BT_S:
968
104k
    case BT_RPAR:
969
107k
    case BT_GT:
970
107k
    case BT_PERCNT:
971
107k
    case BT_VERBAR:
972
107k
      *nextTokPtr = ptr;
973
107k
      return XML_TOK_POUND_NAME;
974
28
    default:
975
28
      *nextTokPtr = ptr;
976
28
      return XML_TOK_INVALID;
977
858k
    }
978
858k
  }
979
202
  return -XML_TOK_POUND_NAME;
980
107k
}
xmltok.c:normal_scanPoundName
Line
Count
Source
954
107k
                      const char **nextTokPtr) {
955
107k
  REQUIRE_CHAR(enc, ptr, end);
956
107k
  switch (BYTE_TYPE(enc, ptr)) {
957
107k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
958
3
  default:
959
3
    *nextTokPtr = ptr;
960
3
    return XML_TOK_INVALID;
961
107k
  }
962
858k
  while (HAS_CHAR(enc, ptr, end)) {
963
858k
    switch (BYTE_TYPE(enc, ptr)) {
964
2.70M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
965
81.6k
    case BT_CR:
966
103k
    case BT_LF:
967
104k
    case BT_S:
968
104k
    case BT_RPAR:
969
107k
    case BT_GT:
970
107k
    case BT_PERCNT:
971
107k
    case BT_VERBAR:
972
107k
      *nextTokPtr = ptr;
973
107k
      return XML_TOK_POUND_NAME;
974
28
    default:
975
28
      *nextTokPtr = ptr;
976
28
      return XML_TOK_INVALID;
977
858k
    }
978
858k
  }
979
202
  return -XML_TOK_POUND_NAME;
980
107k
}
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
58.1k
                const char **nextTokPtr) {
985
5.87M
  while (HAS_CHAR(enc, ptr, end)) {
986
5.87M
    int t = BYTE_TYPE(enc, ptr);
987
5.87M
    switch (t) {
988
91.4k
      INVALID_CASES(ptr, nextTokPtr)
989
8.76k
    case BT_QUOT:
990
60.5k
    case BT_APOS:
991
60.5k
      ptr += MINBPC(enc);
992
60.5k
      if (t != open)
993
2.47k
        break;
994
58.0k
      if (! HAS_CHAR(enc, ptr, end))
995
415
        return -XML_TOK_LITERAL;
996
57.6k
      *nextTokPtr = ptr;
997
57.6k
      switch (BYTE_TYPE(enc, ptr)) {
998
6.51k
      case BT_S:
999
9.31k
      case BT_CR:
1000
17.6k
      case BT_LF:
1001
57.2k
      case BT_GT:
1002
57.2k
      case BT_PERCNT:
1003
57.6k
      case BT_LSQB:
1004
57.6k
        return XML_TOK_LITERAL;
1005
18
      default:
1006
18
        return XML_TOK_INVALID;
1007
57.6k
      }
1008
5.77M
    default:
1009
5.77M
      ptr += MINBPC(enc);
1010
5.77M
      break;
1011
5.87M
    }
1012
5.87M
  }
1013
72
  return XML_TOK_PARTIAL;
1014
58.1k
}
xmltok.c:normal_scanLit
Line
Count
Source
984
58.1k
                const char **nextTokPtr) {
985
5.87M
  while (HAS_CHAR(enc, ptr, end)) {
986
5.87M
    int t = BYTE_TYPE(enc, ptr);
987
5.87M
    switch (t) {
988
91.4k
      INVALID_CASES(ptr, nextTokPtr)
989
8.76k
    case BT_QUOT:
990
60.5k
    case BT_APOS:
991
60.5k
      ptr += MINBPC(enc);
992
60.5k
      if (t != open)
993
2.47k
        break;
994
58.0k
      if (! HAS_CHAR(enc, ptr, end))
995
415
        return -XML_TOK_LITERAL;
996
57.6k
      *nextTokPtr = ptr;
997
57.6k
      switch (BYTE_TYPE(enc, ptr)) {
998
6.51k
      case BT_S:
999
9.31k
      case BT_CR:
1000
17.6k
      case BT_LF:
1001
57.2k
      case BT_GT:
1002
57.2k
      case BT_PERCNT:
1003
57.6k
      case BT_LSQB:
1004
57.6k
        return XML_TOK_LITERAL;
1005
18
      default:
1006
18
        return XML_TOK_INVALID;
1007
57.6k
      }
1008
5.77M
    default:
1009
5.77M
      ptr += MINBPC(enc);
1010
5.77M
      break;
1011
5.87M
    }
1012
5.87M
  }
1013
72
  return XML_TOK_PARTIAL;
1014
58.1k
}
Unexecuted instantiation: xmltok.c:little2_scanLit
Unexecuted instantiation: xmltok.c:big2_scanLit
1015
1016
static int PTRCALL
1017
PREFIX(prologTok)(const ENCODING *enc, const char *ptr, const char *end,
1018
5.80M
                  const char **nextTokPtr) {
1019
5.80M
  int tok;
1020
5.80M
  if (ptr >= end)
1021
8.49k
    return XML_TOK_NONE;
1022
5.79M
  if (MINBPC(enc) > 1) {
1023
211
    size_t n = end - ptr;
1024
211
    if (n & (MINBPC(enc) - 1)) {
1025
51
      n &= ~(MINBPC(enc) - 1);
1026
51
      if (n == 0)
1027
4
        return XML_TOK_PARTIAL;
1028
47
      end = ptr + n;
1029
47
    }
1030
211
  }
1031
5.79M
  switch (BYTE_TYPE(enc, ptr)) {
1032
6.84k
  case BT_QUOT:
1033
6.84k
    return PREFIX(scanLit)(BT_QUOT, enc, ptr + MINBPC(enc), end, nextTokPtr);
1034
51.3k
  case BT_APOS:
1035
51.3k
    return PREFIX(scanLit)(BT_APOS, enc, ptr + MINBPC(enc), end, nextTokPtr);
1036
102k
  case BT_LT: {
1037
102k
    ptr += MINBPC(enc);
1038
102k
    REQUIRE_CHAR(enc, ptr, end);
1039
102k
    switch (BYTE_TYPE(enc, ptr)) {
1040
75.1k
    case BT_EXCL:
1041
75.1k
      return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1042
21.3k
    case BT_QUEST:
1043
21.3k
      return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1044
4.62k
    case BT_NMSTRT:
1045
5.69k
    case BT_HEX:
1046
5.69k
    case BT_NONASCII:
1047
5.72k
    case BT_LEAD2:
1048
5.74k
    case BT_LEAD3:
1049
5.75k
    case BT_LEAD4:
1050
5.75k
      *nextTokPtr = ptr - MINBPC(enc);
1051
5.75k
      return XML_TOK_INSTANCE_START;
1052
102k
    }
1053
22
    *nextTokPtr = ptr;
1054
22
    return XML_TOK_INVALID;
1055
102k
  }
1056
308k
  case BT_CR:
1057
308k
    if (ptr + MINBPC(enc) == end) {
1058
330
      *nextTokPtr = end;
1059
      /* indicate that this might be part of a CR/LF pair */
1060
330
      return -XML_TOK_PROLOG_S;
1061
330
    }
1062
    /* fall through */
1063
600k
  case BT_S:
1064
670k
  case BT_LF:
1065
698k
    for (;;) {
1066
698k
      ptr += MINBPC(enc);
1067
698k
      if (! HAS_CHAR(enc, ptr, end))
1068
198
        break;
1069
698k
      switch (BYTE_TYPE(enc, ptr)) {
1070
7.94k
      case BT_S:
1071
23.7k
      case BT_LF:
1072
23.7k
        break;
1073
4.25k
      case BT_CR:
1074
        /* don't split CR/LF pair */
1075
4.25k
        if (ptr + MINBPC(enc) != end)
1076
4.10k
          break;
1077
        /* fall through */
1078
670k
      default:
1079
670k
        *nextTokPtr = ptr;
1080
670k
        return XML_TOK_PROLOG_S;
1081
698k
      }
1082
698k
    }
1083
198
    *nextTokPtr = ptr;
1084
198
    return XML_TOK_PROLOG_S;
1085
176k
  case BT_PERCNT:
1086
176k
    return PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1087
4.30k
  case BT_COMMA:
1088
4.30k
    *nextTokPtr = ptr + MINBPC(enc);
1089
4.30k
    return XML_TOK_COMMA;
1090
2.63k
  case BT_LSQB:
1091
2.63k
    *nextTokPtr = ptr + MINBPC(enc);
1092
2.63k
    return XML_TOK_OPEN_BRACKET;
1093
1.42k
  case BT_RSQB:
1094
1.42k
    ptr += MINBPC(enc);
1095
1.42k
    if (! HAS_CHAR(enc, ptr, end))
1096
3
      return -XML_TOK_CLOSE_BRACKET;
1097
1.42k
    if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) {
1098
19
      REQUIRE_CHARS(enc, ptr, end, 2);
1099
17
      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
17
    }
1104
1.42k
    *nextTokPtr = ptr;
1105
1.42k
    return XML_TOK_CLOSE_BRACKET;
1106
3.75M
  case BT_LPAR:
1107
3.75M
    *nextTokPtr = ptr + MINBPC(enc);
1108
3.75M
    return XML_TOK_OPEN_PAREN;
1109
141k
  case BT_RPAR:
1110
141k
    ptr += MINBPC(enc);
1111
141k
    if (! HAS_CHAR(enc, ptr, end))
1112
87
      return -XML_TOK_CLOSE_PAREN;
1113
140k
    switch (BYTE_TYPE(enc, ptr)) {
1114
5.13k
    case BT_AST:
1115
5.13k
      *nextTokPtr = ptr + MINBPC(enc);
1116
5.13k
      return XML_TOK_CLOSE_PAREN_ASTERISK;
1117
4.35k
    case BT_QUEST:
1118
4.35k
      *nextTokPtr = ptr + MINBPC(enc);
1119
4.35k
      return XML_TOK_CLOSE_PAREN_QUESTION;
1120
4.17k
    case BT_PLUS:
1121
4.17k
      *nextTokPtr = ptr + MINBPC(enc);
1122
4.17k
      return XML_TOK_CLOSE_PAREN_PLUS;
1123
23.9k
    case BT_CR:
1124
24.4k
    case BT_LF:
1125
105k
    case BT_S:
1126
107k
    case BT_GT:
1127
107k
    case BT_COMMA:
1128
112k
    case BT_VERBAR:
1129
127k
    case BT_RPAR:
1130
127k
      *nextTokPtr = ptr;
1131
127k
      return XML_TOK_CLOSE_PAREN;
1132
140k
    }
1133
10
    *nextTokPtr = ptr;
1134
10
    return XML_TOK_INVALID;
1135
163k
  case BT_VERBAR:
1136
163k
    *nextTokPtr = ptr + MINBPC(enc);
1137
163k
    return XML_TOK_OR;
1138
69.8k
  case BT_GT:
1139
69.8k
    *nextTokPtr = ptr + MINBPC(enc);
1140
69.8k
    return XML_TOK_DECL_CLOSE;
1141
107k
  case BT_NUM:
1142
107k
    return PREFIX(scanPoundName)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1143
0
#  define LEAD_CASE(n)                                                         \
1144
115k
  case BT_LEAD##n:                                                             \
1145
115k
    if (end - ptr < n)                                                         \
1146
69
      return XML_TOK_PARTIAL_CHAR;                                             \
1147
115k
    if (IS_INVALID_CHAR(enc, ptr, n)) {                                        \
1148
71
      *nextTokPtr = ptr;                                                       \
1149
71
      return XML_TOK_INVALID;                                                  \
1150
71
    }                                                                          \
1151
115k
    if (IS_NMSTRT_CHAR(enc, ptr, n)) {                                         \
1152
12.6k
      ptr += n;                                                                \
1153
12.6k
      tok = XML_TOK_NAME;                                                      \
1154
12.6k
      break;                                                                   \
1155
12.6k
    }                                                                          \
1156
115k
    if (IS_NAME_CHAR(enc, ptr, n)) {                                           \
1157
103k
      ptr += n;                                                                \
1158
103k
      tok = XML_TOK_NMTOKEN;                                                   \
1159
103k
      break;                                                                   \
1160
103k
    }                                                                          \
1161
103k
    *nextTokPtr = ptr;                                                         \
1162
69
    return XML_TOK_INVALID;
1163
435k
    LEAD_CASE(2)
1164
14.7k
    LEAD_CASE(3)
1165
268
    LEAD_CASE(4)
1166
0
#  undef LEAD_CASE
1167
256k
  case BT_NMSTRT:
1168
424k
  case BT_HEX:
1169
424k
    tok = XML_TOK_NAME;
1170
424k
    ptr += MINBPC(enc);
1171
424k
    break;
1172
904
  case BT_DIGIT:
1173
1.33k
  case BT_NAME:
1174
1.74k
  case BT_MINUS:
1175
#  ifdef XML_NS
1176
  case BT_COLON:
1177
#  endif
1178
1.74k
    tok = XML_TOK_NMTOKEN;
1179
1.74k
    ptr += MINBPC(enc);
1180
1.74k
    break;
1181
163
  case BT_NONASCII:
1182
163
    if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {
1183
130
      ptr += MINBPC(enc);
1184
130
      tok = XML_TOK_NAME;
1185
130
      break;
1186
130
    }
1187
33
    if (IS_NAME_CHAR_MINBPC(enc, ptr)) {
1188
14
      ptr += MINBPC(enc);
1189
14
      tok = XML_TOK_NMTOKEN;
1190
14
      break;
1191
14
    }
1192
    /* fall through */
1193
80
  default:
1194
80
    *nextTokPtr = ptr;
1195
80
    return XML_TOK_INVALID;
1196
5.79M
  }
1197
14.1M
  while (HAS_CHAR(enc, ptr, end)) {
1198
14.1M
    switch (BYTE_TYPE(enc, ptr)) {
1199
40.4M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1200
21.1k
    case BT_GT:
1201
132k
    case BT_RPAR:
1202
132k
    case BT_COMMA:
1203
272k
    case BT_VERBAR:
1204
274k
    case BT_LSQB:
1205
274k
    case BT_PERCNT:
1206
390k
    case BT_S:
1207
515k
    case BT_CR:
1208
536k
    case BT_LF:
1209
536k
      *nextTokPtr = ptr;
1210
536k
      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
475
    case BT_PLUS:
1232
475
      if (tok == XML_TOK_NMTOKEN) {
1233
1
        *nextTokPtr = ptr;
1234
1
        return XML_TOK_INVALID;
1235
1
      }
1236
474
      *nextTokPtr = ptr + MINBPC(enc);
1237
474
      return XML_TOK_NAME_PLUS;
1238
3.83k
    case BT_AST:
1239
3.83k
      if (tok == XML_TOK_NMTOKEN) {
1240
2
        *nextTokPtr = ptr;
1241
2
        return XML_TOK_INVALID;
1242
2
      }
1243
3.82k
      *nextTokPtr = ptr + MINBPC(enc);
1244
3.82k
      return XML_TOK_NAME_ASTERISK;
1245
429
    case BT_QUEST:
1246
429
      if (tok == XML_TOK_NMTOKEN) {
1247
1
        *nextTokPtr = ptr;
1248
1
        return XML_TOK_INVALID;
1249
1
      }
1250
428
      *nextTokPtr = ptr + MINBPC(enc);
1251
428
      return XML_TOK_NAME_QUESTION;
1252
53
    default:
1253
53
      *nextTokPtr = ptr;
1254
53
      return XML_TOK_INVALID;
1255
14.1M
    }
1256
14.1M
  }
1257
602
  return -tok;
1258
541k
}
xmltok.c:normal_prologTok
Line
Count
Source
1018
5.80M
                  const char **nextTokPtr) {
1019
5.80M
  int tok;
1020
5.80M
  if (ptr >= end)
1021
8.49k
    return XML_TOK_NONE;
1022
5.79M
  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
5.79M
  switch (BYTE_TYPE(enc, ptr)) {
1032
6.84k
  case BT_QUOT:
1033
6.84k
    return PREFIX(scanLit)(BT_QUOT, enc, ptr + MINBPC(enc), end, nextTokPtr);
1034
51.3k
  case BT_APOS:
1035
51.3k
    return PREFIX(scanLit)(BT_APOS, enc, ptr + MINBPC(enc), end, nextTokPtr);
1036
102k
  case BT_LT: {
1037
102k
    ptr += MINBPC(enc);
1038
102k
    REQUIRE_CHAR(enc, ptr, end);
1039
102k
    switch (BYTE_TYPE(enc, ptr)) {
1040
75.1k
    case BT_EXCL:
1041
75.1k
      return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1042
21.3k
    case BT_QUEST:
1043
21.3k
      return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1044
4.62k
    case BT_NMSTRT:
1045
5.69k
    case BT_HEX:
1046
5.69k
    case BT_NONASCII:
1047
5.72k
    case BT_LEAD2:
1048
5.74k
    case BT_LEAD3:
1049
5.75k
    case BT_LEAD4:
1050
5.75k
      *nextTokPtr = ptr - MINBPC(enc);
1051
5.75k
      return XML_TOK_INSTANCE_START;
1052
102k
    }
1053
22
    *nextTokPtr = ptr;
1054
22
    return XML_TOK_INVALID;
1055
102k
  }
1056
308k
  case BT_CR:
1057
308k
    if (ptr + MINBPC(enc) == end) {
1058
330
      *nextTokPtr = end;
1059
      /* indicate that this might be part of a CR/LF pair */
1060
330
      return -XML_TOK_PROLOG_S;
1061
330
    }
1062
    /* fall through */
1063
600k
  case BT_S:
1064
670k
  case BT_LF:
1065
698k
    for (;;) {
1066
698k
      ptr += MINBPC(enc);
1067
698k
      if (! HAS_CHAR(enc, ptr, end))
1068
198
        break;
1069
698k
      switch (BYTE_TYPE(enc, ptr)) {
1070
7.94k
      case BT_S:
1071
23.7k
      case BT_LF:
1072
23.7k
        break;
1073
4.25k
      case BT_CR:
1074
        /* don't split CR/LF pair */
1075
4.25k
        if (ptr + MINBPC(enc) != end)
1076
4.10k
          break;
1077
        /* fall through */
1078
670k
      default:
1079
670k
        *nextTokPtr = ptr;
1080
670k
        return XML_TOK_PROLOG_S;
1081
698k
      }
1082
698k
    }
1083
198
    *nextTokPtr = ptr;
1084
198
    return XML_TOK_PROLOG_S;
1085
176k
  case BT_PERCNT:
1086
176k
    return PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1087
4.30k
  case BT_COMMA:
1088
4.30k
    *nextTokPtr = ptr + MINBPC(enc);
1089
4.30k
    return XML_TOK_COMMA;
1090
2.63k
  case BT_LSQB:
1091
2.63k
    *nextTokPtr = ptr + MINBPC(enc);
1092
2.63k
    return XML_TOK_OPEN_BRACKET;
1093
1.42k
  case BT_RSQB:
1094
1.42k
    ptr += MINBPC(enc);
1095
1.42k
    if (! HAS_CHAR(enc, ptr, end))
1096
3
      return -XML_TOK_CLOSE_BRACKET;
1097
1.42k
    if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) {
1098
19
      REQUIRE_CHARS(enc, ptr, end, 2);
1099
17
      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
17
    }
1104
1.42k
    *nextTokPtr = ptr;
1105
1.42k
    return XML_TOK_CLOSE_BRACKET;
1106
3.75M
  case BT_LPAR:
1107
3.75M
    *nextTokPtr = ptr + MINBPC(enc);
1108
3.75M
    return XML_TOK_OPEN_PAREN;
1109
141k
  case BT_RPAR:
1110
141k
    ptr += MINBPC(enc);
1111
141k
    if (! HAS_CHAR(enc, ptr, end))
1112
87
      return -XML_TOK_CLOSE_PAREN;
1113
140k
    switch (BYTE_TYPE(enc, ptr)) {
1114
5.13k
    case BT_AST:
1115
5.13k
      *nextTokPtr = ptr + MINBPC(enc);
1116
5.13k
      return XML_TOK_CLOSE_PAREN_ASTERISK;
1117
4.35k
    case BT_QUEST:
1118
4.35k
      *nextTokPtr = ptr + MINBPC(enc);
1119
4.35k
      return XML_TOK_CLOSE_PAREN_QUESTION;
1120
4.17k
    case BT_PLUS:
1121
4.17k
      *nextTokPtr = ptr + MINBPC(enc);
1122
4.17k
      return XML_TOK_CLOSE_PAREN_PLUS;
1123
23.9k
    case BT_CR:
1124
24.4k
    case BT_LF:
1125
105k
    case BT_S:
1126
107k
    case BT_GT:
1127
107k
    case BT_COMMA:
1128
112k
    case BT_VERBAR:
1129
127k
    case BT_RPAR:
1130
127k
      *nextTokPtr = ptr;
1131
127k
      return XML_TOK_CLOSE_PAREN;
1132
140k
    }
1133
10
    *nextTokPtr = ptr;
1134
10
    return XML_TOK_INVALID;
1135
163k
  case BT_VERBAR:
1136
163k
    *nextTokPtr = ptr + MINBPC(enc);
1137
163k
    return XML_TOK_OR;
1138
69.8k
  case BT_GT:
1139
69.8k
    *nextTokPtr = ptr + MINBPC(enc);
1140
69.8k
    return XML_TOK_DECL_CLOSE;
1141
107k
  case BT_NUM:
1142
107k
    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
435k
    LEAD_CASE(2)
1164
14.7k
    LEAD_CASE(3)
1165
178
    LEAD_CASE(4)
1166
0
#  undef LEAD_CASE
1167
256k
  case BT_NMSTRT:
1168
424k
  case BT_HEX:
1169
424k
    tok = XML_TOK_NAME;
1170
424k
    ptr += MINBPC(enc);
1171
424k
    break;
1172
904
  case BT_DIGIT:
1173
1.33k
  case BT_NAME:
1174
1.74k
  case BT_MINUS:
1175
#  ifdef XML_NS
1176
  case BT_COLON:
1177
#  endif
1178
1.74k
    tok = XML_TOK_NMTOKEN;
1179
1.74k
    ptr += MINBPC(enc);
1180
1.74k
    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
50
  default:
1194
50
    *nextTokPtr = ptr;
1195
50
    return XML_TOK_INVALID;
1196
5.79M
  }
1197
14.1M
  while (HAS_CHAR(enc, ptr, end)) {
1198
14.1M
    switch (BYTE_TYPE(enc, ptr)) {
1199
40.4M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1200
21.1k
    case BT_GT:
1201
132k
    case BT_RPAR:
1202
132k
    case BT_COMMA:
1203
272k
    case BT_VERBAR:
1204
274k
    case BT_LSQB:
1205
274k
    case BT_PERCNT:
1206
390k
    case BT_S:
1207
515k
    case BT_CR:
1208
536k
    case BT_LF:
1209
536k
      *nextTokPtr = ptr;
1210
536k
      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
475
    case BT_PLUS:
1232
475
      if (tok == XML_TOK_NMTOKEN) {
1233
1
        *nextTokPtr = ptr;
1234
1
        return XML_TOK_INVALID;
1235
1
      }
1236
474
      *nextTokPtr = ptr + MINBPC(enc);
1237
474
      return XML_TOK_NAME_PLUS;
1238
3.83k
    case BT_AST:
1239
3.83k
      if (tok == XML_TOK_NMTOKEN) {
1240
2
        *nextTokPtr = ptr;
1241
2
        return XML_TOK_INVALID;
1242
2
      }
1243
3.82k
      *nextTokPtr = ptr + MINBPC(enc);
1244
3.82k
      return XML_TOK_NAME_ASTERISK;
1245
429
    case BT_QUEST:
1246
429
      if (tok == XML_TOK_NMTOKEN) {
1247
1
        *nextTokPtr = ptr;
1248
1
        return XML_TOK_INVALID;
1249
1
      }
1250
428
      *nextTokPtr = ptr + MINBPC(enc);
1251
428
      return XML_TOK_NAME_QUESTION;
1252
39
    default:
1253
39
      *nextTokPtr = ptr;
1254
39
      return XML_TOK_INVALID;
1255
14.1M
    }
1256
14.1M
  }
1257
556
  return -tok;
1258
541k
}
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
25
      n &= ~(MINBPC(enc) - 1);
1026
25
      if (n == 0)
1027
2
        return XML_TOK_PARTIAL;
1028
23
      end = ptr + n;
1029
23
    }
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
30
    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
81
  case BT_NONASCII:
1182
81
    if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {
1183
68
      ptr += MINBPC(enc);
1184
68
      tok = XML_TOK_NAME;
1185
68
      break;
1186
68
    }
1187
13
    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
14
  default:
1194
14
    *nextTokPtr = ptr;
1195
14
    return XML_TOK_INVALID;
1196
98
  }
1197
1.78k
  while (HAS_CHAR(enc, ptr, end)) {
1198
1.78k
    switch (BYTE_TYPE(enc, ptr)) {
1199
8.76k
      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
1.78k
    }
1256
1.78k
  }
1257
26
  return -tok;
1258
72
}
xmltok.c:big2_prologTok
Line
Count
Source
1018
113
                  const char **nextTokPtr) {
1019
113
  int tok;
1020
113
  if (ptr >= end)
1021
2
    return XML_TOK_NONE;
1022
111
  if (MINBPC(enc) > 1) {
1023
111
    size_t n = end - ptr;
1024
111
    if (n & (MINBPC(enc) - 1)) {
1025
26
      n &= ~(MINBPC(enc) - 1);
1026
26
      if (n == 0)
1027
2
        return XML_TOK_PARTIAL;
1028
24
      end = ptr + n;
1029
24
    }
1030
111
  }
1031
109
  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
60
    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
82
  case BT_NONASCII:
1182
82
    if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {
1183
62
      ptr += MINBPC(enc);
1184
62
      tok = XML_TOK_NAME;
1185
62
      break;
1186
62
    }
1187
20
    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
16
  default:
1194
16
    *nextTokPtr = ptr;
1195
16
    return XML_TOK_INVALID;
1196
109
  }
1197
4.70k
  while (HAS_CHAR(enc, ptr, end)) {
1198
4.70k
    switch (BYTE_TYPE(enc, ptr)) {
1199
23.3k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1200
0
    case BT_GT:
1201
0
    case BT_RPAR:
1202
0
    case BT_COMMA:
1203
0
    case BT_VERBAR:
1204
0
    case BT_LSQB:
1205
0
    case BT_PERCNT:
1206
0
    case BT_S:
1207
0
    case BT_CR:
1208
0
    case BT_LF:
1209
0
      *nextTokPtr = ptr;
1210
0
      return tok;
1211
#  ifdef XML_NS
1212
    case BT_COLON:
1213
      ptr += MINBPC(enc);
1214
      switch (tok) {
1215
      case XML_TOK_NAME:
1216
        REQUIRE_CHAR(enc, ptr, end);
1217
        tok = XML_TOK_PREFIXED_NAME;
1218
        switch (BYTE_TYPE(enc, ptr)) {
1219
          CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1220
        default:
1221
          tok = XML_TOK_NMTOKEN;
1222
          break;
1223
        }
1224
        break;
1225
      case XML_TOK_PREFIXED_NAME:
1226
        tok = XML_TOK_NMTOKEN;
1227
        break;
1228
      }
1229
      break;
1230
#  endif
1231
0
    case BT_PLUS:
1232
0
      if (tok == XML_TOK_NMTOKEN) {
1233
0
        *nextTokPtr = ptr;
1234
0
        return XML_TOK_INVALID;
1235
0
      }
1236
0
      *nextTokPtr = ptr + MINBPC(enc);
1237
0
      return XML_TOK_NAME_PLUS;
1238
0
    case BT_AST:
1239
0
      if (tok == XML_TOK_NMTOKEN) {
1240
0
        *nextTokPtr = ptr;
1241
0
        return XML_TOK_INVALID;
1242
0
      }
1243
0
      *nextTokPtr = ptr + MINBPC(enc);
1244
0
      return XML_TOK_NAME_ASTERISK;
1245
0
    case BT_QUEST:
1246
0
      if (tok == XML_TOK_NMTOKEN) {
1247
0
        *nextTokPtr = ptr;
1248
0
        return XML_TOK_INVALID;
1249
0
      }
1250
0
      *nextTokPtr = ptr + MINBPC(enc);
1251
0
      return XML_TOK_NAME_QUESTION;
1252
7
    default:
1253
7
      *nextTokPtr = ptr;
1254
7
      return XML_TOK_INVALID;
1255
4.70k
    }
1256
4.70k
  }
1257
20
  return -tok;
1258
72
}
1259
1260
static int PTRCALL
1261
PREFIX(attributeValueTok)(const ENCODING *enc, const char *ptr, const char *end,
1262
1.88M
                          const char **nextTokPtr) {
1263
1.88M
  const char *start;
1264
1.88M
  if (ptr >= end)
1265
96.9k
    return XML_TOK_NONE;
1266
1.79M
  else if (! HAS_CHAR(enc, ptr, end)) {
1267
    /* This line cannot be executed.  The incoming data has already
1268
     * been tokenized once, so incomplete characters like this have
1269
     * already been eliminated from the input.  Retaining the paranoia
1270
     * check is still valuable, however.
1271
     */
1272
0
    return XML_TOK_PARTIAL; /* LCOV_EXCL_LINE */
1273
0
  }
1274
1.79M
  start = ptr;
1275
17.7M
  while (HAS_CHAR(enc, ptr, end)) {
1276
17.7M
    switch (BYTE_TYPE(enc, ptr)) {
1277
0
#  define LEAD_CASE(n)                                                         \
1278
189k
  case BT_LEAD##n:                                                             \
1279
189k
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1280
189k
    break;
1281
50.4k
      LEAD_CASE(2)
1282
80.5k
      LEAD_CASE(3)
1283
58.0k
      LEAD_CASE(4)
1284
0
#  undef LEAD_CASE
1285
305k
    case BT_AMP:
1286
305k
      if (ptr == start)
1287
237k
        return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1288
67.7k
      *nextTokPtr = ptr;
1289
67.7k
      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
417k
    case BT_LF:
1295
417k
      if (ptr == start) {
1296
317k
        *nextTokPtr = ptr + MINBPC(enc);
1297
317k
        return XML_TOK_DATA_NEWLINE;
1298
317k
      }
1299
100k
      *nextTokPtr = ptr;
1300
100k
      return XML_TOK_DATA_CHARS;
1301
725k
    case BT_CR:
1302
725k
      if (ptr == start) {
1303
537k
        ptr += MINBPC(enc);
1304
537k
        if (! HAS_CHAR(enc, ptr, end))
1305
3.76k
          return XML_TOK_TRAILING_CR;
1306
533k
        if (BYTE_TYPE(enc, ptr) == BT_LF)
1307
106k
          ptr += MINBPC(enc);
1308
533k
        *nextTokPtr = ptr;
1309
533k
        return XML_TOK_DATA_NEWLINE;
1310
537k
      }
1311
187k
      *nextTokPtr = ptr;
1312
187k
      return XML_TOK_DATA_CHARS;
1313
263k
    case BT_S:
1314
263k
      if (ptr == start) {
1315
167k
        *nextTokPtr = ptr + MINBPC(enc);
1316
167k
        return XML_TOK_ATTRIBUTE_VALUE_S;
1317
167k
      }
1318
95.5k
      *nextTokPtr = ptr;
1319
95.5k
      return XML_TOK_DATA_CHARS;
1320
15.8M
    default:
1321
15.8M
      ptr += MINBPC(enc);
1322
15.8M
      break;
1323
17.7M
    }
1324
17.7M
  }
1325
80.5k
  *nextTokPtr = ptr;
1326
80.5k
  return XML_TOK_DATA_CHARS;
1327
1.79M
}
xmltok.c:normal_attributeValueTok
Line
Count
Source
1262
1.88M
                          const char **nextTokPtr) {
1263
1.88M
  const char *start;
1264
1.88M
  if (ptr >= end)
1265
96.9k
    return XML_TOK_NONE;
1266
1.79M
  else if (! HAS_CHAR(enc, ptr, end)) {
1267
    /* This line cannot be executed.  The incoming data has already
1268
     * been tokenized once, so incomplete characters like this have
1269
     * already been eliminated from the input.  Retaining the paranoia
1270
     * check is still valuable, however.
1271
     */
1272
0
    return XML_TOK_PARTIAL; /* LCOV_EXCL_LINE */
1273
0
  }
1274
1.79M
  start = ptr;
1275
17.7M
  while (HAS_CHAR(enc, ptr, end)) {
1276
17.7M
    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
50.4k
      LEAD_CASE(2)
1282
80.5k
      LEAD_CASE(3)
1283
58.0k
      LEAD_CASE(4)
1284
0
#  undef LEAD_CASE
1285
305k
    case BT_AMP:
1286
305k
      if (ptr == start)
1287
237k
        return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1288
67.7k
      *nextTokPtr = ptr;
1289
67.7k
      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
417k
    case BT_LF:
1295
417k
      if (ptr == start) {
1296
317k
        *nextTokPtr = ptr + MINBPC(enc);
1297
317k
        return XML_TOK_DATA_NEWLINE;
1298
317k
      }
1299
100k
      *nextTokPtr = ptr;
1300
100k
      return XML_TOK_DATA_CHARS;
1301
725k
    case BT_CR:
1302
725k
      if (ptr == start) {
1303
537k
        ptr += MINBPC(enc);
1304
537k
        if (! HAS_CHAR(enc, ptr, end))
1305
3.76k
          return XML_TOK_TRAILING_CR;
1306
533k
        if (BYTE_TYPE(enc, ptr) == BT_LF)
1307
106k
          ptr += MINBPC(enc);
1308
533k
        *nextTokPtr = ptr;
1309
533k
        return XML_TOK_DATA_NEWLINE;
1310
537k
      }
1311
187k
      *nextTokPtr = ptr;
1312
187k
      return XML_TOK_DATA_CHARS;
1313
263k
    case BT_S:
1314
263k
      if (ptr == start) {
1315
167k
        *nextTokPtr = ptr + MINBPC(enc);
1316
167k
        return XML_TOK_ATTRIBUTE_VALUE_S;
1317
167k
      }
1318
95.5k
      *nextTokPtr = ptr;
1319
95.5k
      return XML_TOK_DATA_CHARS;
1320
15.8M
    default:
1321
15.8M
      ptr += MINBPC(enc);
1322
15.8M
      break;
1323
17.7M
    }
1324
17.7M
  }
1325
80.5k
  *nextTokPtr = ptr;
1326
80.5k
  return XML_TOK_DATA_CHARS;
1327
1.79M
}
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
3.14k
                   const char **badPtr) {
1451
3.14k
  ptr += MINBPC(enc);
1452
3.14k
  end -= MINBPC(enc);
1453
821k
  for (; HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
1454
821k
    switch (BYTE_TYPE(enc, ptr)) {
1455
346k
    case BT_DIGIT:
1456
532k
    case BT_HEX:
1457
533k
    case BT_MINUS:
1458
534k
    case BT_APOS:
1459
534k
    case BT_LPAR:
1460
593k
    case BT_RPAR:
1461
594k
    case BT_PLUS:
1462
595k
    case BT_COMMA:
1463
680k
    case BT_SOL:
1464
681k
    case BT_EQUALS:
1465
687k
    case BT_QUEST:
1466
691k
    case BT_CR:
1467
692k
    case BT_LF:
1468
693k
    case BT_SEMI:
1469
693k
    case BT_EXCL:
1470
695k
    case BT_AST:
1471
699k
    case BT_PERCNT:
1472
709k
    case BT_NUM:
1473
#  ifdef XML_NS
1474
    case BT_COLON:
1475
#  endif
1476
709k
      break;
1477
2.57k
    case BT_S:
1478
2.57k
      if (CHAR_MATCHES(enc, ptr, ASCII_TAB)) {
1479
1
        *badPtr = ptr;
1480
1
        return 0;
1481
1
      }
1482
2.56k
      break;
1483
4.76k
    case BT_NAME:
1484
107k
    case BT_NMSTRT:
1485
107k
      if (! (BYTE_TO_ASCII(enc, ptr) & ~0x7f))
1486
107k
        break;
1487
      /* fall through */
1488
2.20k
    default:
1489
2.20k
      switch (BYTE_TO_ASCII(enc, ptr)) {
1490
1.98k
      case 0x24: /* $ */
1491
2.19k
      case 0x40: /* @ */
1492
2.19k
        break;
1493
9
      default:
1494
9
        *badPtr = ptr;
1495
9
        return 0;
1496
2.20k
      }
1497
2.19k
      break;
1498
821k
    }
1499
821k
  }
1500
3.13k
  return 1;
1501
3.14k
}
xmltok.c:normal_isPublicId
Line
Count
Source
1450
3.14k
                   const char **badPtr) {
1451
3.14k
  ptr += MINBPC(enc);
1452
3.14k
  end -= MINBPC(enc);
1453
821k
  for (; HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
1454
821k
    switch (BYTE_TYPE(enc, ptr)) {
1455
346k
    case BT_DIGIT:
1456
532k
    case BT_HEX:
1457
533k
    case BT_MINUS:
1458
534k
    case BT_APOS:
1459
534k
    case BT_LPAR:
1460
593k
    case BT_RPAR:
1461
594k
    case BT_PLUS:
1462
595k
    case BT_COMMA:
1463
680k
    case BT_SOL:
1464
681k
    case BT_EQUALS:
1465
687k
    case BT_QUEST:
1466
691k
    case BT_CR:
1467
692k
    case BT_LF:
1468
693k
    case BT_SEMI:
1469
693k
    case BT_EXCL:
1470
695k
    case BT_AST:
1471
699k
    case BT_PERCNT:
1472
709k
    case BT_NUM:
1473
#  ifdef XML_NS
1474
    case BT_COLON:
1475
#  endif
1476
709k
      break;
1477
2.57k
    case BT_S:
1478
2.57k
      if (CHAR_MATCHES(enc, ptr, ASCII_TAB)) {
1479
1
        *badPtr = ptr;
1480
1
        return 0;
1481
1
      }
1482
2.56k
      break;
1483
4.76k
    case BT_NAME:
1484
107k
    case BT_NMSTRT:
1485
107k
      if (! (BYTE_TO_ASCII(enc, ptr) & ~0x7f))
1486
107k
        break;
1487
      /* fall through */
1488
2.20k
    default:
1489
2.20k
      switch (BYTE_TO_ASCII(enc, ptr)) {
1490
1.98k
      case 0x24: /* $ */
1491
2.19k
      case 0x40: /* @ */
1492
2.19k
        break;
1493
9
      default:
1494
9
        *badPtr = ptr;
1495
9
        return 0;
1496
2.20k
      }
1497
2.19k
      break;
1498
821k
    }
1499
821k
  }
1500
3.13k
  return 1;
1501
3.14k
}
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
342k
                ATTRIBUTE *atts) {
1511
342k
  enum { other, inName, inValue } state = inName;
1512
342k
  int nAtts = 0;
1513
342k
  int open = 0; /* defined when state == inValue;
1514
                   initialization just to shut up compilers */
1515
1516
38.8M
  for (ptr += MINBPC(enc);; ptr += MINBPC(enc)) {
1517
38.8M
    switch (BYTE_TYPE(enc, ptr)) {
1518
0
#  define START_NAME                                                           \
1519
24.6M
    if (state == other) {                                                      \
1520
2.47M
      if (nAtts < attsMax) {                                                   \
1521
1.27M
        atts[nAtts].name = ptr;                                                \
1522
1.27M
        atts[nAtts].normalized = 1;                                            \
1523
1.27M
      }                                                                        \
1524
2.47M
      state = inName;                                                          \
1525
2.47M
    }
1526
0
#  define LEAD_CASE(n)                                                         \
1527
324k
  case BT_LEAD##n: /* NOTE: The encoding has already been validated. */        \
1528
324k
    START_NAME ptr += (n - MINBPC(enc));                                       \
1529
324k
    break;
1530
99.4k
      LEAD_CASE(2)
1531
183k
      LEAD_CASE(3)
1532
41.2k
      LEAD_CASE(4)
1533
0
#  undef LEAD_CASE
1534
0
    case BT_NONASCII:
1535
23.1M
    case BT_NMSTRT:
1536
24.2M
    case BT_HEX:
1537
24.2M
      START_NAME
1538
24.2M
      break;
1539
0
#  undef START_NAME
1540
479k
    case BT_QUOT:
1541
479k
      if (state != inValue) {
1542
202k
        if (nAtts < attsMax)
1543
132k
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1544
202k
        state = inValue;
1545
202k
        open = BT_QUOT;
1546
276k
      } else if (open == BT_QUOT) {
1547
202k
        state = other;
1548
202k
        if (nAtts < attsMax)
1549
132k
          atts[nAtts].valueEnd = ptr;
1550
202k
        nAtts++;
1551
202k
      }
1552
479k
      break;
1553
4.58M
    case BT_APOS:
1554
4.58M
      if (state != inValue) {
1555
2.26M
        if (nAtts < attsMax)
1556
1.13M
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1557
2.26M
        state = inValue;
1558
2.26M
        open = BT_APOS;
1559
2.31M
      } else if (open == BT_APOS) {
1560
2.26M
        state = other;
1561
2.26M
        if (nAtts < attsMax)
1562
1.13M
          atts[nAtts].valueEnd = ptr;
1563
2.26M
        nAtts++;
1564
2.26M
      }
1565
4.58M
      break;
1566
145k
    case BT_AMP:
1567
145k
      if (nAtts < attsMax)
1568
144k
        atts[nAtts].normalized = 0;
1569
145k
      break;
1570
1.65M
    case BT_S:
1571
1.65M
      if (state == inName)
1572
41.2k
        state = other;
1573
1.61M
      else if (state == inValue && nAtts < attsMax && atts[nAtts].normalized
1574
61.5k
               && (ptr == atts[nAtts].valuePtr
1575
12.0k
                   || BYTE_TO_ASCII(enc, ptr) != ASCII_SPACE
1576
6.36k
                   || BYTE_TO_ASCII(enc, ptr + MINBPC(enc)) == ASCII_SPACE
1577
5.97k
                   || BYTE_TYPE(enc, ptr + MINBPC(enc)) == open))
1578
57.0k
        atts[nAtts].normalized = 0;
1579
1.65M
      break;
1580
1.58M
    case BT_CR:
1581
2.11M
    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.11M
      if (state == inName)
1585
34.4k
        state = other;
1586
2.08M
      else if (state == inValue && nAtts < attsMax)
1587
729k
        atts[nAtts].normalized = 0;
1588
2.11M
      break;
1589
255k
    case BT_GT:
1590
367k
    case BT_SOL:
1591
367k
      if (state != inValue)
1592
342k
        return nAtts;
1593
25.1k
      break;
1594
4.86M
    default:
1595
4.86M
      break;
1596
38.8M
    }
1597
38.8M
  }
1598
  /* not reached */
1599
342k
}
xmltok.c:normal_getAtts
Line
Count
Source
1510
342k
                ATTRIBUTE *atts) {
1511
342k
  enum { other, inName, inValue } state = inName;
1512
342k
  int nAtts = 0;
1513
342k
  int open = 0; /* defined when state == inValue;
1514
                   initialization just to shut up compilers */
1515
1516
38.8M
  for (ptr += MINBPC(enc);; ptr += MINBPC(enc)) {
1517
38.8M
    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
99.4k
      LEAD_CASE(2)
1531
183k
      LEAD_CASE(3)
1532
41.2k
      LEAD_CASE(4)
1533
0
#  undef LEAD_CASE
1534
0
    case BT_NONASCII:
1535
23.1M
    case BT_NMSTRT:
1536
24.2M
    case BT_HEX:
1537
24.2M
      START_NAME
1538
24.2M
      break;
1539
0
#  undef START_NAME
1540
479k
    case BT_QUOT:
1541
479k
      if (state != inValue) {
1542
202k
        if (nAtts < attsMax)
1543
132k
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1544
202k
        state = inValue;
1545
202k
        open = BT_QUOT;
1546
276k
      } else if (open == BT_QUOT) {
1547
202k
        state = other;
1548
202k
        if (nAtts < attsMax)
1549
132k
          atts[nAtts].valueEnd = ptr;
1550
202k
        nAtts++;
1551
202k
      }
1552
479k
      break;
1553
4.58M
    case BT_APOS:
1554
4.58M
      if (state != inValue) {
1555
2.26M
        if (nAtts < attsMax)
1556
1.13M
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1557
2.26M
        state = inValue;
1558
2.26M
        open = BT_APOS;
1559
2.31M
      } else if (open == BT_APOS) {
1560
2.26M
        state = other;
1561
2.26M
        if (nAtts < attsMax)
1562
1.13M
          atts[nAtts].valueEnd = ptr;
1563
2.26M
        nAtts++;
1564
2.26M
      }
1565
4.58M
      break;
1566
145k
    case BT_AMP:
1567
145k
      if (nAtts < attsMax)
1568
144k
        atts[nAtts].normalized = 0;
1569
145k
      break;
1570
1.65M
    case BT_S:
1571
1.65M
      if (state == inName)
1572
41.2k
        state = other;
1573
1.61M
      else if (state == inValue && nAtts < attsMax && atts[nAtts].normalized
1574
61.5k
               && (ptr == atts[nAtts].valuePtr
1575
12.0k
                   || BYTE_TO_ASCII(enc, ptr) != ASCII_SPACE
1576
6.36k
                   || BYTE_TO_ASCII(enc, ptr + MINBPC(enc)) == ASCII_SPACE
1577
5.97k
                   || BYTE_TYPE(enc, ptr + MINBPC(enc)) == open))
1578
57.0k
        atts[nAtts].normalized = 0;
1579
1.65M
      break;
1580
1.58M
    case BT_CR:
1581
2.11M
    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.11M
      if (state == inName)
1585
34.4k
        state = other;
1586
2.08M
      else if (state == inValue && nAtts < attsMax)
1587
729k
        atts[nAtts].normalized = 0;
1588
2.11M
      break;
1589
255k
    case BT_GT:
1590
367k
    case BT_SOL:
1591
367k
      if (state != inValue)
1592
342k
        return nAtts;
1593
25.1k
      break;
1594
4.86M
    default:
1595
4.86M
      break;
1596
38.8M
    }
1597
38.8M
  }
1598
  /* not reached */
1599
342k
}
Unexecuted instantiation: xmltok.c:little2_getAtts
Unexecuted instantiation: xmltok.c:big2_getAtts
1600
1601
static int PTRFASTCALL
1602
83.6k
PREFIX(charRefNumber)(const ENCODING *enc, const char *ptr) {
1603
83.6k
  int result = 0;
1604
  /* skip &# */
1605
83.6k
  UNUSED_P(enc);
1606
83.6k
  ptr += 2 * MINBPC(enc);
1607
83.6k
  if (CHAR_MATCHES(enc, ptr, ASCII_x)) {
1608
363k
    for (ptr += MINBPC(enc); ! CHAR_MATCHES(enc, ptr, ASCII_SEMI);
1609
284k
         ptr += MINBPC(enc)) {
1610
284k
      int c = BYTE_TO_ASCII(enc, ptr);
1611
284k
      switch (c) {
1612
9.56k
      case ASCII_0:
1613
29.3k
      case ASCII_1:
1614
58.7k
      case ASCII_2:
1615
61.7k
      case ASCII_3:
1616
96.7k
      case ASCII_4:
1617
121k
      case ASCII_5:
1618
127k
      case ASCII_6:
1619
149k
      case ASCII_7:
1620
168k
      case ASCII_8:
1621
175k
      case ASCII_9:
1622
175k
        result <<= 4;
1623
175k
        result |= (c - ASCII_0);
1624
175k
        break;
1625
27.9k
      case ASCII_A:
1626
29.8k
      case ASCII_B:
1627
30.4k
      case ASCII_C:
1628
33.7k
      case ASCII_D:
1629
37.6k
      case ASCII_E:
1630
60.9k
      case ASCII_F:
1631
60.9k
        result <<= 4;
1632
60.9k
        result += 10 + (c - ASCII_A);
1633
60.9k
        break;
1634
832
      case ASCII_a:
1635
12.9k
      case ASCII_b:
1636
13.5k
      case ASCII_c:
1637
37.9k
      case ASCII_d:
1638
39.1k
      case ASCII_e:
1639
47.9k
      case ASCII_f:
1640
47.9k
        result <<= 4;
1641
47.9k
        result += 10 + (c - ASCII_a);
1642
47.9k
        break;
1643
284k
      }
1644
284k
      if (result >= 0x110000)
1645
16
        return -1;
1646
284k
    }
1647
79.0k
  } else {
1648
20.5k
    for (; ! CHAR_MATCHES(enc, ptr, ASCII_SEMI); ptr += MINBPC(enc)) {
1649
15.9k
      int c = BYTE_TO_ASCII(enc, ptr);
1650
15.9k
      result *= 10;
1651
15.9k
      result += (c - ASCII_0);
1652
15.9k
      if (result >= 0x110000)
1653
3
        return -1;
1654
15.9k
    }
1655
4.59k
  }
1656
83.6k
  return checkCharRefNumber(result);
1657
83.6k
}
xmltok.c:normal_charRefNumber
Line
Count
Source
1602
83.6k
PREFIX(charRefNumber)(const ENCODING *enc, const char *ptr) {
1603
83.6k
  int result = 0;
1604
  /* skip &# */
1605
83.6k
  UNUSED_P(enc);
1606
83.6k
  ptr += 2 * MINBPC(enc);
1607
83.6k
  if (CHAR_MATCHES(enc, ptr, ASCII_x)) {
1608
363k
    for (ptr += MINBPC(enc); ! CHAR_MATCHES(enc, ptr, ASCII_SEMI);
1609
284k
         ptr += MINBPC(enc)) {
1610
284k
      int c = BYTE_TO_ASCII(enc, ptr);
1611
284k
      switch (c) {
1612
9.56k
      case ASCII_0:
1613
29.3k
      case ASCII_1:
1614
58.7k
      case ASCII_2:
1615
61.7k
      case ASCII_3:
1616
96.7k
      case ASCII_4:
1617
121k
      case ASCII_5:
1618
127k
      case ASCII_6:
1619
149k
      case ASCII_7:
1620
168k
      case ASCII_8:
1621
175k
      case ASCII_9:
1622
175k
        result <<= 4;
1623
175k
        result |= (c - ASCII_0);
1624
175k
        break;
1625
27.9k
      case ASCII_A:
1626
29.8k
      case ASCII_B:
1627
30.4k
      case ASCII_C:
1628
33.7k
      case ASCII_D:
1629
37.6k
      case ASCII_E:
1630
60.9k
      case ASCII_F:
1631
60.9k
        result <<= 4;
1632
60.9k
        result += 10 + (c - ASCII_A);
1633
60.9k
        break;
1634
832
      case ASCII_a:
1635
12.9k
      case ASCII_b:
1636
13.5k
      case ASCII_c:
1637
37.9k
      case ASCII_d:
1638
39.1k
      case ASCII_e:
1639
47.9k
      case ASCII_f:
1640
47.9k
        result <<= 4;
1641
47.9k
        result += 10 + (c - ASCII_a);
1642
47.9k
        break;
1643
284k
      }
1644
284k
      if (result >= 0x110000)
1645
16
        return -1;
1646
284k
    }
1647
79.0k
  } else {
1648
20.5k
    for (; ! CHAR_MATCHES(enc, ptr, ASCII_SEMI); ptr += MINBPC(enc)) {
1649
15.9k
      int c = BYTE_TO_ASCII(enc, ptr);
1650
15.9k
      result *= 10;
1651
15.9k
      result += (c - ASCII_0);
1652
15.9k
      if (result >= 0x110000)
1653
3
        return -1;
1654
15.9k
    }
1655
4.59k
  }
1656
83.6k
  return checkCharRefNumber(result);
1657
83.6k
}
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
204k
                             const char *end) {
1662
204k
  UNUSED_P(enc);
1663
204k
  switch ((end - ptr) / MINBPC(enc)) {
1664
9.92k
  case 2:
1665
9.92k
    if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_t)) {
1666
2.50k
      switch (BYTE_TO_ASCII(enc, ptr)) {
1667
603
      case ASCII_l:
1668
603
        return ASCII_LT;
1669
610
      case ASCII_g:
1670
610
        return ASCII_GT;
1671
2.50k
      }
1672
2.50k
    }
1673
8.70k
    break;
1674
39.9k
  case 3:
1675
39.9k
    if (CHAR_MATCHES(enc, ptr, ASCII_a)) {
1676
33.3k
      ptr += MINBPC(enc);
1677
33.3k
      if (CHAR_MATCHES(enc, ptr, ASCII_m)) {
1678
32.1k
        ptr += MINBPC(enc);
1679
32.1k
        if (CHAR_MATCHES(enc, ptr, ASCII_p))
1680
31.8k
          return ASCII_AMP;
1681
32.1k
      }
1682
33.3k
    }
1683
8.06k
    break;
1684
44.5k
  case 4:
1685
44.5k
    switch (BYTE_TO_ASCII(enc, ptr)) {
1686
6.67k
    case ASCII_q:
1687
6.67k
      ptr += MINBPC(enc);
1688
6.67k
      if (CHAR_MATCHES(enc, ptr, ASCII_u)) {
1689
5.60k
        ptr += MINBPC(enc);
1690
5.60k
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1691
4.74k
          ptr += MINBPC(enc);
1692
4.74k
          if (CHAR_MATCHES(enc, ptr, ASCII_t))
1693
3.95k
            return ASCII_QUOT;
1694
4.74k
        }
1695
5.60k
      }
1696
2.71k
      break;
1697
3.64k
    case ASCII_a:
1698
3.64k
      ptr += MINBPC(enc);
1699
3.64k
      if (CHAR_MATCHES(enc, ptr, ASCII_p)) {
1700
1.34k
        ptr += MINBPC(enc);
1701
1.34k
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1702
957
          ptr += MINBPC(enc);
1703
957
          if (CHAR_MATCHES(enc, ptr, ASCII_s))
1704
215
            return ASCII_APOS;
1705
957
        }
1706
1.34k
      }
1707
3.43k
      break;
1708
44.5k
    }
1709
204k
  }
1710
166k
  return 0;
1711
204k
}
xmltok.c:normal_predefinedEntityName
Line
Count
Source
1661
204k
                             const char *end) {
1662
204k
  UNUSED_P(enc);
1663
204k
  switch ((end - ptr) / MINBPC(enc)) {
1664
9.92k
  case 2:
1665
9.92k
    if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_t)) {
1666
2.50k
      switch (BYTE_TO_ASCII(enc, ptr)) {
1667
603
      case ASCII_l:
1668
603
        return ASCII_LT;
1669
610
      case ASCII_g:
1670
610
        return ASCII_GT;
1671
2.50k
      }
1672
2.50k
    }
1673
8.70k
    break;
1674
39.9k
  case 3:
1675
39.9k
    if (CHAR_MATCHES(enc, ptr, ASCII_a)) {
1676
33.3k
      ptr += MINBPC(enc);
1677
33.3k
      if (CHAR_MATCHES(enc, ptr, ASCII_m)) {
1678
32.1k
        ptr += MINBPC(enc);
1679
32.1k
        if (CHAR_MATCHES(enc, ptr, ASCII_p))
1680
31.8k
          return ASCII_AMP;
1681
32.1k
      }
1682
33.3k
    }
1683
8.06k
    break;
1684
44.5k
  case 4:
1685
44.5k
    switch (BYTE_TO_ASCII(enc, ptr)) {
1686
6.67k
    case ASCII_q:
1687
6.67k
      ptr += MINBPC(enc);
1688
6.67k
      if (CHAR_MATCHES(enc, ptr, ASCII_u)) {
1689
5.60k
        ptr += MINBPC(enc);
1690
5.60k
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1691
4.74k
          ptr += MINBPC(enc);
1692
4.74k
          if (CHAR_MATCHES(enc, ptr, ASCII_t))
1693
3.95k
            return ASCII_QUOT;
1694
4.74k
        }
1695
5.60k
      }
1696
2.71k
      break;
1697
3.64k
    case ASCII_a:
1698
3.64k
      ptr += MINBPC(enc);
1699
3.64k
      if (CHAR_MATCHES(enc, ptr, ASCII_p)) {
1700
1.34k
        ptr += MINBPC(enc);
1701
1.34k
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1702
957
          ptr += MINBPC(enc);
1703
957
          if (CHAR_MATCHES(enc, ptr, ASCII_s))
1704
215
            return ASCII_APOS;
1705
957
        }
1706
1.34k
      }
1707
3.43k
      break;
1708
44.5k
    }
1709
204k
  }
1710
166k
  return 0;
1711
204k
}
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
445k
                         const char *end1, const char *ptr2) {
1716
445k
  UNUSED_P(enc);
1717
2.11M
  for (; *ptr2; ptr1 += MINBPC(enc), ptr2++) {
1718
1.87M
    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
32
      return 0; /* LCOV_EXCL_LINE */
1725
32
    }
1726
1.87M
    if (! CHAR_MATCHES(enc, ptr1, *ptr2))
1727
212k
      return 0;
1728
1.87M
  }
1729
233k
  return ptr1 == end1;
1730
445k
}
xmltok.c:normal_nameMatchesAscii
Line
Count
Source
1715
445k
                         const char *end1, const char *ptr2) {
1716
445k
  UNUSED_P(enc);
1717
2.11M
  for (; *ptr2; ptr1 += MINBPC(enc), ptr2++) {
1718
1.87M
    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
32
      return 0; /* LCOV_EXCL_LINE */
1725
32
    }
1726
1.87M
    if (! CHAR_MATCHES(enc, ptr1, *ptr2))
1727
212k
      return 0;
1728
1.87M
  }
1729
233k
  return ptr1 == end1;
1730
445k
}
Unexecuted instantiation: xmltok.c:little2_nameMatchesAscii
Unexecuted instantiation: xmltok.c:big2_nameMatchesAscii
1731
1732
static int PTRFASTCALL
1733
476k
PREFIX(nameLength)(const ENCODING *enc, const char *ptr) {
1734
476k
  const char *start = ptr;
1735
8.97M
  for (;;) {
1736
8.97M
    switch (BYTE_TYPE(enc, ptr)) {
1737
0
#  define LEAD_CASE(n)                                                         \
1738
87.1k
  case BT_LEAD##n:                                                             \
1739
87.1k
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1740
87.1k
    break;
1741
44.8k
      LEAD_CASE(2)
1742
42.3k
      LEAD_CASE(3)
1743
0
      LEAD_CASE(4)
1744
0
#  undef LEAD_CASE
1745
0
    case BT_NONASCII:
1746
7.73M
    case BT_NMSTRT:
1747
#  ifdef XML_NS
1748
    case BT_COLON:
1749
#  endif
1750
8.22M
    case BT_HEX:
1751
8.31M
    case BT_DIGIT:
1752
8.37M
    case BT_NAME:
1753
8.40M
    case BT_MINUS:
1754
8.40M
      ptr += MINBPC(enc);
1755
8.40M
      break;
1756
476k
    default:
1757
476k
      return (int)(ptr - start);
1758
8.97M
    }
1759
8.97M
  }
1760
476k
}
xmltok.c:normal_nameLength
Line
Count
Source
1733
476k
PREFIX(nameLength)(const ENCODING *enc, const char *ptr) {
1734
476k
  const char *start = ptr;
1735
8.97M
  for (;;) {
1736
8.97M
    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
44.8k
      LEAD_CASE(2)
1742
42.3k
      LEAD_CASE(3)
1743
0
      LEAD_CASE(4)
1744
0
#  undef LEAD_CASE
1745
0
    case BT_NONASCII:
1746
7.73M
    case BT_NMSTRT:
1747
#  ifdef XML_NS
1748
    case BT_COLON:
1749
#  endif
1750
8.22M
    case BT_HEX:
1751
8.31M
    case BT_DIGIT:
1752
8.37M
    case BT_NAME:
1753
8.40M
    case BT_MINUS:
1754
8.40M
      ptr += MINBPC(enc);
1755
8.40M
      break;
1756
476k
    default:
1757
476k
      return (int)(ptr - start);
1758
8.97M
    }
1759
8.97M
  }
1760
476k
}
Unexecuted instantiation: xmltok.c:little2_nameLength
Unexecuted instantiation: xmltok.c:big2_nameLength
1761
1762
static const char *PTRFASTCALL
1763
0
PREFIX(skipS)(const ENCODING *enc, const char *ptr) {
1764
0
  for (;;) {
1765
0
    switch (BYTE_TYPE(enc, ptr)) {
1766
0
    case BT_LF:
1767
0
    case BT_CR:
1768
0
    case BT_S:
1769
0
      ptr += MINBPC(enc);
1770
0
      break;
1771
0
    default:
1772
0
      return ptr;
1773
0
    }
1774
0
  }
1775
0
}
Unexecuted instantiation: xmltok.c:normal_skipS
Unexecuted instantiation: xmltok.c:little2_skipS
Unexecuted instantiation: xmltok.c:big2_skipS
1776
1777
static void PTRCALL
1778
PREFIX(updatePosition)(const ENCODING *enc, const char *ptr, const char *end,
1779
16.6k
                       POSITION *pos) {
1780
128M
  while (HAS_CHAR(enc, ptr, end)) {
1781
128M
    switch (BYTE_TYPE(enc, ptr)) {
1782
0
#  define LEAD_CASE(n)                                                         \
1783
2.16M
  case BT_LEAD##n:                                                             \
1784
2.16M
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1785
2.16M
    pos->columnNumber++;                                                       \
1786
2.16M
    break;
1787
1.14M
      LEAD_CASE(2)
1788
755k
      LEAD_CASE(3)
1789
270k
      LEAD_CASE(4)
1790
0
#  undef LEAD_CASE
1791
3.44M
    case BT_LF:
1792
3.44M
      pos->columnNumber = 0;
1793
3.44M
      pos->lineNumber++;
1794
3.44M
      ptr += MINBPC(enc);
1795
3.44M
      break;
1796
5.27M
    case BT_CR:
1797
5.27M
      pos->lineNumber++;
1798
5.27M
      ptr += MINBPC(enc);
1799
5.27M
      if (HAS_CHAR(enc, ptr, end) && BYTE_TYPE(enc, ptr) == BT_LF)
1800
881k
        ptr += MINBPC(enc);
1801
5.27M
      pos->columnNumber = 0;
1802
5.27M
      break;
1803
118M
    default:
1804
118M
      ptr += MINBPC(enc);
1805
118M
      pos->columnNumber++;
1806
118M
      break;
1807
128M
    }
1808
128M
  }
1809
16.6k
}
xmltok.c:normal_updatePosition
Line
Count
Source
1779
16.2k
                       POSITION *pos) {
1780
128M
  while (HAS_CHAR(enc, ptr, end)) {
1781
128M
    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
1.14M
      LEAD_CASE(2)
1788
755k
      LEAD_CASE(3)
1789
270k
      LEAD_CASE(4)
1790
0
#  undef LEAD_CASE
1791
3.44M
    case BT_LF:
1792
3.44M
      pos->columnNumber = 0;
1793
3.44M
      pos->lineNumber++;
1794
3.44M
      ptr += MINBPC(enc);
1795
3.44M
      break;
1796
5.27M
    case BT_CR:
1797
5.27M
      pos->lineNumber++;
1798
5.27M
      ptr += MINBPC(enc);
1799
5.27M
      if (HAS_CHAR(enc, ptr, end) && BYTE_TYPE(enc, ptr) == BT_LF)
1800
881k
        ptr += MINBPC(enc);
1801
5.27M
      pos->columnNumber = 0;
1802
5.27M
      break;
1803
118M
    default:
1804
118M
      ptr += MINBPC(enc);
1805
118M
      pos->columnNumber++;
1806
118M
      break;
1807
128M
    }
1808
128M
  }
1809
16.2k
}
xmltok.c:little2_updatePosition
Line
Count
Source
1779
180
                       POSITION *pos) {
1780
1.09k
  while (HAS_CHAR(enc, ptr, end)) {
1781
1.09k
    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
1.09k
    default:
1804
1.09k
      ptr += MINBPC(enc);
1805
1.09k
      pos->columnNumber++;
1806
1.09k
      break;
1807
1.09k
    }
1808
1.09k
  }
1809
180
}
xmltok.c:big2_updatePosition
Line
Count
Source
1779
204
                       POSITION *pos) {
1780
4.43k
  while (HAS_CHAR(enc, ptr, end)) {
1781
4.43k
    switch (BYTE_TYPE(enc, ptr)) {
1782
0
#  define LEAD_CASE(n)                                                         \
1783
0
  case BT_LEAD##n:                                                             \
1784
0
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1785
0
    pos->columnNumber++;                                                       \
1786
0
    break;
1787
0
      LEAD_CASE(2)
1788
0
      LEAD_CASE(3)
1789
0
      LEAD_CASE(4)
1790
0
#  undef LEAD_CASE
1791
0
    case BT_LF:
1792
0
      pos->columnNumber = 0;
1793
0
      pos->lineNumber++;
1794
0
      ptr += MINBPC(enc);
1795
0
      break;
1796
0
    case BT_CR:
1797
0
      pos->lineNumber++;
1798
0
      ptr += MINBPC(enc);
1799
0
      if (HAS_CHAR(enc, ptr, end) && BYTE_TYPE(enc, ptr) == BT_LF)
1800
0
        ptr += MINBPC(enc);
1801
0
      pos->columnNumber = 0;
1802
0
      break;
1803
4.43k
    default:
1804
4.43k
      ptr += MINBPC(enc);
1805
4.43k
      pos->columnNumber++;
1806
4.43k
      break;
1807
4.43k
    }
1808
4.43k
  }
1809
204
}
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 */