Coverage Report

Created: 2025-06-20 06:51

/src/CMake/Utilities/cmexpat/lib/xmltok_impl.c
Line
Count
Source (jump to first uncovered line)
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
43
#    define IS_INVALID_CHAR(enc, ptr, n) (0)
46
#  endif
47
48
#  define INVALID_LEAD_CASE(n, ptr, nextTokPtr)                                \
49
752k
  case BT_LEAD##n:                                                             \
50
753k
    if (end - ptr < n)                                                         \
51
752k
      return XML_TOK_PARTIAL_CHAR;                                             \
52
752k
    if (IS_INVALID_CHAR(enc, ptr, n)) {                                        \
53
87
      *(nextTokPtr) = (ptr);                                                   \
54
87
      return XML_TOK_INVALID;                                                  \
55
87
    }                                                                          \
56
752k
    ptr += n;                                                                  \
57
752k
    break;
58
59
#  define INVALID_CASES(ptr, nextTokPtr)                                       \
60
302k
    INVALID_LEAD_CASE(2, ptr, nextTokPtr)                                      \
61
302k
    INVALID_LEAD_CASE(3, ptr, nextTokPtr)                                      \
62
265k
    INVALID_LEAD_CASE(4, ptr, nextTokPtr)                                      \
63
184k
  case BT_NONXML:                                                              \
64
57
  case BT_MALFORM:                                                             \
65
116
  case BT_TRAIL:                                                               \
66
116
    *(nextTokPtr) = (ptr);                                                     \
67
116
    return XML_TOK_INVALID;
68
69
#  define CHECK_NAME_CASE(n, enc, ptr, end, nextTokPtr)                        \
70
428k
  case BT_LEAD##n:                                                             \
71
429k
    if (end - ptr < n)                                                         \
72
428k
      return XML_TOK_PARTIAL_CHAR;                                             \
73
429k
    if (IS_INVALID_CHAR(enc, ptr, n) || ! IS_NAME_CHAR(enc, ptr, n)) {         \
74
250
      *nextTokPtr = ptr;                                                       \
75
250
      return XML_TOK_INVALID;                                                  \
76
250
    }                                                                          \
77
429k
    ptr += n;                                                                  \
78
428k
    break;
79
80
#  define CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)                          \
81
31.7M
  case BT_NONASCII:                                                            \
82
31.7M
    if (! IS_NAME_CHAR_MINBPC(enc, ptr)) {                                     \
83
48
      *nextTokPtr = ptr;                                                       \
84
48
      return XML_TOK_INVALID;                                                  \
85
48
    }                                                                          \
86
31.7M
    /* fall through */                                                         \
87
31.7M
  case BT_NMSTRT:                                                              \
88
24.8M
  case BT_HEX:                                                                 \
89
31.3M
  case BT_DIGIT:                                                               \
90
31.3M
  case BT_NAME:                                                                \
91
31.7M
  case BT_MINUS:                                                               \
92
31.7M
    ptr += MINBPC(enc);                                                        \
93
31.7M
    break;                                                                     \
94
31.7M
    CHECK_NAME_CASE(2, enc, ptr, end, nextTokPtr)                              \
95
270k
    CHECK_NAME_CASE(3, enc, ptr, end, nextTokPtr)                              \
96
269k
    CHECK_NAME_CASE(4, enc, ptr, end, nextTokPtr)
97
98
#  define CHECK_NMSTRT_CASE(n, enc, ptr, end, nextTokPtr)                      \
99
91.8k
  case BT_LEAD##n:                                                             \
100
92.0k
    if ((end) - (ptr) < (n))                                                   \
101
91.8k
      return XML_TOK_PARTIAL_CHAR;                                             \
102
91.9k
    if (IS_INVALID_CHAR(enc, ptr, n) || ! IS_NMSTRT_CHAR(enc, ptr, n)) {       \
103
143
      *nextTokPtr = ptr;                                                       \
104
143
      return XML_TOK_INVALID;                                                  \
105
143
    }                                                                          \
106
91.9k
    ptr += n;                                                                  \
107
91.8k
    break;
108
109
#  define CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)                        \
110
3.64M
  case BT_NONASCII:                                                            \
111
3.64M
    if (! IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {                                   \
112
0
      *nextTokPtr = ptr;                                                       \
113
0
      return XML_TOK_INVALID;                                                  \
114
0
    }                                                                          \
115
3.64M
    /* fall through */                                                         \
116
3.64M
  case BT_NMSTRT:                                                              \
117
3.64M
  case BT_HEX:                                                                 \
118
3.64M
    ptr += MINBPC(enc);                                                        \
119
3.64M
    break;                                                                     \
120
3.64M
    CHECK_NMSTRT_CASE(2, enc, ptr, end, nextTokPtr)                            \
121
56.1k
    CHECK_NMSTRT_CASE(3, enc, ptr, end, nextTokPtr)                            \
122
35.7k
    CHECK_NMSTRT_CASE(4, enc, ptr, end, nextTokPtr)
123
124
#  ifndef PREFIX
125
#    define PREFIX(ident) ident
126
#  endif
127
128
#  define HAS_CHARS(enc, ptr, end, count)                                      \
129
308M
    ((end) - (ptr) >= ((count) * MINBPC(enc)))
130
131
11.2M
#  define HAS_CHAR(enc, ptr, end) HAS_CHARS(enc, ptr, end, 1)
132
133
#  define REQUIRE_CHARS(enc, ptr, end, count)                                  \
134
37.1M
    {                                                                          \
135
37.1M
      if (! HAS_CHARS(enc, ptr, end, count)) {                                 \
136
575
        return XML_TOK_PARTIAL;                                                \
137
575
      }                                                                        \
138
37.1M
    }
139
140
37.1M
#  define REQUIRE_CHAR(enc, ptr, end) REQUIRE_CHARS(enc, ptr, end, 1)
141
142
/* ptr points to character following "<!-" */
143
144
static int PTRCALL
145
PREFIX(scanComment)(const ENCODING *enc, const char *ptr, const char *end,
146
34.5k
                    const char **nextTokPtr) {
147
34.5k
  if (HAS_CHAR(enc, ptr, end)) {
148
34.4k
    if (! CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
149
13
      *nextTokPtr = ptr;
150
13
      return XML_TOK_INVALID;
151
13
    }
152
34.4k
    ptr += MINBPC(enc);
153
5.50M
    while (HAS_CHAR(enc, ptr, end)) {
154
5.50M
      switch (BYTE_TYPE(enc, ptr)) {
155
205k
        INVALID_CASES(ptr, nextTokPtr)
156
46.5k
      case BT_MINUS:
157
46.5k
        ptr += MINBPC(enc);
158
46.5k
        REQUIRE_CHAR(enc, ptr, end);
159
46.5k
        if (CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
160
34.3k
          ptr += MINBPC(enc);
161
34.3k
          REQUIRE_CHAR(enc, ptr, end);
162
34.3k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
163
11
            *nextTokPtr = ptr;
164
11
            return XML_TOK_INVALID;
165
11
          }
166
34.3k
          *nextTokPtr = ptr + MINBPC(enc);
167
34.3k
          return XML_TOK_COMMENT;
168
34.3k
        }
169
12.2k
        break;
170
5.35M
      default:
171
5.35M
        ptr += MINBPC(enc);
172
5.35M
        break;
173
5.50M
      }
174
5.50M
    }
175
34.4k
  }
176
114
  return XML_TOK_PARTIAL;
177
34.5k
}
xmltok.c:normal_scanComment
Line
Count
Source
146
34.5k
                    const char **nextTokPtr) {
147
34.5k
  if (HAS_CHAR(enc, ptr, end)) {
148
34.4k
    if (! CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
149
13
      *nextTokPtr = ptr;
150
13
      return XML_TOK_INVALID;
151
13
    }
152
34.4k
    ptr += MINBPC(enc);
153
5.50M
    while (HAS_CHAR(enc, ptr, end)) {
154
5.50M
      switch (BYTE_TYPE(enc, ptr)) {
155
205k
        INVALID_CASES(ptr, nextTokPtr)
156
46.5k
      case BT_MINUS:
157
46.5k
        ptr += MINBPC(enc);
158
46.5k
        REQUIRE_CHAR(enc, ptr, end);
159
46.5k
        if (CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
160
34.3k
          ptr += MINBPC(enc);
161
34.3k
          REQUIRE_CHAR(enc, ptr, end);
162
34.3k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
163
11
            *nextTokPtr = ptr;
164
11
            return XML_TOK_INVALID;
165
11
          }
166
34.3k
          *nextTokPtr = ptr + MINBPC(enc);
167
34.3k
          return XML_TOK_COMMENT;
168
34.3k
        }
169
12.2k
        break;
170
5.35M
      default:
171
5.35M
        ptr += MINBPC(enc);
172
5.35M
        break;
173
5.50M
      }
174
5.50M
    }
175
34.4k
  }
176
114
  return XML_TOK_PARTIAL;
177
34.5k
}
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
55.1k
                 const char **nextTokPtr) {
184
55.1k
  REQUIRE_CHAR(enc, ptr, end);
185
55.1k
  switch (BYTE_TYPE(enc, ptr)) {
186
2.67k
  case BT_MINUS:
187
2.67k
    return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
188
1
  case BT_LSQB:
189
1
    *nextTokPtr = ptr + MINBPC(enc);
190
1
    return XML_TOK_COND_SECT_OPEN;
191
1.43k
  case BT_NMSTRT:
192
52.4k
  case BT_HEX:
193
52.4k
    ptr += MINBPC(enc);
194
52.4k
    break;
195
4
  default:
196
4
    *nextTokPtr = ptr;
197
4
    return XML_TOK_INVALID;
198
55.1k
  }
199
422k
  while (HAS_CHAR(enc, ptr, end)) {
200
422k
    switch (BYTE_TYPE(enc, ptr)) {
201
28
    case BT_PERCNT:
202
28
      REQUIRE_CHARS(enc, ptr, end, 2);
203
      /* don't allow <!ENTITY% foo "whatever"> */
204
26
      switch (BYTE_TYPE(enc, ptr + MINBPC(enc))) {
205
1
      case BT_S:
206
2
      case BT_CR:
207
5
      case BT_LF:
208
10
      case BT_PERCNT:
209
10
        *nextTokPtr = ptr;
210
10
        return XML_TOK_INVALID;
211
26
      }
212
      /* fall through */
213
19.4k
    case BT_S:
214
48.5k
    case BT_CR:
215
52.3k
    case BT_LF:
216
52.3k
      *nextTokPtr = ptr;
217
52.3k
      return XML_TOK_DECL_OPEN;
218
288k
    case BT_NMSTRT:
219
370k
    case BT_HEX:
220
370k
      ptr += MINBPC(enc);
221
370k
      break;
222
7
    default:
223
7
      *nextTokPtr = ptr;
224
7
      return XML_TOK_INVALID;
225
422k
    }
226
422k
  }
227
108
  return XML_TOK_PARTIAL;
228
52.4k
}
xmltok.c:normal_scanDecl
Line
Count
Source
183
55.1k
                 const char **nextTokPtr) {
184
55.1k
  REQUIRE_CHAR(enc, ptr, end);
185
55.1k
  switch (BYTE_TYPE(enc, ptr)) {
186
2.67k
  case BT_MINUS:
187
2.67k
    return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
188
1
  case BT_LSQB:
189
1
    *nextTokPtr = ptr + MINBPC(enc);
190
1
    return XML_TOK_COND_SECT_OPEN;
191
1.43k
  case BT_NMSTRT:
192
52.4k
  case BT_HEX:
193
52.4k
    ptr += MINBPC(enc);
194
52.4k
    break;
195
4
  default:
196
4
    *nextTokPtr = ptr;
197
4
    return XML_TOK_INVALID;
198
55.1k
  }
199
422k
  while (HAS_CHAR(enc, ptr, end)) {
200
422k
    switch (BYTE_TYPE(enc, ptr)) {
201
28
    case BT_PERCNT:
202
28
      REQUIRE_CHARS(enc, ptr, end, 2);
203
      /* don't allow <!ENTITY% foo "whatever"> */
204
26
      switch (BYTE_TYPE(enc, ptr + MINBPC(enc))) {
205
1
      case BT_S:
206
2
      case BT_CR:
207
5
      case BT_LF:
208
10
      case BT_PERCNT:
209
10
        *nextTokPtr = ptr;
210
10
        return XML_TOK_INVALID;
211
26
      }
212
      /* fall through */
213
19.4k
    case BT_S:
214
48.5k
    case BT_CR:
215
52.3k
    case BT_LF:
216
52.3k
      *nextTokPtr = ptr;
217
52.3k
      return XML_TOK_DECL_OPEN;
218
288k
    case BT_NMSTRT:
219
370k
    case BT_HEX:
220
370k
      ptr += MINBPC(enc);
221
370k
      break;
222
7
    default:
223
7
      *nextTokPtr = ptr;
224
7
      return XML_TOK_INVALID;
225
422k
    }
226
422k
  }
227
108
  return XML_TOK_PARTIAL;
228
52.4k
}
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
41.2k
                      int *tokPtr) {
233
41.2k
  int upper = 0;
234
41.2k
  UNUSED_P(enc);
235
41.2k
  *tokPtr = XML_TOK_PI;
236
41.2k
  if (end - ptr != MINBPC(enc) * 3)
237
27.4k
    return 1;
238
13.8k
  switch (BYTE_TO_ASCII(enc, ptr)) {
239
4.61k
  case ASCII_x:
240
4.61k
    break;
241
2.13k
  case ASCII_X:
242
2.13k
    upper = 1;
243
2.13k
    break;
244
7.09k
  default:
245
7.09k
    return 1;
246
13.8k
  }
247
6.74k
  ptr += MINBPC(enc);
248
6.74k
  switch (BYTE_TO_ASCII(enc, ptr)) {
249
3.01k
  case ASCII_m:
250
3.01k
    break;
251
886
  case ASCII_M:
252
886
    upper = 1;
253
886
    break;
254
2.84k
  default:
255
2.84k
    return 1;
256
6.74k
  }
257
3.90k
  ptr += MINBPC(enc);
258
3.90k
  switch (BYTE_TO_ASCII(enc, ptr)) {
259
1.16k
  case ASCII_l:
260
1.16k
    break;
261
2
  case ASCII_L:
262
2
    upper = 1;
263
2
    break;
264
2.73k
  default:
265
2.73k
    return 1;
266
3.90k
  }
267
1.17k
  if (upper)
268
5
    return 0;
269
1.16k
  *tokPtr = XML_TOK_XML_DECL;
270
1.16k
  return 1;
271
1.17k
}
xmltok.c:normal_checkPiTarget
Line
Count
Source
232
41.2k
                      int *tokPtr) {
233
41.2k
  int upper = 0;
234
41.2k
  UNUSED_P(enc);
235
41.2k
  *tokPtr = XML_TOK_PI;
236
41.2k
  if (end - ptr != MINBPC(enc) * 3)
237
27.4k
    return 1;
238
13.8k
  switch (BYTE_TO_ASCII(enc, ptr)) {
239
4.61k
  case ASCII_x:
240
4.61k
    break;
241
2.13k
  case ASCII_X:
242
2.13k
    upper = 1;
243
2.13k
    break;
244
7.09k
  default:
245
7.09k
    return 1;
246
13.8k
  }
247
6.74k
  ptr += MINBPC(enc);
248
6.74k
  switch (BYTE_TO_ASCII(enc, ptr)) {
249
3.01k
  case ASCII_m:
250
3.01k
    break;
251
886
  case ASCII_M:
252
886
    upper = 1;
253
886
    break;
254
2.84k
  default:
255
2.84k
    return 1;
256
6.74k
  }
257
3.90k
  ptr += MINBPC(enc);
258
3.90k
  switch (BYTE_TO_ASCII(enc, ptr)) {
259
1.16k
  case ASCII_l:
260
1.16k
    break;
261
2
  case ASCII_L:
262
2
    upper = 1;
263
2
    break;
264
2.73k
  default:
265
2.73k
    return 1;
266
3.90k
  }
267
1.17k
  if (upper)
268
5
    return 0;
269
1.16k
  *tokPtr = XML_TOK_XML_DECL;
270
1.16k
  return 1;
271
1.17k
}
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
41.4k
               const char **nextTokPtr) {
278
41.4k
  int tok;
279
41.4k
  const char *target = ptr;
280
41.4k
  REQUIRE_CHAR(enc, ptr, end);
281
41.4k
  switch (BYTE_TYPE(enc, ptr)) {
282
52.7k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
283
2
  default:
284
2
    *nextTokPtr = ptr;
285
2
    return XML_TOK_INVALID;
286
41.4k
  }
287
3.53M
  while (HAS_CHAR(enc, ptr, end)) {
288
3.53M
    switch (BYTE_TYPE(enc, ptr)) {
289
12.6M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
290
6.73k
    case BT_S:
291
9.33k
    case BT_CR:
292
16.8k
    case BT_LF:
293
16.8k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
294
2
        *nextTokPtr = ptr;
295
2
        return XML_TOK_INVALID;
296
2
      }
297
16.8k
      ptr += MINBPC(enc);
298
12.3M
      while (HAS_CHAR(enc, ptr, end)) {
299
12.3M
        switch (BYTE_TYPE(enc, ptr)) {
300
468k
          INVALID_CASES(ptr, nextTokPtr)
301
67.1k
        case BT_QUEST:
302
67.1k
          ptr += MINBPC(enc);
303
67.1k
          REQUIRE_CHAR(enc, ptr, end);
304
67.1k
          if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
305
16.6k
            *nextTokPtr = ptr + MINBPC(enc);
306
16.6k
            return tok;
307
16.6k
          }
308
50.4k
          break;
309
12.0M
        default:
310
12.0M
          ptr += MINBPC(enc);
311
12.0M
          break;
312
12.3M
        }
313
12.3M
      }
314
158
      return XML_TOK_PARTIAL;
315
24.3k
    case BT_QUEST:
316
24.3k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
317
3
        *nextTokPtr = ptr;
318
3
        return XML_TOK_INVALID;
319
3
      }
320
24.3k
      ptr += MINBPC(enc);
321
24.3k
      REQUIRE_CHAR(enc, ptr, end);
322
24.3k
      if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
323
24.3k
        *nextTokPtr = ptr + MINBPC(enc);
324
24.3k
        return tok;
325
24.3k
      }
326
      /* fall through */
327
28
    default:
328
28
      *nextTokPtr = ptr;
329
28
      return XML_TOK_INVALID;
330
3.53M
    }
331
3.53M
  }
332
92
  return XML_TOK_PARTIAL;
333
41.4k
}
xmltok.c:normal_scanPi
Line
Count
Source
277
41.4k
               const char **nextTokPtr) {
278
41.4k
  int tok;
279
41.4k
  const char *target = ptr;
280
41.4k
  REQUIRE_CHAR(enc, ptr, end);
281
41.4k
  switch (BYTE_TYPE(enc, ptr)) {
282
52.7k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
283
2
  default:
284
2
    *nextTokPtr = ptr;
285
2
    return XML_TOK_INVALID;
286
41.4k
  }
287
3.53M
  while (HAS_CHAR(enc, ptr, end)) {
288
3.53M
    switch (BYTE_TYPE(enc, ptr)) {
289
12.6M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
290
6.73k
    case BT_S:
291
9.33k
    case BT_CR:
292
16.8k
    case BT_LF:
293
16.8k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
294
2
        *nextTokPtr = ptr;
295
2
        return XML_TOK_INVALID;
296
2
      }
297
16.8k
      ptr += MINBPC(enc);
298
12.3M
      while (HAS_CHAR(enc, ptr, end)) {
299
12.3M
        switch (BYTE_TYPE(enc, ptr)) {
300
468k
          INVALID_CASES(ptr, nextTokPtr)
301
67.1k
        case BT_QUEST:
302
67.1k
          ptr += MINBPC(enc);
303
67.1k
          REQUIRE_CHAR(enc, ptr, end);
304
67.1k
          if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
305
16.6k
            *nextTokPtr = ptr + MINBPC(enc);
306
16.6k
            return tok;
307
16.6k
          }
308
50.4k
          break;
309
12.0M
        default:
310
12.0M
          ptr += MINBPC(enc);
311
12.0M
          break;
312
12.3M
        }
313
12.3M
      }
314
158
      return XML_TOK_PARTIAL;
315
24.3k
    case BT_QUEST:
316
24.3k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
317
3
        *nextTokPtr = ptr;
318
3
        return XML_TOK_INVALID;
319
3
      }
320
24.3k
      ptr += MINBPC(enc);
321
24.3k
      REQUIRE_CHAR(enc, ptr, end);
322
24.3k
      if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
323
24.3k
        *nextTokPtr = ptr + MINBPC(enc);
324
24.3k
        return tok;
325
24.3k
      }
326
      /* fall through */
327
28
    default:
328
28
      *nextTokPtr = ptr;
329
28
      return XML_TOK_INVALID;
330
3.53M
    }
331
3.53M
  }
332
92
  return XML_TOK_PARTIAL;
333
41.4k
}
Unexecuted instantiation: xmltok.c:little2_scanPi
Unexecuted instantiation: xmltok.c:big2_scanPi
334
335
static int PTRCALL
336
PREFIX(scanCdataSection)(const ENCODING *enc, const char *ptr, const char *end,
337
3.46k
                         const char **nextTokPtr) {
338
3.46k
  static const char CDATA_LSQB[]
339
3.46k
      = {ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, ASCII_LSQB};
340
3.46k
  int i;
341
3.46k
  UNUSED_P(enc);
342
  /* CDATA[ */
343
3.46k
  REQUIRE_CHARS(enc, ptr, end, 6);
344
23.9k
  for (i = 0; i < 6; i++, ptr += MINBPC(enc)) {
345
20.5k
    if (! CHAR_MATCHES(enc, ptr, CDATA_LSQB[i])) {
346
51
      *nextTokPtr = ptr;
347
51
      return XML_TOK_INVALID;
348
51
    }
349
20.5k
  }
350
3.40k
  *nextTokPtr = ptr;
351
3.40k
  return XML_TOK_CDATA_SECT_OPEN;
352
3.45k
}
xmltok.c:normal_scanCdataSection
Line
Count
Source
337
3.46k
                         const char **nextTokPtr) {
338
3.46k
  static const char CDATA_LSQB[]
339
3.46k
      = {ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, ASCII_LSQB};
340
3.46k
  int i;
341
3.46k
  UNUSED_P(enc);
342
  /* CDATA[ */
343
3.46k
  REQUIRE_CHARS(enc, ptr, end, 6);
344
23.9k
  for (i = 0; i < 6; i++, ptr += MINBPC(enc)) {
345
20.5k
    if (! CHAR_MATCHES(enc, ptr, CDATA_LSQB[i])) {
346
51
      *nextTokPtr = ptr;
347
51
      return XML_TOK_INVALID;
348
51
    }
349
20.5k
  }
350
3.40k
  *nextTokPtr = ptr;
351
3.40k
  return XML_TOK_CDATA_SECT_OPEN;
352
3.45k
}
Unexecuted instantiation: xmltok.c:little2_scanCdataSection
Unexecuted instantiation: xmltok.c:big2_scanCdataSection
353
354
static int PTRCALL
355
PREFIX(cdataSectionTok)(const ENCODING *enc, const char *ptr, const char *end,
356
3.60M
                        const char **nextTokPtr) {
357
3.60M
  if (ptr >= end)
358
206
    return XML_TOK_NONE;
359
3.60M
  if (MINBPC(enc) > 1) {
360
0
    size_t n = end - ptr;
361
0
    if (n & (MINBPC(enc) - 1)) {
362
0
      n &= ~(MINBPC(enc) - 1);
363
0
      if (n == 0)
364
0
        return XML_TOK_PARTIAL;
365
0
      end = ptr + n;
366
0
    }
367
0
  }
368
3.60M
  switch (BYTE_TYPE(enc, ptr)) {
369
431k
  case BT_RSQB:
370
431k
    ptr += MINBPC(enc);
371
431k
    REQUIRE_CHAR(enc, ptr, end);
372
431k
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
373
196k
      break;
374
234k
    ptr += MINBPC(enc);
375
234k
    REQUIRE_CHAR(enc, ptr, end);
376
234k
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
377
231k
      ptr -= MINBPC(enc);
378
231k
      break;
379
231k
    }
380
3.24k
    *nextTokPtr = ptr + MINBPC(enc);
381
3.24k
    return XML_TOK_CDATA_SECT_CLOSE;
382
1.54M
  case BT_CR:
383
1.54M
    ptr += MINBPC(enc);
384
1.54M
    REQUIRE_CHAR(enc, ptr, end);
385
1.54M
    if (BYTE_TYPE(enc, ptr) == BT_LF)
386
282k
      ptr += MINBPC(enc);
387
1.54M
    *nextTokPtr = ptr;
388
1.54M
    return XML_TOK_DATA_NEWLINE;
389
875k
  case BT_LF:
390
875k
    *nextTokPtr = ptr + MINBPC(enc);
391
875k
    return XML_TOK_DATA_NEWLINE;
392
875k
    INVALID_CASES(ptr, nextTokPtr)
393
679k
  default:
394
679k
    ptr += MINBPC(enc);
395
679k
    break;
396
3.60M
  }
397
23.1M
  while (HAS_CHAR(enc, ptr, end)) {
398
23.1M
    switch (BYTE_TYPE(enc, ptr)) {
399
0
#  define LEAD_CASE(n)                                                         \
400
343k
  case BT_LEAD##n:                                                             \
401
343k
    if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) {                       \
402
17
      *nextTokPtr = ptr;                                                       \
403
17
      return XML_TOK_DATA_CHARS;                                               \
404
17
    }                                                                          \
405
343k
    ptr += n;                                                                  \
406
343k
    break;
407
161k
      LEAD_CASE(2)
408
136k
      LEAD_CASE(3)
409
45.9k
      LEAD_CASE(4)
410
0
#  undef LEAD_CASE
411
4
    case BT_NONXML:
412
6
    case BT_MALFORM:
413
12
    case BT_TRAIL:
414
563k
    case BT_CR:
415
834k
    case BT_LF:
416
1.18M
    case BT_RSQB:
417
1.18M
      *nextTokPtr = ptr;
418
1.18M
      return XML_TOK_DATA_CHARS;
419
21.6M
    default:
420
21.6M
      ptr += MINBPC(enc);
421
21.6M
      break;
422
23.1M
    }
423
23.1M
  }
424
72
  *nextTokPtr = ptr;
425
72
  return XML_TOK_DATA_CHARS;
426
1.18M
}
xmltok.c:normal_cdataSectionTok
Line
Count
Source
356
3.60M
                        const char **nextTokPtr) {
357
3.60M
  if (ptr >= end)
358
206
    return XML_TOK_NONE;
359
3.60M
  if (MINBPC(enc) > 1) {
360
0
    size_t n = end - ptr;
361
0
    if (n & (MINBPC(enc) - 1)) {
362
0
      n &= ~(MINBPC(enc) - 1);
363
0
      if (n == 0)
364
0
        return XML_TOK_PARTIAL;
365
0
      end = ptr + n;
366
0
    }
367
0
  }
368
3.60M
  switch (BYTE_TYPE(enc, ptr)) {
369
431k
  case BT_RSQB:
370
431k
    ptr += MINBPC(enc);
371
431k
    REQUIRE_CHAR(enc, ptr, end);
372
431k
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
373
196k
      break;
374
234k
    ptr += MINBPC(enc);
375
234k
    REQUIRE_CHAR(enc, ptr, end);
376
234k
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
377
231k
      ptr -= MINBPC(enc);
378
231k
      break;
379
231k
    }
380
3.24k
    *nextTokPtr = ptr + MINBPC(enc);
381
3.24k
    return XML_TOK_CDATA_SECT_CLOSE;
382
1.54M
  case BT_CR:
383
1.54M
    ptr += MINBPC(enc);
384
1.54M
    REQUIRE_CHAR(enc, ptr, end);
385
1.54M
    if (BYTE_TYPE(enc, ptr) == BT_LF)
386
282k
      ptr += MINBPC(enc);
387
1.54M
    *nextTokPtr = ptr;
388
1.54M
    return XML_TOK_DATA_NEWLINE;
389
875k
  case BT_LF:
390
875k
    *nextTokPtr = ptr + MINBPC(enc);
391
875k
    return XML_TOK_DATA_NEWLINE;
392
875k
    INVALID_CASES(ptr, nextTokPtr)
393
679k
  default:
394
679k
    ptr += MINBPC(enc);
395
679k
    break;
396
3.60M
  }
397
23.1M
  while (HAS_CHAR(enc, ptr, end)) {
398
23.1M
    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
161k
      LEAD_CASE(2)
408
136k
      LEAD_CASE(3)
409
45.9k
      LEAD_CASE(4)
410
0
#  undef LEAD_CASE
411
4
    case BT_NONXML:
412
6
    case BT_MALFORM:
413
12
    case BT_TRAIL:
414
563k
    case BT_CR:
415
834k
    case BT_LF:
416
1.18M
    case BT_RSQB:
417
1.18M
      *nextTokPtr = ptr;
418
1.18M
      return XML_TOK_DATA_CHARS;
419
21.6M
    default:
420
21.6M
      ptr += MINBPC(enc);
421
21.6M
      break;
422
23.1M
    }
423
23.1M
  }
424
72
  *nextTokPtr = ptr;
425
72
  return XML_TOK_DATA_CHARS;
426
1.18M
}
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
74.3k
                   const char **nextTokPtr) {
433
74.3k
  REQUIRE_CHAR(enc, ptr, end);
434
74.3k
  switch (BYTE_TYPE(enc, ptr)) {
435
78.8k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
436
9
  default:
437
9
    *nextTokPtr = ptr;
438
9
    return XML_TOK_INVALID;
439
74.3k
  }
440
2.72M
  while (HAS_CHAR(enc, ptr, end)) {
441
2.72M
    switch (BYTE_TYPE(enc, ptr)) {
442
7.95M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
443
413
    case BT_S:
444
1.17k
    case BT_CR:
445
2.47k
    case BT_LF:
446
8.31k
      for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
447
8.31k
        switch (BYTE_TYPE(enc, ptr)) {
448
868
        case BT_S:
449
2.23k
        case BT_CR:
450
5.89k
        case BT_LF:
451
5.89k
          break;
452
2.41k
        case BT_GT:
453
2.41k
          *nextTokPtr = ptr + MINBPC(enc);
454
2.41k
          return XML_TOK_END_TAG;
455
3
        default:
456
3
          *nextTokPtr = ptr;
457
3
          return XML_TOK_INVALID;
458
8.31k
        }
459
8.31k
      }
460
56
      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
71.6k
    case BT_GT:
469
71.6k
      *nextTokPtr = ptr + MINBPC(enc);
470
71.6k
      return XML_TOK_END_TAG;
471
9
    default:
472
9
      *nextTokPtr = ptr;
473
9
      return XML_TOK_INVALID;
474
2.72M
    }
475
2.72M
  }
476
136
  return XML_TOK_PARTIAL;
477
74.2k
}
xmltok.c:normal_scanEndTag
Line
Count
Source
432
74.3k
                   const char **nextTokPtr) {
433
74.3k
  REQUIRE_CHAR(enc, ptr, end);
434
74.3k
  switch (BYTE_TYPE(enc, ptr)) {
435
78.8k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
436
9
  default:
437
9
    *nextTokPtr = ptr;
438
9
    return XML_TOK_INVALID;
439
74.3k
  }
440
2.72M
  while (HAS_CHAR(enc, ptr, end)) {
441
2.72M
    switch (BYTE_TYPE(enc, ptr)) {
442
7.95M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
443
413
    case BT_S:
444
1.17k
    case BT_CR:
445
2.47k
    case BT_LF:
446
8.31k
      for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
447
8.31k
        switch (BYTE_TYPE(enc, ptr)) {
448
868
        case BT_S:
449
2.23k
        case BT_CR:
450
5.89k
        case BT_LF:
451
5.89k
          break;
452
2.41k
        case BT_GT:
453
2.41k
          *nextTokPtr = ptr + MINBPC(enc);
454
2.41k
          return XML_TOK_END_TAG;
455
3
        default:
456
3
          *nextTokPtr = ptr;
457
3
          return XML_TOK_INVALID;
458
8.31k
        }
459
8.31k
      }
460
56
      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
71.6k
    case BT_GT:
469
71.6k
      *nextTokPtr = ptr + MINBPC(enc);
470
71.6k
      return XML_TOK_END_TAG;
471
9
    default:
472
9
      *nextTokPtr = ptr;
473
9
      return XML_TOK_INVALID;
474
2.72M
    }
475
2.72M
  }
476
136
  return XML_TOK_PARTIAL;
477
74.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
168k
                       const char **nextTokPtr) {
484
168k
  if (HAS_CHAR(enc, ptr, end)) {
485
168k
    switch (BYTE_TYPE(enc, ptr)) {
486
58.2k
    case BT_DIGIT:
487
168k
    case BT_HEX:
488
168k
      break;
489
7
    default:
490
7
      *nextTokPtr = ptr;
491
7
      return XML_TOK_INVALID;
492
168k
    }
493
601k
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
494
601k
      switch (BYTE_TYPE(enc, ptr)) {
495
255k
      case BT_DIGIT:
496
433k
      case BT_HEX:
497
433k
        break;
498
168k
      case BT_SEMI:
499
168k
        *nextTokPtr = ptr + MINBPC(enc);
500
168k
        return XML_TOK_CHAR_REF;
501
6
      default:
502
6
        *nextTokPtr = ptr;
503
6
        return XML_TOK_INVALID;
504
601k
      }
505
601k
    }
506
168k
  }
507
32
  return XML_TOK_PARTIAL;
508
168k
}
xmltok.c:normal_scanHexCharRef
Line
Count
Source
483
168k
                       const char **nextTokPtr) {
484
168k
  if (HAS_CHAR(enc, ptr, end)) {
485
168k
    switch (BYTE_TYPE(enc, ptr)) {
486
58.2k
    case BT_DIGIT:
487
168k
    case BT_HEX:
488
168k
      break;
489
7
    default:
490
7
      *nextTokPtr = ptr;
491
7
      return XML_TOK_INVALID;
492
168k
    }
493
601k
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
494
601k
      switch (BYTE_TYPE(enc, ptr)) {
495
255k
      case BT_DIGIT:
496
433k
      case BT_HEX:
497
433k
        break;
498
168k
      case BT_SEMI:
499
168k
        *nextTokPtr = ptr + MINBPC(enc);
500
168k
        return XML_TOK_CHAR_REF;
501
6
      default:
502
6
        *nextTokPtr = ptr;
503
6
        return XML_TOK_INVALID;
504
601k
      }
505
601k
    }
506
168k
  }
507
32
  return XML_TOK_PARTIAL;
508
168k
}
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
177k
                    const char **nextTokPtr) {
515
177k
  if (HAS_CHAR(enc, ptr, end)) {
516
177k
    if (CHAR_MATCHES(enc, ptr, ASCII_x))
517
168k
      return PREFIX(scanHexCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
518
9.75k
    switch (BYTE_TYPE(enc, ptr)) {
519
9.73k
    case BT_DIGIT:
520
9.73k
      break;
521
14
    default:
522
14
      *nextTokPtr = ptr;
523
14
      return XML_TOK_INVALID;
524
9.75k
    }
525
30.1k
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
526
30.1k
      switch (BYTE_TYPE(enc, ptr)) {
527
20.4k
      case BT_DIGIT:
528
20.4k
        break;
529
9.71k
      case BT_SEMI:
530
9.71k
        *nextTokPtr = ptr + MINBPC(enc);
531
9.71k
        return XML_TOK_CHAR_REF;
532
3
      default:
533
3
        *nextTokPtr = ptr;
534
3
        return XML_TOK_INVALID;
535
30.1k
      }
536
30.1k
    }
537
9.73k
  }
538
22
  return XML_TOK_PARTIAL;
539
177k
}
xmltok.c:normal_scanCharRef
Line
Count
Source
514
177k
                    const char **nextTokPtr) {
515
177k
  if (HAS_CHAR(enc, ptr, end)) {
516
177k
    if (CHAR_MATCHES(enc, ptr, ASCII_x))
517
168k
      return PREFIX(scanHexCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
518
9.75k
    switch (BYTE_TYPE(enc, ptr)) {
519
9.73k
    case BT_DIGIT:
520
9.73k
      break;
521
14
    default:
522
14
      *nextTokPtr = ptr;
523
14
      return XML_TOK_INVALID;
524
9.75k
    }
525
30.1k
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
526
30.1k
      switch (BYTE_TYPE(enc, ptr)) {
527
20.4k
      case BT_DIGIT:
528
20.4k
        break;
529
9.71k
      case BT_SEMI:
530
9.71k
        *nextTokPtr = ptr + MINBPC(enc);
531
9.71k
        return XML_TOK_CHAR_REF;
532
3
      default:
533
3
        *nextTokPtr = ptr;
534
3
        return XML_TOK_INVALID;
535
30.1k
      }
536
30.1k
    }
537
9.73k
  }
538
22
  return XML_TOK_PARTIAL;
539
177k
}
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
308k
                const char **nextTokPtr) {
546
308k
  REQUIRE_CHAR(enc, ptr, end);
547
308k
  switch (BYTE_TYPE(enc, ptr)) {
548
48.8k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
549
177k
  case BT_NUM:
550
177k
    return PREFIX(scanCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
551
4
  default:
552
4
    *nextTokPtr = ptr;
553
4
    return XML_TOK_INVALID;
554
308k
  }
555
1.30M
  while (HAS_CHAR(enc, ptr, end)) {
556
1.30M
    switch (BYTE_TYPE(enc, ptr)) {
557
3.77M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
558
130k
    case BT_SEMI:
559
130k
      *nextTokPtr = ptr + MINBPC(enc);
560
130k
      return XML_TOK_ENTITY_REF;
561
14
    default:
562
14
      *nextTokPtr = ptr;
563
14
      return XML_TOK_INVALID;
564
1.30M
    }
565
1.30M
  }
566
96
  return XML_TOK_PARTIAL;
567
130k
}
xmltok.c:normal_scanRef
Line
Count
Source
545
308k
                const char **nextTokPtr) {
546
308k
  REQUIRE_CHAR(enc, ptr, end);
547
308k
  switch (BYTE_TYPE(enc, ptr)) {
548
48.8k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
549
177k
  case BT_NUM:
550
177k
    return PREFIX(scanCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
551
4
  default:
552
4
    *nextTokPtr = ptr;
553
4
    return XML_TOK_INVALID;
554
308k
  }
555
1.30M
  while (HAS_CHAR(enc, ptr, end)) {
556
1.30M
    switch (BYTE_TYPE(enc, ptr)) {
557
3.77M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
558
130k
    case BT_SEMI:
559
130k
      *nextTokPtr = ptr + MINBPC(enc);
560
130k
      return XML_TOK_ENTITY_REF;
561
14
    default:
562
14
      *nextTokPtr = ptr;
563
14
      return XML_TOK_INVALID;
564
1.30M
    }
565
1.30M
  }
566
96
  return XML_TOK_PARTIAL;
567
130k
}
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
52.4k
                 const char **nextTokPtr) {
574
#  ifdef XML_NS
575
  int hadColon = 0;
576
#  endif
577
4.33M
  while (HAS_CHAR(enc, ptr, end)) {
578
4.33M
    switch (BYTE_TYPE(enc, ptr)) {
579
3.80M
      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
4.86k
    case BT_S:
598
27.0k
    case BT_CR:
599
28.3k
    case BT_LF:
600
67.7k
      for (;;) {
601
67.7k
        int t;
602
603
67.7k
        ptr += MINBPC(enc);
604
67.7k
        REQUIRE_CHAR(enc, ptr, end);
605
67.6k
        t = BYTE_TYPE(enc, ptr);
606
67.6k
        if (t == BT_EQUALS)
607
28.2k
          break;
608
39.4k
        switch (t) {
609
6.55k
        case BT_S:
610
8.18k
        case BT_LF:
611
39.4k
        case BT_CR:
612
39.4k
          break;
613
9
        default:
614
9
          *nextTokPtr = ptr;
615
9
          return XML_TOK_INVALID;
616
39.4k
        }
617
39.4k
      }
618
      /* fall through */
619
3.12M
    case BT_EQUALS: {
620
3.12M
      int open;
621
#  ifdef XML_NS
622
      hadColon = 0;
623
#  endif
624
3.19M
      for (;;) {
625
3.19M
        ptr += MINBPC(enc);
626
3.19M
        REQUIRE_CHAR(enc, ptr, end);
627
3.19M
        open = BYTE_TYPE(enc, ptr);
628
3.19M
        if (open == BT_QUOT || open == BT_APOS)
629
3.12M
          break;
630
71.3k
        switch (open) {
631
19.0k
        case BT_S:
632
30.8k
        case BT_LF:
633
71.3k
        case BT_CR:
634
71.3k
          break;
635
15
        default:
636
15
          *nextTokPtr = ptr;
637
15
          return XML_TOK_INVALID;
638
71.3k
        }
639
71.3k
      }
640
3.12M
      ptr += MINBPC(enc);
641
      /* in attribute value */
642
23.7M
      for (;;) {
643
23.7M
        int t;
644
23.7M
        REQUIRE_CHAR(enc, ptr, end);
645
23.7M
        t = BYTE_TYPE(enc, ptr);
646
23.7M
        if (t == open)
647
3.12M
          break;
648
20.6M
        switch (t) {
649
406k
          INVALID_CASES(ptr, nextTokPtr)
650
84.4k
        case BT_AMP: {
651
84.4k
          int tok = PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, &ptr);
652
84.4k
          if (tok <= 0) {
653
34
            if (tok == XML_TOK_INVALID)
654
16
              *nextTokPtr = ptr;
655
34
            return tok;
656
34
          }
657
84.4k
          break;
658
84.4k
        }
659
84.4k
        case BT_LT:
660
3
          *nextTokPtr = ptr;
661
3
          return XML_TOK_INVALID;
662
20.3M
        default:
663
20.3M
          ptr += MINBPC(enc);
664
20.3M
          break;
665
20.6M
        }
666
20.6M
      }
667
3.12M
      ptr += MINBPC(enc);
668
3.12M
      REQUIRE_CHAR(enc, ptr, end);
669
3.12M
      switch (BYTE_TYPE(enc, ptr)) {
670
1.57M
      case BT_S:
671
3.03M
      case BT_CR:
672
3.08M
      case BT_LF:
673
3.08M
        break;
674
34.1k
      case BT_SOL:
675
34.1k
        goto sol;
676
3.57k
      case BT_GT:
677
3.57k
        goto gt;
678
9
      default:
679
9
        *nextTokPtr = ptr;
680
9
        return XML_TOK_INVALID;
681
3.12M
      }
682
      /* ptr points to closing quote */
683
3.45M
      for (;;) {
684
3.45M
        ptr += MINBPC(enc);
685
3.45M
        REQUIRE_CHAR(enc, ptr, end);
686
3.45M
        switch (BYTE_TYPE(enc, ptr)) {
687
3.06M
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
688
288k
        case BT_S:
689
338k
        case BT_CR:
690
367k
        case BT_LF:
691
367k
          continue;
692
918
        case BT_GT:
693
4.49k
        gt:
694
4.49k
          *nextTokPtr = ptr + MINBPC(enc);
695
4.49k
          return XML_TOK_START_TAG_WITH_ATTS;
696
13.2k
        case BT_SOL:
697
47.4k
        sol:
698
47.4k
          ptr += MINBPC(enc);
699
47.4k
          REQUIRE_CHAR(enc, ptr, end);
700
47.3k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
701
11
            *nextTokPtr = ptr;
702
11
            return XML_TOK_INVALID;
703
11
          }
704
47.3k
          *nextTokPtr = ptr + MINBPC(enc);
705
47.3k
          return XML_TOK_EMPTY_ELEMENT_WITH_ATTS;
706
6
        default:
707
6
          *nextTokPtr = ptr;
708
6
          return XML_TOK_INVALID;
709
3.45M
        }
710
3.07M
        break;
711
3.45M
      }
712
3.07M
      break;
713
3.08M
    }
714
3.07M
    default:
715
22
      *nextTokPtr = ptr;
716
22
      return XML_TOK_INVALID;
717
4.33M
    }
718
4.33M
  }
719
102
  return XML_TOK_PARTIAL;
720
52.4k
}
xmltok.c:normal_scanAtts
Line
Count
Source
573
52.4k
                 const char **nextTokPtr) {
574
#  ifdef XML_NS
575
  int hadColon = 0;
576
#  endif
577
4.33M
  while (HAS_CHAR(enc, ptr, end)) {
578
4.33M
    switch (BYTE_TYPE(enc, ptr)) {
579
3.80M
      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
4.86k
    case BT_S:
598
27.0k
    case BT_CR:
599
28.3k
    case BT_LF:
600
67.7k
      for (;;) {
601
67.7k
        int t;
602
603
67.7k
        ptr += MINBPC(enc);
604
67.7k
        REQUIRE_CHAR(enc, ptr, end);
605
67.6k
        t = BYTE_TYPE(enc, ptr);
606
67.6k
        if (t == BT_EQUALS)
607
28.2k
          break;
608
39.4k
        switch (t) {
609
6.55k
        case BT_S:
610
8.18k
        case BT_LF:
611
39.4k
        case BT_CR:
612
39.4k
          break;
613
9
        default:
614
9
          *nextTokPtr = ptr;
615
9
          return XML_TOK_INVALID;
616
39.4k
        }
617
39.4k
      }
618
      /* fall through */
619
3.12M
    case BT_EQUALS: {
620
3.12M
      int open;
621
#  ifdef XML_NS
622
      hadColon = 0;
623
#  endif
624
3.19M
      for (;;) {
625
3.19M
        ptr += MINBPC(enc);
626
3.19M
        REQUIRE_CHAR(enc, ptr, end);
627
3.19M
        open = BYTE_TYPE(enc, ptr);
628
3.19M
        if (open == BT_QUOT || open == BT_APOS)
629
3.12M
          break;
630
71.3k
        switch (open) {
631
19.0k
        case BT_S:
632
30.8k
        case BT_LF:
633
71.3k
        case BT_CR:
634
71.3k
          break;
635
15
        default:
636
15
          *nextTokPtr = ptr;
637
15
          return XML_TOK_INVALID;
638
71.3k
        }
639
71.3k
      }
640
3.12M
      ptr += MINBPC(enc);
641
      /* in attribute value */
642
23.7M
      for (;;) {
643
23.7M
        int t;
644
23.7M
        REQUIRE_CHAR(enc, ptr, end);
645
23.7M
        t = BYTE_TYPE(enc, ptr);
646
23.7M
        if (t == open)
647
3.12M
          break;
648
20.6M
        switch (t) {
649
406k
          INVALID_CASES(ptr, nextTokPtr)
650
84.4k
        case BT_AMP: {
651
84.4k
          int tok = PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, &ptr);
652
84.4k
          if (tok <= 0) {
653
34
            if (tok == XML_TOK_INVALID)
654
16
              *nextTokPtr = ptr;
655
34
            return tok;
656
34
          }
657
84.4k
          break;
658
84.4k
        }
659
84.4k
        case BT_LT:
660
3
          *nextTokPtr = ptr;
661
3
          return XML_TOK_INVALID;
662
20.3M
        default:
663
20.3M
          ptr += MINBPC(enc);
664
20.3M
          break;
665
20.6M
        }
666
20.6M
      }
667
3.12M
      ptr += MINBPC(enc);
668
3.12M
      REQUIRE_CHAR(enc, ptr, end);
669
3.12M
      switch (BYTE_TYPE(enc, ptr)) {
670
1.57M
      case BT_S:
671
3.03M
      case BT_CR:
672
3.08M
      case BT_LF:
673
3.08M
        break;
674
34.1k
      case BT_SOL:
675
34.1k
        goto sol;
676
3.57k
      case BT_GT:
677
3.57k
        goto gt;
678
9
      default:
679
9
        *nextTokPtr = ptr;
680
9
        return XML_TOK_INVALID;
681
3.12M
      }
682
      /* ptr points to closing quote */
683
3.45M
      for (;;) {
684
3.45M
        ptr += MINBPC(enc);
685
3.45M
        REQUIRE_CHAR(enc, ptr, end);
686
3.45M
        switch (BYTE_TYPE(enc, ptr)) {
687
3.06M
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
688
288k
        case BT_S:
689
338k
        case BT_CR:
690
367k
        case BT_LF:
691
367k
          continue;
692
918
        case BT_GT:
693
4.49k
        gt:
694
4.49k
          *nextTokPtr = ptr + MINBPC(enc);
695
4.49k
          return XML_TOK_START_TAG_WITH_ATTS;
696
13.2k
        case BT_SOL:
697
47.4k
        sol:
698
47.4k
          ptr += MINBPC(enc);
699
47.4k
          REQUIRE_CHAR(enc, ptr, end);
700
47.3k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
701
11
            *nextTokPtr = ptr;
702
11
            return XML_TOK_INVALID;
703
11
          }
704
47.3k
          *nextTokPtr = ptr + MINBPC(enc);
705
47.3k
          return XML_TOK_EMPTY_ELEMENT_WITH_ATTS;
706
6
        default:
707
6
          *nextTokPtr = ptr;
708
6
          return XML_TOK_INVALID;
709
3.45M
        }
710
3.07M
        break;
711
3.45M
      }
712
3.07M
      break;
713
3.08M
    }
714
3.07M
    default:
715
22
      *nextTokPtr = ptr;
716
22
      return XML_TOK_INVALID;
717
4.33M
    }
718
4.33M
  }
719
102
  return XML_TOK_PARTIAL;
720
52.4k
}
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
432k
               const char **nextTokPtr) {
727
#  ifdef XML_NS
728
  int hadColon;
729
#  endif
730
432k
  REQUIRE_CHAR(enc, ptr, end);
731
432k
  switch (BYTE_TYPE(enc, ptr)) {
732
280k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
733
35.2k
  case BT_EXCL:
734
35.2k
    ptr += MINBPC(enc);
735
35.2k
    REQUIRE_CHAR(enc, ptr, end);
736
35.2k
    switch (BYTE_TYPE(enc, ptr)) {
737
31.8k
    case BT_MINUS:
738
31.8k
      return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
739
3.46k
    case BT_LSQB:
740
3.46k
      return PREFIX(scanCdataSection)(enc, ptr + MINBPC(enc), end, nextTokPtr);
741
35.2k
    }
742
3
    *nextTokPtr = ptr;
743
3
    return XML_TOK_INVALID;
744
35.4k
  case BT_QUEST:
745
35.4k
    return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
746
74.3k
  case BT_SOL:
747
74.3k
    return PREFIX(scanEndTag)(enc, ptr + MINBPC(enc), end, nextTokPtr);
748
9
  default:
749
9
    *nextTokPtr = ptr;
750
9
    return XML_TOK_INVALID;
751
432k
  }
752
#  ifdef XML_NS
753
  hadColon = 0;
754
#  endif
755
  /* we have a start-tag */
756
8.46M
  while (HAS_CHAR(enc, ptr, end)) {
757
8.46M
    switch (BYTE_TYPE(enc, ptr)) {
758
32.2M
      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
31.7k
    case BT_S:
777
53.6k
    case BT_CR:
778
59.1k
    case BT_LF: {
779
59.1k
      ptr += MINBPC(enc);
780
105k
      while (HAS_CHAR(enc, ptr, end)) {
781
105k
        switch (BYTE_TYPE(enc, ptr)) {
782
47.2k
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
783
524
        case BT_GT:
784
524
          goto gt;
785
6.05k
        case BT_SOL:
786
6.05k
          goto sol;
787
9.42k
        case BT_S:
788
44.8k
        case BT_CR:
789
46.3k
        case BT_LF:
790
46.3k
          ptr += MINBPC(enc);
791
46.3k
          continue;
792
9
        default:
793
9
          *nextTokPtr = ptr;
794
9
          return XML_TOK_INVALID;
795
105k
        }
796
52.4k
        return PREFIX(scanAtts)(enc, ptr, end, nextTokPtr);
797
105k
      }
798
66
      return XML_TOK_PARTIAL;
799
59.1k
    }
800
179k
    case BT_GT:
801
179k
    gt:
802
179k
      *nextTokPtr = ptr + MINBPC(enc);
803
179k
      return XML_TOK_START_TAG_NO_ATTS;
804
48.6k
    case BT_SOL:
805
54.6k
    sol:
806
54.6k
      ptr += MINBPC(enc);
807
54.6k
      REQUIRE_CHAR(enc, ptr, end);
808
54.6k
      if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
809
13
        *nextTokPtr = ptr;
810
13
        return XML_TOK_INVALID;
811
13
      }
812
54.6k
      *nextTokPtr = ptr + MINBPC(enc);
813
54.6k
      return XML_TOK_EMPTY_ELEMENT_NO_ATTS;
814
19
    default:
815
19
      *nextTokPtr = ptr;
816
19
      return XML_TOK_INVALID;
817
8.46M
    }
818
8.46M
  }
819
166
  return XML_TOK_PARTIAL;
820
287k
}
xmltok.c:normal_scanLt
Line
Count
Source
726
432k
               const char **nextTokPtr) {
727
#  ifdef XML_NS
728
  int hadColon;
729
#  endif
730
432k
  REQUIRE_CHAR(enc, ptr, end);
731
432k
  switch (BYTE_TYPE(enc, ptr)) {
732
280k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
733
35.2k
  case BT_EXCL:
734
35.2k
    ptr += MINBPC(enc);
735
35.2k
    REQUIRE_CHAR(enc, ptr, end);
736
35.2k
    switch (BYTE_TYPE(enc, ptr)) {
737
31.8k
    case BT_MINUS:
738
31.8k
      return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
739
3.46k
    case BT_LSQB:
740
3.46k
      return PREFIX(scanCdataSection)(enc, ptr + MINBPC(enc), end, nextTokPtr);
741
35.2k
    }
742
3
    *nextTokPtr = ptr;
743
3
    return XML_TOK_INVALID;
744
35.4k
  case BT_QUEST:
745
35.4k
    return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
746
74.3k
  case BT_SOL:
747
74.3k
    return PREFIX(scanEndTag)(enc, ptr + MINBPC(enc), end, nextTokPtr);
748
9
  default:
749
9
    *nextTokPtr = ptr;
750
9
    return XML_TOK_INVALID;
751
432k
  }
752
#  ifdef XML_NS
753
  hadColon = 0;
754
#  endif
755
  /* we have a start-tag */
756
8.46M
  while (HAS_CHAR(enc, ptr, end)) {
757
8.46M
    switch (BYTE_TYPE(enc, ptr)) {
758
32.2M
      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
31.7k
    case BT_S:
777
53.6k
    case BT_CR:
778
59.1k
    case BT_LF: {
779
59.1k
      ptr += MINBPC(enc);
780
105k
      while (HAS_CHAR(enc, ptr, end)) {
781
105k
        switch (BYTE_TYPE(enc, ptr)) {
782
47.2k
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
783
524
        case BT_GT:
784
524
          goto gt;
785
6.05k
        case BT_SOL:
786
6.05k
          goto sol;
787
9.42k
        case BT_S:
788
44.8k
        case BT_CR:
789
46.3k
        case BT_LF:
790
46.3k
          ptr += MINBPC(enc);
791
46.3k
          continue;
792
9
        default:
793
9
          *nextTokPtr = ptr;
794
9
          return XML_TOK_INVALID;
795
105k
        }
796
52.4k
        return PREFIX(scanAtts)(enc, ptr, end, nextTokPtr);
797
105k
      }
798
66
      return XML_TOK_PARTIAL;
799
59.1k
    }
800
179k
    case BT_GT:
801
179k
    gt:
802
179k
      *nextTokPtr = ptr + MINBPC(enc);
803
179k
      return XML_TOK_START_TAG_NO_ATTS;
804
48.6k
    case BT_SOL:
805
54.6k
    sol:
806
54.6k
      ptr += MINBPC(enc);
807
54.6k
      REQUIRE_CHAR(enc, ptr, end);
808
54.6k
      if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
809
13
        *nextTokPtr = ptr;
810
13
        return XML_TOK_INVALID;
811
13
      }
812
54.6k
      *nextTokPtr = ptr + MINBPC(enc);
813
54.6k
      return XML_TOK_EMPTY_ELEMENT_NO_ATTS;
814
19
    default:
815
19
      *nextTokPtr = ptr;
816
19
      return XML_TOK_INVALID;
817
8.46M
    }
818
8.46M
  }
819
166
  return XML_TOK_PARTIAL;
820
287k
}
Unexecuted instantiation: xmltok.c:little2_scanLt
Unexecuted instantiation: xmltok.c:big2_scanLt
821
822
static int PTRCALL
823
PREFIX(contentTok)(const ENCODING *enc, const char *ptr, const char *end,
824
4.45M
                   const char **nextTokPtr) {
825
4.45M
  if (ptr >= end)
826
4.21k
    return XML_TOK_NONE;
827
4.45M
  if (MINBPC(enc) > 1) {
828
0
    size_t n = end - ptr;
829
0
    if (n & (MINBPC(enc) - 1)) {
830
0
      n &= ~(MINBPC(enc) - 1);
831
0
      if (n == 0)
832
0
        return XML_TOK_PARTIAL;
833
0
      end = ptr + n;
834
0
    }
835
0
  }
836
4.45M
  switch (BYTE_TYPE(enc, ptr)) {
837
432k
  case BT_LT:
838
432k
    return PREFIX(scanLt)(enc, ptr + MINBPC(enc), end, nextTokPtr);
839
49.9k
  case BT_AMP:
840
49.9k
    return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
841
1.92M
  case BT_CR:
842
1.92M
    ptr += MINBPC(enc);
843
1.92M
    if (! HAS_CHAR(enc, ptr, end))
844
18
      return XML_TOK_TRAILING_CR;
845
1.92M
    if (BYTE_TYPE(enc, ptr) == BT_LF)
846
426k
      ptr += MINBPC(enc);
847
1.92M
    *nextTokPtr = ptr;
848
1.92M
    return XML_TOK_DATA_NEWLINE;
849
1.21M
  case BT_LF:
850
1.21M
    *nextTokPtr = ptr + MINBPC(enc);
851
1.21M
    return XML_TOK_DATA_NEWLINE;
852
51.3k
  case BT_RSQB:
853
51.3k
    ptr += MINBPC(enc);
854
51.3k
    if (! HAS_CHAR(enc, ptr, end))
855
12
      return XML_TOK_TRAILING_RSQB;
856
51.3k
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
857
26.9k
      break;
858
24.4k
    ptr += MINBPC(enc);
859
24.4k
    if (! HAS_CHAR(enc, ptr, end))
860
12
      return XML_TOK_TRAILING_RSQB;
861
24.3k
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
862
24.3k
      ptr -= MINBPC(enc);
863
24.3k
      break;
864
24.3k
    }
865
1
    *nextTokPtr = ptr;
866
1
    return XML_TOK_INVALID;
867
144k
    INVALID_CASES(ptr, nextTokPtr)
868
702k
  default:
869
702k
    ptr += MINBPC(enc);
870
702k
    break;
871
4.45M
  }
872
21.8M
  while (HAS_CHAR(enc, ptr, end)) {
873
21.8M
    switch (BYTE_TYPE(enc, ptr)) {
874
0
#  define LEAD_CASE(n)                                                         \
875
244k
  case BT_LEAD##n:                                                             \
876
244k
    if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) {                       \
877
29
      *nextTokPtr = ptr;                                                       \
878
29
      return XML_TOK_DATA_CHARS;                                               \
879
29
    }                                                                          \
880
244k
    ptr += n;                                                                  \
881
244k
    break;
882
139k
      LEAD_CASE(2)
883
51.6k
      LEAD_CASE(3)
884
53.4k
      LEAD_CASE(4)
885
0
#  undef LEAD_CASE
886
504k
    case BT_RSQB:
887
504k
      if (HAS_CHARS(enc, ptr, end, 2)) {
888
504k
        if (! CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_RSQB)) {
889
150k
          ptr += MINBPC(enc);
890
150k
          break;
891
150k
        }
892
353k
        if (HAS_CHARS(enc, ptr, end, 3)) {
893
353k
          if (! CHAR_MATCHES(enc, ptr + 2 * MINBPC(enc), ASCII_GT)) {
894
353k
            ptr += MINBPC(enc);
895
353k
            break;
896
353k
          }
897
3
          *nextTokPtr = ptr + 2 * MINBPC(enc);
898
3
          return XML_TOK_INVALID;
899
353k
        }
900
353k
      }
901
      /* fall through */
902
22.4k
    case BT_AMP:
903
179k
    case BT_LT:
904
179k
    case BT_NONXML:
905
179k
    case BT_MALFORM:
906
179k
    case BT_TRAIL:
907
621k
    case BT_CR:
908
824k
    case BT_LF:
909
824k
      *nextTokPtr = ptr;
910
824k
      return XML_TOK_DATA_CHARS;
911
20.2M
    default:
912
20.2M
      ptr += MINBPC(enc);
913
20.2M
      break;
914
21.8M
    }
915
21.8M
  }
916
2.32k
  *nextTokPtr = ptr;
917
2.32k
  return XML_TOK_DATA_CHARS;
918
826k
}
xmltok.c:normal_contentTok
Line
Count
Source
824
4.45M
                   const char **nextTokPtr) {
825
4.45M
  if (ptr >= end)
826
4.21k
    return XML_TOK_NONE;
827
4.45M
  if (MINBPC(enc) > 1) {
828
0
    size_t n = end - ptr;
829
0
    if (n & (MINBPC(enc) - 1)) {
830
0
      n &= ~(MINBPC(enc) - 1);
831
0
      if (n == 0)
832
0
        return XML_TOK_PARTIAL;
833
0
      end = ptr + n;
834
0
    }
835
0
  }
836
4.45M
  switch (BYTE_TYPE(enc, ptr)) {
837
432k
  case BT_LT:
838
432k
    return PREFIX(scanLt)(enc, ptr + MINBPC(enc), end, nextTokPtr);
839
49.9k
  case BT_AMP:
840
49.9k
    return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
841
1.92M
  case BT_CR:
842
1.92M
    ptr += MINBPC(enc);
843
1.92M
    if (! HAS_CHAR(enc, ptr, end))
844
18
      return XML_TOK_TRAILING_CR;
845
1.92M
    if (BYTE_TYPE(enc, ptr) == BT_LF)
846
426k
      ptr += MINBPC(enc);
847
1.92M
    *nextTokPtr = ptr;
848
1.92M
    return XML_TOK_DATA_NEWLINE;
849
1.21M
  case BT_LF:
850
1.21M
    *nextTokPtr = ptr + MINBPC(enc);
851
1.21M
    return XML_TOK_DATA_NEWLINE;
852
51.3k
  case BT_RSQB:
853
51.3k
    ptr += MINBPC(enc);
854
51.3k
    if (! HAS_CHAR(enc, ptr, end))
855
12
      return XML_TOK_TRAILING_RSQB;
856
51.3k
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
857
26.9k
      break;
858
24.4k
    ptr += MINBPC(enc);
859
24.4k
    if (! HAS_CHAR(enc, ptr, end))
860
12
      return XML_TOK_TRAILING_RSQB;
861
24.3k
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
862
24.3k
      ptr -= MINBPC(enc);
863
24.3k
      break;
864
24.3k
    }
865
1
    *nextTokPtr = ptr;
866
1
    return XML_TOK_INVALID;
867
144k
    INVALID_CASES(ptr, nextTokPtr)
868
702k
  default:
869
702k
    ptr += MINBPC(enc);
870
702k
    break;
871
4.45M
  }
872
21.8M
  while (HAS_CHAR(enc, ptr, end)) {
873
21.8M
    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
139k
      LEAD_CASE(2)
883
51.6k
      LEAD_CASE(3)
884
53.4k
      LEAD_CASE(4)
885
0
#  undef LEAD_CASE
886
504k
    case BT_RSQB:
887
504k
      if (HAS_CHARS(enc, ptr, end, 2)) {
888
504k
        if (! CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_RSQB)) {
889
150k
          ptr += MINBPC(enc);
890
150k
          break;
891
150k
        }
892
353k
        if (HAS_CHARS(enc, ptr, end, 3)) {
893
353k
          if (! CHAR_MATCHES(enc, ptr + 2 * MINBPC(enc), ASCII_GT)) {
894
353k
            ptr += MINBPC(enc);
895
353k
            break;
896
353k
          }
897
3
          *nextTokPtr = ptr + 2 * MINBPC(enc);
898
3
          return XML_TOK_INVALID;
899
353k
        }
900
353k
      }
901
      /* fall through */
902
22.4k
    case BT_AMP:
903
179k
    case BT_LT:
904
179k
    case BT_NONXML:
905
179k
    case BT_MALFORM:
906
179k
    case BT_TRAIL:
907
621k
    case BT_CR:
908
824k
    case BT_LF:
909
824k
      *nextTokPtr = ptr;
910
824k
      return XML_TOK_DATA_CHARS;
911
20.2M
    default:
912
20.2M
      ptr += MINBPC(enc);
913
20.2M
      break;
914
21.8M
    }
915
21.8M
  }
916
2.32k
  *nextTokPtr = ptr;
917
2.32k
  return XML_TOK_DATA_CHARS;
918
826k
}
Unexecuted instantiation: xmltok.c:little2_contentTok
Unexecuted instantiation: xmltok.c:big2_contentTok
919
920
/* ptr points to character following "%" */
921
922
static int PTRCALL
923
PREFIX(scanPercent)(const ENCODING *enc, const char *ptr, const char *end,
924
8.97k
                    const char **nextTokPtr) {
925
8.97k
  REQUIRE_CHAR(enc, ptr, end);
926
8.96k
  switch (BYTE_TYPE(enc, ptr)) {
927
11.0k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
928
872
  case BT_S:
929
1.40k
  case BT_LF:
930
1.89k
  case BT_CR:
931
1.89k
  case BT_PERCNT:
932
1.89k
    *nextTokPtr = ptr;
933
1.89k
    return XML_TOK_PERCENT;
934
4
  default:
935
4
    *nextTokPtr = ptr;
936
4
    return XML_TOK_INVALID;
937
8.96k
  }
938
174k
  while (HAS_CHAR(enc, ptr, end)) {
939
174k
    switch (BYTE_TYPE(enc, ptr)) {
940
573k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
941
6.86k
    case BT_SEMI:
942
6.86k
      *nextTokPtr = ptr + MINBPC(enc);
943
6.86k
      return XML_TOK_PARAM_ENTITY_REF;
944
22
    default:
945
22
      *nextTokPtr = ptr;
946
22
      return XML_TOK_INVALID;
947
174k
    }
948
174k
  }
949
104
  return XML_TOK_PARTIAL;
950
7.03k
}
xmltok.c:normal_scanPercent
Line
Count
Source
924
8.97k
                    const char **nextTokPtr) {
925
8.97k
  REQUIRE_CHAR(enc, ptr, end);
926
8.96k
  switch (BYTE_TYPE(enc, ptr)) {
927
11.0k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
928
872
  case BT_S:
929
1.40k
  case BT_LF:
930
1.89k
  case BT_CR:
931
1.89k
  case BT_PERCNT:
932
1.89k
    *nextTokPtr = ptr;
933
1.89k
    return XML_TOK_PERCENT;
934
4
  default:
935
4
    *nextTokPtr = ptr;
936
4
    return XML_TOK_INVALID;
937
8.96k
  }
938
174k
  while (HAS_CHAR(enc, ptr, end)) {
939
174k
    switch (BYTE_TYPE(enc, ptr)) {
940
573k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
941
6.86k
    case BT_SEMI:
942
6.86k
      *nextTokPtr = ptr + MINBPC(enc);
943
6.86k
      return XML_TOK_PARAM_ENTITY_REF;
944
22
    default:
945
22
      *nextTokPtr = ptr;
946
22
      return XML_TOK_INVALID;
947
174k
    }
948
174k
  }
949
104
  return XML_TOK_PARTIAL;
950
7.03k
}
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
67.3k
                      const char **nextTokPtr) {
955
67.3k
  REQUIRE_CHAR(enc, ptr, end);
956
67.3k
  switch (BYTE_TYPE(enc, ptr)) {
957
66.9k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
958
2
  default:
959
2
    *nextTokPtr = ptr;
960
2
    return XML_TOK_INVALID;
961
67.3k
  }
962
2.56M
  while (HAS_CHAR(enc, ptr, end)) {
963
2.56M
    switch (BYTE_TYPE(enc, ptr)) {
964
8.24M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
965
56.1k
    case BT_CR:
966
64.0k
    case BT_LF:
967
64.7k
    case BT_S:
968
65.1k
    case BT_RPAR:
969
66.8k
    case BT_GT:
970
66.8k
    case BT_PERCNT:
971
67.0k
    case BT_VERBAR:
972
67.0k
      *nextTokPtr = ptr;
973
67.0k
      return XML_TOK_POUND_NAME;
974
23
    default:
975
23
      *nextTokPtr = ptr;
976
23
      return XML_TOK_INVALID;
977
2.56M
    }
978
2.56M
  }
979
238
  return -XML_TOK_POUND_NAME;
980
67.3k
}
xmltok.c:normal_scanPoundName
Line
Count
Source
954
67.3k
                      const char **nextTokPtr) {
955
67.3k
  REQUIRE_CHAR(enc, ptr, end);
956
67.3k
  switch (BYTE_TYPE(enc, ptr)) {
957
66.9k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
958
2
  default:
959
2
    *nextTokPtr = ptr;
960
2
    return XML_TOK_INVALID;
961
67.3k
  }
962
2.56M
  while (HAS_CHAR(enc, ptr, end)) {
963
2.56M
    switch (BYTE_TYPE(enc, ptr)) {
964
8.24M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
965
56.1k
    case BT_CR:
966
64.0k
    case BT_LF:
967
64.7k
    case BT_S:
968
65.1k
    case BT_RPAR:
969
66.8k
    case BT_GT:
970
66.8k
    case BT_PERCNT:
971
67.0k
    case BT_VERBAR:
972
67.0k
      *nextTokPtr = ptr;
973
67.0k
      return XML_TOK_POUND_NAME;
974
23
    default:
975
23
      *nextTokPtr = ptr;
976
23
      return XML_TOK_INVALID;
977
2.56M
    }
978
2.56M
  }
979
238
  return -XML_TOK_POUND_NAME;
980
67.3k
}
Unexecuted instantiation: xmltok.c:little2_scanPoundName
Unexecuted instantiation: xmltok.c:big2_scanPoundName
981
982
static int PTRCALL
983
PREFIX(scanLit)(int open, const ENCODING *enc, const char *ptr, const char *end,
984
35.3k
                const char **nextTokPtr) {
985
6.84M
  while (HAS_CHAR(enc, ptr, end)) {
986
6.84M
    int t = BYTE_TYPE(enc, ptr);
987
6.84M
    switch (t) {
988
127k
      INVALID_CASES(ptr, nextTokPtr)
989
12.8k
    case BT_QUOT:
990
476k
    case BT_APOS:
991
476k
      ptr += MINBPC(enc);
992
476k
      if (t != open)
993
441k
        break;
994
35.1k
      if (! HAS_CHAR(enc, ptr, end))
995
651
        return -XML_TOK_LITERAL;
996
34.5k
      *nextTokPtr = ptr;
997
34.5k
      switch (BYTE_TYPE(enc, ptr)) {
998
4.73k
      case BT_S:
999
6.32k
      case BT_CR:
1000
13.0k
      case BT_LF:
1001
34.2k
      case BT_GT:
1002
34.2k
      case BT_PERCNT:
1003
34.5k
      case BT_LSQB:
1004
34.5k
        return XML_TOK_LITERAL;
1005
21
      default:
1006
21
        return XML_TOK_INVALID;
1007
34.5k
      }
1008
6.30M
    default:
1009
6.30M
      ptr += MINBPC(enc);
1010
6.30M
      break;
1011
6.84M
    }
1012
6.84M
  }
1013
92
  return XML_TOK_PARTIAL;
1014
35.3k
}
xmltok.c:normal_scanLit
Line
Count
Source
984
35.3k
                const char **nextTokPtr) {
985
6.84M
  while (HAS_CHAR(enc, ptr, end)) {
986
6.84M
    int t = BYTE_TYPE(enc, ptr);
987
6.84M
    switch (t) {
988
127k
      INVALID_CASES(ptr, nextTokPtr)
989
12.8k
    case BT_QUOT:
990
476k
    case BT_APOS:
991
476k
      ptr += MINBPC(enc);
992
476k
      if (t != open)
993
441k
        break;
994
35.1k
      if (! HAS_CHAR(enc, ptr, end))
995
651
        return -XML_TOK_LITERAL;
996
34.5k
      *nextTokPtr = ptr;
997
34.5k
      switch (BYTE_TYPE(enc, ptr)) {
998
4.73k
      case BT_S:
999
6.32k
      case BT_CR:
1000
13.0k
      case BT_LF:
1001
34.2k
      case BT_GT:
1002
34.2k
      case BT_PERCNT:
1003
34.5k
      case BT_LSQB:
1004
34.5k
        return XML_TOK_LITERAL;
1005
21
      default:
1006
21
        return XML_TOK_INVALID;
1007
34.5k
      }
1008
6.30M
    default:
1009
6.30M
      ptr += MINBPC(enc);
1010
6.30M
      break;
1011
6.84M
    }
1012
6.84M
  }
1013
92
  return XML_TOK_PARTIAL;
1014
35.3k
}
Unexecuted instantiation: xmltok.c:little2_scanLit
Unexecuted instantiation: xmltok.c:big2_scanLit
1015
1016
static int PTRCALL
1017
PREFIX(prologTok)(const ENCODING *enc, const char *ptr, const char *end,
1018
4.02M
                  const char **nextTokPtr) {
1019
4.02M
  int tok;
1020
4.02M
  if (ptr >= end)
1021
7.56k
    return XML_TOK_NONE;
1022
4.01M
  if (MINBPC(enc) > 1) {
1023
234
    size_t n = end - ptr;
1024
234
    if (n & (MINBPC(enc) - 1)) {
1025
44
      n &= ~(MINBPC(enc) - 1);
1026
44
      if (n == 0)
1027
4
        return XML_TOK_PARTIAL;
1028
40
      end = ptr + n;
1029
40
    }
1030
234
  }
1031
4.01M
  switch (BYTE_TYPE(enc, ptr)) {
1032
6.75k
  case BT_QUOT:
1033
6.75k
    return PREFIX(scanLit)(BT_QUOT, enc, ptr + MINBPC(enc), end, nextTokPtr);
1034
28.5k
  case BT_APOS:
1035
28.5k
    return PREFIX(scanLit)(BT_APOS, enc, ptr + MINBPC(enc), end, nextTokPtr);
1036
66.8k
  case BT_LT: {
1037
66.8k
    ptr += MINBPC(enc);
1038
66.8k
    REQUIRE_CHAR(enc, ptr, end);
1039
66.8k
    switch (BYTE_TYPE(enc, ptr)) {
1040
55.1k
    case BT_EXCL:
1041
55.1k
      return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1042
6.02k
    case BT_QUEST:
1043
6.02k
      return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1044
4.44k
    case BT_NMSTRT:
1045
5.59k
    case BT_HEX:
1046
5.59k
    case BT_NONASCII:
1047
5.62k
    case BT_LEAD2:
1048
5.66k
    case BT_LEAD3:
1049
5.67k
    case BT_LEAD4:
1050
5.67k
      *nextTokPtr = ptr - MINBPC(enc);
1051
5.67k
      return XML_TOK_INSTANCE_START;
1052
66.8k
    }
1053
20
    *nextTokPtr = ptr;
1054
20
    return XML_TOK_INVALID;
1055
66.8k
  }
1056
186k
  case BT_CR:
1057
186k
    if (ptr + MINBPC(enc) == end) {
1058
475
      *nextTokPtr = end;
1059
      /* indicate that this might be part of a CR/LF pair */
1060
475
      return -XML_TOK_PROLOG_S;
1061
475
    }
1062
    /* fall through */
1063
318k
  case BT_S:
1064
363k
  case BT_LF:
1065
375k
    for (;;) {
1066
375k
      ptr += MINBPC(enc);
1067
375k
      if (! HAS_CHAR(enc, ptr, end))
1068
244
        break;
1069
374k
      switch (BYTE_TYPE(enc, ptr)) {
1070
1.18k
      case BT_S:
1071
5.54k
      case BT_LF:
1072
5.54k
        break;
1073
5.97k
      case BT_CR:
1074
        /* don't split CR/LF pair */
1075
5.97k
        if (ptr + MINBPC(enc) != end)
1076
5.76k
          break;
1077
        /* fall through */
1078
363k
      default:
1079
363k
        *nextTokPtr = ptr;
1080
363k
        return XML_TOK_PROLOG_S;
1081
374k
      }
1082
374k
    }
1083
244
    *nextTokPtr = ptr;
1084
244
    return XML_TOK_PROLOG_S;
1085
8.97k
  case BT_PERCNT:
1086
8.97k
    return PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1087
10.8k
  case BT_COMMA:
1088
10.8k
    *nextTokPtr = ptr + MINBPC(enc);
1089
10.8k
    return XML_TOK_COMMA;
1090
2.73k
  case BT_LSQB:
1091
2.73k
    *nextTokPtr = ptr + MINBPC(enc);
1092
2.73k
    return XML_TOK_OPEN_BRACKET;
1093
1.12k
  case BT_RSQB:
1094
1.12k
    ptr += MINBPC(enc);
1095
1.12k
    if (! HAS_CHAR(enc, ptr, end))
1096
3
      return -XML_TOK_CLOSE_BRACKET;
1097
1.12k
    if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) {
1098
30
      REQUIRE_CHARS(enc, ptr, end, 2);
1099
28
      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
28
    }
1104
1.12k
    *nextTokPtr = ptr;
1105
1.12k
    return XML_TOK_CLOSE_BRACKET;
1106
3.03M
  case BT_LPAR:
1107
3.03M
    *nextTokPtr = ptr + MINBPC(enc);
1108
3.03M
    return XML_TOK_OPEN_PAREN;
1109
100k
  case BT_RPAR:
1110
100k
    ptr += MINBPC(enc);
1111
100k
    if (! HAS_CHAR(enc, ptr, end))
1112
113
      return -XML_TOK_CLOSE_PAREN;
1113
100k
    switch (BYTE_TYPE(enc, ptr)) {
1114
4.73k
    case BT_AST:
1115
4.73k
      *nextTokPtr = ptr + MINBPC(enc);
1116
4.73k
      return XML_TOK_CLOSE_PAREN_ASTERISK;
1117
4.59k
    case BT_QUEST:
1118
4.59k
      *nextTokPtr = ptr + MINBPC(enc);
1119
4.59k
      return XML_TOK_CLOSE_PAREN_QUESTION;
1120
7.20k
    case BT_PLUS:
1121
7.20k
      *nextTokPtr = ptr + MINBPC(enc);
1122
7.20k
      return XML_TOK_CLOSE_PAREN_PLUS;
1123
2.56k
    case BT_CR:
1124
6.92k
    case BT_LF:
1125
63.5k
    case BT_S:
1126
65.1k
    case BT_GT:
1127
71.8k
    case BT_COMMA:
1128
80.8k
    case BT_VERBAR:
1129
84.1k
    case BT_RPAR:
1130
84.1k
      *nextTokPtr = ptr;
1131
84.1k
      return XML_TOK_CLOSE_PAREN;
1132
100k
    }
1133
11
    *nextTokPtr = ptr;
1134
11
    return XML_TOK_INVALID;
1135
18.1k
  case BT_VERBAR:
1136
18.1k
    *nextTokPtr = ptr + MINBPC(enc);
1137
18.1k
    return XML_TOK_OR;
1138
49.0k
  case BT_GT:
1139
49.0k
    *nextTokPtr = ptr + MINBPC(enc);
1140
49.0k
    return XML_TOK_DECL_CLOSE;
1141
67.3k
  case BT_NUM:
1142
67.3k
    return PREFIX(scanPoundName)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1143
0
#  define LEAD_CASE(n)                                                         \
1144
69
  case BT_LEAD##n:                                                             \
1145
4.50k
    if (end - ptr < n)                                                         \
1146
78
      return XML_TOK_PARTIAL_CHAR;                                             \
1147
4.42k
    if (IS_INVALID_CHAR(enc, ptr, n)) {                                        \
1148
90
      *nextTokPtr = ptr;                                                       \
1149
90
      return XML_TOK_INVALID;                                                  \
1150
90
    }                                                                          \
1151
4.42k
    if (IS_NMSTRT_CHAR(enc, ptr, n)) {                                         \
1152
3.76k
      ptr += n;                                                                \
1153
3.76k
      tok = XML_TOK_NAME;                                                      \
1154
3.76k
      break;                                                                   \
1155
3.76k
    }                                                                          \
1156
4.33k
    if (IS_NAME_CHAR(enc, ptr, n)) {                                           \
1157
505
      ptr += n;                                                                \
1158
505
      tok = XML_TOK_NMTOKEN;                                                   \
1159
505
      break;                                                                   \
1160
505
    }                                                                          \
1161
574
    *nextTokPtr = ptr;                                                         \
1162
69
    return XML_TOK_INVALID;
1163
1.97k
    LEAD_CASE(2)
1164
11.6k
    LEAD_CASE(3)
1165
248
    LEAD_CASE(4)
1166
0
#  undef LEAD_CASE
1167
155k
  case BT_NMSTRT:
1168
254k
  case BT_HEX:
1169
254k
    tok = XML_TOK_NAME;
1170
254k
    ptr += MINBPC(enc);
1171
254k
    break;
1172
546
  case BT_DIGIT:
1173
793
  case BT_NAME:
1174
1.47k
  case BT_MINUS:
1175
#  ifdef XML_NS
1176
  case BT_COLON:
1177
#  endif
1178
1.47k
    tok = XML_TOK_NMTOKEN;
1179
1.47k
    ptr += MINBPC(enc);
1180
1.47k
    break;
1181
185
  case BT_NONASCII:
1182
185
    if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {
1183
145
      ptr += MINBPC(enc);
1184
145
      tok = XML_TOK_NAME;
1185
145
      break;
1186
145
    }
1187
40
    if (IS_NAME_CHAR_MINBPC(enc, ptr)) {
1188
12
      ptr += MINBPC(enc);
1189
12
      tok = XML_TOK_NMTOKEN;
1190
12
      break;
1191
12
    }
1192
    /* fall through */
1193
87
  default:
1194
87
    *nextTokPtr = ptr;
1195
87
    return XML_TOK_INVALID;
1196
4.01M
  }
1197
13.0M
  while (HAS_CHAR(enc, ptr, end)) {
1198
13.0M
    switch (BYTE_TYPE(enc, ptr)) {
1199
34.4M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1200
20.2k
    case BT_GT:
1201
99.7k
    case BT_RPAR:
1202
100k
    case BT_COMMA:
1203
103k
    case BT_VERBAR:
1204
105k
    case BT_LSQB:
1205
105k
    case BT_PERCNT:
1206
148k
    case BT_S:
1207
238k
    case BT_CR:
1208
254k
    case BT_LF:
1209
254k
      *nextTokPtr = ptr;
1210
254k
      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
3.99k
    case BT_PLUS:
1232
3.99k
      if (tok == XML_TOK_NMTOKEN) {
1233
1
        *nextTokPtr = ptr;
1234
1
        return XML_TOK_INVALID;
1235
1
      }
1236
3.99k
      *nextTokPtr = ptr + MINBPC(enc);
1237
3.99k
      return XML_TOK_NAME_PLUS;
1238
620
    case BT_AST:
1239
620
      if (tok == XML_TOK_NMTOKEN) {
1240
1
        *nextTokPtr = ptr;
1241
1
        return XML_TOK_INVALID;
1242
1
      }
1243
619
      *nextTokPtr = ptr + MINBPC(enc);
1244
619
      return XML_TOK_NAME_ASTERISK;
1245
517
    case BT_QUEST:
1246
517
      if (tok == XML_TOK_NMTOKEN) {
1247
4
        *nextTokPtr = ptr;
1248
4
        return XML_TOK_INVALID;
1249
4
      }
1250
513
      *nextTokPtr = ptr + MINBPC(enc);
1251
513
      return XML_TOK_NAME_QUESTION;
1252
63
    default:
1253
63
      *nextTokPtr = ptr;
1254
63
      return XML_TOK_INVALID;
1255
13.0M
    }
1256
13.0M
  }
1257
857
  return -tok;
1258
260k
}
xmltok.c:normal_prologTok
Line
Count
Source
1018
4.02M
                  const char **nextTokPtr) {
1019
4.02M
  int tok;
1020
4.02M
  if (ptr >= end)
1021
7.56k
    return XML_TOK_NONE;
1022
4.01M
  if (MINBPC(enc) > 1) {
1023
0
    size_t n = end - ptr;
1024
0
    if (n & (MINBPC(enc) - 1)) {
1025
0
      n &= ~(MINBPC(enc) - 1);
1026
0
      if (n == 0)
1027
0
        return XML_TOK_PARTIAL;
1028
0
      end = ptr + n;
1029
0
    }
1030
0
  }
1031
4.01M
  switch (BYTE_TYPE(enc, ptr)) {
1032
6.75k
  case BT_QUOT:
1033
6.75k
    return PREFIX(scanLit)(BT_QUOT, enc, ptr + MINBPC(enc), end, nextTokPtr);
1034
28.5k
  case BT_APOS:
1035
28.5k
    return PREFIX(scanLit)(BT_APOS, enc, ptr + MINBPC(enc), end, nextTokPtr);
1036
66.8k
  case BT_LT: {
1037
66.8k
    ptr += MINBPC(enc);
1038
66.8k
    REQUIRE_CHAR(enc, ptr, end);
1039
66.8k
    switch (BYTE_TYPE(enc, ptr)) {
1040
55.1k
    case BT_EXCL:
1041
55.1k
      return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1042
6.02k
    case BT_QUEST:
1043
6.02k
      return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1044
4.44k
    case BT_NMSTRT:
1045
5.59k
    case BT_HEX:
1046
5.59k
    case BT_NONASCII:
1047
5.62k
    case BT_LEAD2:
1048
5.66k
    case BT_LEAD3:
1049
5.67k
    case BT_LEAD4:
1050
5.67k
      *nextTokPtr = ptr - MINBPC(enc);
1051
5.67k
      return XML_TOK_INSTANCE_START;
1052
66.8k
    }
1053
20
    *nextTokPtr = ptr;
1054
20
    return XML_TOK_INVALID;
1055
66.8k
  }
1056
186k
  case BT_CR:
1057
186k
    if (ptr + MINBPC(enc) == end) {
1058
475
      *nextTokPtr = end;
1059
      /* indicate that this might be part of a CR/LF pair */
1060
475
      return -XML_TOK_PROLOG_S;
1061
475
    }
1062
    /* fall through */
1063
318k
  case BT_S:
1064
363k
  case BT_LF:
1065
375k
    for (;;) {
1066
375k
      ptr += MINBPC(enc);
1067
375k
      if (! HAS_CHAR(enc, ptr, end))
1068
244
        break;
1069
374k
      switch (BYTE_TYPE(enc, ptr)) {
1070
1.18k
      case BT_S:
1071
5.54k
      case BT_LF:
1072
5.54k
        break;
1073
5.97k
      case BT_CR:
1074
        /* don't split CR/LF pair */
1075
5.97k
        if (ptr + MINBPC(enc) != end)
1076
5.76k
          break;
1077
        /* fall through */
1078
363k
      default:
1079
363k
        *nextTokPtr = ptr;
1080
363k
        return XML_TOK_PROLOG_S;
1081
374k
      }
1082
374k
    }
1083
244
    *nextTokPtr = ptr;
1084
244
    return XML_TOK_PROLOG_S;
1085
8.97k
  case BT_PERCNT:
1086
8.97k
    return PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1087
10.8k
  case BT_COMMA:
1088
10.8k
    *nextTokPtr = ptr + MINBPC(enc);
1089
10.8k
    return XML_TOK_COMMA;
1090
2.73k
  case BT_LSQB:
1091
2.73k
    *nextTokPtr = ptr + MINBPC(enc);
1092
2.73k
    return XML_TOK_OPEN_BRACKET;
1093
1.12k
  case BT_RSQB:
1094
1.12k
    ptr += MINBPC(enc);
1095
1.12k
    if (! HAS_CHAR(enc, ptr, end))
1096
3
      return -XML_TOK_CLOSE_BRACKET;
1097
1.12k
    if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) {
1098
30
      REQUIRE_CHARS(enc, ptr, end, 2);
1099
28
      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
28
    }
1104
1.12k
    *nextTokPtr = ptr;
1105
1.12k
    return XML_TOK_CLOSE_BRACKET;
1106
3.03M
  case BT_LPAR:
1107
3.03M
    *nextTokPtr = ptr + MINBPC(enc);
1108
3.03M
    return XML_TOK_OPEN_PAREN;
1109
100k
  case BT_RPAR:
1110
100k
    ptr += MINBPC(enc);
1111
100k
    if (! HAS_CHAR(enc, ptr, end))
1112
113
      return -XML_TOK_CLOSE_PAREN;
1113
100k
    switch (BYTE_TYPE(enc, ptr)) {
1114
4.73k
    case BT_AST:
1115
4.73k
      *nextTokPtr = ptr + MINBPC(enc);
1116
4.73k
      return XML_TOK_CLOSE_PAREN_ASTERISK;
1117
4.59k
    case BT_QUEST:
1118
4.59k
      *nextTokPtr = ptr + MINBPC(enc);
1119
4.59k
      return XML_TOK_CLOSE_PAREN_QUESTION;
1120
7.20k
    case BT_PLUS:
1121
7.20k
      *nextTokPtr = ptr + MINBPC(enc);
1122
7.20k
      return XML_TOK_CLOSE_PAREN_PLUS;
1123
2.56k
    case BT_CR:
1124
6.92k
    case BT_LF:
1125
63.5k
    case BT_S:
1126
65.1k
    case BT_GT:
1127
71.8k
    case BT_COMMA:
1128
80.8k
    case BT_VERBAR:
1129
84.1k
    case BT_RPAR:
1130
84.1k
      *nextTokPtr = ptr;
1131
84.1k
      return XML_TOK_CLOSE_PAREN;
1132
100k
    }
1133
11
    *nextTokPtr = ptr;
1134
11
    return XML_TOK_INVALID;
1135
18.1k
  case BT_VERBAR:
1136
18.1k
    *nextTokPtr = ptr + MINBPC(enc);
1137
18.1k
    return XML_TOK_OR;
1138
49.0k
  case BT_GT:
1139
49.0k
    *nextTokPtr = ptr + MINBPC(enc);
1140
49.0k
    return XML_TOK_DECL_CLOSE;
1141
67.3k
  case BT_NUM:
1142
67.3k
    return PREFIX(scanPoundName)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1143
0
#  define LEAD_CASE(n)                                                         \
1144
0
  case BT_LEAD##n:                                                             \
1145
0
    if (end - ptr < n)                                                         \
1146
0
      return XML_TOK_PARTIAL_CHAR;                                             \
1147
0
    if (IS_INVALID_CHAR(enc, ptr, n)) {                                        \
1148
0
      *nextTokPtr = ptr;                                                       \
1149
0
      return XML_TOK_INVALID;                                                  \
1150
0
    }                                                                          \
1151
0
    if (IS_NMSTRT_CHAR(enc, ptr, n)) {                                         \
1152
0
      ptr += n;                                                                \
1153
0
      tok = XML_TOK_NAME;                                                      \
1154
0
      break;                                                                   \
1155
0
    }                                                                          \
1156
0
    if (IS_NAME_CHAR(enc, ptr, n)) {                                           \
1157
0
      ptr += n;                                                                \
1158
0
      tok = XML_TOK_NMTOKEN;                                                   \
1159
0
      break;                                                                   \
1160
0
    }                                                                          \
1161
0
    *nextTokPtr = ptr;                                                         \
1162
0
    return XML_TOK_INVALID;
1163
1.97k
    LEAD_CASE(2)
1164
11.6k
    LEAD_CASE(3)
1165
156
    LEAD_CASE(4)
1166
0
#  undef LEAD_CASE
1167
155k
  case BT_NMSTRT:
1168
254k
  case BT_HEX:
1169
254k
    tok = XML_TOK_NAME;
1170
254k
    ptr += MINBPC(enc);
1171
254k
    break;
1172
546
  case BT_DIGIT:
1173
793
  case BT_NAME:
1174
1.47k
  case BT_MINUS:
1175
#  ifdef XML_NS
1176
  case BT_COLON:
1177
#  endif
1178
1.47k
    tok = XML_TOK_NMTOKEN;
1179
1.47k
    ptr += MINBPC(enc);
1180
1.47k
    break;
1181
0
  case BT_NONASCII:
1182
0
    if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {
1183
0
      ptr += MINBPC(enc);
1184
0
      tok = XML_TOK_NAME;
1185
0
      break;
1186
0
    }
1187
0
    if (IS_NAME_CHAR_MINBPC(enc, ptr)) {
1188
0
      ptr += MINBPC(enc);
1189
0
      tok = XML_TOK_NMTOKEN;
1190
0
      break;
1191
0
    }
1192
    /* fall through */
1193
49
  default:
1194
49
    *nextTokPtr = ptr;
1195
49
    return XML_TOK_INVALID;
1196
4.01M
  }
1197
13.0M
  while (HAS_CHAR(enc, ptr, end)) {
1198
13.0M
    switch (BYTE_TYPE(enc, ptr)) {
1199
34.3M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1200
20.2k
    case BT_GT:
1201
99.7k
    case BT_RPAR:
1202
100k
    case BT_COMMA:
1203
103k
    case BT_VERBAR:
1204
105k
    case BT_LSQB:
1205
105k
    case BT_PERCNT:
1206
148k
    case BT_S:
1207
238k
    case BT_CR:
1208
254k
    case BT_LF:
1209
254k
      *nextTokPtr = ptr;
1210
254k
      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
3.99k
    case BT_PLUS:
1232
3.99k
      if (tok == XML_TOK_NMTOKEN) {
1233
1
        *nextTokPtr = ptr;
1234
1
        return XML_TOK_INVALID;
1235
1
      }
1236
3.99k
      *nextTokPtr = ptr + MINBPC(enc);
1237
3.99k
      return XML_TOK_NAME_PLUS;
1238
620
    case BT_AST:
1239
620
      if (tok == XML_TOK_NMTOKEN) {
1240
1
        *nextTokPtr = ptr;
1241
1
        return XML_TOK_INVALID;
1242
1
      }
1243
619
      *nextTokPtr = ptr + MINBPC(enc);
1244
619
      return XML_TOK_NAME_ASTERISK;
1245
517
    case BT_QUEST:
1246
517
      if (tok == XML_TOK_NMTOKEN) {
1247
4
        *nextTokPtr = ptr;
1248
4
        return XML_TOK_INVALID;
1249
4
      }
1250
513
      *nextTokPtr = ptr + MINBPC(enc);
1251
513
      return XML_TOK_NAME_QUESTION;
1252
44
    default:
1253
44
      *nextTokPtr = ptr;
1254
44
      return XML_TOK_INVALID;
1255
13.0M
    }
1256
13.0M
  }
1257
795
  return -tok;
1258
260k
}
xmltok.c:little2_prologTok
Line
Count
Source
1018
127
                  const char **nextTokPtr) {
1019
127
  int tok;
1020
127
  if (ptr >= end)
1021
2
    return XML_TOK_NONE;
1022
125
  if (MINBPC(enc) > 1) {
1023
125
    size_t n = end - ptr;
1024
125
    if (n & (MINBPC(enc) - 1)) {
1025
25
      n &= ~(MINBPC(enc) - 1);
1026
25
      if (n == 0)
1027
2
        return XML_TOK_PARTIAL;
1028
23
      end = ptr + n;
1029
23
    }
1030
125
  }
1031
123
  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
32
    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
104
  case BT_NONASCII:
1182
104
    if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {
1183
85
      ptr += MINBPC(enc);
1184
85
      tok = XML_TOK_NAME;
1185
85
      break;
1186
85
    }
1187
19
    if (IS_NAME_CHAR_MINBPC(enc, ptr)) {
1188
4
      ptr += MINBPC(enc);
1189
4
      tok = XML_TOK_NMTOKEN;
1190
4
      break;
1191
4
    }
1192
    /* fall through */
1193
20
  default:
1194
20
    *nextTokPtr = ptr;
1195
20
    return XML_TOK_INVALID;
1196
123
  }
1197
10.9k
  while (HAS_CHAR(enc, ptr, end)) {
1198
10.9k
    switch (BYTE_TYPE(enc, ptr)) {
1199
54.3k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1200
0
    case BT_GT:
1201
0
    case BT_RPAR:
1202
0
    case BT_COMMA:
1203
0
    case BT_VERBAR:
1204
0
    case BT_LSQB:
1205
0
    case BT_PERCNT:
1206
0
    case BT_S:
1207
0
    case BT_CR:
1208
0
    case BT_LF:
1209
0
      *nextTokPtr = ptr;
1210
0
      return tok;
1211
#  ifdef XML_NS
1212
    case BT_COLON:
1213
      ptr += MINBPC(enc);
1214
      switch (tok) {
1215
      case XML_TOK_NAME:
1216
        REQUIRE_CHAR(enc, ptr, end);
1217
        tok = XML_TOK_PREFIXED_NAME;
1218
        switch (BYTE_TYPE(enc, ptr)) {
1219
          CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1220
        default:
1221
          tok = XML_TOK_NMTOKEN;
1222
          break;
1223
        }
1224
        break;
1225
      case XML_TOK_PREFIXED_NAME:
1226
        tok = XML_TOK_NMTOKEN;
1227
        break;
1228
      }
1229
      break;
1230
#  endif
1231
0
    case BT_PLUS:
1232
0
      if (tok == XML_TOK_NMTOKEN) {
1233
0
        *nextTokPtr = ptr;
1234
0
        return XML_TOK_INVALID;
1235
0
      }
1236
0
      *nextTokPtr = ptr + MINBPC(enc);
1237
0
      return XML_TOK_NAME_PLUS;
1238
0
    case BT_AST:
1239
0
      if (tok == XML_TOK_NMTOKEN) {
1240
0
        *nextTokPtr = ptr;
1241
0
        return XML_TOK_INVALID;
1242
0
      }
1243
0
      *nextTokPtr = ptr + MINBPC(enc);
1244
0
      return XML_TOK_NAME_ASTERISK;
1245
0
    case BT_QUEST:
1246
0
      if (tok == XML_TOK_NMTOKEN) {
1247
0
        *nextTokPtr = ptr;
1248
0
        return XML_TOK_INVALID;
1249
0
      }
1250
0
      *nextTokPtr = ptr + MINBPC(enc);
1251
0
      return XML_TOK_NAME_QUESTION;
1252
8
    default:
1253
8
      *nextTokPtr = ptr;
1254
8
      return XML_TOK_INVALID;
1255
10.9k
    }
1256
10.9k
  }
1257
36
  return -tok;
1258
89
}
xmltok.c:big2_prologTok
Line
Count
Source
1018
111
                  const char **nextTokPtr) {
1019
111
  int tok;
1020
111
  if (ptr >= end)
1021
2
    return XML_TOK_NONE;
1022
109
  if (MINBPC(enc) > 1) {
1023
109
    size_t n = end - ptr;
1024
109
    if (n & (MINBPC(enc) - 1)) {
1025
19
      n &= ~(MINBPC(enc) - 1);
1026
19
      if (n == 0)
1027
2
        return XML_TOK_PARTIAL;
1028
17
      end = ptr + n;
1029
17
    }
1030
109
  }
1031
107
  switch (BYTE_TYPE(enc, ptr)) {
1032
0
  case BT_QUOT:
1033
0
    return PREFIX(scanLit)(BT_QUOT, enc, ptr + MINBPC(enc), end, nextTokPtr);
1034
0
  case BT_APOS:
1035
0
    return PREFIX(scanLit)(BT_APOS, enc, ptr + MINBPC(enc), end, nextTokPtr);
1036
0
  case BT_LT: {
1037
0
    ptr += MINBPC(enc);
1038
0
    REQUIRE_CHAR(enc, ptr, end);
1039
0
    switch (BYTE_TYPE(enc, ptr)) {
1040
0
    case BT_EXCL:
1041
0
      return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1042
0
    case BT_QUEST:
1043
0
      return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1044
0
    case BT_NMSTRT:
1045
0
    case BT_HEX:
1046
0
    case BT_NONASCII:
1047
0
    case BT_LEAD2:
1048
0
    case BT_LEAD3:
1049
0
    case BT_LEAD4:
1050
0
      *nextTokPtr = ptr - MINBPC(enc);
1051
0
      return XML_TOK_INSTANCE_START;
1052
0
    }
1053
0
    *nextTokPtr = ptr;
1054
0
    return XML_TOK_INVALID;
1055
0
  }
1056
0
  case BT_CR:
1057
0
    if (ptr + MINBPC(enc) == end) {
1058
0
      *nextTokPtr = end;
1059
      /* indicate that this might be part of a CR/LF pair */
1060
0
      return -XML_TOK_PROLOG_S;
1061
0
    }
1062
    /* fall through */
1063
0
  case BT_S:
1064
0
  case BT_LF:
1065
0
    for (;;) {
1066
0
      ptr += MINBPC(enc);
1067
0
      if (! HAS_CHAR(enc, ptr, end))
1068
0
        break;
1069
0
      switch (BYTE_TYPE(enc, ptr)) {
1070
0
      case BT_S:
1071
0
      case BT_LF:
1072
0
        break;
1073
0
      case BT_CR:
1074
        /* don't split CR/LF pair */
1075
0
        if (ptr + MINBPC(enc) != end)
1076
0
          break;
1077
        /* fall through */
1078
0
      default:
1079
0
        *nextTokPtr = ptr;
1080
0
        return XML_TOK_PROLOG_S;
1081
0
      }
1082
0
    }
1083
0
    *nextTokPtr = ptr;
1084
0
    return XML_TOK_PROLOG_S;
1085
0
  case BT_PERCNT:
1086
0
    return PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1087
0
  case BT_COMMA:
1088
0
    *nextTokPtr = ptr + MINBPC(enc);
1089
0
    return XML_TOK_COMMA;
1090
0
  case BT_LSQB:
1091
0
    *nextTokPtr = ptr + MINBPC(enc);
1092
0
    return XML_TOK_OPEN_BRACKET;
1093
0
  case BT_RSQB:
1094
0
    ptr += MINBPC(enc);
1095
0
    if (! HAS_CHAR(enc, ptr, end))
1096
0
      return -XML_TOK_CLOSE_BRACKET;
1097
0
    if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) {
1098
0
      REQUIRE_CHARS(enc, ptr, end, 2);
1099
0
      if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_GT)) {
1100
0
        *nextTokPtr = ptr + 2 * MINBPC(enc);
1101
0
        return XML_TOK_COND_SECT_CLOSE;
1102
0
      }
1103
0
    }
1104
0
    *nextTokPtr = ptr;
1105
0
    return XML_TOK_CLOSE_BRACKET;
1106
0
  case BT_LPAR:
1107
0
    *nextTokPtr = ptr + MINBPC(enc);
1108
0
    return XML_TOK_OPEN_PAREN;
1109
0
  case BT_RPAR:
1110
0
    ptr += MINBPC(enc);
1111
0
    if (! HAS_CHAR(enc, ptr, end))
1112
0
      return -XML_TOK_CLOSE_PAREN;
1113
0
    switch (BYTE_TYPE(enc, ptr)) {
1114
0
    case BT_AST:
1115
0
      *nextTokPtr = ptr + MINBPC(enc);
1116
0
      return XML_TOK_CLOSE_PAREN_ASTERISK;
1117
0
    case BT_QUEST:
1118
0
      *nextTokPtr = ptr + MINBPC(enc);
1119
0
      return XML_TOK_CLOSE_PAREN_QUESTION;
1120
0
    case BT_PLUS:
1121
0
      *nextTokPtr = ptr + MINBPC(enc);
1122
0
      return XML_TOK_CLOSE_PAREN_PLUS;
1123
0
    case BT_CR:
1124
0
    case BT_LF:
1125
0
    case BT_S:
1126
0
    case BT_GT:
1127
0
    case BT_COMMA:
1128
0
    case BT_VERBAR:
1129
0
    case BT_RPAR:
1130
0
      *nextTokPtr = ptr;
1131
0
      return XML_TOK_CLOSE_PAREN;
1132
0
    }
1133
0
    *nextTokPtr = ptr;
1134
0
    return XML_TOK_INVALID;
1135
0
  case BT_VERBAR:
1136
0
    *nextTokPtr = ptr + MINBPC(enc);
1137
0
    return XML_TOK_OR;
1138
0
  case BT_GT:
1139
0
    *nextTokPtr = ptr + MINBPC(enc);
1140
0
    return XML_TOK_DECL_CLOSE;
1141
0
  case BT_NUM:
1142
0
    return PREFIX(scanPoundName)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1143
0
#  define LEAD_CASE(n)                                                         \
1144
0
  case BT_LEAD##n:                                                             \
1145
0
    if (end - ptr < n)                                                         \
1146
0
      return XML_TOK_PARTIAL_CHAR;                                             \
1147
0
    if (IS_INVALID_CHAR(enc, ptr, n)) {                                        \
1148
0
      *nextTokPtr = ptr;                                                       \
1149
0
      return XML_TOK_INVALID;                                                  \
1150
0
    }                                                                          \
1151
0
    if (IS_NMSTRT_CHAR(enc, ptr, n)) {                                         \
1152
0
      ptr += n;                                                                \
1153
0
      tok = XML_TOK_NAME;                                                      \
1154
0
      break;                                                                   \
1155
0
    }                                                                          \
1156
0
    if (IS_NAME_CHAR(enc, ptr, n)) {                                           \
1157
0
      ptr += n;                                                                \
1158
0
      tok = XML_TOK_NMTOKEN;                                                   \
1159
0
      break;                                                                   \
1160
0
    }                                                                          \
1161
0
    *nextTokPtr = ptr;                                                         \
1162
0
    return XML_TOK_INVALID;
1163
0
    LEAD_CASE(2)
1164
0
    LEAD_CASE(3)
1165
60
    LEAD_CASE(4)
1166
0
#  undef LEAD_CASE
1167
0
  case BT_NMSTRT:
1168
0
  case BT_HEX:
1169
0
    tok = XML_TOK_NAME;
1170
0
    ptr += MINBPC(enc);
1171
0
    break;
1172
0
  case BT_DIGIT:
1173
0
  case BT_NAME:
1174
0
  case BT_MINUS:
1175
#  ifdef XML_NS
1176
  case BT_COLON:
1177
#  endif
1178
0
    tok = XML_TOK_NMTOKEN;
1179
0
    ptr += MINBPC(enc);
1180
0
    break;
1181
81
  case BT_NONASCII:
1182
81
    if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {
1183
60
      ptr += MINBPC(enc);
1184
60
      tok = XML_TOK_NAME;
1185
60
      break;
1186
60
    }
1187
21
    if (IS_NAME_CHAR_MINBPC(enc, ptr)) {
1188
8
      ptr += MINBPC(enc);
1189
8
      tok = XML_TOK_NMTOKEN;
1190
8
      break;
1191
8
    }
1192
    /* fall through */
1193
18
  default:
1194
18
    *nextTokPtr = ptr;
1195
18
    return XML_TOK_INVALID;
1196
107
  }
1197
715
  while (HAS_CHAR(enc, ptr, end)) {
1198
715
    switch (BYTE_TYPE(enc, ptr)) {
1199
3.40k
      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
11
    default:
1253
11
      *nextTokPtr = ptr;
1254
11
      return XML_TOK_INVALID;
1255
715
    }
1256
715
  }
1257
26
  return -tok;
1258
68
}
1259
1260
static int PTRCALL
1261
PREFIX(attributeValueTok)(const ENCODING *enc, const char *ptr, const char *end,
1262
2.29M
                          const char **nextTokPtr) {
1263
2.29M
  const char *start;
1264
2.29M
  if (ptr >= end)
1265
81.2k
    return XML_TOK_NONE;
1266
2.21M
  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.21M
  start = ptr;
1275
22.2M
  while (HAS_CHAR(enc, ptr, end)) {
1276
22.2M
    switch (BYTE_TYPE(enc, ptr)) {
1277
0
#  define LEAD_CASE(n)                                                         \
1278
239k
  case BT_LEAD##n:                                                             \
1279
239k
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1280
239k
    break;
1281
72.8k
      LEAD_CASE(2)
1282
71.7k
      LEAD_CASE(3)
1283
94.8k
      LEAD_CASE(4)
1284
0
#  undef LEAD_CASE
1285
255k
    case BT_AMP:
1286
255k
      if (ptr == start)
1287
174k
        return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1288
80.8k
      *nextTokPtr = ptr;
1289
80.8k
      return XML_TOK_DATA_CHARS;
1290
3
    case BT_LT:
1291
      /* this is for inside entity references */
1292
3
      *nextTokPtr = ptr;
1293
3
      return XML_TOK_INVALID;
1294
678k
    case BT_LF:
1295
678k
      if (ptr == start) {
1296
560k
        *nextTokPtr = ptr + MINBPC(enc);
1297
560k
        return XML_TOK_DATA_NEWLINE;
1298
560k
      }
1299
118k
      *nextTokPtr = ptr;
1300
118k
      return XML_TOK_DATA_CHARS;
1301
953k
    case BT_CR:
1302
953k
      if (ptr == start) {
1303
719k
        ptr += MINBPC(enc);
1304
719k
        if (! HAS_CHAR(enc, ptr, end))
1305
7.08k
          return XML_TOK_TRAILING_CR;
1306
712k
        if (BYTE_TYPE(enc, ptr) == BT_LF)
1307
254k
          ptr += MINBPC(enc);
1308
712k
        *nextTokPtr = ptr;
1309
712k
        return XML_TOK_DATA_NEWLINE;
1310
719k
      }
1311
234k
      *nextTokPtr = ptr;
1312
234k
      return XML_TOK_DATA_CHARS;
1313
260k
    case BT_S:
1314
260k
      if (ptr == start) {
1315
183k
        *nextTokPtr = ptr + MINBPC(enc);
1316
183k
        return XML_TOK_ATTRIBUTE_VALUE_S;
1317
183k
      }
1318
77.1k
      *nextTokPtr = ptr;
1319
77.1k
      return XML_TOK_DATA_CHARS;
1320
19.8M
    default:
1321
19.8M
      ptr += MINBPC(enc);
1322
19.8M
      break;
1323
22.2M
    }
1324
22.2M
  }
1325
62.3k
  *nextTokPtr = ptr;
1326
62.3k
  return XML_TOK_DATA_CHARS;
1327
2.21M
}
xmltok.c:normal_attributeValueTok
Line
Count
Source
1262
2.29M
                          const char **nextTokPtr) {
1263
2.29M
  const char *start;
1264
2.29M
  if (ptr >= end)
1265
81.2k
    return XML_TOK_NONE;
1266
2.21M
  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.21M
  start = ptr;
1275
22.2M
  while (HAS_CHAR(enc, ptr, end)) {
1276
22.2M
    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
72.8k
      LEAD_CASE(2)
1282
71.7k
      LEAD_CASE(3)
1283
94.8k
      LEAD_CASE(4)
1284
0
#  undef LEAD_CASE
1285
255k
    case BT_AMP:
1286
255k
      if (ptr == start)
1287
174k
        return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1288
80.8k
      *nextTokPtr = ptr;
1289
80.8k
      return XML_TOK_DATA_CHARS;
1290
3
    case BT_LT:
1291
      /* this is for inside entity references */
1292
3
      *nextTokPtr = ptr;
1293
3
      return XML_TOK_INVALID;
1294
678k
    case BT_LF:
1295
678k
      if (ptr == start) {
1296
560k
        *nextTokPtr = ptr + MINBPC(enc);
1297
560k
        return XML_TOK_DATA_NEWLINE;
1298
560k
      }
1299
118k
      *nextTokPtr = ptr;
1300
118k
      return XML_TOK_DATA_CHARS;
1301
953k
    case BT_CR:
1302
953k
      if (ptr == start) {
1303
719k
        ptr += MINBPC(enc);
1304
719k
        if (! HAS_CHAR(enc, ptr, end))
1305
7.08k
          return XML_TOK_TRAILING_CR;
1306
712k
        if (BYTE_TYPE(enc, ptr) == BT_LF)
1307
254k
          ptr += MINBPC(enc);
1308
712k
        *nextTokPtr = ptr;
1309
712k
        return XML_TOK_DATA_NEWLINE;
1310
719k
      }
1311
234k
      *nextTokPtr = ptr;
1312
234k
      return XML_TOK_DATA_CHARS;
1313
260k
    case BT_S:
1314
260k
      if (ptr == start) {
1315
183k
        *nextTokPtr = ptr + MINBPC(enc);
1316
183k
        return XML_TOK_ATTRIBUTE_VALUE_S;
1317
183k
      }
1318
77.1k
      *nextTokPtr = ptr;
1319
77.1k
      return XML_TOK_DATA_CHARS;
1320
19.8M
    default:
1321
19.8M
      ptr += MINBPC(enc);
1322
19.8M
      break;
1323
22.2M
    }
1324
22.2M
  }
1325
62.3k
  *nextTokPtr = ptr;
1326
62.3k
  return XML_TOK_DATA_CHARS;
1327
2.21M
}
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.85k
                   const char **badPtr) {
1451
2.85k
  ptr += MINBPC(enc);
1452
2.85k
  end -= MINBPC(enc);
1453
674k
  for (; HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
1454
674k
    switch (BYTE_TYPE(enc, ptr)) {
1455
33.1k
    case BT_DIGIT:
1456
54.1k
    case BT_HEX:
1457
55.5k
    case BT_MINUS:
1458
490k
    case BT_APOS:
1459
496k
    case BT_LPAR:
1460
499k
    case BT_RPAR:
1461
516k
    case BT_PLUS:
1462
530k
    case BT_COMMA:
1463
532k
    case BT_SOL:
1464
532k
    case BT_EQUALS:
1465
533k
    case BT_QUEST:
1466
536k
    case BT_CR:
1467
538k
    case BT_LF:
1468
539k
    case BT_SEMI:
1469
540k
    case BT_EXCL:
1470
541k
    case BT_AST:
1471
543k
    case BT_PERCNT:
1472
569k
    case BT_NUM:
1473
#  ifdef XML_NS
1474
    case BT_COLON:
1475
#  endif
1476
569k
      break;
1477
1.86k
    case BT_S:
1478
1.86k
      if (CHAR_MATCHES(enc, ptr, ASCII_TAB)) {
1479
2
        *badPtr = ptr;
1480
2
        return 0;
1481
2
      }
1482
1.86k
      break;
1483
1.86k
    case BT_NAME:
1484
91.7k
    case BT_NMSTRT:
1485
91.7k
      if (! (BYTE_TO_ASCII(enc, ptr) & ~0x7f))
1486
91.7k
        break;
1487
      /* fall through */
1488
11.3k
    default:
1489
11.3k
      switch (BYTE_TO_ASCII(enc, ptr)) {
1490
357
      case 0x24: /* $ */
1491
11.3k
      case 0x40: /* @ */
1492
11.3k
        break;
1493
9
      default:
1494
9
        *badPtr = ptr;
1495
9
        return 0;
1496
11.3k
      }
1497
11.3k
      break;
1498
674k
    }
1499
674k
  }
1500
2.84k
  return 1;
1501
2.85k
}
xmltok.c:normal_isPublicId
Line
Count
Source
1450
2.85k
                   const char **badPtr) {
1451
2.85k
  ptr += MINBPC(enc);
1452
2.85k
  end -= MINBPC(enc);
1453
674k
  for (; HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
1454
674k
    switch (BYTE_TYPE(enc, ptr)) {
1455
33.1k
    case BT_DIGIT:
1456
54.1k
    case BT_HEX:
1457
55.5k
    case BT_MINUS:
1458
490k
    case BT_APOS:
1459
496k
    case BT_LPAR:
1460
499k
    case BT_RPAR:
1461
516k
    case BT_PLUS:
1462
530k
    case BT_COMMA:
1463
532k
    case BT_SOL:
1464
532k
    case BT_EQUALS:
1465
533k
    case BT_QUEST:
1466
536k
    case BT_CR:
1467
538k
    case BT_LF:
1468
539k
    case BT_SEMI:
1469
540k
    case BT_EXCL:
1470
541k
    case BT_AST:
1471
543k
    case BT_PERCNT:
1472
569k
    case BT_NUM:
1473
#  ifdef XML_NS
1474
    case BT_COLON:
1475
#  endif
1476
569k
      break;
1477
1.86k
    case BT_S:
1478
1.86k
      if (CHAR_MATCHES(enc, ptr, ASCII_TAB)) {
1479
2
        *badPtr = ptr;
1480
2
        return 0;
1481
2
      }
1482
1.86k
      break;
1483
1.86k
    case BT_NAME:
1484
91.7k
    case BT_NMSTRT:
1485
91.7k
      if (! (BYTE_TO_ASCII(enc, ptr) & ~0x7f))
1486
91.7k
        break;
1487
      /* fall through */
1488
11.3k
    default:
1489
11.3k
      switch (BYTE_TO_ASCII(enc, ptr)) {
1490
357
      case 0x24: /* $ */
1491
11.3k
      case 0x40: /* @ */
1492
11.3k
        break;
1493
9
      default:
1494
9
        *badPtr = ptr;
1495
9
        return 0;
1496
11.3k
      }
1497
11.3k
      break;
1498
674k
    }
1499
674k
  }
1500
2.84k
  return 1;
1501
2.85k
}
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
286k
                ATTRIBUTE *atts) {
1511
286k
  enum { other, inName, inValue } state = inName;
1512
286k
  int nAtts = 0;
1513
286k
  int open = 0; /* defined when state == inValue;
1514
                   initialization just to shut up compilers */
1515
1516
64.2M
  for (ptr += MINBPC(enc);; ptr += MINBPC(enc)) {
1517
64.2M
    switch (BYTE_TYPE(enc, ptr)) {
1518
0
#  define START_NAME                                                           \
1519
32.5M
    if (state == other) {                                                      \
1520
6.17M
      if (nAtts < attsMax) {                                                   \
1521
3.12M
        atts[nAtts].name = ptr;                                                \
1522
3.12M
        atts[nAtts].normalized = 1;                                            \
1523
3.12M
      }                                                                        \
1524
6.17M
      state = inName;                                                          \
1525
6.17M
    }
1526
0
#  define LEAD_CASE(n)                                                         \
1527
349k
  case BT_LEAD##n: /* NOTE: The encoding has already been validated. */        \
1528
349k
    START_NAME ptr += (n - MINBPC(enc));                                       \
1529
349k
    break;
1530
142k
      LEAD_CASE(2)
1531
148k
      LEAD_CASE(3)
1532
58.0k
      LEAD_CASE(4)
1533
0
#  undef LEAD_CASE
1534
0
    case BT_NONASCII:
1535
30.0M
    case BT_NMSTRT:
1536
32.1M
    case BT_HEX:
1537
32.1M
      START_NAME
1538
32.1M
      break;
1539
0
#  undef START_NAME
1540
904k
    case BT_QUOT:
1541
904k
      if (state != inValue) {
1542
367k
        if (nAtts < attsMax)
1543
220k
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1544
367k
        state = inValue;
1545
367k
        open = BT_QUOT;
1546
537k
      } else if (open == BT_QUOT) {
1547
367k
        state = other;
1548
367k
        if (nAtts < attsMax)
1549
220k
          atts[nAtts].valueEnd = ptr;
1550
367k
        nAtts++;
1551
367k
      }
1552
904k
      break;
1553
11.9M
    case BT_APOS:
1554
11.9M
      if (state != inValue) {
1555
5.80M
        if (nAtts < attsMax)
1556
2.90M
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1557
5.80M
        state = inValue;
1558
5.80M
        open = BT_APOS;
1559
6.17M
      } else if (open == BT_APOS) {
1560
5.80M
        state = other;
1561
5.80M
        if (nAtts < attsMax)
1562
2.90M
          atts[nAtts].valueEnd = ptr;
1563
5.80M
        nAtts++;
1564
5.80M
      }
1565
11.9M
      break;
1566
96.0k
    case BT_AMP:
1567
96.0k
      if (nAtts < attsMax)
1568
83.7k
        atts[nAtts].normalized = 0;
1569
96.0k
      break;
1570
4.17M
    case BT_S:
1571
4.17M
      if (state == inName)
1572
37.3k
        state = other;
1573
4.13M
      else if (state == inValue && nAtts < attsMax && atts[nAtts].normalized
1574
4.13M
               && (ptr == atts[nAtts].valuePtr
1575
120k
                   || BYTE_TO_ASCII(enc, ptr) != ASCII_SPACE
1576
120k
                   || BYTE_TO_ASCII(enc, ptr + MINBPC(enc)) == ASCII_SPACE
1577
120k
                   || BYTE_TYPE(enc, ptr + MINBPC(enc)) == open))
1578
114k
        atts[nAtts].normalized = 0;
1579
4.17M
      break;
1580
3.79M
    case BT_CR:
1581
4.76M
    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
4.76M
      if (state == inName)
1585
51.3k
        state = other;
1586
4.71M
      else if (state == inValue && nAtts < attsMax)
1587
1.41M
        atts[nAtts].normalized = 0;
1588
4.76M
      break;
1589
201k
    case BT_GT:
1590
375k
    case BT_SOL:
1591
375k
      if (state != inValue)
1592
286k
        return nAtts;
1593
89.1k
      break;
1594
9.40M
    default:
1595
9.40M
      break;
1596
64.2M
    }
1597
64.2M
  }
1598
  /* not reached */
1599
286k
}
xmltok.c:normal_getAtts
Line
Count
Source
1510
286k
                ATTRIBUTE *atts) {
1511
286k
  enum { other, inName, inValue } state = inName;
1512
286k
  int nAtts = 0;
1513
286k
  int open = 0; /* defined when state == inValue;
1514
                   initialization just to shut up compilers */
1515
1516
64.2M
  for (ptr += MINBPC(enc);; ptr += MINBPC(enc)) {
1517
64.2M
    switch (BYTE_TYPE(enc, ptr)) {
1518
0
#  define START_NAME                                                           \
1519
0
    if (state == other) {                                                      \
1520
0
      if (nAtts < attsMax) {                                                   \
1521
0
        atts[nAtts].name = ptr;                                                \
1522
0
        atts[nAtts].normalized = 1;                                            \
1523
0
      }                                                                        \
1524
0
      state = inName;                                                          \
1525
0
    }
1526
0
#  define LEAD_CASE(n)                                                         \
1527
0
  case BT_LEAD##n: /* NOTE: The encoding has already been validated. */        \
1528
0
    START_NAME ptr += (n - MINBPC(enc));                                       \
1529
0
    break;
1530
142k
      LEAD_CASE(2)
1531
148k
      LEAD_CASE(3)
1532
58.0k
      LEAD_CASE(4)
1533
0
#  undef LEAD_CASE
1534
0
    case BT_NONASCII:
1535
30.0M
    case BT_NMSTRT:
1536
32.1M
    case BT_HEX:
1537
32.1M
      START_NAME
1538
32.1M
      break;
1539
0
#  undef START_NAME
1540
904k
    case BT_QUOT:
1541
904k
      if (state != inValue) {
1542
367k
        if (nAtts < attsMax)
1543
220k
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1544
367k
        state = inValue;
1545
367k
        open = BT_QUOT;
1546
537k
      } else if (open == BT_QUOT) {
1547
367k
        state = other;
1548
367k
        if (nAtts < attsMax)
1549
220k
          atts[nAtts].valueEnd = ptr;
1550
367k
        nAtts++;
1551
367k
      }
1552
904k
      break;
1553
11.9M
    case BT_APOS:
1554
11.9M
      if (state != inValue) {
1555
5.80M
        if (nAtts < attsMax)
1556
2.90M
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1557
5.80M
        state = inValue;
1558
5.80M
        open = BT_APOS;
1559
6.17M
      } else if (open == BT_APOS) {
1560
5.80M
        state = other;
1561
5.80M
        if (nAtts < attsMax)
1562
2.90M
          atts[nAtts].valueEnd = ptr;
1563
5.80M
        nAtts++;
1564
5.80M
      }
1565
11.9M
      break;
1566
96.0k
    case BT_AMP:
1567
96.0k
      if (nAtts < attsMax)
1568
83.7k
        atts[nAtts].normalized = 0;
1569
96.0k
      break;
1570
4.17M
    case BT_S:
1571
4.17M
      if (state == inName)
1572
37.3k
        state = other;
1573
4.13M
      else if (state == inValue && nAtts < attsMax && atts[nAtts].normalized
1574
4.13M
               && (ptr == atts[nAtts].valuePtr
1575
120k
                   || BYTE_TO_ASCII(enc, ptr) != ASCII_SPACE
1576
120k
                   || BYTE_TO_ASCII(enc, ptr + MINBPC(enc)) == ASCII_SPACE
1577
120k
                   || BYTE_TYPE(enc, ptr + MINBPC(enc)) == open))
1578
114k
        atts[nAtts].normalized = 0;
1579
4.17M
      break;
1580
3.79M
    case BT_CR:
1581
4.76M
    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
4.76M
      if (state == inName)
1585
51.3k
        state = other;
1586
4.71M
      else if (state == inValue && nAtts < attsMax)
1587
1.41M
        atts[nAtts].normalized = 0;
1588
4.76M
      break;
1589
201k
    case BT_GT:
1590
375k
    case BT_SOL:
1591
375k
      if (state != inValue)
1592
286k
        return nAtts;
1593
89.1k
      break;
1594
9.40M
    default:
1595
9.40M
      break;
1596
64.2M
    }
1597
64.2M
  }
1598
  /* not reached */
1599
286k
}
Unexecuted instantiation: xmltok.c:little2_getAtts
Unexecuted instantiation: xmltok.c:big2_getAtts
1600
1601
static int PTRFASTCALL
1602
102k
PREFIX(charRefNumber)(const ENCODING *enc, const char *ptr) {
1603
102k
  int result = 0;
1604
  /* skip &# */
1605
102k
  UNUSED_P(enc);
1606
102k
  ptr += 2 * MINBPC(enc);
1607
102k
  if (CHAR_MATCHES(enc, ptr, ASCII_x)) {
1608
438k
    for (ptr += MINBPC(enc); ! CHAR_MATCHES(enc, ptr, ASCII_SEMI);
1609
343k
         ptr += MINBPC(enc)) {
1610
343k
      int c = BYTE_TO_ASCII(enc, ptr);
1611
343k
      switch (c) {
1612
6.03k
      case ASCII_0:
1613
32.3k
      case ASCII_1:
1614
63.3k
      case ASCII_2:
1615
65.5k
      case ASCII_3:
1616
102k
      case ASCII_4:
1617
133k
      case ASCII_5:
1618
136k
      case ASCII_6:
1619
152k
      case ASCII_7:
1620
173k
      case ASCII_8:
1621
181k
      case ASCII_9:
1622
181k
        result <<= 4;
1623
181k
        result |= (c - ASCII_0);
1624
181k
        break;
1625
43.0k
      case ASCII_A:
1626
45.5k
      case ASCII_B:
1627
50.3k
      case ASCII_C:
1628
58.7k
      case ASCII_D:
1629
75.4k
      case ASCII_E:
1630
106k
      case ASCII_F:
1631
106k
        result <<= 4;
1632
106k
        result += 10 + (c - ASCII_A);
1633
106k
        break;
1634
337
      case ASCII_a:
1635
12.6k
      case ASCII_b:
1636
15.8k
      case ASCII_c:
1637
39.4k
      case ASCII_d:
1638
43.4k
      case ASCII_e:
1639
55.6k
      case ASCII_f:
1640
55.6k
        result <<= 4;
1641
55.6k
        result += 10 + (c - ASCII_a);
1642
55.6k
        break;
1643
343k
      }
1644
343k
      if (result >= 0x110000)
1645
19
        return -1;
1646
343k
    }
1647
95.3k
  } else {
1648
30.0k
    for (; ! CHAR_MATCHES(enc, ptr, ASCII_SEMI); ptr += MINBPC(enc)) {
1649
22.8k
      int c = BYTE_TO_ASCII(enc, ptr);
1650
22.8k
      result *= 10;
1651
22.8k
      result += (c - ASCII_0);
1652
22.8k
      if (result >= 0x110000)
1653
3
        return -1;
1654
22.8k
    }
1655
7.16k
  }
1656
102k
  return checkCharRefNumber(result);
1657
102k
}
xmltok.c:normal_charRefNumber
Line
Count
Source
1602
102k
PREFIX(charRefNumber)(const ENCODING *enc, const char *ptr) {
1603
102k
  int result = 0;
1604
  /* skip &# */
1605
102k
  UNUSED_P(enc);
1606
102k
  ptr += 2 * MINBPC(enc);
1607
102k
  if (CHAR_MATCHES(enc, ptr, ASCII_x)) {
1608
438k
    for (ptr += MINBPC(enc); ! CHAR_MATCHES(enc, ptr, ASCII_SEMI);
1609
343k
         ptr += MINBPC(enc)) {
1610
343k
      int c = BYTE_TO_ASCII(enc, ptr);
1611
343k
      switch (c) {
1612
6.03k
      case ASCII_0:
1613
32.3k
      case ASCII_1:
1614
63.3k
      case ASCII_2:
1615
65.5k
      case ASCII_3:
1616
102k
      case ASCII_4:
1617
133k
      case ASCII_5:
1618
136k
      case ASCII_6:
1619
152k
      case ASCII_7:
1620
173k
      case ASCII_8:
1621
181k
      case ASCII_9:
1622
181k
        result <<= 4;
1623
181k
        result |= (c - ASCII_0);
1624
181k
        break;
1625
43.0k
      case ASCII_A:
1626
45.5k
      case ASCII_B:
1627
50.3k
      case ASCII_C:
1628
58.7k
      case ASCII_D:
1629
75.4k
      case ASCII_E:
1630
106k
      case ASCII_F:
1631
106k
        result <<= 4;
1632
106k
        result += 10 + (c - ASCII_A);
1633
106k
        break;
1634
337
      case ASCII_a:
1635
12.6k
      case ASCII_b:
1636
15.8k
      case ASCII_c:
1637
39.4k
      case ASCII_d:
1638
43.4k
      case ASCII_e:
1639
55.6k
      case ASCII_f:
1640
55.6k
        result <<= 4;
1641
55.6k
        result += 10 + (c - ASCII_a);
1642
55.6k
        break;
1643
343k
      }
1644
343k
      if (result >= 0x110000)
1645
19
        return -1;
1646
343k
    }
1647
95.3k
  } else {
1648
30.0k
    for (; ! CHAR_MATCHES(enc, ptr, ASCII_SEMI); ptr += MINBPC(enc)) {
1649
22.8k
      int c = BYTE_TO_ASCII(enc, ptr);
1650
22.8k
      result *= 10;
1651
22.8k
      result += (c - ASCII_0);
1652
22.8k
      if (result >= 0x110000)
1653
3
        return -1;
1654
22.8k
    }
1655
7.16k
  }
1656
102k
  return checkCharRefNumber(result);
1657
102k
}
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
131k
                             const char *end) {
1662
131k
  UNUSED_P(enc);
1663
131k
  switch ((end - ptr) / MINBPC(enc)) {
1664
9.24k
  case 2:
1665
9.24k
    if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_t)) {
1666
889
      switch (BYTE_TO_ASCII(enc, ptr)) {
1667
537
      case ASCII_l:
1668
537
        return ASCII_LT;
1669
168
      case ASCII_g:
1670
168
        return ASCII_GT;
1671
889
      }
1672
889
    }
1673
8.54k
    break;
1674
36.8k
  case 3:
1675
36.8k
    if (CHAR_MATCHES(enc, ptr, ASCII_a)) {
1676
28.6k
      ptr += MINBPC(enc);
1677
28.6k
      if (CHAR_MATCHES(enc, ptr, ASCII_m)) {
1678
27.4k
        ptr += MINBPC(enc);
1679
27.4k
        if (CHAR_MATCHES(enc, ptr, ASCII_p))
1680
27.1k
          return ASCII_AMP;
1681
27.4k
      }
1682
28.6k
    }
1683
9.65k
    break;
1684
9.65k
  case 4:
1685
9.55k
    switch (BYTE_TO_ASCII(enc, ptr)) {
1686
2.41k
    case ASCII_q:
1687
2.41k
      ptr += MINBPC(enc);
1688
2.41k
      if (CHAR_MATCHES(enc, ptr, ASCII_u)) {
1689
2.01k
        ptr += MINBPC(enc);
1690
2.01k
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1691
1.81k
          ptr += MINBPC(enc);
1692
1.81k
          if (CHAR_MATCHES(enc, ptr, ASCII_t))
1693
256
            return ASCII_QUOT;
1694
1.81k
        }
1695
2.01k
      }
1696
2.16k
      break;
1697
5.40k
    case ASCII_a:
1698
5.40k
      ptr += MINBPC(enc);
1699
5.40k
      if (CHAR_MATCHES(enc, ptr, ASCII_p)) {
1700
2.02k
        ptr += MINBPC(enc);
1701
2.02k
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1702
1.48k
          ptr += MINBPC(enc);
1703
1.48k
          if (CHAR_MATCHES(enc, ptr, ASCII_s))
1704
801
            return ASCII_APOS;
1705
1.48k
        }
1706
2.02k
      }
1707
4.60k
      break;
1708
9.55k
    }
1709
131k
  }
1710
102k
  return 0;
1711
131k
}
xmltok.c:normal_predefinedEntityName
Line
Count
Source
1661
131k
                             const char *end) {
1662
131k
  UNUSED_P(enc);
1663
131k
  switch ((end - ptr) / MINBPC(enc)) {
1664
9.24k
  case 2:
1665
9.24k
    if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_t)) {
1666
889
      switch (BYTE_TO_ASCII(enc, ptr)) {
1667
537
      case ASCII_l:
1668
537
        return ASCII_LT;
1669
168
      case ASCII_g:
1670
168
        return ASCII_GT;
1671
889
      }
1672
889
    }
1673
8.54k
    break;
1674
36.8k
  case 3:
1675
36.8k
    if (CHAR_MATCHES(enc, ptr, ASCII_a)) {
1676
28.6k
      ptr += MINBPC(enc);
1677
28.6k
      if (CHAR_MATCHES(enc, ptr, ASCII_m)) {
1678
27.4k
        ptr += MINBPC(enc);
1679
27.4k
        if (CHAR_MATCHES(enc, ptr, ASCII_p))
1680
27.1k
          return ASCII_AMP;
1681
27.4k
      }
1682
28.6k
    }
1683
9.65k
    break;
1684
9.65k
  case 4:
1685
9.55k
    switch (BYTE_TO_ASCII(enc, ptr)) {
1686
2.41k
    case ASCII_q:
1687
2.41k
      ptr += MINBPC(enc);
1688
2.41k
      if (CHAR_MATCHES(enc, ptr, ASCII_u)) {
1689
2.01k
        ptr += MINBPC(enc);
1690
2.01k
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1691
1.81k
          ptr += MINBPC(enc);
1692
1.81k
          if (CHAR_MATCHES(enc, ptr, ASCII_t))
1693
256
            return ASCII_QUOT;
1694
1.81k
        }
1695
2.01k
      }
1696
2.16k
      break;
1697
5.40k
    case ASCII_a:
1698
5.40k
      ptr += MINBPC(enc);
1699
5.40k
      if (CHAR_MATCHES(enc, ptr, ASCII_p)) {
1700
2.02k
        ptr += MINBPC(enc);
1701
2.02k
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1702
1.48k
          ptr += MINBPC(enc);
1703
1.48k
          if (CHAR_MATCHES(enc, ptr, ASCII_s))
1704
801
            return ASCII_APOS;
1705
1.48k
        }
1706
2.02k
      }
1707
4.60k
      break;
1708
9.55k
    }
1709
131k
  }
1710
102k
  return 0;
1711
131k
}
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
247k
                         const char *end1, const char *ptr2) {
1716
247k
  UNUSED_P(enc);
1717
1.22M
  for (; *ptr2; ptr1 += MINBPC(enc), ptr2++) {
1718
1.06M
    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
46
      return 0; /* LCOV_EXCL_LINE */
1725
46
    }
1726
1.06M
    if (! CHAR_MATCHES(enc, ptr1, *ptr2))
1727
93.4k
      return 0;
1728
1.06M
  }
1729
154k
  return ptr1 == end1;
1730
247k
}
xmltok.c:normal_nameMatchesAscii
Line
Count
Source
1715
247k
                         const char *end1, const char *ptr2) {
1716
247k
  UNUSED_P(enc);
1717
1.22M
  for (; *ptr2; ptr1 += MINBPC(enc), ptr2++) {
1718
1.06M
    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
46
      return 0; /* LCOV_EXCL_LINE */
1725
46
    }
1726
1.06M
    if (! CHAR_MATCHES(enc, ptr1, *ptr2))
1727
93.4k
      return 0;
1728
1.06M
  }
1729
154k
  return ptr1 == end1;
1730
247k
}
Unexecuted instantiation: xmltok.c:little2_nameMatchesAscii
Unexecuted instantiation: xmltok.c:big2_nameMatchesAscii
1731
1732
static int PTRFASTCALL
1733
437k
PREFIX(nameLength)(const ENCODING *enc, const char *ptr) {
1734
437k
  const char *start = ptr;
1735
12.5M
  for (;;) {
1736
12.5M
    switch (BYTE_TYPE(enc, ptr)) {
1737
0
#  define LEAD_CASE(n)                                                         \
1738
119k
  case BT_LEAD##n:                                                             \
1739
119k
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1740
119k
    break;
1741
71.8k
      LEAD_CASE(2)
1742
47.7k
      LEAD_CASE(3)
1743
0
      LEAD_CASE(4)
1744
0
#  undef LEAD_CASE
1745
0
    case BT_NONASCII:
1746
8.48M
    case BT_NMSTRT:
1747
#  ifdef XML_NS
1748
    case BT_COLON:
1749
#  endif
1750
11.7M
    case BT_HEX:
1751
11.9M
    case BT_DIGIT:
1752
11.9M
    case BT_NAME:
1753
11.9M
    case BT_MINUS:
1754
11.9M
      ptr += MINBPC(enc);
1755
11.9M
      break;
1756
437k
    default:
1757
437k
      return (int)(ptr - start);
1758
12.5M
    }
1759
12.5M
  }
1760
437k
}
xmltok.c:normal_nameLength
Line
Count
Source
1733
437k
PREFIX(nameLength)(const ENCODING *enc, const char *ptr) {
1734
437k
  const char *start = ptr;
1735
12.5M
  for (;;) {
1736
12.5M
    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
71.8k
      LEAD_CASE(2)
1742
47.7k
      LEAD_CASE(3)
1743
0
      LEAD_CASE(4)
1744
0
#  undef LEAD_CASE
1745
0
    case BT_NONASCII:
1746
8.48M
    case BT_NMSTRT:
1747
#  ifdef XML_NS
1748
    case BT_COLON:
1749
#  endif
1750
11.7M
    case BT_HEX:
1751
11.9M
    case BT_DIGIT:
1752
11.9M
    case BT_NAME:
1753
11.9M
    case BT_MINUS:
1754
11.9M
      ptr += MINBPC(enc);
1755
11.9M
      break;
1756
437k
    default:
1757
437k
      return (int)(ptr - start);
1758
12.5M
    }
1759
12.5M
  }
1760
437k
}
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
20.0k
                       POSITION *pos) {
1780
124M
  while (HAS_CHAR(enc, ptr, end)) {
1781
124M
    switch (BYTE_TYPE(enc, ptr)) {
1782
0
#  define LEAD_CASE(n)                                                         \
1783
1.72M
  case BT_LEAD##n:                                                             \
1784
1.72M
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1785
1.72M
    pos->columnNumber++;                                                       \
1786
1.72M
    break;
1787
764k
      LEAD_CASE(2)
1788
680k
      LEAD_CASE(3)
1789
277k
      LEAD_CASE(4)
1790
0
#  undef LEAD_CASE
1791
3.48M
    case BT_LF:
1792
3.48M
      pos->columnNumber = 0;
1793
3.48M
      pos->lineNumber++;
1794
3.48M
      ptr += MINBPC(enc);
1795
3.48M
      break;
1796
5.44M
    case BT_CR:
1797
5.44M
      pos->lineNumber++;
1798
5.44M
      ptr += MINBPC(enc);
1799
5.44M
      if (HAS_CHAR(enc, ptr, end) && BYTE_TYPE(enc, ptr) == BT_LF)
1800
1.30M
        ptr += MINBPC(enc);
1801
5.44M
      pos->columnNumber = 0;
1802
5.44M
      break;
1803
113M
    default:
1804
113M
      ptr += MINBPC(enc);
1805
113M
      pos->columnNumber++;
1806
113M
      break;
1807
124M
    }
1808
124M
  }
1809
20.0k
}
xmltok.c:normal_updatePosition
Line
Count
Source
1779
19.6k
                       POSITION *pos) {
1780
124M
  while (HAS_CHAR(enc, ptr, end)) {
1781
124M
    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
764k
      LEAD_CASE(2)
1788
680k
      LEAD_CASE(3)
1789
277k
      LEAD_CASE(4)
1790
0
#  undef LEAD_CASE
1791
3.48M
    case BT_LF:
1792
3.48M
      pos->columnNumber = 0;
1793
3.48M
      pos->lineNumber++;
1794
3.48M
      ptr += MINBPC(enc);
1795
3.48M
      break;
1796
5.44M
    case BT_CR:
1797
5.44M
      pos->lineNumber++;
1798
5.44M
      ptr += MINBPC(enc);
1799
5.44M
      if (HAS_CHAR(enc, ptr, end) && BYTE_TYPE(enc, ptr) == BT_LF)
1800
1.30M
        ptr += MINBPC(enc);
1801
5.44M
      pos->columnNumber = 0;
1802
5.44M
      break;
1803
113M
    default:
1804
113M
      ptr += MINBPC(enc);
1805
113M
      pos->columnNumber++;
1806
113M
      break;
1807
124M
    }
1808
124M
  }
1809
19.6k
}
xmltok.c:little2_updatePosition
Line
Count
Source
1779
226
                       POSITION *pos) {
1780
10.0k
  while (HAS_CHAR(enc, ptr, end)) {
1781
10.0k
    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
10.0k
    default:
1804
10.0k
      ptr += MINBPC(enc);
1805
10.0k
      pos->columnNumber++;
1806
10.0k
      break;
1807
10.0k
    }
1808
10.0k
  }
1809
226
}
xmltok.c:big2_updatePosition
Line
Count
Source
1779
199
                       POSITION *pos) {
1780
531
  while (HAS_CHAR(enc, ptr, end)) {
1781
531
    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
531
    default:
1804
531
      ptr += MINBPC(enc);
1805
531
      pos->columnNumber++;
1806
531
      break;
1807
531
    }
1808
531
  }
1809
199
}
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 */