Coverage Report

Created: 2025-08-25 06:42

/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
32
#    define IS_INVALID_CHAR(enc, ptr, n) (0)
46
#  endif
47
48
#  define INVALID_LEAD_CASE(n, ptr, nextTokPtr)                                \
49
844k
  case BT_LEAD##n:                                                             \
50
844k
    if (end - ptr < n)                                                         \
51
844k
      return XML_TOK_PARTIAL_CHAR;                                             \
52
844k
    if (IS_INVALID_CHAR(enc, ptr, n)) {                                        \
53
82
      *(nextTokPtr) = (ptr);                                                   \
54
82
      return XML_TOK_INVALID;                                                  \
55
82
    }                                                                          \
56
844k
    ptr += n;                                                                  \
57
844k
    break;
58
59
#  define INVALID_CASES(ptr, nextTokPtr)                                       \
60
293k
    INVALID_LEAD_CASE(2, ptr, nextTokPtr)                                      \
61
353k
    INVALID_LEAD_CASE(3, ptr, nextTokPtr)                                      \
62
353k
    INVALID_LEAD_CASE(4, ptr, nextTokPtr)                                      \
63
197k
  case BT_NONXML:                                                              \
64
54
  case BT_MALFORM:                                                             \
65
91
  case BT_TRAIL:                                                               \
66
91
    *(nextTokPtr) = (ptr);                                                     \
67
91
    return XML_TOK_INVALID;
68
69
#  define CHECK_NAME_CASE(n, enc, ptr, end, nextTokPtr)                        \
70
460k
  case BT_LEAD##n:                                                             \
71
461k
    if (end - ptr < n)                                                         \
72
460k
      return XML_TOK_PARTIAL_CHAR;                                             \
73
461k
    if (IS_INVALID_CHAR(enc, ptr, n) || ! IS_NAME_CHAR(enc, ptr, n)) {         \
74
219
      *nextTokPtr = ptr;                                                       \
75
219
      return XML_TOK_INVALID;                                                  \
76
219
    }                                                                          \
77
461k
    ptr += n;                                                                  \
78
460k
    break;
79
80
#  define CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)                          \
81
29.2M
  case BT_NONASCII:                                                            \
82
29.2M
    if (! IS_NAME_CHAR_MINBPC(enc, ptr)) {                                     \
83
55
      *nextTokPtr = ptr;                                                       \
84
55
      return XML_TOK_INVALID;                                                  \
85
55
    }                                                                          \
86
29.2M
    /* fall through */                                                         \
87
29.2M
  case BT_NMSTRT:                                                              \
88
24.3M
  case BT_HEX:                                                                 \
89
28.7M
  case BT_DIGIT:                                                               \
90
28.8M
  case BT_NAME:                                                                \
91
29.2M
  case BT_MINUS:                                                               \
92
29.2M
    ptr += MINBPC(enc);                                                        \
93
29.2M
    break;                                                                     \
94
29.2M
    CHECK_NAME_CASE(2, enc, ptr, end, nextTokPtr)                              \
95
281k
    CHECK_NAME_CASE(3, enc, ptr, end, nextTokPtr)                              \
96
281k
    CHECK_NAME_CASE(4, enc, ptr, end, nextTokPtr)
97
98
#  define CHECK_NMSTRT_CASE(n, enc, ptr, end, nextTokPtr)                      \
99
136k
  case BT_LEAD##n:                                                             \
100
136k
    if ((end) - (ptr) < (n))                                                   \
101
136k
      return XML_TOK_PARTIAL_CHAR;                                             \
102
136k
    if (IS_INVALID_CHAR(enc, ptr, n) || ! IS_NMSTRT_CHAR(enc, ptr, n)) {       \
103
135
      *nextTokPtr = ptr;                                                       \
104
135
      return XML_TOK_INVALID;                                                  \
105
135
    }                                                                          \
106
136k
    ptr += n;                                                                  \
107
136k
    break;
108
109
#  define CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)                        \
110
3.54M
  case BT_NONASCII:                                                            \
111
3.54M
    if (! IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {                                   \
112
0
      *nextTokPtr = ptr;                                                       \
113
0
      return XML_TOK_INVALID;                                                  \
114
0
    }                                                                          \
115
3.54M
    /* fall through */                                                         \
116
3.54M
  case BT_NMSTRT:                                                              \
117
3.54M
  case BT_HEX:                                                                 \
118
3.54M
    ptr += MINBPC(enc);                                                        \
119
3.54M
    break;                                                                     \
120
3.54M
    CHECK_NMSTRT_CASE(2, enc, ptr, end, nextTokPtr)                            \
121
73.6k
    CHECK_NMSTRT_CASE(3, enc, ptr, end, nextTokPtr)                            \
122
73.6k
    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
311M
    ((end) - (ptr) >= ((count) * MINBPC(enc)))
130
131
10.8M
#  define HAS_CHAR(enc, ptr, end) HAS_CHARS(enc, ptr, end, 1)
132
133
#  define REQUIRE_CHARS(enc, ptr, end, count)                                  \
134
36.9M
    {                                                                          \
135
36.9M
      if (! HAS_CHARS(enc, ptr, end, count)) {                                 \
136
509
        return XML_TOK_PARTIAL;                                                \
137
509
      }                                                                        \
138
36.9M
    }
139
140
36.9M
#  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
21.1k
                    const char **nextTokPtr) {
147
21.1k
  if (HAS_CHAR(enc, ptr, end)) {
148
21.1k
    if (! CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
149
11
      *nextTokPtr = ptr;
150
11
      return XML_TOK_INVALID;
151
11
    }
152
21.1k
    ptr += MINBPC(enc);
153
5.96M
    while (HAS_CHAR(enc, ptr, end)) {
154
5.96M
      switch (BYTE_TYPE(enc, ptr)) {
155
335k
        INVALID_CASES(ptr, nextTokPtr)
156
45.8k
      case BT_MINUS:
157
45.8k
        ptr += MINBPC(enc);
158
45.8k
        REQUIRE_CHAR(enc, ptr, end);
159
45.8k
        if (CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
160
21.0k
          ptr += MINBPC(enc);
161
21.0k
          REQUIRE_CHAR(enc, ptr, end);
162
21.0k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
163
12
            *nextTokPtr = ptr;
164
12
            return XML_TOK_INVALID;
165
12
          }
166
21.0k
          *nextTokPtr = ptr + MINBPC(enc);
167
21.0k
          return XML_TOK_COMMENT;
168
21.0k
        }
169
24.8k
        break;
170
5.75M
      default:
171
5.75M
        ptr += MINBPC(enc);
172
5.75M
        break;
173
5.96M
      }
174
5.96M
    }
175
21.1k
  }
176
78
  return XML_TOK_PARTIAL;
177
21.1k
}
xmltok.c:normal_scanComment
Line
Count
Source
146
21.1k
                    const char **nextTokPtr) {
147
21.1k
  if (HAS_CHAR(enc, ptr, end)) {
148
21.1k
    if (! CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
149
11
      *nextTokPtr = ptr;
150
11
      return XML_TOK_INVALID;
151
11
    }
152
21.1k
    ptr += MINBPC(enc);
153
5.96M
    while (HAS_CHAR(enc, ptr, end)) {
154
5.96M
      switch (BYTE_TYPE(enc, ptr)) {
155
335k
        INVALID_CASES(ptr, nextTokPtr)
156
45.8k
      case BT_MINUS:
157
45.8k
        ptr += MINBPC(enc);
158
45.8k
        REQUIRE_CHAR(enc, ptr, end);
159
45.8k
        if (CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
160
21.0k
          ptr += MINBPC(enc);
161
21.0k
          REQUIRE_CHAR(enc, ptr, end);
162
21.0k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
163
12
            *nextTokPtr = ptr;
164
12
            return XML_TOK_INVALID;
165
12
          }
166
21.0k
          *nextTokPtr = ptr + MINBPC(enc);
167
21.0k
          return XML_TOK_COMMENT;
168
21.0k
        }
169
24.8k
        break;
170
5.75M
      default:
171
5.75M
        ptr += MINBPC(enc);
172
5.75M
        break;
173
5.96M
      }
174
5.96M
    }
175
21.1k
  }
176
78
  return XML_TOK_PARTIAL;
177
21.1k
}
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
65.2k
                 const char **nextTokPtr) {
184
65.2k
  REQUIRE_CHAR(enc, ptr, end);
185
65.2k
  switch (BYTE_TYPE(enc, ptr)) {
186
2.74k
  case BT_MINUS:
187
2.74k
    return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
188
3
  case BT_LSQB:
189
3
    *nextTokPtr = ptr + MINBPC(enc);
190
3
    return XML_TOK_COND_SECT_OPEN;
191
1.17k
  case BT_NMSTRT:
192
62.4k
  case BT_HEX:
193
62.4k
    ptr += MINBPC(enc);
194
62.4k
    break;
195
3
  default:
196
3
    *nextTokPtr = ptr;
197
3
    return XML_TOK_INVALID;
198
65.2k
  }
199
441k
  while (HAS_CHAR(enc, ptr, end)) {
200
441k
    switch (BYTE_TYPE(enc, ptr)) {
201
24
    case BT_PERCNT:
202
24
      REQUIRE_CHARS(enc, ptr, end, 2);
203
      /* don't allow <!ENTITY% foo "whatever"> */
204
20
      switch (BYTE_TYPE(enc, ptr + MINBPC(enc))) {
205
1
      case BT_S:
206
2
      case BT_CR:
207
3
      case BT_LF:
208
4
      case BT_PERCNT:
209
4
        *nextTokPtr = ptr;
210
4
        return XML_TOK_INVALID;
211
20
      }
212
      /* fall through */
213
22.1k
    case BT_S:
214
58.5k
    case BT_CR:
215
62.4k
    case BT_LF:
216
62.4k
      *nextTokPtr = ptr;
217
62.4k
      return XML_TOK_DECL_OPEN;
218
348k
    case BT_NMSTRT:
219
379k
    case BT_HEX:
220
379k
      ptr += MINBPC(enc);
221
379k
      break;
222
10
    default:
223
10
      *nextTokPtr = ptr;
224
10
      return XML_TOK_INVALID;
225
441k
    }
226
441k
  }
227
74
  return XML_TOK_PARTIAL;
228
62.4k
}
xmltok.c:normal_scanDecl
Line
Count
Source
183
65.2k
                 const char **nextTokPtr) {
184
65.2k
  REQUIRE_CHAR(enc, ptr, end);
185
65.2k
  switch (BYTE_TYPE(enc, ptr)) {
186
2.74k
  case BT_MINUS:
187
2.74k
    return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
188
3
  case BT_LSQB:
189
3
    *nextTokPtr = ptr + MINBPC(enc);
190
3
    return XML_TOK_COND_SECT_OPEN;
191
1.17k
  case BT_NMSTRT:
192
62.4k
  case BT_HEX:
193
62.4k
    ptr += MINBPC(enc);
194
62.4k
    break;
195
3
  default:
196
3
    *nextTokPtr = ptr;
197
3
    return XML_TOK_INVALID;
198
65.2k
  }
199
441k
  while (HAS_CHAR(enc, ptr, end)) {
200
441k
    switch (BYTE_TYPE(enc, ptr)) {
201
24
    case BT_PERCNT:
202
24
      REQUIRE_CHARS(enc, ptr, end, 2);
203
      /* don't allow <!ENTITY% foo "whatever"> */
204
20
      switch (BYTE_TYPE(enc, ptr + MINBPC(enc))) {
205
1
      case BT_S:
206
2
      case BT_CR:
207
3
      case BT_LF:
208
4
      case BT_PERCNT:
209
4
        *nextTokPtr = ptr;
210
4
        return XML_TOK_INVALID;
211
20
      }
212
      /* fall through */
213
22.1k
    case BT_S:
214
58.5k
    case BT_CR:
215
62.4k
    case BT_LF:
216
62.4k
      *nextTokPtr = ptr;
217
62.4k
      return XML_TOK_DECL_OPEN;
218
348k
    case BT_NMSTRT:
219
379k
    case BT_HEX:
220
379k
      ptr += MINBPC(enc);
221
379k
      break;
222
10
    default:
223
10
      *nextTokPtr = ptr;
224
10
      return XML_TOK_INVALID;
225
441k
    }
226
441k
  }
227
74
  return XML_TOK_PARTIAL;
228
62.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
37.9k
                      int *tokPtr) {
233
37.9k
  int upper = 0;
234
37.9k
  UNUSED_P(enc);
235
37.9k
  *tokPtr = XML_TOK_PI;
236
37.9k
  if (end - ptr != MINBPC(enc) * 3)
237
27.3k
    return 1;
238
10.5k
  switch (BYTE_TO_ASCII(enc, ptr)) {
239
6.61k
  case ASCII_x:
240
6.61k
    break;
241
817
  case ASCII_X:
242
817
    upper = 1;
243
817
    break;
244
3.12k
  default:
245
3.12k
    return 1;
246
10.5k
  }
247
7.43k
  ptr += MINBPC(enc);
248
7.43k
  switch (BYTE_TO_ASCII(enc, ptr)) {
249
2.77k
  case ASCII_m:
250
2.77k
    break;
251
480
  case ASCII_M:
252
480
    upper = 1;
253
480
    break;
254
4.18k
  default:
255
4.18k
    return 1;
256
7.43k
  }
257
3.25k
  ptr += MINBPC(enc);
258
3.25k
  switch (BYTE_TO_ASCII(enc, ptr)) {
259
1.12k
  case ASCII_l:
260
1.12k
    break;
261
4
  case ASCII_L:
262
4
    upper = 1;
263
4
    break;
264
2.12k
  default:
265
2.12k
    return 1;
266
3.25k
  }
267
1.12k
  if (upper)
268
7
    return 0;
269
1.12k
  *tokPtr = XML_TOK_XML_DECL;
270
1.12k
  return 1;
271
1.12k
}
xmltok.c:normal_checkPiTarget
Line
Count
Source
232
37.9k
                      int *tokPtr) {
233
37.9k
  int upper = 0;
234
37.9k
  UNUSED_P(enc);
235
37.9k
  *tokPtr = XML_TOK_PI;
236
37.9k
  if (end - ptr != MINBPC(enc) * 3)
237
27.3k
    return 1;
238
10.5k
  switch (BYTE_TO_ASCII(enc, ptr)) {
239
6.61k
  case ASCII_x:
240
6.61k
    break;
241
817
  case ASCII_X:
242
817
    upper = 1;
243
817
    break;
244
3.12k
  default:
245
3.12k
    return 1;
246
10.5k
  }
247
7.43k
  ptr += MINBPC(enc);
248
7.43k
  switch (BYTE_TO_ASCII(enc, ptr)) {
249
2.77k
  case ASCII_m:
250
2.77k
    break;
251
480
  case ASCII_M:
252
480
    upper = 1;
253
480
    break;
254
4.18k
  default:
255
4.18k
    return 1;
256
7.43k
  }
257
3.25k
  ptr += MINBPC(enc);
258
3.25k
  switch (BYTE_TO_ASCII(enc, ptr)) {
259
1.12k
  case ASCII_l:
260
1.12k
    break;
261
4
  case ASCII_L:
262
4
    upper = 1;
263
4
    break;
264
2.12k
  default:
265
2.12k
    return 1;
266
3.25k
  }
267
1.12k
  if (upper)
268
7
    return 0;
269
1.12k
  *tokPtr = XML_TOK_XML_DECL;
270
1.12k
  return 1;
271
1.12k
}
Unexecuted instantiation: xmltok.c:little2_checkPiTarget
Unexecuted instantiation: xmltok.c:big2_checkPiTarget
272
273
/* ptr points to character following "<?" */
274
275
static int PTRCALL
276
PREFIX(scanPi)(const ENCODING *enc, const char *ptr, const char *end,
277
38.1k
               const char **nextTokPtr) {
278
38.1k
  int tok;
279
38.1k
  const char *target = ptr;
280
38.1k
  REQUIRE_CHAR(enc, ptr, end);
281
38.0k
  switch (BYTE_TYPE(enc, ptr)) {
282
50.1k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
283
2
  default:
284
2
    *nextTokPtr = ptr;
285
2
    return XML_TOK_INVALID;
286
38.0k
  }
287
3.28M
  while (HAS_CHAR(enc, ptr, end)) {
288
3.28M
    switch (BYTE_TYPE(enc, ptr)) {
289
11.9M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
290
7.19k
    case BT_S:
291
9.30k
    case BT_CR:
292
13.6k
    case BT_LF:
293
13.6k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
294
3
        *nextTokPtr = ptr;
295
3
        return XML_TOK_INVALID;
296
3
      }
297
13.6k
      ptr += MINBPC(enc);
298
9.75M
      while (HAS_CHAR(enc, ptr, end)) {
299
9.75M
        switch (BYTE_TYPE(enc, ptr)) {
300
327k
          INVALID_CASES(ptr, nextTokPtr)
301
55.5k
        case BT_QUEST:
302
55.5k
          ptr += MINBPC(enc);
303
55.5k
          REQUIRE_CHAR(enc, ptr, end);
304
55.5k
          if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
305
13.4k
            *nextTokPtr = ptr + MINBPC(enc);
306
13.4k
            return tok;
307
13.4k
          }
308
42.1k
          break;
309
9.53M
        default:
310
9.53M
          ptr += MINBPC(enc);
311
9.53M
          break;
312
9.75M
        }
313
9.75M
      }
314
90
      return XML_TOK_PARTIAL;
315
24.3k
    case BT_QUEST:
316
24.3k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
317
4
        *nextTokPtr = ptr;
318
4
        return XML_TOK_INVALID;
319
4
      }
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.2k
        *nextTokPtr = ptr + MINBPC(enc);
324
24.2k
        return tok;
325
24.2k
      }
326
      /* fall through */
327
23
    default:
328
23
      *nextTokPtr = ptr;
329
23
      return XML_TOK_INVALID;
330
3.28M
    }
331
3.28M
  }
332
52
  return XML_TOK_PARTIAL;
333
38.0k
}
xmltok.c:normal_scanPi
Line
Count
Source
277
38.1k
               const char **nextTokPtr) {
278
38.1k
  int tok;
279
38.1k
  const char *target = ptr;
280
38.1k
  REQUIRE_CHAR(enc, ptr, end);
281
38.0k
  switch (BYTE_TYPE(enc, ptr)) {
282
50.1k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
283
2
  default:
284
2
    *nextTokPtr = ptr;
285
2
    return XML_TOK_INVALID;
286
38.0k
  }
287
3.28M
  while (HAS_CHAR(enc, ptr, end)) {
288
3.28M
    switch (BYTE_TYPE(enc, ptr)) {
289
11.9M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
290
7.19k
    case BT_S:
291
9.30k
    case BT_CR:
292
13.6k
    case BT_LF:
293
13.6k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
294
3
        *nextTokPtr = ptr;
295
3
        return XML_TOK_INVALID;
296
3
      }
297
13.6k
      ptr += MINBPC(enc);
298
9.75M
      while (HAS_CHAR(enc, ptr, end)) {
299
9.75M
        switch (BYTE_TYPE(enc, ptr)) {
300
327k
          INVALID_CASES(ptr, nextTokPtr)
301
55.5k
        case BT_QUEST:
302
55.5k
          ptr += MINBPC(enc);
303
55.5k
          REQUIRE_CHAR(enc, ptr, end);
304
55.5k
          if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
305
13.4k
            *nextTokPtr = ptr + MINBPC(enc);
306
13.4k
            return tok;
307
13.4k
          }
308
42.1k
          break;
309
9.53M
        default:
310
9.53M
          ptr += MINBPC(enc);
311
9.53M
          break;
312
9.75M
        }
313
9.75M
      }
314
90
      return XML_TOK_PARTIAL;
315
24.3k
    case BT_QUEST:
316
24.3k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
317
4
        *nextTokPtr = ptr;
318
4
        return XML_TOK_INVALID;
319
4
      }
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.2k
        *nextTokPtr = ptr + MINBPC(enc);
324
24.2k
        return tok;
325
24.2k
      }
326
      /* fall through */
327
23
    default:
328
23
      *nextTokPtr = ptr;
329
23
      return XML_TOK_INVALID;
330
3.28M
    }
331
3.28M
  }
332
52
  return XML_TOK_PARTIAL;
333
38.0k
}
Unexecuted instantiation: xmltok.c:little2_scanPi
Unexecuted instantiation: xmltok.c:big2_scanPi
334
335
static int PTRCALL
336
PREFIX(scanCdataSection)(const ENCODING *enc, const char *ptr, const char *end,
337
1.47k
                         const char **nextTokPtr) {
338
1.47k
  static const char CDATA_LSQB[]
339
1.47k
      = {ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, ASCII_LSQB};
340
1.47k
  int i;
341
1.47k
  UNUSED_P(enc);
342
  /* CDATA[ */
343
1.47k
  REQUIRE_CHARS(enc, ptr, end, 6);
344
10.0k
  for (i = 0; i < 6; i++, ptr += MINBPC(enc)) {
345
8.63k
    if (! CHAR_MATCHES(enc, ptr, CDATA_LSQB[i])) {
346
48
      *nextTokPtr = ptr;
347
48
      return XML_TOK_INVALID;
348
48
    }
349
8.63k
  }
350
1.41k
  *nextTokPtr = ptr;
351
1.41k
  return XML_TOK_CDATA_SECT_OPEN;
352
1.46k
}
xmltok.c:normal_scanCdataSection
Line
Count
Source
337
1.47k
                         const char **nextTokPtr) {
338
1.47k
  static const char CDATA_LSQB[]
339
1.47k
      = {ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, ASCII_LSQB};
340
1.47k
  int i;
341
1.47k
  UNUSED_P(enc);
342
  /* CDATA[ */
343
1.47k
  REQUIRE_CHARS(enc, ptr, end, 6);
344
10.0k
  for (i = 0; i < 6; i++, ptr += MINBPC(enc)) {
345
8.63k
    if (! CHAR_MATCHES(enc, ptr, CDATA_LSQB[i])) {
346
48
      *nextTokPtr = ptr;
347
48
      return XML_TOK_INVALID;
348
48
    }
349
8.63k
  }
350
1.41k
  *nextTokPtr = ptr;
351
1.41k
  return XML_TOK_CDATA_SECT_OPEN;
352
1.46k
}
Unexecuted instantiation: xmltok.c:little2_scanCdataSection
Unexecuted instantiation: xmltok.c:big2_scanCdataSection
353
354
static int PTRCALL
355
PREFIX(cdataSectionTok)(const ENCODING *enc, const char *ptr, const char *end,
356
2.99M
                        const char **nextTokPtr) {
357
2.99M
  if (ptr >= end)
358
162
    return XML_TOK_NONE;
359
2.99M
  if (MINBPC(enc) > 1) {
360
0
    size_t n = end - ptr;
361
0
    if (n & (MINBPC(enc) - 1)) {
362
0
      n &= ~(MINBPC(enc) - 1);
363
0
      if (n == 0)
364
0
        return XML_TOK_PARTIAL;
365
0
      end = ptr + n;
366
0
    }
367
0
  }
368
2.99M
  switch (BYTE_TYPE(enc, ptr)) {
369
506k
  case BT_RSQB:
370
506k
    ptr += MINBPC(enc);
371
506k
    REQUIRE_CHAR(enc, ptr, end);
372
506k
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
373
209k
      break;
374
296k
    ptr += MINBPC(enc);
375
296k
    REQUIRE_CHAR(enc, ptr, end);
376
296k
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
377
295k
      ptr -= MINBPC(enc);
378
295k
      break;
379
295k
    }
380
1.28k
    *nextTokPtr = ptr + MINBPC(enc);
381
1.28k
    return XML_TOK_CDATA_SECT_CLOSE;
382
1.21M
  case BT_CR:
383
1.21M
    ptr += MINBPC(enc);
384
1.21M
    REQUIRE_CHAR(enc, ptr, end);
385
1.21M
    if (BYTE_TYPE(enc, ptr) == BT_LF)
386
158k
      ptr += MINBPC(enc);
387
1.21M
    *nextTokPtr = ptr;
388
1.21M
    return XML_TOK_DATA_NEWLINE;
389
570k
  case BT_LF:
390
570k
    *nextTokPtr = ptr + MINBPC(enc);
391
570k
    return XML_TOK_DATA_NEWLINE;
392
570k
    INVALID_CASES(ptr, nextTokPtr)
393
653k
  default:
394
653k
    ptr += MINBPC(enc);
395
653k
    break;
396
2.99M
  }
397
26.2M
  while (HAS_CHAR(enc, ptr, end)) {
398
26.2M
    switch (BYTE_TYPE(enc, ptr)) {
399
0
#  define LEAD_CASE(n)                                                         \
400
508k
  case BT_LEAD##n:                                                             \
401
508k
    if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) {                       \
402
16
      *nextTokPtr = ptr;                                                       \
403
16
      return XML_TOK_DATA_CHARS;                                               \
404
16
    }                                                                          \
405
508k
    ptr += n;                                                                  \
406
508k
    break;
407
250k
      LEAD_CASE(2)
408
222k
      LEAD_CASE(3)
409
34.3k
      LEAD_CASE(4)
410
0
#  undef LEAD_CASE
411
4
    case BT_NONXML:
412
5
    case BT_MALFORM:
413
12
    case BT_TRAIL:
414
522k
    case BT_CR:
415
752k
    case BT_LF:
416
1.20M
    case BT_RSQB:
417
1.20M
      *nextTokPtr = ptr;
418
1.20M
      return XML_TOK_DATA_CHARS;
419
24.5M
    default:
420
24.5M
      ptr += MINBPC(enc);
421
24.5M
      break;
422
26.2M
    }
423
26.2M
  }
424
59
  *nextTokPtr = ptr;
425
59
  return XML_TOK_DATA_CHARS;
426
1.20M
}
xmltok.c:normal_cdataSectionTok
Line
Count
Source
356
2.99M
                        const char **nextTokPtr) {
357
2.99M
  if (ptr >= end)
358
162
    return XML_TOK_NONE;
359
2.99M
  if (MINBPC(enc) > 1) {
360
0
    size_t n = end - ptr;
361
0
    if (n & (MINBPC(enc) - 1)) {
362
0
      n &= ~(MINBPC(enc) - 1);
363
0
      if (n == 0)
364
0
        return XML_TOK_PARTIAL;
365
0
      end = ptr + n;
366
0
    }
367
0
  }
368
2.99M
  switch (BYTE_TYPE(enc, ptr)) {
369
506k
  case BT_RSQB:
370
506k
    ptr += MINBPC(enc);
371
506k
    REQUIRE_CHAR(enc, ptr, end);
372
506k
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
373
209k
      break;
374
296k
    ptr += MINBPC(enc);
375
296k
    REQUIRE_CHAR(enc, ptr, end);
376
296k
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
377
295k
      ptr -= MINBPC(enc);
378
295k
      break;
379
295k
    }
380
1.28k
    *nextTokPtr = ptr + MINBPC(enc);
381
1.28k
    return XML_TOK_CDATA_SECT_CLOSE;
382
1.21M
  case BT_CR:
383
1.21M
    ptr += MINBPC(enc);
384
1.21M
    REQUIRE_CHAR(enc, ptr, end);
385
1.21M
    if (BYTE_TYPE(enc, ptr) == BT_LF)
386
158k
      ptr += MINBPC(enc);
387
1.21M
    *nextTokPtr = ptr;
388
1.21M
    return XML_TOK_DATA_NEWLINE;
389
570k
  case BT_LF:
390
570k
    *nextTokPtr = ptr + MINBPC(enc);
391
570k
    return XML_TOK_DATA_NEWLINE;
392
570k
    INVALID_CASES(ptr, nextTokPtr)
393
653k
  default:
394
653k
    ptr += MINBPC(enc);
395
653k
    break;
396
2.99M
  }
397
26.2M
  while (HAS_CHAR(enc, ptr, end)) {
398
26.2M
    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
250k
      LEAD_CASE(2)
408
222k
      LEAD_CASE(3)
409
34.3k
      LEAD_CASE(4)
410
0
#  undef LEAD_CASE
411
4
    case BT_NONXML:
412
5
    case BT_MALFORM:
413
12
    case BT_TRAIL:
414
522k
    case BT_CR:
415
752k
    case BT_LF:
416
1.20M
    case BT_RSQB:
417
1.20M
      *nextTokPtr = ptr;
418
1.20M
      return XML_TOK_DATA_CHARS;
419
24.5M
    default:
420
24.5M
      ptr += MINBPC(enc);
421
24.5M
      break;
422
26.2M
    }
423
26.2M
  }
424
59
  *nextTokPtr = ptr;
425
59
  return XML_TOK_DATA_CHARS;
426
1.20M
}
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
42.2k
                   const char **nextTokPtr) {
433
42.2k
  REQUIRE_CHAR(enc, ptr, end);
434
42.2k
  switch (BYTE_TYPE(enc, ptr)) {
435
53.4k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
436
6
  default:
437
6
    *nextTokPtr = ptr;
438
6
    return XML_TOK_INVALID;
439
42.2k
  }
440
335k
  while (HAS_CHAR(enc, ptr, end)) {
441
335k
    switch (BYTE_TYPE(enc, ptr)) {
442
866k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
443
664
    case BT_S:
444
1.08k
    case BT_CR:
445
1.43k
    case BT_LF:
446
3.81k
      for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
447
3.81k
        switch (BYTE_TYPE(enc, ptr)) {
448
1.17k
        case BT_S:
449
2.03k
        case BT_CR:
450
2.42k
        case BT_LF:
451
2.42k
          break;
452
1.39k
        case BT_GT:
453
1.39k
          *nextTokPtr = ptr + MINBPC(enc);
454
1.39k
          return XML_TOK_END_TAG;
455
4
        default:
456
4
          *nextTokPtr = ptr;
457
4
          return XML_TOK_INVALID;
458
3.81k
        }
459
3.81k
      }
460
42
      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
40.6k
    case BT_GT:
469
40.6k
      *nextTokPtr = ptr + MINBPC(enc);
470
40.6k
      return XML_TOK_END_TAG;
471
14
    default:
472
14
      *nextTokPtr = ptr;
473
14
      return XML_TOK_INVALID;
474
335k
    }
475
335k
  }
476
100
  return XML_TOK_PARTIAL;
477
42.2k
}
xmltok.c:normal_scanEndTag
Line
Count
Source
432
42.2k
                   const char **nextTokPtr) {
433
42.2k
  REQUIRE_CHAR(enc, ptr, end);
434
42.2k
  switch (BYTE_TYPE(enc, ptr)) {
435
53.4k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
436
6
  default:
437
6
    *nextTokPtr = ptr;
438
6
    return XML_TOK_INVALID;
439
42.2k
  }
440
335k
  while (HAS_CHAR(enc, ptr, end)) {
441
335k
    switch (BYTE_TYPE(enc, ptr)) {
442
866k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
443
664
    case BT_S:
444
1.08k
    case BT_CR:
445
1.43k
    case BT_LF:
446
3.81k
      for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
447
3.81k
        switch (BYTE_TYPE(enc, ptr)) {
448
1.17k
        case BT_S:
449
2.03k
        case BT_CR:
450
2.42k
        case BT_LF:
451
2.42k
          break;
452
1.39k
        case BT_GT:
453
1.39k
          *nextTokPtr = ptr + MINBPC(enc);
454
1.39k
          return XML_TOK_END_TAG;
455
4
        default:
456
4
          *nextTokPtr = ptr;
457
4
          return XML_TOK_INVALID;
458
3.81k
        }
459
3.81k
      }
460
42
      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
40.6k
    case BT_GT:
469
40.6k
      *nextTokPtr = ptr + MINBPC(enc);
470
40.6k
      return XML_TOK_END_TAG;
471
14
    default:
472
14
      *nextTokPtr = ptr;
473
14
      return XML_TOK_INVALID;
474
335k
    }
475
335k
  }
476
100
  return XML_TOK_PARTIAL;
477
42.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
235k
                       const char **nextTokPtr) {
484
235k
  if (HAS_CHAR(enc, ptr, end)) {
485
235k
    switch (BYTE_TYPE(enc, ptr)) {
486
86.8k
    case BT_DIGIT:
487
235k
    case BT_HEX:
488
235k
      break;
489
6
    default:
490
6
      *nextTokPtr = ptr;
491
6
      return XML_TOK_INVALID;
492
235k
    }
493
851k
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
494
851k
      switch (BYTE_TYPE(enc, ptr)) {
495
414k
      case BT_DIGIT:
496
616k
      case BT_HEX:
497
616k
        break;
498
235k
      case BT_SEMI:
499
235k
        *nextTokPtr = ptr + MINBPC(enc);
500
235k
        return XML_TOK_CHAR_REF;
501
1
      default:
502
1
        *nextTokPtr = ptr;
503
1
        return XML_TOK_INVALID;
504
851k
      }
505
851k
    }
506
235k
  }
507
17
  return XML_TOK_PARTIAL;
508
235k
}
xmltok.c:normal_scanHexCharRef
Line
Count
Source
483
235k
                       const char **nextTokPtr) {
484
235k
  if (HAS_CHAR(enc, ptr, end)) {
485
235k
    switch (BYTE_TYPE(enc, ptr)) {
486
86.8k
    case BT_DIGIT:
487
235k
    case BT_HEX:
488
235k
      break;
489
6
    default:
490
6
      *nextTokPtr = ptr;
491
6
      return XML_TOK_INVALID;
492
235k
    }
493
851k
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
494
851k
      switch (BYTE_TYPE(enc, ptr)) {
495
414k
      case BT_DIGIT:
496
616k
      case BT_HEX:
497
616k
        break;
498
235k
      case BT_SEMI:
499
235k
        *nextTokPtr = ptr + MINBPC(enc);
500
235k
        return XML_TOK_CHAR_REF;
501
1
      default:
502
1
        *nextTokPtr = ptr;
503
1
        return XML_TOK_INVALID;
504
851k
      }
505
851k
    }
506
235k
  }
507
17
  return XML_TOK_PARTIAL;
508
235k
}
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
238k
                    const char **nextTokPtr) {
515
238k
  if (HAS_CHAR(enc, ptr, end)) {
516
238k
    if (CHAR_MATCHES(enc, ptr, ASCII_x))
517
235k
      return PREFIX(scanHexCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
518
3.84k
    switch (BYTE_TYPE(enc, ptr)) {
519
3.83k
    case BT_DIGIT:
520
3.83k
      break;
521
11
    default:
522
11
      *nextTokPtr = ptr;
523
11
      return XML_TOK_INVALID;
524
3.84k
    }
525
12.2k
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
526
12.2k
      switch (BYTE_TYPE(enc, ptr)) {
527
8.41k
      case BT_DIGIT:
528
8.41k
        break;
529
3.81k
      case BT_SEMI:
530
3.81k
        *nextTokPtr = ptr + MINBPC(enc);
531
3.81k
        return XML_TOK_CHAR_REF;
532
3
      default:
533
3
        *nextTokPtr = ptr;
534
3
        return XML_TOK_INVALID;
535
12.2k
      }
536
12.2k
    }
537
3.83k
  }
538
20
  return XML_TOK_PARTIAL;
539
238k
}
xmltok.c:normal_scanCharRef
Line
Count
Source
514
238k
                    const char **nextTokPtr) {
515
238k
  if (HAS_CHAR(enc, ptr, end)) {
516
238k
    if (CHAR_MATCHES(enc, ptr, ASCII_x))
517
235k
      return PREFIX(scanHexCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
518
3.84k
    switch (BYTE_TYPE(enc, ptr)) {
519
3.83k
    case BT_DIGIT:
520
3.83k
      break;
521
11
    default:
522
11
      *nextTokPtr = ptr;
523
11
      return XML_TOK_INVALID;
524
3.84k
    }
525
12.2k
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
526
12.2k
      switch (BYTE_TYPE(enc, ptr)) {
527
8.41k
      case BT_DIGIT:
528
8.41k
        break;
529
3.81k
      case BT_SEMI:
530
3.81k
        *nextTokPtr = ptr + MINBPC(enc);
531
3.81k
        return XML_TOK_CHAR_REF;
532
3
      default:
533
3
        *nextTokPtr = ptr;
534
3
        return XML_TOK_INVALID;
535
12.2k
      }
536
12.2k
    }
537
3.83k
  }
538
20
  return XML_TOK_PARTIAL;
539
238k
}
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
399k
                const char **nextTokPtr) {
546
399k
  REQUIRE_CHAR(enc, ptr, end);
547
399k
  switch (BYTE_TYPE(enc, ptr)) {
548
79.3k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
549
238k
  case BT_NUM:
550
238k
    return PREFIX(scanCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
551
3
  default:
552
3
    *nextTokPtr = ptr;
553
3
    return XML_TOK_INVALID;
554
399k
  }
555
604k
  while (HAS_CHAR(enc, ptr, end)) {
556
604k
    switch (BYTE_TYPE(enc, ptr)) {
557
1.64M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
558
160k
    case BT_SEMI:
559
160k
      *nextTokPtr = ptr + MINBPC(enc);
560
160k
      return XML_TOK_ENTITY_REF;
561
15
    default:
562
15
      *nextTokPtr = ptr;
563
15
      return XML_TOK_INVALID;
564
604k
    }
565
604k
  }
566
75
  return XML_TOK_PARTIAL;
567
160k
}
xmltok.c:normal_scanRef
Line
Count
Source
545
399k
                const char **nextTokPtr) {
546
399k
  REQUIRE_CHAR(enc, ptr, end);
547
399k
  switch (BYTE_TYPE(enc, ptr)) {
548
79.3k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
549
238k
  case BT_NUM:
550
238k
    return PREFIX(scanCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
551
3
  default:
552
3
    *nextTokPtr = ptr;
553
3
    return XML_TOK_INVALID;
554
399k
  }
555
604k
  while (HAS_CHAR(enc, ptr, end)) {
556
604k
    switch (BYTE_TYPE(enc, ptr)) {
557
1.64M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
558
160k
    case BT_SEMI:
559
160k
      *nextTokPtr = ptr + MINBPC(enc);
560
160k
      return XML_TOK_ENTITY_REF;
561
15
    default:
562
15
      *nextTokPtr = ptr;
563
15
      return XML_TOK_INVALID;
564
604k
    }
565
604k
  }
566
75
  return XML_TOK_PARTIAL;
567
160k
}
Unexecuted instantiation: xmltok.c:little2_scanRef
Unexecuted instantiation: xmltok.c:big2_scanRef
568
569
/* ptr points to character following first character of attribute name */
570
571
static int PTRCALL
572
PREFIX(scanAtts)(const ENCODING *enc, const char *ptr, const char *end,
573
142k
                 const char **nextTokPtr) {
574
#  ifdef XML_NS
575
  int hadColon = 0;
576
#  endif
577
3.71M
  while (HAS_CHAR(enc, ptr, end)) {
578
3.71M
    switch (BYTE_TYPE(enc, ptr)) {
579
2.29M
      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
1.77k
    case BT_S:
598
17.9k
    case BT_CR:
599
19.1k
    case BT_LF:
600
39.2k
      for (;;) {
601
39.2k
        int t;
602
603
39.2k
        ptr += MINBPC(enc);
604
39.2k
        REQUIRE_CHAR(enc, ptr, end);
605
39.2k
        t = BYTE_TYPE(enc, ptr);
606
39.2k
        if (t == BT_EQUALS)
607
19.0k
          break;
608
20.1k
        switch (t) {
609
2.98k
        case BT_S:
610
4.20k
        case BT_LF:
611
20.1k
        case BT_CR:
612
20.1k
          break;
613
8
        default:
614
8
          *nextTokPtr = ptr;
615
8
          return XML_TOK_INVALID;
616
20.1k
        }
617
20.1k
      }
618
      /* fall through */
619
2.94M
    case BT_EQUALS: {
620
2.94M
      int open;
621
#  ifdef XML_NS
622
      hadColon = 0;
623
#  endif
624
3.00M
      for (;;) {
625
3.00M
        ptr += MINBPC(enc);
626
3.00M
        REQUIRE_CHAR(enc, ptr, end);
627
3.00M
        open = BYTE_TYPE(enc, ptr);
628
3.00M
        if (open == BT_QUOT || open == BT_APOS)
629
2.94M
          break;
630
63.9k
        switch (open) {
631
11.3k
        case BT_S:
632
22.8k
        case BT_LF:
633
63.9k
        case BT_CR:
634
63.9k
          break;
635
16
        default:
636
16
          *nextTokPtr = ptr;
637
16
          return XML_TOK_INVALID;
638
63.9k
        }
639
63.9k
      }
640
2.94M
      ptr += MINBPC(enc);
641
      /* in attribute value */
642
24.0M
      for (;;) {
643
24.0M
        int t;
644
24.0M
        REQUIRE_CHAR(enc, ptr, end);
645
24.0M
        t = BYTE_TYPE(enc, ptr);
646
24.0M
        if (t == open)
647
2.94M
          break;
648
21.1M
        switch (t) {
649
436k
          INVALID_CASES(ptr, nextTokPtr)
650
117k
        case BT_AMP: {
651
117k
          int tok = PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, &ptr);
652
117k
          if (tok <= 0) {
653
26
            if (tok == XML_TOK_INVALID)
654
8
              *nextTokPtr = ptr;
655
26
            return tok;
656
26
          }
657
117k
          break;
658
117k
        }
659
117k
        case BT_LT:
660
6
          *nextTokPtr = ptr;
661
6
          return XML_TOK_INVALID;
662
20.8M
        default:
663
20.8M
          ptr += MINBPC(enc);
664
20.8M
          break;
665
21.1M
        }
666
21.1M
      }
667
2.94M
      ptr += MINBPC(enc);
668
2.94M
      REQUIRE_CHAR(enc, ptr, end);
669
2.94M
      switch (BYTE_TYPE(enc, ptr)) {
670
1.54M
      case BT_S:
671
2.88M
      case BT_CR:
672
2.91M
      case BT_LF:
673
2.91M
        break;
674
26.7k
      case BT_SOL:
675
26.7k
        goto sol;
676
4.25k
      case BT_GT:
677
4.25k
        goto gt;
678
7
      default:
679
7
        *nextTokPtr = ptr;
680
7
        return XML_TOK_INVALID;
681
2.94M
      }
682
      /* ptr points to closing quote */
683
3.27M
      for (;;) {
684
3.27M
        ptr += MINBPC(enc);
685
3.27M
        REQUIRE_CHAR(enc, ptr, end);
686
3.27M
        switch (BYTE_TYPE(enc, ptr)) {
687
2.79M
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
688
270k
        case BT_S:
689
315k
        case BT_CR:
690
366k
        case BT_LF:
691
366k
          continue;
692
197
        case BT_GT:
693
4.45k
        gt:
694
4.45k
          *nextTokPtr = ptr + MINBPC(enc);
695
4.45k
          return XML_TOK_START_TAG_WITH_ATTS;
696
111k
        case BT_SOL:
697
137k
        sol:
698
137k
          ptr += MINBPC(enc);
699
137k
          REQUIRE_CHAR(enc, ptr, end);
700
137k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
701
8
            *nextTokPtr = ptr;
702
8
            return XML_TOK_INVALID;
703
8
          }
704
137k
          *nextTokPtr = ptr + MINBPC(enc);
705
137k
          return XML_TOK_EMPTY_ELEMENT_WITH_ATTS;
706
5
        default:
707
5
          *nextTokPtr = ptr;
708
5
          return XML_TOK_INVALID;
709
3.27M
        }
710
2.79M
        break;
711
3.27M
      }
712
2.79M
      break;
713
2.91M
    }
714
2.79M
    default:
715
18
      *nextTokPtr = ptr;
716
18
      return XML_TOK_INVALID;
717
3.71M
    }
718
3.71M
  }
719
78
  return XML_TOK_PARTIAL;
720
142k
}
xmltok.c:normal_scanAtts
Line
Count
Source
573
142k
                 const char **nextTokPtr) {
574
#  ifdef XML_NS
575
  int hadColon = 0;
576
#  endif
577
3.71M
  while (HAS_CHAR(enc, ptr, end)) {
578
3.71M
    switch (BYTE_TYPE(enc, ptr)) {
579
2.29M
      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
1.77k
    case BT_S:
598
17.9k
    case BT_CR:
599
19.1k
    case BT_LF:
600
39.2k
      for (;;) {
601
39.2k
        int t;
602
603
39.2k
        ptr += MINBPC(enc);
604
39.2k
        REQUIRE_CHAR(enc, ptr, end);
605
39.2k
        t = BYTE_TYPE(enc, ptr);
606
39.2k
        if (t == BT_EQUALS)
607
19.0k
          break;
608
20.1k
        switch (t) {
609
2.98k
        case BT_S:
610
4.20k
        case BT_LF:
611
20.1k
        case BT_CR:
612
20.1k
          break;
613
8
        default:
614
8
          *nextTokPtr = ptr;
615
8
          return XML_TOK_INVALID;
616
20.1k
        }
617
20.1k
      }
618
      /* fall through */
619
2.94M
    case BT_EQUALS: {
620
2.94M
      int open;
621
#  ifdef XML_NS
622
      hadColon = 0;
623
#  endif
624
3.00M
      for (;;) {
625
3.00M
        ptr += MINBPC(enc);
626
3.00M
        REQUIRE_CHAR(enc, ptr, end);
627
3.00M
        open = BYTE_TYPE(enc, ptr);
628
3.00M
        if (open == BT_QUOT || open == BT_APOS)
629
2.94M
          break;
630
63.9k
        switch (open) {
631
11.3k
        case BT_S:
632
22.8k
        case BT_LF:
633
63.9k
        case BT_CR:
634
63.9k
          break;
635
16
        default:
636
16
          *nextTokPtr = ptr;
637
16
          return XML_TOK_INVALID;
638
63.9k
        }
639
63.9k
      }
640
2.94M
      ptr += MINBPC(enc);
641
      /* in attribute value */
642
24.0M
      for (;;) {
643
24.0M
        int t;
644
24.0M
        REQUIRE_CHAR(enc, ptr, end);
645
24.0M
        t = BYTE_TYPE(enc, ptr);
646
24.0M
        if (t == open)
647
2.94M
          break;
648
21.1M
        switch (t) {
649
436k
          INVALID_CASES(ptr, nextTokPtr)
650
117k
        case BT_AMP: {
651
117k
          int tok = PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, &ptr);
652
117k
          if (tok <= 0) {
653
26
            if (tok == XML_TOK_INVALID)
654
8
              *nextTokPtr = ptr;
655
26
            return tok;
656
26
          }
657
117k
          break;
658
117k
        }
659
117k
        case BT_LT:
660
6
          *nextTokPtr = ptr;
661
6
          return XML_TOK_INVALID;
662
20.8M
        default:
663
20.8M
          ptr += MINBPC(enc);
664
20.8M
          break;
665
21.1M
        }
666
21.1M
      }
667
2.94M
      ptr += MINBPC(enc);
668
2.94M
      REQUIRE_CHAR(enc, ptr, end);
669
2.94M
      switch (BYTE_TYPE(enc, ptr)) {
670
1.54M
      case BT_S:
671
2.88M
      case BT_CR:
672
2.91M
      case BT_LF:
673
2.91M
        break;
674
26.7k
      case BT_SOL:
675
26.7k
        goto sol;
676
4.25k
      case BT_GT:
677
4.25k
        goto gt;
678
7
      default:
679
7
        *nextTokPtr = ptr;
680
7
        return XML_TOK_INVALID;
681
2.94M
      }
682
      /* ptr points to closing quote */
683
3.27M
      for (;;) {
684
3.27M
        ptr += MINBPC(enc);
685
3.27M
        REQUIRE_CHAR(enc, ptr, end);
686
3.27M
        switch (BYTE_TYPE(enc, ptr)) {
687
2.79M
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
688
270k
        case BT_S:
689
315k
        case BT_CR:
690
366k
        case BT_LF:
691
366k
          continue;
692
197
        case BT_GT:
693
4.45k
        gt:
694
4.45k
          *nextTokPtr = ptr + MINBPC(enc);
695
4.45k
          return XML_TOK_START_TAG_WITH_ATTS;
696
111k
        case BT_SOL:
697
137k
        sol:
698
137k
          ptr += MINBPC(enc);
699
137k
          REQUIRE_CHAR(enc, ptr, end);
700
137k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
701
8
            *nextTokPtr = ptr;
702
8
            return XML_TOK_INVALID;
703
8
          }
704
137k
          *nextTokPtr = ptr + MINBPC(enc);
705
137k
          return XML_TOK_EMPTY_ELEMENT_WITH_ATTS;
706
5
        default:
707
5
          *nextTokPtr = ptr;
708
5
          return XML_TOK_INVALID;
709
3.27M
        }
710
2.79M
        break;
711
3.27M
      }
712
2.79M
      break;
713
2.91M
    }
714
2.79M
    default:
715
18
      *nextTokPtr = ptr;
716
18
      return XML_TOK_INVALID;
717
3.71M
    }
718
3.71M
  }
719
78
  return XML_TOK_PARTIAL;
720
142k
}
Unexecuted instantiation: xmltok.c:little2_scanAtts
Unexecuted instantiation: xmltok.c:big2_scanAtts
721
722
/* ptr points to character following "<" */
723
724
static int PTRCALL
725
PREFIX(scanLt)(const ENCODING *enc, const char *ptr, const char *end,
726
457k
               const char **nextTokPtr) {
727
#  ifdef XML_NS
728
  int hadColon;
729
#  endif
730
457k
  REQUIRE_CHAR(enc, ptr, end);
731
457k
  switch (BYTE_TYPE(enc, ptr)) {
732
347k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
733
19.9k
  case BT_EXCL:
734
19.9k
    ptr += MINBPC(enc);
735
19.9k
    REQUIRE_CHAR(enc, ptr, end);
736
19.8k
    switch (BYTE_TYPE(enc, ptr)) {
737
18.4k
    case BT_MINUS:
738
18.4k
      return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
739
1.47k
    case BT_LSQB:
740
1.47k
      return PREFIX(scanCdataSection)(enc, ptr + MINBPC(enc), end, nextTokPtr);
741
19.8k
    }
742
3
    *nextTokPtr = ptr;
743
3
    return XML_TOK_INVALID;
744
29.0k
  case BT_QUEST:
745
29.0k
    return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
746
42.2k
  case BT_SOL:
747
42.2k
    return PREFIX(scanEndTag)(enc, ptr + MINBPC(enc), end, nextTokPtr);
748
13
  default:
749
13
    *nextTokPtr = ptr;
750
13
    return XML_TOK_INVALID;
751
457k
  }
752
#  ifdef XML_NS
753
  hadColon = 0;
754
#  endif
755
  /* we have a start-tag */
756
9.94M
  while (HAS_CHAR(enc, ptr, end)) {
757
9.94M
    switch (BYTE_TYPE(enc, ptr)) {
758
37.5M
      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
136k
    case BT_S:
777
146k
    case BT_CR:
778
150k
    case BT_LF: {
779
150k
      ptr += MINBPC(enc);
780
181k
      while (HAS_CHAR(enc, ptr, end)) {
781
181k
        switch (BYTE_TYPE(enc, ptr)) {
782
27.9k
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
783
509
        case BT_GT:
784
509
          goto gt;
785
6.77k
        case BT_SOL:
786
6.77k
          goto sol;
787
4.01k
        case BT_S:
788
31.0k
        case BT_CR:
789
31.8k
        case BT_LF:
790
31.8k
          ptr += MINBPC(enc);
791
31.8k
          continue;
792
7
        default:
793
7
          *nextTokPtr = ptr;
794
7
          return XML_TOK_INVALID;
795
181k
        }
796
142k
        return PREFIX(scanAtts)(enc, ptr, end, nextTokPtr);
797
181k
      }
798
44
      return XML_TOK_PARTIAL;
799
150k
    }
800
175k
    case BT_GT:
801
175k
    gt:
802
175k
      *nextTokPtr = ptr + MINBPC(enc);
803
175k
      return XML_TOK_START_TAG_NO_ATTS;
804
40.3k
    case BT_SOL:
805
47.0k
    sol:
806
47.0k
      ptr += MINBPC(enc);
807
47.0k
      REQUIRE_CHAR(enc, ptr, end);
808
47.0k
      if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
809
11
        *nextTokPtr = ptr;
810
11
        return XML_TOK_INVALID;
811
11
      }
812
47.0k
      *nextTokPtr = ptr + MINBPC(enc);
813
47.0k
      return XML_TOK_EMPTY_ELEMENT_NO_ATTS;
814
17
    default:
815
17
      *nextTokPtr = ptr;
816
17
      return XML_TOK_INVALID;
817
9.94M
    }
818
9.94M
  }
819
106
  return XML_TOK_PARTIAL;
820
365k
}
xmltok.c:normal_scanLt
Line
Count
Source
726
457k
               const char **nextTokPtr) {
727
#  ifdef XML_NS
728
  int hadColon;
729
#  endif
730
457k
  REQUIRE_CHAR(enc, ptr, end);
731
457k
  switch (BYTE_TYPE(enc, ptr)) {
732
347k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
733
19.9k
  case BT_EXCL:
734
19.9k
    ptr += MINBPC(enc);
735
19.9k
    REQUIRE_CHAR(enc, ptr, end);
736
19.8k
    switch (BYTE_TYPE(enc, ptr)) {
737
18.4k
    case BT_MINUS:
738
18.4k
      return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
739
1.47k
    case BT_LSQB:
740
1.47k
      return PREFIX(scanCdataSection)(enc, ptr + MINBPC(enc), end, nextTokPtr);
741
19.8k
    }
742
3
    *nextTokPtr = ptr;
743
3
    return XML_TOK_INVALID;
744
29.0k
  case BT_QUEST:
745
29.0k
    return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
746
42.2k
  case BT_SOL:
747
42.2k
    return PREFIX(scanEndTag)(enc, ptr + MINBPC(enc), end, nextTokPtr);
748
13
  default:
749
13
    *nextTokPtr = ptr;
750
13
    return XML_TOK_INVALID;
751
457k
  }
752
#  ifdef XML_NS
753
  hadColon = 0;
754
#  endif
755
  /* we have a start-tag */
756
9.94M
  while (HAS_CHAR(enc, ptr, end)) {
757
9.94M
    switch (BYTE_TYPE(enc, ptr)) {
758
37.5M
      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
136k
    case BT_S:
777
146k
    case BT_CR:
778
150k
    case BT_LF: {
779
150k
      ptr += MINBPC(enc);
780
181k
      while (HAS_CHAR(enc, ptr, end)) {
781
181k
        switch (BYTE_TYPE(enc, ptr)) {
782
27.9k
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
783
509
        case BT_GT:
784
509
          goto gt;
785
6.77k
        case BT_SOL:
786
6.77k
          goto sol;
787
4.01k
        case BT_S:
788
31.0k
        case BT_CR:
789
31.8k
        case BT_LF:
790
31.8k
          ptr += MINBPC(enc);
791
31.8k
          continue;
792
7
        default:
793
7
          *nextTokPtr = ptr;
794
7
          return XML_TOK_INVALID;
795
181k
        }
796
142k
        return PREFIX(scanAtts)(enc, ptr, end, nextTokPtr);
797
181k
      }
798
44
      return XML_TOK_PARTIAL;
799
150k
    }
800
175k
    case BT_GT:
801
175k
    gt:
802
175k
      *nextTokPtr = ptr + MINBPC(enc);
803
175k
      return XML_TOK_START_TAG_NO_ATTS;
804
40.3k
    case BT_SOL:
805
47.0k
    sol:
806
47.0k
      ptr += MINBPC(enc);
807
47.0k
      REQUIRE_CHAR(enc, ptr, end);
808
47.0k
      if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
809
11
        *nextTokPtr = ptr;
810
11
        return XML_TOK_INVALID;
811
11
      }
812
47.0k
      *nextTokPtr = ptr + MINBPC(enc);
813
47.0k
      return XML_TOK_EMPTY_ELEMENT_NO_ATTS;
814
17
    default:
815
17
      *nextTokPtr = ptr;
816
17
      return XML_TOK_INVALID;
817
9.94M
    }
818
9.94M
  }
819
106
  return XML_TOK_PARTIAL;
820
365k
}
Unexecuted instantiation: xmltok.c:little2_scanLt
Unexecuted instantiation: xmltok.c:big2_scanLt
821
822
static int PTRCALL
823
PREFIX(contentTok)(const ENCODING *enc, const char *ptr, const char *end,
824
4.49M
                   const char **nextTokPtr) {
825
4.49M
  if (ptr >= end)
826
7.08k
    return XML_TOK_NONE;
827
4.48M
  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.48M
  switch (BYTE_TYPE(enc, ptr)) {
837
457k
  case BT_LT:
838
457k
    return PREFIX(scanLt)(enc, ptr + MINBPC(enc), end, nextTokPtr);
839
65.4k
  case BT_AMP:
840
65.4k
    return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
841
1.77M
  case BT_CR:
842
1.77M
    ptr += MINBPC(enc);
843
1.77M
    if (! HAS_CHAR(enc, ptr, end))
844
18
      return XML_TOK_TRAILING_CR;
845
1.77M
    if (BYTE_TYPE(enc, ptr) == BT_LF)
846
370k
      ptr += MINBPC(enc);
847
1.77M
    *nextTokPtr = ptr;
848
1.77M
    return XML_TOK_DATA_NEWLINE;
849
1.32M
  case BT_LF:
850
1.32M
    *nextTokPtr = ptr + MINBPC(enc);
851
1.32M
    return XML_TOK_DATA_NEWLINE;
852
48.3k
  case BT_RSQB:
853
48.3k
    ptr += MINBPC(enc);
854
48.3k
    if (! HAS_CHAR(enc, ptr, end))
855
6
      return XML_TOK_TRAILING_RSQB;
856
48.3k
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
857
14.1k
      break;
858
34.1k
    ptr += MINBPC(enc);
859
34.1k
    if (! HAS_CHAR(enc, ptr, end))
860
6
      return XML_TOK_TRAILING_RSQB;
861
34.1k
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
862
34.1k
      ptr -= MINBPC(enc);
863
34.1k
      break;
864
34.1k
    }
865
1
    *nextTokPtr = ptr;
866
1
    return XML_TOK_INVALID;
867
127k
    INVALID_CASES(ptr, nextTokPtr)
868
755k
  default:
869
755k
    ptr += MINBPC(enc);
870
755k
    break;
871
4.48M
  }
872
17.2M
  while (HAS_CHAR(enc, ptr, end)) {
873
17.2M
    switch (BYTE_TYPE(enc, ptr)) {
874
0
#  define LEAD_CASE(n)                                                         \
875
192k
  case BT_LEAD##n:                                                             \
876
192k
    if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) {                       \
877
27
      *nextTokPtr = ptr;                                                       \
878
27
      return XML_TOK_DATA_CHARS;                                               \
879
27
    }                                                                          \
880
192k
    ptr += n;                                                                  \
881
192k
    break;
882
100k
      LEAD_CASE(2)
883
47.5k
      LEAD_CASE(3)
884
44.4k
      LEAD_CASE(4)
885
0
#  undef LEAD_CASE
886
435k
    case BT_RSQB:
887
435k
      if (HAS_CHARS(enc, ptr, end, 2)) {
888
435k
        if (! CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_RSQB)) {
889
139k
          ptr += MINBPC(enc);
890
139k
          break;
891
139k
        }
892
295k
        if (HAS_CHARS(enc, ptr, end, 3)) {
893
295k
          if (! CHAR_MATCHES(enc, ptr + 2 * MINBPC(enc), ASCII_GT)) {
894
295k
            ptr += MINBPC(enc);
895
295k
            break;
896
295k
          }
897
2
          *nextTokPtr = ptr + 2 * MINBPC(enc);
898
2
          return XML_TOK_INVALID;
899
295k
        }
900
295k
      }
901
      /* fall through */
902
31.9k
    case BT_AMP:
903
147k
    case BT_LT:
904
147k
    case BT_NONXML:
905
147k
    case BT_MALFORM:
906
147k
    case BT_TRAIL:
907
606k
    case BT_CR:
908
861k
    case BT_LF:
909
861k
      *nextTokPtr = ptr;
910
861k
      return XML_TOK_DATA_CHARS;
911
15.7M
    default:
912
15.7M
      ptr += MINBPC(enc);
913
15.7M
      break;
914
17.2M
    }
915
17.2M
  }
916
5.60k
  *nextTokPtr = ptr;
917
5.60k
  return XML_TOK_DATA_CHARS;
918
867k
}
xmltok.c:normal_contentTok
Line
Count
Source
824
4.49M
                   const char **nextTokPtr) {
825
4.49M
  if (ptr >= end)
826
7.08k
    return XML_TOK_NONE;
827
4.48M
  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.48M
  switch (BYTE_TYPE(enc, ptr)) {
837
457k
  case BT_LT:
838
457k
    return PREFIX(scanLt)(enc, ptr + MINBPC(enc), end, nextTokPtr);
839
65.4k
  case BT_AMP:
840
65.4k
    return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
841
1.77M
  case BT_CR:
842
1.77M
    ptr += MINBPC(enc);
843
1.77M
    if (! HAS_CHAR(enc, ptr, end))
844
18
      return XML_TOK_TRAILING_CR;
845
1.77M
    if (BYTE_TYPE(enc, ptr) == BT_LF)
846
370k
      ptr += MINBPC(enc);
847
1.77M
    *nextTokPtr = ptr;
848
1.77M
    return XML_TOK_DATA_NEWLINE;
849
1.32M
  case BT_LF:
850
1.32M
    *nextTokPtr = ptr + MINBPC(enc);
851
1.32M
    return XML_TOK_DATA_NEWLINE;
852
48.3k
  case BT_RSQB:
853
48.3k
    ptr += MINBPC(enc);
854
48.3k
    if (! HAS_CHAR(enc, ptr, end))
855
6
      return XML_TOK_TRAILING_RSQB;
856
48.3k
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
857
14.1k
      break;
858
34.1k
    ptr += MINBPC(enc);
859
34.1k
    if (! HAS_CHAR(enc, ptr, end))
860
6
      return XML_TOK_TRAILING_RSQB;
861
34.1k
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
862
34.1k
      ptr -= MINBPC(enc);
863
34.1k
      break;
864
34.1k
    }
865
1
    *nextTokPtr = ptr;
866
1
    return XML_TOK_INVALID;
867
127k
    INVALID_CASES(ptr, nextTokPtr)
868
755k
  default:
869
755k
    ptr += MINBPC(enc);
870
755k
    break;
871
4.48M
  }
872
17.2M
  while (HAS_CHAR(enc, ptr, end)) {
873
17.2M
    switch (BYTE_TYPE(enc, ptr)) {
874
0
#  define LEAD_CASE(n)                                                         \
875
0
  case BT_LEAD##n:                                                             \
876
0
    if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) {                       \
877
0
      *nextTokPtr = ptr;                                                       \
878
0
      return XML_TOK_DATA_CHARS;                                               \
879
0
    }                                                                          \
880
0
    ptr += n;                                                                  \
881
0
    break;
882
100k
      LEAD_CASE(2)
883
47.5k
      LEAD_CASE(3)
884
44.4k
      LEAD_CASE(4)
885
0
#  undef LEAD_CASE
886
435k
    case BT_RSQB:
887
435k
      if (HAS_CHARS(enc, ptr, end, 2)) {
888
435k
        if (! CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_RSQB)) {
889
139k
          ptr += MINBPC(enc);
890
139k
          break;
891
139k
        }
892
295k
        if (HAS_CHARS(enc, ptr, end, 3)) {
893
295k
          if (! CHAR_MATCHES(enc, ptr + 2 * MINBPC(enc), ASCII_GT)) {
894
295k
            ptr += MINBPC(enc);
895
295k
            break;
896
295k
          }
897
2
          *nextTokPtr = ptr + 2 * MINBPC(enc);
898
2
          return XML_TOK_INVALID;
899
295k
        }
900
295k
      }
901
      /* fall through */
902
31.9k
    case BT_AMP:
903
147k
    case BT_LT:
904
147k
    case BT_NONXML:
905
147k
    case BT_MALFORM:
906
147k
    case BT_TRAIL:
907
606k
    case BT_CR:
908
861k
    case BT_LF:
909
861k
      *nextTokPtr = ptr;
910
861k
      return XML_TOK_DATA_CHARS;
911
15.7M
    default:
912
15.7M
      ptr += MINBPC(enc);
913
15.7M
      break;
914
17.2M
    }
915
17.2M
  }
916
5.60k
  *nextTokPtr = ptr;
917
5.60k
  return XML_TOK_DATA_CHARS;
918
867k
}
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
75.7k
                    const char **nextTokPtr) {
925
75.7k
  REQUIRE_CHAR(enc, ptr, end);
926
75.7k
  switch (BYTE_TYPE(enc, ptr)) {
927
108k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
928
852
  case BT_S:
929
1.22k
  case BT_LF:
930
1.75k
  case BT_CR:
931
1.76k
  case BT_PERCNT:
932
1.76k
    *nextTokPtr = ptr;
933
1.76k
    return XML_TOK_PERCENT;
934
5
  default:
935
5
    *nextTokPtr = ptr;
936
5
    return XML_TOK_INVALID;
937
75.7k
  }
938
1.32M
  while (HAS_CHAR(enc, ptr, end)) {
939
1.32M
    switch (BYTE_TYPE(enc, ptr)) {
940
3.87M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
941
73.8k
    case BT_SEMI:
942
73.8k
      *nextTokPtr = ptr + MINBPC(enc);
943
73.8k
      return XML_TOK_PARAM_ENTITY_REF;
944
20
    default:
945
20
      *nextTokPtr = ptr;
946
20
      return XML_TOK_INVALID;
947
1.32M
    }
948
1.32M
  }
949
66
  return XML_TOK_PARTIAL;
950
73.9k
}
xmltok.c:normal_scanPercent
Line
Count
Source
924
75.7k
                    const char **nextTokPtr) {
925
75.7k
  REQUIRE_CHAR(enc, ptr, end);
926
75.7k
  switch (BYTE_TYPE(enc, ptr)) {
927
108k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
928
852
  case BT_S:
929
1.22k
  case BT_LF:
930
1.75k
  case BT_CR:
931
1.76k
  case BT_PERCNT:
932
1.76k
    *nextTokPtr = ptr;
933
1.76k
    return XML_TOK_PERCENT;
934
5
  default:
935
5
    *nextTokPtr = ptr;
936
5
    return XML_TOK_INVALID;
937
75.7k
  }
938
1.32M
  while (HAS_CHAR(enc, ptr, end)) {
939
1.32M
    switch (BYTE_TYPE(enc, ptr)) {
940
3.87M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
941
73.8k
    case BT_SEMI:
942
73.8k
      *nextTokPtr = ptr + MINBPC(enc);
943
73.8k
      return XML_TOK_PARAM_ENTITY_REF;
944
20
    default:
945
20
      *nextTokPtr = ptr;
946
20
      return XML_TOK_INVALID;
947
1.32M
    }
948
1.32M
  }
949
66
  return XML_TOK_PARTIAL;
950
73.9k
}
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
60.9k
                      const char **nextTokPtr) {
955
60.9k
  REQUIRE_CHAR(enc, ptr, end);
956
60.9k
  switch (BYTE_TYPE(enc, ptr)) {
957
60.6k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
958
1
  default:
959
1
    *nextTokPtr = ptr;
960
1
    return XML_TOK_INVALID;
961
60.9k
  }
962
870k
  while (HAS_CHAR(enc, ptr, end)) {
963
870k
    switch (BYTE_TYPE(enc, ptr)) {
964
2.75M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
965
48.0k
    case BT_CR:
966
55.2k
    case BT_LF:
967
55.6k
    case BT_S:
968
56.0k
    case BT_RPAR:
969
60.4k
    case BT_GT:
970
60.4k
    case BT_PERCNT:
971
60.6k
    case BT_VERBAR:
972
60.6k
      *nextTokPtr = ptr;
973
60.6k
      return XML_TOK_POUND_NAME;
974
18
    default:
975
18
      *nextTokPtr = ptr;
976
18
      return XML_TOK_INVALID;
977
870k
    }
978
870k
  }
979
180
  return -XML_TOK_POUND_NAME;
980
60.9k
}
xmltok.c:normal_scanPoundName
Line
Count
Source
954
60.9k
                      const char **nextTokPtr) {
955
60.9k
  REQUIRE_CHAR(enc, ptr, end);
956
60.9k
  switch (BYTE_TYPE(enc, ptr)) {
957
60.6k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
958
1
  default:
959
1
    *nextTokPtr = ptr;
960
1
    return XML_TOK_INVALID;
961
60.9k
  }
962
870k
  while (HAS_CHAR(enc, ptr, end)) {
963
870k
    switch (BYTE_TYPE(enc, ptr)) {
964
2.75M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
965
48.0k
    case BT_CR:
966
55.2k
    case BT_LF:
967
55.6k
    case BT_S:
968
56.0k
    case BT_RPAR:
969
60.4k
    case BT_GT:
970
60.4k
    case BT_PERCNT:
971
60.6k
    case BT_VERBAR:
972
60.6k
      *nextTokPtr = ptr;
973
60.6k
      return XML_TOK_POUND_NAME;
974
18
    default:
975
18
      *nextTokPtr = ptr;
976
18
      return XML_TOK_INVALID;
977
870k
    }
978
870k
  }
979
180
  return -XML_TOK_POUND_NAME;
980
60.9k
}
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
33.1k
                const char **nextTokPtr) {
985
11.5M
  while (HAS_CHAR(enc, ptr, end)) {
986
11.5M
    int t = BYTE_TYPE(enc, ptr);
987
11.5M
    switch (t) {
988
364k
      INVALID_CASES(ptr, nextTokPtr)
989
10.2k
    case BT_QUOT:
990
106k
    case BT_APOS:
991
106k
      ptr += MINBPC(enc);
992
106k
      if (t != open)
993
73.5k
        break;
994
32.9k
      if (! HAS_CHAR(enc, ptr, end))
995
497
        return -XML_TOK_LITERAL;
996
32.4k
      *nextTokPtr = ptr;
997
32.4k
      switch (BYTE_TYPE(enc, ptr)) {
998
5.37k
      case BT_S:
999
7.58k
      case BT_CR:
1000
15.1k
      case BT_LF:
1001
32.0k
      case BT_GT:
1002
32.0k
      case BT_PERCNT:
1003
32.4k
      case BT_LSQB:
1004
32.4k
        return XML_TOK_LITERAL;
1005
15
      default:
1006
15
        return XML_TOK_INVALID;
1007
32.4k
      }
1008
11.2M
    default:
1009
11.2M
      ptr += MINBPC(enc);
1010
11.2M
      break;
1011
11.5M
    }
1012
11.5M
  }
1013
96
  return XML_TOK_PARTIAL;
1014
33.1k
}
xmltok.c:normal_scanLit
Line
Count
Source
984
33.1k
                const char **nextTokPtr) {
985
11.5M
  while (HAS_CHAR(enc, ptr, end)) {
986
11.5M
    int t = BYTE_TYPE(enc, ptr);
987
11.5M
    switch (t) {
988
364k
      INVALID_CASES(ptr, nextTokPtr)
989
10.2k
    case BT_QUOT:
990
106k
    case BT_APOS:
991
106k
      ptr += MINBPC(enc);
992
106k
      if (t != open)
993
73.5k
        break;
994
32.9k
      if (! HAS_CHAR(enc, ptr, end))
995
497
        return -XML_TOK_LITERAL;
996
32.4k
      *nextTokPtr = ptr;
997
32.4k
      switch (BYTE_TYPE(enc, ptr)) {
998
5.37k
      case BT_S:
999
7.58k
      case BT_CR:
1000
15.1k
      case BT_LF:
1001
32.0k
      case BT_GT:
1002
32.0k
      case BT_PERCNT:
1003
32.4k
      case BT_LSQB:
1004
32.4k
        return XML_TOK_LITERAL;
1005
15
      default:
1006
15
        return XML_TOK_INVALID;
1007
32.4k
      }
1008
11.2M
    default:
1009
11.2M
      ptr += MINBPC(enc);
1010
11.2M
      break;
1011
11.5M
    }
1012
11.5M
  }
1013
96
  return XML_TOK_PARTIAL;
1014
33.1k
}
Unexecuted instantiation: xmltok.c:little2_scanLit
Unexecuted instantiation: xmltok.c:big2_scanLit
1015
1016
static int PTRCALL
1017
PREFIX(prologTok)(const ENCODING *enc, const char *ptr, const char *end,
1018
4.29M
                  const char **nextTokPtr) {
1019
4.29M
  int tok;
1020
4.29M
  if (ptr >= end)
1021
8.11k
    return XML_TOK_NONE;
1022
4.28M
  if (MINBPC(enc) > 1) {
1023
212
    size_t n = end - ptr;
1024
212
    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
212
  }
1031
4.28M
  switch (BYTE_TYPE(enc, ptr)) {
1032
6.81k
  case BT_QUOT:
1033
6.81k
    return PREFIX(scanLit)(BT_QUOT, enc, ptr + MINBPC(enc), end, nextTokPtr);
1034
26.3k
  case BT_APOS:
1035
26.3k
    return PREFIX(scanLit)(BT_APOS, enc, ptr + MINBPC(enc), end, nextTokPtr);
1036
79.8k
  case BT_LT: {
1037
79.8k
    ptr += MINBPC(enc);
1038
79.8k
    REQUIRE_CHAR(enc, ptr, end);
1039
79.8k
    switch (BYTE_TYPE(enc, ptr)) {
1040
65.2k
    case BT_EXCL:
1041
65.2k
      return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1042
9.02k
    case BT_QUEST:
1043
9.02k
      return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1044
4.29k
    case BT_NMSTRT:
1045
5.51k
    case BT_HEX:
1046
5.51k
    case BT_NONASCII:
1047
5.53k
    case BT_LEAD2:
1048
5.57k
    case BT_LEAD3:
1049
5.58k
    case BT_LEAD4:
1050
5.58k
      *nextTokPtr = ptr - MINBPC(enc);
1051
5.58k
      return XML_TOK_INSTANCE_START;
1052
79.8k
    }
1053
16
    *nextTokPtr = ptr;
1054
16
    return XML_TOK_INVALID;
1055
79.8k
  }
1056
173k
  case BT_CR:
1057
173k
    if (ptr + MINBPC(enc) == end) {
1058
343
      *nextTokPtr = end;
1059
      /* indicate that this might be part of a CR/LF pair */
1060
343
      return -XML_TOK_PROLOG_S;
1061
343
    }
1062
    /* fall through */
1063
297k
  case BT_S:
1064
348k
  case BT_LF:
1065
374k
    for (;;) {
1066
374k
      ptr += MINBPC(enc);
1067
374k
      if (! HAS_CHAR(enc, ptr, end))
1068
228
        break;
1069
373k
      switch (BYTE_TYPE(enc, ptr)) {
1070
3.62k
      case BT_S:
1071
7.65k
      case BT_LF:
1072
7.65k
        break;
1073
18.0k
      case BT_CR:
1074
        /* don't split CR/LF pair */
1075
18.0k
        if (ptr + MINBPC(enc) != end)
1076
17.8k
          break;
1077
        /* fall through */
1078
348k
      default:
1079
348k
        *nextTokPtr = ptr;
1080
348k
        return XML_TOK_PROLOG_S;
1081
373k
      }
1082
373k
    }
1083
228
    *nextTokPtr = ptr;
1084
228
    return XML_TOK_PROLOG_S;
1085
75.7k
  case BT_PERCNT:
1086
75.7k
    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.66k
  case BT_LSQB:
1091
2.66k
    *nextTokPtr = ptr + MINBPC(enc);
1092
2.66k
    return XML_TOK_OPEN_BRACKET;
1093
1.31k
  case BT_RSQB:
1094
1.31k
    ptr += MINBPC(enc);
1095
1.31k
    if (! HAS_CHAR(enc, ptr, end))
1096
3
      return -XML_TOK_CLOSE_BRACKET;
1097
1.30k
    if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) {
1098
19
      REQUIRE_CHARS(enc, ptr, end, 2);
1099
17
      if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_GT)) {
1100
1
        *nextTokPtr = ptr + 2 * MINBPC(enc);
1101
1
        return XML_TOK_COND_SECT_CLOSE;
1102
1
      }
1103
17
    }
1104
1.30k
    *nextTokPtr = ptr;
1105
1.30k
    return XML_TOK_CLOSE_BRACKET;
1106
3.20M
  case BT_LPAR:
1107
3.20M
    *nextTokPtr = ptr + MINBPC(enc);
1108
3.20M
    return XML_TOK_OPEN_PAREN;
1109
95.7k
  case BT_RPAR:
1110
95.7k
    ptr += MINBPC(enc);
1111
95.7k
    if (! HAS_CHAR(enc, ptr, end))
1112
93
      return -XML_TOK_CLOSE_PAREN;
1113
95.6k
    switch (BYTE_TYPE(enc, ptr)) {
1114
5.33k
    case BT_AST:
1115
5.33k
      *nextTokPtr = ptr + MINBPC(enc);
1116
5.33k
      return XML_TOK_CLOSE_PAREN_ASTERISK;
1117
4.93k
    case BT_QUEST:
1118
4.93k
      *nextTokPtr = ptr + MINBPC(enc);
1119
4.93k
      return XML_TOK_CLOSE_PAREN_QUESTION;
1120
7.75k
    case BT_PLUS:
1121
7.75k
      *nextTokPtr = ptr + MINBPC(enc);
1122
7.75k
      return XML_TOK_CLOSE_PAREN_PLUS;
1123
1.50k
    case BT_CR:
1124
5.86k
    case BT_LF:
1125
53.6k
    case BT_S:
1126
54.9k
    case BT_GT:
1127
61.4k
    case BT_COMMA:
1128
72.2k
    case BT_VERBAR:
1129
77.6k
    case BT_RPAR:
1130
77.6k
      *nextTokPtr = ptr;
1131
77.6k
      return XML_TOK_CLOSE_PAREN;
1132
95.6k
    }
1133
15
    *nextTokPtr = ptr;
1134
15
    return XML_TOK_INVALID;
1135
37.6k
  case BT_VERBAR:
1136
37.6k
    *nextTokPtr = ptr + MINBPC(enc);
1137
37.6k
    return XML_TOK_OR;
1138
59.6k
  case BT_GT:
1139
59.6k
    *nextTokPtr = ptr + MINBPC(enc);
1140
59.6k
    return XML_TOK_DECL_CLOSE;
1141
60.9k
  case BT_NUM:
1142
60.9k
    return PREFIX(scanPoundName)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1143
0
#  define LEAD_CASE(n)                                                         \
1144
48
  case BT_LEAD##n:                                                             \
1145
7.21k
    if (end - ptr < n)                                                         \
1146
58
      return XML_TOK_PARTIAL_CHAR;                                             \
1147
7.15k
    if (IS_INVALID_CHAR(enc, ptr, n)) {                                        \
1148
72
      *nextTokPtr = ptr;                                                       \
1149
72
      return XML_TOK_INVALID;                                                  \
1150
72
    }                                                                          \
1151
7.15k
    if (IS_NMSTRT_CHAR(enc, ptr, n)) {                                         \
1152
6.16k
      ptr += n;                                                                \
1153
6.16k
      tok = XML_TOK_NAME;                                                      \
1154
6.16k
      break;                                                                   \
1155
6.16k
    }                                                                          \
1156
7.08k
    if (IS_NAME_CHAR(enc, ptr, n)) {                                           \
1157
865
      ptr += n;                                                                \
1158
865
      tok = XML_TOK_NMTOKEN;                                                   \
1159
865
      break;                                                                   \
1160
865
    }                                                                          \
1161
913
    *nextTokPtr = ptr;                                                         \
1162
48
    return XML_TOK_INVALID;
1163
7.09k
    LEAD_CASE(2)
1164
15.0k
    LEAD_CASE(3)
1165
190
    LEAD_CASE(4)
1166
0
#  undef LEAD_CASE
1167
151k
  case BT_NMSTRT:
1168
246k
  case BT_HEX:
1169
246k
    tok = XML_TOK_NAME;
1170
246k
    ptr += MINBPC(enc);
1171
246k
    break;
1172
16.1k
  case BT_DIGIT:
1173
16.5k
  case BT_NAME:
1174
16.8k
  case BT_MINUS:
1175
#  ifdef XML_NS
1176
  case BT_COLON:
1177
#  endif
1178
16.8k
    tok = XML_TOK_NMTOKEN;
1179
16.8k
    ptr += MINBPC(enc);
1180
16.8k
    break;
1181
166
  case BT_NONASCII:
1182
166
    if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {
1183
132
      ptr += MINBPC(enc);
1184
132
      tok = XML_TOK_NAME;
1185
132
      break;
1186
132
    }
1187
34
    if (IS_NAME_CHAR_MINBPC(enc, ptr)) {
1188
10
      ptr += MINBPC(enc);
1189
10
      tok = XML_TOK_NMTOKEN;
1190
10
      break;
1191
10
    }
1192
    /* fall through */
1193
84
  default:
1194
84
    *nextTokPtr = ptr;
1195
84
    return XML_TOK_INVALID;
1196
4.28M
  }
1197
13.6M
  while (HAS_CHAR(enc, ptr, end)) {
1198
13.6M
    switch (BYTE_TYPE(enc, ptr)) {
1199
37.8M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1200
31.9k
    case BT_GT:
1201
102k
    case BT_RPAR:
1202
103k
    case BT_COMMA:
1203
123k
    case BT_VERBAR:
1204
125k
    case BT_LSQB:
1205
125k
    case BT_PERCNT:
1206
165k
    case BT_S:
1207
245k
    case BT_CR:
1208
263k
    case BT_LF:
1209
263k
      *nextTokPtr = ptr;
1210
263k
      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
4.20k
    case BT_PLUS:
1232
4.20k
      if (tok == XML_TOK_NMTOKEN) {
1233
1
        *nextTokPtr = ptr;
1234
1
        return XML_TOK_INVALID;
1235
1
      }
1236
4.20k
      *nextTokPtr = ptr + MINBPC(enc);
1237
4.20k
      return XML_TOK_NAME_PLUS;
1238
955
    case BT_AST:
1239
955
      if (tok == XML_TOK_NMTOKEN) {
1240
2
        *nextTokPtr = ptr;
1241
2
        return XML_TOK_INVALID;
1242
2
      }
1243
953
      *nextTokPtr = ptr + MINBPC(enc);
1244
953
      return XML_TOK_NAME_ASTERISK;
1245
710
    case BT_QUEST:
1246
710
      if (tok == XML_TOK_NMTOKEN) {
1247
2
        *nextTokPtr = ptr;
1248
2
        return XML_TOK_INVALID;
1249
2
      }
1250
708
      *nextTokPtr = ptr + MINBPC(enc);
1251
708
      return XML_TOK_NAME_QUESTION;
1252
63
    default:
1253
63
      *nextTokPtr = ptr;
1254
63
      return XML_TOK_INVALID;
1255
13.6M
    }
1256
13.6M
  }
1257
650
  return -tok;
1258
270k
}
xmltok.c:normal_prologTok
Line
Count
Source
1018
4.29M
                  const char **nextTokPtr) {
1019
4.29M
  int tok;
1020
4.29M
  if (ptr >= end)
1021
8.10k
    return XML_TOK_NONE;
1022
4.28M
  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.28M
  switch (BYTE_TYPE(enc, ptr)) {
1032
6.81k
  case BT_QUOT:
1033
6.81k
    return PREFIX(scanLit)(BT_QUOT, enc, ptr + MINBPC(enc), end, nextTokPtr);
1034
26.3k
  case BT_APOS:
1035
26.3k
    return PREFIX(scanLit)(BT_APOS, enc, ptr + MINBPC(enc), end, nextTokPtr);
1036
79.8k
  case BT_LT: {
1037
79.8k
    ptr += MINBPC(enc);
1038
79.8k
    REQUIRE_CHAR(enc, ptr, end);
1039
79.8k
    switch (BYTE_TYPE(enc, ptr)) {
1040
65.2k
    case BT_EXCL:
1041
65.2k
      return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1042
9.02k
    case BT_QUEST:
1043
9.02k
      return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1044
4.29k
    case BT_NMSTRT:
1045
5.51k
    case BT_HEX:
1046
5.51k
    case BT_NONASCII:
1047
5.53k
    case BT_LEAD2:
1048
5.57k
    case BT_LEAD3:
1049
5.58k
    case BT_LEAD4:
1050
5.58k
      *nextTokPtr = ptr - MINBPC(enc);
1051
5.58k
      return XML_TOK_INSTANCE_START;
1052
79.8k
    }
1053
16
    *nextTokPtr = ptr;
1054
16
    return XML_TOK_INVALID;
1055
79.8k
  }
1056
173k
  case BT_CR:
1057
173k
    if (ptr + MINBPC(enc) == end) {
1058
343
      *nextTokPtr = end;
1059
      /* indicate that this might be part of a CR/LF pair */
1060
343
      return -XML_TOK_PROLOG_S;
1061
343
    }
1062
    /* fall through */
1063
297k
  case BT_S:
1064
348k
  case BT_LF:
1065
374k
    for (;;) {
1066
374k
      ptr += MINBPC(enc);
1067
374k
      if (! HAS_CHAR(enc, ptr, end))
1068
228
        break;
1069
373k
      switch (BYTE_TYPE(enc, ptr)) {
1070
3.62k
      case BT_S:
1071
7.65k
      case BT_LF:
1072
7.65k
        break;
1073
18.0k
      case BT_CR:
1074
        /* don't split CR/LF pair */
1075
18.0k
        if (ptr + MINBPC(enc) != end)
1076
17.8k
          break;
1077
        /* fall through */
1078
348k
      default:
1079
348k
        *nextTokPtr = ptr;
1080
348k
        return XML_TOK_PROLOG_S;
1081
373k
      }
1082
373k
    }
1083
228
    *nextTokPtr = ptr;
1084
228
    return XML_TOK_PROLOG_S;
1085
75.7k
  case BT_PERCNT:
1086
75.7k
    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.66k
  case BT_LSQB:
1091
2.66k
    *nextTokPtr = ptr + MINBPC(enc);
1092
2.66k
    return XML_TOK_OPEN_BRACKET;
1093
1.31k
  case BT_RSQB:
1094
1.31k
    ptr += MINBPC(enc);
1095
1.31k
    if (! HAS_CHAR(enc, ptr, end))
1096
3
      return -XML_TOK_CLOSE_BRACKET;
1097
1.30k
    if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) {
1098
19
      REQUIRE_CHARS(enc, ptr, end, 2);
1099
17
      if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_GT)) {
1100
1
        *nextTokPtr = ptr + 2 * MINBPC(enc);
1101
1
        return XML_TOK_COND_SECT_CLOSE;
1102
1
      }
1103
17
    }
1104
1.30k
    *nextTokPtr = ptr;
1105
1.30k
    return XML_TOK_CLOSE_BRACKET;
1106
3.20M
  case BT_LPAR:
1107
3.20M
    *nextTokPtr = ptr + MINBPC(enc);
1108
3.20M
    return XML_TOK_OPEN_PAREN;
1109
95.7k
  case BT_RPAR:
1110
95.7k
    ptr += MINBPC(enc);
1111
95.7k
    if (! HAS_CHAR(enc, ptr, end))
1112
93
      return -XML_TOK_CLOSE_PAREN;
1113
95.6k
    switch (BYTE_TYPE(enc, ptr)) {
1114
5.33k
    case BT_AST:
1115
5.33k
      *nextTokPtr = ptr + MINBPC(enc);
1116
5.33k
      return XML_TOK_CLOSE_PAREN_ASTERISK;
1117
4.93k
    case BT_QUEST:
1118
4.93k
      *nextTokPtr = ptr + MINBPC(enc);
1119
4.93k
      return XML_TOK_CLOSE_PAREN_QUESTION;
1120
7.75k
    case BT_PLUS:
1121
7.75k
      *nextTokPtr = ptr + MINBPC(enc);
1122
7.75k
      return XML_TOK_CLOSE_PAREN_PLUS;
1123
1.50k
    case BT_CR:
1124
5.86k
    case BT_LF:
1125
53.6k
    case BT_S:
1126
54.9k
    case BT_GT:
1127
61.4k
    case BT_COMMA:
1128
72.2k
    case BT_VERBAR:
1129
77.6k
    case BT_RPAR:
1130
77.6k
      *nextTokPtr = ptr;
1131
77.6k
      return XML_TOK_CLOSE_PAREN;
1132
95.6k
    }
1133
15
    *nextTokPtr = ptr;
1134
15
    return XML_TOK_INVALID;
1135
37.6k
  case BT_VERBAR:
1136
37.6k
    *nextTokPtr = ptr + MINBPC(enc);
1137
37.6k
    return XML_TOK_OR;
1138
59.6k
  case BT_GT:
1139
59.6k
    *nextTokPtr = ptr + MINBPC(enc);
1140
59.6k
    return XML_TOK_DECL_CLOSE;
1141
60.9k
  case BT_NUM:
1142
60.9k
    return PREFIX(scanPoundName)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1143
0
#  define LEAD_CASE(n)                                                         \
1144
0
  case BT_LEAD##n:                                                             \
1145
0
    if (end - ptr < n)                                                         \
1146
0
      return XML_TOK_PARTIAL_CHAR;                                             \
1147
0
    if (IS_INVALID_CHAR(enc, ptr, n)) {                                        \
1148
0
      *nextTokPtr = ptr;                                                       \
1149
0
      return XML_TOK_INVALID;                                                  \
1150
0
    }                                                                          \
1151
0
    if (IS_NMSTRT_CHAR(enc, ptr, n)) {                                         \
1152
0
      ptr += n;                                                                \
1153
0
      tok = XML_TOK_NAME;                                                      \
1154
0
      break;                                                                   \
1155
0
    }                                                                          \
1156
0
    if (IS_NAME_CHAR(enc, ptr, n)) {                                           \
1157
0
      ptr += n;                                                                \
1158
0
      tok = XML_TOK_NMTOKEN;                                                   \
1159
0
      break;                                                                   \
1160
0
    }                                                                          \
1161
0
    *nextTokPtr = ptr;                                                         \
1162
0
    return XML_TOK_INVALID;
1163
7.09k
    LEAD_CASE(2)
1164
15.0k
    LEAD_CASE(3)
1165
116
    LEAD_CASE(4)
1166
0
#  undef LEAD_CASE
1167
151k
  case BT_NMSTRT:
1168
246k
  case BT_HEX:
1169
246k
    tok = XML_TOK_NAME;
1170
246k
    ptr += MINBPC(enc);
1171
246k
    break;
1172
16.1k
  case BT_DIGIT:
1173
16.5k
  case BT_NAME:
1174
16.8k
  case BT_MINUS:
1175
#  ifdef XML_NS
1176
  case BT_COLON:
1177
#  endif
1178
16.8k
    tok = XML_TOK_NMTOKEN;
1179
16.8k
    ptr += MINBPC(enc);
1180
16.8k
    break;
1181
0
  case BT_NONASCII:
1182
0
    if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {
1183
0
      ptr += MINBPC(enc);
1184
0
      tok = XML_TOK_NAME;
1185
0
      break;
1186
0
    }
1187
0
    if (IS_NAME_CHAR_MINBPC(enc, ptr)) {
1188
0
      ptr += MINBPC(enc);
1189
0
      tok = XML_TOK_NMTOKEN;
1190
0
      break;
1191
0
    }
1192
    /* fall through */
1193
50
  default:
1194
50
    *nextTokPtr = ptr;
1195
50
    return XML_TOK_INVALID;
1196
4.28M
  }
1197
13.3M
  while (HAS_CHAR(enc, ptr, end)) {
1198
13.3M
    switch (BYTE_TYPE(enc, ptr)) {
1199
36.7M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1200
31.9k
    case BT_GT:
1201
102k
    case BT_RPAR:
1202
103k
    case BT_COMMA:
1203
123k
    case BT_VERBAR:
1204
125k
    case BT_LSQB:
1205
125k
    case BT_PERCNT:
1206
165k
    case BT_S:
1207
245k
    case BT_CR:
1208
263k
    case BT_LF:
1209
263k
      *nextTokPtr = ptr;
1210
263k
      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
4.20k
    case BT_PLUS:
1232
4.20k
      if (tok == XML_TOK_NMTOKEN) {
1233
1
        *nextTokPtr = ptr;
1234
1
        return XML_TOK_INVALID;
1235
1
      }
1236
4.20k
      *nextTokPtr = ptr + MINBPC(enc);
1237
4.20k
      return XML_TOK_NAME_PLUS;
1238
955
    case BT_AST:
1239
955
      if (tok == XML_TOK_NMTOKEN) {
1240
2
        *nextTokPtr = ptr;
1241
2
        return XML_TOK_INVALID;
1242
2
      }
1243
953
      *nextTokPtr = ptr + MINBPC(enc);
1244
953
      return XML_TOK_NAME_ASTERISK;
1245
710
    case BT_QUEST:
1246
710
      if (tok == XML_TOK_NMTOKEN) {
1247
2
        *nextTokPtr = ptr;
1248
2
        return XML_TOK_INVALID;
1249
2
      }
1250
708
      *nextTokPtr = ptr + MINBPC(enc);
1251
708
      return XML_TOK_NAME_QUESTION;
1252
45
    default:
1253
45
      *nextTokPtr = ptr;
1254
45
      return XML_TOK_INVALID;
1255
13.3M
    }
1256
13.3M
  }
1257
610
  return -tok;
1258
269k
}
xmltok.c:little2_prologTok
Line
Count
Source
1018
113
                  const char **nextTokPtr) {
1019
113
  int tok;
1020
113
  if (ptr >= end)
1021
2
    return XML_TOK_NONE;
1022
111
  if (MINBPC(enc) > 1) {
1023
111
    size_t n = end - ptr;
1024
111
    if (n & (MINBPC(enc) - 1)) {
1025
27
      n &= ~(MINBPC(enc) - 1);
1026
27
      if (n == 0)
1027
2
        return XML_TOK_PARTIAL;
1028
25
      end = ptr + n;
1029
25
    }
1030
111
  }
1031
109
  switch (BYTE_TYPE(enc, ptr)) {
1032
0
  case BT_QUOT:
1033
0
    return PREFIX(scanLit)(BT_QUOT, enc, ptr + MINBPC(enc), end, nextTokPtr);
1034
0
  case BT_APOS:
1035
0
    return PREFIX(scanLit)(BT_APOS, enc, ptr + MINBPC(enc), end, nextTokPtr);
1036
0
  case BT_LT: {
1037
0
    ptr += MINBPC(enc);
1038
0
    REQUIRE_CHAR(enc, ptr, end);
1039
0
    switch (BYTE_TYPE(enc, ptr)) {
1040
0
    case BT_EXCL:
1041
0
      return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1042
0
    case BT_QUEST:
1043
0
      return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1044
0
    case BT_NMSTRT:
1045
0
    case BT_HEX:
1046
0
    case BT_NONASCII:
1047
0
    case BT_LEAD2:
1048
0
    case BT_LEAD3:
1049
0
    case BT_LEAD4:
1050
0
      *nextTokPtr = ptr - MINBPC(enc);
1051
0
      return XML_TOK_INSTANCE_START;
1052
0
    }
1053
0
    *nextTokPtr = ptr;
1054
0
    return XML_TOK_INVALID;
1055
0
  }
1056
0
  case BT_CR:
1057
0
    if (ptr + MINBPC(enc) == end) {
1058
0
      *nextTokPtr = end;
1059
      /* indicate that this might be part of a CR/LF pair */
1060
0
      return -XML_TOK_PROLOG_S;
1061
0
    }
1062
    /* fall through */
1063
0
  case BT_S:
1064
0
  case BT_LF:
1065
0
    for (;;) {
1066
0
      ptr += MINBPC(enc);
1067
0
      if (! HAS_CHAR(enc, ptr, end))
1068
0
        break;
1069
0
      switch (BYTE_TYPE(enc, ptr)) {
1070
0
      case BT_S:
1071
0
      case BT_LF:
1072
0
        break;
1073
0
      case BT_CR:
1074
        /* don't split CR/LF pair */
1075
0
        if (ptr + MINBPC(enc) != end)
1076
0
          break;
1077
        /* fall through */
1078
0
      default:
1079
0
        *nextTokPtr = ptr;
1080
0
        return XML_TOK_PROLOG_S;
1081
0
      }
1082
0
    }
1083
0
    *nextTokPtr = ptr;
1084
0
    return XML_TOK_PROLOG_S;
1085
0
  case BT_PERCNT:
1086
0
    return PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1087
0
  case BT_COMMA:
1088
0
    *nextTokPtr = ptr + MINBPC(enc);
1089
0
    return XML_TOK_COMMA;
1090
0
  case BT_LSQB:
1091
0
    *nextTokPtr = ptr + MINBPC(enc);
1092
0
    return XML_TOK_OPEN_BRACKET;
1093
0
  case BT_RSQB:
1094
0
    ptr += MINBPC(enc);
1095
0
    if (! HAS_CHAR(enc, ptr, end))
1096
0
      return -XML_TOK_CLOSE_BRACKET;
1097
0
    if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) {
1098
0
      REQUIRE_CHARS(enc, ptr, end, 2);
1099
0
      if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_GT)) {
1100
0
        *nextTokPtr = ptr + 2 * MINBPC(enc);
1101
0
        return XML_TOK_COND_SECT_CLOSE;
1102
0
      }
1103
0
    }
1104
0
    *nextTokPtr = ptr;
1105
0
    return XML_TOK_CLOSE_BRACKET;
1106
0
  case BT_LPAR:
1107
0
    *nextTokPtr = ptr + MINBPC(enc);
1108
0
    return XML_TOK_OPEN_PAREN;
1109
0
  case BT_RPAR:
1110
0
    ptr += MINBPC(enc);
1111
0
    if (! HAS_CHAR(enc, ptr, end))
1112
0
      return -XML_TOK_CLOSE_PAREN;
1113
0
    switch (BYTE_TYPE(enc, ptr)) {
1114
0
    case BT_AST:
1115
0
      *nextTokPtr = ptr + MINBPC(enc);
1116
0
      return XML_TOK_CLOSE_PAREN_ASTERISK;
1117
0
    case BT_QUEST:
1118
0
      *nextTokPtr = ptr + MINBPC(enc);
1119
0
      return XML_TOK_CLOSE_PAREN_QUESTION;
1120
0
    case BT_PLUS:
1121
0
      *nextTokPtr = ptr + MINBPC(enc);
1122
0
      return XML_TOK_CLOSE_PAREN_PLUS;
1123
0
    case BT_CR:
1124
0
    case BT_LF:
1125
0
    case BT_S:
1126
0
    case BT_GT:
1127
0
    case BT_COMMA:
1128
0
    case BT_VERBAR:
1129
0
    case BT_RPAR:
1130
0
      *nextTokPtr = ptr;
1131
0
      return XML_TOK_CLOSE_PAREN;
1132
0
    }
1133
0
    *nextTokPtr = ptr;
1134
0
    return XML_TOK_INVALID;
1135
0
  case BT_VERBAR:
1136
0
    *nextTokPtr = ptr + MINBPC(enc);
1137
0
    return XML_TOK_OR;
1138
0
  case BT_GT:
1139
0
    *nextTokPtr = ptr + MINBPC(enc);
1140
0
    return XML_TOK_DECL_CLOSE;
1141
0
  case BT_NUM:
1142
0
    return PREFIX(scanPoundName)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1143
0
#  define LEAD_CASE(n)                                                         \
1144
0
  case BT_LEAD##n:                                                             \
1145
0
    if (end - ptr < n)                                                         \
1146
0
      return XML_TOK_PARTIAL_CHAR;                                             \
1147
0
    if (IS_INVALID_CHAR(enc, ptr, n)) {                                        \
1148
0
      *nextTokPtr = ptr;                                                       \
1149
0
      return XML_TOK_INVALID;                                                  \
1150
0
    }                                                                          \
1151
0
    if (IS_NMSTRT_CHAR(enc, ptr, n)) {                                         \
1152
0
      ptr += n;                                                                \
1153
0
      tok = XML_TOK_NAME;                                                      \
1154
0
      break;                                                                   \
1155
0
    }                                                                          \
1156
0
    if (IS_NAME_CHAR(enc, ptr, n)) {                                           \
1157
0
      ptr += n;                                                                \
1158
0
      tok = XML_TOK_NMTOKEN;                                                   \
1159
0
      break;                                                                   \
1160
0
    }                                                                          \
1161
0
    *nextTokPtr = ptr;                                                         \
1162
0
    return XML_TOK_INVALID;
1163
0
    LEAD_CASE(2)
1164
0
    LEAD_CASE(3)
1165
36
    LEAD_CASE(4)
1166
0
#  undef LEAD_CASE
1167
0
  case BT_NMSTRT:
1168
0
  case BT_HEX:
1169
0
    tok = XML_TOK_NAME;
1170
0
    ptr += MINBPC(enc);
1171
0
    break;
1172
0
  case BT_DIGIT:
1173
0
  case BT_NAME:
1174
0
  case BT_MINUS:
1175
#  ifdef XML_NS
1176
  case BT_COLON:
1177
#  endif
1178
0
    tok = XML_TOK_NMTOKEN;
1179
0
    ptr += MINBPC(enc);
1180
0
    break;
1181
89
  case BT_NONASCII:
1182
89
    if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {
1183
74
      ptr += MINBPC(enc);
1184
74
      tok = XML_TOK_NAME;
1185
74
      break;
1186
74
    }
1187
15
    if (IS_NAME_CHAR_MINBPC(enc, ptr)) {
1188
3
      ptr += MINBPC(enc);
1189
3
      tok = XML_TOK_NMTOKEN;
1190
3
      break;
1191
3
    }
1192
    /* fall through */
1193
17
  default:
1194
17
    *nextTokPtr = ptr;
1195
17
    return XML_TOK_INVALID;
1196
109
  }
1197
227k
  while (HAS_CHAR(enc, ptr, end)) {
1198
227k
    switch (BYTE_TYPE(enc, ptr)) {
1199
1.13M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1200
0
    case BT_GT:
1201
0
    case BT_RPAR:
1202
0
    case BT_COMMA:
1203
0
    case BT_VERBAR:
1204
0
    case BT_LSQB:
1205
0
    case BT_PERCNT:
1206
0
    case BT_S:
1207
0
    case BT_CR:
1208
0
    case BT_LF:
1209
0
      *nextTokPtr = ptr;
1210
0
      return tok;
1211
#  ifdef XML_NS
1212
    case BT_COLON:
1213
      ptr += MINBPC(enc);
1214
      switch (tok) {
1215
      case XML_TOK_NAME:
1216
        REQUIRE_CHAR(enc, ptr, end);
1217
        tok = XML_TOK_PREFIXED_NAME;
1218
        switch (BYTE_TYPE(enc, ptr)) {
1219
          CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1220
        default:
1221
          tok = XML_TOK_NMTOKEN;
1222
          break;
1223
        }
1224
        break;
1225
      case XML_TOK_PREFIXED_NAME:
1226
        tok = XML_TOK_NMTOKEN;
1227
        break;
1228
      }
1229
      break;
1230
#  endif
1231
0
    case BT_PLUS:
1232
0
      if (tok == XML_TOK_NMTOKEN) {
1233
0
        *nextTokPtr = ptr;
1234
0
        return XML_TOK_INVALID;
1235
0
      }
1236
0
      *nextTokPtr = ptr + MINBPC(enc);
1237
0
      return XML_TOK_NAME_PLUS;
1238
0
    case BT_AST:
1239
0
      if (tok == XML_TOK_NMTOKEN) {
1240
0
        *nextTokPtr = ptr;
1241
0
        return XML_TOK_INVALID;
1242
0
      }
1243
0
      *nextTokPtr = ptr + MINBPC(enc);
1244
0
      return XML_TOK_NAME_ASTERISK;
1245
0
    case BT_QUEST:
1246
0
      if (tok == XML_TOK_NMTOKEN) {
1247
0
        *nextTokPtr = ptr;
1248
0
        return XML_TOK_INVALID;
1249
0
      }
1250
0
      *nextTokPtr = ptr + MINBPC(enc);
1251
0
      return XML_TOK_NAME_QUESTION;
1252
6
    default:
1253
6
      *nextTokPtr = ptr;
1254
6
      return XML_TOK_INVALID;
1255
227k
    }
1256
227k
  }
1257
18
  return -tok;
1258
77
}
xmltok.c:big2_prologTok
Line
Count
Source
1018
103
                  const char **nextTokPtr) {
1019
103
  int tok;
1020
103
  if (ptr >= end)
1021
2
    return XML_TOK_NONE;
1022
101
  if (MINBPC(enc) > 1) {
1023
101
    size_t n = end - ptr;
1024
101
    if (n & (MINBPC(enc) - 1)) {
1025
17
      n &= ~(MINBPC(enc) - 1);
1026
17
      if (n == 0)
1027
2
        return XML_TOK_PARTIAL;
1028
15
      end = ptr + n;
1029
15
    }
1030
101
  }
1031
99
  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
38
    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
77
  case BT_NONASCII:
1182
77
    if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {
1183
58
      ptr += MINBPC(enc);
1184
58
      tok = XML_TOK_NAME;
1185
58
      break;
1186
58
    }
1187
19
    if (IS_NAME_CHAR_MINBPC(enc, ptr)) {
1188
7
      ptr += MINBPC(enc);
1189
7
      tok = XML_TOK_NMTOKEN;
1190
7
      break;
1191
7
    }
1192
    /* fall through */
1193
17
  default:
1194
17
    *nextTokPtr = ptr;
1195
17
    return XML_TOK_INVALID;
1196
99
  }
1197
842
  while (HAS_CHAR(enc, ptr, end)) {
1198
842
    switch (BYTE_TYPE(enc, ptr)) {
1199
4.03k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1200
0
    case BT_GT:
1201
0
    case BT_RPAR:
1202
0
    case BT_COMMA:
1203
0
    case BT_VERBAR:
1204
0
    case BT_LSQB:
1205
0
    case BT_PERCNT:
1206
0
    case BT_S:
1207
0
    case BT_CR:
1208
0
    case BT_LF:
1209
0
      *nextTokPtr = ptr;
1210
0
      return tok;
1211
#  ifdef XML_NS
1212
    case BT_COLON:
1213
      ptr += MINBPC(enc);
1214
      switch (tok) {
1215
      case XML_TOK_NAME:
1216
        REQUIRE_CHAR(enc, ptr, end);
1217
        tok = XML_TOK_PREFIXED_NAME;
1218
        switch (BYTE_TYPE(enc, ptr)) {
1219
          CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1220
        default:
1221
          tok = XML_TOK_NMTOKEN;
1222
          break;
1223
        }
1224
        break;
1225
      case XML_TOK_PREFIXED_NAME:
1226
        tok = XML_TOK_NMTOKEN;
1227
        break;
1228
      }
1229
      break;
1230
#  endif
1231
0
    case BT_PLUS:
1232
0
      if (tok == XML_TOK_NMTOKEN) {
1233
0
        *nextTokPtr = ptr;
1234
0
        return XML_TOK_INVALID;
1235
0
      }
1236
0
      *nextTokPtr = ptr + MINBPC(enc);
1237
0
      return XML_TOK_NAME_PLUS;
1238
0
    case BT_AST:
1239
0
      if (tok == XML_TOK_NMTOKEN) {
1240
0
        *nextTokPtr = ptr;
1241
0
        return XML_TOK_INVALID;
1242
0
      }
1243
0
      *nextTokPtr = ptr + MINBPC(enc);
1244
0
      return XML_TOK_NAME_ASTERISK;
1245
0
    case BT_QUEST:
1246
0
      if (tok == XML_TOK_NMTOKEN) {
1247
0
        *nextTokPtr = ptr;
1248
0
        return XML_TOK_INVALID;
1249
0
      }
1250
0
      *nextTokPtr = ptr + MINBPC(enc);
1251
0
      return XML_TOK_NAME_QUESTION;
1252
12
    default:
1253
12
      *nextTokPtr = ptr;
1254
12
      return XML_TOK_INVALID;
1255
842
    }
1256
842
  }
1257
22
  return -tok;
1258
65
}
1259
1260
static int PTRCALL
1261
PREFIX(attributeValueTok)(const ENCODING *enc, const char *ptr, const char *end,
1262
2.77M
                          const char **nextTokPtr) {
1263
2.77M
  const char *start;
1264
2.77M
  if (ptr >= end)
1265
79.9k
    return XML_TOK_NONE;
1266
2.69M
  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.69M
  start = ptr;
1275
23.0M
  while (HAS_CHAR(enc, ptr, end)) {
1276
23.0M
    switch (BYTE_TYPE(enc, ptr)) {
1277
0
#  define LEAD_CASE(n)                                                         \
1278
268k
  case BT_LEAD##n:                                                             \
1279
268k
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1280
268k
    break;
1281
59.8k
      LEAD_CASE(2)
1282
111k
      LEAD_CASE(3)
1283
97.4k
      LEAD_CASE(4)
1284
0
#  undef LEAD_CASE
1285
301k
    case BT_AMP:
1286
301k
      if (ptr == start)
1287
216k
        return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1288
84.6k
      *nextTokPtr = ptr;
1289
84.6k
      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
886k
    case BT_LF:
1295
886k
      if (ptr == start) {
1296
608k
        *nextTokPtr = ptr + MINBPC(enc);
1297
608k
        return XML_TOK_DATA_NEWLINE;
1298
608k
      }
1299
278k
      *nextTokPtr = ptr;
1300
278k
      return XML_TOK_DATA_CHARS;
1301
918k
    case BT_CR:
1302
918k
      if (ptr == start) {
1303
636k
        ptr += MINBPC(enc);
1304
636k
        if (! HAS_CHAR(enc, ptr, end))
1305
3.05k
          return XML_TOK_TRAILING_CR;
1306
633k
        if (BYTE_TYPE(enc, ptr) == BT_LF)
1307
138k
          ptr += MINBPC(enc);
1308
633k
        *nextTokPtr = ptr;
1309
633k
        return XML_TOK_DATA_NEWLINE;
1310
636k
      }
1311
282k
      *nextTokPtr = ptr;
1312
282k
      return XML_TOK_DATA_CHARS;
1313
526k
    case BT_S:
1314
526k
      if (ptr == start) {
1315
345k
        *nextTokPtr = ptr + MINBPC(enc);
1316
345k
        return XML_TOK_ATTRIBUTE_VALUE_S;
1317
345k
      }
1318
180k
      *nextTokPtr = ptr;
1319
180k
      return XML_TOK_DATA_CHARS;
1320
20.1M
    default:
1321
20.1M
      ptr += MINBPC(enc);
1322
20.1M
      break;
1323
23.0M
    }
1324
23.0M
  }
1325
61.7k
  *nextTokPtr = ptr;
1326
61.7k
  return XML_TOK_DATA_CHARS;
1327
2.69M
}
xmltok.c:normal_attributeValueTok
Line
Count
Source
1262
2.77M
                          const char **nextTokPtr) {
1263
2.77M
  const char *start;
1264
2.77M
  if (ptr >= end)
1265
79.9k
    return XML_TOK_NONE;
1266
2.69M
  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.69M
  start = ptr;
1275
23.0M
  while (HAS_CHAR(enc, ptr, end)) {
1276
23.0M
    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
59.8k
      LEAD_CASE(2)
1282
111k
      LEAD_CASE(3)
1283
97.4k
      LEAD_CASE(4)
1284
0
#  undef LEAD_CASE
1285
301k
    case BT_AMP:
1286
301k
      if (ptr == start)
1287
216k
        return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1288
84.6k
      *nextTokPtr = ptr;
1289
84.6k
      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
886k
    case BT_LF:
1295
886k
      if (ptr == start) {
1296
608k
        *nextTokPtr = ptr + MINBPC(enc);
1297
608k
        return XML_TOK_DATA_NEWLINE;
1298
608k
      }
1299
278k
      *nextTokPtr = ptr;
1300
278k
      return XML_TOK_DATA_CHARS;
1301
918k
    case BT_CR:
1302
918k
      if (ptr == start) {
1303
636k
        ptr += MINBPC(enc);
1304
636k
        if (! HAS_CHAR(enc, ptr, end))
1305
3.05k
          return XML_TOK_TRAILING_CR;
1306
633k
        if (BYTE_TYPE(enc, ptr) == BT_LF)
1307
138k
          ptr += MINBPC(enc);
1308
633k
        *nextTokPtr = ptr;
1309
633k
        return XML_TOK_DATA_NEWLINE;
1310
636k
      }
1311
282k
      *nextTokPtr = ptr;
1312
282k
      return XML_TOK_DATA_CHARS;
1313
526k
    case BT_S:
1314
526k
      if (ptr == start) {
1315
345k
        *nextTokPtr = ptr + MINBPC(enc);
1316
345k
        return XML_TOK_ATTRIBUTE_VALUE_S;
1317
345k
      }
1318
180k
      *nextTokPtr = ptr;
1319
180k
      return XML_TOK_DATA_CHARS;
1320
20.1M
    default:
1321
20.1M
      ptr += MINBPC(enc);
1322
20.1M
      break;
1323
23.0M
    }
1324
23.0M
  }
1325
61.7k
  *nextTokPtr = ptr;
1326
61.7k
  return XML_TOK_DATA_CHARS;
1327
2.69M
}
Unexecuted instantiation: xmltok.c:little2_attributeValueTok
Unexecuted instantiation: xmltok.c:big2_attributeValueTok
1328
1329
static int PTRCALL
1330
PREFIX(entityValueTok)(const ENCODING *enc, const char *ptr, const char *end,
1331
0
                       const char **nextTokPtr) {
1332
0
  const char *start;
1333
0
  if (ptr >= end)
1334
0
    return XML_TOK_NONE;
1335
0
  else if (! HAS_CHAR(enc, ptr, end)) {
1336
    /* This line cannot be executed.  The incoming data has already
1337
     * been tokenized once, so incomplete characters like this have
1338
     * already been eliminated from the input.  Retaining the paranoia
1339
     * check is still valuable, however.
1340
     */
1341
0
    return XML_TOK_PARTIAL; /* LCOV_EXCL_LINE */
1342
0
  }
1343
0
  start = ptr;
1344
0
  while (HAS_CHAR(enc, ptr, end)) {
1345
0
    switch (BYTE_TYPE(enc, ptr)) {
1346
0
#  define LEAD_CASE(n)                                                         \
1347
0
  case BT_LEAD##n:                                                             \
1348
0
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1349
0
    break;
1350
0
      LEAD_CASE(2)
1351
0
      LEAD_CASE(3)
1352
0
      LEAD_CASE(4)
1353
0
#  undef LEAD_CASE
1354
0
    case BT_AMP:
1355
0
      if (ptr == start)
1356
0
        return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1357
0
      *nextTokPtr = ptr;
1358
0
      return XML_TOK_DATA_CHARS;
1359
0
    case BT_PERCNT:
1360
0
      if (ptr == start) {
1361
0
        int tok = PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1362
0
        return (tok == XML_TOK_PERCENT) ? XML_TOK_INVALID : tok;
1363
0
      }
1364
0
      *nextTokPtr = ptr;
1365
0
      return XML_TOK_DATA_CHARS;
1366
0
    case BT_LF:
1367
0
      if (ptr == start) {
1368
0
        *nextTokPtr = ptr + MINBPC(enc);
1369
0
        return XML_TOK_DATA_NEWLINE;
1370
0
      }
1371
0
      *nextTokPtr = ptr;
1372
0
      return XML_TOK_DATA_CHARS;
1373
0
    case BT_CR:
1374
0
      if (ptr == start) {
1375
0
        ptr += MINBPC(enc);
1376
0
        if (! HAS_CHAR(enc, ptr, end))
1377
0
          return XML_TOK_TRAILING_CR;
1378
0
        if (BYTE_TYPE(enc, ptr) == BT_LF)
1379
0
          ptr += MINBPC(enc);
1380
0
        *nextTokPtr = ptr;
1381
0
        return XML_TOK_DATA_NEWLINE;
1382
0
      }
1383
0
      *nextTokPtr = ptr;
1384
0
      return XML_TOK_DATA_CHARS;
1385
0
    default:
1386
0
      ptr += MINBPC(enc);
1387
0
      break;
1388
0
    }
1389
0
  }
1390
0
  *nextTokPtr = ptr;
1391
0
  return XML_TOK_DATA_CHARS;
1392
0
}
Unexecuted instantiation: xmltok.c:normal_entityValueTok
Unexecuted instantiation: xmltok.c:little2_entityValueTok
Unexecuted instantiation: xmltok.c:big2_entityValueTok
1393
1394
#  ifdef XML_DTD
1395
1396
static int PTRCALL
1397
PREFIX(ignoreSectionTok)(const ENCODING *enc, const char *ptr, const char *end,
1398
                         const char **nextTokPtr) {
1399
  int level = 0;
1400
  if (MINBPC(enc) > 1) {
1401
    size_t n = end - ptr;
1402
    if (n & (MINBPC(enc) - 1)) {
1403
      n &= ~(MINBPC(enc) - 1);
1404
      end = ptr + n;
1405
    }
1406
  }
1407
  while (HAS_CHAR(enc, ptr, end)) {
1408
    switch (BYTE_TYPE(enc, ptr)) {
1409
      INVALID_CASES(ptr, nextTokPtr)
1410
    case BT_LT:
1411
      ptr += MINBPC(enc);
1412
      REQUIRE_CHAR(enc, ptr, end);
1413
      if (CHAR_MATCHES(enc, ptr, ASCII_EXCL)) {
1414
        ptr += MINBPC(enc);
1415
        REQUIRE_CHAR(enc, ptr, end);
1416
        if (CHAR_MATCHES(enc, ptr, ASCII_LSQB)) {
1417
          ++level;
1418
          ptr += MINBPC(enc);
1419
        }
1420
      }
1421
      break;
1422
    case BT_RSQB:
1423
      ptr += MINBPC(enc);
1424
      REQUIRE_CHAR(enc, ptr, end);
1425
      if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) {
1426
        ptr += MINBPC(enc);
1427
        REQUIRE_CHAR(enc, ptr, end);
1428
        if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
1429
          ptr += MINBPC(enc);
1430
          if (level == 0) {
1431
            *nextTokPtr = ptr;
1432
            return XML_TOK_IGNORE_SECT;
1433
          }
1434
          --level;
1435
        }
1436
      }
1437
      break;
1438
    default:
1439
      ptr += MINBPC(enc);
1440
      break;
1441
    }
1442
  }
1443
  return XML_TOK_PARTIAL;
1444
}
1445
1446
#  endif /* XML_DTD */
1447
1448
static int PTRCALL
1449
PREFIX(isPublicId)(const ENCODING *enc, const char *ptr, const char *end,
1450
3.17k
                   const char **badPtr) {
1451
3.17k
  ptr += MINBPC(enc);
1452
3.17k
  end -= MINBPC(enc);
1453
2.20M
  for (; HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
1454
2.20M
    switch (BYTE_TYPE(enc, ptr)) {
1455
887k
    case BT_DIGIT:
1456
1.36M
    case BT_HEX:
1457
1.37M
    case BT_MINUS:
1458
1.44M
    case BT_APOS:
1459
1.44M
    case BT_LPAR:
1460
1.58M
    case BT_RPAR:
1461
1.59M
    case BT_PLUS:
1462
1.60M
    case BT_COMMA:
1463
1.81M
    case BT_SOL:
1464
1.81M
    case BT_EQUALS:
1465
1.83M
    case BT_QUEST:
1466
1.84M
    case BT_CR:
1467
1.84M
    case BT_LF:
1468
1.84M
    case BT_SEMI:
1469
1.84M
    case BT_EXCL:
1470
1.85M
    case BT_AST:
1471
1.86M
    case BT_PERCNT:
1472
1.88M
    case BT_NUM:
1473
#  ifdef XML_NS
1474
    case BT_COLON:
1475
#  endif
1476
1.88M
      break;
1477
5.67k
    case BT_S:
1478
5.67k
      if (CHAR_MATCHES(enc, ptr, ASCII_TAB)) {
1479
1
        *badPtr = ptr;
1480
1
        return 0;
1481
1
      }
1482
5.67k
      break;
1483
11.9k
    case BT_NAME:
1484
299k
    case BT_NMSTRT:
1485
299k
      if (! (BYTE_TO_ASCII(enc, ptr) & ~0x7f))
1486
299k
        break;
1487
      /* fall through */
1488
8.40k
    default:
1489
8.40k
      switch (BYTE_TO_ASCII(enc, ptr)) {
1490
4.63k
      case 0x24: /* $ */
1491
8.40k
      case 0x40: /* @ */
1492
8.40k
        break;
1493
5
      default:
1494
5
        *badPtr = ptr;
1495
5
        return 0;
1496
8.40k
      }
1497
8.40k
      break;
1498
2.20M
    }
1499
2.20M
  }
1500
3.16k
  return 1;
1501
3.17k
}
xmltok.c:normal_isPublicId
Line
Count
Source
1450
3.17k
                   const char **badPtr) {
1451
3.17k
  ptr += MINBPC(enc);
1452
3.17k
  end -= MINBPC(enc);
1453
2.20M
  for (; HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
1454
2.20M
    switch (BYTE_TYPE(enc, ptr)) {
1455
887k
    case BT_DIGIT:
1456
1.36M
    case BT_HEX:
1457
1.37M
    case BT_MINUS:
1458
1.44M
    case BT_APOS:
1459
1.44M
    case BT_LPAR:
1460
1.58M
    case BT_RPAR:
1461
1.59M
    case BT_PLUS:
1462
1.60M
    case BT_COMMA:
1463
1.81M
    case BT_SOL:
1464
1.81M
    case BT_EQUALS:
1465
1.83M
    case BT_QUEST:
1466
1.84M
    case BT_CR:
1467
1.84M
    case BT_LF:
1468
1.84M
    case BT_SEMI:
1469
1.84M
    case BT_EXCL:
1470
1.85M
    case BT_AST:
1471
1.86M
    case BT_PERCNT:
1472
1.88M
    case BT_NUM:
1473
#  ifdef XML_NS
1474
    case BT_COLON:
1475
#  endif
1476
1.88M
      break;
1477
5.67k
    case BT_S:
1478
5.67k
      if (CHAR_MATCHES(enc, ptr, ASCII_TAB)) {
1479
1
        *badPtr = ptr;
1480
1
        return 0;
1481
1
      }
1482
5.67k
      break;
1483
11.9k
    case BT_NAME:
1484
299k
    case BT_NMSTRT:
1485
299k
      if (! (BYTE_TO_ASCII(enc, ptr) & ~0x7f))
1486
299k
        break;
1487
      /* fall through */
1488
8.40k
    default:
1489
8.40k
      switch (BYTE_TO_ASCII(enc, ptr)) {
1490
4.63k
      case 0x24: /* $ */
1491
8.40k
      case 0x40: /* @ */
1492
8.40k
        break;
1493
5
      default:
1494
5
        *badPtr = ptr;
1495
5
        return 0;
1496
8.40k
      }
1497
8.40k
      break;
1498
2.20M
    }
1499
2.20M
  }
1500
3.16k
  return 1;
1501
3.17k
}
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
365k
                ATTRIBUTE *atts) {
1511
365k
  enum { other, inName, inValue } state = inName;
1512
365k
  int nAtts = 0;
1513
365k
  int open = 0; /* defined when state == inValue;
1514
                   initialization just to shut up compilers */
1515
1516
62.7M
  for (ptr += MINBPC(enc);; ptr += MINBPC(enc)) {
1517
62.7M
    switch (BYTE_TYPE(enc, ptr)) {
1518
0
#  define START_NAME                                                           \
1519
32.7M
    if (state == other) {                                                      \
1520
5.68M
      if (nAtts < attsMax) {                                                   \
1521
2.92M
        atts[nAtts].name = ptr;                                                \
1522
2.92M
        atts[nAtts].normalized = 1;                                            \
1523
2.92M
      }                                                                        \
1524
5.68M
      state = inName;                                                          \
1525
5.68M
    }
1526
0
#  define LEAD_CASE(n)                                                         \
1527
359k
  case BT_LEAD##n: /* NOTE: The encoding has already been validated. */        \
1528
359k
    START_NAME ptr += (n - MINBPC(enc));                                       \
1529
359k
    break;
1530
124k
      LEAD_CASE(2)
1531
170k
      LEAD_CASE(3)
1532
65.0k
      LEAD_CASE(4)
1533
0
#  undef LEAD_CASE
1534
0
    case BT_NONASCII:
1535
30.5M
    case BT_NMSTRT:
1536
32.3M
    case BT_HEX:
1537
32.3M
      START_NAME
1538
32.3M
      break;
1539
0
#  undef START_NAME
1540
903k
    case BT_QUOT:
1541
903k
      if (state != inValue) {
1542
378k
        if (nAtts < attsMax)
1543
267k
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1544
378k
        state = inValue;
1545
378k
        open = BT_QUOT;
1546
524k
      } else if (open == BT_QUOT) {
1547
378k
        state = other;
1548
378k
        if (nAtts < attsMax)
1549
267k
          atts[nAtts].valueEnd = ptr;
1550
378k
        nAtts++;
1551
378k
      }
1552
903k
      break;
1553
10.8M
    case BT_APOS:
1554
10.8M
      if (state != inValue) {
1555
5.30M
        if (nAtts < attsMax)
1556
2.66M
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1557
5.30M
        state = inValue;
1558
5.30M
        open = BT_APOS;
1559
5.53M
      } else if (open == BT_APOS) {
1560
5.30M
        state = other;
1561
5.30M
        if (nAtts < attsMax)
1562
2.66M
          atts[nAtts].valueEnd = ptr;
1563
5.30M
        nAtts++;
1564
5.30M
      }
1565
10.8M
      break;
1566
119k
    case BT_AMP:
1567
119k
      if (nAtts < attsMax)
1568
117k
        atts[nAtts].normalized = 0;
1569
119k
      break;
1570
4.13M
    case BT_S:
1571
4.13M
      if (state == inName)
1572
138k
        state = other;
1573
3.99M
      else if (state == inValue && nAtts < attsMax && atts[nAtts].normalized
1574
3.99M
               && (ptr == atts[nAtts].valuePtr
1575
114k
                   || BYTE_TO_ASCII(enc, ptr) != ASCII_SPACE
1576
114k
                   || BYTE_TO_ASCII(enc, ptr + MINBPC(enc)) == ASCII_SPACE
1577
114k
                   || BYTE_TYPE(enc, ptr + MINBPC(enc)) == open))
1578
108k
        atts[nAtts].normalized = 0;
1579
4.13M
      break;
1580
3.42M
    case BT_CR:
1581
4.27M
    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.27M
      if (state == inName)
1585
31.1k
        state = other;
1586
4.24M
      else if (state == inValue && nAtts < attsMax)
1587
1.28M
        atts[nAtts].normalized = 0;
1588
4.27M
      break;
1589
193k
    case BT_GT:
1590
422k
    case BT_SOL:
1591
422k
      if (state != inValue)
1592
365k
        return nAtts;
1593
57.0k
      break;
1594
9.35M
    default:
1595
9.35M
      break;
1596
62.7M
    }
1597
62.7M
  }
1598
  /* not reached */
1599
365k
}
xmltok.c:normal_getAtts
Line
Count
Source
1510
365k
                ATTRIBUTE *atts) {
1511
365k
  enum { other, inName, inValue } state = inName;
1512
365k
  int nAtts = 0;
1513
365k
  int open = 0; /* defined when state == inValue;
1514
                   initialization just to shut up compilers */
1515
1516
62.7M
  for (ptr += MINBPC(enc);; ptr += MINBPC(enc)) {
1517
62.7M
    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
124k
      LEAD_CASE(2)
1531
170k
      LEAD_CASE(3)
1532
65.0k
      LEAD_CASE(4)
1533
0
#  undef LEAD_CASE
1534
0
    case BT_NONASCII:
1535
30.5M
    case BT_NMSTRT:
1536
32.3M
    case BT_HEX:
1537
32.3M
      START_NAME
1538
32.3M
      break;
1539
0
#  undef START_NAME
1540
903k
    case BT_QUOT:
1541
903k
      if (state != inValue) {
1542
378k
        if (nAtts < attsMax)
1543
267k
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1544
378k
        state = inValue;
1545
378k
        open = BT_QUOT;
1546
524k
      } else if (open == BT_QUOT) {
1547
378k
        state = other;
1548
378k
        if (nAtts < attsMax)
1549
267k
          atts[nAtts].valueEnd = ptr;
1550
378k
        nAtts++;
1551
378k
      }
1552
903k
      break;
1553
10.8M
    case BT_APOS:
1554
10.8M
      if (state != inValue) {
1555
5.30M
        if (nAtts < attsMax)
1556
2.66M
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1557
5.30M
        state = inValue;
1558
5.30M
        open = BT_APOS;
1559
5.53M
      } else if (open == BT_APOS) {
1560
5.30M
        state = other;
1561
5.30M
        if (nAtts < attsMax)
1562
2.66M
          atts[nAtts].valueEnd = ptr;
1563
5.30M
        nAtts++;
1564
5.30M
      }
1565
10.8M
      break;
1566
119k
    case BT_AMP:
1567
119k
      if (nAtts < attsMax)
1568
117k
        atts[nAtts].normalized = 0;
1569
119k
      break;
1570
4.13M
    case BT_S:
1571
4.13M
      if (state == inName)
1572
138k
        state = other;
1573
3.99M
      else if (state == inValue && nAtts < attsMax && atts[nAtts].normalized
1574
3.99M
               && (ptr == atts[nAtts].valuePtr
1575
114k
                   || BYTE_TO_ASCII(enc, ptr) != ASCII_SPACE
1576
114k
                   || BYTE_TO_ASCII(enc, ptr + MINBPC(enc)) == ASCII_SPACE
1577
114k
                   || BYTE_TYPE(enc, ptr + MINBPC(enc)) == open))
1578
108k
        atts[nAtts].normalized = 0;
1579
4.13M
      break;
1580
3.42M
    case BT_CR:
1581
4.27M
    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.27M
      if (state == inName)
1585
31.1k
        state = other;
1586
4.24M
      else if (state == inValue && nAtts < attsMax)
1587
1.28M
        atts[nAtts].normalized = 0;
1588
4.27M
      break;
1589
193k
    case BT_GT:
1590
422k
    case BT_SOL:
1591
422k
      if (state != inValue)
1592
365k
        return nAtts;
1593
57.0k
      break;
1594
9.35M
    default:
1595
9.35M
      break;
1596
62.7M
    }
1597
62.7M
  }
1598
  /* not reached */
1599
365k
}
Unexecuted instantiation: xmltok.c:little2_getAtts
Unexecuted instantiation: xmltok.c:big2_getAtts
1600
1601
static int PTRFASTCALL
1602
128k
PREFIX(charRefNumber)(const ENCODING *enc, const char *ptr) {
1603
128k
  int result = 0;
1604
  /* skip &# */
1605
128k
  UNUSED_P(enc);
1606
128k
  ptr += 2 * MINBPC(enc);
1607
128k
  if (CHAR_MATCHES(enc, ptr, ASCII_x)) {
1608
579k
    for (ptr += MINBPC(enc); ! CHAR_MATCHES(enc, ptr, ASCII_SEMI);
1609
454k
         ptr += MINBPC(enc)) {
1610
454k
      int c = BYTE_TO_ASCII(enc, ptr);
1611
454k
      switch (c) {
1612
3.86k
      case ASCII_0:
1613
38.0k
      case ASCII_1:
1614
87.2k
      case ASCII_2:
1615
92.9k
      case ASCII_3:
1616
150k
      case ASCII_4:
1617
192k
      case ASCII_5:
1618
194k
      case ASCII_6:
1619
218k
      case ASCII_7:
1620
254k
      case ASCII_8:
1621
264k
      case ASCII_9:
1622
264k
        result <<= 4;
1623
264k
        result |= (c - ASCII_0);
1624
264k
        break;
1625
44.4k
      case ASCII_A:
1626
52.2k
      case ASCII_B:
1627
57.4k
      case ASCII_C:
1628
66.3k
      case ASCII_D:
1629
70.3k
      case ASCII_E:
1630
97.0k
      case ASCII_F:
1631
97.0k
        result <<= 4;
1632
97.0k
        result += 10 + (c - ASCII_A);
1633
97.0k
        break;
1634
513
      case ASCII_a:
1635
21.6k
      case ASCII_b:
1636
24.5k
      case ASCII_c:
1637
70.0k
      case ASCII_d:
1638
72.0k
      case ASCII_e:
1639
92.7k
      case ASCII_f:
1640
92.7k
        result <<= 4;
1641
92.7k
        result += 10 + (c - ASCII_a);
1642
92.7k
        break;
1643
454k
      }
1644
454k
      if (result >= 0x110000)
1645
19
        return -1;
1646
454k
    }
1647
125k
  } else {
1648
12.7k
    for (; ! CHAR_MATCHES(enc, ptr, ASCII_SEMI); ptr += MINBPC(enc)) {
1649
9.62k
      int c = BYTE_TO_ASCII(enc, ptr);
1650
9.62k
      result *= 10;
1651
9.62k
      result += (c - ASCII_0);
1652
9.62k
      if (result >= 0x110000)
1653
4
        return -1;
1654
9.62k
    }
1655
3.13k
  }
1656
128k
  return checkCharRefNumber(result);
1657
128k
}
xmltok.c:normal_charRefNumber
Line
Count
Source
1602
128k
PREFIX(charRefNumber)(const ENCODING *enc, const char *ptr) {
1603
128k
  int result = 0;
1604
  /* skip &# */
1605
128k
  UNUSED_P(enc);
1606
128k
  ptr += 2 * MINBPC(enc);
1607
128k
  if (CHAR_MATCHES(enc, ptr, ASCII_x)) {
1608
579k
    for (ptr += MINBPC(enc); ! CHAR_MATCHES(enc, ptr, ASCII_SEMI);
1609
454k
         ptr += MINBPC(enc)) {
1610
454k
      int c = BYTE_TO_ASCII(enc, ptr);
1611
454k
      switch (c) {
1612
3.86k
      case ASCII_0:
1613
38.0k
      case ASCII_1:
1614
87.2k
      case ASCII_2:
1615
92.9k
      case ASCII_3:
1616
150k
      case ASCII_4:
1617
192k
      case ASCII_5:
1618
194k
      case ASCII_6:
1619
218k
      case ASCII_7:
1620
254k
      case ASCII_8:
1621
264k
      case ASCII_9:
1622
264k
        result <<= 4;
1623
264k
        result |= (c - ASCII_0);
1624
264k
        break;
1625
44.4k
      case ASCII_A:
1626
52.2k
      case ASCII_B:
1627
57.4k
      case ASCII_C:
1628
66.3k
      case ASCII_D:
1629
70.3k
      case ASCII_E:
1630
97.0k
      case ASCII_F:
1631
97.0k
        result <<= 4;
1632
97.0k
        result += 10 + (c - ASCII_A);
1633
97.0k
        break;
1634
513
      case ASCII_a:
1635
21.6k
      case ASCII_b:
1636
24.5k
      case ASCII_c:
1637
70.0k
      case ASCII_d:
1638
72.0k
      case ASCII_e:
1639
92.7k
      case ASCII_f:
1640
92.7k
        result <<= 4;
1641
92.7k
        result += 10 + (c - ASCII_a);
1642
92.7k
        break;
1643
454k
      }
1644
454k
      if (result >= 0x110000)
1645
19
        return -1;
1646
454k
    }
1647
125k
  } else {
1648
12.7k
    for (; ! CHAR_MATCHES(enc, ptr, ASCII_SEMI); ptr += MINBPC(enc)) {
1649
9.62k
      int c = BYTE_TO_ASCII(enc, ptr);
1650
9.62k
      result *= 10;
1651
9.62k
      result += (c - ASCII_0);
1652
9.62k
      if (result >= 0x110000)
1653
4
        return -1;
1654
9.62k
    }
1655
3.13k
  }
1656
128k
  return checkCharRefNumber(result);
1657
128k
}
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
164k
                             const char *end) {
1662
164k
  UNUSED_P(enc);
1663
164k
  switch ((end - ptr) / MINBPC(enc)) {
1664
10.3k
  case 2:
1665
10.3k
    if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_t)) {
1666
2.43k
      switch (BYTE_TO_ASCII(enc, ptr)) {
1667
556
      case ASCII_l:
1668
556
        return ASCII_LT;
1669
205
      case ASCII_g:
1670
205
        return ASCII_GT;
1671
2.43k
      }
1672
2.43k
    }
1673
9.56k
    break;
1674
51.8k
  case 3:
1675
51.8k
    if (CHAR_MATCHES(enc, ptr, ASCII_a)) {
1676
37.2k
      ptr += MINBPC(enc);
1677
37.2k
      if (CHAR_MATCHES(enc, ptr, ASCII_m)) {
1678
34.0k
        ptr += MINBPC(enc);
1679
34.0k
        if (CHAR_MATCHES(enc, ptr, ASCII_p))
1680
33.8k
          return ASCII_AMP;
1681
34.0k
      }
1682
37.2k
    }
1683
17.9k
    break;
1684
19.2k
  case 4:
1685
19.2k
    switch (BYTE_TO_ASCII(enc, ptr)) {
1686
8.42k
    case ASCII_q:
1687
8.42k
      ptr += MINBPC(enc);
1688
8.42k
      if (CHAR_MATCHES(enc, ptr, ASCII_u)) {
1689
7.03k
        ptr += MINBPC(enc);
1690
7.03k
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1691
6.48k
          ptr += MINBPC(enc);
1692
6.48k
          if (CHAR_MATCHES(enc, ptr, ASCII_t))
1693
6.10k
            return ASCII_QUOT;
1694
6.48k
        }
1695
7.03k
      }
1696
2.31k
      break;
1697
8.27k
    case ASCII_a:
1698
8.27k
      ptr += MINBPC(enc);
1699
8.27k
      if (CHAR_MATCHES(enc, ptr, ASCII_p)) {
1700
1.44k
        ptr += MINBPC(enc);
1701
1.44k
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1702
743
          ptr += MINBPC(enc);
1703
743
          if (CHAR_MATCHES(enc, ptr, ASCII_s))
1704
379
            return ASCII_APOS;
1705
743
        }
1706
1.44k
      }
1707
7.89k
      break;
1708
19.2k
    }
1709
164k
  }
1710
123k
  return 0;
1711
164k
}
xmltok.c:normal_predefinedEntityName
Line
Count
Source
1661
164k
                             const char *end) {
1662
164k
  UNUSED_P(enc);
1663
164k
  switch ((end - ptr) / MINBPC(enc)) {
1664
10.3k
  case 2:
1665
10.3k
    if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_t)) {
1666
2.43k
      switch (BYTE_TO_ASCII(enc, ptr)) {
1667
556
      case ASCII_l:
1668
556
        return ASCII_LT;
1669
205
      case ASCII_g:
1670
205
        return ASCII_GT;
1671
2.43k
      }
1672
2.43k
    }
1673
9.56k
    break;
1674
51.8k
  case 3:
1675
51.8k
    if (CHAR_MATCHES(enc, ptr, ASCII_a)) {
1676
37.2k
      ptr += MINBPC(enc);
1677
37.2k
      if (CHAR_MATCHES(enc, ptr, ASCII_m)) {
1678
34.0k
        ptr += MINBPC(enc);
1679
34.0k
        if (CHAR_MATCHES(enc, ptr, ASCII_p))
1680
33.8k
          return ASCII_AMP;
1681
34.0k
      }
1682
37.2k
    }
1683
17.9k
    break;
1684
19.2k
  case 4:
1685
19.2k
    switch (BYTE_TO_ASCII(enc, ptr)) {
1686
8.42k
    case ASCII_q:
1687
8.42k
      ptr += MINBPC(enc);
1688
8.42k
      if (CHAR_MATCHES(enc, ptr, ASCII_u)) {
1689
7.03k
        ptr += MINBPC(enc);
1690
7.03k
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1691
6.48k
          ptr += MINBPC(enc);
1692
6.48k
          if (CHAR_MATCHES(enc, ptr, ASCII_t))
1693
6.10k
            return ASCII_QUOT;
1694
6.48k
        }
1695
7.03k
      }
1696
2.31k
      break;
1697
8.27k
    case ASCII_a:
1698
8.27k
      ptr += MINBPC(enc);
1699
8.27k
      if (CHAR_MATCHES(enc, ptr, ASCII_p)) {
1700
1.44k
        ptr += MINBPC(enc);
1701
1.44k
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1702
743
          ptr += MINBPC(enc);
1703
743
          if (CHAR_MATCHES(enc, ptr, ASCII_s))
1704
379
            return ASCII_APOS;
1705
743
        }
1706
1.44k
      }
1707
7.89k
      break;
1708
19.2k
    }
1709
164k
  }
1710
123k
  return 0;
1711
164k
}
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
248k
                         const char *end1, const char *ptr2) {
1716
248k
  UNUSED_P(enc);
1717
1.21M
  for (; *ptr2; ptr1 += MINBPC(enc), ptr2++) {
1718
1.05M
    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
45
      return 0; /* LCOV_EXCL_LINE */
1725
45
    }
1726
1.05M
    if (! CHAR_MATCHES(enc, ptr1, *ptr2))
1727
91.0k
      return 0;
1728
1.05M
  }
1729
157k
  return ptr1 == end1;
1730
248k
}
xmltok.c:normal_nameMatchesAscii
Line
Count
Source
1715
248k
                         const char *end1, const char *ptr2) {
1716
248k
  UNUSED_P(enc);
1717
1.21M
  for (; *ptr2; ptr1 += MINBPC(enc), ptr2++) {
1718
1.05M
    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
45
      return 0; /* LCOV_EXCL_LINE */
1725
45
    }
1726
1.05M
    if (! CHAR_MATCHES(enc, ptr1, *ptr2))
1727
91.0k
      return 0;
1728
1.05M
  }
1729
157k
  return ptr1 == end1;
1730
248k
}
Unexecuted instantiation: xmltok.c:little2_nameMatchesAscii
Unexecuted instantiation: xmltok.c:big2_nameMatchesAscii
1731
1732
static int PTRFASTCALL
1733
573k
PREFIX(nameLength)(const ENCODING *enc, const char *ptr) {
1734
573k
  const char *start = ptr;
1735
11.3M
  for (;;) {
1736
11.3M
    switch (BYTE_TYPE(enc, ptr)) {
1737
0
#  define LEAD_CASE(n)                                                         \
1738
147k
  case BT_LEAD##n:                                                             \
1739
147k
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1740
147k
    break;
1741
73.2k
      LEAD_CASE(2)
1742
74.4k
      LEAD_CASE(3)
1743
0
      LEAD_CASE(4)
1744
0
#  undef LEAD_CASE
1745
0
    case BT_NONASCII:
1746
9.37M
    case BT_NMSTRT:
1747
#  ifdef XML_NS
1748
    case BT_COLON:
1749
#  endif
1750
10.3M
    case BT_HEX:
1751
10.5M
    case BT_DIGIT:
1752
10.5M
    case BT_NAME:
1753
10.6M
    case BT_MINUS:
1754
10.6M
      ptr += MINBPC(enc);
1755
10.6M
      break;
1756
573k
    default:
1757
573k
      return (int)(ptr - start);
1758
11.3M
    }
1759
11.3M
  }
1760
573k
}
xmltok.c:normal_nameLength
Line
Count
Source
1733
573k
PREFIX(nameLength)(const ENCODING *enc, const char *ptr) {
1734
573k
  const char *start = ptr;
1735
11.3M
  for (;;) {
1736
11.3M
    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
73.2k
      LEAD_CASE(2)
1742
74.4k
      LEAD_CASE(3)
1743
0
      LEAD_CASE(4)
1744
0
#  undef LEAD_CASE
1745
0
    case BT_NONASCII:
1746
9.37M
    case BT_NMSTRT:
1747
#  ifdef XML_NS
1748
    case BT_COLON:
1749
#  endif
1750
10.3M
    case BT_HEX:
1751
10.5M
    case BT_DIGIT:
1752
10.5M
    case BT_NAME:
1753
10.6M
    case BT_MINUS:
1754
10.6M
      ptr += MINBPC(enc);
1755
10.6M
      break;
1756
573k
    default:
1757
573k
      return (int)(ptr - start);
1758
11.3M
    }
1759
11.3M
  }
1760
573k
}
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
17.3k
                       POSITION *pos) {
1780
127M
  while (HAS_CHAR(enc, ptr, end)) {
1781
127M
    switch (BYTE_TYPE(enc, ptr)) {
1782
0
#  define LEAD_CASE(n)                                                         \
1783
1.94M
  case BT_LEAD##n:                                                             \
1784
1.94M
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1785
1.94M
    pos->columnNumber++;                                                       \
1786
1.94M
    break;
1787
796k
      LEAD_CASE(2)
1788
891k
      LEAD_CASE(3)
1789
254k
      LEAD_CASE(4)
1790
0
#  undef LEAD_CASE
1791
3.15M
    case BT_LF:
1792
3.15M
      pos->columnNumber = 0;
1793
3.15M
      pos->lineNumber++;
1794
3.15M
      ptr += MINBPC(enc);
1795
3.15M
      break;
1796
4.61M
    case BT_CR:
1797
4.61M
      pos->lineNumber++;
1798
4.61M
      ptr += MINBPC(enc);
1799
4.61M
      if (HAS_CHAR(enc, ptr, end) && BYTE_TYPE(enc, ptr) == BT_LF)
1800
856k
        ptr += MINBPC(enc);
1801
4.61M
      pos->columnNumber = 0;
1802
4.61M
      break;
1803
117M
    default:
1804
117M
      ptr += MINBPC(enc);
1805
117M
      pos->columnNumber++;
1806
117M
      break;
1807
127M
    }
1808
127M
  }
1809
17.3k
}
xmltok.c:normal_updatePosition
Line
Count
Source
1779
16.9k
                       POSITION *pos) {
1780
126M
  while (HAS_CHAR(enc, ptr, end)) {
1781
126M
    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
796k
      LEAD_CASE(2)
1788
891k
      LEAD_CASE(3)
1789
254k
      LEAD_CASE(4)
1790
0
#  undef LEAD_CASE
1791
3.15M
    case BT_LF:
1792
3.15M
      pos->columnNumber = 0;
1793
3.15M
      pos->lineNumber++;
1794
3.15M
      ptr += MINBPC(enc);
1795
3.15M
      break;
1796
4.61M
    case BT_CR:
1797
4.61M
      pos->lineNumber++;
1798
4.61M
      ptr += MINBPC(enc);
1799
4.61M
      if (HAS_CHAR(enc, ptr, end) && BYTE_TYPE(enc, ptr) == BT_LF)
1800
856k
        ptr += MINBPC(enc);
1801
4.61M
      pos->columnNumber = 0;
1802
4.61M
      break;
1803
117M
    default:
1804
117M
      ptr += MINBPC(enc);
1805
117M
      pos->columnNumber++;
1806
117M
      break;
1807
126M
    }
1808
126M
  }
1809
16.9k
}
xmltok.c:little2_updatePosition
Line
Count
Source
1779
207
                       POSITION *pos) {
1780
227k
  while (HAS_CHAR(enc, ptr, end)) {
1781
227k
    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
227k
    default:
1804
227k
      ptr += MINBPC(enc);
1805
227k
      pos->columnNumber++;
1806
227k
      break;
1807
227k
    }
1808
227k
  }
1809
207
}
xmltok.c:big2_updatePosition
Line
Count
Source
1779
182
                       POSITION *pos) {
1780
527
  while (HAS_CHAR(enc, ptr, end)) {
1781
527
    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
527
    default:
1804
527
      ptr += MINBPC(enc);
1805
527
      pos->columnNumber++;
1806
527
      break;
1807
527
    }
1808
527
  }
1809
182
}
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 */