Coverage Report

Created: 2025-10-10 06:51

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
24
#    define IS_INVALID_CHAR(enc, ptr, n) (0)
46
#  endif
47
48
#  define INVALID_LEAD_CASE(n, ptr, nextTokPtr)                                \
49
421k
  case BT_LEAD##n:                                                             \
50
421k
    if (end - ptr < n)                                                         \
51
421k
      return XML_TOK_PARTIAL_CHAR;                                             \
52
421k
    if (IS_INVALID_CHAR(enc, ptr, n)) {                                        \
53
54
      *(nextTokPtr) = (ptr);                                                   \
54
54
      return XML_TOK_INVALID;                                                  \
55
54
    }                                                                          \
56
421k
    ptr += n;                                                                  \
57
421k
    break;
58
59
#  define INVALID_CASES(ptr, nextTokPtr)                                       \
60
139k
    INVALID_LEAD_CASE(2, ptr, nextTokPtr)                                      \
61
162k
    INVALID_LEAD_CASE(3, ptr, nextTokPtr)                                      \
62
162k
    INVALID_LEAD_CASE(4, ptr, nextTokPtr)                                      \
63
119k
  case BT_NONXML:                                                              \
64
35
  case BT_MALFORM:                                                             \
65
60
  case BT_TRAIL:                                                               \
66
60
    *(nextTokPtr) = (ptr);                                                     \
67
60
    return XML_TOK_INVALID;
68
69
#  define CHECK_NAME_CASE(n, enc, ptr, end, nextTokPtr)                        \
70
290k
  case BT_LEAD##n:                                                             \
71
290k
    if (end - ptr < n)                                                         \
72
290k
      return XML_TOK_PARTIAL_CHAR;                                             \
73
290k
    if (IS_INVALID_CHAR(enc, ptr, n) || ! IS_NAME_CHAR(enc, ptr, n)) {         \
74
137
      *nextTokPtr = ptr;                                                       \
75
137
      return XML_TOK_INVALID;                                                  \
76
137
    }                                                                          \
77
290k
    ptr += n;                                                                  \
78
290k
    break;
79
80
#  define CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)                          \
81
24.1M
  case BT_NONASCII:                                                            \
82
24.1M
    if (! IS_NAME_CHAR_MINBPC(enc, ptr)) {                                     \
83
26
      *nextTokPtr = ptr;                                                       \
84
26
      return XML_TOK_INVALID;                                                  \
85
26
    }                                                                          \
86
24.1M
    /* fall through */                                                         \
87
24.1M
  case BT_NMSTRT:                                                              \
88
19.9M
  case BT_HEX:                                                                 \
89
23.8M
  case BT_DIGIT:                                                               \
90
23.8M
  case BT_NAME:                                                                \
91
24.1M
  case BT_MINUS:                                                               \
92
24.1M
    ptr += MINBPC(enc);                                                        \
93
24.1M
    break;                                                                     \
94
24.1M
    CHECK_NAME_CASE(2, enc, ptr, end, nextTokPtr)                              \
95
197k
    CHECK_NAME_CASE(3, enc, ptr, end, nextTokPtr)                              \
96
197k
    CHECK_NAME_CASE(4, enc, ptr, end, nextTokPtr)
97
98
#  define CHECK_NMSTRT_CASE(n, enc, ptr, end, nextTokPtr)                      \
99
54.7k
  case BT_LEAD##n:                                                             \
100
54.7k
    if ((end) - (ptr) < (n))                                                   \
101
54.6k
      return XML_TOK_PARTIAL_CHAR;                                             \
102
54.7k
    if (IS_INVALID_CHAR(enc, ptr, n) || ! IS_NMSTRT_CHAR(enc, ptr, n)) {       \
103
89
      *nextTokPtr = ptr;                                                       \
104
89
      return XML_TOK_INVALID;                                                  \
105
89
    }                                                                          \
106
54.7k
    ptr += n;                                                                  \
107
54.6k
    break;
108
109
#  define CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)                        \
110
1.76M
  case BT_NONASCII:                                                            \
111
1.76M
    if (! IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {                                   \
112
0
      *nextTokPtr = ptr;                                                       \
113
0
      return XML_TOK_INVALID;                                                  \
114
0
    }                                                                          \
115
1.76M
    /* fall through */                                                         \
116
1.76M
  case BT_NMSTRT:                                                              \
117
1.76M
  case BT_HEX:                                                                 \
118
1.76M
    ptr += MINBPC(enc);                                                        \
119
1.76M
    break;                                                                     \
120
1.76M
    CHECK_NMSTRT_CASE(2, enc, ptr, end, nextTokPtr)                            \
121
34.5k
    CHECK_NMSTRT_CASE(3, enc, ptr, end, nextTokPtr)                            \
122
34.4k
    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
181M
    ((end) - (ptr) >= ((count) * MINBPC(enc)))
130
131
6.98M
#  define HAS_CHAR(enc, ptr, end) HAS_CHARS(enc, ptr, end, 1)
132
133
#  define REQUIRE_CHARS(enc, ptr, end, count)                                  \
134
18.8M
    {                                                                          \
135
18.8M
      if (! HAS_CHARS(enc, ptr, end, count)) {                                 \
136
335
        return XML_TOK_PARTIAL;                                                \
137
335
      }                                                                        \
138
18.8M
    }
139
140
18.8M
#  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
12.6k
                    const char **nextTokPtr) {
147
12.6k
  if (HAS_CHAR(enc, ptr, end)) {
148
12.6k
    if (! CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
149
5
      *nextTokPtr = ptr;
150
5
      return XML_TOK_INVALID;
151
5
    }
152
12.6k
    ptr += MINBPC(enc);
153
2.48M
    while (HAS_CHAR(enc, ptr, end)) {
154
2.48M
      switch (BYTE_TYPE(enc, ptr)) {
155
132k
        INVALID_CASES(ptr, nextTokPtr)
156
20.9k
      case BT_MINUS:
157
20.9k
        ptr += MINBPC(enc);
158
20.9k
        REQUIRE_CHAR(enc, ptr, end);
159
20.9k
        if (CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
160
12.6k
          ptr += MINBPC(enc);
161
12.6k
          REQUIRE_CHAR(enc, ptr, end);
162
12.6k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
163
8
            *nextTokPtr = ptr;
164
8
            return XML_TOK_INVALID;
165
8
          }
166
12.5k
          *nextTokPtr = ptr + MINBPC(enc);
167
12.5k
          return XML_TOK_COMMENT;
168
12.6k
        }
169
8.32k
        break;
170
2.39M
      default:
171
2.39M
        ptr += MINBPC(enc);
172
2.39M
        break;
173
2.48M
      }
174
2.48M
    }
175
12.6k
  }
176
50
  return XML_TOK_PARTIAL;
177
12.6k
}
xmltok.c:normal_scanComment
Line
Count
Source
146
12.6k
                    const char **nextTokPtr) {
147
12.6k
  if (HAS_CHAR(enc, ptr, end)) {
148
12.6k
    if (! CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
149
5
      *nextTokPtr = ptr;
150
5
      return XML_TOK_INVALID;
151
5
    }
152
12.6k
    ptr += MINBPC(enc);
153
2.48M
    while (HAS_CHAR(enc, ptr, end)) {
154
2.48M
      switch (BYTE_TYPE(enc, ptr)) {
155
132k
        INVALID_CASES(ptr, nextTokPtr)
156
20.9k
      case BT_MINUS:
157
20.9k
        ptr += MINBPC(enc);
158
20.9k
        REQUIRE_CHAR(enc, ptr, end);
159
20.9k
        if (CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
160
12.6k
          ptr += MINBPC(enc);
161
12.6k
          REQUIRE_CHAR(enc, ptr, end);
162
12.6k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
163
8
            *nextTokPtr = ptr;
164
8
            return XML_TOK_INVALID;
165
8
          }
166
12.5k
          *nextTokPtr = ptr + MINBPC(enc);
167
12.5k
          return XML_TOK_COMMENT;
168
12.6k
        }
169
8.32k
        break;
170
2.39M
      default:
171
2.39M
        ptr += MINBPC(enc);
172
2.39M
        break;
173
2.48M
      }
174
2.48M
    }
175
12.6k
  }
176
50
  return XML_TOK_PARTIAL;
177
12.6k
}
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
66.9k
                 const char **nextTokPtr) {
184
66.9k
  REQUIRE_CHAR(enc, ptr, end);
185
66.9k
  switch (BYTE_TYPE(enc, ptr)) {
186
2.50k
  case BT_MINUS:
187
2.50k
    return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
188
8
  case BT_LSQB:
189
8
    *nextTokPtr = ptr + MINBPC(enc);
190
8
    return XML_TOK_COND_SECT_OPEN;
191
660
  case BT_NMSTRT:
192
64.3k
  case BT_HEX:
193
64.3k
    ptr += MINBPC(enc);
194
64.3k
    break;
195
1
  default:
196
1
    *nextTokPtr = ptr;
197
1
    return XML_TOK_INVALID;
198
66.9k
  }
199
427k
  while (HAS_CHAR(enc, ptr, end)) {
200
427k
    switch (BYTE_TYPE(enc, ptr)) {
201
14
    case BT_PERCNT:
202
14
      REQUIRE_CHARS(enc, ptr, end, 2);
203
      /* don't allow <!ENTITY% foo "whatever"> */
204
12
      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
12
      }
212
      /* fall through */
213
17.4k
    case BT_S:
214
61.1k
    case BT_CR:
215
64.3k
    case BT_LF:
216
64.3k
      *nextTokPtr = ptr;
217
64.3k
      return XML_TOK_DECL_OPEN;
218
352k
    case BT_NMSTRT:
219
362k
    case BT_HEX:
220
362k
      ptr += MINBPC(enc);
221
362k
      break;
222
5
    default:
223
5
      *nextTokPtr = ptr;
224
5
      return XML_TOK_INVALID;
225
427k
    }
226
427k
  }
227
42
  return XML_TOK_PARTIAL;
228
64.3k
}
xmltok.c:normal_scanDecl
Line
Count
Source
183
66.9k
                 const char **nextTokPtr) {
184
66.9k
  REQUIRE_CHAR(enc, ptr, end);
185
66.9k
  switch (BYTE_TYPE(enc, ptr)) {
186
2.50k
  case BT_MINUS:
187
2.50k
    return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
188
8
  case BT_LSQB:
189
8
    *nextTokPtr = ptr + MINBPC(enc);
190
8
    return XML_TOK_COND_SECT_OPEN;
191
660
  case BT_NMSTRT:
192
64.3k
  case BT_HEX:
193
64.3k
    ptr += MINBPC(enc);
194
64.3k
    break;
195
1
  default:
196
1
    *nextTokPtr = ptr;
197
1
    return XML_TOK_INVALID;
198
66.9k
  }
199
427k
  while (HAS_CHAR(enc, ptr, end)) {
200
427k
    switch (BYTE_TYPE(enc, ptr)) {
201
14
    case BT_PERCNT:
202
14
      REQUIRE_CHARS(enc, ptr, end, 2);
203
      /* don't allow <!ENTITY% foo "whatever"> */
204
12
      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
12
      }
212
      /* fall through */
213
17.4k
    case BT_S:
214
61.1k
    case BT_CR:
215
64.3k
    case BT_LF:
216
64.3k
      *nextTokPtr = ptr;
217
64.3k
      return XML_TOK_DECL_OPEN;
218
352k
    case BT_NMSTRT:
219
362k
    case BT_HEX:
220
362k
      ptr += MINBPC(enc);
221
362k
      break;
222
5
    default:
223
5
      *nextTokPtr = ptr;
224
5
      return XML_TOK_INVALID;
225
427k
    }
226
427k
  }
227
42
  return XML_TOK_PARTIAL;
228
64.3k
}
Unexecuted instantiation: xmltok.c:little2_scanDecl
Unexecuted instantiation: xmltok.c:big2_scanDecl
229
230
static int PTRCALL
231
PREFIX(checkPiTarget)(const ENCODING *enc, const char *ptr, const char *end,
232
19.6k
                      int *tokPtr) {
233
19.6k
  int upper = 0;
234
19.6k
  UNUSED_P(enc);
235
19.6k
  *tokPtr = XML_TOK_PI;
236
19.6k
  if (end - ptr != MINBPC(enc) * 3)
237
13.5k
    return 1;
238
6.14k
  switch (BYTE_TO_ASCII(enc, ptr)) {
239
3.82k
  case ASCII_x:
240
3.82k
    break;
241
1.07k
  case ASCII_X:
242
1.07k
    upper = 1;
243
1.07k
    break;
244
1.25k
  default:
245
1.25k
    return 1;
246
6.14k
  }
247
4.89k
  ptr += MINBPC(enc);
248
4.89k
  switch (BYTE_TO_ASCII(enc, ptr)) {
249
1.93k
  case ASCII_m:
250
1.93k
    break;
251
608
  case ASCII_M:
252
608
    upper = 1;
253
608
    break;
254
2.35k
  default:
255
2.35k
    return 1;
256
4.89k
  }
257
2.53k
  ptr += MINBPC(enc);
258
2.53k
  switch (BYTE_TO_ASCII(enc, ptr)) {
259
691
  case ASCII_l:
260
691
    break;
261
2
  case ASCII_L:
262
2
    upper = 1;
263
2
    break;
264
1.84k
  default:
265
1.84k
    return 1;
266
2.53k
  }
267
693
  if (upper)
268
5
    return 0;
269
688
  *tokPtr = XML_TOK_XML_DECL;
270
688
  return 1;
271
693
}
xmltok.c:normal_checkPiTarget
Line
Count
Source
232
19.6k
                      int *tokPtr) {
233
19.6k
  int upper = 0;
234
19.6k
  UNUSED_P(enc);
235
19.6k
  *tokPtr = XML_TOK_PI;
236
19.6k
  if (end - ptr != MINBPC(enc) * 3)
237
13.5k
    return 1;
238
6.14k
  switch (BYTE_TO_ASCII(enc, ptr)) {
239
3.82k
  case ASCII_x:
240
3.82k
    break;
241
1.07k
  case ASCII_X:
242
1.07k
    upper = 1;
243
1.07k
    break;
244
1.25k
  default:
245
1.25k
    return 1;
246
6.14k
  }
247
4.89k
  ptr += MINBPC(enc);
248
4.89k
  switch (BYTE_TO_ASCII(enc, ptr)) {
249
1.93k
  case ASCII_m:
250
1.93k
    break;
251
608
  case ASCII_M:
252
608
    upper = 1;
253
608
    break;
254
2.35k
  default:
255
2.35k
    return 1;
256
4.89k
  }
257
2.53k
  ptr += MINBPC(enc);
258
2.53k
  switch (BYTE_TO_ASCII(enc, ptr)) {
259
691
  case ASCII_l:
260
691
    break;
261
2
  case ASCII_L:
262
2
    upper = 1;
263
2
    break;
264
1.84k
  default:
265
1.84k
    return 1;
266
2.53k
  }
267
693
  if (upper)
268
5
    return 0;
269
688
  *tokPtr = XML_TOK_XML_DECL;
270
688
  return 1;
271
693
}
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
19.7k
               const char **nextTokPtr) {
278
19.7k
  int tok;
279
19.7k
  const char *target = ptr;
280
19.7k
  REQUIRE_CHAR(enc, ptr, end);
281
19.7k
  switch (BYTE_TYPE(enc, ptr)) {
282
24.3k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
283
2
  default:
284
2
    *nextTokPtr = ptr;
285
2
    return XML_TOK_INVALID;
286
19.7k
  }
287
1.52M
  while (HAS_CHAR(enc, ptr, end)) {
288
1.52M
    switch (BYTE_TYPE(enc, ptr)) {
289
5.39M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
290
4.89k
    case BT_S:
291
6.42k
    case BT_CR:
292
8.02k
    case BT_LF:
293
8.02k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
294
2
        *nextTokPtr = ptr;
295
2
        return XML_TOK_INVALID;
296
2
      }
297
8.02k
      ptr += MINBPC(enc);
298
5.80M
      while (HAS_CHAR(enc, ptr, end)) {
299
5.80M
        switch (BYTE_TYPE(enc, ptr)) {
300
168k
          INVALID_CASES(ptr, nextTokPtr)
301
34.0k
        case BT_QUEST:
302
34.0k
          ptr += MINBPC(enc);
303
34.0k
          REQUIRE_CHAR(enc, ptr, end);
304
34.0k
          if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
305
7.93k
            *nextTokPtr = ptr + MINBPC(enc);
306
7.93k
            return tok;
307
7.93k
          }
308
26.0k
          break;
309
5.68M
        default:
310
5.68M
          ptr += MINBPC(enc);
311
5.68M
          break;
312
5.80M
        }
313
5.80M
      }
314
64
      return XML_TOK_PARTIAL;
315
11.6k
    case BT_QUEST:
316
11.6k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
317
3
        *nextTokPtr = ptr;
318
3
        return XML_TOK_INVALID;
319
3
      }
320
11.6k
      ptr += MINBPC(enc);
321
11.6k
      REQUIRE_CHAR(enc, ptr, end);
322
11.6k
      if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
323
11.6k
        *nextTokPtr = ptr + MINBPC(enc);
324
11.6k
        return tok;
325
11.6k
      }
326
      /* fall through */
327
17
    default:
328
17
      *nextTokPtr = ptr;
329
17
      return XML_TOK_INVALID;
330
1.52M
    }
331
1.52M
  }
332
38
  return XML_TOK_PARTIAL;
333
19.7k
}
xmltok.c:normal_scanPi
Line
Count
Source
277
19.7k
               const char **nextTokPtr) {
278
19.7k
  int tok;
279
19.7k
  const char *target = ptr;
280
19.7k
  REQUIRE_CHAR(enc, ptr, end);
281
19.7k
  switch (BYTE_TYPE(enc, ptr)) {
282
24.3k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
283
2
  default:
284
2
    *nextTokPtr = ptr;
285
2
    return XML_TOK_INVALID;
286
19.7k
  }
287
1.52M
  while (HAS_CHAR(enc, ptr, end)) {
288
1.52M
    switch (BYTE_TYPE(enc, ptr)) {
289
5.39M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
290
4.89k
    case BT_S:
291
6.42k
    case BT_CR:
292
8.02k
    case BT_LF:
293
8.02k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
294
2
        *nextTokPtr = ptr;
295
2
        return XML_TOK_INVALID;
296
2
      }
297
8.02k
      ptr += MINBPC(enc);
298
5.80M
      while (HAS_CHAR(enc, ptr, end)) {
299
5.80M
        switch (BYTE_TYPE(enc, ptr)) {
300
168k
          INVALID_CASES(ptr, nextTokPtr)
301
34.0k
        case BT_QUEST:
302
34.0k
          ptr += MINBPC(enc);
303
34.0k
          REQUIRE_CHAR(enc, ptr, end);
304
34.0k
          if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
305
7.93k
            *nextTokPtr = ptr + MINBPC(enc);
306
7.93k
            return tok;
307
7.93k
          }
308
26.0k
          break;
309
5.68M
        default:
310
5.68M
          ptr += MINBPC(enc);
311
5.68M
          break;
312
5.80M
        }
313
5.80M
      }
314
64
      return XML_TOK_PARTIAL;
315
11.6k
    case BT_QUEST:
316
11.6k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
317
3
        *nextTokPtr = ptr;
318
3
        return XML_TOK_INVALID;
319
3
      }
320
11.6k
      ptr += MINBPC(enc);
321
11.6k
      REQUIRE_CHAR(enc, ptr, end);
322
11.6k
      if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
323
11.6k
        *nextTokPtr = ptr + MINBPC(enc);
324
11.6k
        return tok;
325
11.6k
      }
326
      /* fall through */
327
17
    default:
328
17
      *nextTokPtr = ptr;
329
17
      return XML_TOK_INVALID;
330
1.52M
    }
331
1.52M
  }
332
38
  return XML_TOK_PARTIAL;
333
19.7k
}
Unexecuted instantiation: xmltok.c:little2_scanPi
Unexecuted instantiation: xmltok.c:big2_scanPi
334
335
static int PTRCALL
336
PREFIX(scanCdataSection)(const ENCODING *enc, const char *ptr, const char *end,
337
1.24k
                         const char **nextTokPtr) {
338
1.24k
  static const char CDATA_LSQB[]
339
1.24k
      = {ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, ASCII_LSQB};
340
1.24k
  int i;
341
1.24k
  UNUSED_P(enc);
342
  /* CDATA[ */
343
1.24k
  REQUIRE_CHARS(enc, ptr, end, 6);
344
8.54k
  for (i = 0; i < 6; i++, ptr += MINBPC(enc)) {
345
7.33k
    if (! CHAR_MATCHES(enc, ptr, CDATA_LSQB[i])) {
346
22
      *nextTokPtr = ptr;
347
22
      return XML_TOK_INVALID;
348
22
    }
349
7.33k
  }
350
1.21k
  *nextTokPtr = ptr;
351
1.21k
  return XML_TOK_CDATA_SECT_OPEN;
352
1.23k
}
xmltok.c:normal_scanCdataSection
Line
Count
Source
337
1.24k
                         const char **nextTokPtr) {
338
1.24k
  static const char CDATA_LSQB[]
339
1.24k
      = {ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, ASCII_LSQB};
340
1.24k
  int i;
341
1.24k
  UNUSED_P(enc);
342
  /* CDATA[ */
343
1.24k
  REQUIRE_CHARS(enc, ptr, end, 6);
344
8.54k
  for (i = 0; i < 6; i++, ptr += MINBPC(enc)) {
345
7.33k
    if (! CHAR_MATCHES(enc, ptr, CDATA_LSQB[i])) {
346
22
      *nextTokPtr = ptr;
347
22
      return XML_TOK_INVALID;
348
22
    }
349
7.33k
  }
350
1.21k
  *nextTokPtr = ptr;
351
1.21k
  return XML_TOK_CDATA_SECT_OPEN;
352
1.23k
}
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
1.16M
                        const char **nextTokPtr) {
357
1.16M
  if (ptr >= end)
358
116
    return XML_TOK_NONE;
359
1.16M
  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
1.16M
  switch (BYTE_TYPE(enc, ptr)) {
369
164k
  case BT_RSQB:
370
164k
    ptr += MINBPC(enc);
371
164k
    REQUIRE_CHAR(enc, ptr, end);
372
164k
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
373
92.2k
      break;
374
72.6k
    ptr += MINBPC(enc);
375
72.6k
    REQUIRE_CHAR(enc, ptr, end);
376
72.6k
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
377
71.5k
      ptr -= MINBPC(enc);
378
71.5k
      break;
379
71.5k
    }
380
1.11k
    *nextTokPtr = ptr + MINBPC(enc);
381
1.11k
    return XML_TOK_CDATA_SECT_CLOSE;
382
430k
  case BT_CR:
383
430k
    ptr += MINBPC(enc);
384
430k
    REQUIRE_CHAR(enc, ptr, end);
385
430k
    if (BYTE_TYPE(enc, ptr) == BT_LF)
386
96.7k
      ptr += MINBPC(enc);
387
430k
    *nextTokPtr = ptr;
388
430k
    return XML_TOK_DATA_NEWLINE;
389
310k
  case BT_LF:
390
310k
    *nextTokPtr = ptr + MINBPC(enc);
391
310k
    return XML_TOK_DATA_NEWLINE;
392
310k
    INVALID_CASES(ptr, nextTokPtr)
393
231k
  default:
394
231k
    ptr += MINBPC(enc);
395
231k
    break;
396
1.16M
  }
397
9.47M
  while (HAS_CHAR(enc, ptr, end)) {
398
9.47M
    switch (BYTE_TYPE(enc, ptr)) {
399
0
#  define LEAD_CASE(n)                                                         \
400
177k
  case BT_LEAD##n:                                                             \
401
177k
    if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) {                       \
402
11
      *nextTokPtr = ptr;                                                       \
403
11
      return XML_TOK_DATA_CHARS;                                               \
404
11
    }                                                                          \
405
177k
    ptr += n;                                                                  \
406
177k
    break;
407
69.4k
      LEAD_CASE(2)
408
91.0k
      LEAD_CASE(3)
409
17.5k
      LEAD_CASE(4)
410
0
#  undef LEAD_CASE
411
3
    case BT_NONXML:
412
4
    case BT_MALFORM:
413
9
    case BT_TRAIL:
414
172k
    case BT_CR:
415
274k
    case BT_LF:
416
419k
    case BT_RSQB:
417
419k
      *nextTokPtr = ptr;
418
419k
      return XML_TOK_DATA_CHARS;
419
8.87M
    default:
420
8.87M
      ptr += MINBPC(enc);
421
8.87M
      break;
422
9.47M
    }
423
9.47M
  }
424
37
  *nextTokPtr = ptr;
425
37
  return XML_TOK_DATA_CHARS;
426
419k
}
xmltok.c:normal_cdataSectionTok
Line
Count
Source
356
1.16M
                        const char **nextTokPtr) {
357
1.16M
  if (ptr >= end)
358
116
    return XML_TOK_NONE;
359
1.16M
  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
1.16M
  switch (BYTE_TYPE(enc, ptr)) {
369
164k
  case BT_RSQB:
370
164k
    ptr += MINBPC(enc);
371
164k
    REQUIRE_CHAR(enc, ptr, end);
372
164k
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
373
92.2k
      break;
374
72.6k
    ptr += MINBPC(enc);
375
72.6k
    REQUIRE_CHAR(enc, ptr, end);
376
72.6k
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
377
71.5k
      ptr -= MINBPC(enc);
378
71.5k
      break;
379
71.5k
    }
380
1.11k
    *nextTokPtr = ptr + MINBPC(enc);
381
1.11k
    return XML_TOK_CDATA_SECT_CLOSE;
382
430k
  case BT_CR:
383
430k
    ptr += MINBPC(enc);
384
430k
    REQUIRE_CHAR(enc, ptr, end);
385
430k
    if (BYTE_TYPE(enc, ptr) == BT_LF)
386
96.7k
      ptr += MINBPC(enc);
387
430k
    *nextTokPtr = ptr;
388
430k
    return XML_TOK_DATA_NEWLINE;
389
310k
  case BT_LF:
390
310k
    *nextTokPtr = ptr + MINBPC(enc);
391
310k
    return XML_TOK_DATA_NEWLINE;
392
310k
    INVALID_CASES(ptr, nextTokPtr)
393
231k
  default:
394
231k
    ptr += MINBPC(enc);
395
231k
    break;
396
1.16M
  }
397
9.47M
  while (HAS_CHAR(enc, ptr, end)) {
398
9.47M
    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
69.4k
      LEAD_CASE(2)
408
91.0k
      LEAD_CASE(3)
409
17.5k
      LEAD_CASE(4)
410
0
#  undef LEAD_CASE
411
3
    case BT_NONXML:
412
4
    case BT_MALFORM:
413
9
    case BT_TRAIL:
414
172k
    case BT_CR:
415
274k
    case BT_LF:
416
419k
    case BT_RSQB:
417
419k
      *nextTokPtr = ptr;
418
419k
      return XML_TOK_DATA_CHARS;
419
8.87M
    default:
420
8.87M
      ptr += MINBPC(enc);
421
8.87M
      break;
422
9.47M
    }
423
9.47M
  }
424
37
  *nextTokPtr = ptr;
425
37
  return XML_TOK_DATA_CHARS;
426
419k
}
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
25.2k
                   const char **nextTokPtr) {
433
25.2k
  REQUIRE_CHAR(enc, ptr, end);
434
25.2k
  switch (BYTE_TYPE(enc, ptr)) {
435
28.2k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
436
4
  default:
437
4
    *nextTokPtr = ptr;
438
4
    return XML_TOK_INVALID;
439
25.2k
  }
440
293k
  while (HAS_CHAR(enc, ptr, end)) {
441
293k
    switch (BYTE_TYPE(enc, ptr)) {
442
854k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
443
322
    case BT_S:
444
667
    case BT_CR:
445
1.23k
    case BT_LF:
446
4.51k
      for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
447
4.51k
        switch (BYTE_TYPE(enc, ptr)) {
448
2.08k
        case BT_S:
449
2.91k
        case BT_CR:
450
3.30k
        case BT_LF:
451
3.30k
          break;
452
1.20k
        case BT_GT:
453
1.20k
          *nextTokPtr = ptr + MINBPC(enc);
454
1.20k
          return XML_TOK_END_TAG;
455
2
        default:
456
2
          *nextTokPtr = ptr;
457
2
          return XML_TOK_INVALID;
458
4.51k
        }
459
4.51k
      }
460
26
      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
23.8k
    case BT_GT:
469
23.8k
      *nextTokPtr = ptr + MINBPC(enc);
470
23.8k
      return XML_TOK_END_TAG;
471
11
    default:
472
11
      *nextTokPtr = ptr;
473
11
      return XML_TOK_INVALID;
474
293k
    }
475
293k
  }
476
66
  return XML_TOK_PARTIAL;
477
25.2k
}
xmltok.c:normal_scanEndTag
Line
Count
Source
432
25.2k
                   const char **nextTokPtr) {
433
25.2k
  REQUIRE_CHAR(enc, ptr, end);
434
25.2k
  switch (BYTE_TYPE(enc, ptr)) {
435
28.2k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
436
4
  default:
437
4
    *nextTokPtr = ptr;
438
4
    return XML_TOK_INVALID;
439
25.2k
  }
440
293k
  while (HAS_CHAR(enc, ptr, end)) {
441
293k
    switch (BYTE_TYPE(enc, ptr)) {
442
854k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
443
322
    case BT_S:
444
667
    case BT_CR:
445
1.23k
    case BT_LF:
446
4.51k
      for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
447
4.51k
        switch (BYTE_TYPE(enc, ptr)) {
448
2.08k
        case BT_S:
449
2.91k
        case BT_CR:
450
3.30k
        case BT_LF:
451
3.30k
          break;
452
1.20k
        case BT_GT:
453
1.20k
          *nextTokPtr = ptr + MINBPC(enc);
454
1.20k
          return XML_TOK_END_TAG;
455
2
        default:
456
2
          *nextTokPtr = ptr;
457
2
          return XML_TOK_INVALID;
458
4.51k
        }
459
4.51k
      }
460
26
      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
23.8k
    case BT_GT:
469
23.8k
      *nextTokPtr = ptr + MINBPC(enc);
470
23.8k
      return XML_TOK_END_TAG;
471
11
    default:
472
11
      *nextTokPtr = ptr;
473
11
      return XML_TOK_INVALID;
474
293k
    }
475
293k
  }
476
66
  return XML_TOK_PARTIAL;
477
25.2k
}
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
140k
                       const char **nextTokPtr) {
484
140k
  if (HAS_CHAR(enc, ptr, end)) {
485
140k
    switch (BYTE_TYPE(enc, ptr)) {
486
40.8k
    case BT_DIGIT:
487
140k
    case BT_HEX:
488
140k
      break;
489
3
    default:
490
3
      *nextTokPtr = ptr;
491
3
      return XML_TOK_INVALID;
492
140k
    }
493
528k
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
494
528k
      switch (BYTE_TYPE(enc, ptr)) {
495
199k
      case BT_DIGIT:
496
388k
      case BT_HEX:
497
388k
        break;
498
140k
      case BT_SEMI:
499
140k
        *nextTokPtr = ptr + MINBPC(enc);
500
140k
        return XML_TOK_CHAR_REF;
501
2
      default:
502
2
        *nextTokPtr = ptr;
503
2
        return XML_TOK_INVALID;
504
528k
      }
505
528k
    }
506
140k
  }
507
12
  return XML_TOK_PARTIAL;
508
140k
}
xmltok.c:normal_scanHexCharRef
Line
Count
Source
483
140k
                       const char **nextTokPtr) {
484
140k
  if (HAS_CHAR(enc, ptr, end)) {
485
140k
    switch (BYTE_TYPE(enc, ptr)) {
486
40.8k
    case BT_DIGIT:
487
140k
    case BT_HEX:
488
140k
      break;
489
3
    default:
490
3
      *nextTokPtr = ptr;
491
3
      return XML_TOK_INVALID;
492
140k
    }
493
528k
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
494
528k
      switch (BYTE_TYPE(enc, ptr)) {
495
199k
      case BT_DIGIT:
496
388k
      case BT_HEX:
497
388k
        break;
498
140k
      case BT_SEMI:
499
140k
        *nextTokPtr = ptr + MINBPC(enc);
500
140k
        return XML_TOK_CHAR_REF;
501
2
      default:
502
2
        *nextTokPtr = ptr;
503
2
        return XML_TOK_INVALID;
504
528k
      }
505
528k
    }
506
140k
  }
507
12
  return XML_TOK_PARTIAL;
508
140k
}
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
142k
                    const char **nextTokPtr) {
515
142k
  if (HAS_CHAR(enc, ptr, end)) {
516
142k
    if (CHAR_MATCHES(enc, ptr, ASCII_x))
517
140k
      return PREFIX(scanHexCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
518
2.61k
    switch (BYTE_TYPE(enc, ptr)) {
519
2.61k
    case BT_DIGIT:
520
2.61k
      break;
521
7
    default:
522
7
      *nextTokPtr = ptr;
523
7
      return XML_TOK_INVALID;
524
2.61k
    }
525
6.54k
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
526
6.54k
      switch (BYTE_TYPE(enc, ptr)) {
527
3.94k
      case BT_DIGIT:
528
3.94k
        break;
529
2.60k
      case BT_SEMI:
530
2.60k
        *nextTokPtr = ptr + MINBPC(enc);
531
2.60k
        return XML_TOK_CHAR_REF;
532
1
      default:
533
1
        *nextTokPtr = ptr;
534
1
        return XML_TOK_INVALID;
535
6.54k
      }
536
6.54k
    }
537
2.61k
  }
538
11
  return XML_TOK_PARTIAL;
539
142k
}
xmltok.c:normal_scanCharRef
Line
Count
Source
514
142k
                    const char **nextTokPtr) {
515
142k
  if (HAS_CHAR(enc, ptr, end)) {
516
142k
    if (CHAR_MATCHES(enc, ptr, ASCII_x))
517
140k
      return PREFIX(scanHexCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
518
2.61k
    switch (BYTE_TYPE(enc, ptr)) {
519
2.61k
    case BT_DIGIT:
520
2.61k
      break;
521
7
    default:
522
7
      *nextTokPtr = ptr;
523
7
      return XML_TOK_INVALID;
524
2.61k
    }
525
6.54k
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
526
6.54k
      switch (BYTE_TYPE(enc, ptr)) {
527
3.94k
      case BT_DIGIT:
528
3.94k
        break;
529
2.60k
      case BT_SEMI:
530
2.60k
        *nextTokPtr = ptr + MINBPC(enc);
531
2.60k
        return XML_TOK_CHAR_REF;
532
1
      default:
533
1
        *nextTokPtr = ptr;
534
1
        return XML_TOK_INVALID;
535
6.54k
      }
536
6.54k
    }
537
2.61k
  }
538
11
  return XML_TOK_PARTIAL;
539
142k
}
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
339k
                const char **nextTokPtr) {
546
339k
  REQUIRE_CHAR(enc, ptr, end);
547
339k
  switch (BYTE_TYPE(enc, ptr)) {
548
120k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
549
142k
  case BT_NUM:
550
142k
    return PREFIX(scanCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
551
3
  default:
552
3
    *nextTokPtr = ptr;
553
3
    return XML_TOK_INVALID;
554
339k
  }
555
1.05M
  while (HAS_CHAR(enc, ptr, end)) {
556
1.05M
    switch (BYTE_TYPE(enc, ptr)) {
557
3.21M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
558
196k
    case BT_SEMI:
559
196k
      *nextTokPtr = ptr + MINBPC(enc);
560
196k
      return XML_TOK_ENTITY_REF;
561
8
    default:
562
8
      *nextTokPtr = ptr;
563
8
      return XML_TOK_INVALID;
564
1.05M
    }
565
1.05M
  }
566
47
  return XML_TOK_PARTIAL;
567
196k
}
xmltok.c:normal_scanRef
Line
Count
Source
545
339k
                const char **nextTokPtr) {
546
339k
  REQUIRE_CHAR(enc, ptr, end);
547
339k
  switch (BYTE_TYPE(enc, ptr)) {
548
120k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
549
142k
  case BT_NUM:
550
142k
    return PREFIX(scanCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
551
3
  default:
552
3
    *nextTokPtr = ptr;
553
3
    return XML_TOK_INVALID;
554
339k
  }
555
1.05M
  while (HAS_CHAR(enc, ptr, end)) {
556
1.05M
    switch (BYTE_TYPE(enc, ptr)) {
557
3.21M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
558
196k
    case BT_SEMI:
559
196k
      *nextTokPtr = ptr + MINBPC(enc);
560
196k
      return XML_TOK_ENTITY_REF;
561
8
    default:
562
8
      *nextTokPtr = ptr;
563
8
      return XML_TOK_INVALID;
564
1.05M
    }
565
1.05M
  }
566
47
  return XML_TOK_PARTIAL;
567
196k
}
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
122k
                 const char **nextTokPtr) {
574
#  ifdef XML_NS
575
  int hadColon = 0;
576
#  endif
577
1.48M
  while (HAS_CHAR(enc, ptr, end)) {
578
1.48M
    switch (BYTE_TYPE(enc, ptr)) {
579
1.01M
      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
806
    case BT_S:
598
8.79k
    case BT_CR:
599
9.80k
    case BT_LF:
600
20.4k
      for (;;) {
601
20.4k
        int t;
602
603
20.4k
        ptr += MINBPC(enc);
604
20.4k
        REQUIRE_CHAR(enc, ptr, end);
605
20.4k
        t = BYTE_TYPE(enc, ptr);
606
20.4k
        if (t == BT_EQUALS)
607
9.77k
          break;
608
10.6k
        switch (t) {
609
1.48k
        case BT_S:
610
2.68k
        case BT_LF:
611
10.6k
        case BT_CR:
612
10.6k
          break;
613
3
        default:
614
3
          *nextTokPtr = ptr;
615
3
          return XML_TOK_INVALID;
616
10.6k
        }
617
10.6k
      }
618
      /* fall through */
619
1.07M
    case BT_EQUALS: {
620
1.07M
      int open;
621
#  ifdef XML_NS
622
      hadColon = 0;
623
#  endif
624
1.11M
      for (;;) {
625
1.11M
        ptr += MINBPC(enc);
626
1.11M
        REQUIRE_CHAR(enc, ptr, end);
627
1.11M
        open = BYTE_TYPE(enc, ptr);
628
1.11M
        if (open == BT_QUOT || open == BT_APOS)
629
1.07M
          break;
630
37.0k
        switch (open) {
631
8.08k
        case BT_S:
632
15.9k
        case BT_LF:
633
37.0k
        case BT_CR:
634
37.0k
          break;
635
3
        default:
636
3
          *nextTokPtr = ptr;
637
3
          return XML_TOK_INVALID;
638
37.0k
        }
639
37.0k
      }
640
1.07M
      ptr += MINBPC(enc);
641
      /* in attribute value */
642
13.4M
      for (;;) {
643
13.4M
        int t;
644
13.4M
        REQUIRE_CHAR(enc, ptr, end);
645
13.4M
        t = BYTE_TYPE(enc, ptr);
646
13.4M
        if (t == open)
647
1.07M
          break;
648
12.3M
        switch (t) {
649
290k
          INVALID_CASES(ptr, nextTokPtr)
650
84.1k
        case BT_AMP: {
651
84.1k
          int tok = PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, &ptr);
652
84.1k
          if (tok <= 0) {
653
25
            if (tok == XML_TOK_INVALID)
654
11
              *nextTokPtr = ptr;
655
25
            return tok;
656
25
          }
657
84.1k
          break;
658
84.1k
        }
659
84.1k
        case BT_LT:
660
3
          *nextTokPtr = ptr;
661
3
          return XML_TOK_INVALID;
662
12.1M
        default:
663
12.1M
          ptr += MINBPC(enc);
664
12.1M
          break;
665
12.3M
        }
666
12.3M
      }
667
1.07M
      ptr += MINBPC(enc);
668
1.07M
      REQUIRE_CHAR(enc, ptr, end);
669
1.07M
      switch (BYTE_TYPE(enc, ptr)) {
670
587k
      case BT_S:
671
1.02M
      case BT_CR:
672
1.06M
      case BT_LF:
673
1.06M
        break;
674
12.7k
      case BT_SOL:
675
12.7k
        goto sol;
676
3.49k
      case BT_GT:
677
3.49k
        goto gt;
678
3
      default:
679
3
        *nextTokPtr = ptr;
680
3
        return XML_TOK_INVALID;
681
1.07M
      }
682
      /* ptr points to closing quote */
683
1.16M
      for (;;) {
684
1.16M
        ptr += MINBPC(enc);
685
1.16M
        REQUIRE_CHAR(enc, ptr, end);
686
1.16M
        switch (BYTE_TYPE(enc, ptr)) {
687
953k
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
688
79.0k
        case BT_S:
689
94.8k
        case BT_CR:
690
106k
        case BT_LF:
691
106k
          continue;
692
329
        case BT_GT:
693
3.82k
        gt:
694
3.82k
          *nextTokPtr = ptr + MINBPC(enc);
695
3.82k
          return XML_TOK_START_TAG_WITH_ATTS;
696
105k
        case BT_SOL:
697
118k
        sol:
698
118k
          ptr += MINBPC(enc);
699
118k
          REQUIRE_CHAR(enc, ptr, end);
700
118k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
701
5
            *nextTokPtr = ptr;
702
5
            return XML_TOK_INVALID;
703
5
          }
704
118k
          *nextTokPtr = ptr + MINBPC(enc);
705
118k
          return XML_TOK_EMPTY_ELEMENT_WITH_ATTS;
706
1
        default:
707
1
          *nextTokPtr = ptr;
708
1
          return XML_TOK_INVALID;
709
1.16M
        }
710
957k
        break;
711
1.16M
      }
712
957k
      break;
713
1.06M
    }
714
957k
    default:
715
4
      *nextTokPtr = ptr;
716
4
      return XML_TOK_INVALID;
717
1.48M
    }
718
1.48M
  }
719
40
  return XML_TOK_PARTIAL;
720
122k
}
xmltok.c:normal_scanAtts
Line
Count
Source
573
122k
                 const char **nextTokPtr) {
574
#  ifdef XML_NS
575
  int hadColon = 0;
576
#  endif
577
1.48M
  while (HAS_CHAR(enc, ptr, end)) {
578
1.48M
    switch (BYTE_TYPE(enc, ptr)) {
579
1.01M
      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
806
    case BT_S:
598
8.79k
    case BT_CR:
599
9.80k
    case BT_LF:
600
20.4k
      for (;;) {
601
20.4k
        int t;
602
603
20.4k
        ptr += MINBPC(enc);
604
20.4k
        REQUIRE_CHAR(enc, ptr, end);
605
20.4k
        t = BYTE_TYPE(enc, ptr);
606
20.4k
        if (t == BT_EQUALS)
607
9.77k
          break;
608
10.6k
        switch (t) {
609
1.48k
        case BT_S:
610
2.68k
        case BT_LF:
611
10.6k
        case BT_CR:
612
10.6k
          break;
613
3
        default:
614
3
          *nextTokPtr = ptr;
615
3
          return XML_TOK_INVALID;
616
10.6k
        }
617
10.6k
      }
618
      /* fall through */
619
1.07M
    case BT_EQUALS: {
620
1.07M
      int open;
621
#  ifdef XML_NS
622
      hadColon = 0;
623
#  endif
624
1.11M
      for (;;) {
625
1.11M
        ptr += MINBPC(enc);
626
1.11M
        REQUIRE_CHAR(enc, ptr, end);
627
1.11M
        open = BYTE_TYPE(enc, ptr);
628
1.11M
        if (open == BT_QUOT || open == BT_APOS)
629
1.07M
          break;
630
37.0k
        switch (open) {
631
8.08k
        case BT_S:
632
15.9k
        case BT_LF:
633
37.0k
        case BT_CR:
634
37.0k
          break;
635
3
        default:
636
3
          *nextTokPtr = ptr;
637
3
          return XML_TOK_INVALID;
638
37.0k
        }
639
37.0k
      }
640
1.07M
      ptr += MINBPC(enc);
641
      /* in attribute value */
642
13.4M
      for (;;) {
643
13.4M
        int t;
644
13.4M
        REQUIRE_CHAR(enc, ptr, end);
645
13.4M
        t = BYTE_TYPE(enc, ptr);
646
13.4M
        if (t == open)
647
1.07M
          break;
648
12.3M
        switch (t) {
649
290k
          INVALID_CASES(ptr, nextTokPtr)
650
84.1k
        case BT_AMP: {
651
84.1k
          int tok = PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, &ptr);
652
84.1k
          if (tok <= 0) {
653
25
            if (tok == XML_TOK_INVALID)
654
11
              *nextTokPtr = ptr;
655
25
            return tok;
656
25
          }
657
84.1k
          break;
658
84.1k
        }
659
84.1k
        case BT_LT:
660
3
          *nextTokPtr = ptr;
661
3
          return XML_TOK_INVALID;
662
12.1M
        default:
663
12.1M
          ptr += MINBPC(enc);
664
12.1M
          break;
665
12.3M
        }
666
12.3M
      }
667
1.07M
      ptr += MINBPC(enc);
668
1.07M
      REQUIRE_CHAR(enc, ptr, end);
669
1.07M
      switch (BYTE_TYPE(enc, ptr)) {
670
587k
      case BT_S:
671
1.02M
      case BT_CR:
672
1.06M
      case BT_LF:
673
1.06M
        break;
674
12.7k
      case BT_SOL:
675
12.7k
        goto sol;
676
3.49k
      case BT_GT:
677
3.49k
        goto gt;
678
3
      default:
679
3
        *nextTokPtr = ptr;
680
3
        return XML_TOK_INVALID;
681
1.07M
      }
682
      /* ptr points to closing quote */
683
1.16M
      for (;;) {
684
1.16M
        ptr += MINBPC(enc);
685
1.16M
        REQUIRE_CHAR(enc, ptr, end);
686
1.16M
        switch (BYTE_TYPE(enc, ptr)) {
687
953k
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
688
79.0k
        case BT_S:
689
94.8k
        case BT_CR:
690
106k
        case BT_LF:
691
106k
          continue;
692
329
        case BT_GT:
693
3.82k
        gt:
694
3.82k
          *nextTokPtr = ptr + MINBPC(enc);
695
3.82k
          return XML_TOK_START_TAG_WITH_ATTS;
696
105k
        case BT_SOL:
697
118k
        sol:
698
118k
          ptr += MINBPC(enc);
699
118k
          REQUIRE_CHAR(enc, ptr, end);
700
118k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
701
5
            *nextTokPtr = ptr;
702
5
            return XML_TOK_INVALID;
703
5
          }
704
118k
          *nextTokPtr = ptr + MINBPC(enc);
705
118k
          return XML_TOK_EMPTY_ELEMENT_WITH_ATTS;
706
1
        default:
707
1
          *nextTokPtr = ptr;
708
1
          return XML_TOK_INVALID;
709
1.16M
        }
710
957k
        break;
711
1.16M
      }
712
957k
      break;
713
1.06M
    }
714
957k
    default:
715
4
      *nextTokPtr = ptr;
716
4
      return XML_TOK_INVALID;
717
1.48M
    }
718
1.48M
  }
719
40
  return XML_TOK_PARTIAL;
720
122k
}
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
511k
               const char **nextTokPtr) {
727
#  ifdef XML_NS
728
  int hadColon;
729
#  endif
730
511k
  REQUIRE_CHAR(enc, ptr, end);
731
511k
  switch (BYTE_TYPE(enc, ptr)) {
732
442k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
733
11.4k
  case BT_EXCL:
734
11.4k
    ptr += MINBPC(enc);
735
11.4k
    REQUIRE_CHAR(enc, ptr, end);
736
11.4k
    switch (BYTE_TYPE(enc, ptr)) {
737
10.1k
    case BT_MINUS:
738
10.1k
      return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
739
1.24k
    case BT_LSQB:
740
1.24k
      return PREFIX(scanCdataSection)(enc, ptr + MINBPC(enc), end, nextTokPtr);
741
11.4k
    }
742
2
    *nextTokPtr = ptr;
743
2
    return XML_TOK_INVALID;
744
12.4k
  case BT_QUEST:
745
12.4k
    return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
746
25.2k
  case BT_SOL:
747
25.2k
    return PREFIX(scanEndTag)(enc, ptr + MINBPC(enc), end, nextTokPtr);
748
9
  default:
749
9
    *nextTokPtr = ptr;
750
9
    return XML_TOK_INVALID;
751
511k
  }
752
#  ifdef XML_NS
753
  hadColon = 0;
754
#  endif
755
  /* we have a start-tag */
756
5.75M
  while (HAS_CHAR(enc, ptr, end)) {
757
5.75M
    switch (BYTE_TYPE(enc, ptr)) {
758
20.9M
      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
117k
    case BT_S:
777
121k
    case BT_CR:
778
125k
    case BT_LF: {
779
125k
      ptr += MINBPC(enc);
780
141k
      while (HAS_CHAR(enc, ptr, end)) {
781
141k
        switch (BYTE_TYPE(enc, ptr)) {
782
17.4k
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
783
603
        case BT_GT:
784
603
          goto gt;
785
2.25k
        case BT_SOL:
786
2.25k
          goto sol;
787
1.48k
        case BT_S:
788
15.4k
        case BT_CR:
789
16.3k
        case BT_LF:
790
16.3k
          ptr += MINBPC(enc);
791
16.3k
          continue;
792
5
        default:
793
5
          *nextTokPtr = ptr;
794
5
          return XML_TOK_INVALID;
795
141k
        }
796
122k
        return PREFIX(scanAtts)(enc, ptr, end, nextTokPtr);
797
141k
      }
798
22
      return XML_TOK_PARTIAL;
799
125k
    }
800
312k
    case BT_GT:
801
313k
    gt:
802
313k
      *nextTokPtr = ptr + MINBPC(enc);
803
313k
      return XML_TOK_START_TAG_NO_ATTS;
804
24.7k
    case BT_SOL:
805
26.9k
    sol:
806
26.9k
      ptr += MINBPC(enc);
807
26.9k
      REQUIRE_CHAR(enc, ptr, end);
808
26.9k
      if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
809
5
        *nextTokPtr = ptr;
810
5
        return XML_TOK_INVALID;
811
5
      }
812
26.9k
      *nextTokPtr = ptr + MINBPC(enc);
813
26.9k
      return XML_TOK_EMPTY_ELEMENT_NO_ATTS;
814
9
    default:
815
9
      *nextTokPtr = ptr;
816
9
      return XML_TOK_INVALID;
817
5.75M
    }
818
5.75M
  }
819
68
  return XML_TOK_PARTIAL;
820
462k
}
xmltok.c:normal_scanLt
Line
Count
Source
726
511k
               const char **nextTokPtr) {
727
#  ifdef XML_NS
728
  int hadColon;
729
#  endif
730
511k
  REQUIRE_CHAR(enc, ptr, end);
731
511k
  switch (BYTE_TYPE(enc, ptr)) {
732
442k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
733
11.4k
  case BT_EXCL:
734
11.4k
    ptr += MINBPC(enc);
735
11.4k
    REQUIRE_CHAR(enc, ptr, end);
736
11.4k
    switch (BYTE_TYPE(enc, ptr)) {
737
10.1k
    case BT_MINUS:
738
10.1k
      return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
739
1.24k
    case BT_LSQB:
740
1.24k
      return PREFIX(scanCdataSection)(enc, ptr + MINBPC(enc), end, nextTokPtr);
741
11.4k
    }
742
2
    *nextTokPtr = ptr;
743
2
    return XML_TOK_INVALID;
744
12.4k
  case BT_QUEST:
745
12.4k
    return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
746
25.2k
  case BT_SOL:
747
25.2k
    return PREFIX(scanEndTag)(enc, ptr + MINBPC(enc), end, nextTokPtr);
748
9
  default:
749
9
    *nextTokPtr = ptr;
750
9
    return XML_TOK_INVALID;
751
511k
  }
752
#  ifdef XML_NS
753
  hadColon = 0;
754
#  endif
755
  /* we have a start-tag */
756
5.75M
  while (HAS_CHAR(enc, ptr, end)) {
757
5.75M
    switch (BYTE_TYPE(enc, ptr)) {
758
20.9M
      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
117k
    case BT_S:
777
121k
    case BT_CR:
778
125k
    case BT_LF: {
779
125k
      ptr += MINBPC(enc);
780
141k
      while (HAS_CHAR(enc, ptr, end)) {
781
141k
        switch (BYTE_TYPE(enc, ptr)) {
782
17.4k
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
783
603
        case BT_GT:
784
603
          goto gt;
785
2.25k
        case BT_SOL:
786
2.25k
          goto sol;
787
1.48k
        case BT_S:
788
15.4k
        case BT_CR:
789
16.3k
        case BT_LF:
790
16.3k
          ptr += MINBPC(enc);
791
16.3k
          continue;
792
5
        default:
793
5
          *nextTokPtr = ptr;
794
5
          return XML_TOK_INVALID;
795
141k
        }
796
122k
        return PREFIX(scanAtts)(enc, ptr, end, nextTokPtr);
797
141k
      }
798
22
      return XML_TOK_PARTIAL;
799
125k
    }
800
312k
    case BT_GT:
801
313k
    gt:
802
313k
      *nextTokPtr = ptr + MINBPC(enc);
803
313k
      return XML_TOK_START_TAG_NO_ATTS;
804
24.7k
    case BT_SOL:
805
26.9k
    sol:
806
26.9k
      ptr += MINBPC(enc);
807
26.9k
      REQUIRE_CHAR(enc, ptr, end);
808
26.9k
      if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
809
5
        *nextTokPtr = ptr;
810
5
        return XML_TOK_INVALID;
811
5
      }
812
26.9k
      *nextTokPtr = ptr + MINBPC(enc);
813
26.9k
      return XML_TOK_EMPTY_ELEMENT_NO_ATTS;
814
9
    default:
815
9
      *nextTokPtr = ptr;
816
9
      return XML_TOK_INVALID;
817
5.75M
    }
818
5.75M
  }
819
68
  return XML_TOK_PARTIAL;
820
462k
}
Unexecuted instantiation: xmltok.c:little2_scanLt
Unexecuted instantiation: xmltok.c:big2_scanLt
821
822
static int PTRCALL
823
PREFIX(contentTok)(const ENCODING *enc, const char *ptr, const char *end,
824
2.64M
                   const char **nextTokPtr) {
825
2.64M
  if (ptr >= end)
826
2.10k
    return XML_TOK_NONE;
827
2.64M
  if (MINBPC(enc) > 1) {
828
0
    size_t n = end - ptr;
829
0
    if (n & (MINBPC(enc) - 1)) {
830
0
      n &= ~(MINBPC(enc) - 1);
831
0
      if (n == 0)
832
0
        return XML_TOK_PARTIAL;
833
0
      end = ptr + n;
834
0
    }
835
0
  }
836
2.64M
  switch (BYTE_TYPE(enc, ptr)) {
837
511k
  case BT_LT:
838
511k
    return PREFIX(scanLt)(enc, ptr + MINBPC(enc), end, nextTokPtr);
839
24.3k
  case BT_AMP:
840
24.3k
    return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
841
1.00M
  case BT_CR:
842
1.00M
    ptr += MINBPC(enc);
843
1.00M
    if (! HAS_CHAR(enc, ptr, end))
844
12
      return XML_TOK_TRAILING_CR;
845
1.00M
    if (BYTE_TYPE(enc, ptr) == BT_LF)
846
245k
      ptr += MINBPC(enc);
847
1.00M
    *nextTokPtr = ptr;
848
1.00M
    return XML_TOK_DATA_NEWLINE;
849
722k
  case BT_LF:
850
722k
    *nextTokPtr = ptr + MINBPC(enc);
851
722k
    return XML_TOK_DATA_NEWLINE;
852
27.1k
  case BT_RSQB:
853
27.1k
    ptr += MINBPC(enc);
854
27.1k
    if (! HAS_CHAR(enc, ptr, end))
855
4
      return XML_TOK_TRAILING_RSQB;
856
27.1k
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
857
16.4k
      break;
858
10.7k
    ptr += MINBPC(enc);
859
10.7k
    if (! HAS_CHAR(enc, ptr, end))
860
2
      return XML_TOK_TRAILING_RSQB;
861
10.7k
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
862
10.7k
      ptr -= MINBPC(enc);
863
10.7k
      break;
864
10.7k
    }
865
1
    *nextTokPtr = ptr;
866
1
    return XML_TOK_INVALID;
867
44.0k
    INVALID_CASES(ptr, nextTokPtr)
868
331k
  default:
869
331k
    ptr += MINBPC(enc);
870
331k
    break;
871
2.64M
  }
872
9.92M
  while (HAS_CHAR(enc, ptr, end)) {
873
9.92M
    switch (BYTE_TYPE(enc, ptr)) {
874
0
#  define LEAD_CASE(n)                                                         \
875
126k
  case BT_LEAD##n:                                                             \
876
126k
    if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) {                       \
877
17
      *nextTokPtr = ptr;                                                       \
878
17
      return XML_TOK_DATA_CHARS;                                               \
879
17
    }                                                                          \
880
126k
    ptr += n;                                                                  \
881
126k
    break;
882
70.8k
      LEAD_CASE(2)
883
27.1k
      LEAD_CASE(3)
884
28.5k
      LEAD_CASE(4)
885
0
#  undef LEAD_CASE
886
180k
    case BT_RSQB:
887
180k
      if (HAS_CHARS(enc, ptr, end, 2)) {
888
180k
        if (! CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_RSQB)) {
889
57.7k
          ptr += MINBPC(enc);
890
57.7k
          break;
891
57.7k
        }
892
123k
        if (HAS_CHARS(enc, ptr, end, 3)) {
893
123k
          if (! CHAR_MATCHES(enc, ptr + 2 * MINBPC(enc), ASCII_GT)) {
894
123k
            ptr += MINBPC(enc);
895
123k
            break;
896
123k
          }
897
3
          *nextTokPtr = ptr + 2 * MINBPC(enc);
898
3
          return XML_TOK_INVALID;
899
123k
        }
900
123k
      }
901
      /* fall through */
902
14.7k
    case BT_AMP:
903
80.6k
    case BT_LT:
904
80.6k
    case BT_NONXML:
905
80.6k
    case BT_MALFORM:
906
80.6k
    case BT_TRAIL:
907
283k
    case BT_CR:
908
380k
    case BT_LF:
909
380k
      *nextTokPtr = ptr;
910
380k
      return XML_TOK_DATA_CHARS;
911
9.23M
    default:
912
9.23M
      ptr += MINBPC(enc);
913
9.23M
      break;
914
9.92M
    }
915
9.92M
  }
916
986
  *nextTokPtr = ptr;
917
986
  return XML_TOK_DATA_CHARS;
918
381k
}
xmltok.c:normal_contentTok
Line
Count
Source
824
2.64M
                   const char **nextTokPtr) {
825
2.64M
  if (ptr >= end)
826
2.10k
    return XML_TOK_NONE;
827
2.64M
  if (MINBPC(enc) > 1) {
828
0
    size_t n = end - ptr;
829
0
    if (n & (MINBPC(enc) - 1)) {
830
0
      n &= ~(MINBPC(enc) - 1);
831
0
      if (n == 0)
832
0
        return XML_TOK_PARTIAL;
833
0
      end = ptr + n;
834
0
    }
835
0
  }
836
2.64M
  switch (BYTE_TYPE(enc, ptr)) {
837
511k
  case BT_LT:
838
511k
    return PREFIX(scanLt)(enc, ptr + MINBPC(enc), end, nextTokPtr);
839
24.3k
  case BT_AMP:
840
24.3k
    return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
841
1.00M
  case BT_CR:
842
1.00M
    ptr += MINBPC(enc);
843
1.00M
    if (! HAS_CHAR(enc, ptr, end))
844
12
      return XML_TOK_TRAILING_CR;
845
1.00M
    if (BYTE_TYPE(enc, ptr) == BT_LF)
846
245k
      ptr += MINBPC(enc);
847
1.00M
    *nextTokPtr = ptr;
848
1.00M
    return XML_TOK_DATA_NEWLINE;
849
722k
  case BT_LF:
850
722k
    *nextTokPtr = ptr + MINBPC(enc);
851
722k
    return XML_TOK_DATA_NEWLINE;
852
27.1k
  case BT_RSQB:
853
27.1k
    ptr += MINBPC(enc);
854
27.1k
    if (! HAS_CHAR(enc, ptr, end))
855
4
      return XML_TOK_TRAILING_RSQB;
856
27.1k
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
857
16.4k
      break;
858
10.7k
    ptr += MINBPC(enc);
859
10.7k
    if (! HAS_CHAR(enc, ptr, end))
860
2
      return XML_TOK_TRAILING_RSQB;
861
10.7k
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
862
10.7k
      ptr -= MINBPC(enc);
863
10.7k
      break;
864
10.7k
    }
865
1
    *nextTokPtr = ptr;
866
1
    return XML_TOK_INVALID;
867
44.0k
    INVALID_CASES(ptr, nextTokPtr)
868
331k
  default:
869
331k
    ptr += MINBPC(enc);
870
331k
    break;
871
2.64M
  }
872
9.92M
  while (HAS_CHAR(enc, ptr, end)) {
873
9.92M
    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
70.8k
      LEAD_CASE(2)
883
27.1k
      LEAD_CASE(3)
884
28.5k
      LEAD_CASE(4)
885
0
#  undef LEAD_CASE
886
180k
    case BT_RSQB:
887
180k
      if (HAS_CHARS(enc, ptr, end, 2)) {
888
180k
        if (! CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_RSQB)) {
889
57.7k
          ptr += MINBPC(enc);
890
57.7k
          break;
891
57.7k
        }
892
123k
        if (HAS_CHARS(enc, ptr, end, 3)) {
893
123k
          if (! CHAR_MATCHES(enc, ptr + 2 * MINBPC(enc), ASCII_GT)) {
894
123k
            ptr += MINBPC(enc);
895
123k
            break;
896
123k
          }
897
3
          *nextTokPtr = ptr + 2 * MINBPC(enc);
898
3
          return XML_TOK_INVALID;
899
123k
        }
900
123k
      }
901
      /* fall through */
902
14.7k
    case BT_AMP:
903
80.6k
    case BT_LT:
904
80.6k
    case BT_NONXML:
905
80.6k
    case BT_MALFORM:
906
80.6k
    case BT_TRAIL:
907
283k
    case BT_CR:
908
380k
    case BT_LF:
909
380k
      *nextTokPtr = ptr;
910
380k
      return XML_TOK_DATA_CHARS;
911
9.23M
    default:
912
9.23M
      ptr += MINBPC(enc);
913
9.23M
      break;
914
9.92M
    }
915
9.92M
  }
916
986
  *nextTokPtr = ptr;
917
986
  return XML_TOK_DATA_CHARS;
918
381k
}
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
5.24k
                    const char **nextTokPtr) {
925
5.24k
  REQUIRE_CHAR(enc, ptr, end);
926
5.22k
  switch (BYTE_TYPE(enc, ptr)) {
927
5.45k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
928
688
  case BT_S:
929
1.19k
  case BT_LF:
930
1.61k
  case BT_CR:
931
1.61k
  case BT_PERCNT:
932
1.61k
    *nextTokPtr = ptr;
933
1.61k
    return XML_TOK_PERCENT;
934
2
  default:
935
2
    *nextTokPtr = ptr;
936
2
    return XML_TOK_INVALID;
937
5.22k
  }
938
288k
  while (HAS_CHAR(enc, ptr, end)) {
939
288k
    switch (BYTE_TYPE(enc, ptr)) {
940
1.04M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
941
3.52k
    case BT_SEMI:
942
3.52k
      *nextTokPtr = ptr + MINBPC(enc);
943
3.52k
      return XML_TOK_PARAM_ENTITY_REF;
944
9
    default:
945
9
      *nextTokPtr = ptr;
946
9
      return XML_TOK_INVALID;
947
288k
    }
948
288k
  }
949
44
  return XML_TOK_PARTIAL;
950
3.59k
}
xmltok.c:normal_scanPercent
Line
Count
Source
924
5.24k
                    const char **nextTokPtr) {
925
5.24k
  REQUIRE_CHAR(enc, ptr, end);
926
5.22k
  switch (BYTE_TYPE(enc, ptr)) {
927
5.45k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
928
688
  case BT_S:
929
1.19k
  case BT_LF:
930
1.61k
  case BT_CR:
931
1.61k
  case BT_PERCNT:
932
1.61k
    *nextTokPtr = ptr;
933
1.61k
    return XML_TOK_PERCENT;
934
2
  default:
935
2
    *nextTokPtr = ptr;
936
2
    return XML_TOK_INVALID;
937
5.22k
  }
938
288k
  while (HAS_CHAR(enc, ptr, end)) {
939
288k
    switch (BYTE_TYPE(enc, ptr)) {
940
1.04M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
941
3.52k
    case BT_SEMI:
942
3.52k
      *nextTokPtr = ptr + MINBPC(enc);
943
3.52k
      return XML_TOK_PARAM_ENTITY_REF;
944
9
    default:
945
9
      *nextTokPtr = ptr;
946
9
      return XML_TOK_INVALID;
947
288k
    }
948
288k
  }
949
44
  return XML_TOK_PARTIAL;
950
3.59k
}
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
30.8k
                      const char **nextTokPtr) {
955
30.8k
  REQUIRE_CHAR(enc, ptr, end);
956
30.8k
  switch (BYTE_TYPE(enc, ptr)) {
957
30.6k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
958
3
  default:
959
3
    *nextTokPtr = ptr;
960
3
    return XML_TOK_INVALID;
961
30.8k
  }
962
717k
  while (HAS_CHAR(enc, ptr, end)) {
963
717k
    switch (BYTE_TYPE(enc, ptr)) {
964
2.30M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
965
25.1k
    case BT_CR:
966
27.2k
    case BT_LF:
967
27.4k
    case BT_S:
968
27.6k
    case BT_RPAR:
969
30.4k
    case BT_GT:
970
30.4k
    case BT_PERCNT:
971
30.6k
    case BT_VERBAR:
972
30.6k
      *nextTokPtr = ptr;
973
30.6k
      return XML_TOK_POUND_NAME;
974
8
    default:
975
8
      *nextTokPtr = ptr;
976
8
      return XML_TOK_INVALID;
977
717k
    }
978
717k
  }
979
150
  return -XML_TOK_POUND_NAME;
980
30.8k
}
xmltok.c:normal_scanPoundName
Line
Count
Source
954
30.8k
                      const char **nextTokPtr) {
955
30.8k
  REQUIRE_CHAR(enc, ptr, end);
956
30.8k
  switch (BYTE_TYPE(enc, ptr)) {
957
30.6k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
958
3
  default:
959
3
    *nextTokPtr = ptr;
960
3
    return XML_TOK_INVALID;
961
30.8k
  }
962
717k
  while (HAS_CHAR(enc, ptr, end)) {
963
717k
    switch (BYTE_TYPE(enc, ptr)) {
964
2.30M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
965
25.1k
    case BT_CR:
966
27.2k
    case BT_LF:
967
27.4k
    case BT_S:
968
27.6k
    case BT_RPAR:
969
30.4k
    case BT_GT:
970
30.4k
    case BT_PERCNT:
971
30.6k
    case BT_VERBAR:
972
30.6k
      *nextTokPtr = ptr;
973
30.6k
      return XML_TOK_POUND_NAME;
974
8
    default:
975
8
      *nextTokPtr = ptr;
976
8
      return XML_TOK_INVALID;
977
717k
    }
978
717k
  }
979
150
  return -XML_TOK_POUND_NAME;
980
30.8k
}
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
49.4k
                const char **nextTokPtr) {
985
5.95M
  while (HAS_CHAR(enc, ptr, end)) {
986
5.95M
    int t = BYTE_TYPE(enc, ptr);
987
5.95M
    switch (t) {
988
160k
      INVALID_CASES(ptr, nextTokPtr)
989
7.47k
    case BT_QUOT:
990
52.8k
    case BT_APOS:
991
52.8k
      ptr += MINBPC(enc);
992
52.8k
      if (t != open)
993
3.46k
        break;
994
49.3k
      if (! HAS_CHAR(enc, ptr, end))
995
405
        return -XML_TOK_LITERAL;
996
48.9k
      *nextTokPtr = ptr;
997
48.9k
      switch (BYTE_TYPE(enc, ptr)) {
998
5.27k
      case BT_S:
999
8.45k
      case BT_CR:
1000
20.8k
      case BT_LF:
1001
48.6k
      case BT_GT:
1002
48.6k
      case BT_PERCNT:
1003
48.9k
      case BT_LSQB:
1004
48.9k
        return XML_TOK_LITERAL;
1005
7
      default:
1006
7
        return XML_TOK_INVALID;
1007
48.9k
      }
1008
5.82M
    default:
1009
5.82M
      ptr += MINBPC(enc);
1010
5.82M
      break;
1011
5.95M
    }
1012
5.95M
  }
1013
62
  return XML_TOK_PARTIAL;
1014
49.4k
}
xmltok.c:normal_scanLit
Line
Count
Source
984
49.4k
                const char **nextTokPtr) {
985
5.95M
  while (HAS_CHAR(enc, ptr, end)) {
986
5.95M
    int t = BYTE_TYPE(enc, ptr);
987
5.95M
    switch (t) {
988
160k
      INVALID_CASES(ptr, nextTokPtr)
989
7.47k
    case BT_QUOT:
990
52.8k
    case BT_APOS:
991
52.8k
      ptr += MINBPC(enc);
992
52.8k
      if (t != open)
993
3.46k
        break;
994
49.3k
      if (! HAS_CHAR(enc, ptr, end))
995
405
        return -XML_TOK_LITERAL;
996
48.9k
      *nextTokPtr = ptr;
997
48.9k
      switch (BYTE_TYPE(enc, ptr)) {
998
5.27k
      case BT_S:
999
8.45k
      case BT_CR:
1000
20.8k
      case BT_LF:
1001
48.6k
      case BT_GT:
1002
48.6k
      case BT_PERCNT:
1003
48.9k
      case BT_LSQB:
1004
48.9k
        return XML_TOK_LITERAL;
1005
7
      default:
1006
7
        return XML_TOK_INVALID;
1007
48.9k
      }
1008
5.82M
    default:
1009
5.82M
      ptr += MINBPC(enc);
1010
5.82M
      break;
1011
5.95M
    }
1012
5.95M
  }
1013
62
  return XML_TOK_PARTIAL;
1014
49.4k
}
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
1.98M
                  const char **nextTokPtr) {
1019
1.98M
  int tok;
1020
1.98M
  if (ptr >= end)
1021
4.42k
    return XML_TOK_NONE;
1022
1.98M
  if (MINBPC(enc) > 1) {
1023
157
    size_t n = end - ptr;
1024
157
    if (n & (MINBPC(enc) - 1)) {
1025
22
      n &= ~(MINBPC(enc) - 1);
1026
22
      if (n == 0)
1027
4
        return XML_TOK_PARTIAL;
1028
18
      end = ptr + n;
1029
18
    }
1030
157
  }
1031
1.98M
  switch (BYTE_TYPE(enc, ptr)) {
1032
5.11k
  case BT_QUOT:
1033
5.11k
    return PREFIX(scanLit)(BT_QUOT, enc, ptr + MINBPC(enc), end, nextTokPtr);
1034
44.3k
  case BT_APOS:
1035
44.3k
    return PREFIX(scanLit)(BT_APOS, enc, ptr + MINBPC(enc), end, nextTokPtr);
1036
77.4k
  case BT_LT: {
1037
77.4k
    ptr += MINBPC(enc);
1038
77.4k
    REQUIRE_CHAR(enc, ptr, end);
1039
77.3k
    switch (BYTE_TYPE(enc, ptr)) {
1040
66.9k
    case BT_EXCL:
1041
66.9k
      return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1042
7.29k
    case BT_QUEST:
1043
7.29k
      return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1044
2.46k
    case BT_NMSTRT:
1045
3.11k
    case BT_HEX:
1046
3.11k
    case BT_NONASCII:
1047
3.12k
    case BT_LEAD2:
1048
3.15k
    case BT_LEAD3:
1049
3.16k
    case BT_LEAD4:
1050
3.16k
      *nextTokPtr = ptr - MINBPC(enc);
1051
3.16k
      return XML_TOK_INSTANCE_START;
1052
77.3k
    }
1053
10
    *nextTokPtr = ptr;
1054
10
    return XML_TOK_INVALID;
1055
77.3k
  }
1056
143k
  case BT_CR:
1057
143k
    if (ptr + MINBPC(enc) == end) {
1058
303
      *nextTokPtr = end;
1059
      /* indicate that this might be part of a CR/LF pair */
1060
303
      return -XML_TOK_PROLOG_S;
1061
303
    }
1062
    /* fall through */
1063
230k
  case BT_S:
1064
299k
  case BT_LF:
1065
336k
    for (;;) {
1066
336k
      ptr += MINBPC(enc);
1067
336k
      if (! HAS_CHAR(enc, ptr, end))
1068
158
        break;
1069
335k
      switch (BYTE_TYPE(enc, ptr)) {
1070
8.48k
      case BT_S:
1071
20.7k
      case BT_LF:
1072
20.7k
        break;
1073
15.7k
      case BT_CR:
1074
        /* don't split CR/LF pair */
1075
15.7k
        if (ptr + MINBPC(enc) != end)
1076
15.6k
          break;
1077
        /* fall through */
1078
299k
      default:
1079
299k
        *nextTokPtr = ptr;
1080
299k
        return XML_TOK_PROLOG_S;
1081
335k
      }
1082
335k
    }
1083
158
    *nextTokPtr = ptr;
1084
158
    return XML_TOK_PROLOG_S;
1085
5.24k
  case BT_PERCNT:
1086
5.24k
    return PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1087
2.99k
  case BT_COMMA:
1088
2.99k
    *nextTokPtr = ptr + MINBPC(enc);
1089
2.99k
    return XML_TOK_COMMA;
1090
1.77k
  case BT_LSQB:
1091
1.77k
    *nextTokPtr = ptr + MINBPC(enc);
1092
1.77k
    return XML_TOK_OPEN_BRACKET;
1093
759
  case BT_RSQB:
1094
759
    ptr += MINBPC(enc);
1095
759
    if (! HAS_CHAR(enc, ptr, end))
1096
3
      return -XML_TOK_CLOSE_BRACKET;
1097
756
    if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) {
1098
16
      REQUIRE_CHARS(enc, ptr, end, 2);
1099
14
      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
14
    }
1104
753
    *nextTokPtr = ptr;
1105
753
    return XML_TOK_CLOSE_BRACKET;
1106
1.20M
  case BT_LPAR:
1107
1.20M
    *nextTokPtr = ptr + MINBPC(enc);
1108
1.20M
    return XML_TOK_OPEN_PAREN;
1109
49.2k
  case BT_RPAR:
1110
49.2k
    ptr += MINBPC(enc);
1111
49.2k
    if (! HAS_CHAR(enc, ptr, end))
1112
69
      return -XML_TOK_CLOSE_PAREN;
1113
49.1k
    switch (BYTE_TYPE(enc, ptr)) {
1114
3.79k
    case BT_AST:
1115
3.79k
      *nextTokPtr = ptr + MINBPC(enc);
1116
3.79k
      return XML_TOK_CLOSE_PAREN_ASTERISK;
1117
2.28k
    case BT_QUEST:
1118
2.28k
      *nextTokPtr = ptr + MINBPC(enc);
1119
2.28k
      return XML_TOK_CLOSE_PAREN_QUESTION;
1120
2.94k
    case BT_PLUS:
1121
2.94k
      *nextTokPtr = ptr + MINBPC(enc);
1122
2.94k
      return XML_TOK_CLOSE_PAREN_PLUS;
1123
2.47k
    case BT_CR:
1124
2.82k
    case BT_LF:
1125
27.6k
    case BT_S:
1126
28.5k
    case BT_GT:
1127
29.3k
    case BT_COMMA:
1128
32.7k
    case BT_VERBAR:
1129
40.1k
    case BT_RPAR:
1130
40.1k
      *nextTokPtr = ptr;
1131
40.1k
      return XML_TOK_CLOSE_PAREN;
1132
49.1k
    }
1133
3
    *nextTokPtr = ptr;
1134
3
    return XML_TOK_INVALID;
1135
11.9k
  case BT_VERBAR:
1136
11.9k
    *nextTokPtr = ptr + MINBPC(enc);
1137
11.9k
    return XML_TOK_OR;
1138
62.2k
  case BT_GT:
1139
62.2k
    *nextTokPtr = ptr + MINBPC(enc);
1140
62.2k
    return XML_TOK_DECL_CLOSE;
1141
30.8k
  case BT_NUM:
1142
30.8k
    return PREFIX(scanPoundName)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1143
0
#  define LEAD_CASE(n)                                                         \
1144
5.00k
  case BT_LEAD##n:                                                             \
1145
5.00k
    if (end - ptr < n)                                                         \
1146
46
      return XML_TOK_PARTIAL_CHAR;                                             \
1147
4.96k
    if (IS_INVALID_CHAR(enc, ptr, n)) {                                        \
1148
44
      *nextTokPtr = ptr;                                                       \
1149
44
      return XML_TOK_INVALID;                                                  \
1150
44
    }                                                                          \
1151
4.96k
    if (IS_NMSTRT_CHAR(enc, ptr, n)) {                                         \
1152
4.47k
      ptr += n;                                                                \
1153
4.47k
      tok = XML_TOK_NAME;                                                      \
1154
4.47k
      break;                                                                   \
1155
4.47k
    }                                                                          \
1156
4.91k
    if (IS_NAME_CHAR(enc, ptr, n)) {                                           \
1157
409
      ptr += n;                                                                \
1158
409
      tok = XML_TOK_NMTOKEN;                                                   \
1159
409
      break;                                                                   \
1160
409
    }                                                                          \
1161
446
    *nextTokPtr = ptr;                                                         \
1162
37
    return XML_TOK_INVALID;
1163
3.99k
    LEAD_CASE(2)
1164
11.2k
    LEAD_CASE(3)
1165
136
    LEAD_CASE(4)
1166
0
#  undef LEAD_CASE
1167
108k
  case BT_NMSTRT:
1168
183k
  case BT_HEX:
1169
183k
    tok = XML_TOK_NAME;
1170
183k
    ptr += MINBPC(enc);
1171
183k
    break;
1172
317
  case BT_DIGIT:
1173
382
  case BT_NAME:
1174
926
  case BT_MINUS:
1175
#  ifdef XML_NS
1176
  case BT_COLON:
1177
#  endif
1178
926
    tok = XML_TOK_NMTOKEN;
1179
926
    ptr += MINBPC(enc);
1180
926
    break;
1181
118
  case BT_NONASCII:
1182
118
    if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {
1183
91
      ptr += MINBPC(enc);
1184
91
      tok = XML_TOK_NAME;
1185
91
      break;
1186
91
    }
1187
27
    if (IS_NAME_CHAR_MINBPC(enc, ptr)) {
1188
10
      ptr += MINBPC(enc);
1189
10
      tok = XML_TOK_NMTOKEN;
1190
10
      break;
1191
10
    }
1192
    /* fall through */
1193
50
  default:
1194
50
    *nextTokPtr = ptr;
1195
50
    return XML_TOK_INVALID;
1196
1.98M
  }
1197
15.3M
  while (HAS_CHAR(enc, ptr, end)) {
1198
15.3M
    switch (BYTE_TYPE(enc, ptr)) {
1199
43.1M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1200
24.5k
    case BT_GT:
1201
57.2k
    case BT_RPAR:
1202
57.4k
    case BT_COMMA:
1203
62.6k
    case BT_VERBAR:
1204
64.1k
    case BT_LSQB:
1205
64.1k
    case BT_PERCNT:
1206
99.4k
    case BT_S:
1207
161k
    case BT_CR:
1208
185k
    case BT_LF:
1209
185k
      *nextTokPtr = ptr;
1210
185k
      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
666
    case BT_PLUS:
1232
666
      if (tok == XML_TOK_NMTOKEN) {
1233
1
        *nextTokPtr = ptr;
1234
1
        return XML_TOK_INVALID;
1235
1
      }
1236
665
      *nextTokPtr = ptr + MINBPC(enc);
1237
665
      return XML_TOK_NAME_PLUS;
1238
1.80k
    case BT_AST:
1239
1.80k
      if (tok == XML_TOK_NMTOKEN) {
1240
0
        *nextTokPtr = ptr;
1241
0
        return XML_TOK_INVALID;
1242
0
      }
1243
1.80k
      *nextTokPtr = ptr + MINBPC(enc);
1244
1.80k
      return XML_TOK_NAME_ASTERISK;
1245
259
    case BT_QUEST:
1246
259
      if (tok == XML_TOK_NMTOKEN) {
1247
1
        *nextTokPtr = ptr;
1248
1
        return XML_TOK_INVALID;
1249
1
      }
1250
258
      *nextTokPtr = ptr + MINBPC(enc);
1251
258
      return XML_TOK_NAME_QUESTION;
1252
38
    default:
1253
38
      *nextTokPtr = ptr;
1254
38
      return XML_TOK_INVALID;
1255
15.3M
    }
1256
15.3M
  }
1257
494
  return -tok;
1258
189k
}
xmltok.c:normal_prologTok
Line
Count
Source
1018
1.98M
                  const char **nextTokPtr) {
1019
1.98M
  int tok;
1020
1.98M
  if (ptr >= end)
1021
4.42k
    return XML_TOK_NONE;
1022
1.98M
  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
1.98M
  switch (BYTE_TYPE(enc, ptr)) {
1032
5.11k
  case BT_QUOT:
1033
5.11k
    return PREFIX(scanLit)(BT_QUOT, enc, ptr + MINBPC(enc), end, nextTokPtr);
1034
44.3k
  case BT_APOS:
1035
44.3k
    return PREFIX(scanLit)(BT_APOS, enc, ptr + MINBPC(enc), end, nextTokPtr);
1036
77.4k
  case BT_LT: {
1037
77.4k
    ptr += MINBPC(enc);
1038
77.4k
    REQUIRE_CHAR(enc, ptr, end);
1039
77.3k
    switch (BYTE_TYPE(enc, ptr)) {
1040
66.9k
    case BT_EXCL:
1041
66.9k
      return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1042
7.29k
    case BT_QUEST:
1043
7.29k
      return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1044
2.46k
    case BT_NMSTRT:
1045
3.11k
    case BT_HEX:
1046
3.11k
    case BT_NONASCII:
1047
3.12k
    case BT_LEAD2:
1048
3.15k
    case BT_LEAD3:
1049
3.16k
    case BT_LEAD4:
1050
3.16k
      *nextTokPtr = ptr - MINBPC(enc);
1051
3.16k
      return XML_TOK_INSTANCE_START;
1052
77.3k
    }
1053
10
    *nextTokPtr = ptr;
1054
10
    return XML_TOK_INVALID;
1055
77.3k
  }
1056
143k
  case BT_CR:
1057
143k
    if (ptr + MINBPC(enc) == end) {
1058
303
      *nextTokPtr = end;
1059
      /* indicate that this might be part of a CR/LF pair */
1060
303
      return -XML_TOK_PROLOG_S;
1061
303
    }
1062
    /* fall through */
1063
230k
  case BT_S:
1064
299k
  case BT_LF:
1065
336k
    for (;;) {
1066
336k
      ptr += MINBPC(enc);
1067
336k
      if (! HAS_CHAR(enc, ptr, end))
1068
158
        break;
1069
335k
      switch (BYTE_TYPE(enc, ptr)) {
1070
8.48k
      case BT_S:
1071
20.7k
      case BT_LF:
1072
20.7k
        break;
1073
15.7k
      case BT_CR:
1074
        /* don't split CR/LF pair */
1075
15.7k
        if (ptr + MINBPC(enc) != end)
1076
15.6k
          break;
1077
        /* fall through */
1078
299k
      default:
1079
299k
        *nextTokPtr = ptr;
1080
299k
        return XML_TOK_PROLOG_S;
1081
335k
      }
1082
335k
    }
1083
158
    *nextTokPtr = ptr;
1084
158
    return XML_TOK_PROLOG_S;
1085
5.24k
  case BT_PERCNT:
1086
5.24k
    return PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1087
2.99k
  case BT_COMMA:
1088
2.99k
    *nextTokPtr = ptr + MINBPC(enc);
1089
2.99k
    return XML_TOK_COMMA;
1090
1.77k
  case BT_LSQB:
1091
1.77k
    *nextTokPtr = ptr + MINBPC(enc);
1092
1.77k
    return XML_TOK_OPEN_BRACKET;
1093
759
  case BT_RSQB:
1094
759
    ptr += MINBPC(enc);
1095
759
    if (! HAS_CHAR(enc, ptr, end))
1096
3
      return -XML_TOK_CLOSE_BRACKET;
1097
756
    if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) {
1098
16
      REQUIRE_CHARS(enc, ptr, end, 2);
1099
14
      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
14
    }
1104
753
    *nextTokPtr = ptr;
1105
753
    return XML_TOK_CLOSE_BRACKET;
1106
1.20M
  case BT_LPAR:
1107
1.20M
    *nextTokPtr = ptr + MINBPC(enc);
1108
1.20M
    return XML_TOK_OPEN_PAREN;
1109
49.2k
  case BT_RPAR:
1110
49.2k
    ptr += MINBPC(enc);
1111
49.2k
    if (! HAS_CHAR(enc, ptr, end))
1112
69
      return -XML_TOK_CLOSE_PAREN;
1113
49.1k
    switch (BYTE_TYPE(enc, ptr)) {
1114
3.79k
    case BT_AST:
1115
3.79k
      *nextTokPtr = ptr + MINBPC(enc);
1116
3.79k
      return XML_TOK_CLOSE_PAREN_ASTERISK;
1117
2.28k
    case BT_QUEST:
1118
2.28k
      *nextTokPtr = ptr + MINBPC(enc);
1119
2.28k
      return XML_TOK_CLOSE_PAREN_QUESTION;
1120
2.94k
    case BT_PLUS:
1121
2.94k
      *nextTokPtr = ptr + MINBPC(enc);
1122
2.94k
      return XML_TOK_CLOSE_PAREN_PLUS;
1123
2.47k
    case BT_CR:
1124
2.82k
    case BT_LF:
1125
27.6k
    case BT_S:
1126
28.5k
    case BT_GT:
1127
29.3k
    case BT_COMMA:
1128
32.7k
    case BT_VERBAR:
1129
40.1k
    case BT_RPAR:
1130
40.1k
      *nextTokPtr = ptr;
1131
40.1k
      return XML_TOK_CLOSE_PAREN;
1132
49.1k
    }
1133
3
    *nextTokPtr = ptr;
1134
3
    return XML_TOK_INVALID;
1135
11.9k
  case BT_VERBAR:
1136
11.9k
    *nextTokPtr = ptr + MINBPC(enc);
1137
11.9k
    return XML_TOK_OR;
1138
62.2k
  case BT_GT:
1139
62.2k
    *nextTokPtr = ptr + MINBPC(enc);
1140
62.2k
    return XML_TOK_DECL_CLOSE;
1141
30.8k
  case BT_NUM:
1142
30.8k
    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
3.99k
    LEAD_CASE(2)
1164
11.2k
    LEAD_CASE(3)
1165
80
    LEAD_CASE(4)
1166
0
#  undef LEAD_CASE
1167
108k
  case BT_NMSTRT:
1168
183k
  case BT_HEX:
1169
183k
    tok = XML_TOK_NAME;
1170
183k
    ptr += MINBPC(enc);
1171
183k
    break;
1172
317
  case BT_DIGIT:
1173
382
  case BT_NAME:
1174
926
  case BT_MINUS:
1175
#  ifdef XML_NS
1176
  case BT_COLON:
1177
#  endif
1178
926
    tok = XML_TOK_NMTOKEN;
1179
926
    ptr += MINBPC(enc);
1180
926
    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
24
  default:
1194
24
    *nextTokPtr = ptr;
1195
24
    return XML_TOK_INVALID;
1196
1.98M
  }
1197
15.2M
  while (HAS_CHAR(enc, ptr, end)) {
1198
15.2M
    switch (BYTE_TYPE(enc, ptr)) {
1199
42.9M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1200
24.5k
    case BT_GT:
1201
57.2k
    case BT_RPAR:
1202
57.4k
    case BT_COMMA:
1203
62.6k
    case BT_VERBAR:
1204
64.1k
    case BT_LSQB:
1205
64.1k
    case BT_PERCNT:
1206
99.4k
    case BT_S:
1207
161k
    case BT_CR:
1208
185k
    case BT_LF:
1209
185k
      *nextTokPtr = ptr;
1210
185k
      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
666
    case BT_PLUS:
1232
666
      if (tok == XML_TOK_NMTOKEN) {
1233
1
        *nextTokPtr = ptr;
1234
1
        return XML_TOK_INVALID;
1235
1
      }
1236
665
      *nextTokPtr = ptr + MINBPC(enc);
1237
665
      return XML_TOK_NAME_PLUS;
1238
1.80k
    case BT_AST:
1239
1.80k
      if (tok == XML_TOK_NMTOKEN) {
1240
0
        *nextTokPtr = ptr;
1241
0
        return XML_TOK_INVALID;
1242
0
      }
1243
1.80k
      *nextTokPtr = ptr + MINBPC(enc);
1244
1.80k
      return XML_TOK_NAME_ASTERISK;
1245
259
    case BT_QUEST:
1246
259
      if (tok == XML_TOK_NMTOKEN) {
1247
1
        *nextTokPtr = ptr;
1248
1
        return XML_TOK_INVALID;
1249
1
      }
1250
258
      *nextTokPtr = ptr + MINBPC(enc);
1251
258
      return XML_TOK_NAME_QUESTION;
1252
24
    default:
1253
24
      *nextTokPtr = ptr;
1254
24
      return XML_TOK_INVALID;
1255
15.2M
    }
1256
15.2M
  }
1257
458
  return -tok;
1258
189k
}
xmltok.c:little2_prologTok
Line
Count
Source
1018
79
                  const char **nextTokPtr) {
1019
79
  int tok;
1020
79
  if (ptr >= end)
1021
2
    return XML_TOK_NONE;
1022
77
  if (MINBPC(enc) > 1) {
1023
77
    size_t n = end - ptr;
1024
77
    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
77
  }
1031
75
  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
20
    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
60
  case BT_NONASCII:
1182
60
    if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {
1183
45
      ptr += MINBPC(enc);
1184
45
      tok = XML_TOK_NAME;
1185
45
      break;
1186
45
    }
1187
15
    if (IS_NAME_CHAR_MINBPC(enc, ptr)) {
1188
5
      ptr += MINBPC(enc);
1189
5
      tok = XML_TOK_NMTOKEN;
1190
5
      break;
1191
5
    }
1192
    /* fall through */
1193
14
  default:
1194
14
    *nextTokPtr = ptr;
1195
14
    return XML_TOK_INVALID;
1196
75
  }
1197
37.0k
  while (HAS_CHAR(enc, ptr, end)) {
1198
37.0k
    switch (BYTE_TYPE(enc, ptr)) {
1199
185k
      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
37.0k
    }
1256
37.0k
  }
1257
18
  return -tok;
1258
50
}
xmltok.c:big2_prologTok
Line
Count
Source
1018
82
                  const char **nextTokPtr) {
1019
82
  int tok;
1020
82
  if (ptr >= end)
1021
2
    return XML_TOK_NONE;
1022
80
  if (MINBPC(enc) > 1) {
1023
80
    size_t n = end - ptr;
1024
80
    if (n & (MINBPC(enc) - 1)) {
1025
10
      n &= ~(MINBPC(enc) - 1);
1026
10
      if (n == 0)
1027
2
        return XML_TOK_PARTIAL;
1028
8
      end = ptr + n;
1029
8
    }
1030
80
  }
1031
78
  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
36
    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
58
  case BT_NONASCII:
1182
58
    if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {
1183
46
      ptr += MINBPC(enc);
1184
46
      tok = XML_TOK_NAME;
1185
46
      break;
1186
46
    }
1187
12
    if (IS_NAME_CHAR_MINBPC(enc, ptr)) {
1188
5
      ptr += MINBPC(enc);
1189
5
      tok = XML_TOK_NMTOKEN;
1190
5
      break;
1191
5
    }
1192
    /* fall through */
1193
12
  default:
1194
12
    *nextTokPtr = ptr;
1195
12
    return XML_TOK_INVALID;
1196
78
  }
1197
411
  while (HAS_CHAR(enc, ptr, end)) {
1198
411
    switch (BYTE_TYPE(enc, ptr)) {
1199
1.92k
      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
6
    default:
1253
6
      *nextTokPtr = ptr;
1254
6
      return XML_TOK_INVALID;
1255
411
    }
1256
411
  }
1257
18
  return -tok;
1258
51
}
1259
1260
static int PTRCALL
1261
PREFIX(attributeValueTok)(const ENCODING *enc, const char *ptr, const char *end,
1262
2.12M
                          const char **nextTokPtr) {
1263
2.12M
  const char *start;
1264
2.12M
  if (ptr >= end)
1265
70.2k
    return XML_TOK_NONE;
1266
2.05M
  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.05M
  start = ptr;
1275
15.3M
  while (HAS_CHAR(enc, ptr, end)) {
1276
15.3M
    switch (BYTE_TYPE(enc, ptr)) {
1277
0
#  define LEAD_CASE(n)                                                         \
1278
211k
  case BT_LEAD##n:                                                             \
1279
211k
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1280
211k
    break;
1281
68.7k
      LEAD_CASE(2)
1282
67.7k
      LEAD_CASE(3)
1283
75.5k
      LEAD_CASE(4)
1284
0
#  undef LEAD_CASE
1285
312k
    case BT_AMP:
1286
312k
      if (ptr == start)
1287
231k
        return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1288
81.8k
      *nextTokPtr = ptr;
1289
81.8k
      return XML_TOK_DATA_CHARS;
1290
2
    case BT_LT:
1291
      /* this is for inside entity references */
1292
2
      *nextTokPtr = ptr;
1293
2
      return XML_TOK_INVALID;
1294
617k
    case BT_LF:
1295
617k
      if (ptr == start) {
1296
514k
        *nextTokPtr = ptr + MINBPC(enc);
1297
514k
        return XML_TOK_DATA_NEWLINE;
1298
514k
      }
1299
102k
      *nextTokPtr = ptr;
1300
102k
      return XML_TOK_DATA_CHARS;
1301
718k
    case BT_CR:
1302
718k
      if (ptr == start) {
1303
571k
        ptr += MINBPC(enc);
1304
571k
        if (! HAS_CHAR(enc, ptr, end))
1305
2.57k
          return XML_TOK_TRAILING_CR;
1306
568k
        if (BYTE_TYPE(enc, ptr) == BT_LF)
1307
230k
          ptr += MINBPC(enc);
1308
568k
        *nextTokPtr = ptr;
1309
568k
        return XML_TOK_DATA_NEWLINE;
1310
571k
      }
1311
147k
      *nextTokPtr = ptr;
1312
147k
      return XML_TOK_DATA_CHARS;
1313
354k
    case BT_S:
1314
354k
      if (ptr == start) {
1315
196k
        *nextTokPtr = ptr + MINBPC(enc);
1316
196k
        return XML_TOK_ATTRIBUTE_VALUE_S;
1317
196k
      }
1318
158k
      *nextTokPtr = ptr;
1319
158k
      return XML_TOK_DATA_CHARS;
1320
13.1M
    default:
1321
13.1M
      ptr += MINBPC(enc);
1322
13.1M
      break;
1323
15.3M
    }
1324
15.3M
  }
1325
57.0k
  *nextTokPtr = ptr;
1326
57.0k
  return XML_TOK_DATA_CHARS;
1327
2.05M
}
xmltok.c:normal_attributeValueTok
Line
Count
Source
1262
2.12M
                          const char **nextTokPtr) {
1263
2.12M
  const char *start;
1264
2.12M
  if (ptr >= end)
1265
70.2k
    return XML_TOK_NONE;
1266
2.05M
  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.05M
  start = ptr;
1275
15.3M
  while (HAS_CHAR(enc, ptr, end)) {
1276
15.3M
    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
68.7k
      LEAD_CASE(2)
1282
67.7k
      LEAD_CASE(3)
1283
75.5k
      LEAD_CASE(4)
1284
0
#  undef LEAD_CASE
1285
312k
    case BT_AMP:
1286
312k
      if (ptr == start)
1287
231k
        return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1288
81.8k
      *nextTokPtr = ptr;
1289
81.8k
      return XML_TOK_DATA_CHARS;
1290
2
    case BT_LT:
1291
      /* this is for inside entity references */
1292
2
      *nextTokPtr = ptr;
1293
2
      return XML_TOK_INVALID;
1294
617k
    case BT_LF:
1295
617k
      if (ptr == start) {
1296
514k
        *nextTokPtr = ptr + MINBPC(enc);
1297
514k
        return XML_TOK_DATA_NEWLINE;
1298
514k
      }
1299
102k
      *nextTokPtr = ptr;
1300
102k
      return XML_TOK_DATA_CHARS;
1301
718k
    case BT_CR:
1302
718k
      if (ptr == start) {
1303
571k
        ptr += MINBPC(enc);
1304
571k
        if (! HAS_CHAR(enc, ptr, end))
1305
2.57k
          return XML_TOK_TRAILING_CR;
1306
568k
        if (BYTE_TYPE(enc, ptr) == BT_LF)
1307
230k
          ptr += MINBPC(enc);
1308
568k
        *nextTokPtr = ptr;
1309
568k
        return XML_TOK_DATA_NEWLINE;
1310
571k
      }
1311
147k
      *nextTokPtr = ptr;
1312
147k
      return XML_TOK_DATA_CHARS;
1313
354k
    case BT_S:
1314
354k
      if (ptr == start) {
1315
196k
        *nextTokPtr = ptr + MINBPC(enc);
1316
196k
        return XML_TOK_ATTRIBUTE_VALUE_S;
1317
196k
      }
1318
158k
      *nextTokPtr = ptr;
1319
158k
      return XML_TOK_DATA_CHARS;
1320
13.1M
    default:
1321
13.1M
      ptr += MINBPC(enc);
1322
13.1M
      break;
1323
15.3M
    }
1324
15.3M
  }
1325
57.0k
  *nextTokPtr = ptr;
1326
57.0k
  return XML_TOK_DATA_CHARS;
1327
2.05M
}
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.48k
                   const char **badPtr) {
1451
2.48k
  ptr += MINBPC(enc);
1452
2.48k
  end -= MINBPC(enc);
1453
415k
  for (; HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
1454
415k
    switch (BYTE_TYPE(enc, ptr)) {
1455
162k
    case BT_DIGIT:
1456
252k
    case BT_HEX:
1457
253k
    case BT_MINUS:
1458
253k
    case BT_APOS:
1459
254k
    case BT_LPAR:
1460
284k
    case BT_RPAR:
1461
287k
    case BT_PLUS:
1462
290k
    case BT_COMMA:
1463
330k
    case BT_SOL:
1464
330k
    case BT_EQUALS:
1465
335k
    case BT_QUEST:
1466
338k
    case BT_CR:
1467
340k
    case BT_LF:
1468
341k
    case BT_SEMI:
1469
341k
    case BT_EXCL:
1470
342k
    case BT_AST:
1471
344k
    case BT_PERCNT:
1472
349k
    case BT_NUM:
1473
#  ifdef XML_NS
1474
    case BT_COLON:
1475
#  endif
1476
349k
      break;
1477
2.07k
    case BT_S:
1478
2.07k
      if (CHAR_MATCHES(enc, ptr, ASCII_TAB)) {
1479
1
        *badPtr = ptr;
1480
1
        return 0;
1481
1
      }
1482
2.07k
      break;
1483
3.14k
    case BT_NAME:
1484
61.0k
    case BT_NMSTRT:
1485
61.0k
      if (! (BYTE_TO_ASCII(enc, ptr) & ~0x7f))
1486
61.0k
        break;
1487
      /* fall through */
1488
3.21k
    default:
1489
3.21k
      switch (BYTE_TO_ASCII(enc, ptr)) {
1490
1.22k
      case 0x24: /* $ */
1491
3.20k
      case 0x40: /* @ */
1492
3.20k
        break;
1493
5
      default:
1494
5
        *badPtr = ptr;
1495
5
        return 0;
1496
3.21k
      }
1497
3.20k
      break;
1498
415k
    }
1499
415k
  }
1500
2.47k
  return 1;
1501
2.48k
}
xmltok.c:normal_isPublicId
Line
Count
Source
1450
2.48k
                   const char **badPtr) {
1451
2.48k
  ptr += MINBPC(enc);
1452
2.48k
  end -= MINBPC(enc);
1453
415k
  for (; HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
1454
415k
    switch (BYTE_TYPE(enc, ptr)) {
1455
162k
    case BT_DIGIT:
1456
252k
    case BT_HEX:
1457
253k
    case BT_MINUS:
1458
253k
    case BT_APOS:
1459
254k
    case BT_LPAR:
1460
284k
    case BT_RPAR:
1461
287k
    case BT_PLUS:
1462
290k
    case BT_COMMA:
1463
330k
    case BT_SOL:
1464
330k
    case BT_EQUALS:
1465
335k
    case BT_QUEST:
1466
338k
    case BT_CR:
1467
340k
    case BT_LF:
1468
341k
    case BT_SEMI:
1469
341k
    case BT_EXCL:
1470
342k
    case BT_AST:
1471
344k
    case BT_PERCNT:
1472
349k
    case BT_NUM:
1473
#  ifdef XML_NS
1474
    case BT_COLON:
1475
#  endif
1476
349k
      break;
1477
2.07k
    case BT_S:
1478
2.07k
      if (CHAR_MATCHES(enc, ptr, ASCII_TAB)) {
1479
1
        *badPtr = ptr;
1480
1
        return 0;
1481
1
      }
1482
2.07k
      break;
1483
3.14k
    case BT_NAME:
1484
61.0k
    case BT_NMSTRT:
1485
61.0k
      if (! (BYTE_TO_ASCII(enc, ptr) & ~0x7f))
1486
61.0k
        break;
1487
      /* fall through */
1488
3.21k
    default:
1489
3.21k
      switch (BYTE_TO_ASCII(enc, ptr)) {
1490
1.22k
      case 0x24: /* $ */
1491
3.20k
      case 0x40: /* @ */
1492
3.20k
        break;
1493
5
      default:
1494
5
        *badPtr = ptr;
1495
5
        return 0;
1496
3.21k
      }
1497
3.20k
      break;
1498
415k
    }
1499
415k
  }
1500
2.47k
  return 1;
1501
2.48k
}
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
462k
                ATTRIBUTE *atts) {
1511
462k
  enum { other, inName, inValue } state = inName;
1512
462k
  int nAtts = 0;
1513
462k
  int open = 0; /* defined when state == inValue;
1514
                   initialization just to shut up compilers */
1515
1516
30.1M
  for (ptr += MINBPC(enc);; ptr += MINBPC(enc)) {
1517
30.1M
    switch (BYTE_TYPE(enc, ptr)) {
1518
0
#  define START_NAME                                                           \
1519
17.2M
    if (state == other) {                                                      \
1520
2.02M
      if (nAtts < attsMax) {                                                   \
1521
1.07M
        atts[nAtts].name = ptr;                                                \
1522
1.07M
        atts[nAtts].normalized = 1;                                            \
1523
1.07M
      }                                                                        \
1524
2.02M
      state = inName;                                                          \
1525
2.02M
    }
1526
0
#  define LEAD_CASE(n)                                                         \
1527
209k
  case BT_LEAD##n: /* NOTE: The encoding has already been validated. */        \
1528
209k
    START_NAME ptr += (n - MINBPC(enc));                                       \
1529
209k
    break;
1530
73.7k
      LEAD_CASE(2)
1531
89.3k
      LEAD_CASE(3)
1532
46.2k
      LEAD_CASE(4)
1533
0
#  undef LEAD_CASE
1534
0
    case BT_NONASCII:
1535
15.2M
    case BT_NMSTRT:
1536
17.0M
    case BT_HEX:
1537
17.0M
      START_NAME
1538
17.0M
      break;
1539
0
#  undef START_NAME
1540
550k
    case BT_QUOT:
1541
550k
      if (state != inValue) {
1542
248k
        if (nAtts < attsMax)
1543
190k
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1544
248k
        state = inValue;
1545
248k
        open = BT_QUOT;
1546
302k
      } else if (open == BT_QUOT) {
1547
248k
        state = other;
1548
248k
        if (nAtts < attsMax)
1549
190k
          atts[nAtts].valueEnd = ptr;
1550
248k
        nAtts++;
1551
248k
      }
1552
550k
      break;
1553
3.63M
    case BT_APOS:
1554
3.63M
      if (state != inValue) {
1555
1.77M
        if (nAtts < attsMax)
1556
888k
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1557
1.77M
        state = inValue;
1558
1.77M
        open = BT_APOS;
1559
1.86M
      } else if (open == BT_APOS) {
1560
1.77M
        state = other;
1561
1.77M
        if (nAtts < attsMax)
1562
888k
          atts[nAtts].valueEnd = ptr;
1563
1.77M
        nAtts++;
1564
1.77M
      }
1565
3.63M
      break;
1566
85.0k
    case BT_AMP:
1567
85.0k
      if (nAtts < attsMax)
1568
83.8k
        atts[nAtts].normalized = 0;
1569
85.0k
      break;
1570
1.59M
    case BT_S:
1571
1.59M
      if (state == inName)
1572
119k
        state = other;
1573
1.47M
      else if (state == inValue && nAtts < attsMax && atts[nAtts].normalized
1574
44.4k
               && (ptr == atts[nAtts].valuePtr
1575
10.6k
                   || BYTE_TO_ASCII(enc, ptr) != ASCII_SPACE
1576
6.19k
                   || BYTE_TO_ASCII(enc, ptr + MINBPC(enc)) == ASCII_SPACE
1577
5.57k
                   || BYTE_TYPE(enc, ptr + MINBPC(enc)) == open))
1578
39.2k
        atts[nAtts].normalized = 0;
1579
1.59M
      break;
1580
1.48M
    case BT_CR:
1581
2.28M
    case BT_LF:
1582
      /* This case ensures that the first attribute name is counted
1583
         Apart from that we could just change state on the quote. */
1584
2.28M
      if (state == inName)
1585
17.4k
        state = other;
1586
2.26M
      else if (state == inValue && nAtts < attsMax)
1587
1.21M
        atts[nAtts].normalized = 0;
1588
2.28M
      break;
1589
330k
    case BT_GT:
1590
483k
    case BT_SOL:
1591
483k
      if (state != inValue)
1592
462k
        return nAtts;
1593
21.2k
      break;
1594
4.24M
    default:
1595
4.24M
      break;
1596
30.1M
    }
1597
30.1M
  }
1598
  /* not reached */
1599
462k
}
xmltok.c:normal_getAtts
Line
Count
Source
1510
462k
                ATTRIBUTE *atts) {
1511
462k
  enum { other, inName, inValue } state = inName;
1512
462k
  int nAtts = 0;
1513
462k
  int open = 0; /* defined when state == inValue;
1514
                   initialization just to shut up compilers */
1515
1516
30.1M
  for (ptr += MINBPC(enc);; ptr += MINBPC(enc)) {
1517
30.1M
    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
73.7k
      LEAD_CASE(2)
1531
89.3k
      LEAD_CASE(3)
1532
46.2k
      LEAD_CASE(4)
1533
0
#  undef LEAD_CASE
1534
0
    case BT_NONASCII:
1535
15.2M
    case BT_NMSTRT:
1536
17.0M
    case BT_HEX:
1537
17.0M
      START_NAME
1538
17.0M
      break;
1539
0
#  undef START_NAME
1540
550k
    case BT_QUOT:
1541
550k
      if (state != inValue) {
1542
248k
        if (nAtts < attsMax)
1543
190k
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1544
248k
        state = inValue;
1545
248k
        open = BT_QUOT;
1546
302k
      } else if (open == BT_QUOT) {
1547
248k
        state = other;
1548
248k
        if (nAtts < attsMax)
1549
190k
          atts[nAtts].valueEnd = ptr;
1550
248k
        nAtts++;
1551
248k
      }
1552
550k
      break;
1553
3.63M
    case BT_APOS:
1554
3.63M
      if (state != inValue) {
1555
1.77M
        if (nAtts < attsMax)
1556
888k
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1557
1.77M
        state = inValue;
1558
1.77M
        open = BT_APOS;
1559
1.86M
      } else if (open == BT_APOS) {
1560
1.77M
        state = other;
1561
1.77M
        if (nAtts < attsMax)
1562
888k
          atts[nAtts].valueEnd = ptr;
1563
1.77M
        nAtts++;
1564
1.77M
      }
1565
3.63M
      break;
1566
85.0k
    case BT_AMP:
1567
85.0k
      if (nAtts < attsMax)
1568
83.8k
        atts[nAtts].normalized = 0;
1569
85.0k
      break;
1570
1.59M
    case BT_S:
1571
1.59M
      if (state == inName)
1572
119k
        state = other;
1573
1.47M
      else if (state == inValue && nAtts < attsMax && atts[nAtts].normalized
1574
44.4k
               && (ptr == atts[nAtts].valuePtr
1575
10.6k
                   || BYTE_TO_ASCII(enc, ptr) != ASCII_SPACE
1576
6.19k
                   || BYTE_TO_ASCII(enc, ptr + MINBPC(enc)) == ASCII_SPACE
1577
5.57k
                   || BYTE_TYPE(enc, ptr + MINBPC(enc)) == open))
1578
39.2k
        atts[nAtts].normalized = 0;
1579
1.59M
      break;
1580
1.48M
    case BT_CR:
1581
2.28M
    case BT_LF:
1582
      /* This case ensures that the first attribute name is counted
1583
         Apart from that we could just change state on the quote. */
1584
2.28M
      if (state == inName)
1585
17.4k
        state = other;
1586
2.26M
      else if (state == inValue && nAtts < attsMax)
1587
1.21M
        atts[nAtts].normalized = 0;
1588
2.28M
      break;
1589
330k
    case BT_GT:
1590
483k
    case BT_SOL:
1591
483k
      if (state != inValue)
1592
462k
        return nAtts;
1593
21.2k
      break;
1594
4.24M
    default:
1595
4.24M
      break;
1596
30.1M
    }
1597
30.1M
  }
1598
  /* not reached */
1599
462k
}
Unexecuted instantiation: xmltok.c:little2_getAtts
Unexecuted instantiation: xmltok.c:big2_getAtts
1600
1601
static int PTRFASTCALL
1602
76.1k
PREFIX(charRefNumber)(const ENCODING *enc, const char *ptr) {
1603
76.1k
  int result = 0;
1604
  /* skip &# */
1605
76.1k
  UNUSED_P(enc);
1606
76.1k
  ptr += 2 * MINBPC(enc);
1607
76.1k
  if (CHAR_MATCHES(enc, ptr, ASCII_x)) {
1608
352k
    for (ptr += MINBPC(enc); ! CHAR_MATCHES(enc, ptr, ASCII_SEMI);
1609
278k
         ptr += MINBPC(enc)) {
1610
278k
      int c = BYTE_TO_ASCII(enc, ptr);
1611
278k
      switch (c) {
1612
2.12k
      case ASCII_0:
1613
18.7k
      case ASCII_1:
1614
42.3k
      case ASCII_2:
1615
44.8k
      case ASCII_3:
1616
72.9k
      case ASCII_4:
1617
91.8k
      case ASCII_5:
1618
92.5k
      case ASCII_6:
1619
102k
      case ASCII_7:
1620
120k
      case ASCII_8:
1621
125k
      case ASCII_9:
1622
125k
        result <<= 4;
1623
125k
        result |= (c - ASCII_0);
1624
125k
        break;
1625
36.4k
      case ASCII_A:
1626
47.0k
      case ASCII_B:
1627
48.7k
      case ASCII_C:
1628
63.4k
      case ASCII_D:
1629
72.6k
      case ASCII_E:
1630
88.4k
      case ASCII_F:
1631
88.4k
        result <<= 4;
1632
88.4k
        result += 10 + (c - ASCII_A);
1633
88.4k
        break;
1634
734
      case ASCII_a:
1635
10.3k
      case ASCII_b:
1636
11.6k
      case ASCII_c:
1637
31.2k
      case ASCII_d:
1638
39.8k
      case ASCII_e:
1639
64.5k
      case ASCII_f:
1640
64.5k
        result <<= 4;
1641
64.5k
        result += 10 + (c - ASCII_a);
1642
64.5k
        break;
1643
278k
      }
1644
278k
      if (result >= 0x110000)
1645
10
        return -1;
1646
278k
    }
1647
73.8k
  } else {
1648
7.61k
    for (; ! CHAR_MATCHES(enc, ptr, ASCII_SEMI); ptr += MINBPC(enc)) {
1649
5.37k
      int c = BYTE_TO_ASCII(enc, ptr);
1650
5.37k
      result *= 10;
1651
5.37k
      result += (c - ASCII_0);
1652
5.37k
      if (result >= 0x110000)
1653
3
        return -1;
1654
5.37k
    }
1655
2.24k
  }
1656
76.1k
  return checkCharRefNumber(result);
1657
76.1k
}
xmltok.c:normal_charRefNumber
Line
Count
Source
1602
76.1k
PREFIX(charRefNumber)(const ENCODING *enc, const char *ptr) {
1603
76.1k
  int result = 0;
1604
  /* skip &# */
1605
76.1k
  UNUSED_P(enc);
1606
76.1k
  ptr += 2 * MINBPC(enc);
1607
76.1k
  if (CHAR_MATCHES(enc, ptr, ASCII_x)) {
1608
352k
    for (ptr += MINBPC(enc); ! CHAR_MATCHES(enc, ptr, ASCII_SEMI);
1609
278k
         ptr += MINBPC(enc)) {
1610
278k
      int c = BYTE_TO_ASCII(enc, ptr);
1611
278k
      switch (c) {
1612
2.12k
      case ASCII_0:
1613
18.7k
      case ASCII_1:
1614
42.3k
      case ASCII_2:
1615
44.8k
      case ASCII_3:
1616
72.9k
      case ASCII_4:
1617
91.8k
      case ASCII_5:
1618
92.5k
      case ASCII_6:
1619
102k
      case ASCII_7:
1620
120k
      case ASCII_8:
1621
125k
      case ASCII_9:
1622
125k
        result <<= 4;
1623
125k
        result |= (c - ASCII_0);
1624
125k
        break;
1625
36.4k
      case ASCII_A:
1626
47.0k
      case ASCII_B:
1627
48.7k
      case ASCII_C:
1628
63.4k
      case ASCII_D:
1629
72.6k
      case ASCII_E:
1630
88.4k
      case ASCII_F:
1631
88.4k
        result <<= 4;
1632
88.4k
        result += 10 + (c - ASCII_A);
1633
88.4k
        break;
1634
734
      case ASCII_a:
1635
10.3k
      case ASCII_b:
1636
11.6k
      case ASCII_c:
1637
31.2k
      case ASCII_d:
1638
39.8k
      case ASCII_e:
1639
64.5k
      case ASCII_f:
1640
64.5k
        result <<= 4;
1641
64.5k
        result += 10 + (c - ASCII_a);
1642
64.5k
        break;
1643
278k
      }
1644
278k
      if (result >= 0x110000)
1645
10
        return -1;
1646
278k
    }
1647
73.8k
  } else {
1648
7.61k
    for (; ! CHAR_MATCHES(enc, ptr, ASCII_SEMI); ptr += MINBPC(enc)) {
1649
5.37k
      int c = BYTE_TO_ASCII(enc, ptr);
1650
5.37k
      result *= 10;
1651
5.37k
      result += (c - ASCII_0);
1652
5.37k
      if (result >= 0x110000)
1653
3
        return -1;
1654
5.37k
    }
1655
2.24k
  }
1656
76.1k
  return checkCharRefNumber(result);
1657
76.1k
}
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
201k
                             const char *end) {
1662
201k
  UNUSED_P(enc);
1663
201k
  switch ((end - ptr) / MINBPC(enc)) {
1664
14.3k
  case 2:
1665
14.3k
    if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_t)) {
1666
4.35k
      switch (BYTE_TO_ASCII(enc, ptr)) {
1667
954
      case ASCII_l:
1668
954
        return ASCII_LT;
1669
66
      case ASCII_g:
1670
66
        return ASCII_GT;
1671
4.35k
      }
1672
4.35k
    }
1673
13.2k
    break;
1674
45.8k
  case 3:
1675
45.8k
    if (CHAR_MATCHES(enc, ptr, ASCII_a)) {
1676
32.3k
      ptr += MINBPC(enc);
1677
32.3k
      if (CHAR_MATCHES(enc, ptr, ASCII_m)) {
1678
31.1k
        ptr += MINBPC(enc);
1679
31.1k
        if (CHAR_MATCHES(enc, ptr, ASCII_p))
1680
30.7k
          return ASCII_AMP;
1681
31.1k
      }
1682
32.3k
    }
1683
15.0k
    break;
1684
29.0k
  case 4:
1685
29.0k
    switch (BYTE_TO_ASCII(enc, ptr)) {
1686
14.5k
    case ASCII_q:
1687
14.5k
      ptr += MINBPC(enc);
1688
14.5k
      if (CHAR_MATCHES(enc, ptr, ASCII_u)) {
1689
13.1k
        ptr += MINBPC(enc);
1690
13.1k
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1691
12.7k
          ptr += MINBPC(enc);
1692
12.7k
          if (CHAR_MATCHES(enc, ptr, ASCII_t))
1693
12.2k
            return ASCII_QUOT;
1694
12.7k
        }
1695
13.1k
      }
1696
2.31k
      break;
1697
6.12k
    case ASCII_a:
1698
6.12k
      ptr += MINBPC(enc);
1699
6.12k
      if (CHAR_MATCHES(enc, ptr, ASCII_p)) {
1700
1.16k
        ptr += MINBPC(enc);
1701
1.16k
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1702
752
          ptr += MINBPC(enc);
1703
752
          if (CHAR_MATCHES(enc, ptr, ASCII_s))
1704
514
            return ASCII_APOS;
1705
752
        }
1706
1.16k
      }
1707
5.60k
      break;
1708
29.0k
    }
1709
201k
  }
1710
157k
  return 0;
1711
201k
}
xmltok.c:normal_predefinedEntityName
Line
Count
Source
1661
201k
                             const char *end) {
1662
201k
  UNUSED_P(enc);
1663
201k
  switch ((end - ptr) / MINBPC(enc)) {
1664
14.3k
  case 2:
1665
14.3k
    if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_t)) {
1666
4.35k
      switch (BYTE_TO_ASCII(enc, ptr)) {
1667
954
      case ASCII_l:
1668
954
        return ASCII_LT;
1669
66
      case ASCII_g:
1670
66
        return ASCII_GT;
1671
4.35k
      }
1672
4.35k
    }
1673
13.2k
    break;
1674
45.8k
  case 3:
1675
45.8k
    if (CHAR_MATCHES(enc, ptr, ASCII_a)) {
1676
32.3k
      ptr += MINBPC(enc);
1677
32.3k
      if (CHAR_MATCHES(enc, ptr, ASCII_m)) {
1678
31.1k
        ptr += MINBPC(enc);
1679
31.1k
        if (CHAR_MATCHES(enc, ptr, ASCII_p))
1680
30.7k
          return ASCII_AMP;
1681
31.1k
      }
1682
32.3k
    }
1683
15.0k
    break;
1684
29.0k
  case 4:
1685
29.0k
    switch (BYTE_TO_ASCII(enc, ptr)) {
1686
14.5k
    case ASCII_q:
1687
14.5k
      ptr += MINBPC(enc);
1688
14.5k
      if (CHAR_MATCHES(enc, ptr, ASCII_u)) {
1689
13.1k
        ptr += MINBPC(enc);
1690
13.1k
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1691
12.7k
          ptr += MINBPC(enc);
1692
12.7k
          if (CHAR_MATCHES(enc, ptr, ASCII_t))
1693
12.2k
            return ASCII_QUOT;
1694
12.7k
        }
1695
13.1k
      }
1696
2.31k
      break;
1697
6.12k
    case ASCII_a:
1698
6.12k
      ptr += MINBPC(enc);
1699
6.12k
      if (CHAR_MATCHES(enc, ptr, ASCII_p)) {
1700
1.16k
        ptr += MINBPC(enc);
1701
1.16k
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1702
752
          ptr += MINBPC(enc);
1703
752
          if (CHAR_MATCHES(enc, ptr, ASCII_s))
1704
514
            return ASCII_APOS;
1705
752
        }
1706
1.16k
      }
1707
5.60k
      break;
1708
29.0k
    }
1709
201k
  }
1710
157k
  return 0;
1711
201k
}
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
205k
                         const char *end1, const char *ptr2) {
1716
205k
  UNUSED_P(enc);
1717
950k
  for (; *ptr2; ptr1 += MINBPC(enc), ptr2++) {
1718
822k
    if (end1 - ptr1 < MINBPC(enc)) {
1719
      /* This line cannot be executed.  The incoming data has already
1720
       * been tokenized once, so incomplete characters like this have
1721
       * already been eliminated from the input.  Retaining the
1722
       * paranoia check is still valuable, however.
1723
       */
1724
32
      return 0; /* LCOV_EXCL_LINE */
1725
32
    }
1726
822k
    if (! CHAR_MATCHES(enc, ptr1, *ptr2))
1727
78.1k
      return 0;
1728
822k
  }
1729
127k
  return ptr1 == end1;
1730
205k
}
xmltok.c:normal_nameMatchesAscii
Line
Count
Source
1715
205k
                         const char *end1, const char *ptr2) {
1716
205k
  UNUSED_P(enc);
1717
950k
  for (; *ptr2; ptr1 += MINBPC(enc), ptr2++) {
1718
822k
    if (end1 - ptr1 < MINBPC(enc)) {
1719
      /* This line cannot be executed.  The incoming data has already
1720
       * been tokenized once, so incomplete characters like this have
1721
       * already been eliminated from the input.  Retaining the
1722
       * paranoia check is still valuable, however.
1723
       */
1724
32
      return 0; /* LCOV_EXCL_LINE */
1725
32
    }
1726
822k
    if (! CHAR_MATCHES(enc, ptr1, *ptr2))
1727
78.1k
      return 0;
1728
822k
  }
1729
127k
  return ptr1 == end1;
1730
205k
}
Unexecuted instantiation: xmltok.c:little2_nameMatchesAscii
Unexecuted instantiation: xmltok.c:big2_nameMatchesAscii
1731
1732
static int PTRFASTCALL
1733
622k
PREFIX(nameLength)(const ENCODING *enc, const char *ptr) {
1734
622k
  const char *start = ptr;
1735
6.85M
  for (;;) {
1736
6.85M
    switch (BYTE_TYPE(enc, ptr)) {
1737
0
#  define LEAD_CASE(n)                                                         \
1738
47.4k
  case BT_LEAD##n:                                                             \
1739
47.4k
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1740
47.4k
    break;
1741
25.8k
      LEAD_CASE(2)
1742
21.6k
      LEAD_CASE(3)
1743
0
      LEAD_CASE(4)
1744
0
#  undef LEAD_CASE
1745
0
    case BT_NONASCII:
1746
5.51M
    case BT_NMSTRT:
1747
#  ifdef XML_NS
1748
    case BT_COLON:
1749
#  endif
1750
6.02M
    case BT_HEX:
1751
6.06M
    case BT_DIGIT:
1752
6.08M
    case BT_NAME:
1753
6.18M
    case BT_MINUS:
1754
6.18M
      ptr += MINBPC(enc);
1755
6.18M
      break;
1756
622k
    default:
1757
622k
      return (int)(ptr - start);
1758
6.85M
    }
1759
6.85M
  }
1760
622k
}
xmltok.c:normal_nameLength
Line
Count
Source
1733
622k
PREFIX(nameLength)(const ENCODING *enc, const char *ptr) {
1734
622k
  const char *start = ptr;
1735
6.85M
  for (;;) {
1736
6.85M
    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
25.8k
      LEAD_CASE(2)
1742
21.6k
      LEAD_CASE(3)
1743
0
      LEAD_CASE(4)
1744
0
#  undef LEAD_CASE
1745
0
    case BT_NONASCII:
1746
5.51M
    case BT_NMSTRT:
1747
#  ifdef XML_NS
1748
    case BT_COLON:
1749
#  endif
1750
6.02M
    case BT_HEX:
1751
6.06M
    case BT_DIGIT:
1752
6.08M
    case BT_NAME:
1753
6.18M
    case BT_MINUS:
1754
6.18M
      ptr += MINBPC(enc);
1755
6.18M
      break;
1756
622k
    default:
1757
622k
      return (int)(ptr - start);
1758
6.85M
    }
1759
6.85M
  }
1760
622k
}
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
11.3k
                       POSITION *pos) {
1780
75.6M
  while (HAS_CHAR(enc, ptr, end)) {
1781
75.6M
    switch (BYTE_TYPE(enc, ptr)) {
1782
0
#  define LEAD_CASE(n)                                                         \
1783
999k
  case BT_LEAD##n:                                                             \
1784
999k
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1785
999k
    pos->columnNumber++;                                                       \
1786
999k
    break;
1787
376k
      LEAD_CASE(2)
1788
468k
      LEAD_CASE(3)
1789
153k
      LEAD_CASE(4)
1790
0
#  undef LEAD_CASE
1791
1.94M
    case BT_LF:
1792
1.94M
      pos->columnNumber = 0;
1793
1.94M
      pos->lineNumber++;
1794
1.94M
      ptr += MINBPC(enc);
1795
1.94M
      break;
1796
2.57M
    case BT_CR:
1797
2.57M
      pos->lineNumber++;
1798
2.57M
      ptr += MINBPC(enc);
1799
2.57M
      if (HAS_CHAR(enc, ptr, end) && BYTE_TYPE(enc, ptr) == BT_LF)
1800
677k
        ptr += MINBPC(enc);
1801
2.57M
      pos->columnNumber = 0;
1802
2.57M
      break;
1803
70.1M
    default:
1804
70.1M
      ptr += MINBPC(enc);
1805
70.1M
      pos->columnNumber++;
1806
70.1M
      break;
1807
75.6M
    }
1808
75.6M
  }
1809
11.3k
}
xmltok.c:normal_updatePosition
Line
Count
Source
1779
11.1k
                       POSITION *pos) {
1780
75.6M
  while (HAS_CHAR(enc, ptr, end)) {
1781
75.6M
    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
376k
      LEAD_CASE(2)
1788
468k
      LEAD_CASE(3)
1789
153k
      LEAD_CASE(4)
1790
0
#  undef LEAD_CASE
1791
1.94M
    case BT_LF:
1792
1.94M
      pos->columnNumber = 0;
1793
1.94M
      pos->lineNumber++;
1794
1.94M
      ptr += MINBPC(enc);
1795
1.94M
      break;
1796
2.57M
    case BT_CR:
1797
2.57M
      pos->lineNumber++;
1798
2.57M
      ptr += MINBPC(enc);
1799
2.57M
      if (HAS_CHAR(enc, ptr, end) && BYTE_TYPE(enc, ptr) == BT_LF)
1800
677k
        ptr += MINBPC(enc);
1801
2.57M
      pos->columnNumber = 0;
1802
2.57M
      break;
1803
70.1M
    default:
1804
70.1M
      ptr += MINBPC(enc);
1805
70.1M
      pos->columnNumber++;
1806
70.1M
      break;
1807
75.6M
    }
1808
75.6M
  }
1809
11.1k
}
xmltok.c:little2_updatePosition
Line
Count
Source
1779
139
                       POSITION *pos) {
1780
36.8k
  while (HAS_CHAR(enc, ptr, end)) {
1781
36.8k
    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
36.8k
    default:
1804
36.8k
      ptr += MINBPC(enc);
1805
36.8k
      pos->columnNumber++;
1806
36.8k
      break;
1807
36.8k
    }
1808
36.8k
  }
1809
139
}
xmltok.c:big2_updatePosition
Line
Count
Source
1779
144
                       POSITION *pos) {
1780
335
  while (HAS_CHAR(enc, ptr, end)) {
1781
335
    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
335
    default:
1804
335
      ptr += MINBPC(enc);
1805
335
      pos->columnNumber++;
1806
335
      break;
1807
335
    }
1808
335
  }
1809
144
}
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 */