Coverage Report

Created: 2026-01-10 06:34

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
44
#    define IS_INVALID_CHAR(enc, ptr, n) (0)
46
#  endif
47
48
#  define INVALID_LEAD_CASE(n, ptr, nextTokPtr)                                \
49
791k
  case BT_LEAD##n:                                                             \
50
791k
    if (end - ptr < n)                                                         \
51
791k
      return XML_TOK_PARTIAL_CHAR;                                             \
52
791k
    if (IS_INVALID_CHAR(enc, ptr, n)) {                                        \
53
86
      *(nextTokPtr) = (ptr);                                                   \
54
86
      return XML_TOK_INVALID;                                                  \
55
86
    }                                                                          \
56
791k
    ptr += n;                                                                  \
57
791k
    break;
58
59
#  define INVALID_CASES(ptr, nextTokPtr)                                       \
60
345k
    INVALID_LEAD_CASE(2, ptr, nextTokPtr)                                      \
61
345k
    INVALID_LEAD_CASE(3, ptr, nextTokPtr)                                      \
62
298k
    INVALID_LEAD_CASE(4, ptr, nextTokPtr)                                      \
63
148k
  case BT_NONXML:                                                              \
64
52
  case BT_MALFORM:                                                             \
65
82
  case BT_TRAIL:                                                               \
66
82
    *(nextTokPtr) = (ptr);                                                     \
67
82
    return XML_TOK_INVALID;
68
69
#  define CHECK_NAME_CASE(n, enc, ptr, end, nextTokPtr)                        \
70
385k
  case BT_LEAD##n:                                                             \
71
385k
    if (end - ptr < n)                                                         \
72
385k
      return XML_TOK_PARTIAL_CHAR;                                             \
73
385k
    if (IS_INVALID_CHAR(enc, ptr, n) || ! IS_NAME_CHAR(enc, ptr, n)) {         \
74
220
      *nextTokPtr = ptr;                                                       \
75
220
      return XML_TOK_INVALID;                                                  \
76
220
    }                                                                          \
77
385k
    ptr += n;                                                                  \
78
385k
    break;
79
80
#  define CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)                          \
81
29.4M
  case BT_NONASCII:                                                            \
82
29.4M
    if (! IS_NAME_CHAR_MINBPC(enc, ptr)) {                                     \
83
36
      *nextTokPtr = ptr;                                                       \
84
36
      return XML_TOK_INVALID;                                                  \
85
36
    }                                                                          \
86
29.4M
    /* fall through */                                                         \
87
29.4M
  case BT_NMSTRT:                                                              \
88
25.4M
  case BT_HEX:                                                                 \
89
29.0M
  case BT_DIGIT:                                                               \
90
29.1M
  case BT_NAME:                                                                \
91
29.4M
  case BT_MINUS:                                                               \
92
29.4M
    ptr += MINBPC(enc);                                                        \
93
29.4M
    break;                                                                     \
94
29.4M
    CHECK_NAME_CASE(2, enc, ptr, end, nextTokPtr)                              \
95
202k
    CHECK_NAME_CASE(3, enc, ptr, end, nextTokPtr)                              \
96
202k
    CHECK_NAME_CASE(4, enc, ptr, end, nextTokPtr)
97
98
#  define CHECK_NMSTRT_CASE(n, enc, ptr, end, nextTokPtr)                      \
99
160k
  case BT_LEAD##n:                                                             \
100
160k
    if ((end) - (ptr) < (n))                                                   \
101
160k
      return XML_TOK_PARTIAL_CHAR;                                             \
102
160k
    if (IS_INVALID_CHAR(enc, ptr, n) || ! IS_NMSTRT_CHAR(enc, ptr, n)) {       \
103
140
      *nextTokPtr = ptr;                                                       \
104
140
      return XML_TOK_INVALID;                                                  \
105
140
    }                                                                          \
106
160k
    ptr += n;                                                                  \
107
160k
    break;
108
109
#  define CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)                        \
110
3.00M
  case BT_NONASCII:                                                            \
111
3.00M
    if (! IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {                                   \
112
0
      *nextTokPtr = ptr;                                                       \
113
0
      return XML_TOK_INVALID;                                                  \
114
0
    }                                                                          \
115
3.00M
    /* fall through */                                                         \
116
3.00M
  case BT_NMSTRT:                                                              \
117
3.00M
  case BT_HEX:                                                                 \
118
3.00M
    ptr += MINBPC(enc);                                                        \
119
3.00M
    break;                                                                     \
120
3.00M
    CHECK_NMSTRT_CASE(2, enc, ptr, end, nextTokPtr)                            \
121
81.2k
    CHECK_NMSTRT_CASE(3, enc, ptr, end, nextTokPtr)                            \
122
81.1k
    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
269M
    ((end) - (ptr) >= ((count) * MINBPC(enc)))
130
131
10.1M
#  define HAS_CHAR(enc, ptr, end) HAS_CHARS(enc, ptr, end, 1)
132
133
#  define REQUIRE_CHARS(enc, ptr, end, count)                                  \
134
29.1M
    {                                                                          \
135
29.1M
      if (! HAS_CHARS(enc, ptr, end, count)) {                                 \
136
465
        return XML_TOK_PARTIAL;                                                \
137
465
      }                                                                        \
138
29.1M
    }
139
140
29.1M
#  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
23.2k
                    const char **nextTokPtr) {
147
23.2k
  if (HAS_CHAR(enc, ptr, end)) {
148
23.2k
    if (! CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
149
8
      *nextTokPtr = ptr;
150
8
      return XML_TOK_INVALID;
151
8
    }
152
23.2k
    ptr += MINBPC(enc);
153
3.93M
    while (HAS_CHAR(enc, ptr, end)) {
154
3.93M
      switch (BYTE_TYPE(enc, ptr)) {
155
228k
        INVALID_CASES(ptr, nextTokPtr)
156
38.2k
      case BT_MINUS:
157
38.2k
        ptr += MINBPC(enc);
158
38.2k
        REQUIRE_CHAR(enc, ptr, end);
159
38.2k
        if (CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
160
23.1k
          ptr += MINBPC(enc);
161
23.1k
          REQUIRE_CHAR(enc, ptr, end);
162
23.1k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
163
2
            *nextTokPtr = ptr;
164
2
            return XML_TOK_INVALID;
165
2
          }
166
23.1k
          *nextTokPtr = ptr + MINBPC(enc);
167
23.1k
          return XML_TOK_COMMENT;
168
23.1k
        }
169
15.1k
        break;
170
3.78M
      default:
171
3.78M
        ptr += MINBPC(enc);
172
3.78M
        break;
173
3.93M
      }
174
3.93M
    }
175
23.2k
  }
176
68
  return XML_TOK_PARTIAL;
177
23.2k
}
xmltok.c:normal_scanComment
Line
Count
Source
146
23.2k
                    const char **nextTokPtr) {
147
23.2k
  if (HAS_CHAR(enc, ptr, end)) {
148
23.2k
    if (! CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
149
8
      *nextTokPtr = ptr;
150
8
      return XML_TOK_INVALID;
151
8
    }
152
23.2k
    ptr += MINBPC(enc);
153
3.93M
    while (HAS_CHAR(enc, ptr, end)) {
154
3.93M
      switch (BYTE_TYPE(enc, ptr)) {
155
228k
        INVALID_CASES(ptr, nextTokPtr)
156
38.2k
      case BT_MINUS:
157
38.2k
        ptr += MINBPC(enc);
158
38.2k
        REQUIRE_CHAR(enc, ptr, end);
159
38.2k
        if (CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
160
23.1k
          ptr += MINBPC(enc);
161
23.1k
          REQUIRE_CHAR(enc, ptr, end);
162
23.1k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
163
2
            *nextTokPtr = ptr;
164
2
            return XML_TOK_INVALID;
165
2
          }
166
23.1k
          *nextTokPtr = ptr + MINBPC(enc);
167
23.1k
          return XML_TOK_COMMENT;
168
23.1k
        }
169
15.1k
        break;
170
3.78M
      default:
171
3.78M
        ptr += MINBPC(enc);
172
3.78M
        break;
173
3.93M
      }
174
3.93M
    }
175
23.2k
  }
176
68
  return XML_TOK_PARTIAL;
177
23.2k
}
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
64.5k
                 const char **nextTokPtr) {
184
64.5k
  REQUIRE_CHAR(enc, ptr, end);
185
64.5k
  switch (BYTE_TYPE(enc, ptr)) {
186
2.25k
  case BT_MINUS:
187
2.25k
    return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
188
6
  case BT_LSQB:
189
6
    *nextTokPtr = ptr + MINBPC(enc);
190
6
    return XML_TOK_COND_SECT_OPEN;
191
968
  case BT_NMSTRT:
192
62.2k
  case BT_HEX:
193
62.2k
    ptr += MINBPC(enc);
194
62.2k
    break;
195
3
  default:
196
3
    *nextTokPtr = ptr;
197
3
    return XML_TOK_INVALID;
198
64.5k
  }
199
441k
  while (HAS_CHAR(enc, ptr, end)) {
200
441k
    switch (BYTE_TYPE(enc, ptr)) {
201
16
    case BT_PERCNT:
202
16
      REQUIRE_CHARS(enc, ptr, end, 2);
203
      /* don't allow <!ENTITY% foo "whatever"> */
204
14
      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
14
      }
212
      /* fall through */
213
26.3k
    case BT_S:
214
57.7k
    case BT_CR:
215
62.2k
    case BT_LF:
216
62.2k
      *nextTokPtr = ptr;
217
62.2k
      return XML_TOK_DECL_OPEN;
218
348k
    case BT_NMSTRT:
219
379k
    case BT_HEX:
220
379k
      ptr += MINBPC(enc);
221
379k
      break;
222
11
    default:
223
11
      *nextTokPtr = ptr;
224
11
      return XML_TOK_INVALID;
225
441k
    }
226
441k
  }
227
54
  return XML_TOK_PARTIAL;
228
62.2k
}
xmltok.c:normal_scanDecl
Line
Count
Source
183
64.5k
                 const char **nextTokPtr) {
184
64.5k
  REQUIRE_CHAR(enc, ptr, end);
185
64.5k
  switch (BYTE_TYPE(enc, ptr)) {
186
2.25k
  case BT_MINUS:
187
2.25k
    return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
188
6
  case BT_LSQB:
189
6
    *nextTokPtr = ptr + MINBPC(enc);
190
6
    return XML_TOK_COND_SECT_OPEN;
191
968
  case BT_NMSTRT:
192
62.2k
  case BT_HEX:
193
62.2k
    ptr += MINBPC(enc);
194
62.2k
    break;
195
3
  default:
196
3
    *nextTokPtr = ptr;
197
3
    return XML_TOK_INVALID;
198
64.5k
  }
199
441k
  while (HAS_CHAR(enc, ptr, end)) {
200
441k
    switch (BYTE_TYPE(enc, ptr)) {
201
16
    case BT_PERCNT:
202
16
      REQUIRE_CHARS(enc, ptr, end, 2);
203
      /* don't allow <!ENTITY% foo "whatever"> */
204
14
      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
14
      }
212
      /* fall through */
213
26.3k
    case BT_S:
214
57.7k
    case BT_CR:
215
62.2k
    case BT_LF:
216
62.2k
      *nextTokPtr = ptr;
217
62.2k
      return XML_TOK_DECL_OPEN;
218
348k
    case BT_NMSTRT:
219
379k
    case BT_HEX:
220
379k
      ptr += MINBPC(enc);
221
379k
      break;
222
11
    default:
223
11
      *nextTokPtr = ptr;
224
11
      return XML_TOK_INVALID;
225
441k
    }
226
441k
  }
227
54
  return XML_TOK_PARTIAL;
228
62.2k
}
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
54.9k
                      int *tokPtr) {
233
54.9k
  int upper = 0;
234
54.9k
  UNUSED_P(enc);
235
54.9k
  *tokPtr = XML_TOK_PI;
236
54.9k
  if (end - ptr != MINBPC(enc) * 3)
237
37.3k
    return 1;
238
17.6k
  switch (BYTE_TO_ASCII(enc, ptr)) {
239
4.88k
  case ASCII_x:
240
4.88k
    break;
241
3.19k
  case ASCII_X:
242
3.19k
    upper = 1;
243
3.19k
    break;
244
9.51k
  default:
245
9.51k
    return 1;
246
17.6k
  }
247
8.08k
  ptr += MINBPC(enc);
248
8.08k
  switch (BYTE_TO_ASCII(enc, ptr)) {
249
1.82k
  case ASCII_m:
250
1.82k
    break;
251
1.31k
  case ASCII_M:
252
1.31k
    upper = 1;
253
1.31k
    break;
254
4.94k
  default:
255
4.94k
    return 1;
256
8.08k
  }
257
3.13k
  ptr += MINBPC(enc);
258
3.13k
  switch (BYTE_TO_ASCII(enc, ptr)) {
259
1.01k
  case ASCII_l:
260
1.01k
    break;
261
2
  case ASCII_L:
262
2
    upper = 1;
263
2
    break;
264
2.12k
  default:
265
2.12k
    return 1;
266
3.13k
  }
267
1.01k
  if (upper)
268
4
    return 0;
269
1.00k
  *tokPtr = XML_TOK_XML_DECL;
270
1.00k
  return 1;
271
1.01k
}
xmltok.c:normal_checkPiTarget
Line
Count
Source
232
54.9k
                      int *tokPtr) {
233
54.9k
  int upper = 0;
234
54.9k
  UNUSED_P(enc);
235
54.9k
  *tokPtr = XML_TOK_PI;
236
54.9k
  if (end - ptr != MINBPC(enc) * 3)
237
37.3k
    return 1;
238
17.6k
  switch (BYTE_TO_ASCII(enc, ptr)) {
239
4.88k
  case ASCII_x:
240
4.88k
    break;
241
3.19k
  case ASCII_X:
242
3.19k
    upper = 1;
243
3.19k
    break;
244
9.51k
  default:
245
9.51k
    return 1;
246
17.6k
  }
247
8.08k
  ptr += MINBPC(enc);
248
8.08k
  switch (BYTE_TO_ASCII(enc, ptr)) {
249
1.82k
  case ASCII_m:
250
1.82k
    break;
251
1.31k
  case ASCII_M:
252
1.31k
    upper = 1;
253
1.31k
    break;
254
4.94k
  default:
255
4.94k
    return 1;
256
8.08k
  }
257
3.13k
  ptr += MINBPC(enc);
258
3.13k
  switch (BYTE_TO_ASCII(enc, ptr)) {
259
1.01k
  case ASCII_l:
260
1.01k
    break;
261
2
  case ASCII_L:
262
2
    upper = 1;
263
2
    break;
264
2.12k
  default:
265
2.12k
    return 1;
266
3.13k
  }
267
1.01k
  if (upper)
268
4
    return 0;
269
1.00k
  *tokPtr = XML_TOK_XML_DECL;
270
1.00k
  return 1;
271
1.01k
}
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
55.0k
               const char **nextTokPtr) {
278
55.0k
  int tok;
279
55.0k
  const char *target = ptr;
280
55.0k
  REQUIRE_CHAR(enc, ptr, end);
281
55.0k
  switch (BYTE_TYPE(enc, ptr)) {
282
82.2k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
283
2
  default:
284
2
    *nextTokPtr = ptr;
285
2
    return XML_TOK_INVALID;
286
55.0k
  }
287
2.82M
  while (HAS_CHAR(enc, ptr, end)) {
288
2.82M
    switch (BYTE_TYPE(enc, ptr)) {
289
10.6M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
290
17.8k
    case BT_S:
291
19.2k
    case BT_CR:
292
23.3k
    case BT_LF:
293
23.3k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
294
2
        *nextTokPtr = ptr;
295
2
        return XML_TOK_INVALID;
296
2
      }
297
23.3k
      ptr += MINBPC(enc);
298
9.37M
      while (HAS_CHAR(enc, ptr, end)) {
299
9.37M
        switch (BYTE_TYPE(enc, ptr)) {
300
285k
          INVALID_CASES(ptr, nextTokPtr)
301
90.9k
        case BT_QUEST:
302
90.9k
          ptr += MINBPC(enc);
303
90.9k
          REQUIRE_CHAR(enc, ptr, end);
304
90.9k
          if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
305
23.2k
            *nextTokPtr = ptr + MINBPC(enc);
306
23.2k
            return tok;
307
23.2k
          }
308
67.7k
          break;
309
9.13M
        default:
310
9.13M
          ptr += MINBPC(enc);
311
9.13M
          break;
312
9.37M
        }
313
9.37M
      }
314
82
      return XML_TOK_PARTIAL;
315
31.6k
    case BT_QUEST:
316
31.6k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
317
2
        *nextTokPtr = ptr;
318
2
        return XML_TOK_INVALID;
319
2
      }
320
31.6k
      ptr += MINBPC(enc);
321
31.6k
      REQUIRE_CHAR(enc, ptr, end);
322
31.5k
      if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
323
31.5k
        *nextTokPtr = ptr + MINBPC(enc);
324
31.5k
        return tok;
325
31.5k
      }
326
      /* fall through */
327
21
    default:
328
21
      *nextTokPtr = ptr;
329
21
      return XML_TOK_INVALID;
330
2.82M
    }
331
2.82M
  }
332
48
  return XML_TOK_PARTIAL;
333
55.0k
}
xmltok.c:normal_scanPi
Line
Count
Source
277
55.0k
               const char **nextTokPtr) {
278
55.0k
  int tok;
279
55.0k
  const char *target = ptr;
280
55.0k
  REQUIRE_CHAR(enc, ptr, end);
281
55.0k
  switch (BYTE_TYPE(enc, ptr)) {
282
82.2k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
283
2
  default:
284
2
    *nextTokPtr = ptr;
285
2
    return XML_TOK_INVALID;
286
55.0k
  }
287
2.82M
  while (HAS_CHAR(enc, ptr, end)) {
288
2.82M
    switch (BYTE_TYPE(enc, ptr)) {
289
10.6M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
290
17.8k
    case BT_S:
291
19.2k
    case BT_CR:
292
23.3k
    case BT_LF:
293
23.3k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
294
2
        *nextTokPtr = ptr;
295
2
        return XML_TOK_INVALID;
296
2
      }
297
23.3k
      ptr += MINBPC(enc);
298
9.37M
      while (HAS_CHAR(enc, ptr, end)) {
299
9.37M
        switch (BYTE_TYPE(enc, ptr)) {
300
285k
          INVALID_CASES(ptr, nextTokPtr)
301
90.9k
        case BT_QUEST:
302
90.9k
          ptr += MINBPC(enc);
303
90.9k
          REQUIRE_CHAR(enc, ptr, end);
304
90.9k
          if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
305
23.2k
            *nextTokPtr = ptr + MINBPC(enc);
306
23.2k
            return tok;
307
23.2k
          }
308
67.7k
          break;
309
9.13M
        default:
310
9.13M
          ptr += MINBPC(enc);
311
9.13M
          break;
312
9.37M
        }
313
9.37M
      }
314
82
      return XML_TOK_PARTIAL;
315
31.6k
    case BT_QUEST:
316
31.6k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
317
2
        *nextTokPtr = ptr;
318
2
        return XML_TOK_INVALID;
319
2
      }
320
31.6k
      ptr += MINBPC(enc);
321
31.6k
      REQUIRE_CHAR(enc, ptr, end);
322
31.5k
      if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
323
31.5k
        *nextTokPtr = ptr + MINBPC(enc);
324
31.5k
        return tok;
325
31.5k
      }
326
      /* fall through */
327
21
    default:
328
21
      *nextTokPtr = ptr;
329
21
      return XML_TOK_INVALID;
330
2.82M
    }
331
2.82M
  }
332
48
  return XML_TOK_PARTIAL;
333
55.0k
}
Unexecuted instantiation: xmltok.c:little2_scanPi
Unexecuted instantiation: xmltok.c:big2_scanPi
334
335
static int PTRCALL
336
PREFIX(scanCdataSection)(const ENCODING *enc, const char *ptr, const char *end,
337
2.05k
                         const char **nextTokPtr) {
338
2.05k
  static const char CDATA_LSQB[]
339
2.05k
      = {ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, ASCII_LSQB};
340
2.05k
  int i;
341
2.05k
  UNUSED_P(enc);
342
  /* CDATA[ */
343
2.05k
  REQUIRE_CHARS(enc, ptr, end, 6);
344
14.1k
  for (i = 0; i < 6; i++, ptr += MINBPC(enc)) {
345
12.1k
    if (! CHAR_MATCHES(enc, ptr, CDATA_LSQB[i])) {
346
34
      *nextTokPtr = ptr;
347
34
      return XML_TOK_INVALID;
348
34
    }
349
12.1k
  }
350
2.00k
  *nextTokPtr = ptr;
351
2.00k
  return XML_TOK_CDATA_SECT_OPEN;
352
2.04k
}
xmltok.c:normal_scanCdataSection
Line
Count
Source
337
2.05k
                         const char **nextTokPtr) {
338
2.05k
  static const char CDATA_LSQB[]
339
2.05k
      = {ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, ASCII_LSQB};
340
2.05k
  int i;
341
2.05k
  UNUSED_P(enc);
342
  /* CDATA[ */
343
2.05k
  REQUIRE_CHARS(enc, ptr, end, 6);
344
14.1k
  for (i = 0; i < 6; i++, ptr += MINBPC(enc)) {
345
12.1k
    if (! CHAR_MATCHES(enc, ptr, CDATA_LSQB[i])) {
346
34
      *nextTokPtr = ptr;
347
34
      return XML_TOK_INVALID;
348
34
    }
349
12.1k
  }
350
2.00k
  *nextTokPtr = ptr;
351
2.00k
  return XML_TOK_CDATA_SECT_OPEN;
352
2.04k
}
Unexecuted instantiation: xmltok.c:little2_scanCdataSection
Unexecuted instantiation: xmltok.c:big2_scanCdataSection
353
354
static int PTRCALL
355
PREFIX(cdataSectionTok)(const ENCODING *enc, const char *ptr, const char *end,
356
3.73M
                        const char **nextTokPtr) {
357
3.73M
  if (ptr >= end)
358
138
    return XML_TOK_NONE;
359
3.73M
  if (MINBPC(enc) > 1) {
360
0
    size_t n = end - ptr;
361
0
    if (n & (MINBPC(enc) - 1)) {
362
0
      n &= ~(MINBPC(enc) - 1);
363
0
      if (n == 0)
364
0
        return XML_TOK_PARTIAL;
365
0
      end = ptr + n;
366
0
    }
367
0
  }
368
3.73M
  switch (BYTE_TYPE(enc, ptr)) {
369
678k
  case BT_RSQB:
370
678k
    ptr += MINBPC(enc);
371
678k
    REQUIRE_CHAR(enc, ptr, end);
372
678k
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
373
355k
      break;
374
322k
    ptr += MINBPC(enc);
375
322k
    REQUIRE_CHAR(enc, ptr, end);
376
322k
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
377
320k
      ptr -= MINBPC(enc);
378
320k
      break;
379
320k
    }
380
1.88k
    *nextTokPtr = ptr + MINBPC(enc);
381
1.88k
    return XML_TOK_CDATA_SECT_CLOSE;
382
1.24M
  case BT_CR:
383
1.24M
    ptr += MINBPC(enc);
384
1.24M
    REQUIRE_CHAR(enc, ptr, end);
385
1.24M
    if (BYTE_TYPE(enc, ptr) == BT_LF)
386
257k
      ptr += MINBPC(enc);
387
1.24M
    *nextTokPtr = ptr;
388
1.24M
    return XML_TOK_DATA_NEWLINE;
389
1.02M
  case BT_LF:
390
1.02M
    *nextTokPtr = ptr + MINBPC(enc);
391
1.02M
    return XML_TOK_DATA_NEWLINE;
392
1.02M
    INVALID_CASES(ptr, nextTokPtr)
393
644k
  default:
394
644k
    ptr += MINBPC(enc);
395
644k
    break;
396
3.73M
  }
397
18.9M
  while (HAS_CHAR(enc, ptr, end)) {
398
18.9M
    switch (BYTE_TYPE(enc, ptr)) {
399
0
#  define LEAD_CASE(n)                                                         \
400
253k
  case BT_LEAD##n:                                                             \
401
253k
    if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) {                       \
402
19
      *nextTokPtr = ptr;                                                       \
403
19
      return XML_TOK_DATA_CHARS;                                               \
404
19
    }                                                                          \
405
253k
    ptr += n;                                                                  \
406
253k
    break;
407
108k
      LEAD_CASE(2)
408
85.0k
      LEAD_CASE(3)
409
60.2k
      LEAD_CASE(4)
410
0
#  undef LEAD_CASE
411
4
    case BT_NONXML:
412
7
    case BT_MALFORM:
413
11
    case BT_TRAIL:
414
549k
    case BT_CR:
415
898k
    case BT_LF:
416
1.46M
    case BT_RSQB:
417
1.46M
      *nextTokPtr = ptr;
418
1.46M
      return XML_TOK_DATA_CHARS;
419
17.2M
    default:
420
17.2M
      ptr += MINBPC(enc);
421
17.2M
      break;
422
18.9M
    }
423
18.9M
  }
424
46
  *nextTokPtr = ptr;
425
46
  return XML_TOK_DATA_CHARS;
426
1.46M
}
xmltok.c:normal_cdataSectionTok
Line
Count
Source
356
3.73M
                        const char **nextTokPtr) {
357
3.73M
  if (ptr >= end)
358
138
    return XML_TOK_NONE;
359
3.73M
  if (MINBPC(enc) > 1) {
360
0
    size_t n = end - ptr;
361
0
    if (n & (MINBPC(enc) - 1)) {
362
0
      n &= ~(MINBPC(enc) - 1);
363
0
      if (n == 0)
364
0
        return XML_TOK_PARTIAL;
365
0
      end = ptr + n;
366
0
    }
367
0
  }
368
3.73M
  switch (BYTE_TYPE(enc, ptr)) {
369
678k
  case BT_RSQB:
370
678k
    ptr += MINBPC(enc);
371
678k
    REQUIRE_CHAR(enc, ptr, end);
372
678k
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
373
355k
      break;
374
322k
    ptr += MINBPC(enc);
375
322k
    REQUIRE_CHAR(enc, ptr, end);
376
322k
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
377
320k
      ptr -= MINBPC(enc);
378
320k
      break;
379
320k
    }
380
1.88k
    *nextTokPtr = ptr + MINBPC(enc);
381
1.88k
    return XML_TOK_CDATA_SECT_CLOSE;
382
1.24M
  case BT_CR:
383
1.24M
    ptr += MINBPC(enc);
384
1.24M
    REQUIRE_CHAR(enc, ptr, end);
385
1.24M
    if (BYTE_TYPE(enc, ptr) == BT_LF)
386
257k
      ptr += MINBPC(enc);
387
1.24M
    *nextTokPtr = ptr;
388
1.24M
    return XML_TOK_DATA_NEWLINE;
389
1.02M
  case BT_LF:
390
1.02M
    *nextTokPtr = ptr + MINBPC(enc);
391
1.02M
    return XML_TOK_DATA_NEWLINE;
392
1.02M
    INVALID_CASES(ptr, nextTokPtr)
393
644k
  default:
394
644k
    ptr += MINBPC(enc);
395
644k
    break;
396
3.73M
  }
397
18.9M
  while (HAS_CHAR(enc, ptr, end)) {
398
18.9M
    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
108k
      LEAD_CASE(2)
408
85.0k
      LEAD_CASE(3)
409
60.2k
      LEAD_CASE(4)
410
0
#  undef LEAD_CASE
411
4
    case BT_NONXML:
412
7
    case BT_MALFORM:
413
11
    case BT_TRAIL:
414
549k
    case BT_CR:
415
898k
    case BT_LF:
416
1.46M
    case BT_RSQB:
417
1.46M
      *nextTokPtr = ptr;
418
1.46M
      return XML_TOK_DATA_CHARS;
419
17.2M
    default:
420
17.2M
      ptr += MINBPC(enc);
421
17.2M
      break;
422
18.9M
    }
423
18.9M
  }
424
46
  *nextTokPtr = ptr;
425
46
  return XML_TOK_DATA_CHARS;
426
1.46M
}
Unexecuted instantiation: xmltok.c:little2_cdataSectionTok
Unexecuted instantiation: xmltok.c:big2_cdataSectionTok
427
428
/* ptr points to character following "</" */
429
430
static int PTRCALL
431
PREFIX(scanEndTag)(const ENCODING *enc, const char *ptr, const char *end,
432
54.5k
                   const char **nextTokPtr) {
433
54.5k
  REQUIRE_CHAR(enc, ptr, end);
434
54.5k
  switch (BYTE_TYPE(enc, ptr)) {
435
52.4k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
436
7
  default:
437
7
    *nextTokPtr = ptr;
438
7
    return XML_TOK_INVALID;
439
54.5k
  }
440
412k
  while (HAS_CHAR(enc, ptr, end)) {
441
412k
    switch (BYTE_TYPE(enc, ptr)) {
442
1.17M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
443
294
    case BT_S:
444
909
    case BT_CR:
445
4.24k
    case BT_LF:
446
11.4k
      for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
447
11.4k
        switch (BYTE_TYPE(enc, ptr)) {
448
1.48k
        case BT_S:
449
3.48k
        case BT_CR:
450
7.28k
        case BT_LF:
451
7.28k
          break;
452
4.20k
        case BT_GT:
453
4.20k
          *nextTokPtr = ptr + MINBPC(enc);
454
4.20k
          return XML_TOK_END_TAG;
455
5
        default:
456
5
          *nextTokPtr = ptr;
457
5
          return XML_TOK_INVALID;
458
11.4k
        }
459
11.4k
      }
460
32
      return XML_TOK_PARTIAL;
461
#  ifdef XML_NS
462
    case BT_COLON:
463
      /* no need to check qname syntax here,
464
         since end-tag must match exactly */
465
      ptr += MINBPC(enc);
466
      break;
467
#  endif
468
50.1k
    case BT_GT:
469
50.1k
      *nextTokPtr = ptr + MINBPC(enc);
470
50.1k
      return XML_TOK_END_TAG;
471
6
    default:
472
6
      *nextTokPtr = ptr;
473
6
      return XML_TOK_INVALID;
474
412k
    }
475
412k
  }
476
64
  return XML_TOK_PARTIAL;
477
54.4k
}
xmltok.c:normal_scanEndTag
Line
Count
Source
432
54.5k
                   const char **nextTokPtr) {
433
54.5k
  REQUIRE_CHAR(enc, ptr, end);
434
54.5k
  switch (BYTE_TYPE(enc, ptr)) {
435
52.4k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
436
7
  default:
437
7
    *nextTokPtr = ptr;
438
7
    return XML_TOK_INVALID;
439
54.5k
  }
440
412k
  while (HAS_CHAR(enc, ptr, end)) {
441
412k
    switch (BYTE_TYPE(enc, ptr)) {
442
1.17M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
443
294
    case BT_S:
444
909
    case BT_CR:
445
4.24k
    case BT_LF:
446
11.4k
      for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
447
11.4k
        switch (BYTE_TYPE(enc, ptr)) {
448
1.48k
        case BT_S:
449
3.48k
        case BT_CR:
450
7.28k
        case BT_LF:
451
7.28k
          break;
452
4.20k
        case BT_GT:
453
4.20k
          *nextTokPtr = ptr + MINBPC(enc);
454
4.20k
          return XML_TOK_END_TAG;
455
5
        default:
456
5
          *nextTokPtr = ptr;
457
5
          return XML_TOK_INVALID;
458
11.4k
        }
459
11.4k
      }
460
32
      return XML_TOK_PARTIAL;
461
#  ifdef XML_NS
462
    case BT_COLON:
463
      /* no need to check qname syntax here,
464
         since end-tag must match exactly */
465
      ptr += MINBPC(enc);
466
      break;
467
#  endif
468
50.1k
    case BT_GT:
469
50.1k
      *nextTokPtr = ptr + MINBPC(enc);
470
50.1k
      return XML_TOK_END_TAG;
471
6
    default:
472
6
      *nextTokPtr = ptr;
473
6
      return XML_TOK_INVALID;
474
412k
    }
475
412k
  }
476
64
  return XML_TOK_PARTIAL;
477
54.4k
}
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
187k
                       const char **nextTokPtr) {
484
187k
  if (HAS_CHAR(enc, ptr, end)) {
485
187k
    switch (BYTE_TYPE(enc, ptr)) {
486
72.2k
    case BT_DIGIT:
487
187k
    case BT_HEX:
488
187k
      break;
489
2
    default:
490
2
      *nextTokPtr = ptr;
491
2
      return XML_TOK_INVALID;
492
187k
    }
493
673k
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
494
673k
      switch (BYTE_TYPE(enc, ptr)) {
495
347k
      case BT_DIGIT:
496
486k
      case BT_HEX:
497
486k
        break;
498
187k
      case BT_SEMI:
499
187k
        *nextTokPtr = ptr + MINBPC(enc);
500
187k
        return XML_TOK_CHAR_REF;
501
1
      default:
502
1
        *nextTokPtr = ptr;
503
1
        return XML_TOK_INVALID;
504
673k
      }
505
673k
    }
506
187k
  }
507
18
  return XML_TOK_PARTIAL;
508
187k
}
xmltok.c:normal_scanHexCharRef
Line
Count
Source
483
187k
                       const char **nextTokPtr) {
484
187k
  if (HAS_CHAR(enc, ptr, end)) {
485
187k
    switch (BYTE_TYPE(enc, ptr)) {
486
72.2k
    case BT_DIGIT:
487
187k
    case BT_HEX:
488
187k
      break;
489
2
    default:
490
2
      *nextTokPtr = ptr;
491
2
      return XML_TOK_INVALID;
492
187k
    }
493
673k
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
494
673k
      switch (BYTE_TYPE(enc, ptr)) {
495
347k
      case BT_DIGIT:
496
486k
      case BT_HEX:
497
486k
        break;
498
187k
      case BT_SEMI:
499
187k
        *nextTokPtr = ptr + MINBPC(enc);
500
187k
        return XML_TOK_CHAR_REF;
501
1
      default:
502
1
        *nextTokPtr = ptr;
503
1
        return XML_TOK_INVALID;
504
673k
      }
505
673k
    }
506
187k
  }
507
18
  return XML_TOK_PARTIAL;
508
187k
}
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
192k
                    const char **nextTokPtr) {
515
192k
  if (HAS_CHAR(enc, ptr, end)) {
516
192k
    if (CHAR_MATCHES(enc, ptr, ASCII_x))
517
187k
      return PREFIX(scanHexCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
518
4.97k
    switch (BYTE_TYPE(enc, ptr)) {
519
4.96k
    case BT_DIGIT:
520
4.96k
      break;
521
10
    default:
522
10
      *nextTokPtr = ptr;
523
10
      return XML_TOK_INVALID;
524
4.97k
    }
525
16.1k
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
526
16.1k
      switch (BYTE_TYPE(enc, ptr)) {
527
11.1k
      case BT_DIGIT:
528
11.1k
        break;
529
4.95k
      case BT_SEMI:
530
4.95k
        *nextTokPtr = ptr + MINBPC(enc);
531
4.95k
        return XML_TOK_CHAR_REF;
532
2
      default:
533
2
        *nextTokPtr = ptr;
534
2
        return XML_TOK_INVALID;
535
16.1k
      }
536
16.1k
    }
537
4.96k
  }
538
14
  return XML_TOK_PARTIAL;
539
192k
}
xmltok.c:normal_scanCharRef
Line
Count
Source
514
192k
                    const char **nextTokPtr) {
515
192k
  if (HAS_CHAR(enc, ptr, end)) {
516
192k
    if (CHAR_MATCHES(enc, ptr, ASCII_x))
517
187k
      return PREFIX(scanHexCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
518
4.97k
    switch (BYTE_TYPE(enc, ptr)) {
519
4.96k
    case BT_DIGIT:
520
4.96k
      break;
521
10
    default:
522
10
      *nextTokPtr = ptr;
523
10
      return XML_TOK_INVALID;
524
4.97k
    }
525
16.1k
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
526
16.1k
      switch (BYTE_TYPE(enc, ptr)) {
527
11.1k
      case BT_DIGIT:
528
11.1k
        break;
529
4.95k
      case BT_SEMI:
530
4.95k
        *nextTokPtr = ptr + MINBPC(enc);
531
4.95k
        return XML_TOK_CHAR_REF;
532
2
      default:
533
2
        *nextTokPtr = ptr;
534
2
        return XML_TOK_INVALID;
535
16.1k
      }
536
16.1k
    }
537
4.96k
  }
538
14
  return XML_TOK_PARTIAL;
539
192k
}
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
462k
                const char **nextTokPtr) {
546
462k
  REQUIRE_CHAR(enc, ptr, end);
547
462k
  switch (BYTE_TYPE(enc, ptr)) {
548
150k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
549
192k
  case BT_NUM:
550
192k
    return PREFIX(scanCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
551
3
  default:
552
3
    *nextTokPtr = ptr;
553
3
    return XML_TOK_INVALID;
554
462k
  }
555
1.42M
  while (HAS_CHAR(enc, ptr, end)) {
556
1.42M
    switch (BYTE_TYPE(enc, ptr)) {
557
4.15M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
558
269k
    case BT_SEMI:
559
269k
      *nextTokPtr = ptr + MINBPC(enc);
560
269k
      return XML_TOK_ENTITY_REF;
561
8
    default:
562
8
      *nextTokPtr = ptr;
563
8
      return XML_TOK_INVALID;
564
1.42M
    }
565
1.42M
  }
566
40
  return XML_TOK_PARTIAL;
567
269k
}
xmltok.c:normal_scanRef
Line
Count
Source
545
462k
                const char **nextTokPtr) {
546
462k
  REQUIRE_CHAR(enc, ptr, end);
547
462k
  switch (BYTE_TYPE(enc, ptr)) {
548
150k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
549
192k
  case BT_NUM:
550
192k
    return PREFIX(scanCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
551
3
  default:
552
3
    *nextTokPtr = ptr;
553
3
    return XML_TOK_INVALID;
554
462k
  }
555
1.42M
  while (HAS_CHAR(enc, ptr, end)) {
556
1.42M
    switch (BYTE_TYPE(enc, ptr)) {
557
4.15M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
558
269k
    case BT_SEMI:
559
269k
      *nextTokPtr = ptr + MINBPC(enc);
560
269k
      return XML_TOK_ENTITY_REF;
561
8
    default:
562
8
      *nextTokPtr = ptr;
563
8
      return XML_TOK_INVALID;
564
1.42M
    }
565
1.42M
  }
566
40
  return XML_TOK_PARTIAL;
567
269k
}
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
65.8k
                 const char **nextTokPtr) {
574
#  ifdef XML_NS
575
  int hadColon = 0;
576
#  endif
577
2.98M
  while (HAS_CHAR(enc, ptr, end)) {
578
2.98M
    switch (BYTE_TYPE(enc, ptr)) {
579
2.59M
      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
5.08k
    case BT_S:
598
27.5k
    case BT_CR:
599
29.3k
    case BT_LF:
600
76.6k
      for (;;) {
601
76.6k
        int t;
602
603
76.6k
        ptr += MINBPC(enc);
604
76.6k
        REQUIRE_CHAR(enc, ptr, end);
605
76.6k
        t = BYTE_TYPE(enc, ptr);
606
76.6k
        if (t == BT_EQUALS)
607
29.2k
          break;
608
47.3k
        switch (t) {
609
7.79k
        case BT_S:
610
11.5k
        case BT_LF:
611
47.3k
        case BT_CR:
612
47.3k
          break;
613
10
        default:
614
10
          *nextTokPtr = ptr;
615
10
          return XML_TOK_INVALID;
616
47.3k
        }
617
47.3k
      }
618
      /* fall through */
619
2.21M
    case BT_EQUALS: {
620
2.21M
      int open;
621
#  ifdef XML_NS
622
      hadColon = 0;
623
#  endif
624
2.29M
      for (;;) {
625
2.29M
        ptr += MINBPC(enc);
626
2.29M
        REQUIRE_CHAR(enc, ptr, end);
627
2.29M
        open = BYTE_TYPE(enc, ptr);
628
2.29M
        if (open == BT_QUOT || open == BT_APOS)
629
2.21M
          break;
630
79.2k
        switch (open) {
631
13.4k
        case BT_S:
632
29.4k
        case BT_LF:
633
79.2k
        case BT_CR:
634
79.2k
          break;
635
10
        default:
636
10
          *nextTokPtr = ptr;
637
10
          return XML_TOK_INVALID;
638
79.2k
        }
639
79.2k
      }
640
2.21M
      ptr += MINBPC(enc);
641
      /* in attribute value */
642
18.1M
      for (;;) {
643
18.1M
        int t;
644
18.1M
        REQUIRE_CHAR(enc, ptr, end);
645
18.1M
        t = BYTE_TYPE(enc, ptr);
646
18.1M
        if (t == open)
647
2.21M
          break;
648
15.9M
        switch (t) {
649
494k
          INVALID_CASES(ptr, nextTokPtr)
650
128k
        case BT_AMP: {
651
128k
          int tok = PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, &ptr);
652
128k
          if (tok <= 0) {
653
48
            if (tok == XML_TOK_INVALID)
654
24
              *nextTokPtr = ptr;
655
48
            return tok;
656
48
          }
657
128k
          break;
658
128k
        }
659
128k
        case BT_LT:
660
4
          *nextTokPtr = ptr;
661
4
          return XML_TOK_INVALID;
662
15.5M
        default:
663
15.5M
          ptr += MINBPC(enc);
664
15.5M
          break;
665
15.9M
        }
666
15.9M
      }
667
2.21M
      ptr += MINBPC(enc);
668
2.21M
      REQUIRE_CHAR(enc, ptr, end);
669
2.21M
      switch (BYTE_TYPE(enc, ptr)) {
670
1.13M
      case BT_S:
671
2.14M
      case BT_CR:
672
2.16M
      case BT_LF:
673
2.16M
        break;
674
39.4k
      case BT_SOL:
675
39.4k
        goto sol;
676
10.6k
      case BT_GT:
677
10.6k
        goto gt;
678
3
      default:
679
3
        *nextTokPtr = ptr;
680
3
        return XML_TOK_INVALID;
681
2.21M
      }
682
      /* ptr points to closing quote */
683
2.41M
      for (;;) {
684
2.41M
        ptr += MINBPC(enc);
685
2.41M
        REQUIRE_CHAR(enc, ptr, end);
686
2.41M
        switch (BYTE_TYPE(enc, ptr)) {
687
2.13M
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
688
150k
        case BT_S:
689
191k
        case BT_CR:
690
247k
        case BT_LF:
691
247k
          continue;
692
499
        case BT_GT:
693
11.1k
        gt:
694
11.1k
          *nextTokPtr = ptr + MINBPC(enc);
695
11.1k
          return XML_TOK_START_TAG_WITH_ATTS;
696
14.7k
        case BT_SOL:
697
54.2k
        sol:
698
54.2k
          ptr += MINBPC(enc);
699
54.2k
          REQUIRE_CHAR(enc, ptr, end);
700
54.2k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
701
5
            *nextTokPtr = ptr;
702
5
            return XML_TOK_INVALID;
703
5
          }
704
54.2k
          *nextTokPtr = ptr + MINBPC(enc);
705
54.2k
          return XML_TOK_EMPTY_ELEMENT_WITH_ATTS;
706
4
        default:
707
4
          *nextTokPtr = ptr;
708
4
          return XML_TOK_INVALID;
709
2.41M
        }
710
2.14M
        break;
711
2.41M
      }
712
2.14M
      break;
713
2.16M
    }
714
2.14M
    default:
715
14
      *nextTokPtr = ptr;
716
14
      return XML_TOK_INVALID;
717
2.98M
    }
718
2.98M
  }
719
58
  return XML_TOK_PARTIAL;
720
65.8k
}
xmltok.c:normal_scanAtts
Line
Count
Source
573
65.8k
                 const char **nextTokPtr) {
574
#  ifdef XML_NS
575
  int hadColon = 0;
576
#  endif
577
2.98M
  while (HAS_CHAR(enc, ptr, end)) {
578
2.98M
    switch (BYTE_TYPE(enc, ptr)) {
579
2.59M
      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
5.08k
    case BT_S:
598
27.5k
    case BT_CR:
599
29.3k
    case BT_LF:
600
76.6k
      for (;;) {
601
76.6k
        int t;
602
603
76.6k
        ptr += MINBPC(enc);
604
76.6k
        REQUIRE_CHAR(enc, ptr, end);
605
76.6k
        t = BYTE_TYPE(enc, ptr);
606
76.6k
        if (t == BT_EQUALS)
607
29.2k
          break;
608
47.3k
        switch (t) {
609
7.79k
        case BT_S:
610
11.5k
        case BT_LF:
611
47.3k
        case BT_CR:
612
47.3k
          break;
613
10
        default:
614
10
          *nextTokPtr = ptr;
615
10
          return XML_TOK_INVALID;
616
47.3k
        }
617
47.3k
      }
618
      /* fall through */
619
2.21M
    case BT_EQUALS: {
620
2.21M
      int open;
621
#  ifdef XML_NS
622
      hadColon = 0;
623
#  endif
624
2.29M
      for (;;) {
625
2.29M
        ptr += MINBPC(enc);
626
2.29M
        REQUIRE_CHAR(enc, ptr, end);
627
2.29M
        open = BYTE_TYPE(enc, ptr);
628
2.29M
        if (open == BT_QUOT || open == BT_APOS)
629
2.21M
          break;
630
79.2k
        switch (open) {
631
13.4k
        case BT_S:
632
29.4k
        case BT_LF:
633
79.2k
        case BT_CR:
634
79.2k
          break;
635
10
        default:
636
10
          *nextTokPtr = ptr;
637
10
          return XML_TOK_INVALID;
638
79.2k
        }
639
79.2k
      }
640
2.21M
      ptr += MINBPC(enc);
641
      /* in attribute value */
642
18.1M
      for (;;) {
643
18.1M
        int t;
644
18.1M
        REQUIRE_CHAR(enc, ptr, end);
645
18.1M
        t = BYTE_TYPE(enc, ptr);
646
18.1M
        if (t == open)
647
2.21M
          break;
648
15.9M
        switch (t) {
649
494k
          INVALID_CASES(ptr, nextTokPtr)
650
128k
        case BT_AMP: {
651
128k
          int tok = PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, &ptr);
652
128k
          if (tok <= 0) {
653
48
            if (tok == XML_TOK_INVALID)
654
24
              *nextTokPtr = ptr;
655
48
            return tok;
656
48
          }
657
128k
          break;
658
128k
        }
659
128k
        case BT_LT:
660
4
          *nextTokPtr = ptr;
661
4
          return XML_TOK_INVALID;
662
15.5M
        default:
663
15.5M
          ptr += MINBPC(enc);
664
15.5M
          break;
665
15.9M
        }
666
15.9M
      }
667
2.21M
      ptr += MINBPC(enc);
668
2.21M
      REQUIRE_CHAR(enc, ptr, end);
669
2.21M
      switch (BYTE_TYPE(enc, ptr)) {
670
1.13M
      case BT_S:
671
2.14M
      case BT_CR:
672
2.16M
      case BT_LF:
673
2.16M
        break;
674
39.4k
      case BT_SOL:
675
39.4k
        goto sol;
676
10.6k
      case BT_GT:
677
10.6k
        goto gt;
678
3
      default:
679
3
        *nextTokPtr = ptr;
680
3
        return XML_TOK_INVALID;
681
2.21M
      }
682
      /* ptr points to closing quote */
683
2.41M
      for (;;) {
684
2.41M
        ptr += MINBPC(enc);
685
2.41M
        REQUIRE_CHAR(enc, ptr, end);
686
2.41M
        switch (BYTE_TYPE(enc, ptr)) {
687
2.13M
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
688
150k
        case BT_S:
689
191k
        case BT_CR:
690
247k
        case BT_LF:
691
247k
          continue;
692
499
        case BT_GT:
693
11.1k
        gt:
694
11.1k
          *nextTokPtr = ptr + MINBPC(enc);
695
11.1k
          return XML_TOK_START_TAG_WITH_ATTS;
696
14.7k
        case BT_SOL:
697
54.2k
        sol:
698
54.2k
          ptr += MINBPC(enc);
699
54.2k
          REQUIRE_CHAR(enc, ptr, end);
700
54.2k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
701
5
            *nextTokPtr = ptr;
702
5
            return XML_TOK_INVALID;
703
5
          }
704
54.2k
          *nextTokPtr = ptr + MINBPC(enc);
705
54.2k
          return XML_TOK_EMPTY_ELEMENT_WITH_ATTS;
706
4
        default:
707
4
          *nextTokPtr = ptr;
708
4
          return XML_TOK_INVALID;
709
2.41M
        }
710
2.14M
        break;
711
2.41M
      }
712
2.14M
      break;
713
2.16M
    }
714
2.14M
    default:
715
14
      *nextTokPtr = ptr;
716
14
      return XML_TOK_INVALID;
717
2.98M
    }
718
2.98M
  }
719
58
  return XML_TOK_PARTIAL;
720
65.8k
}
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
489k
               const char **nextTokPtr) {
727
#  ifdef XML_NS
728
  int hadColon;
729
#  endif
730
489k
  REQUIRE_CHAR(enc, ptr, end);
731
489k
  switch (BYTE_TYPE(enc, ptr)) {
732
323k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
733
23.0k
  case BT_EXCL:
734
23.0k
    ptr += MINBPC(enc);
735
23.0k
    REQUIRE_CHAR(enc, ptr, end);
736
23.0k
    switch (BYTE_TYPE(enc, ptr)) {
737
20.9k
    case BT_MINUS:
738
20.9k
      return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
739
2.05k
    case BT_LSQB:
740
2.05k
      return PREFIX(scanCdataSection)(enc, ptr + MINBPC(enc), end, nextTokPtr);
741
23.0k
    }
742
3
    *nextTokPtr = ptr;
743
3
    return XML_TOK_INVALID;
744
46.7k
  case BT_QUEST:
745
46.7k
    return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
746
54.5k
  case BT_SOL:
747
54.5k
    return PREFIX(scanEndTag)(enc, ptr + MINBPC(enc), end, nextTokPtr);
748
9
  default:
749
9
    *nextTokPtr = ptr;
750
9
    return XML_TOK_INVALID;
751
489k
  }
752
#  ifdef XML_NS
753
  hadColon = 0;
754
#  endif
755
  /* we have a start-tag */
756
8.60M
  while (HAS_CHAR(enc, ptr, end)) {
757
8.60M
    switch (BYTE_TYPE(enc, ptr)) {
758
32.3M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
759
#  ifdef XML_NS
760
    case BT_COLON:
761
      if (hadColon) {
762
        *nextTokPtr = ptr;
763
        return XML_TOK_INVALID;
764
      }
765
      hadColon = 1;
766
      ptr += MINBPC(enc);
767
      REQUIRE_CHAR(enc, ptr, end);
768
      switch (BYTE_TYPE(enc, ptr)) {
769
        CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
770
      default:
771
        *nextTokPtr = ptr;
772
        return XML_TOK_INVALID;
773
      }
774
      break;
775
#  endif
776
56.4k
    case BT_S:
777
69.0k
    case BT_CR:
778
74.6k
    case BT_LF: {
779
74.6k
      ptr += MINBPC(enc);
780
113k
      while (HAS_CHAR(enc, ptr, end)) {
781
113k
        switch (BYTE_TYPE(enc, ptr)) {
782
35.8k
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
783
927
        case BT_GT:
784
927
          goto gt;
785
7.85k
        case BT_SOL:
786
7.85k
          goto sol;
787
4.32k
        case BT_S:
788
37.0k
        case BT_CR:
789
39.0k
        case BT_LF:
790
39.0k
          ptr += MINBPC(enc);
791
39.0k
          continue;
792
2
        default:
793
2
          *nextTokPtr = ptr;
794
2
          return XML_TOK_INVALID;
795
113k
        }
796
65.8k
        return PREFIX(scanAtts)(enc, ptr, end, nextTokPtr);
797
113k
      }
798
42
      return XML_TOK_PARTIAL;
799
74.6k
    }
800
179k
    case BT_GT:
801
180k
    gt:
802
180k
      *nextTokPtr = ptr + MINBPC(enc);
803
180k
      return XML_TOK_START_TAG_NO_ATTS;
804
111k
    case BT_SOL:
805
119k
    sol:
806
119k
      ptr += MINBPC(enc);
807
119k
      REQUIRE_CHAR(enc, ptr, end);
808
119k
      if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
809
9
        *nextTokPtr = ptr;
810
9
        return XML_TOK_INVALID;
811
9
      }
812
119k
      *nextTokPtr = ptr + MINBPC(enc);
813
119k
      return XML_TOK_EMPTY_ELEMENT_NO_ATTS;
814
11
    default:
815
11
      *nextTokPtr = ptr;
816
11
      return XML_TOK_INVALID;
817
8.60M
    }
818
8.60M
  }
819
120
  return XML_TOK_PARTIAL;
820
365k
}
xmltok.c:normal_scanLt
Line
Count
Source
726
489k
               const char **nextTokPtr) {
727
#  ifdef XML_NS
728
  int hadColon;
729
#  endif
730
489k
  REQUIRE_CHAR(enc, ptr, end);
731
489k
  switch (BYTE_TYPE(enc, ptr)) {
732
323k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
733
23.0k
  case BT_EXCL:
734
23.0k
    ptr += MINBPC(enc);
735
23.0k
    REQUIRE_CHAR(enc, ptr, end);
736
23.0k
    switch (BYTE_TYPE(enc, ptr)) {
737
20.9k
    case BT_MINUS:
738
20.9k
      return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
739
2.05k
    case BT_LSQB:
740
2.05k
      return PREFIX(scanCdataSection)(enc, ptr + MINBPC(enc), end, nextTokPtr);
741
23.0k
    }
742
3
    *nextTokPtr = ptr;
743
3
    return XML_TOK_INVALID;
744
46.7k
  case BT_QUEST:
745
46.7k
    return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
746
54.5k
  case BT_SOL:
747
54.5k
    return PREFIX(scanEndTag)(enc, ptr + MINBPC(enc), end, nextTokPtr);
748
9
  default:
749
9
    *nextTokPtr = ptr;
750
9
    return XML_TOK_INVALID;
751
489k
  }
752
#  ifdef XML_NS
753
  hadColon = 0;
754
#  endif
755
  /* we have a start-tag */
756
8.60M
  while (HAS_CHAR(enc, ptr, end)) {
757
8.60M
    switch (BYTE_TYPE(enc, ptr)) {
758
32.3M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
759
#  ifdef XML_NS
760
    case BT_COLON:
761
      if (hadColon) {
762
        *nextTokPtr = ptr;
763
        return XML_TOK_INVALID;
764
      }
765
      hadColon = 1;
766
      ptr += MINBPC(enc);
767
      REQUIRE_CHAR(enc, ptr, end);
768
      switch (BYTE_TYPE(enc, ptr)) {
769
        CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
770
      default:
771
        *nextTokPtr = ptr;
772
        return XML_TOK_INVALID;
773
      }
774
      break;
775
#  endif
776
56.4k
    case BT_S:
777
69.0k
    case BT_CR:
778
74.6k
    case BT_LF: {
779
74.6k
      ptr += MINBPC(enc);
780
113k
      while (HAS_CHAR(enc, ptr, end)) {
781
113k
        switch (BYTE_TYPE(enc, ptr)) {
782
35.8k
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
783
927
        case BT_GT:
784
927
          goto gt;
785
7.85k
        case BT_SOL:
786
7.85k
          goto sol;
787
4.32k
        case BT_S:
788
37.0k
        case BT_CR:
789
39.0k
        case BT_LF:
790
39.0k
          ptr += MINBPC(enc);
791
39.0k
          continue;
792
2
        default:
793
2
          *nextTokPtr = ptr;
794
2
          return XML_TOK_INVALID;
795
113k
        }
796
65.8k
        return PREFIX(scanAtts)(enc, ptr, end, nextTokPtr);
797
113k
      }
798
42
      return XML_TOK_PARTIAL;
799
74.6k
    }
800
179k
    case BT_GT:
801
180k
    gt:
802
180k
      *nextTokPtr = ptr + MINBPC(enc);
803
180k
      return XML_TOK_START_TAG_NO_ATTS;
804
111k
    case BT_SOL:
805
119k
    sol:
806
119k
      ptr += MINBPC(enc);
807
119k
      REQUIRE_CHAR(enc, ptr, end);
808
119k
      if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
809
9
        *nextTokPtr = ptr;
810
9
        return XML_TOK_INVALID;
811
9
      }
812
119k
      *nextTokPtr = ptr + MINBPC(enc);
813
119k
      return XML_TOK_EMPTY_ELEMENT_NO_ATTS;
814
11
    default:
815
11
      *nextTokPtr = ptr;
816
11
      return XML_TOK_INVALID;
817
8.60M
    }
818
8.60M
  }
819
120
  return XML_TOK_PARTIAL;
820
365k
}
Unexecuted instantiation: xmltok.c:little2_scanLt
Unexecuted instantiation: xmltok.c:big2_scanLt
821
822
static int PTRCALL
823
PREFIX(contentTok)(const ENCODING *enc, const char *ptr, const char *end,
824
4.83M
                   const char **nextTokPtr) {
825
4.83M
  if (ptr >= end)
826
5.98k
    return XML_TOK_NONE;
827
4.82M
  if (MINBPC(enc) > 1) {
828
0
    size_t n = end - ptr;
829
0
    if (n & (MINBPC(enc) - 1)) {
830
0
      n &= ~(MINBPC(enc) - 1);
831
0
      if (n == 0)
832
0
        return XML_TOK_PARTIAL;
833
0
      end = ptr + n;
834
0
    }
835
0
  }
836
4.82M
  switch (BYTE_TYPE(enc, ptr)) {
837
489k
  case BT_LT:
838
489k
    return PREFIX(scanLt)(enc, ptr + MINBPC(enc), end, nextTokPtr);
839
46.9k
  case BT_AMP:
840
46.9k
    return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
841
1.83M
  case BT_CR:
842
1.83M
    ptr += MINBPC(enc);
843
1.83M
    if (! HAS_CHAR(enc, ptr, end))
844
18
      return XML_TOK_TRAILING_CR;
845
1.83M
    if (BYTE_TYPE(enc, ptr) == BT_LF)
846
373k
      ptr += MINBPC(enc);
847
1.83M
    *nextTokPtr = ptr;
848
1.83M
    return XML_TOK_DATA_NEWLINE;
849
1.43M
  case BT_LF:
850
1.43M
    *nextTokPtr = ptr + MINBPC(enc);
851
1.43M
    return XML_TOK_DATA_NEWLINE;
852
75.8k
  case BT_RSQB:
853
75.8k
    ptr += MINBPC(enc);
854
75.8k
    if (! HAS_CHAR(enc, ptr, end))
855
8
      return XML_TOK_TRAILING_RSQB;
856
75.8k
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
857
29.5k
      break;
858
46.2k
    ptr += MINBPC(enc);
859
46.2k
    if (! HAS_CHAR(enc, ptr, end))
860
4
      return XML_TOK_TRAILING_RSQB;
861
46.2k
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
862
46.2k
      ptr -= MINBPC(enc);
863
46.2k
      break;
864
46.2k
    }
865
1
    *nextTokPtr = ptr;
866
1
    return XML_TOK_INVALID;
867
115k
    INVALID_CASES(ptr, nextTokPtr)
868
892k
  default:
869
892k
    ptr += MINBPC(enc);
870
892k
    break;
871
4.82M
  }
872
19.1M
  while (HAS_CHAR(enc, ptr, end)) {
873
19.1M
    switch (BYTE_TYPE(enc, ptr)) {
874
0
#  define LEAD_CASE(n)                                                         \
875
160k
  case BT_LEAD##n:                                                             \
876
160k
    if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) {                       \
877
32
      *nextTokPtr = ptr;                                                       \
878
32
      return XML_TOK_DATA_CHARS;                                               \
879
32
    }                                                                          \
880
160k
    ptr += n;                                                                  \
881
160k
    break;
882
89.3k
      LEAD_CASE(2)
883
29.4k
      LEAD_CASE(3)
884
41.8k
      LEAD_CASE(4)
885
0
#  undef LEAD_CASE
886
567k
    case BT_RSQB:
887
567k
      if (HAS_CHARS(enc, ptr, end, 2)) {
888
567k
        if (! CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_RSQB)) {
889
181k
          ptr += MINBPC(enc);
890
181k
          break;
891
181k
        }
892
385k
        if (HAS_CHARS(enc, ptr, end, 3)) {
893
385k
          if (! CHAR_MATCHES(enc, ptr + 2 * MINBPC(enc), ASCII_GT)) {
894
385k
            ptr += MINBPC(enc);
895
385k
            break;
896
385k
          }
897
2
          *nextTokPtr = ptr + 2 * MINBPC(enc);
898
2
          return XML_TOK_INVALID;
899
385k
        }
900
385k
      }
901
      /* fall through */
902
24.6k
    case BT_AMP:
903
214k
    case BT_LT:
904
214k
    case BT_NONXML:
905
214k
    case BT_MALFORM:
906
214k
    case BT_TRAIL:
907
703k
    case BT_CR:
908
1.02M
    case BT_LF:
909
1.02M
      *nextTokPtr = ptr;
910
1.02M
      return XML_TOK_DATA_CHARS;
911
17.4M
    default:
912
17.4M
      ptr += MINBPC(enc);
913
17.4M
      break;
914
19.1M
    }
915
19.1M
  }
916
4.84k
  *nextTokPtr = ptr;
917
4.84k
  return XML_TOK_DATA_CHARS;
918
1.02M
}
xmltok.c:normal_contentTok
Line
Count
Source
824
4.83M
                   const char **nextTokPtr) {
825
4.83M
  if (ptr >= end)
826
5.98k
    return XML_TOK_NONE;
827
4.82M
  if (MINBPC(enc) > 1) {
828
0
    size_t n = end - ptr;
829
0
    if (n & (MINBPC(enc) - 1)) {
830
0
      n &= ~(MINBPC(enc) - 1);
831
0
      if (n == 0)
832
0
        return XML_TOK_PARTIAL;
833
0
      end = ptr + n;
834
0
    }
835
0
  }
836
4.82M
  switch (BYTE_TYPE(enc, ptr)) {
837
489k
  case BT_LT:
838
489k
    return PREFIX(scanLt)(enc, ptr + MINBPC(enc), end, nextTokPtr);
839
46.9k
  case BT_AMP:
840
46.9k
    return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
841
1.83M
  case BT_CR:
842
1.83M
    ptr += MINBPC(enc);
843
1.83M
    if (! HAS_CHAR(enc, ptr, end))
844
18
      return XML_TOK_TRAILING_CR;
845
1.83M
    if (BYTE_TYPE(enc, ptr) == BT_LF)
846
373k
      ptr += MINBPC(enc);
847
1.83M
    *nextTokPtr = ptr;
848
1.83M
    return XML_TOK_DATA_NEWLINE;
849
1.43M
  case BT_LF:
850
1.43M
    *nextTokPtr = ptr + MINBPC(enc);
851
1.43M
    return XML_TOK_DATA_NEWLINE;
852
75.8k
  case BT_RSQB:
853
75.8k
    ptr += MINBPC(enc);
854
75.8k
    if (! HAS_CHAR(enc, ptr, end))
855
8
      return XML_TOK_TRAILING_RSQB;
856
75.8k
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
857
29.5k
      break;
858
46.2k
    ptr += MINBPC(enc);
859
46.2k
    if (! HAS_CHAR(enc, ptr, end))
860
4
      return XML_TOK_TRAILING_RSQB;
861
46.2k
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
862
46.2k
      ptr -= MINBPC(enc);
863
46.2k
      break;
864
46.2k
    }
865
1
    *nextTokPtr = ptr;
866
1
    return XML_TOK_INVALID;
867
115k
    INVALID_CASES(ptr, nextTokPtr)
868
892k
  default:
869
892k
    ptr += MINBPC(enc);
870
892k
    break;
871
4.82M
  }
872
19.1M
  while (HAS_CHAR(enc, ptr, end)) {
873
19.1M
    switch (BYTE_TYPE(enc, ptr)) {
874
0
#  define LEAD_CASE(n)                                                         \
875
0
  case BT_LEAD##n:                                                             \
876
0
    if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) {                       \
877
0
      *nextTokPtr = ptr;                                                       \
878
0
      return XML_TOK_DATA_CHARS;                                               \
879
0
    }                                                                          \
880
0
    ptr += n;                                                                  \
881
0
    break;
882
89.3k
      LEAD_CASE(2)
883
29.4k
      LEAD_CASE(3)
884
41.8k
      LEAD_CASE(4)
885
0
#  undef LEAD_CASE
886
567k
    case BT_RSQB:
887
567k
      if (HAS_CHARS(enc, ptr, end, 2)) {
888
567k
        if (! CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_RSQB)) {
889
181k
          ptr += MINBPC(enc);
890
181k
          break;
891
181k
        }
892
385k
        if (HAS_CHARS(enc, ptr, end, 3)) {
893
385k
          if (! CHAR_MATCHES(enc, ptr + 2 * MINBPC(enc), ASCII_GT)) {
894
385k
            ptr += MINBPC(enc);
895
385k
            break;
896
385k
          }
897
2
          *nextTokPtr = ptr + 2 * MINBPC(enc);
898
2
          return XML_TOK_INVALID;
899
385k
        }
900
385k
      }
901
      /* fall through */
902
24.6k
    case BT_AMP:
903
214k
    case BT_LT:
904
214k
    case BT_NONXML:
905
214k
    case BT_MALFORM:
906
214k
    case BT_TRAIL:
907
703k
    case BT_CR:
908
1.02M
    case BT_LF:
909
1.02M
      *nextTokPtr = ptr;
910
1.02M
      return XML_TOK_DATA_CHARS;
911
17.4M
    default:
912
17.4M
      ptr += MINBPC(enc);
913
17.4M
      break;
914
19.1M
    }
915
19.1M
  }
916
4.84k
  *nextTokPtr = ptr;
917
4.84k
  return XML_TOK_DATA_CHARS;
918
1.02M
}
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
81.8k
                    const char **nextTokPtr) {
925
81.8k
  REQUIRE_CHAR(enc, ptr, end);
926
81.8k
  switch (BYTE_TYPE(enc, ptr)) {
927
123k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
928
460
  case BT_S:
929
1.13k
  case BT_LF:
930
1.62k
  case BT_CR:
931
1.62k
  case BT_PERCNT:
932
1.62k
    *nextTokPtr = ptr;
933
1.62k
    return XML_TOK_PERCENT;
934
3
  default:
935
3
    *nextTokPtr = ptr;
936
3
    return XML_TOK_INVALID;
937
81.8k
  }
938
1.05M
  while (HAS_CHAR(enc, ptr, end)) {
939
1.05M
    switch (BYTE_TYPE(enc, ptr)) {
940
2.96M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
941
80.1k
    case BT_SEMI:
942
80.1k
      *nextTokPtr = ptr + MINBPC(enc);
943
80.1k
      return XML_TOK_PARAM_ENTITY_REF;
944
19
    default:
945
19
      *nextTokPtr = ptr;
946
19
      return XML_TOK_INVALID;
947
1.05M
    }
948
1.05M
  }
949
52
  return XML_TOK_PARTIAL;
950
80.2k
}
xmltok.c:normal_scanPercent
Line
Count
Source
924
81.8k
                    const char **nextTokPtr) {
925
81.8k
  REQUIRE_CHAR(enc, ptr, end);
926
81.8k
  switch (BYTE_TYPE(enc, ptr)) {
927
123k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
928
460
  case BT_S:
929
1.13k
  case BT_LF:
930
1.62k
  case BT_CR:
931
1.62k
  case BT_PERCNT:
932
1.62k
    *nextTokPtr = ptr;
933
1.62k
    return XML_TOK_PERCENT;
934
3
  default:
935
3
    *nextTokPtr = ptr;
936
3
    return XML_TOK_INVALID;
937
81.8k
  }
938
1.05M
  while (HAS_CHAR(enc, ptr, end)) {
939
1.05M
    switch (BYTE_TYPE(enc, ptr)) {
940
2.96M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
941
80.1k
    case BT_SEMI:
942
80.1k
      *nextTokPtr = ptr + MINBPC(enc);
943
80.1k
      return XML_TOK_PARAM_ENTITY_REF;
944
19
    default:
945
19
      *nextTokPtr = ptr;
946
19
      return XML_TOK_INVALID;
947
1.05M
    }
948
1.05M
  }
949
52
  return XML_TOK_PARTIAL;
950
80.2k
}
Unexecuted instantiation: xmltok.c:little2_scanPercent
Unexecuted instantiation: xmltok.c:big2_scanPercent
951
952
static int PTRCALL
953
PREFIX(scanPoundName)(const ENCODING *enc, const char *ptr, const char *end,
954
122k
                      const char **nextTokPtr) {
955
122k
  REQUIRE_CHAR(enc, ptr, end);
956
122k
  switch (BYTE_TYPE(enc, ptr)) {
957
122k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
958
2
  default:
959
2
    *nextTokPtr = ptr;
960
2
    return XML_TOK_INVALID;
961
122k
  }
962
916k
  while (HAS_CHAR(enc, ptr, end)) {
963
916k
    switch (BYTE_TYPE(enc, ptr)) {
964
2.87M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
965
79.1k
    case BT_CR:
966
88.5k
    case BT_LF:
967
117k
    case BT_S:
968
118k
    case BT_RPAR:
969
121k
    case BT_GT:
970
121k
    case BT_PERCNT:
971
122k
    case BT_VERBAR:
972
122k
      *nextTokPtr = ptr;
973
122k
      return XML_TOK_POUND_NAME;
974
9
    default:
975
9
      *nextTokPtr = ptr;
976
9
      return XML_TOK_INVALID;
977
916k
    }
978
916k
  }
979
184
  return -XML_TOK_POUND_NAME;
980
122k
}
xmltok.c:normal_scanPoundName
Line
Count
Source
954
122k
                      const char **nextTokPtr) {
955
122k
  REQUIRE_CHAR(enc, ptr, end);
956
122k
  switch (BYTE_TYPE(enc, ptr)) {
957
122k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
958
2
  default:
959
2
    *nextTokPtr = ptr;
960
2
    return XML_TOK_INVALID;
961
122k
  }
962
916k
  while (HAS_CHAR(enc, ptr, end)) {
963
916k
    switch (BYTE_TYPE(enc, ptr)) {
964
2.87M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
965
79.1k
    case BT_CR:
966
88.5k
    case BT_LF:
967
117k
    case BT_S:
968
118k
    case BT_RPAR:
969
121k
    case BT_GT:
970
121k
    case BT_PERCNT:
971
122k
    case BT_VERBAR:
972
122k
      *nextTokPtr = ptr;
973
122k
      return XML_TOK_POUND_NAME;
974
9
    default:
975
9
      *nextTokPtr = ptr;
976
9
      return XML_TOK_INVALID;
977
916k
    }
978
916k
  }
979
184
  return -XML_TOK_POUND_NAME;
980
122k
}
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
55.3k
                const char **nextTokPtr) {
985
6.71M
  while (HAS_CHAR(enc, ptr, end)) {
986
6.71M
    int t = BYTE_TYPE(enc, ptr);
987
6.71M
    switch (t) {
988
164k
      INVALID_CASES(ptr, nextTokPtr)
989
13.0k
    case BT_QUOT:
990
62.9k
    case BT_APOS:
991
62.9k
      ptr += MINBPC(enc);
992
62.9k
      if (t != open)
993
7.80k
        break;
994
55.1k
      if (! HAS_CHAR(enc, ptr, end))
995
360
        return -XML_TOK_LITERAL;
996
54.8k
      *nextTokPtr = ptr;
997
54.8k
      switch (BYTE_TYPE(enc, ptr)) {
998
6.12k
      case BT_S:
999
9.28k
      case BT_CR:
1000
26.6k
      case BT_LF:
1001
54.4k
      case BT_GT:
1002
54.4k
      case BT_PERCNT:
1003
54.8k
      case BT_LSQB:
1004
54.8k
        return XML_TOK_LITERAL;
1005
10
      default:
1006
10
        return XML_TOK_INVALID;
1007
54.8k
      }
1008
6.57M
    default:
1009
6.57M
      ptr += MINBPC(enc);
1010
6.57M
      break;
1011
6.71M
    }
1012
6.71M
  }
1013
92
  return XML_TOK_PARTIAL;
1014
55.3k
}
xmltok.c:normal_scanLit
Line
Count
Source
984
55.3k
                const char **nextTokPtr) {
985
6.71M
  while (HAS_CHAR(enc, ptr, end)) {
986
6.71M
    int t = BYTE_TYPE(enc, ptr);
987
6.71M
    switch (t) {
988
164k
      INVALID_CASES(ptr, nextTokPtr)
989
13.0k
    case BT_QUOT:
990
62.9k
    case BT_APOS:
991
62.9k
      ptr += MINBPC(enc);
992
62.9k
      if (t != open)
993
7.80k
        break;
994
55.1k
      if (! HAS_CHAR(enc, ptr, end))
995
360
        return -XML_TOK_LITERAL;
996
54.8k
      *nextTokPtr = ptr;
997
54.8k
      switch (BYTE_TYPE(enc, ptr)) {
998
6.12k
      case BT_S:
999
9.28k
      case BT_CR:
1000
26.6k
      case BT_LF:
1001
54.4k
      case BT_GT:
1002
54.4k
      case BT_PERCNT:
1003
54.8k
      case BT_LSQB:
1004
54.8k
        return XML_TOK_LITERAL;
1005
10
      default:
1006
10
        return XML_TOK_INVALID;
1007
54.8k
      }
1008
6.57M
    default:
1009
6.57M
      ptr += MINBPC(enc);
1010
6.57M
      break;
1011
6.71M
    }
1012
6.71M
  }
1013
92
  return XML_TOK_PARTIAL;
1014
55.3k
}
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
4.02M
                  const char **nextTokPtr) {
1019
4.02M
  int tok;
1020
4.02M
  if (ptr >= end)
1021
6.77k
    return XML_TOK_NONE;
1022
4.02M
  if (MINBPC(enc) > 1) {
1023
202
    size_t n = end - ptr;
1024
202
    if (n & (MINBPC(enc) - 1)) {
1025
31
      n &= ~(MINBPC(enc) - 1);
1026
31
      if (n == 0)
1027
4
        return XML_TOK_PARTIAL;
1028
27
      end = ptr + n;
1029
27
    }
1030
202
  }
1031
4.02M
  switch (BYTE_TYPE(enc, ptr)) {
1032
6.03k
  case BT_QUOT:
1033
6.03k
    return PREFIX(scanLit)(BT_QUOT, enc, ptr + MINBPC(enc), end, nextTokPtr);
1034
49.2k
  case BT_APOS:
1035
49.2k
    return PREFIX(scanLit)(BT_APOS, enc, ptr + MINBPC(enc), end, nextTokPtr);
1036
77.6k
  case BT_LT: {
1037
77.6k
    ptr += MINBPC(enc);
1038
77.6k
    REQUIRE_CHAR(enc, ptr, end);
1039
77.5k
    switch (BYTE_TYPE(enc, ptr)) {
1040
64.5k
    case BT_EXCL:
1041
64.5k
      return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1042
8.30k
    case BT_QUEST:
1043
8.30k
      return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1044
3.63k
    case BT_NMSTRT:
1045
4.62k
    case BT_HEX:
1046
4.62k
    case BT_NONASCII:
1047
4.66k
    case BT_LEAD2:
1048
4.69k
    case BT_LEAD3:
1049
4.70k
    case BT_LEAD4:
1050
4.70k
      *nextTokPtr = ptr - MINBPC(enc);
1051
4.70k
      return XML_TOK_INSTANCE_START;
1052
77.5k
    }
1053
12
    *nextTokPtr = ptr;
1054
12
    return XML_TOK_INVALID;
1055
77.5k
  }
1056
285k
  case BT_CR:
1057
285k
    if (ptr + MINBPC(enc) == end) {
1058
257
      *nextTokPtr = end;
1059
      /* indicate that this might be part of a CR/LF pair */
1060
257
      return -XML_TOK_PROLOG_S;
1061
257
    }
1062
    /* fall through */
1063
535k
  case BT_S:
1064
609k
  case BT_LF:
1065
628k
    for (;;) {
1066
628k
      ptr += MINBPC(enc);
1067
628k
      if (! HAS_CHAR(enc, ptr, end))
1068
158
        break;
1069
628k
      switch (BYTE_TYPE(enc, ptr)) {
1070
7.93k
      case BT_S:
1071
15.3k
      case BT_LF:
1072
15.3k
        break;
1073
4.39k
      case BT_CR:
1074
        /* don't split CR/LF pair */
1075
4.39k
        if (ptr + MINBPC(enc) != end)
1076
4.27k
          break;
1077
        /* fall through */
1078
608k
      default:
1079
608k
        *nextTokPtr = ptr;
1080
608k
        return XML_TOK_PROLOG_S;
1081
628k
      }
1082
628k
    }
1083
158
    *nextTokPtr = ptr;
1084
158
    return XML_TOK_PROLOG_S;
1085
81.8k
  case BT_PERCNT:
1086
81.8k
    return PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1087
1.40k
  case BT_COMMA:
1088
1.40k
    *nextTokPtr = ptr + MINBPC(enc);
1089
1.40k
    return XML_TOK_COMMA;
1090
2.26k
  case BT_LSQB:
1091
2.26k
    *nextTokPtr = ptr + MINBPC(enc);
1092
2.26k
    return XML_TOK_OPEN_BRACKET;
1093
1.18k
  case BT_RSQB:
1094
1.18k
    ptr += MINBPC(enc);
1095
1.18k
    if (! HAS_CHAR(enc, ptr, end))
1096
5
      return -XML_TOK_CLOSE_BRACKET;
1097
1.17k
    if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) {
1098
18
      REQUIRE_CHARS(enc, ptr, end, 2);
1099
16
      if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_GT)) {
1100
1
        *nextTokPtr = ptr + 2 * MINBPC(enc);
1101
1
        return XML_TOK_COND_SECT_CLOSE;
1102
1
      }
1103
16
    }
1104
1.17k
    *nextTokPtr = ptr;
1105
1.17k
    return XML_TOK_CLOSE_BRACKET;
1106
2.38M
  case BT_LPAR:
1107
2.38M
    *nextTokPtr = ptr + MINBPC(enc);
1108
2.38M
    return XML_TOK_OPEN_PAREN;
1109
128k
  case BT_RPAR:
1110
128k
    ptr += MINBPC(enc);
1111
128k
    if (! HAS_CHAR(enc, ptr, end))
1112
77
      return -XML_TOK_CLOSE_PAREN;
1113
128k
    switch (BYTE_TYPE(enc, ptr)) {
1114
3.03k
    case BT_AST:
1115
3.03k
      *nextTokPtr = ptr + MINBPC(enc);
1116
3.03k
      return XML_TOK_CLOSE_PAREN_ASTERISK;
1117
529
    case BT_QUEST:
1118
529
      *nextTokPtr = ptr + MINBPC(enc);
1119
529
      return XML_TOK_CLOSE_PAREN_QUESTION;
1120
2.01k
    case BT_PLUS:
1121
2.01k
      *nextTokPtr = ptr + MINBPC(enc);
1122
2.01k
      return XML_TOK_CLOSE_PAREN_PLUS;
1123
17.6k
    case BT_CR:
1124
18.0k
    case BT_LF:
1125
114k
    case BT_S:
1126
115k
    case BT_GT:
1127
116k
    case BT_COMMA:
1128
120k
    case BT_VERBAR:
1129
122k
    case BT_RPAR:
1130
122k
      *nextTokPtr = ptr;
1131
122k
      return XML_TOK_CLOSE_PAREN;
1132
128k
    }
1133
7
    *nextTokPtr = ptr;
1134
7
    return XML_TOK_INVALID;
1135
53.9k
  case BT_VERBAR:
1136
53.9k
    *nextTokPtr = ptr + MINBPC(enc);
1137
53.9k
    return XML_TOK_OR;
1138
60.0k
  case BT_GT:
1139
60.0k
    *nextTokPtr = ptr + MINBPC(enc);
1140
60.0k
    return XML_TOK_DECL_CLOSE;
1141
122k
  case BT_NUM:
1142
122k
    return PREFIX(scanPoundName)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1143
0
#  define LEAD_CASE(n)                                                         \
1144
40.9k
  case BT_LEAD##n:                                                             \
1145
40.9k
    if (end - ptr < n)                                                         \
1146
58
      return XML_TOK_PARTIAL_CHAR;                                             \
1147
40.9k
    if (IS_INVALID_CHAR(enc, ptr, n)) {                                        \
1148
58
      *nextTokPtr = ptr;                                                       \
1149
58
      return XML_TOK_INVALID;                                                  \
1150
58
    }                                                                          \
1151
40.9k
    if (IS_NMSTRT_CHAR(enc, ptr, n)) {                                         \
1152
7.00k
      ptr += n;                                                                \
1153
7.00k
      tok = XML_TOK_NAME;                                                      \
1154
7.00k
      break;                                                                   \
1155
7.00k
    }                                                                          \
1156
40.8k
    if (IS_NAME_CHAR(enc, ptr, n)) {                                           \
1157
33.7k
      ptr += n;                                                                \
1158
33.7k
      tok = XML_TOK_NMTOKEN;                                                   \
1159
33.7k
      break;                                                                   \
1160
33.7k
    }                                                                          \
1161
33.8k
    *nextTokPtr = ptr;                                                         \
1162
52
    return XML_TOK_INVALID;
1163
143k
    LEAD_CASE(2)
1164
12.8k
    LEAD_CASE(3)
1165
178
    LEAD_CASE(4)
1166
0
#  undef LEAD_CASE
1167
228k
  case BT_NMSTRT:
1168
399k
  case BT_HEX:
1169
399k
    tok = XML_TOK_NAME;
1170
399k
    ptr += MINBPC(enc);
1171
399k
    break;
1172
456
  case BT_DIGIT:
1173
720
  case BT_NAME:
1174
1.08k
  case BT_MINUS:
1175
#  ifdef XML_NS
1176
  case BT_COLON:
1177
#  endif
1178
1.08k
    tok = XML_TOK_NMTOKEN;
1179
1.08k
    ptr += MINBPC(enc);
1180
1.08k
    break;
1181
159
  case BT_NONASCII:
1182
159
    if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {
1183
123
      ptr += MINBPC(enc);
1184
123
      tok = XML_TOK_NAME;
1185
123
      break;
1186
123
    }
1187
36
    if (IS_NAME_CHAR_MINBPC(enc, ptr)) {
1188
15
      ptr += MINBPC(enc);
1189
15
      tok = XML_TOK_NMTOKEN;
1190
15
      break;
1191
15
    }
1192
    /* fall through */
1193
63
  default:
1194
63
    *nextTokPtr = ptr;
1195
63
    return XML_TOK_INVALID;
1196
4.02M
  }
1197
15.1M
  while (HAS_CHAR(enc, ptr, end)) {
1198
15.1M
    switch (BYTE_TYPE(enc, ptr)) {
1199
42.3M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1200
22.5k
    case BT_GT:
1201
141k
    case BT_RPAR:
1202
141k
    case BT_COMMA:
1203
184k
    case BT_VERBAR:
1204
186k
    case BT_LSQB:
1205
186k
    case BT_PERCNT:
1206
264k
    case BT_S:
1207
405k
    case BT_CR:
1208
438k
    case BT_LF:
1209
438k
      *nextTokPtr = ptr;
1210
438k
      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
385
    case BT_PLUS:
1232
385
      if (tok == XML_TOK_NMTOKEN) {
1233
1
        *nextTokPtr = ptr;
1234
1
        return XML_TOK_INVALID;
1235
1
      }
1236
384
      *nextTokPtr = ptr + MINBPC(enc);
1237
384
      return XML_TOK_NAME_PLUS;
1238
1.16k
    case BT_AST:
1239
1.16k
      if (tok == XML_TOK_NMTOKEN) {
1240
1
        *nextTokPtr = ptr;
1241
1
        return XML_TOK_INVALID;
1242
1
      }
1243
1.16k
      *nextTokPtr = ptr + MINBPC(enc);
1244
1.16k
      return XML_TOK_NAME_ASTERISK;
1245
680
    case BT_QUEST:
1246
680
      if (tok == XML_TOK_NMTOKEN) {
1247
2
        *nextTokPtr = ptr;
1248
2
        return XML_TOK_INVALID;
1249
2
      }
1250
678
      *nextTokPtr = ptr + MINBPC(enc);
1251
678
      return XML_TOK_NAME_QUESTION;
1252
55
    default:
1253
55
      *nextTokPtr = ptr;
1254
55
      return XML_TOK_INVALID;
1255
15.1M
    }
1256
15.1M
  }
1257
556
  return -tok;
1258
441k
}
xmltok.c:normal_prologTok
Line
Count
Source
1018
4.02M
                  const char **nextTokPtr) {
1019
4.02M
  int tok;
1020
4.02M
  if (ptr >= end)
1021
6.77k
    return XML_TOK_NONE;
1022
4.02M
  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
4.02M
  switch (BYTE_TYPE(enc, ptr)) {
1032
6.03k
  case BT_QUOT:
1033
6.03k
    return PREFIX(scanLit)(BT_QUOT, enc, ptr + MINBPC(enc), end, nextTokPtr);
1034
49.2k
  case BT_APOS:
1035
49.2k
    return PREFIX(scanLit)(BT_APOS, enc, ptr + MINBPC(enc), end, nextTokPtr);
1036
77.6k
  case BT_LT: {
1037
77.6k
    ptr += MINBPC(enc);
1038
77.6k
    REQUIRE_CHAR(enc, ptr, end);
1039
77.5k
    switch (BYTE_TYPE(enc, ptr)) {
1040
64.5k
    case BT_EXCL:
1041
64.5k
      return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1042
8.30k
    case BT_QUEST:
1043
8.30k
      return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1044
3.63k
    case BT_NMSTRT:
1045
4.62k
    case BT_HEX:
1046
4.62k
    case BT_NONASCII:
1047
4.66k
    case BT_LEAD2:
1048
4.69k
    case BT_LEAD3:
1049
4.70k
    case BT_LEAD4:
1050
4.70k
      *nextTokPtr = ptr - MINBPC(enc);
1051
4.70k
      return XML_TOK_INSTANCE_START;
1052
77.5k
    }
1053
12
    *nextTokPtr = ptr;
1054
12
    return XML_TOK_INVALID;
1055
77.5k
  }
1056
285k
  case BT_CR:
1057
285k
    if (ptr + MINBPC(enc) == end) {
1058
257
      *nextTokPtr = end;
1059
      /* indicate that this might be part of a CR/LF pair */
1060
257
      return -XML_TOK_PROLOG_S;
1061
257
    }
1062
    /* fall through */
1063
535k
  case BT_S:
1064
609k
  case BT_LF:
1065
628k
    for (;;) {
1066
628k
      ptr += MINBPC(enc);
1067
628k
      if (! HAS_CHAR(enc, ptr, end))
1068
158
        break;
1069
628k
      switch (BYTE_TYPE(enc, ptr)) {
1070
7.93k
      case BT_S:
1071
15.3k
      case BT_LF:
1072
15.3k
        break;
1073
4.39k
      case BT_CR:
1074
        /* don't split CR/LF pair */
1075
4.39k
        if (ptr + MINBPC(enc) != end)
1076
4.27k
          break;
1077
        /* fall through */
1078
608k
      default:
1079
608k
        *nextTokPtr = ptr;
1080
608k
        return XML_TOK_PROLOG_S;
1081
628k
      }
1082
628k
    }
1083
158
    *nextTokPtr = ptr;
1084
158
    return XML_TOK_PROLOG_S;
1085
81.8k
  case BT_PERCNT:
1086
81.8k
    return PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1087
1.40k
  case BT_COMMA:
1088
1.40k
    *nextTokPtr = ptr + MINBPC(enc);
1089
1.40k
    return XML_TOK_COMMA;
1090
2.26k
  case BT_LSQB:
1091
2.26k
    *nextTokPtr = ptr + MINBPC(enc);
1092
2.26k
    return XML_TOK_OPEN_BRACKET;
1093
1.18k
  case BT_RSQB:
1094
1.18k
    ptr += MINBPC(enc);
1095
1.18k
    if (! HAS_CHAR(enc, ptr, end))
1096
5
      return -XML_TOK_CLOSE_BRACKET;
1097
1.17k
    if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) {
1098
18
      REQUIRE_CHARS(enc, ptr, end, 2);
1099
16
      if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_GT)) {
1100
1
        *nextTokPtr = ptr + 2 * MINBPC(enc);
1101
1
        return XML_TOK_COND_SECT_CLOSE;
1102
1
      }
1103
16
    }
1104
1.17k
    *nextTokPtr = ptr;
1105
1.17k
    return XML_TOK_CLOSE_BRACKET;
1106
2.38M
  case BT_LPAR:
1107
2.38M
    *nextTokPtr = ptr + MINBPC(enc);
1108
2.38M
    return XML_TOK_OPEN_PAREN;
1109
128k
  case BT_RPAR:
1110
128k
    ptr += MINBPC(enc);
1111
128k
    if (! HAS_CHAR(enc, ptr, end))
1112
77
      return -XML_TOK_CLOSE_PAREN;
1113
128k
    switch (BYTE_TYPE(enc, ptr)) {
1114
3.03k
    case BT_AST:
1115
3.03k
      *nextTokPtr = ptr + MINBPC(enc);
1116
3.03k
      return XML_TOK_CLOSE_PAREN_ASTERISK;
1117
529
    case BT_QUEST:
1118
529
      *nextTokPtr = ptr + MINBPC(enc);
1119
529
      return XML_TOK_CLOSE_PAREN_QUESTION;
1120
2.01k
    case BT_PLUS:
1121
2.01k
      *nextTokPtr = ptr + MINBPC(enc);
1122
2.01k
      return XML_TOK_CLOSE_PAREN_PLUS;
1123
17.6k
    case BT_CR:
1124
18.0k
    case BT_LF:
1125
114k
    case BT_S:
1126
115k
    case BT_GT:
1127
116k
    case BT_COMMA:
1128
120k
    case BT_VERBAR:
1129
122k
    case BT_RPAR:
1130
122k
      *nextTokPtr = ptr;
1131
122k
      return XML_TOK_CLOSE_PAREN;
1132
128k
    }
1133
7
    *nextTokPtr = ptr;
1134
7
    return XML_TOK_INVALID;
1135
53.9k
  case BT_VERBAR:
1136
53.9k
    *nextTokPtr = ptr + MINBPC(enc);
1137
53.9k
    return XML_TOK_OR;
1138
60.0k
  case BT_GT:
1139
60.0k
    *nextTokPtr = ptr + MINBPC(enc);
1140
60.0k
    return XML_TOK_DECL_CLOSE;
1141
122k
  case BT_NUM:
1142
122k
    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
143k
    LEAD_CASE(2)
1164
12.8k
    LEAD_CASE(3)
1165
114
    LEAD_CASE(4)
1166
0
#  undef LEAD_CASE
1167
228k
  case BT_NMSTRT:
1168
399k
  case BT_HEX:
1169
399k
    tok = XML_TOK_NAME;
1170
399k
    ptr += MINBPC(enc);
1171
399k
    break;
1172
456
  case BT_DIGIT:
1173
720
  case BT_NAME:
1174
1.08k
  case BT_MINUS:
1175
#  ifdef XML_NS
1176
  case BT_COLON:
1177
#  endif
1178
1.08k
    tok = XML_TOK_NMTOKEN;
1179
1.08k
    ptr += MINBPC(enc);
1180
1.08k
    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
31
  default:
1194
31
    *nextTokPtr = ptr;
1195
31
    return XML_TOK_INVALID;
1196
4.02M
  }
1197
15.1M
  while (HAS_CHAR(enc, ptr, end)) {
1198
15.1M
    switch (BYTE_TYPE(enc, ptr)) {
1199
42.2M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1200
22.5k
    case BT_GT:
1201
141k
    case BT_RPAR:
1202
141k
    case BT_COMMA:
1203
184k
    case BT_VERBAR:
1204
186k
    case BT_LSQB:
1205
186k
    case BT_PERCNT:
1206
264k
    case BT_S:
1207
405k
    case BT_CR:
1208
438k
    case BT_LF:
1209
438k
      *nextTokPtr = ptr;
1210
438k
      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
385
    case BT_PLUS:
1232
385
      if (tok == XML_TOK_NMTOKEN) {
1233
1
        *nextTokPtr = ptr;
1234
1
        return XML_TOK_INVALID;
1235
1
      }
1236
384
      *nextTokPtr = ptr + MINBPC(enc);
1237
384
      return XML_TOK_NAME_PLUS;
1238
1.16k
    case BT_AST:
1239
1.16k
      if (tok == XML_TOK_NMTOKEN) {
1240
1
        *nextTokPtr = ptr;
1241
1
        return XML_TOK_INVALID;
1242
1
      }
1243
1.16k
      *nextTokPtr = ptr + MINBPC(enc);
1244
1.16k
      return XML_TOK_NAME_ASTERISK;
1245
680
    case BT_QUEST:
1246
680
      if (tok == XML_TOK_NMTOKEN) {
1247
2
        *nextTokPtr = ptr;
1248
2
        return XML_TOK_INVALID;
1249
2
      }
1250
678
      *nextTokPtr = ptr + MINBPC(enc);
1251
678
      return XML_TOK_NAME_QUESTION;
1252
35
    default:
1253
35
      *nextTokPtr = ptr;
1254
35
      return XML_TOK_INVALID;
1255
15.1M
    }
1256
15.1M
  }
1257
514
  return -tok;
1258
441k
}
xmltok.c:little2_prologTok
Line
Count
Source
1018
111
                  const char **nextTokPtr) {
1019
111
  int tok;
1020
111
  if (ptr >= end)
1021
2
    return XML_TOK_NONE;
1022
109
  if (MINBPC(enc) > 1) {
1023
109
    size_t n = end - ptr;
1024
109
    if (n & (MINBPC(enc) - 1)) {
1025
19
      n &= ~(MINBPC(enc) - 1);
1026
19
      if (n == 0)
1027
2
        return XML_TOK_PARTIAL;
1028
17
      end = ptr + n;
1029
17
    }
1030
109
  }
1031
107
  switch (BYTE_TYPE(enc, ptr)) {
1032
0
  case BT_QUOT:
1033
0
    return PREFIX(scanLit)(BT_QUOT, enc, ptr + MINBPC(enc), end, nextTokPtr);
1034
0
  case BT_APOS:
1035
0
    return PREFIX(scanLit)(BT_APOS, enc, ptr + MINBPC(enc), end, nextTokPtr);
1036
0
  case BT_LT: {
1037
0
    ptr += MINBPC(enc);
1038
0
    REQUIRE_CHAR(enc, ptr, end);
1039
0
    switch (BYTE_TYPE(enc, ptr)) {
1040
0
    case BT_EXCL:
1041
0
      return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1042
0
    case BT_QUEST:
1043
0
      return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1044
0
    case BT_NMSTRT:
1045
0
    case BT_HEX:
1046
0
    case BT_NONASCII:
1047
0
    case BT_LEAD2:
1048
0
    case BT_LEAD3:
1049
0
    case BT_LEAD4:
1050
0
      *nextTokPtr = ptr - MINBPC(enc);
1051
0
      return XML_TOK_INSTANCE_START;
1052
0
    }
1053
0
    *nextTokPtr = ptr;
1054
0
    return XML_TOK_INVALID;
1055
0
  }
1056
0
  case BT_CR:
1057
0
    if (ptr + MINBPC(enc) == end) {
1058
0
      *nextTokPtr = end;
1059
      /* indicate that this might be part of a CR/LF pair */
1060
0
      return -XML_TOK_PROLOG_S;
1061
0
    }
1062
    /* fall through */
1063
0
  case BT_S:
1064
0
  case BT_LF:
1065
0
    for (;;) {
1066
0
      ptr += MINBPC(enc);
1067
0
      if (! HAS_CHAR(enc, ptr, end))
1068
0
        break;
1069
0
      switch (BYTE_TYPE(enc, ptr)) {
1070
0
      case BT_S:
1071
0
      case BT_LF:
1072
0
        break;
1073
0
      case BT_CR:
1074
        /* don't split CR/LF pair */
1075
0
        if (ptr + MINBPC(enc) != end)
1076
0
          break;
1077
        /* fall through */
1078
0
      default:
1079
0
        *nextTokPtr = ptr;
1080
0
        return XML_TOK_PROLOG_S;
1081
0
      }
1082
0
    }
1083
0
    *nextTokPtr = ptr;
1084
0
    return XML_TOK_PROLOG_S;
1085
0
  case BT_PERCNT:
1086
0
    return PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1087
0
  case BT_COMMA:
1088
0
    *nextTokPtr = ptr + MINBPC(enc);
1089
0
    return XML_TOK_COMMA;
1090
0
  case BT_LSQB:
1091
0
    *nextTokPtr = ptr + MINBPC(enc);
1092
0
    return XML_TOK_OPEN_BRACKET;
1093
0
  case BT_RSQB:
1094
0
    ptr += MINBPC(enc);
1095
0
    if (! HAS_CHAR(enc, ptr, end))
1096
0
      return -XML_TOK_CLOSE_BRACKET;
1097
0
    if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) {
1098
0
      REQUIRE_CHARS(enc, ptr, end, 2);
1099
0
      if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_GT)) {
1100
0
        *nextTokPtr = ptr + 2 * MINBPC(enc);
1101
0
        return XML_TOK_COND_SECT_CLOSE;
1102
0
      }
1103
0
    }
1104
0
    *nextTokPtr = ptr;
1105
0
    return XML_TOK_CLOSE_BRACKET;
1106
0
  case BT_LPAR:
1107
0
    *nextTokPtr = ptr + MINBPC(enc);
1108
0
    return XML_TOK_OPEN_PAREN;
1109
0
  case BT_RPAR:
1110
0
    ptr += MINBPC(enc);
1111
0
    if (! HAS_CHAR(enc, ptr, end))
1112
0
      return -XML_TOK_CLOSE_PAREN;
1113
0
    switch (BYTE_TYPE(enc, ptr)) {
1114
0
    case BT_AST:
1115
0
      *nextTokPtr = ptr + MINBPC(enc);
1116
0
      return XML_TOK_CLOSE_PAREN_ASTERISK;
1117
0
    case BT_QUEST:
1118
0
      *nextTokPtr = ptr + MINBPC(enc);
1119
0
      return XML_TOK_CLOSE_PAREN_QUESTION;
1120
0
    case BT_PLUS:
1121
0
      *nextTokPtr = ptr + MINBPC(enc);
1122
0
      return XML_TOK_CLOSE_PAREN_PLUS;
1123
0
    case BT_CR:
1124
0
    case BT_LF:
1125
0
    case BT_S:
1126
0
    case BT_GT:
1127
0
    case BT_COMMA:
1128
0
    case BT_VERBAR:
1129
0
    case BT_RPAR:
1130
0
      *nextTokPtr = ptr;
1131
0
      return XML_TOK_CLOSE_PAREN;
1132
0
    }
1133
0
    *nextTokPtr = ptr;
1134
0
    return XML_TOK_INVALID;
1135
0
  case BT_VERBAR:
1136
0
    *nextTokPtr = ptr + MINBPC(enc);
1137
0
    return XML_TOK_OR;
1138
0
  case BT_GT:
1139
0
    *nextTokPtr = ptr + MINBPC(enc);
1140
0
    return XML_TOK_DECL_CLOSE;
1141
0
  case BT_NUM:
1142
0
    return PREFIX(scanPoundName)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1143
0
#  define LEAD_CASE(n)                                                         \
1144
0
  case BT_LEAD##n:                                                             \
1145
0
    if (end - ptr < n)                                                         \
1146
0
      return XML_TOK_PARTIAL_CHAR;                                             \
1147
0
    if (IS_INVALID_CHAR(enc, ptr, n)) {                                        \
1148
0
      *nextTokPtr = ptr;                                                       \
1149
0
      return XML_TOK_INVALID;                                                  \
1150
0
    }                                                                          \
1151
0
    if (IS_NMSTRT_CHAR(enc, ptr, n)) {                                         \
1152
0
      ptr += n;                                                                \
1153
0
      tok = XML_TOK_NAME;                                                      \
1154
0
      break;                                                                   \
1155
0
    }                                                                          \
1156
0
    if (IS_NAME_CHAR(enc, ptr, n)) {                                           \
1157
0
      ptr += n;                                                                \
1158
0
      tok = XML_TOK_NMTOKEN;                                                   \
1159
0
      break;                                                                   \
1160
0
    }                                                                          \
1161
0
    *nextTokPtr = ptr;                                                         \
1162
0
    return XML_TOK_INVALID;
1163
0
    LEAD_CASE(2)
1164
0
    LEAD_CASE(3)
1165
24
    LEAD_CASE(4)
1166
0
#  undef LEAD_CASE
1167
0
  case BT_NMSTRT:
1168
0
  case BT_HEX:
1169
0
    tok = XML_TOK_NAME;
1170
0
    ptr += MINBPC(enc);
1171
0
    break;
1172
0
  case BT_DIGIT:
1173
0
  case BT_NAME:
1174
0
  case BT_MINUS:
1175
#  ifdef XML_NS
1176
  case BT_COLON:
1177
#  endif
1178
0
    tok = XML_TOK_NMTOKEN;
1179
0
    ptr += MINBPC(enc);
1180
0
    break;
1181
90
  case BT_NONASCII:
1182
90
    if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {
1183
74
      ptr += MINBPC(enc);
1184
74
      tok = XML_TOK_NAME;
1185
74
      break;
1186
74
    }
1187
16
    if (IS_NAME_CHAR_MINBPC(enc, ptr)) {
1188
4
      ptr += MINBPC(enc);
1189
4
      tok = XML_TOK_NMTOKEN;
1190
4
      break;
1191
4
    }
1192
    /* fall through */
1193
17
  default:
1194
17
    *nextTokPtr = ptr;
1195
17
    return XML_TOK_INVALID;
1196
107
  }
1197
12.5k
  while (HAS_CHAR(enc, ptr, end)) {
1198
12.5k
    switch (BYTE_TYPE(enc, ptr)) {
1199
62.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
12
    default:
1253
12
      *nextTokPtr = ptr;
1254
12
      return XML_TOK_INVALID;
1255
12.5k
    }
1256
12.5k
  }
1257
24
  return -tok;
1258
78
}
xmltok.c:big2_prologTok
Line
Count
Source
1018
95
                  const char **nextTokPtr) {
1019
95
  int tok;
1020
95
  if (ptr >= end)
1021
2
    return XML_TOK_NONE;
1022
93
  if (MINBPC(enc) > 1) {
1023
93
    size_t n = end - ptr;
1024
93
    if (n & (MINBPC(enc) - 1)) {
1025
12
      n &= ~(MINBPC(enc) - 1);
1026
12
      if (n == 0)
1027
2
        return XML_TOK_PARTIAL;
1028
10
      end = ptr + n;
1029
10
    }
1030
93
  }
1031
91
  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
40
    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
69
  case BT_NONASCII:
1182
69
    if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {
1183
49
      ptr += MINBPC(enc);
1184
49
      tok = XML_TOK_NAME;
1185
49
      break;
1186
49
    }
1187
20
    if (IS_NAME_CHAR_MINBPC(enc, ptr)) {
1188
11
      ptr += MINBPC(enc);
1189
11
      tok = XML_TOK_NMTOKEN;
1190
11
      break;
1191
11
    }
1192
    /* fall through */
1193
15
  default:
1194
15
    *nextTokPtr = ptr;
1195
15
    return XML_TOK_INVALID;
1196
91
  }
1197
1.05k
  while (HAS_CHAR(enc, ptr, end)) {
1198
1.05k
    switch (BYTE_TYPE(enc, ptr)) {
1199
5.08k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1200
0
    case BT_GT:
1201
0
    case BT_RPAR:
1202
0
    case BT_COMMA:
1203
0
    case BT_VERBAR:
1204
0
    case BT_LSQB:
1205
0
    case BT_PERCNT:
1206
0
    case BT_S:
1207
0
    case BT_CR:
1208
0
    case BT_LF:
1209
0
      *nextTokPtr = ptr;
1210
0
      return tok;
1211
#  ifdef XML_NS
1212
    case BT_COLON:
1213
      ptr += MINBPC(enc);
1214
      switch (tok) {
1215
      case XML_TOK_NAME:
1216
        REQUIRE_CHAR(enc, ptr, end);
1217
        tok = XML_TOK_PREFIXED_NAME;
1218
        switch (BYTE_TYPE(enc, ptr)) {
1219
          CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1220
        default:
1221
          tok = XML_TOK_NMTOKEN;
1222
          break;
1223
        }
1224
        break;
1225
      case XML_TOK_PREFIXED_NAME:
1226
        tok = XML_TOK_NMTOKEN;
1227
        break;
1228
      }
1229
      break;
1230
#  endif
1231
0
    case BT_PLUS:
1232
0
      if (tok == XML_TOK_NMTOKEN) {
1233
0
        *nextTokPtr = ptr;
1234
0
        return XML_TOK_INVALID;
1235
0
      }
1236
0
      *nextTokPtr = ptr + MINBPC(enc);
1237
0
      return XML_TOK_NAME_PLUS;
1238
0
    case BT_AST:
1239
0
      if (tok == XML_TOK_NMTOKEN) {
1240
0
        *nextTokPtr = ptr;
1241
0
        return XML_TOK_INVALID;
1242
0
      }
1243
0
      *nextTokPtr = ptr + MINBPC(enc);
1244
0
      return XML_TOK_NAME_ASTERISK;
1245
0
    case BT_QUEST:
1246
0
      if (tok == XML_TOK_NMTOKEN) {
1247
0
        *nextTokPtr = ptr;
1248
0
        return XML_TOK_INVALID;
1249
0
      }
1250
0
      *nextTokPtr = ptr + MINBPC(enc);
1251
0
      return XML_TOK_NAME_QUESTION;
1252
8
    default:
1253
8
      *nextTokPtr = ptr;
1254
8
      return XML_TOK_INVALID;
1255
1.05k
    }
1256
1.05k
  }
1257
18
  return -tok;
1258
60
}
1259
1260
static int PTRCALL
1261
PREFIX(attributeValueTok)(const ENCODING *enc, const char *ptr, const char *end,
1262
2.10M
                          const char **nextTokPtr) {
1263
2.10M
  const char *start;
1264
2.10M
  if (ptr >= end)
1265
104k
    return XML_TOK_NONE;
1266
2.00M
  else if (! HAS_CHAR(enc, ptr, end)) {
1267
    /* This line cannot be executed.  The incoming data has already
1268
     * been tokenized once, so incomplete characters like this have
1269
     * already been eliminated from the input.  Retaining the paranoia
1270
     * check is still valuable, however.
1271
     */
1272
0
    return XML_TOK_PARTIAL; /* LCOV_EXCL_LINE */
1273
0
  }
1274
2.00M
  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
286k
  case BT_LEAD##n:                                                             \
1279
286k
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1280
286k
    break;
1281
111k
      LEAD_CASE(2)
1282
104k
      LEAD_CASE(3)
1283
70.5k
      LEAD_CASE(4)
1284
0
#  undef LEAD_CASE
1285
402k
    case BT_AMP:
1286
402k
      if (ptr == start)
1287
286k
        return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1288
115k
      *nextTokPtr = ptr;
1289
115k
      return XML_TOK_DATA_CHARS;
1290
3
    case BT_LT:
1291
      /* this is for inside entity references */
1292
3
      *nextTokPtr = ptr;
1293
3
      return XML_TOK_INVALID;
1294
494k
    case BT_LF:
1295
494k
      if (ptr == start) {
1296
368k
        *nextTokPtr = ptr + MINBPC(enc);
1297
368k
        return XML_TOK_DATA_NEWLINE;
1298
368k
      }
1299
125k
      *nextTokPtr = ptr;
1300
125k
      return XML_TOK_DATA_CHARS;
1301
739k
    case BT_CR:
1302
739k
      if (ptr == start) {
1303
493k
        ptr += MINBPC(enc);
1304
493k
        if (! HAS_CHAR(enc, ptr, end))
1305
3.01k
          return XML_TOK_TRAILING_CR;
1306
490k
        if (BYTE_TYPE(enc, ptr) == BT_LF)
1307
104k
          ptr += MINBPC(enc);
1308
490k
        *nextTokPtr = ptr;
1309
490k
        return XML_TOK_DATA_NEWLINE;
1310
493k
      }
1311
246k
      *nextTokPtr = ptr;
1312
246k
      return XML_TOK_DATA_CHARS;
1313
273k
    case BT_S:
1314
273k
      if (ptr == start) {
1315
165k
        *nextTokPtr = ptr + MINBPC(enc);
1316
165k
        return XML_TOK_ATTRIBUTE_VALUE_S;
1317
165k
      }
1318
108k
      *nextTokPtr = ptr;
1319
108k
      return XML_TOK_DATA_CHARS;
1320
15.5M
    default:
1321
15.5M
      ptr += MINBPC(enc);
1322
15.5M
      break;
1323
17.7M
    }
1324
17.7M
  }
1325
89.7k
  *nextTokPtr = ptr;
1326
89.7k
  return XML_TOK_DATA_CHARS;
1327
2.00M
}
xmltok.c:normal_attributeValueTok
Line
Count
Source
1262
2.10M
                          const char **nextTokPtr) {
1263
2.10M
  const char *start;
1264
2.10M
  if (ptr >= end)
1265
104k
    return XML_TOK_NONE;
1266
2.00M
  else if (! HAS_CHAR(enc, ptr, end)) {
1267
    /* This line cannot be executed.  The incoming data has already
1268
     * been tokenized once, so incomplete characters like this have
1269
     * already been eliminated from the input.  Retaining the paranoia
1270
     * check is still valuable, however.
1271
     */
1272
0
    return XML_TOK_PARTIAL; /* LCOV_EXCL_LINE */
1273
0
  }
1274
2.00M
  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
111k
      LEAD_CASE(2)
1282
104k
      LEAD_CASE(3)
1283
70.5k
      LEAD_CASE(4)
1284
0
#  undef LEAD_CASE
1285
402k
    case BT_AMP:
1286
402k
      if (ptr == start)
1287
286k
        return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1288
115k
      *nextTokPtr = ptr;
1289
115k
      return XML_TOK_DATA_CHARS;
1290
3
    case BT_LT:
1291
      /* this is for inside entity references */
1292
3
      *nextTokPtr = ptr;
1293
3
      return XML_TOK_INVALID;
1294
494k
    case BT_LF:
1295
494k
      if (ptr == start) {
1296
368k
        *nextTokPtr = ptr + MINBPC(enc);
1297
368k
        return XML_TOK_DATA_NEWLINE;
1298
368k
      }
1299
125k
      *nextTokPtr = ptr;
1300
125k
      return XML_TOK_DATA_CHARS;
1301
739k
    case BT_CR:
1302
739k
      if (ptr == start) {
1303
493k
        ptr += MINBPC(enc);
1304
493k
        if (! HAS_CHAR(enc, ptr, end))
1305
3.01k
          return XML_TOK_TRAILING_CR;
1306
490k
        if (BYTE_TYPE(enc, ptr) == BT_LF)
1307
104k
          ptr += MINBPC(enc);
1308
490k
        *nextTokPtr = ptr;
1309
490k
        return XML_TOK_DATA_NEWLINE;
1310
493k
      }
1311
246k
      *nextTokPtr = ptr;
1312
246k
      return XML_TOK_DATA_CHARS;
1313
273k
    case BT_S:
1314
273k
      if (ptr == start) {
1315
165k
        *nextTokPtr = ptr + MINBPC(enc);
1316
165k
        return XML_TOK_ATTRIBUTE_VALUE_S;
1317
165k
      }
1318
108k
      *nextTokPtr = ptr;
1319
108k
      return XML_TOK_DATA_CHARS;
1320
15.5M
    default:
1321
15.5M
      ptr += MINBPC(enc);
1322
15.5M
      break;
1323
17.7M
    }
1324
17.7M
  }
1325
89.7k
  *nextTokPtr = ptr;
1326
89.7k
  return XML_TOK_DATA_CHARS;
1327
2.00M
}
Unexecuted instantiation: xmltok.c:little2_attributeValueTok
Unexecuted instantiation: xmltok.c:big2_attributeValueTok
1328
1329
static int PTRCALL
1330
PREFIX(entityValueTok)(const ENCODING *enc, const char *ptr, const char *end,
1331
0
                       const char **nextTokPtr) {
1332
0
  const char *start;
1333
0
  if (ptr >= end)
1334
0
    return XML_TOK_NONE;
1335
0
  else if (! HAS_CHAR(enc, ptr, end)) {
1336
    /* This line cannot be executed.  The incoming data has already
1337
     * been tokenized once, so incomplete characters like this have
1338
     * already been eliminated from the input.  Retaining the paranoia
1339
     * check is still valuable, however.
1340
     */
1341
0
    return XML_TOK_PARTIAL; /* LCOV_EXCL_LINE */
1342
0
  }
1343
0
  start = ptr;
1344
0
  while (HAS_CHAR(enc, ptr, end)) {
1345
0
    switch (BYTE_TYPE(enc, ptr)) {
1346
0
#  define LEAD_CASE(n)                                                         \
1347
0
  case BT_LEAD##n:                                                             \
1348
0
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1349
0
    break;
1350
0
      LEAD_CASE(2)
1351
0
      LEAD_CASE(3)
1352
0
      LEAD_CASE(4)
1353
0
#  undef LEAD_CASE
1354
0
    case BT_AMP:
1355
0
      if (ptr == start)
1356
0
        return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1357
0
      *nextTokPtr = ptr;
1358
0
      return XML_TOK_DATA_CHARS;
1359
0
    case BT_PERCNT:
1360
0
      if (ptr == start) {
1361
0
        int tok = PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1362
0
        return (tok == XML_TOK_PERCENT) ? XML_TOK_INVALID : tok;
1363
0
      }
1364
0
      *nextTokPtr = ptr;
1365
0
      return XML_TOK_DATA_CHARS;
1366
0
    case BT_LF:
1367
0
      if (ptr == start) {
1368
0
        *nextTokPtr = ptr + MINBPC(enc);
1369
0
        return XML_TOK_DATA_NEWLINE;
1370
0
      }
1371
0
      *nextTokPtr = ptr;
1372
0
      return XML_TOK_DATA_CHARS;
1373
0
    case BT_CR:
1374
0
      if (ptr == start) {
1375
0
        ptr += MINBPC(enc);
1376
0
        if (! HAS_CHAR(enc, ptr, end))
1377
0
          return XML_TOK_TRAILING_CR;
1378
0
        if (BYTE_TYPE(enc, ptr) == BT_LF)
1379
0
          ptr += MINBPC(enc);
1380
0
        *nextTokPtr = ptr;
1381
0
        return XML_TOK_DATA_NEWLINE;
1382
0
      }
1383
0
      *nextTokPtr = ptr;
1384
0
      return XML_TOK_DATA_CHARS;
1385
0
    default:
1386
0
      ptr += MINBPC(enc);
1387
0
      break;
1388
0
    }
1389
0
  }
1390
0
  *nextTokPtr = ptr;
1391
0
  return XML_TOK_DATA_CHARS;
1392
0
}
Unexecuted instantiation: xmltok.c:normal_entityValueTok
Unexecuted instantiation: xmltok.c:little2_entityValueTok
Unexecuted instantiation: xmltok.c:big2_entityValueTok
1393
1394
#  ifdef XML_DTD
1395
1396
static int PTRCALL
1397
PREFIX(ignoreSectionTok)(const ENCODING *enc, const char *ptr, const char *end,
1398
                         const char **nextTokPtr) {
1399
  int level = 0;
1400
  if (MINBPC(enc) > 1) {
1401
    size_t n = end - ptr;
1402
    if (n & (MINBPC(enc) - 1)) {
1403
      n &= ~(MINBPC(enc) - 1);
1404
      end = ptr + n;
1405
    }
1406
  }
1407
  while (HAS_CHAR(enc, ptr, end)) {
1408
    switch (BYTE_TYPE(enc, ptr)) {
1409
      INVALID_CASES(ptr, nextTokPtr)
1410
    case BT_LT:
1411
      ptr += MINBPC(enc);
1412
      REQUIRE_CHAR(enc, ptr, end);
1413
      if (CHAR_MATCHES(enc, ptr, ASCII_EXCL)) {
1414
        ptr += MINBPC(enc);
1415
        REQUIRE_CHAR(enc, ptr, end);
1416
        if (CHAR_MATCHES(enc, ptr, ASCII_LSQB)) {
1417
          ++level;
1418
          ptr += MINBPC(enc);
1419
        }
1420
      }
1421
      break;
1422
    case BT_RSQB:
1423
      ptr += MINBPC(enc);
1424
      REQUIRE_CHAR(enc, ptr, end);
1425
      if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) {
1426
        ptr += MINBPC(enc);
1427
        REQUIRE_CHAR(enc, ptr, end);
1428
        if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
1429
          ptr += MINBPC(enc);
1430
          if (level == 0) {
1431
            *nextTokPtr = ptr;
1432
            return XML_TOK_IGNORE_SECT;
1433
          }
1434
          --level;
1435
        }
1436
      }
1437
      break;
1438
    default:
1439
      ptr += MINBPC(enc);
1440
      break;
1441
    }
1442
  }
1443
  return XML_TOK_PARTIAL;
1444
}
1445
1446
#  endif /* XML_DTD */
1447
1448
static int PTRCALL
1449
PREFIX(isPublicId)(const ENCODING *enc, const char *ptr, const char *end,
1450
2.77k
                   const char **badPtr) {
1451
2.77k
  ptr += MINBPC(enc);
1452
2.77k
  end -= MINBPC(enc);
1453
616k
  for (; HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
1454
616k
    switch (BYTE_TYPE(enc, ptr)) {
1455
256k
    case BT_DIGIT:
1456
394k
    case BT_HEX:
1457
395k
    case BT_MINUS:
1458
396k
    case BT_APOS:
1459
397k
    case BT_LPAR:
1460
438k
    case BT_RPAR:
1461
439k
    case BT_PLUS:
1462
441k
    case BT_COMMA:
1463
503k
    case BT_SOL:
1464
504k
    case BT_EQUALS:
1465
509k
    case BT_QUEST:
1466
513k
    case BT_CR:
1467
514k
    case BT_LF:
1468
515k
    case BT_SEMI:
1469
515k
    case BT_EXCL:
1470
520k
    case BT_AST:
1471
523k
    case BT_PERCNT:
1472
530k
    case BT_NUM:
1473
#  ifdef XML_NS
1474
    case BT_COLON:
1475
#  endif
1476
530k
      break;
1477
1.93k
    case BT_S:
1478
1.93k
      if (CHAR_MATCHES(enc, ptr, ASCII_TAB)) {
1479
1
        *badPtr = ptr;
1480
1
        return 0;
1481
1
      }
1482
1.93k
      break;
1483
4.06k
    case BT_NAME:
1484
81.6k
    case BT_NMSTRT:
1485
81.6k
      if (! (BYTE_TO_ASCII(enc, ptr) & ~0x7f))
1486
81.6k
        break;
1487
      /* fall through */
1488
2.23k
    default:
1489
2.23k
      switch (BYTE_TO_ASCII(enc, ptr)) {
1490
1.80k
      case 0x24: /* $ */
1491
2.21k
      case 0x40: /* @ */
1492
2.21k
        break;
1493
15
      default:
1494
15
        *badPtr = ptr;
1495
15
        return 0;
1496
2.23k
      }
1497
2.21k
      break;
1498
616k
    }
1499
616k
  }
1500
2.76k
  return 1;
1501
2.77k
}
xmltok.c:normal_isPublicId
Line
Count
Source
1450
2.77k
                   const char **badPtr) {
1451
2.77k
  ptr += MINBPC(enc);
1452
2.77k
  end -= MINBPC(enc);
1453
616k
  for (; HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
1454
616k
    switch (BYTE_TYPE(enc, ptr)) {
1455
256k
    case BT_DIGIT:
1456
394k
    case BT_HEX:
1457
395k
    case BT_MINUS:
1458
396k
    case BT_APOS:
1459
397k
    case BT_LPAR:
1460
438k
    case BT_RPAR:
1461
439k
    case BT_PLUS:
1462
441k
    case BT_COMMA:
1463
503k
    case BT_SOL:
1464
504k
    case BT_EQUALS:
1465
509k
    case BT_QUEST:
1466
513k
    case BT_CR:
1467
514k
    case BT_LF:
1468
515k
    case BT_SEMI:
1469
515k
    case BT_EXCL:
1470
520k
    case BT_AST:
1471
523k
    case BT_PERCNT:
1472
530k
    case BT_NUM:
1473
#  ifdef XML_NS
1474
    case BT_COLON:
1475
#  endif
1476
530k
      break;
1477
1.93k
    case BT_S:
1478
1.93k
      if (CHAR_MATCHES(enc, ptr, ASCII_TAB)) {
1479
1
        *badPtr = ptr;
1480
1
        return 0;
1481
1
      }
1482
1.93k
      break;
1483
4.06k
    case BT_NAME:
1484
81.6k
    case BT_NMSTRT:
1485
81.6k
      if (! (BYTE_TO_ASCII(enc, ptr) & ~0x7f))
1486
81.6k
        break;
1487
      /* fall through */
1488
2.23k
    default:
1489
2.23k
      switch (BYTE_TO_ASCII(enc, ptr)) {
1490
1.80k
      case 0x24: /* $ */
1491
2.21k
      case 0x40: /* @ */
1492
2.21k
        break;
1493
15
      default:
1494
15
        *badPtr = ptr;
1495
15
        return 0;
1496
2.23k
      }
1497
2.21k
      break;
1498
616k
    }
1499
616k
  }
1500
2.76k
  return 1;
1501
2.77k
}
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
364k
                ATTRIBUTE *atts) {
1511
364k
  enum { other, inName, inValue } state = inName;
1512
364k
  int nAtts = 0;
1513
364k
  int open = 0; /* defined when state == inValue;
1514
                   initialization just to shut up compilers */
1515
1516
49.2M
  for (ptr += MINBPC(enc);; ptr += MINBPC(enc)) {
1517
49.2M
    switch (BYTE_TYPE(enc, ptr)) {
1518
0
#  define START_NAME                                                           \
1519
26.6M
    if (state == other) {                                                      \
1520
4.33M
      if (nAtts < attsMax) {                                                   \
1521
2.21M
        atts[nAtts].name = ptr;                                                \
1522
2.21M
        atts[nAtts].normalized = 1;                                            \
1523
2.21M
      }                                                                        \
1524
4.33M
      state = inName;                                                          \
1525
4.33M
    }
1526
0
#  define LEAD_CASE(n)                                                         \
1527
399k
  case BT_LEAD##n: /* NOTE: The encoding has already been validated. */        \
1528
399k
    START_NAME ptr += (n - MINBPC(enc));                                       \
1529
399k
    break;
1530
192k
      LEAD_CASE(2)
1531
155k
      LEAD_CASE(3)
1532
50.4k
      LEAD_CASE(4)
1533
0
#  undef LEAD_CASE
1534
0
    case BT_NONASCII:
1535
24.3M
    case BT_NMSTRT:
1536
26.2M
    case BT_HEX:
1537
26.2M
      START_NAME
1538
26.2M
      break;
1539
0
#  undef START_NAME
1540
511k
    case BT_QUOT:
1541
511k
      if (state != inValue) {
1542
186k
        if (nAtts < attsMax)
1543
131k
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1544
186k
        state = inValue;
1545
186k
        open = BT_QUOT;
1546
325k
      } else if (open == BT_QUOT) {
1547
186k
        state = other;
1548
186k
        if (nAtts < attsMax)
1549
131k
          atts[nAtts].valueEnd = ptr;
1550
186k
        nAtts++;
1551
186k
      }
1552
511k
      break;
1553
8.33M
    case BT_APOS:
1554
8.33M
      if (state != inValue) {
1555
4.14M
        if (nAtts < attsMax)
1556
2.08M
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1557
4.14M
        state = inValue;
1558
4.14M
        open = BT_APOS;
1559
4.18M
      } else if (open == BT_APOS) {
1560
4.14M
        state = other;
1561
4.14M
        if (nAtts < attsMax)
1562
2.08M
          atts[nAtts].valueEnd = ptr;
1563
4.14M
        nAtts++;
1564
4.14M
      }
1565
8.33M
      break;
1566
128k
    case BT_AMP:
1567
128k
      if (nAtts < attsMax)
1568
127k
        atts[nAtts].normalized = 0;
1569
128k
      break;
1570
2.90M
    case BT_S:
1571
2.90M
      if (state == inName)
1572
63.8k
        state = other;
1573
2.84M
      else if (state == inValue && nAtts < attsMax && atts[nAtts].normalized
1574
114k
               && (ptr == atts[nAtts].valuePtr
1575
25.8k
                   || BYTE_TO_ASCII(enc, ptr) != ASCII_SPACE
1576
13.4k
                   || BYTE_TO_ASCII(enc, ptr + MINBPC(enc)) == ASCII_SPACE
1577
12.8k
                   || BYTE_TYPE(enc, ptr + MINBPC(enc)) == open))
1578
102k
        atts[nAtts].normalized = 0;
1579
2.90M
      break;
1580
2.64M
    case BT_CR:
1581
3.21M
    case BT_LF:
1582
      /* This case ensures that the first attribute name is counted
1583
         Apart from that we could just change state on the quote. */
1584
3.21M
      if (state == inName)
1585
42.4k
        state = other;
1586
3.17M
      else if (state == inValue && nAtts < attsMax)
1587
821k
        atts[nAtts].normalized = 0;
1588
3.21M
      break;
1589
266k
    case BT_GT:
1590
451k
    case BT_SOL:
1591
451k
      if (state != inValue)
1592
364k
        return nAtts;
1593
86.2k
      break;
1594
7.11M
    default:
1595
7.11M
      break;
1596
49.2M
    }
1597
49.2M
  }
1598
  /* not reached */
1599
364k
}
xmltok.c:normal_getAtts
Line
Count
Source
1510
364k
                ATTRIBUTE *atts) {
1511
364k
  enum { other, inName, inValue } state = inName;
1512
364k
  int nAtts = 0;
1513
364k
  int open = 0; /* defined when state == inValue;
1514
                   initialization just to shut up compilers */
1515
1516
49.2M
  for (ptr += MINBPC(enc);; ptr += MINBPC(enc)) {
1517
49.2M
    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
192k
      LEAD_CASE(2)
1531
155k
      LEAD_CASE(3)
1532
50.4k
      LEAD_CASE(4)
1533
0
#  undef LEAD_CASE
1534
0
    case BT_NONASCII:
1535
24.3M
    case BT_NMSTRT:
1536
26.2M
    case BT_HEX:
1537
26.2M
      START_NAME
1538
26.2M
      break;
1539
0
#  undef START_NAME
1540
511k
    case BT_QUOT:
1541
511k
      if (state != inValue) {
1542
186k
        if (nAtts < attsMax)
1543
131k
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1544
186k
        state = inValue;
1545
186k
        open = BT_QUOT;
1546
325k
      } else if (open == BT_QUOT) {
1547
186k
        state = other;
1548
186k
        if (nAtts < attsMax)
1549
131k
          atts[nAtts].valueEnd = ptr;
1550
186k
        nAtts++;
1551
186k
      }
1552
511k
      break;
1553
8.33M
    case BT_APOS:
1554
8.33M
      if (state != inValue) {
1555
4.14M
        if (nAtts < attsMax)
1556
2.08M
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1557
4.14M
        state = inValue;
1558
4.14M
        open = BT_APOS;
1559
4.18M
      } else if (open == BT_APOS) {
1560
4.14M
        state = other;
1561
4.14M
        if (nAtts < attsMax)
1562
2.08M
          atts[nAtts].valueEnd = ptr;
1563
4.14M
        nAtts++;
1564
4.14M
      }
1565
8.33M
      break;
1566
128k
    case BT_AMP:
1567
128k
      if (nAtts < attsMax)
1568
127k
        atts[nAtts].normalized = 0;
1569
128k
      break;
1570
2.90M
    case BT_S:
1571
2.90M
      if (state == inName)
1572
63.8k
        state = other;
1573
2.84M
      else if (state == inValue && nAtts < attsMax && atts[nAtts].normalized
1574
114k
               && (ptr == atts[nAtts].valuePtr
1575
25.8k
                   || BYTE_TO_ASCII(enc, ptr) != ASCII_SPACE
1576
13.4k
                   || BYTE_TO_ASCII(enc, ptr + MINBPC(enc)) == ASCII_SPACE
1577
12.8k
                   || BYTE_TYPE(enc, ptr + MINBPC(enc)) == open))
1578
102k
        atts[nAtts].normalized = 0;
1579
2.90M
      break;
1580
2.64M
    case BT_CR:
1581
3.21M
    case BT_LF:
1582
      /* This case ensures that the first attribute name is counted
1583
         Apart from that we could just change state on the quote. */
1584
3.21M
      if (state == inName)
1585
42.4k
        state = other;
1586
3.17M
      else if (state == inValue && nAtts < attsMax)
1587
821k
        atts[nAtts].normalized = 0;
1588
3.21M
      break;
1589
266k
    case BT_GT:
1590
451k
    case BT_SOL:
1591
451k
      if (state != inValue)
1592
364k
        return nAtts;
1593
86.2k
      break;
1594
7.11M
    default:
1595
7.11M
      break;
1596
49.2M
    }
1597
49.2M
  }
1598
  /* not reached */
1599
364k
}
Unexecuted instantiation: xmltok.c:little2_getAtts
Unexecuted instantiation: xmltok.c:big2_getAtts
1600
1601
static int PTRFASTCALL
1602
107k
PREFIX(charRefNumber)(const ENCODING *enc, const char *ptr) {
1603
107k
  int result = 0;
1604
  /* skip &# */
1605
107k
  UNUSED_P(enc);
1606
107k
  ptr += 2 * MINBPC(enc);
1607
107k
  if (CHAR_MATCHES(enc, ptr, ASCII_x)) {
1608
475k
    for (ptr += MINBPC(enc); ! CHAR_MATCHES(enc, ptr, ASCII_SEMI);
1609
371k
         ptr += MINBPC(enc)) {
1610
371k
      int c = BYTE_TO_ASCII(enc, ptr);
1611
371k
      switch (c) {
1612
6.13k
      case ASCII_0:
1613
34.2k
      case ASCII_1:
1614
77.1k
      case ASCII_2:
1615
82.4k
      case ASCII_3:
1616
132k
      case ASCII_4:
1617
166k
      case ASCII_5:
1618
171k
      case ASCII_6:
1619
192k
      case ASCII_7:
1620
225k
      case ASCII_8:
1621
234k
      case ASCII_9:
1622
234k
        result <<= 4;
1623
234k
        result |= (c - ASCII_0);
1624
234k
        break;
1625
34.9k
      case ASCII_A:
1626
39.2k
      case ASCII_B:
1627
39.8k
      case ASCII_C:
1628
44.1k
      case ASCII_D:
1629
45.6k
      case ASCII_E:
1630
69.8k
      case ASCII_F:
1631
69.8k
        result <<= 4;
1632
69.8k
        result += 10 + (c - ASCII_A);
1633
69.8k
        break;
1634
2.32k
      case ASCII_a:
1635
19.8k
      case ASCII_b:
1636
20.6k
      case ASCII_c:
1637
54.4k
      case ASCII_d:
1638
55.5k
      case ASCII_e:
1639
67.7k
      case ASCII_f:
1640
67.7k
        result <<= 4;
1641
67.7k
        result += 10 + (c - ASCII_a);
1642
67.7k
        break;
1643
371k
      }
1644
371k
      if (result >= 0x110000)
1645
11
        return -1;
1646
371k
    }
1647
103k
  } else {
1648
16.9k
    for (; ! CHAR_MATCHES(enc, ptr, ASCII_SEMI); ptr += MINBPC(enc)) {
1649
12.9k
      int c = BYTE_TO_ASCII(enc, ptr);
1650
12.9k
      result *= 10;
1651
12.9k
      result += (c - ASCII_0);
1652
12.9k
      if (result >= 0x110000)
1653
6
        return -1;
1654
12.9k
    }
1655
4.07k
  }
1656
107k
  return checkCharRefNumber(result);
1657
107k
}
xmltok.c:normal_charRefNumber
Line
Count
Source
1602
107k
PREFIX(charRefNumber)(const ENCODING *enc, const char *ptr) {
1603
107k
  int result = 0;
1604
  /* skip &# */
1605
107k
  UNUSED_P(enc);
1606
107k
  ptr += 2 * MINBPC(enc);
1607
107k
  if (CHAR_MATCHES(enc, ptr, ASCII_x)) {
1608
475k
    for (ptr += MINBPC(enc); ! CHAR_MATCHES(enc, ptr, ASCII_SEMI);
1609
371k
         ptr += MINBPC(enc)) {
1610
371k
      int c = BYTE_TO_ASCII(enc, ptr);
1611
371k
      switch (c) {
1612
6.13k
      case ASCII_0:
1613
34.2k
      case ASCII_1:
1614
77.1k
      case ASCII_2:
1615
82.4k
      case ASCII_3:
1616
132k
      case ASCII_4:
1617
166k
      case ASCII_5:
1618
171k
      case ASCII_6:
1619
192k
      case ASCII_7:
1620
225k
      case ASCII_8:
1621
234k
      case ASCII_9:
1622
234k
        result <<= 4;
1623
234k
        result |= (c - ASCII_0);
1624
234k
        break;
1625
34.9k
      case ASCII_A:
1626
39.2k
      case ASCII_B:
1627
39.8k
      case ASCII_C:
1628
44.1k
      case ASCII_D:
1629
45.6k
      case ASCII_E:
1630
69.8k
      case ASCII_F:
1631
69.8k
        result <<= 4;
1632
69.8k
        result += 10 + (c - ASCII_A);
1633
69.8k
        break;
1634
2.32k
      case ASCII_a:
1635
19.8k
      case ASCII_b:
1636
20.6k
      case ASCII_c:
1637
54.4k
      case ASCII_d:
1638
55.5k
      case ASCII_e:
1639
67.7k
      case ASCII_f:
1640
67.7k
        result <<= 4;
1641
67.7k
        result += 10 + (c - ASCII_a);
1642
67.7k
        break;
1643
371k
      }
1644
371k
      if (result >= 0x110000)
1645
11
        return -1;
1646
371k
    }
1647
103k
  } else {
1648
16.9k
    for (; ! CHAR_MATCHES(enc, ptr, ASCII_SEMI); ptr += MINBPC(enc)) {
1649
12.9k
      int c = BYTE_TO_ASCII(enc, ptr);
1650
12.9k
      result *= 10;
1651
12.9k
      result += (c - ASCII_0);
1652
12.9k
      if (result >= 0x110000)
1653
6
        return -1;
1654
12.9k
    }
1655
4.07k
  }
1656
107k
  return checkCharRefNumber(result);
1657
107k
}
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
238k
                             const char *end) {
1662
238k
  UNUSED_P(enc);
1663
238k
  switch ((end - ptr) / MINBPC(enc)) {
1664
16.9k
  case 2:
1665
16.9k
    if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_t)) {
1666
4.02k
      switch (BYTE_TO_ASCII(enc, ptr)) {
1667
418
      case ASCII_l:
1668
418
        return ASCII_LT;
1669
208
      case ASCII_g:
1670
208
        return ASCII_GT;
1671
4.02k
      }
1672
4.02k
    }
1673
16.2k
    break;
1674
44.9k
  case 3:
1675
44.9k
    if (CHAR_MATCHES(enc, ptr, ASCII_a)) {
1676
33.9k
      ptr += MINBPC(enc);
1677
33.9k
      if (CHAR_MATCHES(enc, ptr, ASCII_m)) {
1678
29.8k
        ptr += MINBPC(enc);
1679
29.8k
        if (CHAR_MATCHES(enc, ptr, ASCII_p))
1680
29.5k
          return ASCII_AMP;
1681
29.8k
      }
1682
33.9k
    }
1683
15.4k
    break;
1684
29.2k
  case 4:
1685
29.2k
    switch (BYTE_TO_ASCII(enc, ptr)) {
1686
15.2k
    case ASCII_q:
1687
15.2k
      ptr += MINBPC(enc);
1688
15.2k
      if (CHAR_MATCHES(enc, ptr, ASCII_u)) {
1689
14.0k
        ptr += MINBPC(enc);
1690
14.0k
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1691
13.8k
          ptr += MINBPC(enc);
1692
13.8k
          if (CHAR_MATCHES(enc, ptr, ASCII_t))
1693
13.4k
            return ASCII_QUOT;
1694
13.8k
        }
1695
14.0k
      }
1696
1.81k
      break;
1697
8.82k
    case ASCII_a:
1698
8.82k
      ptr += MINBPC(enc);
1699
8.82k
      if (CHAR_MATCHES(enc, ptr, ASCII_p)) {
1700
2.70k
        ptr += MINBPC(enc);
1701
2.70k
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1702
1.35k
          ptr += MINBPC(enc);
1703
1.35k
          if (CHAR_MATCHES(enc, ptr, ASCII_s))
1704
625
            return ASCII_APOS;
1705
1.35k
        }
1706
2.70k
      }
1707
8.19k
      break;
1708
29.2k
    }
1709
238k
  }
1710
193k
  return 0;
1711
238k
}
xmltok.c:normal_predefinedEntityName
Line
Count
Source
1661
238k
                             const char *end) {
1662
238k
  UNUSED_P(enc);
1663
238k
  switch ((end - ptr) / MINBPC(enc)) {
1664
16.9k
  case 2:
1665
16.9k
    if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_t)) {
1666
4.02k
      switch (BYTE_TO_ASCII(enc, ptr)) {
1667
418
      case ASCII_l:
1668
418
        return ASCII_LT;
1669
208
      case ASCII_g:
1670
208
        return ASCII_GT;
1671
4.02k
      }
1672
4.02k
    }
1673
16.2k
    break;
1674
44.9k
  case 3:
1675
44.9k
    if (CHAR_MATCHES(enc, ptr, ASCII_a)) {
1676
33.9k
      ptr += MINBPC(enc);
1677
33.9k
      if (CHAR_MATCHES(enc, ptr, ASCII_m)) {
1678
29.8k
        ptr += MINBPC(enc);
1679
29.8k
        if (CHAR_MATCHES(enc, ptr, ASCII_p))
1680
29.5k
          return ASCII_AMP;
1681
29.8k
      }
1682
33.9k
    }
1683
15.4k
    break;
1684
29.2k
  case 4:
1685
29.2k
    switch (BYTE_TO_ASCII(enc, ptr)) {
1686
15.2k
    case ASCII_q:
1687
15.2k
      ptr += MINBPC(enc);
1688
15.2k
      if (CHAR_MATCHES(enc, ptr, ASCII_u)) {
1689
14.0k
        ptr += MINBPC(enc);
1690
14.0k
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1691
13.8k
          ptr += MINBPC(enc);
1692
13.8k
          if (CHAR_MATCHES(enc, ptr, ASCII_t))
1693
13.4k
            return ASCII_QUOT;
1694
13.8k
        }
1695
14.0k
      }
1696
1.81k
      break;
1697
8.82k
    case ASCII_a:
1698
8.82k
      ptr += MINBPC(enc);
1699
8.82k
      if (CHAR_MATCHES(enc, ptr, ASCII_p)) {
1700
2.70k
        ptr += MINBPC(enc);
1701
2.70k
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1702
1.35k
          ptr += MINBPC(enc);
1703
1.35k
          if (CHAR_MATCHES(enc, ptr, ASCII_s))
1704
625
            return ASCII_APOS;
1705
1.35k
        }
1706
2.70k
      }
1707
8.19k
      break;
1708
29.2k
    }
1709
238k
  }
1710
193k
  return 0;
1711
238k
}
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
382k
                         const char *end1, const char *ptr2) {
1716
382k
  UNUSED_P(enc);
1717
1.91M
  for (; *ptr2; ptr1 += MINBPC(enc), ptr2++) {
1718
1.68M
    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
42
      return 0; /* LCOV_EXCL_LINE */
1725
42
    }
1726
1.68M
    if (! CHAR_MATCHES(enc, ptr1, *ptr2))
1727
145k
      return 0;
1728
1.68M
  }
1729
236k
  return ptr1 == end1;
1730
382k
}
xmltok.c:normal_nameMatchesAscii
Line
Count
Source
1715
382k
                         const char *end1, const char *ptr2) {
1716
382k
  UNUSED_P(enc);
1717
1.91M
  for (; *ptr2; ptr1 += MINBPC(enc), ptr2++) {
1718
1.68M
    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
42
      return 0; /* LCOV_EXCL_LINE */
1725
42
    }
1726
1.68M
    if (! CHAR_MATCHES(enc, ptr1, *ptr2))
1727
145k
      return 0;
1728
1.68M
  }
1729
236k
  return ptr1 == end1;
1730
382k
}
Unexecuted instantiation: xmltok.c:little2_nameMatchesAscii
Unexecuted instantiation: xmltok.c:big2_nameMatchesAscii
1731
1732
static int PTRFASTCALL
1733
515k
PREFIX(nameLength)(const ENCODING *enc, const char *ptr) {
1734
515k
  const char *start = ptr;
1735
10.2M
  for (;;) {
1736
10.2M
    switch (BYTE_TYPE(enc, ptr)) {
1737
0
#  define LEAD_CASE(n)                                                         \
1738
124k
  case BT_LEAD##n:                                                             \
1739
124k
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1740
124k
    break;
1741
72.8k
      LEAD_CASE(2)
1742
51.6k
      LEAD_CASE(3)
1743
0
      LEAD_CASE(4)
1744
0
#  undef LEAD_CASE
1745
0
    case BT_NONASCII:
1746
8.44M
    case BT_NMSTRT:
1747
#  ifdef XML_NS
1748
    case BT_COLON:
1749
#  endif
1750
9.35M
    case BT_HEX:
1751
9.51M
    case BT_DIGIT:
1752
9.52M
    case BT_NAME:
1753
9.58M
    case BT_MINUS:
1754
9.58M
      ptr += MINBPC(enc);
1755
9.58M
      break;
1756
515k
    default:
1757
515k
      return (int)(ptr - start);
1758
10.2M
    }
1759
10.2M
  }
1760
515k
}
xmltok.c:normal_nameLength
Line
Count
Source
1733
515k
PREFIX(nameLength)(const ENCODING *enc, const char *ptr) {
1734
515k
  const char *start = ptr;
1735
10.2M
  for (;;) {
1736
10.2M
    switch (BYTE_TYPE(enc, ptr)) {
1737
0
#  define LEAD_CASE(n)                                                         \
1738
0
  case BT_LEAD##n:                                                             \
1739
0
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1740
0
    break;
1741
72.8k
      LEAD_CASE(2)
1742
51.6k
      LEAD_CASE(3)
1743
0
      LEAD_CASE(4)
1744
0
#  undef LEAD_CASE
1745
0
    case BT_NONASCII:
1746
8.44M
    case BT_NMSTRT:
1747
#  ifdef XML_NS
1748
    case BT_COLON:
1749
#  endif
1750
9.35M
    case BT_HEX:
1751
9.51M
    case BT_DIGIT:
1752
9.52M
    case BT_NAME:
1753
9.58M
    case BT_MINUS:
1754
9.58M
      ptr += MINBPC(enc);
1755
9.58M
      break;
1756
515k
    default:
1757
515k
      return (int)(ptr - start);
1758
10.2M
    }
1759
10.2M
  }
1760
515k
}
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
14.4k
                       POSITION *pos) {
1780
113M
  while (HAS_CHAR(enc, ptr, end)) {
1781
113M
    switch (BYTE_TYPE(enc, ptr)) {
1782
0
#  define LEAD_CASE(n)                                                         \
1783
1.68M
  case BT_LEAD##n:                                                             \
1784
1.68M
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1785
1.68M
    pos->columnNumber++;                                                       \
1786
1.68M
    break;
1787
805k
      LEAD_CASE(2)
1788
645k
      LEAD_CASE(3)
1789
233k
      LEAD_CASE(4)
1790
0
#  undef LEAD_CASE
1791
3.47M
    case BT_LF:
1792
3.47M
      pos->columnNumber = 0;
1793
3.47M
      pos->lineNumber++;
1794
3.47M
      ptr += MINBPC(enc);
1795
3.47M
      break;
1796
4.52M
    case BT_CR:
1797
4.52M
      pos->lineNumber++;
1798
4.52M
      ptr += MINBPC(enc);
1799
4.52M
      if (HAS_CHAR(enc, ptr, end) && BYTE_TYPE(enc, ptr) == BT_LF)
1800
874k
        ptr += MINBPC(enc);
1801
4.52M
      pos->columnNumber = 0;
1802
4.52M
      break;
1803
103M
    default:
1804
103M
      ptr += MINBPC(enc);
1805
103M
      pos->columnNumber++;
1806
103M
      break;
1807
113M
    }
1808
113M
  }
1809
14.4k
}
xmltok.c:normal_updatePosition
Line
Count
Source
1779
14.0k
                       POSITION *pos) {
1780
113M
  while (HAS_CHAR(enc, ptr, end)) {
1781
113M
    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
805k
      LEAD_CASE(2)
1788
645k
      LEAD_CASE(3)
1789
233k
      LEAD_CASE(4)
1790
0
#  undef LEAD_CASE
1791
3.47M
    case BT_LF:
1792
3.47M
      pos->columnNumber = 0;
1793
3.47M
      pos->lineNumber++;
1794
3.47M
      ptr += MINBPC(enc);
1795
3.47M
      break;
1796
4.52M
    case BT_CR:
1797
4.52M
      pos->lineNumber++;
1798
4.52M
      ptr += MINBPC(enc);
1799
4.52M
      if (HAS_CHAR(enc, ptr, end) && BYTE_TYPE(enc, ptr) == BT_LF)
1800
874k
        ptr += MINBPC(enc);
1801
4.52M
      pos->columnNumber = 0;
1802
4.52M
      break;
1803
103M
    default:
1804
103M
      ptr += MINBPC(enc);
1805
103M
      pos->columnNumber++;
1806
103M
      break;
1807
113M
    }
1808
113M
  }
1809
14.0k
}
xmltok.c:little2_updatePosition
Line
Count
Source
1779
197
                       POSITION *pos) {
1780
1.35k
  while (HAS_CHAR(enc, ptr, end)) {
1781
1.35k
    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.35k
    default:
1804
1.35k
      ptr += MINBPC(enc);
1805
1.35k
      pos->columnNumber++;
1806
1.35k
      break;
1807
1.35k
    }
1808
1.35k
  }
1809
197
}
xmltok.c:big2_updatePosition
Line
Count
Source
1779
170
                       POSITION *pos) {
1780
883
  while (HAS_CHAR(enc, ptr, end)) {
1781
883
    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
883
    default:
1804
883
      ptr += MINBPC(enc);
1805
883
      pos->columnNumber++;
1806
883
      break;
1807
883
    }
1808
883
  }
1809
170
}
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 */