Coverage Report

Created: 2026-02-09 06:05

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/CMake/Utilities/cmexpat/lib/xmltok_impl.c
Line
Count
Source
1
/* This file is included (from xmltok.c, 1-3 times depending on XML_MIN_SIZE)!
2
                            __  __            _
3
                         ___\ \/ /_ __   __ _| |_
4
                        / _ \\  /| '_ \ / _` | __|
5
                       |  __//  \| |_) | (_| | |_
6
                        \___/_/\_\ .__/ \__,_|\__|
7
                                 |_| XML parser
8
9
   Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
10
   Copyright (c) 2000      Clark Cooper <coopercc@users.sourceforge.net>
11
   Copyright (c) 2002      Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
12
   Copyright (c) 2002-2016 Karl Waclawek <karl@waclawek.net>
13
   Copyright (c) 2016-2022 Sebastian Pipping <sebastian@pipping.org>
14
   Copyright (c) 2017      Rhodri James <rhodri@wildebeest.org.uk>
15
   Copyright (c) 2018      Benjamin Peterson <benjamin@python.org>
16
   Copyright (c) 2018      Anton Maklakov <antmak.pub@gmail.com>
17
   Copyright (c) 2019      David Loffredo <loffredo@steptools.com>
18
   Copyright (c) 2020      Boris Kolpackov <boris@codesynthesis.com>
19
   Copyright (c) 2022      Martin Ettl <ettl.martin78@googlemail.com>
20
   Licensed under the MIT license:
21
22
   Permission is  hereby granted,  free of charge,  to any  person obtaining
23
   a  copy  of  this  software   and  associated  documentation  files  (the
24
   "Software"),  to  deal in  the  Software  without restriction,  including
25
   without  limitation the  rights  to use,  copy,  modify, merge,  publish,
26
   distribute, sublicense, and/or sell copies of the Software, and to permit
27
   persons  to whom  the Software  is  furnished to  do so,  subject to  the
28
   following conditions:
29
30
   The above copyright  notice and this permission notice  shall be included
31
   in all copies or substantial portions of the Software.
32
33
   THE  SOFTWARE  IS  PROVIDED  "AS  IS",  WITHOUT  WARRANTY  OF  ANY  KIND,
34
   EXPRESS  OR IMPLIED,  INCLUDING  BUT  NOT LIMITED  TO  THE WARRANTIES  OF
35
   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
36
   NO EVENT SHALL THE AUTHORS OR  COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
37
   DAMAGES OR  OTHER LIABILITY, WHETHER  IN AN  ACTION OF CONTRACT,  TORT OR
38
   OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
39
   USE OR OTHER DEALINGS IN THE SOFTWARE.
40
*/
41
42
#ifdef XML_TOK_IMPL_C
43
44
#  ifndef IS_INVALID_CHAR // i.e. for UTF-16 and XML_MIN_SIZE not defined
45
84
#    define IS_INVALID_CHAR(enc, ptr, n) (0)
46
#  endif
47
48
#  define INVALID_LEAD_CASE(n, ptr, nextTokPtr)                                \
49
807k
  case BT_LEAD##n:                                                             \
50
807k
    if (end - ptr < n)                                                         \
51
807k
      return XML_TOK_PARTIAL_CHAR;                                             \
52
807k
    if (IS_INVALID_CHAR(enc, ptr, n)) {                                        \
53
104
      *(nextTokPtr) = (ptr);                                                   \
54
104
      return XML_TOK_INVALID;                                                  \
55
104
    }                                                                          \
56
807k
    ptr += n;                                                                  \
57
807k
    break;
58
59
#  define INVALID_CASES(ptr, nextTokPtr)                                       \
60
336k
    INVALID_LEAD_CASE(2, ptr, nextTokPtr)                                      \
61
335k
    INVALID_LEAD_CASE(3, ptr, nextTokPtr)                                      \
62
318k
    INVALID_LEAD_CASE(4, ptr, nextTokPtr)                                      \
63
153k
  case BT_NONXML:                                                              \
64
61
  case BT_MALFORM:                                                             \
65
104
  case BT_TRAIL:                                                               \
66
104
    *(nextTokPtr) = (ptr);                                                     \
67
104
    return XML_TOK_INVALID;
68
69
#  define CHECK_NAME_CASE(n, enc, ptr, end, nextTokPtr)                        \
70
264k
  case BT_LEAD##n:                                                             \
71
264k
    if (end - ptr < n)                                                         \
72
263k
      return XML_TOK_PARTIAL_CHAR;                                             \
73
264k
    if (IS_INVALID_CHAR(enc, ptr, n) || ! IS_NAME_CHAR(enc, ptr, n)) {         \
74
278
      *nextTokPtr = ptr;                                                       \
75
278
      return XML_TOK_INVALID;                                                  \
76
278
    }                                                                          \
77
264k
    ptr += n;                                                                  \
78
263k
    break;
79
80
#  define CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)                          \
81
27.9M
  case BT_NONASCII:                                                            \
82
27.9M
    if (! IS_NAME_CHAR_MINBPC(enc, ptr)) {                                     \
83
42
      *nextTokPtr = ptr;                                                       \
84
42
      return XML_TOK_INVALID;                                                  \
85
42
    }                                                                          \
86
27.9M
    /* fall through */                                                         \
87
27.9M
  case BT_NMSTRT:                                                              \
88
20.9M
  case BT_HEX:                                                                 \
89
27.7M
  case BT_DIGIT:                                                               \
90
27.7M
  case BT_NAME:                                                                \
91
27.9M
  case BT_MINUS:                                                               \
92
27.9M
    ptr += MINBPC(enc);                                                        \
93
27.9M
    break;                                                                     \
94
27.9M
    CHECK_NAME_CASE(2, enc, ptr, end, nextTokPtr)                              \
95
136k
    CHECK_NAME_CASE(3, enc, ptr, end, nextTokPtr)                              \
96
135k
    CHECK_NAME_CASE(4, enc, ptr, end, nextTokPtr)
97
98
#  define CHECK_NMSTRT_CASE(n, enc, ptr, end, nextTokPtr)                      \
99
131k
  case BT_LEAD##n:                                                             \
100
131k
    if ((end) - (ptr) < (n))                                                   \
101
131k
      return XML_TOK_PARTIAL_CHAR;                                             \
102
131k
    if (IS_INVALID_CHAR(enc, ptr, n) || ! IS_NMSTRT_CHAR(enc, ptr, n)) {       \
103
147
      *nextTokPtr = ptr;                                                       \
104
147
      return XML_TOK_INVALID;                                                  \
105
147
    }                                                                          \
106
131k
    ptr += n;                                                                  \
107
131k
    break;
108
109
#  define CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)                        \
110
2.62M
  case BT_NONASCII:                                                            \
111
2.62M
    if (! IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {                                   \
112
0
      *nextTokPtr = ptr;                                                       \
113
0
      return XML_TOK_INVALID;                                                  \
114
0
    }                                                                          \
115
2.62M
    /* fall through */                                                         \
116
2.62M
  case BT_NMSTRT:                                                              \
117
2.62M
  case BT_HEX:                                                                 \
118
2.62M
    ptr += MINBPC(enc);                                                        \
119
2.62M
    break;                                                                     \
120
2.62M
    CHECK_NMSTRT_CASE(2, enc, ptr, end, nextTokPtr)                            \
121
80.3k
    CHECK_NMSTRT_CASE(3, enc, ptr, end, nextTokPtr)                            \
122
51.0k
    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
301M
    ((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
29.3M
    {                                                                          \
135
29.3M
      if (! HAS_CHARS(enc, ptr, end, count)) {                                 \
136
549
        return XML_TOK_PARTIAL;                                                \
137
549
      }                                                                        \
138
29.3M
    }
139
140
29.3M
#  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
26.5k
                    const char **nextTokPtr) {
147
26.5k
  if (HAS_CHAR(enc, ptr, end)) {
148
26.5k
    if (! CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
149
10
      *nextTokPtr = ptr;
150
10
      return XML_TOK_INVALID;
151
10
    }
152
26.4k
    ptr += MINBPC(enc);
153
4.83M
    while (HAS_CHAR(enc, ptr, end)) {
154
4.83M
      switch (BYTE_TYPE(enc, ptr)) {
155
283k
        INVALID_CASES(ptr, nextTokPtr)
156
45.6k
      case BT_MINUS:
157
45.6k
        ptr += MINBPC(enc);
158
45.6k
        REQUIRE_CHAR(enc, ptr, end);
159
45.6k
        if (CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
160
26.3k
          ptr += MINBPC(enc);
161
26.3k
          REQUIRE_CHAR(enc, ptr, end);
162
26.3k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
163
8
            *nextTokPtr = ptr;
164
8
            return XML_TOK_INVALID;
165
8
          }
166
26.3k
          *nextTokPtr = ptr + MINBPC(enc);
167
26.3k
          return XML_TOK_COMMENT;
168
26.3k
        }
169
19.3k
        break;
170
4.64M
      default:
171
4.64M
        ptr += MINBPC(enc);
172
4.64M
        break;
173
4.83M
      }
174
4.83M
    }
175
26.4k
  }
176
68
  return XML_TOK_PARTIAL;
177
26.5k
}
xmltok.c:normal_scanComment
Line
Count
Source
146
26.5k
                    const char **nextTokPtr) {
147
26.5k
  if (HAS_CHAR(enc, ptr, end)) {
148
26.5k
    if (! CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
149
10
      *nextTokPtr = ptr;
150
10
      return XML_TOK_INVALID;
151
10
    }
152
26.4k
    ptr += MINBPC(enc);
153
4.83M
    while (HAS_CHAR(enc, ptr, end)) {
154
4.83M
      switch (BYTE_TYPE(enc, ptr)) {
155
283k
        INVALID_CASES(ptr, nextTokPtr)
156
45.6k
      case BT_MINUS:
157
45.6k
        ptr += MINBPC(enc);
158
45.6k
        REQUIRE_CHAR(enc, ptr, end);
159
45.6k
        if (CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
160
26.3k
          ptr += MINBPC(enc);
161
26.3k
          REQUIRE_CHAR(enc, ptr, end);
162
26.3k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
163
8
            *nextTokPtr = ptr;
164
8
            return XML_TOK_INVALID;
165
8
          }
166
26.3k
          *nextTokPtr = ptr + MINBPC(enc);
167
26.3k
          return XML_TOK_COMMENT;
168
26.3k
        }
169
19.3k
        break;
170
4.64M
      default:
171
4.64M
        ptr += MINBPC(enc);
172
4.64M
        break;
173
4.83M
      }
174
4.83M
    }
175
26.4k
  }
176
68
  return XML_TOK_PARTIAL;
177
26.5k
}
Unexecuted instantiation: xmltok.c:little2_scanComment
Unexecuted instantiation: xmltok.c:big2_scanComment
178
179
/* ptr points to character following "<!" */
180
181
static int PTRCALL
182
PREFIX(scanDecl)(const ENCODING *enc, const char *ptr, const char *end,
183
52.4k
                 const char **nextTokPtr) {
184
52.4k
  REQUIRE_CHAR(enc, ptr, end);
185
52.4k
  switch (BYTE_TYPE(enc, ptr)) {
186
1.80k
  case BT_MINUS:
187
1.80k
    return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
188
1
  case BT_LSQB:
189
1
    *nextTokPtr = ptr + MINBPC(enc);
190
1
    return XML_TOK_COND_SECT_OPEN;
191
1.14k
  case BT_NMSTRT:
192
50.6k
  case BT_HEX:
193
50.6k
    ptr += MINBPC(enc);
194
50.6k
    break;
195
1
  default:
196
1
    *nextTokPtr = ptr;
197
1
    return XML_TOK_INVALID;
198
52.4k
  }
199
346k
  while (HAS_CHAR(enc, ptr, end)) {
200
346k
    switch (BYTE_TYPE(enc, ptr)) {
201
22
    case BT_PERCNT:
202
22
      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
21.9k
    case BT_S:
214
45.8k
    case BT_CR:
215
50.5k
    case BT_LF:
216
50.5k
      *nextTokPtr = ptr;
217
50.5k
      return XML_TOK_DECL_OPEN;
218
281k
    case BT_NMSTRT:
219
296k
    case BT_HEX:
220
296k
      ptr += MINBPC(enc);
221
296k
      break;
222
12
    default:
223
12
      *nextTokPtr = ptr;
224
12
      return XML_TOK_INVALID;
225
346k
    }
226
346k
  }
227
66
  return XML_TOK_PARTIAL;
228
50.6k
}
xmltok.c:normal_scanDecl
Line
Count
Source
183
52.4k
                 const char **nextTokPtr) {
184
52.4k
  REQUIRE_CHAR(enc, ptr, end);
185
52.4k
  switch (BYTE_TYPE(enc, ptr)) {
186
1.80k
  case BT_MINUS:
187
1.80k
    return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
188
1
  case BT_LSQB:
189
1
    *nextTokPtr = ptr + MINBPC(enc);
190
1
    return XML_TOK_COND_SECT_OPEN;
191
1.14k
  case BT_NMSTRT:
192
50.6k
  case BT_HEX:
193
50.6k
    ptr += MINBPC(enc);
194
50.6k
    break;
195
1
  default:
196
1
    *nextTokPtr = ptr;
197
1
    return XML_TOK_INVALID;
198
52.4k
  }
199
346k
  while (HAS_CHAR(enc, ptr, end)) {
200
346k
    switch (BYTE_TYPE(enc, ptr)) {
201
22
    case BT_PERCNT:
202
22
      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
21.9k
    case BT_S:
214
45.8k
    case BT_CR:
215
50.5k
    case BT_LF:
216
50.5k
      *nextTokPtr = ptr;
217
50.5k
      return XML_TOK_DECL_OPEN;
218
281k
    case BT_NMSTRT:
219
296k
    case BT_HEX:
220
296k
      ptr += MINBPC(enc);
221
296k
      break;
222
12
    default:
223
12
      *nextTokPtr = ptr;
224
12
      return XML_TOK_INVALID;
225
346k
    }
226
346k
  }
227
66
  return XML_TOK_PARTIAL;
228
50.6k
}
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
34.4k
                      int *tokPtr) {
233
34.4k
  int upper = 0;
234
34.4k
  UNUSED_P(enc);
235
34.4k
  *tokPtr = XML_TOK_PI;
236
34.4k
  if (end - ptr != MINBPC(enc) * 3)
237
23.1k
    return 1;
238
11.3k
  switch (BYTE_TO_ASCII(enc, ptr)) {
239
4.70k
  case ASCII_x:
240
4.70k
    break;
241
1.86k
  case ASCII_X:
242
1.86k
    upper = 1;
243
1.86k
    break;
244
4.77k
  default:
245
4.77k
    return 1;
246
11.3k
  }
247
6.57k
  ptr += MINBPC(enc);
248
6.57k
  switch (BYTE_TO_ASCII(enc, ptr)) {
249
1.54k
  case ASCII_m:
250
1.54k
    break;
251
758
  case ASCII_M:
252
758
    upper = 1;
253
758
    break;
254
4.27k
  default:
255
4.27k
    return 1;
256
6.57k
  }
257
2.30k
  ptr += MINBPC(enc);
258
2.30k
  switch (BYTE_TO_ASCII(enc, ptr)) {
259
1.13k
  case ASCII_l:
260
1.13k
    break;
261
2
  case ASCII_L:
262
2
    upper = 1;
263
2
    break;
264
1.17k
  default:
265
1.17k
    return 1;
266
2.30k
  }
267
1.13k
  if (upper)
268
5
    return 0;
269
1.12k
  *tokPtr = XML_TOK_XML_DECL;
270
1.12k
  return 1;
271
1.13k
}
xmltok.c:normal_checkPiTarget
Line
Count
Source
232
34.4k
                      int *tokPtr) {
233
34.4k
  int upper = 0;
234
34.4k
  UNUSED_P(enc);
235
34.4k
  *tokPtr = XML_TOK_PI;
236
34.4k
  if (end - ptr != MINBPC(enc) * 3)
237
23.1k
    return 1;
238
11.3k
  switch (BYTE_TO_ASCII(enc, ptr)) {
239
4.70k
  case ASCII_x:
240
4.70k
    break;
241
1.86k
  case ASCII_X:
242
1.86k
    upper = 1;
243
1.86k
    break;
244
4.77k
  default:
245
4.77k
    return 1;
246
11.3k
  }
247
6.57k
  ptr += MINBPC(enc);
248
6.57k
  switch (BYTE_TO_ASCII(enc, ptr)) {
249
1.54k
  case ASCII_m:
250
1.54k
    break;
251
758
  case ASCII_M:
252
758
    upper = 1;
253
758
    break;
254
4.27k
  default:
255
4.27k
    return 1;
256
6.57k
  }
257
2.30k
  ptr += MINBPC(enc);
258
2.30k
  switch (BYTE_TO_ASCII(enc, ptr)) {
259
1.13k
  case ASCII_l:
260
1.13k
    break;
261
2
  case ASCII_L:
262
2
    upper = 1;
263
2
    break;
264
1.17k
  default:
265
1.17k
    return 1;
266
2.30k
  }
267
1.13k
  if (upper)
268
5
    return 0;
269
1.12k
  *tokPtr = XML_TOK_XML_DECL;
270
1.12k
  return 1;
271
1.13k
}
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
34.6k
               const char **nextTokPtr) {
278
34.6k
  int tok;
279
34.6k
  const char *target = ptr;
280
34.6k
  REQUIRE_CHAR(enc, ptr, end);
281
34.6k
  switch (BYTE_TYPE(enc, ptr)) {
282
42.5k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
283
4
  default:
284
4
    *nextTokPtr = ptr;
285
4
    return XML_TOK_INVALID;
286
34.6k
  }
287
1.04M
  while (HAS_CHAR(enc, ptr, end)) {
288
1.04M
    switch (BYTE_TYPE(enc, ptr)) {
289
3.65M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
290
7.28k
    case BT_S:
291
9.56k
    case BT_CR:
292
13.8k
    case BT_LF:
293
13.8k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
294
3
        *nextTokPtr = ptr;
295
3
        return XML_TOK_INVALID;
296
3
      }
297
13.8k
      ptr += MINBPC(enc);
298
11.0M
      while (HAS_CHAR(enc, ptr, end)) {
299
11.0M
        switch (BYTE_TYPE(enc, ptr)) {
300
436k
          INVALID_CASES(ptr, nextTokPtr)
301
52.4k
        case BT_QUEST:
302
52.4k
          ptr += MINBPC(enc);
303
52.4k
          REQUIRE_CHAR(enc, ptr, end);
304
52.4k
          if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
305
13.6k
            *nextTokPtr = ptr + MINBPC(enc);
306
13.6k
            return tok;
307
13.6k
          }
308
38.7k
          break;
309
10.8M
        default:
310
10.8M
          ptr += MINBPC(enc);
311
10.8M
          break;
312
11.0M
        }
313
11.0M
      }
314
110
      return XML_TOK_PARTIAL;
315
20.5k
    case BT_QUEST:
316
20.5k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
317
2
        *nextTokPtr = ptr;
318
2
        return XML_TOK_INVALID;
319
2
      }
320
20.5k
      ptr += MINBPC(enc);
321
20.5k
      REQUIRE_CHAR(enc, ptr, end);
322
20.5k
      if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
323
20.5k
        *nextTokPtr = ptr + MINBPC(enc);
324
20.5k
        return tok;
325
20.5k
      }
326
      /* fall through */
327
30
    default:
328
30
      *nextTokPtr = ptr;
329
30
      return XML_TOK_INVALID;
330
1.04M
    }
331
1.04M
  }
332
78
  return XML_TOK_PARTIAL;
333
34.6k
}
xmltok.c:normal_scanPi
Line
Count
Source
277
34.6k
               const char **nextTokPtr) {
278
34.6k
  int tok;
279
34.6k
  const char *target = ptr;
280
34.6k
  REQUIRE_CHAR(enc, ptr, end);
281
34.6k
  switch (BYTE_TYPE(enc, ptr)) {
282
42.5k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
283
4
  default:
284
4
    *nextTokPtr = ptr;
285
4
    return XML_TOK_INVALID;
286
34.6k
  }
287
1.04M
  while (HAS_CHAR(enc, ptr, end)) {
288
1.04M
    switch (BYTE_TYPE(enc, ptr)) {
289
3.65M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
290
7.28k
    case BT_S:
291
9.56k
    case BT_CR:
292
13.8k
    case BT_LF:
293
13.8k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
294
3
        *nextTokPtr = ptr;
295
3
        return XML_TOK_INVALID;
296
3
      }
297
13.8k
      ptr += MINBPC(enc);
298
11.0M
      while (HAS_CHAR(enc, ptr, end)) {
299
11.0M
        switch (BYTE_TYPE(enc, ptr)) {
300
436k
          INVALID_CASES(ptr, nextTokPtr)
301
52.4k
        case BT_QUEST:
302
52.4k
          ptr += MINBPC(enc);
303
52.4k
          REQUIRE_CHAR(enc, ptr, end);
304
52.4k
          if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
305
13.6k
            *nextTokPtr = ptr + MINBPC(enc);
306
13.6k
            return tok;
307
13.6k
          }
308
38.7k
          break;
309
10.8M
        default:
310
10.8M
          ptr += MINBPC(enc);
311
10.8M
          break;
312
11.0M
        }
313
11.0M
      }
314
110
      return XML_TOK_PARTIAL;
315
20.5k
    case BT_QUEST:
316
20.5k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
317
2
        *nextTokPtr = ptr;
318
2
        return XML_TOK_INVALID;
319
2
      }
320
20.5k
      ptr += MINBPC(enc);
321
20.5k
      REQUIRE_CHAR(enc, ptr, end);
322
20.5k
      if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
323
20.5k
        *nextTokPtr = ptr + MINBPC(enc);
324
20.5k
        return tok;
325
20.5k
      }
326
      /* fall through */
327
30
    default:
328
30
      *nextTokPtr = ptr;
329
30
      return XML_TOK_INVALID;
330
1.04M
    }
331
1.04M
  }
332
78
  return XML_TOK_PARTIAL;
333
34.6k
}
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
4.09k
                         const char **nextTokPtr) {
338
4.09k
  static const char CDATA_LSQB[]
339
4.09k
      = {ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, ASCII_LSQB};
340
4.09k
  int i;
341
4.09k
  UNUSED_P(enc);
342
  /* CDATA[ */
343
4.09k
  REQUIRE_CHARS(enc, ptr, end, 6);
344
28.3k
  for (i = 0; i < 6; i++, ptr += MINBPC(enc)) {
345
24.3k
    if (! CHAR_MATCHES(enc, ptr, CDATA_LSQB[i])) {
346
57
      *nextTokPtr = ptr;
347
57
      return XML_TOK_INVALID;
348
57
    }
349
24.3k
  }
350
4.02k
  *nextTokPtr = ptr;
351
4.02k
  return XML_TOK_CDATA_SECT_OPEN;
352
4.07k
}
xmltok.c:normal_scanCdataSection
Line
Count
Source
337
4.09k
                         const char **nextTokPtr) {
338
4.09k
  static const char CDATA_LSQB[]
339
4.09k
      = {ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, ASCII_LSQB};
340
4.09k
  int i;
341
4.09k
  UNUSED_P(enc);
342
  /* CDATA[ */
343
4.09k
  REQUIRE_CHARS(enc, ptr, end, 6);
344
28.3k
  for (i = 0; i < 6; i++, ptr += MINBPC(enc)) {
345
24.3k
    if (! CHAR_MATCHES(enc, ptr, CDATA_LSQB[i])) {
346
57
      *nextTokPtr = ptr;
347
57
      return XML_TOK_INVALID;
348
57
    }
349
24.3k
  }
350
4.02k
  *nextTokPtr = ptr;
351
4.02k
  return XML_TOK_CDATA_SECT_OPEN;
352
4.07k
}
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
7.24M
                        const char **nextTokPtr) {
357
7.24M
  if (ptr >= end)
358
160
    return XML_TOK_NONE;
359
7.24M
  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
7.24M
  switch (BYTE_TYPE(enc, ptr)) {
369
1.78M
  case BT_RSQB:
370
1.78M
    ptr += MINBPC(enc);
371
1.78M
    REQUIRE_CHAR(enc, ptr, end);
372
1.78M
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
373
939k
      break;
374
847k
    ptr += MINBPC(enc);
375
847k
    REQUIRE_CHAR(enc, ptr, end);
376
847k
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
377
843k
      ptr -= MINBPC(enc);
378
843k
      break;
379
843k
    }
380
3.88k
    *nextTokPtr = ptr + MINBPC(enc);
381
3.88k
    return XML_TOK_CDATA_SECT_CLOSE;
382
2.21M
  case BT_CR:
383
2.21M
    ptr += MINBPC(enc);
384
2.21M
    REQUIRE_CHAR(enc, ptr, end);
385
2.21M
    if (BYTE_TYPE(enc, ptr) == BT_LF)
386
454k
      ptr += MINBPC(enc);
387
2.21M
    *nextTokPtr = ptr;
388
2.21M
    return XML_TOK_DATA_NEWLINE;
389
1.88M
  case BT_LF:
390
1.88M
    *nextTokPtr = ptr + MINBPC(enc);
391
1.88M
    return XML_TOK_DATA_NEWLINE;
392
1.88M
    INVALID_CASES(ptr, nextTokPtr)
393
1.11M
  default:
394
1.11M
    ptr += MINBPC(enc);
395
1.11M
    break;
396
7.24M
  }
397
37.0M
  while (HAS_CHAR(enc, ptr, end)) {
398
37.0M
    switch (BYTE_TYPE(enc, ptr)) {
399
0
#  define LEAD_CASE(n)                                                         \
400
546k
  case BT_LEAD##n:                                                             \
401
546k
    if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) {                       \
402
23
      *nextTokPtr = ptr;                                                       \
403
23
      return XML_TOK_DATA_CHARS;                                               \
404
23
    }                                                                          \
405
546k
    ptr += n;                                                                  \
406
546k
    break;
407
195k
      LEAD_CASE(2)
408
217k
      LEAD_CASE(3)
409
133k
      LEAD_CASE(4)
410
0
#  undef LEAD_CASE
411
4
    case BT_NONXML:
412
7
    case BT_MALFORM:
413
12
    case BT_TRAIL:
414
1.12M
    case BT_CR:
415
1.72M
    case BT_LF:
416
3.14M
    case BT_RSQB:
417
3.14M
      *nextTokPtr = ptr;
418
3.14M
      return XML_TOK_DATA_CHARS;
419
33.3M
    default:
420
33.3M
      ptr += MINBPC(enc);
421
33.3M
      break;
422
37.0M
    }
423
37.0M
  }
424
48
  *nextTokPtr = ptr;
425
48
  return XML_TOK_DATA_CHARS;
426
3.14M
}
xmltok.c:normal_cdataSectionTok
Line
Count
Source
356
7.24M
                        const char **nextTokPtr) {
357
7.24M
  if (ptr >= end)
358
160
    return XML_TOK_NONE;
359
7.24M
  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
7.24M
  switch (BYTE_TYPE(enc, ptr)) {
369
1.78M
  case BT_RSQB:
370
1.78M
    ptr += MINBPC(enc);
371
1.78M
    REQUIRE_CHAR(enc, ptr, end);
372
1.78M
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
373
939k
      break;
374
847k
    ptr += MINBPC(enc);
375
847k
    REQUIRE_CHAR(enc, ptr, end);
376
847k
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
377
843k
      ptr -= MINBPC(enc);
378
843k
      break;
379
843k
    }
380
3.88k
    *nextTokPtr = ptr + MINBPC(enc);
381
3.88k
    return XML_TOK_CDATA_SECT_CLOSE;
382
2.21M
  case BT_CR:
383
2.21M
    ptr += MINBPC(enc);
384
2.21M
    REQUIRE_CHAR(enc, ptr, end);
385
2.21M
    if (BYTE_TYPE(enc, ptr) == BT_LF)
386
454k
      ptr += MINBPC(enc);
387
2.21M
    *nextTokPtr = ptr;
388
2.21M
    return XML_TOK_DATA_NEWLINE;
389
1.88M
  case BT_LF:
390
1.88M
    *nextTokPtr = ptr + MINBPC(enc);
391
1.88M
    return XML_TOK_DATA_NEWLINE;
392
1.88M
    INVALID_CASES(ptr, nextTokPtr)
393
1.11M
  default:
394
1.11M
    ptr += MINBPC(enc);
395
1.11M
    break;
396
7.24M
  }
397
37.0M
  while (HAS_CHAR(enc, ptr, end)) {
398
37.0M
    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
195k
      LEAD_CASE(2)
408
217k
      LEAD_CASE(3)
409
133k
      LEAD_CASE(4)
410
0
#  undef LEAD_CASE
411
4
    case BT_NONXML:
412
7
    case BT_MALFORM:
413
12
    case BT_TRAIL:
414
1.12M
    case BT_CR:
415
1.72M
    case BT_LF:
416
3.14M
    case BT_RSQB:
417
3.14M
      *nextTokPtr = ptr;
418
3.14M
      return XML_TOK_DATA_CHARS;
419
33.3M
    default:
420
33.3M
      ptr += MINBPC(enc);
421
33.3M
      break;
422
37.0M
    }
423
37.0M
  }
424
48
  *nextTokPtr = ptr;
425
48
  return XML_TOK_DATA_CHARS;
426
3.14M
}
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
50.6k
                   const char **nextTokPtr) {
433
50.6k
  REQUIRE_CHAR(enc, ptr, end);
434
50.6k
  switch (BYTE_TYPE(enc, ptr)) {
435
51.1k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
436
9
  default:
437
9
    *nextTokPtr = ptr;
438
9
    return XML_TOK_INVALID;
439
50.6k
  }
440
478k
  while (HAS_CHAR(enc, ptr, end)) {
441
478k
    switch (BYTE_TYPE(enc, ptr)) {
442
1.30M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
443
299
    case BT_S:
444
737
    case BT_CR:
445
2.67k
    case BT_LF:
446
6.34k
      for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
447
6.34k
        switch (BYTE_TYPE(enc, ptr)) {
448
306
        case BT_S:
449
1.21k
        case BT_CR:
450
3.70k
        case BT_LF:
451
3.70k
          break;
452
2.63k
        case BT_GT:
453
2.63k
          *nextTokPtr = ptr + MINBPC(enc);
454
2.63k
          return XML_TOK_END_TAG;
455
5
        default:
456
5
          *nextTokPtr = ptr;
457
5
          return XML_TOK_INVALID;
458
6.34k
        }
459
6.34k
      }
460
40
      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
47.7k
    case BT_GT:
469
47.7k
      *nextTokPtr = ptr + MINBPC(enc);
470
47.7k
      return XML_TOK_END_TAG;
471
6
    default:
472
6
      *nextTokPtr = ptr;
473
6
      return XML_TOK_INVALID;
474
478k
    }
475
478k
  }
476
94
  return XML_TOK_PARTIAL;
477
50.6k
}
xmltok.c:normal_scanEndTag
Line
Count
Source
432
50.6k
                   const char **nextTokPtr) {
433
50.6k
  REQUIRE_CHAR(enc, ptr, end);
434
50.6k
  switch (BYTE_TYPE(enc, ptr)) {
435
51.1k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
436
9
  default:
437
9
    *nextTokPtr = ptr;
438
9
    return XML_TOK_INVALID;
439
50.6k
  }
440
478k
  while (HAS_CHAR(enc, ptr, end)) {
441
478k
    switch (BYTE_TYPE(enc, ptr)) {
442
1.30M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
443
299
    case BT_S:
444
737
    case BT_CR:
445
2.67k
    case BT_LF:
446
6.34k
      for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
447
6.34k
        switch (BYTE_TYPE(enc, ptr)) {
448
306
        case BT_S:
449
1.21k
        case BT_CR:
450
3.70k
        case BT_LF:
451
3.70k
          break;
452
2.63k
        case BT_GT:
453
2.63k
          *nextTokPtr = ptr + MINBPC(enc);
454
2.63k
          return XML_TOK_END_TAG;
455
5
        default:
456
5
          *nextTokPtr = ptr;
457
5
          return XML_TOK_INVALID;
458
6.34k
        }
459
6.34k
      }
460
40
      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
47.7k
    case BT_GT:
469
47.7k
      *nextTokPtr = ptr + MINBPC(enc);
470
47.7k
      return XML_TOK_END_TAG;
471
6
    default:
472
6
      *nextTokPtr = ptr;
473
6
      return XML_TOK_INVALID;
474
478k
    }
475
478k
  }
476
94
  return XML_TOK_PARTIAL;
477
50.6k
}
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
96.4k
                       const char **nextTokPtr) {
484
96.4k
  if (HAS_CHAR(enc, ptr, end)) {
485
96.4k
    switch (BYTE_TYPE(enc, ptr)) {
486
37.6k
    case BT_DIGIT:
487
96.4k
    case BT_HEX:
488
96.4k
      break;
489
5
    default:
490
5
      *nextTokPtr = ptr;
491
5
      return XML_TOK_INVALID;
492
96.4k
    }
493
350k
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
494
350k
      switch (BYTE_TYPE(enc, ptr)) {
495
186k
      case BT_DIGIT:
496
254k
      case BT_HEX:
497
254k
        break;
498
96.4k
      case BT_SEMI:
499
96.4k
        *nextTokPtr = ptr + MINBPC(enc);
500
96.4k
        return XML_TOK_CHAR_REF;
501
2
      default:
502
2
        *nextTokPtr = ptr;
503
2
        return XML_TOK_INVALID;
504
350k
      }
505
350k
    }
506
96.4k
  }
507
23
  return XML_TOK_PARTIAL;
508
96.4k
}
xmltok.c:normal_scanHexCharRef
Line
Count
Source
483
96.4k
                       const char **nextTokPtr) {
484
96.4k
  if (HAS_CHAR(enc, ptr, end)) {
485
96.4k
    switch (BYTE_TYPE(enc, ptr)) {
486
37.6k
    case BT_DIGIT:
487
96.4k
    case BT_HEX:
488
96.4k
      break;
489
5
    default:
490
5
      *nextTokPtr = ptr;
491
5
      return XML_TOK_INVALID;
492
96.4k
    }
493
350k
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
494
350k
      switch (BYTE_TYPE(enc, ptr)) {
495
186k
      case BT_DIGIT:
496
254k
      case BT_HEX:
497
254k
        break;
498
96.4k
      case BT_SEMI:
499
96.4k
        *nextTokPtr = ptr + MINBPC(enc);
500
96.4k
        return XML_TOK_CHAR_REF;
501
2
      default:
502
2
        *nextTokPtr = ptr;
503
2
        return XML_TOK_INVALID;
504
350k
      }
505
350k
    }
506
96.4k
  }
507
23
  return XML_TOK_PARTIAL;
508
96.4k
}
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
110k
                    const char **nextTokPtr) {
515
110k
  if (HAS_CHAR(enc, ptr, end)) {
516
110k
    if (CHAR_MATCHES(enc, ptr, ASCII_x))
517
96.4k
      return PREFIX(scanHexCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
518
13.9k
    switch (BYTE_TYPE(enc, ptr)) {
519
13.9k
    case BT_DIGIT:
520
13.9k
      break;
521
13
    default:
522
13
      *nextTokPtr = ptr;
523
13
      return XML_TOK_INVALID;
524
13.9k
    }
525
55.7k
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
526
55.7k
      switch (BYTE_TYPE(enc, ptr)) {
527
41.8k
      case BT_DIGIT:
528
41.8k
        break;
529
13.9k
      case BT_SEMI:
530
13.9k
        *nextTokPtr = ptr + MINBPC(enc);
531
13.9k
        return XML_TOK_CHAR_REF;
532
1
      default:
533
1
        *nextTokPtr = ptr;
534
1
        return XML_TOK_INVALID;
535
55.7k
      }
536
55.7k
    }
537
13.9k
  }
538
19
  return XML_TOK_PARTIAL;
539
110k
}
xmltok.c:normal_scanCharRef
Line
Count
Source
514
110k
                    const char **nextTokPtr) {
515
110k
  if (HAS_CHAR(enc, ptr, end)) {
516
110k
    if (CHAR_MATCHES(enc, ptr, ASCII_x))
517
96.4k
      return PREFIX(scanHexCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
518
13.9k
    switch (BYTE_TYPE(enc, ptr)) {
519
13.9k
    case BT_DIGIT:
520
13.9k
      break;
521
13
    default:
522
13
      *nextTokPtr = ptr;
523
13
      return XML_TOK_INVALID;
524
13.9k
    }
525
55.7k
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
526
55.7k
      switch (BYTE_TYPE(enc, ptr)) {
527
41.8k
      case BT_DIGIT:
528
41.8k
        break;
529
13.9k
      case BT_SEMI:
530
13.9k
        *nextTokPtr = ptr + MINBPC(enc);
531
13.9k
        return XML_TOK_CHAR_REF;
532
1
      default:
533
1
        *nextTokPtr = ptr;
534
1
        return XML_TOK_INVALID;
535
55.7k
      }
536
55.7k
    }
537
13.9k
  }
538
19
  return XML_TOK_PARTIAL;
539
110k
}
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
264k
                const char **nextTokPtr) {
546
264k
  REQUIRE_CHAR(enc, ptr, end);
547
264k
  switch (BYTE_TYPE(enc, ptr)) {
548
141k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
549
110k
  case BT_NUM:
550
110k
    return PREFIX(scanCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
551
5
  default:
552
5
    *nextTokPtr = ptr;
553
5
    return XML_TOK_INVALID;
554
264k
  }
555
655k
  while (HAS_CHAR(enc, ptr, end)) {
556
655k
    switch (BYTE_TYPE(enc, ptr)) {
557
1.65M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
558
153k
    case BT_SEMI:
559
153k
      *nextTokPtr = ptr + MINBPC(enc);
560
153k
      return XML_TOK_ENTITY_REF;
561
15
    default:
562
15
      *nextTokPtr = ptr;
563
15
      return XML_TOK_INVALID;
564
655k
    }
565
655k
  }
566
64
  return XML_TOK_PARTIAL;
567
153k
}
xmltok.c:normal_scanRef
Line
Count
Source
545
264k
                const char **nextTokPtr) {
546
264k
  REQUIRE_CHAR(enc, ptr, end);
547
264k
  switch (BYTE_TYPE(enc, ptr)) {
548
141k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
549
110k
  case BT_NUM:
550
110k
    return PREFIX(scanCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
551
5
  default:
552
5
    *nextTokPtr = ptr;
553
5
    return XML_TOK_INVALID;
554
264k
  }
555
655k
  while (HAS_CHAR(enc, ptr, end)) {
556
655k
    switch (BYTE_TYPE(enc, ptr)) {
557
1.65M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
558
153k
    case BT_SEMI:
559
153k
      *nextTokPtr = ptr + MINBPC(enc);
560
153k
      return XML_TOK_ENTITY_REF;
561
15
    default:
562
15
      *nextTokPtr = ptr;
563
15
      return XML_TOK_INVALID;
564
655k
    }
565
655k
  }
566
64
  return XML_TOK_PARTIAL;
567
153k
}
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
39.1k
                 const char **nextTokPtr) {
574
#  ifdef XML_NS
575
  int hadColon = 0;
576
#  endif
577
2.40M
  while (HAS_CHAR(enc, ptr, end)) {
578
2.40M
    switch (BYTE_TYPE(enc, ptr)) {
579
1.48M
      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
3.19k
    case BT_S:
598
13.8k
    case BT_CR:
599
16.3k
    case BT_LF:
600
35.7k
      for (;;) {
601
35.7k
        int t;
602
603
35.7k
        ptr += MINBPC(enc);
604
35.7k
        REQUIRE_CHAR(enc, ptr, end);
605
35.6k
        t = BYTE_TYPE(enc, ptr);
606
35.6k
        if (t == BT_EQUALS)
607
16.3k
          break;
608
19.3k
        switch (t) {
609
3.79k
        case BT_S:
610
5.29k
        case BT_LF:
611
19.3k
        case BT_CR:
612
19.3k
          break;
613
8
        default:
614
8
          *nextTokPtr = ptr;
615
8
          return XML_TOK_INVALID;
616
19.3k
        }
617
19.3k
      }
618
      /* fall through */
619
1.98M
    case BT_EQUALS: {
620
1.98M
      int open;
621
#  ifdef XML_NS
622
      hadColon = 0;
623
#  endif
624
2.03M
      for (;;) {
625
2.03M
        ptr += MINBPC(enc);
626
2.03M
        REQUIRE_CHAR(enc, ptr, end);
627
2.03M
        open = BYTE_TYPE(enc, ptr);
628
2.03M
        if (open == BT_QUOT || open == BT_APOS)
629
1.98M
          break;
630
49.5k
        switch (open) {
631
12.3k
        case BT_S:
632
23.8k
        case BT_LF:
633
49.5k
        case BT_CR:
634
49.5k
          break;
635
17
        default:
636
17
          *nextTokPtr = ptr;
637
17
          return XML_TOK_INVALID;
638
49.5k
        }
639
49.5k
      }
640
1.98M
      ptr += MINBPC(enc);
641
      /* in attribute value */
642
16.9M
      for (;;) {
643
16.9M
        int t;
644
16.9M
        REQUIRE_CHAR(enc, ptr, end);
645
16.9M
        t = BYTE_TYPE(enc, ptr);
646
16.9M
        if (t == open)
647
1.98M
          break;
648
14.9M
        switch (t) {
649
196k
          INVALID_CASES(ptr, nextTokPtr)
650
66.3k
        case BT_AMP: {
651
66.3k
          int tok = PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, &ptr);
652
66.3k
          if (tok <= 0) {
653
66
            if (tok == XML_TOK_INVALID)
654
30
              *nextTokPtr = ptr;
655
66
            return tok;
656
66
          }
657
66.3k
          break;
658
66.3k
        }
659
66.3k
        case BT_LT:
660
9
          *nextTokPtr = ptr;
661
9
          return XML_TOK_INVALID;
662
14.7M
        default:
663
14.7M
          ptr += MINBPC(enc);
664
14.7M
          break;
665
14.9M
        }
666
14.9M
      }
667
1.98M
      ptr += MINBPC(enc);
668
1.98M
      REQUIRE_CHAR(enc, ptr, end);
669
1.98M
      switch (BYTE_TYPE(enc, ptr)) {
670
1.01M
      case BT_S:
671
1.92M
      case BT_CR:
672
1.95M
      case BT_LF:
673
1.95M
        break;
674
21.3k
      case BT_SOL:
675
21.3k
        goto sol;
676
5.16k
      case BT_GT:
677
5.16k
        goto gt;
678
3
      default:
679
3
        *nextTokPtr = ptr;
680
3
        return XML_TOK_INVALID;
681
1.98M
      }
682
      /* ptr points to closing quote */
683
2.14M
      for (;;) {
684
2.14M
        ptr += MINBPC(enc);
685
2.14M
        REQUIRE_CHAR(enc, ptr, end);
686
2.14M
        switch (BYTE_TYPE(enc, ptr)) {
687
1.95M
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
688
128k
        case BT_S:
689
163k
        case BT_CR:
690
188k
        case BT_LF:
691
188k
          continue;
692
728
        case BT_GT:
693
5.89k
        gt:
694
5.89k
          *nextTokPtr = ptr + MINBPC(enc);
695
5.89k
          return XML_TOK_START_TAG_WITH_ATTS;
696
11.2k
        case BT_SOL:
697
32.5k
        sol:
698
32.5k
          ptr += MINBPC(enc);
699
32.5k
          REQUIRE_CHAR(enc, ptr, end);
700
32.5k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
701
7
            *nextTokPtr = ptr;
702
7
            return XML_TOK_INVALID;
703
7
          }
704
32.5k
          *nextTokPtr = ptr + MINBPC(enc);
705
32.5k
          return XML_TOK_EMPTY_ELEMENT_WITH_ATTS;
706
3
        default:
707
3
          *nextTokPtr = ptr;
708
3
          return XML_TOK_INVALID;
709
2.14M
        }
710
1.94M
        break;
711
2.14M
      }
712
1.94M
      break;
713
1.95M
    }
714
1.94M
    default:
715
18
      *nextTokPtr = ptr;
716
18
      return XML_TOK_INVALID;
717
2.40M
    }
718
2.40M
  }
719
100
  return XML_TOK_PARTIAL;
720
39.1k
}
xmltok.c:normal_scanAtts
Line
Count
Source
573
39.1k
                 const char **nextTokPtr) {
574
#  ifdef XML_NS
575
  int hadColon = 0;
576
#  endif
577
2.40M
  while (HAS_CHAR(enc, ptr, end)) {
578
2.40M
    switch (BYTE_TYPE(enc, ptr)) {
579
1.48M
      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
3.19k
    case BT_S:
598
13.8k
    case BT_CR:
599
16.3k
    case BT_LF:
600
35.7k
      for (;;) {
601
35.7k
        int t;
602
603
35.7k
        ptr += MINBPC(enc);
604
35.7k
        REQUIRE_CHAR(enc, ptr, end);
605
35.6k
        t = BYTE_TYPE(enc, ptr);
606
35.6k
        if (t == BT_EQUALS)
607
16.3k
          break;
608
19.3k
        switch (t) {
609
3.79k
        case BT_S:
610
5.29k
        case BT_LF:
611
19.3k
        case BT_CR:
612
19.3k
          break;
613
8
        default:
614
8
          *nextTokPtr = ptr;
615
8
          return XML_TOK_INVALID;
616
19.3k
        }
617
19.3k
      }
618
      /* fall through */
619
1.98M
    case BT_EQUALS: {
620
1.98M
      int open;
621
#  ifdef XML_NS
622
      hadColon = 0;
623
#  endif
624
2.03M
      for (;;) {
625
2.03M
        ptr += MINBPC(enc);
626
2.03M
        REQUIRE_CHAR(enc, ptr, end);
627
2.03M
        open = BYTE_TYPE(enc, ptr);
628
2.03M
        if (open == BT_QUOT || open == BT_APOS)
629
1.98M
          break;
630
49.5k
        switch (open) {
631
12.3k
        case BT_S:
632
23.8k
        case BT_LF:
633
49.5k
        case BT_CR:
634
49.5k
          break;
635
17
        default:
636
17
          *nextTokPtr = ptr;
637
17
          return XML_TOK_INVALID;
638
49.5k
        }
639
49.5k
      }
640
1.98M
      ptr += MINBPC(enc);
641
      /* in attribute value */
642
16.9M
      for (;;) {
643
16.9M
        int t;
644
16.9M
        REQUIRE_CHAR(enc, ptr, end);
645
16.9M
        t = BYTE_TYPE(enc, ptr);
646
16.9M
        if (t == open)
647
1.98M
          break;
648
14.9M
        switch (t) {
649
196k
          INVALID_CASES(ptr, nextTokPtr)
650
66.3k
        case BT_AMP: {
651
66.3k
          int tok = PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, &ptr);
652
66.3k
          if (tok <= 0) {
653
66
            if (tok == XML_TOK_INVALID)
654
30
              *nextTokPtr = ptr;
655
66
            return tok;
656
66
          }
657
66.3k
          break;
658
66.3k
        }
659
66.3k
        case BT_LT:
660
9
          *nextTokPtr = ptr;
661
9
          return XML_TOK_INVALID;
662
14.7M
        default:
663
14.7M
          ptr += MINBPC(enc);
664
14.7M
          break;
665
14.9M
        }
666
14.9M
      }
667
1.98M
      ptr += MINBPC(enc);
668
1.98M
      REQUIRE_CHAR(enc, ptr, end);
669
1.98M
      switch (BYTE_TYPE(enc, ptr)) {
670
1.01M
      case BT_S:
671
1.92M
      case BT_CR:
672
1.95M
      case BT_LF:
673
1.95M
        break;
674
21.3k
      case BT_SOL:
675
21.3k
        goto sol;
676
5.16k
      case BT_GT:
677
5.16k
        goto gt;
678
3
      default:
679
3
        *nextTokPtr = ptr;
680
3
        return XML_TOK_INVALID;
681
1.98M
      }
682
      /* ptr points to closing quote */
683
2.14M
      for (;;) {
684
2.14M
        ptr += MINBPC(enc);
685
2.14M
        REQUIRE_CHAR(enc, ptr, end);
686
2.14M
        switch (BYTE_TYPE(enc, ptr)) {
687
1.95M
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
688
128k
        case BT_S:
689
163k
        case BT_CR:
690
188k
        case BT_LF:
691
188k
          continue;
692
728
        case BT_GT:
693
5.89k
        gt:
694
5.89k
          *nextTokPtr = ptr + MINBPC(enc);
695
5.89k
          return XML_TOK_START_TAG_WITH_ATTS;
696
11.2k
        case BT_SOL:
697
32.5k
        sol:
698
32.5k
          ptr += MINBPC(enc);
699
32.5k
          REQUIRE_CHAR(enc, ptr, end);
700
32.5k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
701
7
            *nextTokPtr = ptr;
702
7
            return XML_TOK_INVALID;
703
7
          }
704
32.5k
          *nextTokPtr = ptr + MINBPC(enc);
705
32.5k
          return XML_TOK_EMPTY_ELEMENT_WITH_ATTS;
706
3
        default:
707
3
          *nextTokPtr = ptr;
708
3
          return XML_TOK_INVALID;
709
2.14M
        }
710
1.94M
        break;
711
2.14M
      }
712
1.94M
      break;
713
1.95M
    }
714
1.94M
    default:
715
18
      *nextTokPtr = ptr;
716
18
      return XML_TOK_INVALID;
717
2.40M
    }
718
2.40M
  }
719
100
  return XML_TOK_PARTIAL;
720
39.1k
}
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
328k
               const char **nextTokPtr) {
727
#  ifdef XML_NS
728
  int hadColon;
729
#  endif
730
328k
  REQUIRE_CHAR(enc, ptr, end);
731
328k
  switch (BYTE_TYPE(enc, ptr)) {
732
202k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
733
28.8k
  case BT_EXCL:
734
28.8k
    ptr += MINBPC(enc);
735
28.8k
    REQUIRE_CHAR(enc, ptr, end);
736
28.8k
    switch (BYTE_TYPE(enc, ptr)) {
737
24.7k
    case BT_MINUS:
738
24.7k
      return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
739
4.09k
    case BT_LSQB:
740
4.09k
      return PREFIX(scanCdataSection)(enc, ptr + MINBPC(enc), end, nextTokPtr);
741
28.8k
    }
742
2
    *nextTokPtr = ptr;
743
2
    return XML_TOK_INVALID;
744
26.6k
  case BT_QUEST:
745
26.6k
    return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
746
50.6k
  case BT_SOL:
747
50.6k
    return PREFIX(scanEndTag)(enc, ptr + MINBPC(enc), end, nextTokPtr);
748
9
  default:
749
9
    *nextTokPtr = ptr;
750
9
    return XML_TOK_INVALID;
751
328k
  }
752
#  ifdef XML_NS
753
  hadColon = 0;
754
#  endif
755
  /* we have a start-tag */
756
8.87M
  while (HAS_CHAR(enc, ptr, end)) {
757
8.87M
    switch (BYTE_TYPE(enc, ptr)) {
758
34.1M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
759
#  ifdef XML_NS
760
    case BT_COLON:
761
      if (hadColon) {
762
        *nextTokPtr = ptr;
763
        return XML_TOK_INVALID;
764
      }
765
      hadColon = 1;
766
      ptr += MINBPC(enc);
767
      REQUIRE_CHAR(enc, ptr, end);
768
      switch (BYTE_TYPE(enc, ptr)) {
769
        CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
770
      default:
771
        *nextTokPtr = ptr;
772
        return XML_TOK_INVALID;
773
      }
774
      break;
775
#  endif
776
28.5k
    case BT_S:
777
38.0k
    case BT_CR:
778
45.2k
    case BT_LF: {
779
45.2k
      ptr += MINBPC(enc);
780
70.6k
      while (HAS_CHAR(enc, ptr, end)) {
781
70.6k
        switch (BYTE_TYPE(enc, ptr)) {
782
34.3k
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
783
919
        case BT_GT:
784
919
          goto gt;
785
5.15k
        case BT_SOL:
786
5.15k
          goto sol;
787
2.18k
        case BT_S:
788
19.0k
        case BT_CR:
789
25.4k
        case BT_LF:
790
25.4k
          ptr += MINBPC(enc);
791
25.4k
          continue;
792
2
        default:
793
2
          *nextTokPtr = ptr;
794
2
          return XML_TOK_INVALID;
795
70.6k
        }
796
39.1k
        return PREFIX(scanAtts)(enc, ptr, end, nextTokPtr);
797
70.6k
      }
798
48
      return XML_TOK_PARTIAL;
799
45.2k
    }
800
143k
    case BT_GT:
801
144k
    gt:
802
144k
      *nextTokPtr = ptr + MINBPC(enc);
803
144k
      return XML_TOK_START_TAG_NO_ATTS;
804
33.2k
    case BT_SOL:
805
38.3k
    sol:
806
38.3k
      ptr += MINBPC(enc);
807
38.3k
      REQUIRE_CHAR(enc, ptr, end);
808
38.3k
      if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
809
11
        *nextTokPtr = ptr;
810
11
        return XML_TOK_INVALID;
811
11
      }
812
38.3k
      *nextTokPtr = ptr + MINBPC(enc);
813
38.3k
      return XML_TOK_EMPTY_ELEMENT_NO_ATTS;
814
21
    default:
815
21
      *nextTokPtr = ptr;
816
21
      return XML_TOK_INVALID;
817
8.87M
    }
818
8.87M
  }
819
186
  return XML_TOK_PARTIAL;
820
222k
}
xmltok.c:normal_scanLt
Line
Count
Source
726
328k
               const char **nextTokPtr) {
727
#  ifdef XML_NS
728
  int hadColon;
729
#  endif
730
328k
  REQUIRE_CHAR(enc, ptr, end);
731
328k
  switch (BYTE_TYPE(enc, ptr)) {
732
202k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
733
28.8k
  case BT_EXCL:
734
28.8k
    ptr += MINBPC(enc);
735
28.8k
    REQUIRE_CHAR(enc, ptr, end);
736
28.8k
    switch (BYTE_TYPE(enc, ptr)) {
737
24.7k
    case BT_MINUS:
738
24.7k
      return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
739
4.09k
    case BT_LSQB:
740
4.09k
      return PREFIX(scanCdataSection)(enc, ptr + MINBPC(enc), end, nextTokPtr);
741
28.8k
    }
742
2
    *nextTokPtr = ptr;
743
2
    return XML_TOK_INVALID;
744
26.6k
  case BT_QUEST:
745
26.6k
    return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
746
50.6k
  case BT_SOL:
747
50.6k
    return PREFIX(scanEndTag)(enc, ptr + MINBPC(enc), end, nextTokPtr);
748
9
  default:
749
9
    *nextTokPtr = ptr;
750
9
    return XML_TOK_INVALID;
751
328k
  }
752
#  ifdef XML_NS
753
  hadColon = 0;
754
#  endif
755
  /* we have a start-tag */
756
8.87M
  while (HAS_CHAR(enc, ptr, end)) {
757
8.87M
    switch (BYTE_TYPE(enc, ptr)) {
758
34.1M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
759
#  ifdef XML_NS
760
    case BT_COLON:
761
      if (hadColon) {
762
        *nextTokPtr = ptr;
763
        return XML_TOK_INVALID;
764
      }
765
      hadColon = 1;
766
      ptr += MINBPC(enc);
767
      REQUIRE_CHAR(enc, ptr, end);
768
      switch (BYTE_TYPE(enc, ptr)) {
769
        CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
770
      default:
771
        *nextTokPtr = ptr;
772
        return XML_TOK_INVALID;
773
      }
774
      break;
775
#  endif
776
28.5k
    case BT_S:
777
38.0k
    case BT_CR:
778
45.2k
    case BT_LF: {
779
45.2k
      ptr += MINBPC(enc);
780
70.6k
      while (HAS_CHAR(enc, ptr, end)) {
781
70.6k
        switch (BYTE_TYPE(enc, ptr)) {
782
34.3k
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
783
919
        case BT_GT:
784
919
          goto gt;
785
5.15k
        case BT_SOL:
786
5.15k
          goto sol;
787
2.18k
        case BT_S:
788
19.0k
        case BT_CR:
789
25.4k
        case BT_LF:
790
25.4k
          ptr += MINBPC(enc);
791
25.4k
          continue;
792
2
        default:
793
2
          *nextTokPtr = ptr;
794
2
          return XML_TOK_INVALID;
795
70.6k
        }
796
39.1k
        return PREFIX(scanAtts)(enc, ptr, end, nextTokPtr);
797
70.6k
      }
798
48
      return XML_TOK_PARTIAL;
799
45.2k
    }
800
143k
    case BT_GT:
801
144k
    gt:
802
144k
      *nextTokPtr = ptr + MINBPC(enc);
803
144k
      return XML_TOK_START_TAG_NO_ATTS;
804
33.2k
    case BT_SOL:
805
38.3k
    sol:
806
38.3k
      ptr += MINBPC(enc);
807
38.3k
      REQUIRE_CHAR(enc, ptr, end);
808
38.3k
      if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
809
11
        *nextTokPtr = ptr;
810
11
        return XML_TOK_INVALID;
811
11
      }
812
38.3k
      *nextTokPtr = ptr + MINBPC(enc);
813
38.3k
      return XML_TOK_EMPTY_ELEMENT_NO_ATTS;
814
21
    default:
815
21
      *nextTokPtr = ptr;
816
21
      return XML_TOK_INVALID;
817
8.87M
    }
818
8.87M
  }
819
186
  return XML_TOK_PARTIAL;
820
222k
}
Unexecuted instantiation: xmltok.c:little2_scanLt
Unexecuted instantiation: xmltok.c:big2_scanLt
821
822
static int PTRCALL
823
PREFIX(contentTok)(const ENCODING *enc, const char *ptr, const char *end,
824
3.35M
                   const char **nextTokPtr) {
825
3.35M
  if (ptr >= end)
826
3.09k
    return XML_TOK_NONE;
827
3.35M
  if (MINBPC(enc) > 1) {
828
0
    size_t n = end - ptr;
829
0
    if (n & (MINBPC(enc) - 1)) {
830
0
      n &= ~(MINBPC(enc) - 1);
831
0
      if (n == 0)
832
0
        return XML_TOK_PARTIAL;
833
0
      end = ptr + n;
834
0
    }
835
0
  }
836
3.35M
  switch (BYTE_TYPE(enc, ptr)) {
837
328k
  case BT_LT:
838
328k
    return PREFIX(scanLt)(enc, ptr + MINBPC(enc), end, nextTokPtr);
839
45.9k
  case BT_AMP:
840
45.9k
    return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
841
1.39M
  case BT_CR:
842
1.39M
    ptr += MINBPC(enc);
843
1.39M
    if (! HAS_CHAR(enc, ptr, end))
844
20
      return XML_TOK_TRAILING_CR;
845
1.39M
    if (BYTE_TYPE(enc, ptr) == BT_LF)
846
166k
      ptr += MINBPC(enc);
847
1.39M
    *nextTokPtr = ptr;
848
1.39M
    return XML_TOK_DATA_NEWLINE;
849
720k
  case BT_LF:
850
720k
    *nextTokPtr = ptr + MINBPC(enc);
851
720k
    return XML_TOK_DATA_NEWLINE;
852
306k
  case BT_RSQB:
853
306k
    ptr += MINBPC(enc);
854
306k
    if (! HAS_CHAR(enc, ptr, end))
855
10
      return XML_TOK_TRAILING_RSQB;
856
306k
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
857
47.2k
      break;
858
258k
    ptr += MINBPC(enc);
859
258k
    if (! HAS_CHAR(enc, ptr, end))
860
8
      return XML_TOK_TRAILING_RSQB;
861
258k
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
862
258k
      ptr -= MINBPC(enc);
863
258k
      break;
864
258k
    }
865
1
    *nextTokPtr = ptr;
866
1
    return XML_TOK_INVALID;
867
107k
    INVALID_CASES(ptr, nextTokPtr)
868
498k
  default:
869
498k
    ptr += MINBPC(enc);
870
498k
    break;
871
3.35M
  }
872
16.6M
  while (HAS_CHAR(enc, ptr, end)) {
873
16.6M
    switch (BYTE_TYPE(enc, ptr)) {
874
0
#  define LEAD_CASE(n)                                                         \
875
130k
  case BT_LEAD##n:                                                             \
876
130k
    if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) {                       \
877
35
      *nextTokPtr = ptr;                                                       \
878
35
      return XML_TOK_DATA_CHARS;                                               \
879
35
    }                                                                          \
880
130k
    ptr += n;                                                                  \
881
130k
    break;
882
84.9k
      LEAD_CASE(2)
883
21.9k
      LEAD_CASE(3)
884
23.5k
      LEAD_CASE(4)
885
0
#  undef LEAD_CASE
886
621k
    case BT_RSQB:
887
621k
      if (HAS_CHARS(enc, ptr, end, 2)) {
888
621k
        if (! CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_RSQB)) {
889
358k
          ptr += MINBPC(enc);
890
358k
          break;
891
358k
        }
892
262k
        if (HAS_CHARS(enc, ptr, end, 3)) {
893
262k
          if (! CHAR_MATCHES(enc, ptr + 2 * MINBPC(enc), ASCII_GT)) {
894
262k
            ptr += MINBPC(enc);
895
262k
            break;
896
262k
          }
897
2
          *nextTokPtr = ptr + 2 * MINBPC(enc);
898
2
          return XML_TOK_INVALID;
899
262k
        }
900
262k
      }
901
      /* fall through */
902
20.5k
    case BT_AMP:
903
117k
    case BT_LT:
904
117k
    case BT_NONXML:
905
117k
    case BT_MALFORM:
906
117k
    case BT_TRAIL:
907
703k
    case BT_CR:
908
856k
    case BT_LF:
909
856k
      *nextTokPtr = ptr;
910
856k
      return XML_TOK_DATA_CHARS;
911
15.0M
    default:
912
15.0M
      ptr += MINBPC(enc);
913
15.0M
      break;
914
16.6M
    }
915
16.6M
  }
916
1.62k
  *nextTokPtr = ptr;
917
1.62k
  return XML_TOK_DATA_CHARS;
918
857k
}
xmltok.c:normal_contentTok
Line
Count
Source
824
3.35M
                   const char **nextTokPtr) {
825
3.35M
  if (ptr >= end)
826
3.09k
    return XML_TOK_NONE;
827
3.35M
  if (MINBPC(enc) > 1) {
828
0
    size_t n = end - ptr;
829
0
    if (n & (MINBPC(enc) - 1)) {
830
0
      n &= ~(MINBPC(enc) - 1);
831
0
      if (n == 0)
832
0
        return XML_TOK_PARTIAL;
833
0
      end = ptr + n;
834
0
    }
835
0
  }
836
3.35M
  switch (BYTE_TYPE(enc, ptr)) {
837
328k
  case BT_LT:
838
328k
    return PREFIX(scanLt)(enc, ptr + MINBPC(enc), end, nextTokPtr);
839
45.9k
  case BT_AMP:
840
45.9k
    return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
841
1.39M
  case BT_CR:
842
1.39M
    ptr += MINBPC(enc);
843
1.39M
    if (! HAS_CHAR(enc, ptr, end))
844
20
      return XML_TOK_TRAILING_CR;
845
1.39M
    if (BYTE_TYPE(enc, ptr) == BT_LF)
846
166k
      ptr += MINBPC(enc);
847
1.39M
    *nextTokPtr = ptr;
848
1.39M
    return XML_TOK_DATA_NEWLINE;
849
720k
  case BT_LF:
850
720k
    *nextTokPtr = ptr + MINBPC(enc);
851
720k
    return XML_TOK_DATA_NEWLINE;
852
306k
  case BT_RSQB:
853
306k
    ptr += MINBPC(enc);
854
306k
    if (! HAS_CHAR(enc, ptr, end))
855
10
      return XML_TOK_TRAILING_RSQB;
856
306k
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
857
47.2k
      break;
858
258k
    ptr += MINBPC(enc);
859
258k
    if (! HAS_CHAR(enc, ptr, end))
860
8
      return XML_TOK_TRAILING_RSQB;
861
258k
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
862
258k
      ptr -= MINBPC(enc);
863
258k
      break;
864
258k
    }
865
1
    *nextTokPtr = ptr;
866
1
    return XML_TOK_INVALID;
867
107k
    INVALID_CASES(ptr, nextTokPtr)
868
498k
  default:
869
498k
    ptr += MINBPC(enc);
870
498k
    break;
871
3.35M
  }
872
16.6M
  while (HAS_CHAR(enc, ptr, end)) {
873
16.6M
    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
84.9k
      LEAD_CASE(2)
883
21.9k
      LEAD_CASE(3)
884
23.5k
      LEAD_CASE(4)
885
0
#  undef LEAD_CASE
886
621k
    case BT_RSQB:
887
621k
      if (HAS_CHARS(enc, ptr, end, 2)) {
888
621k
        if (! CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_RSQB)) {
889
358k
          ptr += MINBPC(enc);
890
358k
          break;
891
358k
        }
892
262k
        if (HAS_CHARS(enc, ptr, end, 3)) {
893
262k
          if (! CHAR_MATCHES(enc, ptr + 2 * MINBPC(enc), ASCII_GT)) {
894
262k
            ptr += MINBPC(enc);
895
262k
            break;
896
262k
          }
897
2
          *nextTokPtr = ptr + 2 * MINBPC(enc);
898
2
          return XML_TOK_INVALID;
899
262k
        }
900
262k
      }
901
      /* fall through */
902
20.5k
    case BT_AMP:
903
117k
    case BT_LT:
904
117k
    case BT_NONXML:
905
117k
    case BT_MALFORM:
906
117k
    case BT_TRAIL:
907
703k
    case BT_CR:
908
856k
    case BT_LF:
909
856k
      *nextTokPtr = ptr;
910
856k
      return XML_TOK_DATA_CHARS;
911
15.0M
    default:
912
15.0M
      ptr += MINBPC(enc);
913
15.0M
      break;
914
16.6M
    }
915
16.6M
  }
916
1.62k
  *nextTokPtr = ptr;
917
1.62k
  return XML_TOK_DATA_CHARS;
918
857k
}
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
9.92k
                    const char **nextTokPtr) {
925
9.92k
  REQUIRE_CHAR(enc, ptr, end);
926
9.91k
  switch (BYTE_TYPE(enc, ptr)) {
927
12.2k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
928
592
  case BT_S:
929
1.07k
  case BT_LF:
930
1.62k
  case BT_CR:
931
1.62k
  case BT_PERCNT:
932
1.62k
    *nextTokPtr = ptr;
933
1.62k
    return XML_TOK_PERCENT;
934
5
  default:
935
5
    *nextTokPtr = ptr;
936
5
    return XML_TOK_INVALID;
937
9.91k
  }
938
237k
  while (HAS_CHAR(enc, ptr, end)) {
939
237k
    switch (BYTE_TYPE(enc, ptr)) {
940
819k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
941
8.11k
    case BT_SEMI:
942
8.11k
      *nextTokPtr = ptr + MINBPC(enc);
943
8.11k
      return XML_TOK_PARAM_ENTITY_REF;
944
19
    default:
945
19
      *nextTokPtr = ptr;
946
19
      return XML_TOK_INVALID;
947
237k
    }
948
237k
  }
949
64
  return XML_TOK_PARTIAL;
950
8.25k
}
xmltok.c:normal_scanPercent
Line
Count
Source
924
9.92k
                    const char **nextTokPtr) {
925
9.92k
  REQUIRE_CHAR(enc, ptr, end);
926
9.91k
  switch (BYTE_TYPE(enc, ptr)) {
927
12.2k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
928
592
  case BT_S:
929
1.07k
  case BT_LF:
930
1.62k
  case BT_CR:
931
1.62k
  case BT_PERCNT:
932
1.62k
    *nextTokPtr = ptr;
933
1.62k
    return XML_TOK_PERCENT;
934
5
  default:
935
5
    *nextTokPtr = ptr;
936
5
    return XML_TOK_INVALID;
937
9.91k
  }
938
237k
  while (HAS_CHAR(enc, ptr, end)) {
939
237k
    switch (BYTE_TYPE(enc, ptr)) {
940
819k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
941
8.11k
    case BT_SEMI:
942
8.11k
      *nextTokPtr = ptr + MINBPC(enc);
943
8.11k
      return XML_TOK_PARAM_ENTITY_REF;
944
19
    default:
945
19
      *nextTokPtr = ptr;
946
19
      return XML_TOK_INVALID;
947
237k
    }
948
237k
  }
949
64
  return XML_TOK_PARTIAL;
950
8.25k
}
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
297k
                      const char **nextTokPtr) {
955
297k
  REQUIRE_CHAR(enc, ptr, end);
956
297k
  switch (BYTE_TYPE(enc, ptr)) {
957
297k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
958
3
  default:
959
3
    *nextTokPtr = ptr;
960
3
    return XML_TOK_INVALID;
961
297k
  }
962
2.14M
  while (HAS_CHAR(enc, ptr, end)) {
963
2.14M
    switch (BYTE_TYPE(enc, ptr)) {
964
6.73M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
965
16.8k
    case BT_CR:
966
23.7k
    case BT_LF:
967
293k
    case BT_S:
968
294k
    case BT_RPAR:
969
297k
    case BT_GT:
970
297k
    case BT_PERCNT:
971
297k
    case BT_VERBAR:
972
297k
      *nextTokPtr = ptr;
973
297k
      return XML_TOK_POUND_NAME;
974
17
    default:
975
17
      *nextTokPtr = ptr;
976
17
      return XML_TOK_INVALID;
977
2.14M
    }
978
2.14M
  }
979
208
  return -XML_TOK_POUND_NAME;
980
297k
}
xmltok.c:normal_scanPoundName
Line
Count
Source
954
297k
                      const char **nextTokPtr) {
955
297k
  REQUIRE_CHAR(enc, ptr, end);
956
297k
  switch (BYTE_TYPE(enc, ptr)) {
957
297k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
958
3
  default:
959
3
    *nextTokPtr = ptr;
960
3
    return XML_TOK_INVALID;
961
297k
  }
962
2.14M
  while (HAS_CHAR(enc, ptr, end)) {
963
2.14M
    switch (BYTE_TYPE(enc, ptr)) {
964
6.73M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
965
16.8k
    case BT_CR:
966
23.7k
    case BT_LF:
967
293k
    case BT_S:
968
294k
    case BT_RPAR:
969
297k
    case BT_GT:
970
297k
    case BT_PERCNT:
971
297k
    case BT_VERBAR:
972
297k
      *nextTokPtr = ptr;
973
297k
      return XML_TOK_POUND_NAME;
974
17
    default:
975
17
      *nextTokPtr = ptr;
976
17
      return XML_TOK_INVALID;
977
2.14M
    }
978
2.14M
  }
979
208
  return -XML_TOK_POUND_NAME;
980
297k
}
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
43.0k
                const char **nextTokPtr) {
985
7.63M
  while (HAS_CHAR(enc, ptr, end)) {
986
7.63M
    int t = BYTE_TYPE(enc, ptr);
987
7.63M
    switch (t) {
988
103k
      INVALID_CASES(ptr, nextTokPtr)
989
11.4k
    case BT_QUOT:
990
48.9k
    case BT_APOS:
991
48.9k
      ptr += MINBPC(enc);
992
48.9k
      if (t != open)
993
6.04k
        break;
994
42.8k
      if (! HAS_CHAR(enc, ptr, end))
995
437
        return -XML_TOK_LITERAL;
996
42.4k
      *nextTokPtr = ptr;
997
42.4k
      switch (BYTE_TYPE(enc, ptr)) {
998
6.70k
      case BT_S:
999
9.61k
      case BT_CR:
1000
22.5k
      case BT_LF:
1001
42.1k
      case BT_GT:
1002
42.1k
      case BT_PERCNT:
1003
42.4k
      case BT_LSQB:
1004
42.4k
        return XML_TOK_LITERAL;
1005
17
      default:
1006
17
        return XML_TOK_INVALID;
1007
42.4k
      }
1008
7.53M
    default:
1009
7.53M
      ptr += MINBPC(enc);
1010
7.53M
      break;
1011
7.63M
    }
1012
7.63M
  }
1013
118
  return XML_TOK_PARTIAL;
1014
43.0k
}
xmltok.c:normal_scanLit
Line
Count
Source
984
43.0k
                const char **nextTokPtr) {
985
7.63M
  while (HAS_CHAR(enc, ptr, end)) {
986
7.63M
    int t = BYTE_TYPE(enc, ptr);
987
7.63M
    switch (t) {
988
103k
      INVALID_CASES(ptr, nextTokPtr)
989
11.4k
    case BT_QUOT:
990
48.9k
    case BT_APOS:
991
48.9k
      ptr += MINBPC(enc);
992
48.9k
      if (t != open)
993
6.04k
        break;
994
42.8k
      if (! HAS_CHAR(enc, ptr, end))
995
437
        return -XML_TOK_LITERAL;
996
42.4k
      *nextTokPtr = ptr;
997
42.4k
      switch (BYTE_TYPE(enc, ptr)) {
998
6.70k
      case BT_S:
999
9.61k
      case BT_CR:
1000
22.5k
      case BT_LF:
1001
42.1k
      case BT_GT:
1002
42.1k
      case BT_PERCNT:
1003
42.4k
      case BT_LSQB:
1004
42.4k
        return XML_TOK_LITERAL;
1005
17
      default:
1006
17
        return XML_TOK_INVALID;
1007
42.4k
      }
1008
7.53M
    default:
1009
7.53M
      ptr += MINBPC(enc);
1010
7.53M
      break;
1011
7.63M
    }
1012
7.63M
  }
1013
118
  return XML_TOK_PARTIAL;
1014
43.0k
}
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
6.35M
                  const char **nextTokPtr) {
1019
6.35M
  int tok;
1020
6.35M
  if (ptr >= end)
1021
7.63k
    return XML_TOK_NONE;
1022
6.34M
  if (MINBPC(enc) > 1) {
1023
242
    size_t n = end - ptr;
1024
242
    if (n & (MINBPC(enc) - 1)) {
1025
49
      n &= ~(MINBPC(enc) - 1);
1026
49
      if (n == 0)
1027
4
        return XML_TOK_PARTIAL;
1028
45
      end = ptr + n;
1029
45
    }
1030
242
  }
1031
6.34M
  switch (BYTE_TYPE(enc, ptr)) {
1032
6.68k
  case BT_QUOT:
1033
6.68k
    return PREFIX(scanLit)(BT_QUOT, enc, ptr + MINBPC(enc), end, nextTokPtr);
1034
36.3k
  case BT_APOS:
1035
36.3k
    return PREFIX(scanLit)(BT_APOS, enc, ptr + MINBPC(enc), end, nextTokPtr);
1036
66.0k
  case BT_LT: {
1037
66.0k
    ptr += MINBPC(enc);
1038
66.0k
    REQUIRE_CHAR(enc, ptr, end);
1039
66.0k
    switch (BYTE_TYPE(enc, ptr)) {
1040
52.4k
    case BT_EXCL:
1041
52.4k
      return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1042
7.95k
    case BT_QUEST:
1043
7.95k
      return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1044
4.18k
    case BT_NMSTRT:
1045
5.45k
    case BT_HEX:
1046
5.45k
    case BT_NONASCII:
1047
5.49k
    case BT_LEAD2:
1048
5.53k
    case BT_LEAD3:
1049
5.54k
    case BT_LEAD4:
1050
5.54k
      *nextTokPtr = ptr - MINBPC(enc);
1051
5.54k
      return XML_TOK_INSTANCE_START;
1052
66.0k
    }
1053
26
    *nextTokPtr = ptr;
1054
26
    return XML_TOK_INVALID;
1055
66.0k
  }
1056
376k
  case BT_CR:
1057
376k
    if (ptr + MINBPC(enc) == end) {
1058
361
      *nextTokPtr = end;
1059
      /* indicate that this might be part of a CR/LF pair */
1060
361
      return -XML_TOK_PROLOG_S;
1061
361
    }
1062
    /* fall through */
1063
1.02M
  case BT_S:
1064
1.08M
  case BT_LF:
1065
1.09M
    for (;;) {
1066
1.09M
      ptr += MINBPC(enc);
1067
1.09M
      if (! HAS_CHAR(enc, ptr, end))
1068
219
        break;
1069
1.09M
      switch (BYTE_TYPE(enc, ptr)) {
1070
8.73k
      case BT_S:
1071
16.3k
      case BT_LF:
1072
16.3k
        break;
1073
2.01k
      case BT_CR:
1074
        /* don't split CR/LF pair */
1075
2.01k
        if (ptr + MINBPC(enc) != end)
1076
1.84k
          break;
1077
        /* fall through */
1078
1.08M
      default:
1079
1.08M
        *nextTokPtr = ptr;
1080
1.08M
        return XML_TOK_PROLOG_S;
1081
1.09M
      }
1082
1.09M
    }
1083
219
    *nextTokPtr = ptr;
1084
219
    return XML_TOK_PROLOG_S;
1085
9.92k
  case BT_PERCNT:
1086
9.92k
    return PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1087
4.34k
  case BT_COMMA:
1088
4.34k
    *nextTokPtr = ptr + MINBPC(enc);
1089
4.34k
    return XML_TOK_COMMA;
1090
2.56k
  case BT_LSQB:
1091
2.56k
    *nextTokPtr = ptr + MINBPC(enc);
1092
2.56k
    return XML_TOK_OPEN_BRACKET;
1093
1.23k
  case BT_RSQB:
1094
1.23k
    ptr += MINBPC(enc);
1095
1.23k
    if (! HAS_CHAR(enc, ptr, end))
1096
7
      return -XML_TOK_CLOSE_BRACKET;
1097
1.22k
    if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) {
1098
31
      REQUIRE_CHARS(enc, ptr, end, 2);
1099
29
      if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_GT)) {
1100
3
        *nextTokPtr = ptr + 2 * MINBPC(enc);
1101
3
        return XML_TOK_COND_SECT_CLOSE;
1102
3
      }
1103
29
    }
1104
1.22k
    *nextTokPtr = ptr;
1105
1.22k
    return XML_TOK_CLOSE_BRACKET;
1106
3.73M
  case BT_LPAR:
1107
3.73M
    *nextTokPtr = ptr + MINBPC(enc);
1108
3.73M
    return XML_TOK_OPEN_PAREN;
1109
319k
  case BT_RPAR:
1110
319k
    ptr += MINBPC(enc);
1111
319k
    if (! HAS_CHAR(enc, ptr, end))
1112
85
      return -XML_TOK_CLOSE_PAREN;
1113
319k
    switch (BYTE_TYPE(enc, ptr)) {
1114
3.56k
    case BT_AST:
1115
3.56k
      *nextTokPtr = ptr + MINBPC(enc);
1116
3.56k
      return XML_TOK_CLOSE_PAREN_ASTERISK;
1117
2.57k
    case BT_QUEST:
1118
2.57k
      *nextTokPtr = ptr + MINBPC(enc);
1119
2.57k
      return XML_TOK_CLOSE_PAREN_QUESTION;
1120
3.01k
    case BT_PLUS:
1121
3.01k
      *nextTokPtr = ptr + MINBPC(enc);
1122
3.01k
      return XML_TOK_CLOSE_PAREN_PLUS;
1123
6.66k
    case BT_CR:
1124
7.34k
    case BT_LF:
1125
294k
    case BT_S:
1126
296k
    case BT_GT:
1127
298k
    case BT_COMMA:
1128
301k
    case BT_VERBAR:
1129
310k
    case BT_RPAR:
1130
310k
      *nextTokPtr = ptr;
1131
310k
      return XML_TOK_CLOSE_PAREN;
1132
319k
    }
1133
10
    *nextTokPtr = ptr;
1134
10
    return XML_TOK_INVALID;
1135
11.6k
  case BT_VERBAR:
1136
11.6k
    *nextTokPtr = ptr + MINBPC(enc);
1137
11.6k
    return XML_TOK_OR;
1138
47.8k
  case BT_GT:
1139
47.8k
    *nextTokPtr = ptr + MINBPC(enc);
1140
47.8k
    return XML_TOK_DECL_CLOSE;
1141
297k
  case BT_NUM:
1142
297k
    return PREFIX(scanPoundName)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1143
0
#  define LEAD_CASE(n)                                                         \
1144
4.72k
  case BT_LEAD##n:                                                             \
1145
4.72k
    if (end - ptr < n)                                                         \
1146
75
      return XML_TOK_PARTIAL_CHAR;                                             \
1147
4.66k
    if (IS_INVALID_CHAR(enc, ptr, n)) {                                        \
1148
82
      *nextTokPtr = ptr;                                                       \
1149
82
      return XML_TOK_INVALID;                                                  \
1150
82
    }                                                                          \
1151
4.66k
    if (IS_NMSTRT_CHAR(enc, ptr, n)) {                                         \
1152
3.96k
      ptr += n;                                                                \
1153
3.96k
      tok = XML_TOK_NAME;                                                      \
1154
3.96k
      break;                                                                   \
1155
3.96k
    }                                                                          \
1156
4.58k
    if (IS_NAME_CHAR(enc, ptr, n)) {                                           \
1157
541
      ptr += n;                                                                \
1158
541
      tok = XML_TOK_NMTOKEN;                                                   \
1159
541
      break;                                                                   \
1160
541
    }                                                                          \
1161
616
    *nextTokPtr = ptr;                                                         \
1162
75
    return XML_TOK_INVALID;
1163
4.55k
    LEAD_CASE(2)
1164
9.76k
    LEAD_CASE(3)
1165
270
    LEAD_CASE(4)
1166
0
#  undef LEAD_CASE
1167
384k
  case BT_NMSTRT:
1168
721k
  case BT_HEX:
1169
721k
    tok = XML_TOK_NAME;
1170
721k
    ptr += MINBPC(enc);
1171
721k
    break;
1172
463
  case BT_DIGIT:
1173
847
  case BT_NAME:
1174
1.48k
  case BT_MINUS:
1175
#  ifdef XML_NS
1176
  case BT_COLON:
1177
#  endif
1178
1.48k
    tok = XML_TOK_NMTOKEN;
1179
1.48k
    ptr += MINBPC(enc);
1180
1.48k
    break;
1181
181
  case BT_NONASCII:
1182
181
    if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {
1183
139
      ptr += MINBPC(enc);
1184
139
      tok = XML_TOK_NAME;
1185
139
      break;
1186
139
    }
1187
42
    if (IS_NAME_CHAR_MINBPC(enc, ptr)) {
1188
18
      ptr += MINBPC(enc);
1189
18
      tok = XML_TOK_NMTOKEN;
1190
18
      break;
1191
18
    }
1192
    /* fall through */
1193
89
  default:
1194
89
    *nextTokPtr = ptr;
1195
89
    return XML_TOK_INVALID;
1196
6.34M
  }
1197
15.8M
  while (HAS_CHAR(enc, ptr, end)) {
1198
15.8M
    switch (BYTE_TYPE(enc, ptr)) {
1199
40.4M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1200
19.6k
    case BT_GT:
1201
319k
    case BT_RPAR:
1202
320k
    case BT_COMMA:
1203
324k
    case BT_VERBAR:
1204
327k
    case BT_LSQB:
1205
327k
    case BT_PERCNT:
1206
385k
    case BT_S:
1207
696k
    case BT_CR:
1208
723k
    case BT_LF:
1209
723k
      *nextTokPtr = ptr;
1210
723k
      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
453
    case BT_PLUS:
1232
453
      if (tok == XML_TOK_NMTOKEN) {
1233
2
        *nextTokPtr = ptr;
1234
2
        return XML_TOK_INVALID;
1235
2
      }
1236
451
      *nextTokPtr = ptr + MINBPC(enc);
1237
451
      return XML_TOK_NAME_PLUS;
1238
2.40k
    case BT_AST:
1239
2.40k
      if (tok == XML_TOK_NMTOKEN) {
1240
4
        *nextTokPtr = ptr;
1241
4
        return XML_TOK_INVALID;
1242
4
      }
1243
2.39k
      *nextTokPtr = ptr + MINBPC(enc);
1244
2.39k
      return XML_TOK_NAME_ASTERISK;
1245
451
    case BT_QUEST:
1246
451
      if (tok == XML_TOK_NMTOKEN) {
1247
2
        *nextTokPtr = ptr;
1248
2
        return XML_TOK_INVALID;
1249
2
      }
1250
449
      *nextTokPtr = ptr + MINBPC(enc);
1251
449
      return XML_TOK_NAME_QUESTION;
1252
59
    default:
1253
59
      *nextTokPtr = ptr;
1254
59
      return XML_TOK_INVALID;
1255
15.8M
    }
1256
15.8M
  }
1257
671
  return -tok;
1258
727k
}
xmltok.c:normal_prologTok
Line
Count
Source
1018
6.35M
                  const char **nextTokPtr) {
1019
6.35M
  int tok;
1020
6.35M
  if (ptr >= end)
1021
7.62k
    return XML_TOK_NONE;
1022
6.34M
  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
6.34M
  switch (BYTE_TYPE(enc, ptr)) {
1032
6.68k
  case BT_QUOT:
1033
6.68k
    return PREFIX(scanLit)(BT_QUOT, enc, ptr + MINBPC(enc), end, nextTokPtr);
1034
36.3k
  case BT_APOS:
1035
36.3k
    return PREFIX(scanLit)(BT_APOS, enc, ptr + MINBPC(enc), end, nextTokPtr);
1036
66.0k
  case BT_LT: {
1037
66.0k
    ptr += MINBPC(enc);
1038
66.0k
    REQUIRE_CHAR(enc, ptr, end);
1039
66.0k
    switch (BYTE_TYPE(enc, ptr)) {
1040
52.4k
    case BT_EXCL:
1041
52.4k
      return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1042
7.95k
    case BT_QUEST:
1043
7.95k
      return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1044
4.18k
    case BT_NMSTRT:
1045
5.45k
    case BT_HEX:
1046
5.45k
    case BT_NONASCII:
1047
5.49k
    case BT_LEAD2:
1048
5.53k
    case BT_LEAD3:
1049
5.54k
    case BT_LEAD4:
1050
5.54k
      *nextTokPtr = ptr - MINBPC(enc);
1051
5.54k
      return XML_TOK_INSTANCE_START;
1052
66.0k
    }
1053
26
    *nextTokPtr = ptr;
1054
26
    return XML_TOK_INVALID;
1055
66.0k
  }
1056
376k
  case BT_CR:
1057
376k
    if (ptr + MINBPC(enc) == end) {
1058
361
      *nextTokPtr = end;
1059
      /* indicate that this might be part of a CR/LF pair */
1060
361
      return -XML_TOK_PROLOG_S;
1061
361
    }
1062
    /* fall through */
1063
1.02M
  case BT_S:
1064
1.08M
  case BT_LF:
1065
1.09M
    for (;;) {
1066
1.09M
      ptr += MINBPC(enc);
1067
1.09M
      if (! HAS_CHAR(enc, ptr, end))
1068
219
        break;
1069
1.09M
      switch (BYTE_TYPE(enc, ptr)) {
1070
8.73k
      case BT_S:
1071
16.3k
      case BT_LF:
1072
16.3k
        break;
1073
2.01k
      case BT_CR:
1074
        /* don't split CR/LF pair */
1075
2.01k
        if (ptr + MINBPC(enc) != end)
1076
1.84k
          break;
1077
        /* fall through */
1078
1.08M
      default:
1079
1.08M
        *nextTokPtr = ptr;
1080
1.08M
        return XML_TOK_PROLOG_S;
1081
1.09M
      }
1082
1.09M
    }
1083
219
    *nextTokPtr = ptr;
1084
219
    return XML_TOK_PROLOG_S;
1085
9.92k
  case BT_PERCNT:
1086
9.92k
    return PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1087
4.34k
  case BT_COMMA:
1088
4.34k
    *nextTokPtr = ptr + MINBPC(enc);
1089
4.34k
    return XML_TOK_COMMA;
1090
2.56k
  case BT_LSQB:
1091
2.56k
    *nextTokPtr = ptr + MINBPC(enc);
1092
2.56k
    return XML_TOK_OPEN_BRACKET;
1093
1.23k
  case BT_RSQB:
1094
1.23k
    ptr += MINBPC(enc);
1095
1.23k
    if (! HAS_CHAR(enc, ptr, end))
1096
7
      return -XML_TOK_CLOSE_BRACKET;
1097
1.22k
    if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) {
1098
31
      REQUIRE_CHARS(enc, ptr, end, 2);
1099
29
      if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_GT)) {
1100
3
        *nextTokPtr = ptr + 2 * MINBPC(enc);
1101
3
        return XML_TOK_COND_SECT_CLOSE;
1102
3
      }
1103
29
    }
1104
1.22k
    *nextTokPtr = ptr;
1105
1.22k
    return XML_TOK_CLOSE_BRACKET;
1106
3.73M
  case BT_LPAR:
1107
3.73M
    *nextTokPtr = ptr + MINBPC(enc);
1108
3.73M
    return XML_TOK_OPEN_PAREN;
1109
319k
  case BT_RPAR:
1110
319k
    ptr += MINBPC(enc);
1111
319k
    if (! HAS_CHAR(enc, ptr, end))
1112
85
      return -XML_TOK_CLOSE_PAREN;
1113
319k
    switch (BYTE_TYPE(enc, ptr)) {
1114
3.56k
    case BT_AST:
1115
3.56k
      *nextTokPtr = ptr + MINBPC(enc);
1116
3.56k
      return XML_TOK_CLOSE_PAREN_ASTERISK;
1117
2.57k
    case BT_QUEST:
1118
2.57k
      *nextTokPtr = ptr + MINBPC(enc);
1119
2.57k
      return XML_TOK_CLOSE_PAREN_QUESTION;
1120
3.01k
    case BT_PLUS:
1121
3.01k
      *nextTokPtr = ptr + MINBPC(enc);
1122
3.01k
      return XML_TOK_CLOSE_PAREN_PLUS;
1123
6.66k
    case BT_CR:
1124
7.34k
    case BT_LF:
1125
294k
    case BT_S:
1126
296k
    case BT_GT:
1127
298k
    case BT_COMMA:
1128
301k
    case BT_VERBAR:
1129
310k
    case BT_RPAR:
1130
310k
      *nextTokPtr = ptr;
1131
310k
      return XML_TOK_CLOSE_PAREN;
1132
319k
    }
1133
10
    *nextTokPtr = ptr;
1134
10
    return XML_TOK_INVALID;
1135
11.6k
  case BT_VERBAR:
1136
11.6k
    *nextTokPtr = ptr + MINBPC(enc);
1137
11.6k
    return XML_TOK_OR;
1138
47.8k
  case BT_GT:
1139
47.8k
    *nextTokPtr = ptr + MINBPC(enc);
1140
47.8k
    return XML_TOK_DECL_CLOSE;
1141
297k
  case BT_NUM:
1142
297k
    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
4.55k
    LEAD_CASE(2)
1164
9.76k
    LEAD_CASE(3)
1165
140
    LEAD_CASE(4)
1166
0
#  undef LEAD_CASE
1167
384k
  case BT_NMSTRT:
1168
721k
  case BT_HEX:
1169
721k
    tok = XML_TOK_NAME;
1170
721k
    ptr += MINBPC(enc);
1171
721k
    break;
1172
463
  case BT_DIGIT:
1173
847
  case BT_NAME:
1174
1.48k
  case BT_MINUS:
1175
#  ifdef XML_NS
1176
  case BT_COLON:
1177
#  endif
1178
1.48k
    tok = XML_TOK_NMTOKEN;
1179
1.48k
    ptr += MINBPC(enc);
1180
1.48k
    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
54
  default:
1194
54
    *nextTokPtr = ptr;
1195
54
    return XML_TOK_INVALID;
1196
6.34M
  }
1197
15.8M
  while (HAS_CHAR(enc, ptr, end)) {
1198
15.8M
    switch (BYTE_TYPE(enc, ptr)) {
1199
40.4M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1200
19.6k
    case BT_GT:
1201
319k
    case BT_RPAR:
1202
320k
    case BT_COMMA:
1203
324k
    case BT_VERBAR:
1204
327k
    case BT_LSQB:
1205
327k
    case BT_PERCNT:
1206
385k
    case BT_S:
1207
696k
    case BT_CR:
1208
723k
    case BT_LF:
1209
723k
      *nextTokPtr = ptr;
1210
723k
      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
453
    case BT_PLUS:
1232
453
      if (tok == XML_TOK_NMTOKEN) {
1233
2
        *nextTokPtr = ptr;
1234
2
        return XML_TOK_INVALID;
1235
2
      }
1236
451
      *nextTokPtr = ptr + MINBPC(enc);
1237
451
      return XML_TOK_NAME_PLUS;
1238
2.40k
    case BT_AST:
1239
2.40k
      if (tok == XML_TOK_NMTOKEN) {
1240
4
        *nextTokPtr = ptr;
1241
4
        return XML_TOK_INVALID;
1242
4
      }
1243
2.39k
      *nextTokPtr = ptr + MINBPC(enc);
1244
2.39k
      return XML_TOK_NAME_ASTERISK;
1245
451
    case BT_QUEST:
1246
451
      if (tok == XML_TOK_NMTOKEN) {
1247
2
        *nextTokPtr = ptr;
1248
2
        return XML_TOK_INVALID;
1249
2
      }
1250
449
      *nextTokPtr = ptr + MINBPC(enc);
1251
449
      return XML_TOK_NAME_QUESTION;
1252
42
    default:
1253
42
      *nextTokPtr = ptr;
1254
42
      return XML_TOK_INVALID;
1255
15.8M
    }
1256
15.8M
  }
1257
627
  return -tok;
1258
727k
}
xmltok.c:little2_prologTok
Line
Count
Source
1018
130
                  const char **nextTokPtr) {
1019
130
  int tok;
1020
130
  if (ptr >= end)
1021
2
    return XML_TOK_NONE;
1022
128
  if (MINBPC(enc) > 1) {
1023
128
    size_t n = end - ptr;
1024
128
    if (n & (MINBPC(enc) - 1)) {
1025
32
      n &= ~(MINBPC(enc) - 1);
1026
32
      if (n == 0)
1027
2
        return XML_TOK_PARTIAL;
1028
30
      end = ptr + n;
1029
30
    }
1030
128
  }
1031
126
  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
70
    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
96
  case BT_NONASCII:
1182
96
    if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {
1183
75
      ptr += MINBPC(enc);
1184
75
      tok = XML_TOK_NAME;
1185
75
      break;
1186
75
    }
1187
21
    if (IS_NAME_CHAR_MINBPC(enc, ptr)) {
1188
9
      ptr += MINBPC(enc);
1189
9
      tok = XML_TOK_NMTOKEN;
1190
9
      break;
1191
9
    }
1192
    /* fall through */
1193
17
  default:
1194
17
    *nextTokPtr = ptr;
1195
17
    return XML_TOK_INVALID;
1196
126
  }
1197
1.14k
  while (HAS_CHAR(enc, ptr, end)) {
1198
1.14k
    switch (BYTE_TYPE(enc, ptr)) {
1199
5.47k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1200
0
    case BT_GT:
1201
0
    case BT_RPAR:
1202
0
    case BT_COMMA:
1203
0
    case BT_VERBAR:
1204
0
    case BT_LSQB:
1205
0
    case BT_PERCNT:
1206
0
    case BT_S:
1207
0
    case BT_CR:
1208
0
    case BT_LF:
1209
0
      *nextTokPtr = ptr;
1210
0
      return tok;
1211
#  ifdef XML_NS
1212
    case BT_COLON:
1213
      ptr += MINBPC(enc);
1214
      switch (tok) {
1215
      case XML_TOK_NAME:
1216
        REQUIRE_CHAR(enc, ptr, end);
1217
        tok = XML_TOK_PREFIXED_NAME;
1218
        switch (BYTE_TYPE(enc, ptr)) {
1219
          CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1220
        default:
1221
          tok = XML_TOK_NMTOKEN;
1222
          break;
1223
        }
1224
        break;
1225
      case XML_TOK_PREFIXED_NAME:
1226
        tok = XML_TOK_NMTOKEN;
1227
        break;
1228
      }
1229
      break;
1230
#  endif
1231
0
    case BT_PLUS:
1232
0
      if (tok == XML_TOK_NMTOKEN) {
1233
0
        *nextTokPtr = ptr;
1234
0
        return XML_TOK_INVALID;
1235
0
      }
1236
0
      *nextTokPtr = ptr + MINBPC(enc);
1237
0
      return XML_TOK_NAME_PLUS;
1238
0
    case BT_AST:
1239
0
      if (tok == XML_TOK_NMTOKEN) {
1240
0
        *nextTokPtr = ptr;
1241
0
        return XML_TOK_INVALID;
1242
0
      }
1243
0
      *nextTokPtr = ptr + MINBPC(enc);
1244
0
      return XML_TOK_NAME_ASTERISK;
1245
0
    case BT_QUEST:
1246
0
      if (tok == XML_TOK_NMTOKEN) {
1247
0
        *nextTokPtr = ptr;
1248
0
        return XML_TOK_INVALID;
1249
0
      }
1250
0
      *nextTokPtr = ptr + MINBPC(enc);
1251
0
      return XML_TOK_NAME_QUESTION;
1252
8
    default:
1253
8
      *nextTokPtr = ptr;
1254
8
      return XML_TOK_INVALID;
1255
1.14k
    }
1256
1.14k
  }
1257
20
  return -tok;
1258
84
}
xmltok.c:big2_prologTok
Line
Count
Source
1018
116
                  const char **nextTokPtr) {
1019
116
  int tok;
1020
116
  if (ptr >= end)
1021
2
    return XML_TOK_NONE;
1022
114
  if (MINBPC(enc) > 1) {
1023
114
    size_t n = end - ptr;
1024
114
    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
114
  }
1031
112
  switch (BYTE_TYPE(enc, ptr)) {
1032
0
  case BT_QUOT:
1033
0
    return PREFIX(scanLit)(BT_QUOT, enc, ptr + MINBPC(enc), end, nextTokPtr);
1034
0
  case BT_APOS:
1035
0
    return PREFIX(scanLit)(BT_APOS, enc, ptr + MINBPC(enc), end, nextTokPtr);
1036
0
  case BT_LT: {
1037
0
    ptr += MINBPC(enc);
1038
0
    REQUIRE_CHAR(enc, ptr, end);
1039
0
    switch (BYTE_TYPE(enc, ptr)) {
1040
0
    case BT_EXCL:
1041
0
      return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1042
0
    case BT_QUEST:
1043
0
      return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1044
0
    case BT_NMSTRT:
1045
0
    case BT_HEX:
1046
0
    case BT_NONASCII:
1047
0
    case BT_LEAD2:
1048
0
    case BT_LEAD3:
1049
0
    case BT_LEAD4:
1050
0
      *nextTokPtr = ptr - MINBPC(enc);
1051
0
      return XML_TOK_INSTANCE_START;
1052
0
    }
1053
0
    *nextTokPtr = ptr;
1054
0
    return XML_TOK_INVALID;
1055
0
  }
1056
0
  case BT_CR:
1057
0
    if (ptr + MINBPC(enc) == end) {
1058
0
      *nextTokPtr = end;
1059
      /* indicate that this might be part of a CR/LF pair */
1060
0
      return -XML_TOK_PROLOG_S;
1061
0
    }
1062
    /* fall through */
1063
0
  case BT_S:
1064
0
  case BT_LF:
1065
0
    for (;;) {
1066
0
      ptr += MINBPC(enc);
1067
0
      if (! HAS_CHAR(enc, ptr, end))
1068
0
        break;
1069
0
      switch (BYTE_TYPE(enc, ptr)) {
1070
0
      case BT_S:
1071
0
      case BT_LF:
1072
0
        break;
1073
0
      case BT_CR:
1074
        /* don't split CR/LF pair */
1075
0
        if (ptr + MINBPC(enc) != end)
1076
0
          break;
1077
        /* fall through */
1078
0
      default:
1079
0
        *nextTokPtr = ptr;
1080
0
        return XML_TOK_PROLOG_S;
1081
0
      }
1082
0
    }
1083
0
    *nextTokPtr = ptr;
1084
0
    return XML_TOK_PROLOG_S;
1085
0
  case BT_PERCNT:
1086
0
    return PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1087
0
  case BT_COMMA:
1088
0
    *nextTokPtr = ptr + MINBPC(enc);
1089
0
    return XML_TOK_COMMA;
1090
0
  case BT_LSQB:
1091
0
    *nextTokPtr = ptr + MINBPC(enc);
1092
0
    return XML_TOK_OPEN_BRACKET;
1093
0
  case BT_RSQB:
1094
0
    ptr += MINBPC(enc);
1095
0
    if (! HAS_CHAR(enc, ptr, end))
1096
0
      return -XML_TOK_CLOSE_BRACKET;
1097
0
    if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) {
1098
0
      REQUIRE_CHARS(enc, ptr, end, 2);
1099
0
      if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_GT)) {
1100
0
        *nextTokPtr = ptr + 2 * MINBPC(enc);
1101
0
        return XML_TOK_COND_SECT_CLOSE;
1102
0
      }
1103
0
    }
1104
0
    *nextTokPtr = ptr;
1105
0
    return XML_TOK_CLOSE_BRACKET;
1106
0
  case BT_LPAR:
1107
0
    *nextTokPtr = ptr + MINBPC(enc);
1108
0
    return XML_TOK_OPEN_PAREN;
1109
0
  case BT_RPAR:
1110
0
    ptr += MINBPC(enc);
1111
0
    if (! HAS_CHAR(enc, ptr, end))
1112
0
      return -XML_TOK_CLOSE_PAREN;
1113
0
    switch (BYTE_TYPE(enc, ptr)) {
1114
0
    case BT_AST:
1115
0
      *nextTokPtr = ptr + MINBPC(enc);
1116
0
      return XML_TOK_CLOSE_PAREN_ASTERISK;
1117
0
    case BT_QUEST:
1118
0
      *nextTokPtr = ptr + MINBPC(enc);
1119
0
      return XML_TOK_CLOSE_PAREN_QUESTION;
1120
0
    case BT_PLUS:
1121
0
      *nextTokPtr = ptr + MINBPC(enc);
1122
0
      return XML_TOK_CLOSE_PAREN_PLUS;
1123
0
    case BT_CR:
1124
0
    case BT_LF:
1125
0
    case BT_S:
1126
0
    case BT_GT:
1127
0
    case BT_COMMA:
1128
0
    case BT_VERBAR:
1129
0
    case BT_RPAR:
1130
0
      *nextTokPtr = ptr;
1131
0
      return XML_TOK_CLOSE_PAREN;
1132
0
    }
1133
0
    *nextTokPtr = ptr;
1134
0
    return XML_TOK_INVALID;
1135
0
  case BT_VERBAR:
1136
0
    *nextTokPtr = ptr + MINBPC(enc);
1137
0
    return XML_TOK_OR;
1138
0
  case BT_GT:
1139
0
    *nextTokPtr = ptr + MINBPC(enc);
1140
0
    return XML_TOK_DECL_CLOSE;
1141
0
  case BT_NUM:
1142
0
    return PREFIX(scanPoundName)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1143
0
#  define LEAD_CASE(n)                                                         \
1144
0
  case BT_LEAD##n:                                                             \
1145
0
    if (end - ptr < n)                                                         \
1146
0
      return XML_TOK_PARTIAL_CHAR;                                             \
1147
0
    if (IS_INVALID_CHAR(enc, ptr, n)) {                                        \
1148
0
      *nextTokPtr = ptr;                                                       \
1149
0
      return XML_TOK_INVALID;                                                  \
1150
0
    }                                                                          \
1151
0
    if (IS_NMSTRT_CHAR(enc, ptr, n)) {                                         \
1152
0
      ptr += n;                                                                \
1153
0
      tok = XML_TOK_NAME;                                                      \
1154
0
      break;                                                                   \
1155
0
    }                                                                          \
1156
0
    if (IS_NAME_CHAR(enc, ptr, n)) {                                           \
1157
0
      ptr += n;                                                                \
1158
0
      tok = XML_TOK_NMTOKEN;                                                   \
1159
0
      break;                                                                   \
1160
0
    }                                                                          \
1161
0
    *nextTokPtr = ptr;                                                         \
1162
0
    return XML_TOK_INVALID;
1163
0
    LEAD_CASE(2)
1164
0
    LEAD_CASE(3)
1165
60
    LEAD_CASE(4)
1166
0
#  undef LEAD_CASE
1167
0
  case BT_NMSTRT:
1168
0
  case BT_HEX:
1169
0
    tok = XML_TOK_NAME;
1170
0
    ptr += MINBPC(enc);
1171
0
    break;
1172
0
  case BT_DIGIT:
1173
0
  case BT_NAME:
1174
0
  case BT_MINUS:
1175
#  ifdef XML_NS
1176
  case BT_COLON:
1177
#  endif
1178
0
    tok = XML_TOK_NMTOKEN;
1179
0
    ptr += MINBPC(enc);
1180
0
    break;
1181
85
  case BT_NONASCII:
1182
85
    if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {
1183
64
      ptr += MINBPC(enc);
1184
64
      tok = XML_TOK_NAME;
1185
64
      break;
1186
64
    }
1187
21
    if (IS_NAME_CHAR_MINBPC(enc, ptr)) {
1188
9
      ptr += MINBPC(enc);
1189
9
      tok = XML_TOK_NMTOKEN;
1190
9
      break;
1191
9
    }
1192
    /* fall through */
1193
18
  default:
1194
18
    *nextTokPtr = ptr;
1195
18
    return XML_TOK_INVALID;
1196
112
  }
1197
1.59k
  while (HAS_CHAR(enc, ptr, end)) {
1198
1.59k
    switch (BYTE_TYPE(enc, ptr)) {
1199
7.78k
      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
9
    default:
1253
9
      *nextTokPtr = ptr;
1254
9
      return XML_TOK_INVALID;
1255
1.59k
    }
1256
1.59k
  }
1257
24
  return -tok;
1258
73
}
1259
1260
static int PTRCALL
1261
PREFIX(attributeValueTok)(const ENCODING *enc, const char *ptr, const char *end,
1262
1.57M
                          const char **nextTokPtr) {
1263
1.57M
  const char *start;
1264
1.57M
  if (ptr >= end)
1265
80.9k
    return XML_TOK_NONE;
1266
1.49M
  else if (! HAS_CHAR(enc, ptr, end)) {
1267
    /* This line cannot be executed.  The incoming data has already
1268
     * been tokenized once, so incomplete characters like this have
1269
     * already been eliminated from the input.  Retaining the paranoia
1270
     * check is still valuable, however.
1271
     */
1272
0
    return XML_TOK_PARTIAL; /* LCOV_EXCL_LINE */
1273
0
  }
1274
1.49M
  start = ptr;
1275
17.1M
  while (HAS_CHAR(enc, ptr, end)) {
1276
17.1M
    switch (BYTE_TYPE(enc, ptr)) {
1277
0
#  define LEAD_CASE(n)                                                         \
1278
141k
  case BT_LEAD##n:                                                             \
1279
141k
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1280
141k
    break;
1281
37.8k
      LEAD_CASE(2)
1282
50.6k
      LEAD_CASE(3)
1283
53.1k
      LEAD_CASE(4)
1284
0
#  undef LEAD_CASE
1285
197k
    case BT_AMP:
1286
197k
      if (ptr == start)
1287
152k
        return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1288
45.3k
      *nextTokPtr = ptr;
1289
45.3k
      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
441k
    case BT_LF:
1295
441k
      if (ptr == start) {
1296
349k
        *nextTokPtr = ptr + MINBPC(enc);
1297
349k
        return XML_TOK_DATA_NEWLINE;
1298
349k
      }
1299
91.8k
      *nextTokPtr = ptr;
1300
91.8k
      return XML_TOK_DATA_CHARS;
1301
607k
    case BT_CR:
1302
607k
      if (ptr == start) {
1303
446k
        ptr += MINBPC(enc);
1304
446k
        if (! HAS_CHAR(enc, ptr, end))
1305
4.19k
          return XML_TOK_TRAILING_CR;
1306
441k
        if (BYTE_TYPE(enc, ptr) == BT_LF)
1307
130k
          ptr += MINBPC(enc);
1308
441k
        *nextTokPtr = ptr;
1309
441k
        return XML_TOK_DATA_NEWLINE;
1310
446k
      }
1311
161k
      *nextTokPtr = ptr;
1312
161k
      return XML_TOK_DATA_CHARS;
1313
183k
    case BT_S:
1314
183k
      if (ptr == start) {
1315
111k
        *nextTokPtr = ptr + MINBPC(enc);
1316
111k
        return XML_TOK_ATTRIBUTE_VALUE_S;
1317
111k
      }
1318
71.6k
      *nextTokPtr = ptr;
1319
71.6k
      return XML_TOK_DATA_CHARS;
1320
15.5M
    default:
1321
15.5M
      ptr += MINBPC(enc);
1322
15.5M
      break;
1323
17.1M
    }
1324
17.1M
  }
1325
60.7k
  *nextTokPtr = ptr;
1326
60.7k
  return XML_TOK_DATA_CHARS;
1327
1.49M
}
xmltok.c:normal_attributeValueTok
Line
Count
Source
1262
1.57M
                          const char **nextTokPtr) {
1263
1.57M
  const char *start;
1264
1.57M
  if (ptr >= end)
1265
80.9k
    return XML_TOK_NONE;
1266
1.49M
  else if (! HAS_CHAR(enc, ptr, end)) {
1267
    /* This line cannot be executed.  The incoming data has already
1268
     * been tokenized once, so incomplete characters like this have
1269
     * already been eliminated from the input.  Retaining the paranoia
1270
     * check is still valuable, however.
1271
     */
1272
0
    return XML_TOK_PARTIAL; /* LCOV_EXCL_LINE */
1273
0
  }
1274
1.49M
  start = ptr;
1275
17.1M
  while (HAS_CHAR(enc, ptr, end)) {
1276
17.1M
    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
37.8k
      LEAD_CASE(2)
1282
50.6k
      LEAD_CASE(3)
1283
53.1k
      LEAD_CASE(4)
1284
0
#  undef LEAD_CASE
1285
197k
    case BT_AMP:
1286
197k
      if (ptr == start)
1287
152k
        return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1288
45.3k
      *nextTokPtr = ptr;
1289
45.3k
      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
441k
    case BT_LF:
1295
441k
      if (ptr == start) {
1296
349k
        *nextTokPtr = ptr + MINBPC(enc);
1297
349k
        return XML_TOK_DATA_NEWLINE;
1298
349k
      }
1299
91.8k
      *nextTokPtr = ptr;
1300
91.8k
      return XML_TOK_DATA_CHARS;
1301
607k
    case BT_CR:
1302
607k
      if (ptr == start) {
1303
446k
        ptr += MINBPC(enc);
1304
446k
        if (! HAS_CHAR(enc, ptr, end))
1305
4.19k
          return XML_TOK_TRAILING_CR;
1306
441k
        if (BYTE_TYPE(enc, ptr) == BT_LF)
1307
130k
          ptr += MINBPC(enc);
1308
441k
        *nextTokPtr = ptr;
1309
441k
        return XML_TOK_DATA_NEWLINE;
1310
446k
      }
1311
161k
      *nextTokPtr = ptr;
1312
161k
      return XML_TOK_DATA_CHARS;
1313
183k
    case BT_S:
1314
183k
      if (ptr == start) {
1315
111k
        *nextTokPtr = ptr + MINBPC(enc);
1316
111k
        return XML_TOK_ATTRIBUTE_VALUE_S;
1317
111k
      }
1318
71.6k
      *nextTokPtr = ptr;
1319
71.6k
      return XML_TOK_DATA_CHARS;
1320
15.5M
    default:
1321
15.5M
      ptr += MINBPC(enc);
1322
15.5M
      break;
1323
17.1M
    }
1324
17.1M
  }
1325
60.7k
  *nextTokPtr = ptr;
1326
60.7k
  return XML_TOK_DATA_CHARS;
1327
1.49M
}
Unexecuted instantiation: xmltok.c:little2_attributeValueTok
Unexecuted instantiation: xmltok.c:big2_attributeValueTok
1328
1329
static int PTRCALL
1330
PREFIX(entityValueTok)(const ENCODING *enc, const char *ptr, const char *end,
1331
0
                       const char **nextTokPtr) {
1332
0
  const char *start;
1333
0
  if (ptr >= end)
1334
0
    return XML_TOK_NONE;
1335
0
  else if (! HAS_CHAR(enc, ptr, end)) {
1336
    /* This line cannot be executed.  The incoming data has already
1337
     * been tokenized once, so incomplete characters like this have
1338
     * already been eliminated from the input.  Retaining the paranoia
1339
     * check is still valuable, however.
1340
     */
1341
0
    return XML_TOK_PARTIAL; /* LCOV_EXCL_LINE */
1342
0
  }
1343
0
  start = ptr;
1344
0
  while (HAS_CHAR(enc, ptr, end)) {
1345
0
    switch (BYTE_TYPE(enc, ptr)) {
1346
0
#  define LEAD_CASE(n)                                                         \
1347
0
  case BT_LEAD##n:                                                             \
1348
0
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1349
0
    break;
1350
0
      LEAD_CASE(2)
1351
0
      LEAD_CASE(3)
1352
0
      LEAD_CASE(4)
1353
0
#  undef LEAD_CASE
1354
0
    case BT_AMP:
1355
0
      if (ptr == start)
1356
0
        return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1357
0
      *nextTokPtr = ptr;
1358
0
      return XML_TOK_DATA_CHARS;
1359
0
    case BT_PERCNT:
1360
0
      if (ptr == start) {
1361
0
        int tok = PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1362
0
        return (tok == XML_TOK_PERCENT) ? XML_TOK_INVALID : tok;
1363
0
      }
1364
0
      *nextTokPtr = ptr;
1365
0
      return XML_TOK_DATA_CHARS;
1366
0
    case BT_LF:
1367
0
      if (ptr == start) {
1368
0
        *nextTokPtr = ptr + MINBPC(enc);
1369
0
        return XML_TOK_DATA_NEWLINE;
1370
0
      }
1371
0
      *nextTokPtr = ptr;
1372
0
      return XML_TOK_DATA_CHARS;
1373
0
    case BT_CR:
1374
0
      if (ptr == start) {
1375
0
        ptr += MINBPC(enc);
1376
0
        if (! HAS_CHAR(enc, ptr, end))
1377
0
          return XML_TOK_TRAILING_CR;
1378
0
        if (BYTE_TYPE(enc, ptr) == BT_LF)
1379
0
          ptr += MINBPC(enc);
1380
0
        *nextTokPtr = ptr;
1381
0
        return XML_TOK_DATA_NEWLINE;
1382
0
      }
1383
0
      *nextTokPtr = ptr;
1384
0
      return XML_TOK_DATA_CHARS;
1385
0
    default:
1386
0
      ptr += MINBPC(enc);
1387
0
      break;
1388
0
    }
1389
0
  }
1390
0
  *nextTokPtr = ptr;
1391
0
  return XML_TOK_DATA_CHARS;
1392
0
}
Unexecuted instantiation: xmltok.c:normal_entityValueTok
Unexecuted instantiation: xmltok.c:little2_entityValueTok
Unexecuted instantiation: xmltok.c:big2_entityValueTok
1393
1394
#  ifdef XML_DTD
1395
1396
static int PTRCALL
1397
PREFIX(ignoreSectionTok)(const ENCODING *enc, const char *ptr, const char *end,
1398
                         const char **nextTokPtr) {
1399
  int level = 0;
1400
  if (MINBPC(enc) > 1) {
1401
    size_t n = end - ptr;
1402
    if (n & (MINBPC(enc) - 1)) {
1403
      n &= ~(MINBPC(enc) - 1);
1404
      end = ptr + n;
1405
    }
1406
  }
1407
  while (HAS_CHAR(enc, ptr, end)) {
1408
    switch (BYTE_TYPE(enc, ptr)) {
1409
      INVALID_CASES(ptr, nextTokPtr)
1410
    case BT_LT:
1411
      ptr += MINBPC(enc);
1412
      REQUIRE_CHAR(enc, ptr, end);
1413
      if (CHAR_MATCHES(enc, ptr, ASCII_EXCL)) {
1414
        ptr += MINBPC(enc);
1415
        REQUIRE_CHAR(enc, ptr, end);
1416
        if (CHAR_MATCHES(enc, ptr, ASCII_LSQB)) {
1417
          ++level;
1418
          ptr += MINBPC(enc);
1419
        }
1420
      }
1421
      break;
1422
    case BT_RSQB:
1423
      ptr += MINBPC(enc);
1424
      REQUIRE_CHAR(enc, ptr, end);
1425
      if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) {
1426
        ptr += MINBPC(enc);
1427
        REQUIRE_CHAR(enc, ptr, end);
1428
        if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
1429
          ptr += MINBPC(enc);
1430
          if (level == 0) {
1431
            *nextTokPtr = ptr;
1432
            return XML_TOK_IGNORE_SECT;
1433
          }
1434
          --level;
1435
        }
1436
      }
1437
      break;
1438
    default:
1439
      ptr += MINBPC(enc);
1440
      break;
1441
    }
1442
  }
1443
  return XML_TOK_PARTIAL;
1444
}
1445
1446
#  endif /* XML_DTD */
1447
1448
static int PTRCALL
1449
PREFIX(isPublicId)(const ENCODING *enc, const char *ptr, const char *end,
1450
2.77k
                   const char **badPtr) {
1451
2.77k
  ptr += MINBPC(enc);
1452
2.77k
  end -= MINBPC(enc);
1453
824k
  for (; HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
1454
824k
    switch (BYTE_TYPE(enc, ptr)) {
1455
342k
    case BT_DIGIT:
1456
527k
    case BT_HEX:
1457
528k
    case BT_MINUS:
1458
528k
    case BT_APOS:
1459
528k
    case BT_LPAR:
1460
584k
    case BT_RPAR:
1461
588k
    case BT_PLUS:
1462
589k
    case BT_COMMA:
1463
673k
    case BT_SOL:
1464
673k
    case BT_EQUALS:
1465
680k
    case BT_QUEST:
1466
683k
    case BT_CR:
1467
687k
    case BT_LF:
1468
688k
    case BT_SEMI:
1469
688k
    case BT_EXCL:
1470
690k
    case BT_AST:
1471
694k
    case BT_PERCNT:
1472
704k
    case BT_NUM:
1473
#  ifdef XML_NS
1474
    case BT_COLON:
1475
#  endif
1476
704k
      break;
1477
2.36k
    case BT_S:
1478
2.36k
      if (CHAR_MATCHES(enc, ptr, ASCII_TAB)) {
1479
1
        *badPtr = ptr;
1480
1
        return 0;
1481
1
      }
1482
2.36k
      break;
1483
4.81k
    case BT_NAME:
1484
115k
    case BT_NMSTRT:
1485
115k
      if (! (BYTE_TO_ASCII(enc, ptr) & ~0x7f))
1486
115k
        break;
1487
      /* fall through */
1488
2.26k
    default:
1489
2.26k
      switch (BYTE_TO_ASCII(enc, ptr)) {
1490
1.96k
      case 0x24: /* $ */
1491
2.24k
      case 0x40: /* @ */
1492
2.24k
        break;
1493
12
      default:
1494
12
        *badPtr = ptr;
1495
12
        return 0;
1496
2.26k
      }
1497
2.24k
      break;
1498
824k
    }
1499
824k
  }
1500
2.76k
  return 1;
1501
2.77k
}
xmltok.c:normal_isPublicId
Line
Count
Source
1450
2.77k
                   const char **badPtr) {
1451
2.77k
  ptr += MINBPC(enc);
1452
2.77k
  end -= MINBPC(enc);
1453
824k
  for (; HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
1454
824k
    switch (BYTE_TYPE(enc, ptr)) {
1455
342k
    case BT_DIGIT:
1456
527k
    case BT_HEX:
1457
528k
    case BT_MINUS:
1458
528k
    case BT_APOS:
1459
528k
    case BT_LPAR:
1460
584k
    case BT_RPAR:
1461
588k
    case BT_PLUS:
1462
589k
    case BT_COMMA:
1463
673k
    case BT_SOL:
1464
673k
    case BT_EQUALS:
1465
680k
    case BT_QUEST:
1466
683k
    case BT_CR:
1467
687k
    case BT_LF:
1468
688k
    case BT_SEMI:
1469
688k
    case BT_EXCL:
1470
690k
    case BT_AST:
1471
694k
    case BT_PERCNT:
1472
704k
    case BT_NUM:
1473
#  ifdef XML_NS
1474
    case BT_COLON:
1475
#  endif
1476
704k
      break;
1477
2.36k
    case BT_S:
1478
2.36k
      if (CHAR_MATCHES(enc, ptr, ASCII_TAB)) {
1479
1
        *badPtr = ptr;
1480
1
        return 0;
1481
1
      }
1482
2.36k
      break;
1483
4.81k
    case BT_NAME:
1484
115k
    case BT_NMSTRT:
1485
115k
      if (! (BYTE_TO_ASCII(enc, ptr) & ~0x7f))
1486
115k
        break;
1487
      /* fall through */
1488
2.26k
    default:
1489
2.26k
      switch (BYTE_TO_ASCII(enc, ptr)) {
1490
1.96k
      case 0x24: /* $ */
1491
2.24k
      case 0x40: /* @ */
1492
2.24k
        break;
1493
12
      default:
1494
12
        *badPtr = ptr;
1495
12
        return 0;
1496
2.26k
      }
1497
2.24k
      break;
1498
824k
    }
1499
824k
  }
1500
2.76k
  return 1;
1501
2.77k
}
Unexecuted instantiation: xmltok.c:little2_isPublicId
Unexecuted instantiation: xmltok.c:big2_isPublicId
1502
1503
/* This must only be called for a well-formed start-tag or empty
1504
   element tag.  Returns the number of attributes.  Pointers to the
1505
   first attsMax attributes are stored in atts.
1506
*/
1507
1508
static int PTRCALL
1509
PREFIX(getAtts)(const ENCODING *enc, const char *ptr, int attsMax,
1510
221k
                ATTRIBUTE *atts) {
1511
221k
  enum { other, inName, inValue } state = inName;
1512
221k
  int nAtts = 0;
1513
221k
  int open = 0; /* defined when state == inValue;
1514
                   initialization just to shut up compilers */
1515
1516
44.9M
  for (ptr += MINBPC(enc);; ptr += MINBPC(enc)) {
1517
44.9M
    switch (BYTE_TYPE(enc, ptr)) {
1518
0
#  define START_NAME                                                           \
1519
25.5M
    if (state == other) {                                                      \
1520
3.86M
      if (nAtts < attsMax) {                                                   \
1521
1.96M
        atts[nAtts].name = ptr;                                                \
1522
1.96M
        atts[nAtts].normalized = 1;                                            \
1523
1.96M
      }                                                                        \
1524
3.86M
      state = inName;                                                          \
1525
3.86M
    }
1526
0
#  define LEAD_CASE(n)                                                         \
1527
257k
  case BT_LEAD##n: /* NOTE: The encoding has already been validated. */        \
1528
257k
    START_NAME ptr += (n - MINBPC(enc));                                       \
1529
257k
    break;
1530
137k
      LEAD_CASE(2)
1531
89.5k
      LEAD_CASE(3)
1532
31.0k
      LEAD_CASE(4)
1533
0
#  undef LEAD_CASE
1534
0
    case BT_NONASCII:
1535
24.0M
    case BT_NMSTRT:
1536
25.2M
    case BT_HEX:
1537
25.2M
      START_NAME
1538
25.2M
      break;
1539
0
#  undef START_NAME
1540
462k
    case BT_QUOT:
1541
462k
      if (state != inValue) {
1542
169k
        if (nAtts < attsMax)
1543
112k
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1544
169k
        state = inValue;
1545
169k
        open = BT_QUOT;
1546
292k
      } else if (open == BT_QUOT) {
1547
169k
        state = other;
1548
169k
        if (nAtts < attsMax)
1549
112k
          atts[nAtts].valueEnd = ptr;
1550
169k
        nAtts++;
1551
169k
      }
1552
462k
      break;
1553
7.41M
    case BT_APOS:
1554
7.41M
      if (state != inValue) {
1555
3.69M
        if (nAtts < attsMax)
1556
1.85M
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1557
3.69M
        state = inValue;
1558
3.69M
        open = BT_APOS;
1559
3.71M
      } else if (open == BT_APOS) {
1560
3.69M
        state = other;
1561
3.69M
        if (nAtts < attsMax)
1562
1.85M
          atts[nAtts].valueEnd = ptr;
1563
3.69M
        nAtts++;
1564
3.69M
      }
1565
7.41M
      break;
1566
66.3k
    case BT_AMP:
1567
66.3k
      if (nAtts < attsMax)
1568
65.6k
        atts[nAtts].normalized = 0;
1569
66.3k
      break;
1570
2.53M
    case BT_S:
1571
2.53M
      if (state == inName)
1572
36.6k
        state = other;
1573
2.49M
      else if (state == inValue && nAtts < attsMax && atts[nAtts].normalized
1574
90.8k
               && (ptr == atts[nAtts].valuePtr
1575
11.3k
                   || BYTE_TO_ASCII(enc, ptr) != ASCII_SPACE
1576
6.25k
                   || BYTE_TO_ASCII(enc, ptr + MINBPC(enc)) == ASCII_SPACE
1577
4.85k
                   || BYTE_TYPE(enc, ptr + MINBPC(enc)) == open))
1578
86.9k
        atts[nAtts].normalized = 0;
1579
2.53M
      break;
1580
2.29M
    case BT_CR:
1581
2.84M
    case BT_LF:
1582
      /* This case ensures that the first attribute name is counted
1583
         Apart from that we could just change state on the quote. */
1584
2.84M
      if (state == inName)
1585
29.4k
        state = other;
1586
2.81M
      else if (state == inValue && nAtts < attsMax)
1587
762k
        atts[nAtts].normalized = 0;
1588
2.84M
      break;
1589
160k
    case BT_GT:
1590
236k
    case BT_SOL:
1591
236k
      if (state != inValue)
1592
221k
        return nAtts;
1593
14.9k
      break;
1594
5.87M
    default:
1595
5.87M
      break;
1596
44.9M
    }
1597
44.9M
  }
1598
  /* not reached */
1599
221k
}
xmltok.c:normal_getAtts
Line
Count
Source
1510
221k
                ATTRIBUTE *atts) {
1511
221k
  enum { other, inName, inValue } state = inName;
1512
221k
  int nAtts = 0;
1513
221k
  int open = 0; /* defined when state == inValue;
1514
                   initialization just to shut up compilers */
1515
1516
44.9M
  for (ptr += MINBPC(enc);; ptr += MINBPC(enc)) {
1517
44.9M
    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
137k
      LEAD_CASE(2)
1531
89.5k
      LEAD_CASE(3)
1532
31.0k
      LEAD_CASE(4)
1533
0
#  undef LEAD_CASE
1534
0
    case BT_NONASCII:
1535
24.0M
    case BT_NMSTRT:
1536
25.2M
    case BT_HEX:
1537
25.2M
      START_NAME
1538
25.2M
      break;
1539
0
#  undef START_NAME
1540
462k
    case BT_QUOT:
1541
462k
      if (state != inValue) {
1542
169k
        if (nAtts < attsMax)
1543
112k
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1544
169k
        state = inValue;
1545
169k
        open = BT_QUOT;
1546
292k
      } else if (open == BT_QUOT) {
1547
169k
        state = other;
1548
169k
        if (nAtts < attsMax)
1549
112k
          atts[nAtts].valueEnd = ptr;
1550
169k
        nAtts++;
1551
169k
      }
1552
462k
      break;
1553
7.41M
    case BT_APOS:
1554
7.41M
      if (state != inValue) {
1555
3.69M
        if (nAtts < attsMax)
1556
1.85M
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1557
3.69M
        state = inValue;
1558
3.69M
        open = BT_APOS;
1559
3.71M
      } else if (open == BT_APOS) {
1560
3.69M
        state = other;
1561
3.69M
        if (nAtts < attsMax)
1562
1.85M
          atts[nAtts].valueEnd = ptr;
1563
3.69M
        nAtts++;
1564
3.69M
      }
1565
7.41M
      break;
1566
66.3k
    case BT_AMP:
1567
66.3k
      if (nAtts < attsMax)
1568
65.6k
        atts[nAtts].normalized = 0;
1569
66.3k
      break;
1570
2.53M
    case BT_S:
1571
2.53M
      if (state == inName)
1572
36.6k
        state = other;
1573
2.49M
      else if (state == inValue && nAtts < attsMax && atts[nAtts].normalized
1574
90.8k
               && (ptr == atts[nAtts].valuePtr
1575
11.3k
                   || BYTE_TO_ASCII(enc, ptr) != ASCII_SPACE
1576
6.25k
                   || BYTE_TO_ASCII(enc, ptr + MINBPC(enc)) == ASCII_SPACE
1577
4.85k
                   || BYTE_TYPE(enc, ptr + MINBPC(enc)) == open))
1578
86.9k
        atts[nAtts].normalized = 0;
1579
2.53M
      break;
1580
2.29M
    case BT_CR:
1581
2.84M
    case BT_LF:
1582
      /* This case ensures that the first attribute name is counted
1583
         Apart from that we could just change state on the quote. */
1584
2.84M
      if (state == inName)
1585
29.4k
        state = other;
1586
2.81M
      else if (state == inValue && nAtts < attsMax)
1587
762k
        atts[nAtts].normalized = 0;
1588
2.84M
      break;
1589
160k
    case BT_GT:
1590
236k
    case BT_SOL:
1591
236k
      if (state != inValue)
1592
221k
        return nAtts;
1593
14.9k
      break;
1594
5.87M
    default:
1595
5.87M
      break;
1596
44.9M
    }
1597
44.9M
  }
1598
  /* not reached */
1599
221k
}
Unexecuted instantiation: xmltok.c:little2_getAtts
Unexecuted instantiation: xmltok.c:big2_getAtts
1600
1601
static int PTRFASTCALL
1602
75.5k
PREFIX(charRefNumber)(const ENCODING *enc, const char *ptr) {
1603
75.5k
  int result = 0;
1604
  /* skip &# */
1605
75.5k
  UNUSED_P(enc);
1606
75.5k
  ptr += 2 * MINBPC(enc);
1607
75.5k
  if (CHAR_MATCHES(enc, ptr, ASCII_x)) {
1608
295k
    for (ptr += MINBPC(enc); ! CHAR_MATCHES(enc, ptr, ASCII_SEMI);
1609
232k
         ptr += MINBPC(enc)) {
1610
232k
      int c = BYTE_TO_ASCII(enc, ptr);
1611
232k
      switch (c) {
1612
13.4k
      case ASCII_0:
1613
30.4k
      case ASCII_1:
1614
54.2k
      case ASCII_2:
1615
58.3k
      case ASCII_3:
1616
86.1k
      case ASCII_4:
1617
106k
      case ASCII_5:
1618
108k
      case ASCII_6:
1619
121k
      case ASCII_7:
1620
143k
      case ASCII_8:
1621
148k
      case ASCII_9:
1622
148k
        result <<= 4;
1623
148k
        result |= (c - ASCII_0);
1624
148k
        break;
1625
20.6k
      case ASCII_A:
1626
21.3k
      case ASCII_B:
1627
22.3k
      case ASCII_C:
1628
23.7k
      case ASCII_D:
1629
25.3k
      case ASCII_E:
1630
49.5k
      case ASCII_F:
1631
49.5k
        result <<= 4;
1632
49.5k
        result += 10 + (c - ASCII_A);
1633
49.5k
        break;
1634
469
      case ASCII_a:
1635
9.95k
      case ASCII_b:
1636
10.6k
      case ASCII_c:
1637
29.4k
      case ASCII_d:
1638
30.1k
      case ASCII_e:
1639
34.1k
      case ASCII_f:
1640
34.1k
        result <<= 4;
1641
34.1k
        result += 10 + (c - ASCII_a);
1642
34.1k
        break;
1643
232k
      }
1644
232k
      if (result >= 0x110000)
1645
11
        return -1;
1646
232k
    }
1647
63.4k
  } else {
1648
61.8k
    for (; ! CHAR_MATCHES(enc, ptr, ASCII_SEMI); ptr += MINBPC(enc)) {
1649
49.7k
      int c = BYTE_TO_ASCII(enc, ptr);
1650
49.7k
      result *= 10;
1651
49.7k
      result += (c - ASCII_0);
1652
49.7k
      if (result >= 0x110000)
1653
3
        return -1;
1654
49.7k
    }
1655
12.0k
  }
1656
75.5k
  return checkCharRefNumber(result);
1657
75.5k
}
xmltok.c:normal_charRefNumber
Line
Count
Source
1602
75.5k
PREFIX(charRefNumber)(const ENCODING *enc, const char *ptr) {
1603
75.5k
  int result = 0;
1604
  /* skip &# */
1605
75.5k
  UNUSED_P(enc);
1606
75.5k
  ptr += 2 * MINBPC(enc);
1607
75.5k
  if (CHAR_MATCHES(enc, ptr, ASCII_x)) {
1608
295k
    for (ptr += MINBPC(enc); ! CHAR_MATCHES(enc, ptr, ASCII_SEMI);
1609
232k
         ptr += MINBPC(enc)) {
1610
232k
      int c = BYTE_TO_ASCII(enc, ptr);
1611
232k
      switch (c) {
1612
13.4k
      case ASCII_0:
1613
30.4k
      case ASCII_1:
1614
54.2k
      case ASCII_2:
1615
58.3k
      case ASCII_3:
1616
86.1k
      case ASCII_4:
1617
106k
      case ASCII_5:
1618
108k
      case ASCII_6:
1619
121k
      case ASCII_7:
1620
143k
      case ASCII_8:
1621
148k
      case ASCII_9:
1622
148k
        result <<= 4;
1623
148k
        result |= (c - ASCII_0);
1624
148k
        break;
1625
20.6k
      case ASCII_A:
1626
21.3k
      case ASCII_B:
1627
22.3k
      case ASCII_C:
1628
23.7k
      case ASCII_D:
1629
25.3k
      case ASCII_E:
1630
49.5k
      case ASCII_F:
1631
49.5k
        result <<= 4;
1632
49.5k
        result += 10 + (c - ASCII_A);
1633
49.5k
        break;
1634
469
      case ASCII_a:
1635
9.95k
      case ASCII_b:
1636
10.6k
      case ASCII_c:
1637
29.4k
      case ASCII_d:
1638
30.1k
      case ASCII_e:
1639
34.1k
      case ASCII_f:
1640
34.1k
        result <<= 4;
1641
34.1k
        result += 10 + (c - ASCII_a);
1642
34.1k
        break;
1643
232k
      }
1644
232k
      if (result >= 0x110000)
1645
11
        return -1;
1646
232k
    }
1647
63.4k
  } else {
1648
61.8k
    for (; ! CHAR_MATCHES(enc, ptr, ASCII_SEMI); ptr += MINBPC(enc)) {
1649
49.7k
      int c = BYTE_TO_ASCII(enc, ptr);
1650
49.7k
      result *= 10;
1651
49.7k
      result += (c - ASCII_0);
1652
49.7k
      if (result >= 0x110000)
1653
3
        return -1;
1654
49.7k
    }
1655
12.0k
  }
1656
75.5k
  return checkCharRefNumber(result);
1657
75.5k
}
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
129k
                             const char *end) {
1662
129k
  UNUSED_P(enc);
1663
129k
  switch ((end - ptr) / MINBPC(enc)) {
1664
10.2k
  case 2:
1665
10.2k
    if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_t)) {
1666
1.85k
      switch (BYTE_TO_ASCII(enc, ptr)) {
1667
606
      case ASCII_l:
1668
606
        return ASCII_LT;
1669
116
      case ASCII_g:
1670
116
        return ASCII_GT;
1671
1.85k
      }
1672
1.85k
    }
1673
9.49k
    break;
1674
33.3k
  case 3:
1675
33.3k
    if (CHAR_MATCHES(enc, ptr, ASCII_a)) {
1676
28.6k
      ptr += MINBPC(enc);
1677
28.6k
      if (CHAR_MATCHES(enc, ptr, ASCII_m)) {
1678
27.6k
        ptr += MINBPC(enc);
1679
27.6k
        if (CHAR_MATCHES(enc, ptr, ASCII_p))
1680
27.4k
          return ASCII_AMP;
1681
27.6k
      }
1682
28.6k
    }
1683
5.85k
    break;
1684
16.3k
  case 4:
1685
16.3k
    switch (BYTE_TO_ASCII(enc, ptr)) {
1686
7.83k
    case ASCII_q:
1687
7.83k
      ptr += MINBPC(enc);
1688
7.83k
      if (CHAR_MATCHES(enc, ptr, ASCII_u)) {
1689
5.13k
        ptr += MINBPC(enc);
1690
5.13k
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1691
4.93k
          ptr += MINBPC(enc);
1692
4.93k
          if (CHAR_MATCHES(enc, ptr, ASCII_t))
1693
4.17k
            return ASCII_QUOT;
1694
4.93k
        }
1695
5.13k
      }
1696
3.65k
      break;
1697
7.99k
    case ASCII_a:
1698
7.99k
      ptr += MINBPC(enc);
1699
7.99k
      if (CHAR_MATCHES(enc, ptr, ASCII_p)) {
1700
6.10k
        ptr += MINBPC(enc);
1701
6.10k
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1702
5.64k
          ptr += MINBPC(enc);
1703
5.64k
          if (CHAR_MATCHES(enc, ptr, ASCII_s))
1704
1.56k
            return ASCII_APOS;
1705
5.64k
        }
1706
6.10k
      }
1707
6.42k
      break;
1708
16.3k
    }
1709
129k
  }
1710
95.4k
  return 0;
1711
129k
}
xmltok.c:normal_predefinedEntityName
Line
Count
Source
1661
129k
                             const char *end) {
1662
129k
  UNUSED_P(enc);
1663
129k
  switch ((end - ptr) / MINBPC(enc)) {
1664
10.2k
  case 2:
1665
10.2k
    if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_t)) {
1666
1.85k
      switch (BYTE_TO_ASCII(enc, ptr)) {
1667
606
      case ASCII_l:
1668
606
        return ASCII_LT;
1669
116
      case ASCII_g:
1670
116
        return ASCII_GT;
1671
1.85k
      }
1672
1.85k
    }
1673
9.49k
    break;
1674
33.3k
  case 3:
1675
33.3k
    if (CHAR_MATCHES(enc, ptr, ASCII_a)) {
1676
28.6k
      ptr += MINBPC(enc);
1677
28.6k
      if (CHAR_MATCHES(enc, ptr, ASCII_m)) {
1678
27.6k
        ptr += MINBPC(enc);
1679
27.6k
        if (CHAR_MATCHES(enc, ptr, ASCII_p))
1680
27.4k
          return ASCII_AMP;
1681
27.6k
      }
1682
28.6k
    }
1683
5.85k
    break;
1684
16.3k
  case 4:
1685
16.3k
    switch (BYTE_TO_ASCII(enc, ptr)) {
1686
7.83k
    case ASCII_q:
1687
7.83k
      ptr += MINBPC(enc);
1688
7.83k
      if (CHAR_MATCHES(enc, ptr, ASCII_u)) {
1689
5.13k
        ptr += MINBPC(enc);
1690
5.13k
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1691
4.93k
          ptr += MINBPC(enc);
1692
4.93k
          if (CHAR_MATCHES(enc, ptr, ASCII_t))
1693
4.17k
            return ASCII_QUOT;
1694
4.93k
        }
1695
5.13k
      }
1696
3.65k
      break;
1697
7.99k
    case ASCII_a:
1698
7.99k
      ptr += MINBPC(enc);
1699
7.99k
      if (CHAR_MATCHES(enc, ptr, ASCII_p)) {
1700
6.10k
        ptr += MINBPC(enc);
1701
6.10k
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1702
5.64k
          ptr += MINBPC(enc);
1703
5.64k
          if (CHAR_MATCHES(enc, ptr, ASCII_s))
1704
1.56k
            return ASCII_APOS;
1705
5.64k
        }
1706
6.10k
      }
1707
6.42k
      break;
1708
16.3k
    }
1709
129k
  }
1710
95.4k
  return 0;
1711
129k
}
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
512k
                         const char *end1, const char *ptr2) {
1716
512k
  UNUSED_P(enc);
1717
3.16M
  for (; *ptr2; ptr1 += MINBPC(enc), ptr2++) {
1718
2.77M
    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
55
      return 0; /* LCOV_EXCL_LINE */
1725
55
    }
1726
2.77M
    if (! CHAR_MATCHES(enc, ptr1, *ptr2))
1727
120k
      return 0;
1728
2.77M
  }
1729
392k
  return ptr1 == end1;
1730
512k
}
xmltok.c:normal_nameMatchesAscii
Line
Count
Source
1715
512k
                         const char *end1, const char *ptr2) {
1716
512k
  UNUSED_P(enc);
1717
3.16M
  for (; *ptr2; ptr1 += MINBPC(enc), ptr2++) {
1718
2.77M
    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
55
      return 0; /* LCOV_EXCL_LINE */
1725
55
    }
1726
2.77M
    if (! CHAR_MATCHES(enc, ptr1, *ptr2))
1727
120k
      return 0;
1728
2.77M
  }
1729
392k
  return ptr1 == end1;
1730
512k
}
Unexecuted instantiation: xmltok.c:little2_nameMatchesAscii
Unexecuted instantiation: xmltok.c:big2_nameMatchesAscii
1731
1732
static int PTRFASTCALL
1733
330k
PREFIX(nameLength)(const ENCODING *enc, const char *ptr) {
1734
330k
  const char *start = ptr;
1735
9.75M
  for (;;) {
1736
9.75M
    switch (BYTE_TYPE(enc, ptr)) {
1737
0
#  define LEAD_CASE(n)                                                         \
1738
74.0k
  case BT_LEAD##n:                                                             \
1739
74.0k
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1740
74.0k
    break;
1741
33.5k
      LEAD_CASE(2)
1742
40.5k
      LEAD_CASE(3)
1743
0
      LEAD_CASE(4)
1744
0
#  undef LEAD_CASE
1745
0
    case BT_NONASCII:
1746
8.57M
    case BT_NMSTRT:
1747
#  ifdef XML_NS
1748
    case BT_COLON:
1749
#  endif
1750
9.24M
    case BT_HEX:
1751
9.29M
    case BT_DIGIT:
1752
9.32M
    case BT_NAME:
1753
9.34M
    case BT_MINUS:
1754
9.34M
      ptr += MINBPC(enc);
1755
9.34M
      break;
1756
330k
    default:
1757
330k
      return (int)(ptr - start);
1758
9.75M
    }
1759
9.75M
  }
1760
330k
}
xmltok.c:normal_nameLength
Line
Count
Source
1733
330k
PREFIX(nameLength)(const ENCODING *enc, const char *ptr) {
1734
330k
  const char *start = ptr;
1735
9.75M
  for (;;) {
1736
9.75M
    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
33.5k
      LEAD_CASE(2)
1742
40.5k
      LEAD_CASE(3)
1743
0
      LEAD_CASE(4)
1744
0
#  undef LEAD_CASE
1745
0
    case BT_NONASCII:
1746
8.57M
    case BT_NMSTRT:
1747
#  ifdef XML_NS
1748
    case BT_COLON:
1749
#  endif
1750
9.24M
    case BT_HEX:
1751
9.29M
    case BT_DIGIT:
1752
9.32M
    case BT_NAME:
1753
9.34M
    case BT_MINUS:
1754
9.34M
      ptr += MINBPC(enc);
1755
9.34M
      break;
1756
330k
    default:
1757
330k
      return (int)(ptr - start);
1758
9.75M
    }
1759
9.75M
  }
1760
330k
}
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.8k
                       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.78M
  case BT_LEAD##n:                                                             \
1784
1.78M
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1785
1.78M
    pos->columnNumber++;                                                       \
1786
1.78M
    break;
1787
751k
      LEAD_CASE(2)
1788
728k
      LEAD_CASE(3)
1789
308k
      LEAD_CASE(4)
1790
0
#  undef LEAD_CASE
1791
3.67M
    case BT_LF:
1792
3.67M
      pos->columnNumber = 0;
1793
3.67M
      pos->lineNumber++;
1794
3.67M
      ptr += MINBPC(enc);
1795
3.67M
      break;
1796
5.21M
    case BT_CR:
1797
5.21M
      pos->lineNumber++;
1798
5.21M
      ptr += MINBPC(enc);
1799
5.21M
      if (HAS_CHAR(enc, ptr, end) && BYTE_TYPE(enc, ptr) == BT_LF)
1800
910k
        ptr += MINBPC(enc);
1801
5.21M
      pos->columnNumber = 0;
1802
5.21M
      break;
1803
117M
    default:
1804
117M
      ptr += MINBPC(enc);
1805
117M
      pos->columnNumber++;
1806
117M
      break;
1807
127M
    }
1808
127M
  }
1809
17.8k
}
xmltok.c:normal_updatePosition
Line
Count
Source
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
0
  case BT_LEAD##n:                                                             \
1784
0
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1785
0
    pos->columnNumber++;                                                       \
1786
0
    break;
1787
751k
      LEAD_CASE(2)
1788
728k
      LEAD_CASE(3)
1789
308k
      LEAD_CASE(4)
1790
0
#  undef LEAD_CASE
1791
3.67M
    case BT_LF:
1792
3.67M
      pos->columnNumber = 0;
1793
3.67M
      pos->lineNumber++;
1794
3.67M
      ptr += MINBPC(enc);
1795
3.67M
      break;
1796
5.21M
    case BT_CR:
1797
5.21M
      pos->lineNumber++;
1798
5.21M
      ptr += MINBPC(enc);
1799
5.21M
      if (HAS_CHAR(enc, ptr, end) && BYTE_TYPE(enc, ptr) == BT_LF)
1800
910k
        ptr += MINBPC(enc);
1801
5.21M
      pos->columnNumber = 0;
1802
5.21M
      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:little2_updatePosition
Line
Count
Source
1779
235
                       POSITION *pos) {
1780
605
  while (HAS_CHAR(enc, ptr, end)) {
1781
605
    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
605
    default:
1804
605
      ptr += MINBPC(enc);
1805
605
      pos->columnNumber++;
1806
605
      break;
1807
605
    }
1808
605
  }
1809
235
}
xmltok.c:big2_updatePosition
Line
Count
Source
1779
209
                       POSITION *pos) {
1780
1.39k
  while (HAS_CHAR(enc, ptr, end)) {
1781
1.39k
    switch (BYTE_TYPE(enc, ptr)) {
1782
0
#  define LEAD_CASE(n)                                                         \
1783
0
  case BT_LEAD##n:                                                             \
1784
0
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1785
0
    pos->columnNumber++;                                                       \
1786
0
    break;
1787
0
      LEAD_CASE(2)
1788
0
      LEAD_CASE(3)
1789
0
      LEAD_CASE(4)
1790
0
#  undef LEAD_CASE
1791
0
    case BT_LF:
1792
0
      pos->columnNumber = 0;
1793
0
      pos->lineNumber++;
1794
0
      ptr += MINBPC(enc);
1795
0
      break;
1796
0
    case BT_CR:
1797
0
      pos->lineNumber++;
1798
0
      ptr += MINBPC(enc);
1799
0
      if (HAS_CHAR(enc, ptr, end) && BYTE_TYPE(enc, ptr) == BT_LF)
1800
0
        ptr += MINBPC(enc);
1801
0
      pos->columnNumber = 0;
1802
0
      break;
1803
1.39k
    default:
1804
1.39k
      ptr += MINBPC(enc);
1805
1.39k
      pos->columnNumber++;
1806
1.39k
      break;
1807
1.39k
    }
1808
1.39k
  }
1809
209
}
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 */