Coverage Report

Created: 2026-03-12 06:35

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
112
#    define IS_INVALID_CHAR(enc, ptr, n) (0)
46
#  endif
47
48
#  define INVALID_LEAD_CASE(n, ptr, nextTokPtr)                                \
49
745k
  case BT_LEAD##n:                                                             \
50
745k
    if (end - ptr < n)                                                         \
51
744k
      return XML_TOK_PARTIAL_CHAR;                                             \
52
745k
    if (IS_INVALID_CHAR(enc, ptr, n)) {                                        \
53
107
      *(nextTokPtr) = (ptr);                                                   \
54
107
      return XML_TOK_INVALID;                                                  \
55
107
    }                                                                          \
56
745k
    ptr += n;                                                                  \
57
744k
    break;
58
59
#  define INVALID_CASES(ptr, nextTokPtr)                                       \
60
312k
    INVALID_LEAD_CASE(2, ptr, nextTokPtr)                                      \
61
312k
    INVALID_LEAD_CASE(3, ptr, nextTokPtr)                                      \
62
266k
    INVALID_LEAD_CASE(4, ptr, nextTokPtr)                                      \
63
166k
  case BT_NONXML:                                                              \
64
73
  case BT_MALFORM:                                                             \
65
139
  case BT_TRAIL:                                                               \
66
139
    *(nextTokPtr) = (ptr);                                                     \
67
139
    return XML_TOK_INVALID;
68
69
#  define CHECK_NAME_CASE(n, enc, ptr, end, nextTokPtr)                        \
70
158k
  case BT_LEAD##n:                                                             \
71
158k
    if (end - ptr < n)                                                         \
72
157k
      return XML_TOK_PARTIAL_CHAR;                                             \
73
158k
    if (IS_INVALID_CHAR(enc, ptr, n) || ! IS_NAME_CHAR(enc, ptr, n)) {         \
74
306
      *nextTokPtr = ptr;                                                       \
75
306
      return XML_TOK_INVALID;                                                  \
76
306
    }                                                                          \
77
158k
    ptr += n;                                                                  \
78
157k
    break;
79
80
#  define CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)                          \
81
25.2M
  case BT_NONASCII:                                                            \
82
25.2M
    if (! IS_NAME_CHAR_MINBPC(enc, ptr)) {                                     \
83
47
      *nextTokPtr = ptr;                                                       \
84
47
      return XML_TOK_INVALID;                                                  \
85
47
    }                                                                          \
86
25.2M
    /* fall through */                                                         \
87
25.2M
  case BT_NMSTRT:                                                              \
88
19.5M
  case BT_HEX:                                                                 \
89
25.1M
  case BT_DIGIT:                                                               \
90
25.1M
  case BT_NAME:                                                                \
91
25.2M
  case BT_MINUS:                                                               \
92
25.2M
    ptr += MINBPC(enc);                                                        \
93
25.2M
    break;                                                                     \
94
25.2M
    CHECK_NAME_CASE(2, enc, ptr, end, nextTokPtr)                              \
95
93.0k
    CHECK_NAME_CASE(3, enc, ptr, end, nextTokPtr)                              \
96
92.8k
    CHECK_NAME_CASE(4, enc, ptr, end, nextTokPtr)
97
98
#  define CHECK_NMSTRT_CASE(n, enc, ptr, end, nextTokPtr)                      \
99
127k
  case BT_LEAD##n:                                                             \
100
127k
    if ((end) - (ptr) < (n))                                                   \
101
126k
      return XML_TOK_PARTIAL_CHAR;                                             \
102
126k
    if (IS_INVALID_CHAR(enc, ptr, n) || ! IS_NMSTRT_CHAR(enc, ptr, n)) {       \
103
174
      *nextTokPtr = ptr;                                                       \
104
174
      return XML_TOK_INVALID;                                                  \
105
174
    }                                                                          \
106
126k
    ptr += n;                                                                  \
107
126k
    break;
108
109
#  define CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)                        \
110
3.77M
  case BT_NONASCII:                                                            \
111
3.77M
    if (! IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {                                   \
112
0
      *nextTokPtr = ptr;                                                       \
113
0
      return XML_TOK_INVALID;                                                  \
114
0
    }                                                                          \
115
3.77M
    /* fall through */                                                         \
116
3.77M
  case BT_NMSTRT:                                                              \
117
3.77M
  case BT_HEX:                                                                 \
118
3.77M
    ptr += MINBPC(enc);                                                        \
119
3.77M
    break;                                                                     \
120
3.77M
    CHECK_NMSTRT_CASE(2, enc, ptr, end, nextTokPtr)                            \
121
78.2k
    CHECK_NMSTRT_CASE(3, enc, ptr, end, nextTokPtr)                            \
122
48.5k
    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
307M
    ((end) - (ptr) >= ((count) * MINBPC(enc)))
130
131
11.4M
#  define HAS_CHAR(enc, ptr, end) HAS_CHARS(enc, ptr, end, 1)
132
133
#  define REQUIRE_CHARS(enc, ptr, end, count)                                  \
134
32.2M
    {                                                                          \
135
32.2M
      if (! HAS_CHARS(enc, ptr, end, count)) {                                 \
136
719
        return XML_TOK_PARTIAL;                                                \
137
719
      }                                                                        \
138
32.2M
    }
139
140
32.2M
#  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
25.3k
                    const char **nextTokPtr) {
147
25.3k
  if (HAS_CHAR(enc, ptr, end)) {
148
25.3k
    if (! CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
149
11
      *nextTokPtr = ptr;
150
11
      return XML_TOK_INVALID;
151
11
    }
152
25.3k
    ptr += MINBPC(enc);
153
6.17M
    while (HAS_CHAR(enc, ptr, end)) {
154
6.17M
      switch (BYTE_TYPE(enc, ptr)) {
155
304k
        INVALID_CASES(ptr, nextTokPtr)
156
42.6k
      case BT_MINUS:
157
42.6k
        ptr += MINBPC(enc);
158
42.6k
        REQUIRE_CHAR(enc, ptr, end);
159
42.6k
        if (CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
160
25.2k
          ptr += MINBPC(enc);
161
25.2k
          REQUIRE_CHAR(enc, ptr, end);
162
25.2k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
163
9
            *nextTokPtr = ptr;
164
9
            return XML_TOK_INVALID;
165
9
          }
166
25.2k
          *nextTokPtr = ptr + MINBPC(enc);
167
25.2k
          return XML_TOK_COMMENT;
168
25.2k
        }
169
17.3k
        break;
170
5.98M
      default:
171
5.98M
        ptr += MINBPC(enc);
172
5.98M
        break;
173
6.17M
      }
174
6.17M
    }
175
25.3k
  }
176
80
  return XML_TOK_PARTIAL;
177
25.3k
}
xmltok.c:normal_scanComment
Line
Count
Source
146
25.3k
                    const char **nextTokPtr) {
147
25.3k
  if (HAS_CHAR(enc, ptr, end)) {
148
25.3k
    if (! CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
149
11
      *nextTokPtr = ptr;
150
11
      return XML_TOK_INVALID;
151
11
    }
152
25.3k
    ptr += MINBPC(enc);
153
6.17M
    while (HAS_CHAR(enc, ptr, end)) {
154
6.17M
      switch (BYTE_TYPE(enc, ptr)) {
155
304k
        INVALID_CASES(ptr, nextTokPtr)
156
42.6k
      case BT_MINUS:
157
42.6k
        ptr += MINBPC(enc);
158
42.6k
        REQUIRE_CHAR(enc, ptr, end);
159
42.6k
        if (CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
160
25.2k
          ptr += MINBPC(enc);
161
25.2k
          REQUIRE_CHAR(enc, ptr, end);
162
25.2k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
163
9
            *nextTokPtr = ptr;
164
9
            return XML_TOK_INVALID;
165
9
          }
166
25.2k
          *nextTokPtr = ptr + MINBPC(enc);
167
25.2k
          return XML_TOK_COMMENT;
168
25.2k
        }
169
17.3k
        break;
170
5.98M
      default:
171
5.98M
        ptr += MINBPC(enc);
172
5.98M
        break;
173
6.17M
      }
174
6.17M
    }
175
25.3k
  }
176
80
  return XML_TOK_PARTIAL;
177
25.3k
}
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
42.3k
                 const char **nextTokPtr) {
184
42.3k
  REQUIRE_CHAR(enc, ptr, end);
185
42.3k
  switch (BYTE_TYPE(enc, ptr)) {
186
2.11k
  case BT_MINUS:
187
2.11k
    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
2.14k
  case BT_NMSTRT:
192
40.2k
  case BT_HEX:
193
40.2k
    ptr += MINBPC(enc);
194
40.2k
    break;
195
1
  default:
196
1
    *nextTokPtr = ptr;
197
1
    return XML_TOK_INVALID;
198
42.3k
  }
199
274k
  while (HAS_CHAR(enc, ptr, end)) {
200
274k
    switch (BYTE_TYPE(enc, ptr)) {
201
20
    case BT_PERCNT:
202
20
      REQUIRE_CHARS(enc, ptr, end, 2);
203
      /* don't allow <!ENTITY% foo "whatever"> */
204
18
      switch (BYTE_TYPE(enc, ptr + MINBPC(enc))) {
205
1
      case BT_S:
206
2
      case BT_CR:
207
3
      case BT_LF:
208
6
      case BT_PERCNT:
209
6
        *nextTokPtr = ptr;
210
6
        return XML_TOK_INVALID;
211
18
      }
212
      /* fall through */
213
16.0k
    case BT_S:
214
35.9k
    case BT_CR:
215
40.1k
    case BT_LF:
216
40.1k
      *nextTokPtr = ptr;
217
40.1k
      return XML_TOK_DECL_OPEN;
218
217k
    case BT_NMSTRT:
219
234k
    case BT_HEX:
220
234k
      ptr += MINBPC(enc);
221
234k
      break;
222
8
    default:
223
8
      *nextTokPtr = ptr;
224
8
      return XML_TOK_INVALID;
225
274k
    }
226
274k
  }
227
86
  return XML_TOK_PARTIAL;
228
40.2k
}
xmltok.c:normal_scanDecl
Line
Count
Source
183
42.3k
                 const char **nextTokPtr) {
184
42.3k
  REQUIRE_CHAR(enc, ptr, end);
185
42.3k
  switch (BYTE_TYPE(enc, ptr)) {
186
2.11k
  case BT_MINUS:
187
2.11k
    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
2.14k
  case BT_NMSTRT:
192
40.2k
  case BT_HEX:
193
40.2k
    ptr += MINBPC(enc);
194
40.2k
    break;
195
1
  default:
196
1
    *nextTokPtr = ptr;
197
1
    return XML_TOK_INVALID;
198
42.3k
  }
199
274k
  while (HAS_CHAR(enc, ptr, end)) {
200
274k
    switch (BYTE_TYPE(enc, ptr)) {
201
20
    case BT_PERCNT:
202
20
      REQUIRE_CHARS(enc, ptr, end, 2);
203
      /* don't allow <!ENTITY% foo "whatever"> */
204
18
      switch (BYTE_TYPE(enc, ptr + MINBPC(enc))) {
205
1
      case BT_S:
206
2
      case BT_CR:
207
3
      case BT_LF:
208
6
      case BT_PERCNT:
209
6
        *nextTokPtr = ptr;
210
6
        return XML_TOK_INVALID;
211
18
      }
212
      /* fall through */
213
16.0k
    case BT_S:
214
35.9k
    case BT_CR:
215
40.1k
    case BT_LF:
216
40.1k
      *nextTokPtr = ptr;
217
40.1k
      return XML_TOK_DECL_OPEN;
218
217k
    case BT_NMSTRT:
219
234k
    case BT_HEX:
220
234k
      ptr += MINBPC(enc);
221
234k
      break;
222
8
    default:
223
8
      *nextTokPtr = ptr;
224
8
      return XML_TOK_INVALID;
225
274k
    }
226
274k
  }
227
86
  return XML_TOK_PARTIAL;
228
40.2k
}
Unexecuted instantiation: xmltok.c:little2_scanDecl
Unexecuted instantiation: xmltok.c:big2_scanDecl
229
230
static int PTRCALL
231
PREFIX(checkPiTarget)(const ENCODING *enc, const char *ptr, const char *end,
232
42.6k
                      int *tokPtr) {
233
42.6k
  int upper = 0;
234
42.6k
  UNUSED_P(enc);
235
42.6k
  *tokPtr = XML_TOK_PI;
236
42.6k
  if (end - ptr != MINBPC(enc) * 3)
237
33.3k
    return 1;
238
9.26k
  switch (BYTE_TO_ASCII(enc, ptr)) {
239
4.50k
  case ASCII_x:
240
4.50k
    break;
241
1.91k
  case ASCII_X:
242
1.91k
    upper = 1;
243
1.91k
    break;
244
2.84k
  default:
245
2.84k
    return 1;
246
9.26k
  }
247
6.42k
  ptr += MINBPC(enc);
248
6.42k
  switch (BYTE_TO_ASCII(enc, ptr)) {
249
1.53k
  case ASCII_m:
250
1.53k
    break;
251
763
  case ASCII_M:
252
763
    upper = 1;
253
763
    break;
254
4.12k
  default:
255
4.12k
    return 1;
256
6.42k
  }
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.16k
  default:
265
1.16k
    return 1;
266
2.30k
  }
267
1.14k
  if (upper)
268
4
    return 0;
269
1.13k
  *tokPtr = XML_TOK_XML_DECL;
270
1.13k
  return 1;
271
1.14k
}
xmltok.c:normal_checkPiTarget
Line
Count
Source
232
42.6k
                      int *tokPtr) {
233
42.6k
  int upper = 0;
234
42.6k
  UNUSED_P(enc);
235
42.6k
  *tokPtr = XML_TOK_PI;
236
42.6k
  if (end - ptr != MINBPC(enc) * 3)
237
33.3k
    return 1;
238
9.26k
  switch (BYTE_TO_ASCII(enc, ptr)) {
239
4.50k
  case ASCII_x:
240
4.50k
    break;
241
1.91k
  case ASCII_X:
242
1.91k
    upper = 1;
243
1.91k
    break;
244
2.84k
  default:
245
2.84k
    return 1;
246
9.26k
  }
247
6.42k
  ptr += MINBPC(enc);
248
6.42k
  switch (BYTE_TO_ASCII(enc, ptr)) {
249
1.53k
  case ASCII_m:
250
1.53k
    break;
251
763
  case ASCII_M:
252
763
    upper = 1;
253
763
    break;
254
4.12k
  default:
255
4.12k
    return 1;
256
6.42k
  }
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.16k
  default:
265
1.16k
    return 1;
266
2.30k
  }
267
1.14k
  if (upper)
268
4
    return 0;
269
1.13k
  *tokPtr = XML_TOK_XML_DECL;
270
1.13k
  return 1;
271
1.14k
}
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
42.8k
               const char **nextTokPtr) {
278
42.8k
  int tok;
279
42.8k
  const char *target = ptr;
280
42.8k
  REQUIRE_CHAR(enc, ptr, end);
281
42.8k
  switch (BYTE_TYPE(enc, ptr)) {
282
60.5k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
283
3
  default:
284
3
    *nextTokPtr = ptr;
285
3
    return XML_TOK_INVALID;
286
42.8k
  }
287
822k
  while (HAS_CHAR(enc, ptr, end)) {
288
822k
    switch (BYTE_TYPE(enc, ptr)) {
289
2.73M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
290
7.47k
    case BT_S:
291
9.68k
    case BT_CR:
292
14.8k
    case BT_LF:
293
14.8k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
294
2
        *nextTokPtr = ptr;
295
2
        return XML_TOK_INVALID;
296
2
      }
297
14.8k
      ptr += MINBPC(enc);
298
13.6M
      while (HAS_CHAR(enc, ptr, end)) {
299
13.6M
        switch (BYTE_TYPE(enc, ptr)) {
300
431k
          INVALID_CASES(ptr, nextTokPtr)
301
65.0k
        case BT_QUEST:
302
65.0k
          ptr += MINBPC(enc);
303
65.0k
          REQUIRE_CHAR(enc, ptr, end);
304
65.0k
          if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
305
14.6k
            *nextTokPtr = ptr + MINBPC(enc);
306
14.6k
            return tok;
307
14.6k
          }
308
50.4k
          break;
309
13.4M
        default:
310
13.4M
          ptr += MINBPC(enc);
311
13.4M
          break;
312
13.6M
        }
313
13.6M
      }
314
138
      return XML_TOK_PARTIAL;
315
27.7k
    case BT_QUEST:
316
27.7k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
317
2
        *nextTokPtr = ptr;
318
2
        return XML_TOK_INVALID;
319
2
      }
320
27.7k
      ptr += MINBPC(enc);
321
27.7k
      REQUIRE_CHAR(enc, ptr, end);
322
27.7k
      if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
323
27.7k
        *nextTokPtr = ptr + MINBPC(enc);
324
27.7k
        return tok;
325
27.7k
      }
326
      /* fall through */
327
33
    default:
328
33
      *nextTokPtr = ptr;
329
33
      return XML_TOK_INVALID;
330
822k
    }
331
822k
  }
332
80
  return XML_TOK_PARTIAL;
333
42.7k
}
xmltok.c:normal_scanPi
Line
Count
Source
277
42.8k
               const char **nextTokPtr) {
278
42.8k
  int tok;
279
42.8k
  const char *target = ptr;
280
42.8k
  REQUIRE_CHAR(enc, ptr, end);
281
42.8k
  switch (BYTE_TYPE(enc, ptr)) {
282
60.5k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
283
3
  default:
284
3
    *nextTokPtr = ptr;
285
3
    return XML_TOK_INVALID;
286
42.8k
  }
287
822k
  while (HAS_CHAR(enc, ptr, end)) {
288
822k
    switch (BYTE_TYPE(enc, ptr)) {
289
2.73M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
290
7.47k
    case BT_S:
291
9.68k
    case BT_CR:
292
14.8k
    case BT_LF:
293
14.8k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
294
2
        *nextTokPtr = ptr;
295
2
        return XML_TOK_INVALID;
296
2
      }
297
14.8k
      ptr += MINBPC(enc);
298
13.6M
      while (HAS_CHAR(enc, ptr, end)) {
299
13.6M
        switch (BYTE_TYPE(enc, ptr)) {
300
431k
          INVALID_CASES(ptr, nextTokPtr)
301
65.0k
        case BT_QUEST:
302
65.0k
          ptr += MINBPC(enc);
303
65.0k
          REQUIRE_CHAR(enc, ptr, end);
304
65.0k
          if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
305
14.6k
            *nextTokPtr = ptr + MINBPC(enc);
306
14.6k
            return tok;
307
14.6k
          }
308
50.4k
          break;
309
13.4M
        default:
310
13.4M
          ptr += MINBPC(enc);
311
13.4M
          break;
312
13.6M
        }
313
13.6M
      }
314
138
      return XML_TOK_PARTIAL;
315
27.7k
    case BT_QUEST:
316
27.7k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
317
2
        *nextTokPtr = ptr;
318
2
        return XML_TOK_INVALID;
319
2
      }
320
27.7k
      ptr += MINBPC(enc);
321
27.7k
      REQUIRE_CHAR(enc, ptr, end);
322
27.7k
      if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
323
27.7k
        *nextTokPtr = ptr + MINBPC(enc);
324
27.7k
        return tok;
325
27.7k
      }
326
      /* fall through */
327
33
    default:
328
33
      *nextTokPtr = ptr;
329
33
      return XML_TOK_INVALID;
330
822k
    }
331
822k
  }
332
80
  return XML_TOK_PARTIAL;
333
42.7k
}
Unexecuted instantiation: xmltok.c:little2_scanPi
Unexecuted instantiation: xmltok.c:big2_scanPi
334
335
static int PTRCALL
336
PREFIX(scanCdataSection)(const ENCODING *enc, const char *ptr, const char *end,
337
2.62k
                         const char **nextTokPtr) {
338
2.62k
  static const char CDATA_LSQB[]
339
2.62k
      = {ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, ASCII_LSQB};
340
2.62k
  int i;
341
2.62k
  UNUSED_P(enc);
342
  /* CDATA[ */
343
2.62k
  REQUIRE_CHARS(enc, ptr, end, 6);
344
17.9k
  for (i = 0; i < 6; i++, ptr += MINBPC(enc)) {
345
15.4k
    if (! CHAR_MATCHES(enc, ptr, CDATA_LSQB[i])) {
346
64
      *nextTokPtr = ptr;
347
64
      return XML_TOK_INVALID;
348
64
    }
349
15.4k
  }
350
2.53k
  *nextTokPtr = ptr;
351
2.53k
  return XML_TOK_CDATA_SECT_OPEN;
352
2.60k
}
xmltok.c:normal_scanCdataSection
Line
Count
Source
337
2.62k
                         const char **nextTokPtr) {
338
2.62k
  static const char CDATA_LSQB[]
339
2.62k
      = {ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, ASCII_LSQB};
340
2.62k
  int i;
341
2.62k
  UNUSED_P(enc);
342
  /* CDATA[ */
343
2.62k
  REQUIRE_CHARS(enc, ptr, end, 6);
344
17.9k
  for (i = 0; i < 6; i++, ptr += MINBPC(enc)) {
345
15.4k
    if (! CHAR_MATCHES(enc, ptr, CDATA_LSQB[i])) {
346
64
      *nextTokPtr = ptr;
347
64
      return XML_TOK_INVALID;
348
64
    }
349
15.4k
  }
350
2.53k
  *nextTokPtr = ptr;
351
2.53k
  return XML_TOK_CDATA_SECT_OPEN;
352
2.60k
}
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
5.62M
                        const char **nextTokPtr) {
357
5.62M
  if (ptr >= end)
358
202
    return XML_TOK_NONE;
359
5.62M
  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
5.62M
  switch (BYTE_TYPE(enc, ptr)) {
369
975k
  case BT_RSQB:
370
975k
    ptr += MINBPC(enc);
371
975k
    REQUIRE_CHAR(enc, ptr, end);
372
975k
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
373
503k
      break;
374
472k
    ptr += MINBPC(enc);
375
472k
    REQUIRE_CHAR(enc, ptr, end);
376
472k
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
377
469k
      ptr -= MINBPC(enc);
378
469k
      break;
379
469k
    }
380
2.36k
    *nextTokPtr = ptr + MINBPC(enc);
381
2.36k
    return XML_TOK_CDATA_SECT_CLOSE;
382
1.96M
  case BT_CR:
383
1.96M
    ptr += MINBPC(enc);
384
1.96M
    REQUIRE_CHAR(enc, ptr, end);
385
1.96M
    if (BYTE_TYPE(enc, ptr) == BT_LF)
386
404k
      ptr += MINBPC(enc);
387
1.96M
    *nextTokPtr = ptr;
388
1.96M
    return XML_TOK_DATA_NEWLINE;
389
1.59M
  case BT_LF:
390
1.59M
    *nextTokPtr = ptr + MINBPC(enc);
391
1.59M
    return XML_TOK_DATA_NEWLINE;
392
1.59M
    INVALID_CASES(ptr, nextTokPtr)
393
910k
  default:
394
910k
    ptr += MINBPC(enc);
395
910k
    break;
396
5.62M
  }
397
30.6M
  while (HAS_CHAR(enc, ptr, end)) {
398
30.6M
    switch (BYTE_TYPE(enc, ptr)) {
399
0
#  define LEAD_CASE(n)                                                         \
400
438k
  case BT_LEAD##n:                                                             \
401
438k
    if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) {                       \
402
24
      *nextTokPtr = ptr;                                                       \
403
24
      return XML_TOK_DATA_CHARS;                                               \
404
24
    }                                                                          \
405
438k
    ptr += n;                                                                  \
406
438k
    break;
407
179k
      LEAD_CASE(2)
408
172k
      LEAD_CASE(3)
409
86.7k
      LEAD_CASE(4)
410
0
#  undef LEAD_CASE
411
11
    case BT_NONXML:
412
14
    case BT_MALFORM:
413
20
    case BT_TRAIL:
414
807k
    case BT_CR:
415
1.28M
    case BT_LF:
416
2.06M
    case BT_RSQB:
417
2.06M
      *nextTokPtr = ptr;
418
2.06M
      return XML_TOK_DATA_CHARS;
419
28.1M
    default:
420
28.1M
      ptr += MINBPC(enc);
421
28.1M
      break;
422
30.6M
    }
423
30.6M
  }
424
57
  *nextTokPtr = ptr;
425
57
  return XML_TOK_DATA_CHARS;
426
2.06M
}
xmltok.c:normal_cdataSectionTok
Line
Count
Source
356
5.62M
                        const char **nextTokPtr) {
357
5.62M
  if (ptr >= end)
358
202
    return XML_TOK_NONE;
359
5.62M
  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
5.62M
  switch (BYTE_TYPE(enc, ptr)) {
369
975k
  case BT_RSQB:
370
975k
    ptr += MINBPC(enc);
371
975k
    REQUIRE_CHAR(enc, ptr, end);
372
975k
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
373
503k
      break;
374
472k
    ptr += MINBPC(enc);
375
472k
    REQUIRE_CHAR(enc, ptr, end);
376
472k
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
377
469k
      ptr -= MINBPC(enc);
378
469k
      break;
379
469k
    }
380
2.36k
    *nextTokPtr = ptr + MINBPC(enc);
381
2.36k
    return XML_TOK_CDATA_SECT_CLOSE;
382
1.96M
  case BT_CR:
383
1.96M
    ptr += MINBPC(enc);
384
1.96M
    REQUIRE_CHAR(enc, ptr, end);
385
1.96M
    if (BYTE_TYPE(enc, ptr) == BT_LF)
386
404k
      ptr += MINBPC(enc);
387
1.96M
    *nextTokPtr = ptr;
388
1.96M
    return XML_TOK_DATA_NEWLINE;
389
1.59M
  case BT_LF:
390
1.59M
    *nextTokPtr = ptr + MINBPC(enc);
391
1.59M
    return XML_TOK_DATA_NEWLINE;
392
1.59M
    INVALID_CASES(ptr, nextTokPtr)
393
910k
  default:
394
910k
    ptr += MINBPC(enc);
395
910k
    break;
396
5.62M
  }
397
30.6M
  while (HAS_CHAR(enc, ptr, end)) {
398
30.6M
    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
179k
      LEAD_CASE(2)
408
172k
      LEAD_CASE(3)
409
86.7k
      LEAD_CASE(4)
410
0
#  undef LEAD_CASE
411
11
    case BT_NONXML:
412
14
    case BT_MALFORM:
413
20
    case BT_TRAIL:
414
807k
    case BT_CR:
415
1.28M
    case BT_LF:
416
2.06M
    case BT_RSQB:
417
2.06M
      *nextTokPtr = ptr;
418
2.06M
      return XML_TOK_DATA_CHARS;
419
28.1M
    default:
420
28.1M
      ptr += MINBPC(enc);
421
28.1M
      break;
422
30.6M
    }
423
30.6M
  }
424
57
  *nextTokPtr = ptr;
425
57
  return XML_TOK_DATA_CHARS;
426
2.06M
}
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
59.0k
                   const char **nextTokPtr) {
433
59.0k
  REQUIRE_CHAR(enc, ptr, end);
434
59.0k
  switch (BYTE_TYPE(enc, ptr)) {
435
56.4k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
436
8
  default:
437
8
    *nextTokPtr = ptr;
438
8
    return XML_TOK_INVALID;
439
59.0k
  }
440
501k
  while (HAS_CHAR(enc, ptr, end)) {
441
501k
    switch (BYTE_TYPE(enc, ptr)) {
442
1.37M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
443
266
    case BT_S:
444
1.23k
    case BT_CR:
445
3.37k
    case BT_LF:
446
9.04k
      for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
447
9.04k
        switch (BYTE_TYPE(enc, ptr)) {
448
408
        case BT_S:
449
1.92k
        case BT_CR:
450
5.71k
        case BT_LF:
451
5.71k
          break;
452
3.32k
        case BT_GT:
453
3.32k
          *nextTokPtr = ptr + MINBPC(enc);
454
3.32k
          return XML_TOK_END_TAG;
455
5
        default:
456
5
          *nextTokPtr = ptr;
457
5
          return XML_TOK_INVALID;
458
9.04k
        }
459
9.04k
      }
460
50
      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
55.4k
    case BT_GT:
469
55.4k
      *nextTokPtr = ptr + MINBPC(enc);
470
55.4k
      return XML_TOK_END_TAG;
471
11
    default:
472
11
      *nextTokPtr = ptr;
473
11
      return XML_TOK_INVALID;
474
501k
    }
475
501k
  }
476
114
  return XML_TOK_PARTIAL;
477
59.0k
}
xmltok.c:normal_scanEndTag
Line
Count
Source
432
59.0k
                   const char **nextTokPtr) {
433
59.0k
  REQUIRE_CHAR(enc, ptr, end);
434
59.0k
  switch (BYTE_TYPE(enc, ptr)) {
435
56.4k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
436
8
  default:
437
8
    *nextTokPtr = ptr;
438
8
    return XML_TOK_INVALID;
439
59.0k
  }
440
501k
  while (HAS_CHAR(enc, ptr, end)) {
441
501k
    switch (BYTE_TYPE(enc, ptr)) {
442
1.37M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
443
266
    case BT_S:
444
1.23k
    case BT_CR:
445
3.37k
    case BT_LF:
446
9.04k
      for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
447
9.04k
        switch (BYTE_TYPE(enc, ptr)) {
448
408
        case BT_S:
449
1.92k
        case BT_CR:
450
5.71k
        case BT_LF:
451
5.71k
          break;
452
3.32k
        case BT_GT:
453
3.32k
          *nextTokPtr = ptr + MINBPC(enc);
454
3.32k
          return XML_TOK_END_TAG;
455
5
        default:
456
5
          *nextTokPtr = ptr;
457
5
          return XML_TOK_INVALID;
458
9.04k
        }
459
9.04k
      }
460
50
      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
55.4k
    case BT_GT:
469
55.4k
      *nextTokPtr = ptr + MINBPC(enc);
470
55.4k
      return XML_TOK_END_TAG;
471
11
    default:
472
11
      *nextTokPtr = ptr;
473
11
      return XML_TOK_INVALID;
474
501k
    }
475
501k
  }
476
114
  return XML_TOK_PARTIAL;
477
59.0k
}
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
65.5k
                       const char **nextTokPtr) {
484
65.5k
  if (HAS_CHAR(enc, ptr, end)) {
485
65.5k
    switch (BYTE_TYPE(enc, ptr)) {
486
26.7k
    case BT_DIGIT:
487
65.5k
    case BT_HEX:
488
65.5k
      break;
489
6
    default:
490
6
      *nextTokPtr = ptr;
491
6
      return XML_TOK_INVALID;
492
65.5k
    }
493
235k
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
494
235k
      switch (BYTE_TYPE(enc, ptr)) {
495
121k
      case BT_DIGIT:
496
169k
      case BT_HEX:
497
169k
        break;
498
65.5k
      case BT_SEMI:
499
65.5k
        *nextTokPtr = ptr + MINBPC(enc);
500
65.5k
        return XML_TOK_CHAR_REF;
501
3
      default:
502
3
        *nextTokPtr = ptr;
503
3
        return XML_TOK_INVALID;
504
235k
      }
505
235k
    }
506
65.5k
  }
507
31
  return XML_TOK_PARTIAL;
508
65.5k
}
xmltok.c:normal_scanHexCharRef
Line
Count
Source
483
65.5k
                       const char **nextTokPtr) {
484
65.5k
  if (HAS_CHAR(enc, ptr, end)) {
485
65.5k
    switch (BYTE_TYPE(enc, ptr)) {
486
26.7k
    case BT_DIGIT:
487
65.5k
    case BT_HEX:
488
65.5k
      break;
489
6
    default:
490
6
      *nextTokPtr = ptr;
491
6
      return XML_TOK_INVALID;
492
65.5k
    }
493
235k
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
494
235k
      switch (BYTE_TYPE(enc, ptr)) {
495
121k
      case BT_DIGIT:
496
169k
      case BT_HEX:
497
169k
        break;
498
65.5k
      case BT_SEMI:
499
65.5k
        *nextTokPtr = ptr + MINBPC(enc);
500
65.5k
        return XML_TOK_CHAR_REF;
501
3
      default:
502
3
        *nextTokPtr = ptr;
503
3
        return XML_TOK_INVALID;
504
235k
      }
505
235k
    }
506
65.5k
  }
507
31
  return XML_TOK_PARTIAL;
508
65.5k
}
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
79.0k
                    const char **nextTokPtr) {
515
79.0k
  if (HAS_CHAR(enc, ptr, end)) {
516
79.0k
    if (CHAR_MATCHES(enc, ptr, ASCII_x))
517
65.5k
      return PREFIX(scanHexCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
518
13.4k
    switch (BYTE_TYPE(enc, ptr)) {
519
13.4k
    case BT_DIGIT:
520
13.4k
      break;
521
12
    default:
522
12
      *nextTokPtr = ptr;
523
12
      return XML_TOK_INVALID;
524
13.4k
    }
525
54.1k
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
526
54.1k
      switch (BYTE_TYPE(enc, ptr)) {
527
40.7k
      case BT_DIGIT:
528
40.7k
        break;
529
13.4k
      case BT_SEMI:
530
13.4k
        *nextTokPtr = ptr + MINBPC(enc);
531
13.4k
        return XML_TOK_CHAR_REF;
532
2
      default:
533
2
        *nextTokPtr = ptr;
534
2
        return XML_TOK_INVALID;
535
54.1k
      }
536
54.1k
    }
537
13.4k
  }
538
20
  return XML_TOK_PARTIAL;
539
79.0k
}
xmltok.c:normal_scanCharRef
Line
Count
Source
514
79.0k
                    const char **nextTokPtr) {
515
79.0k
  if (HAS_CHAR(enc, ptr, end)) {
516
79.0k
    if (CHAR_MATCHES(enc, ptr, ASCII_x))
517
65.5k
      return PREFIX(scanHexCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
518
13.4k
    switch (BYTE_TYPE(enc, ptr)) {
519
13.4k
    case BT_DIGIT:
520
13.4k
      break;
521
12
    default:
522
12
      *nextTokPtr = ptr;
523
12
      return XML_TOK_INVALID;
524
13.4k
    }
525
54.1k
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
526
54.1k
      switch (BYTE_TYPE(enc, ptr)) {
527
40.7k
      case BT_DIGIT:
528
40.7k
        break;
529
13.4k
      case BT_SEMI:
530
13.4k
        *nextTokPtr = ptr + MINBPC(enc);
531
13.4k
        return XML_TOK_CHAR_REF;
532
2
      default:
533
2
        *nextTokPtr = ptr;
534
2
        return XML_TOK_INVALID;
535
54.1k
      }
536
54.1k
    }
537
13.4k
  }
538
20
  return XML_TOK_PARTIAL;
539
79.0k
}
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
242k
                const char **nextTokPtr) {
546
242k
  REQUIRE_CHAR(enc, ptr, end);
547
242k
  switch (BYTE_TYPE(enc, ptr)) {
548
93.8k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
549
79.0k
  case BT_NUM:
550
79.0k
    return PREFIX(scanCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
551
6
  default:
552
6
    *nextTokPtr = ptr;
553
6
    return XML_TOK_INVALID;
554
242k
  }
555
478k
  while (HAS_CHAR(enc, ptr, end)) {
556
478k
    switch (BYTE_TYPE(enc, ptr)) {
557
1.06M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
558
163k
    case BT_SEMI:
559
163k
      *nextTokPtr = ptr + MINBPC(enc);
560
163k
      return XML_TOK_ENTITY_REF;
561
15
    default:
562
15
      *nextTokPtr = ptr;
563
15
      return XML_TOK_INVALID;
564
478k
    }
565
478k
  }
566
88
  return XML_TOK_PARTIAL;
567
163k
}
xmltok.c:normal_scanRef
Line
Count
Source
545
242k
                const char **nextTokPtr) {
546
242k
  REQUIRE_CHAR(enc, ptr, end);
547
242k
  switch (BYTE_TYPE(enc, ptr)) {
548
93.8k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
549
79.0k
  case BT_NUM:
550
79.0k
    return PREFIX(scanCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
551
6
  default:
552
6
    *nextTokPtr = ptr;
553
6
    return XML_TOK_INVALID;
554
242k
  }
555
478k
  while (HAS_CHAR(enc, ptr, end)) {
556
478k
    switch (BYTE_TYPE(enc, ptr)) {
557
1.06M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
558
163k
    case BT_SEMI:
559
163k
      *nextTokPtr = ptr + MINBPC(enc);
560
163k
      return XML_TOK_ENTITY_REF;
561
15
    default:
562
15
      *nextTokPtr = ptr;
563
15
      return XML_TOK_INVALID;
564
478k
    }
565
478k
  }
566
88
  return XML_TOK_PARTIAL;
567
163k
}
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
78.0k
                 const char **nextTokPtr) {
574
#  ifdef XML_NS
575
  int hadColon = 0;
576
#  endif
577
3.23M
  while (HAS_CHAR(enc, ptr, end)) {
578
3.23M
    switch (BYTE_TYPE(enc, ptr)) {
579
2.33M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
580
#  ifdef XML_NS
581
    case BT_COLON:
582
      if (hadColon) {
583
        *nextTokPtr = ptr;
584
        return XML_TOK_INVALID;
585
      }
586
      hadColon = 1;
587
      ptr += MINBPC(enc);
588
      REQUIRE_CHAR(enc, ptr, end);
589
      switch (BYTE_TYPE(enc, ptr)) {
590
        CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
591
      default:
592
        *nextTokPtr = ptr;
593
        return XML_TOK_INVALID;
594
      }
595
      break;
596
#  endif
597
4.04k
    case BT_S:
598
20.4k
    case BT_CR:
599
24.5k
    case BT_LF:
600
52.9k
      for (;;) {
601
52.9k
        int t;
602
603
52.9k
        ptr += MINBPC(enc);
604
52.9k
        REQUIRE_CHAR(enc, ptr, end);
605
52.8k
        t = BYTE_TYPE(enc, ptr);
606
52.8k
        if (t == BT_EQUALS)
607
24.4k
          break;
608
28.3k
        switch (t) {
609
4.77k
        case BT_S:
610
7.73k
        case BT_LF:
611
28.3k
        case BT_CR:
612
28.3k
          break;
613
12
        default:
614
12
          *nextTokPtr = ptr;
615
12
          return XML_TOK_INVALID;
616
28.3k
        }
617
28.3k
      }
618
      /* fall through */
619
2.56M
    case BT_EQUALS: {
620
2.56M
      int open;
621
#  ifdef XML_NS
622
      hadColon = 0;
623
#  endif
624
2.63M
      for (;;) {
625
2.63M
        ptr += MINBPC(enc);
626
2.63M
        REQUIRE_CHAR(enc, ptr, end);
627
2.63M
        open = BYTE_TYPE(enc, ptr);
628
2.63M
        if (open == BT_QUOT || open == BT_APOS)
629
2.56M
          break;
630
70.6k
        switch (open) {
631
14.0k
        case BT_S:
632
31.4k
        case BT_LF:
633
70.6k
        case BT_CR:
634
70.6k
          break;
635
17
        default:
636
17
          *nextTokPtr = ptr;
637
17
          return XML_TOK_INVALID;
638
70.6k
        }
639
70.6k
      }
640
2.56M
      ptr += MINBPC(enc);
641
      /* in attribute value */
642
18.9M
      for (;;) {
643
18.9M
        int t;
644
18.9M
        REQUIRE_CHAR(enc, ptr, end);
645
18.9M
        t = BYTE_TYPE(enc, ptr);
646
18.9M
        if (t == open)
647
2.56M
          break;
648
16.3M
        switch (t) {
649
189k
          INVALID_CASES(ptr, nextTokPtr)
650
39.2k
        case BT_AMP: {
651
39.2k
          int tok = PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, &ptr);
652
39.2k
          if (tok <= 0) {
653
58
            if (tok == XML_TOK_INVALID)
654
20
              *nextTokPtr = ptr;
655
58
            return tok;
656
58
          }
657
39.1k
          break;
658
39.2k
        }
659
39.1k
        case BT_LT:
660
6
          *nextTokPtr = ptr;
661
6
          return XML_TOK_INVALID;
662
16.2M
        default:
663
16.2M
          ptr += MINBPC(enc);
664
16.2M
          break;
665
16.3M
        }
666
16.3M
      }
667
2.56M
      ptr += MINBPC(enc);
668
2.56M
      REQUIRE_CHAR(enc, ptr, end);
669
2.56M
      switch (BYTE_TYPE(enc, ptr)) {
670
1.33M
      case BT_S:
671
2.48M
      case BT_CR:
672
2.52M
      case BT_LF:
673
2.52M
        break;
674
28.6k
      case BT_SOL:
675
28.6k
        goto sol;
676
9.76k
      case BT_GT:
677
9.76k
        goto gt;
678
1
      default:
679
1
        *nextTokPtr = ptr;
680
1
        return XML_TOK_INVALID;
681
2.56M
      }
682
      /* ptr points to closing quote */
683
2.76M
      for (;;) {
684
2.76M
        ptr += MINBPC(enc);
685
2.76M
        REQUIRE_CHAR(enc, ptr, end);
686
2.76M
        switch (BYTE_TYPE(enc, ptr)) {
687
2.50M
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
688
164k
        case BT_S:
689
206k
        case BT_CR:
690
237k
        case BT_LF:
691
237k
          continue;
692
596
        case BT_GT:
693
10.3k
        gt:
694
10.3k
          *nextTokPtr = ptr + MINBPC(enc);
695
10.3k
          return XML_TOK_START_TAG_WITH_ATTS;
696
38.3k
        case BT_SOL:
697
66.9k
        sol:
698
66.9k
          ptr += MINBPC(enc);
699
66.9k
          REQUIRE_CHAR(enc, ptr, end);
700
66.9k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
701
7
            *nextTokPtr = ptr;
702
7
            return XML_TOK_INVALID;
703
7
          }
704
66.9k
          *nextTokPtr = ptr + MINBPC(enc);
705
66.9k
          return XML_TOK_EMPTY_ELEMENT_WITH_ATTS;
706
5
        default:
707
5
          *nextTokPtr = ptr;
708
5
          return XML_TOK_INVALID;
709
2.76M
        }
710
2.48M
        break;
711
2.76M
      }
712
2.48M
      break;
713
2.52M
    }
714
2.48M
    default:
715
20
      *nextTokPtr = ptr;
716
20
      return XML_TOK_INVALID;
717
3.23M
    }
718
3.23M
  }
719
110
  return XML_TOK_PARTIAL;
720
78.0k
}
xmltok.c:normal_scanAtts
Line
Count
Source
573
78.0k
                 const char **nextTokPtr) {
574
#  ifdef XML_NS
575
  int hadColon = 0;
576
#  endif
577
3.23M
  while (HAS_CHAR(enc, ptr, end)) {
578
3.23M
    switch (BYTE_TYPE(enc, ptr)) {
579
2.33M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
580
#  ifdef XML_NS
581
    case BT_COLON:
582
      if (hadColon) {
583
        *nextTokPtr = ptr;
584
        return XML_TOK_INVALID;
585
      }
586
      hadColon = 1;
587
      ptr += MINBPC(enc);
588
      REQUIRE_CHAR(enc, ptr, end);
589
      switch (BYTE_TYPE(enc, ptr)) {
590
        CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
591
      default:
592
        *nextTokPtr = ptr;
593
        return XML_TOK_INVALID;
594
      }
595
      break;
596
#  endif
597
4.04k
    case BT_S:
598
20.4k
    case BT_CR:
599
24.5k
    case BT_LF:
600
52.9k
      for (;;) {
601
52.9k
        int t;
602
603
52.9k
        ptr += MINBPC(enc);
604
52.9k
        REQUIRE_CHAR(enc, ptr, end);
605
52.8k
        t = BYTE_TYPE(enc, ptr);
606
52.8k
        if (t == BT_EQUALS)
607
24.4k
          break;
608
28.3k
        switch (t) {
609
4.77k
        case BT_S:
610
7.73k
        case BT_LF:
611
28.3k
        case BT_CR:
612
28.3k
          break;
613
12
        default:
614
12
          *nextTokPtr = ptr;
615
12
          return XML_TOK_INVALID;
616
28.3k
        }
617
28.3k
      }
618
      /* fall through */
619
2.56M
    case BT_EQUALS: {
620
2.56M
      int open;
621
#  ifdef XML_NS
622
      hadColon = 0;
623
#  endif
624
2.63M
      for (;;) {
625
2.63M
        ptr += MINBPC(enc);
626
2.63M
        REQUIRE_CHAR(enc, ptr, end);
627
2.63M
        open = BYTE_TYPE(enc, ptr);
628
2.63M
        if (open == BT_QUOT || open == BT_APOS)
629
2.56M
          break;
630
70.6k
        switch (open) {
631
14.0k
        case BT_S:
632
31.4k
        case BT_LF:
633
70.6k
        case BT_CR:
634
70.6k
          break;
635
17
        default:
636
17
          *nextTokPtr = ptr;
637
17
          return XML_TOK_INVALID;
638
70.6k
        }
639
70.6k
      }
640
2.56M
      ptr += MINBPC(enc);
641
      /* in attribute value */
642
18.9M
      for (;;) {
643
18.9M
        int t;
644
18.9M
        REQUIRE_CHAR(enc, ptr, end);
645
18.9M
        t = BYTE_TYPE(enc, ptr);
646
18.9M
        if (t == open)
647
2.56M
          break;
648
16.3M
        switch (t) {
649
189k
          INVALID_CASES(ptr, nextTokPtr)
650
39.2k
        case BT_AMP: {
651
39.2k
          int tok = PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, &ptr);
652
39.2k
          if (tok <= 0) {
653
58
            if (tok == XML_TOK_INVALID)
654
20
              *nextTokPtr = ptr;
655
58
            return tok;
656
58
          }
657
39.1k
          break;
658
39.2k
        }
659
39.1k
        case BT_LT:
660
6
          *nextTokPtr = ptr;
661
6
          return XML_TOK_INVALID;
662
16.2M
        default:
663
16.2M
          ptr += MINBPC(enc);
664
16.2M
          break;
665
16.3M
        }
666
16.3M
      }
667
2.56M
      ptr += MINBPC(enc);
668
2.56M
      REQUIRE_CHAR(enc, ptr, end);
669
2.56M
      switch (BYTE_TYPE(enc, ptr)) {
670
1.33M
      case BT_S:
671
2.48M
      case BT_CR:
672
2.52M
      case BT_LF:
673
2.52M
        break;
674
28.6k
      case BT_SOL:
675
28.6k
        goto sol;
676
9.76k
      case BT_GT:
677
9.76k
        goto gt;
678
1
      default:
679
1
        *nextTokPtr = ptr;
680
1
        return XML_TOK_INVALID;
681
2.56M
      }
682
      /* ptr points to closing quote */
683
2.76M
      for (;;) {
684
2.76M
        ptr += MINBPC(enc);
685
2.76M
        REQUIRE_CHAR(enc, ptr, end);
686
2.76M
        switch (BYTE_TYPE(enc, ptr)) {
687
2.50M
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
688
164k
        case BT_S:
689
206k
        case BT_CR:
690
237k
        case BT_LF:
691
237k
          continue;
692
596
        case BT_GT:
693
10.3k
        gt:
694
10.3k
          *nextTokPtr = ptr + MINBPC(enc);
695
10.3k
          return XML_TOK_START_TAG_WITH_ATTS;
696
38.3k
        case BT_SOL:
697
66.9k
        sol:
698
66.9k
          ptr += MINBPC(enc);
699
66.9k
          REQUIRE_CHAR(enc, ptr, end);
700
66.9k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
701
7
            *nextTokPtr = ptr;
702
7
            return XML_TOK_INVALID;
703
7
          }
704
66.9k
          *nextTokPtr = ptr + MINBPC(enc);
705
66.9k
          return XML_TOK_EMPTY_ELEMENT_WITH_ATTS;
706
5
        default:
707
5
          *nextTokPtr = ptr;
708
5
          return XML_TOK_INVALID;
709
2.76M
        }
710
2.48M
        break;
711
2.76M
      }
712
2.48M
      break;
713
2.52M
    }
714
2.48M
    default:
715
20
      *nextTokPtr = ptr;
716
20
      return XML_TOK_INVALID;
717
3.23M
    }
718
3.23M
  }
719
110
  return XML_TOK_PARTIAL;
720
78.0k
}
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
900k
               const char **nextTokPtr) {
727
#  ifdef XML_NS
728
  int hadColon;
729
#  endif
730
900k
  REQUIRE_CHAR(enc, ptr, end);
731
900k
  switch (BYTE_TYPE(enc, ptr)) {
732
764k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
733
25.9k
  case BT_EXCL:
734
25.9k
    ptr += MINBPC(enc);
735
25.9k
    REQUIRE_CHAR(enc, ptr, end);
736
25.9k
    switch (BYTE_TYPE(enc, ptr)) {
737
23.2k
    case BT_MINUS:
738
23.2k
      return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
739
2.62k
    case BT_LSQB:
740
2.62k
      return PREFIX(scanCdataSection)(enc, ptr + MINBPC(enc), end, nextTokPtr);
741
25.9k
    }
742
1
    *nextTokPtr = ptr;
743
1
    return XML_TOK_INVALID;
744
33.5k
  case BT_QUEST:
745
33.5k
    return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
746
59.0k
  case BT_SOL:
747
59.0k
    return PREFIX(scanEndTag)(enc, ptr + MINBPC(enc), end, nextTokPtr);
748
8
  default:
749
8
    *nextTokPtr = ptr;
750
8
    return XML_TOK_INVALID;
751
900k
  }
752
#  ifdef XML_NS
753
  hadColon = 0;
754
#  endif
755
  /* we have a start-tag */
756
10.5M
  while (HAS_CHAR(enc, ptr, end)) {
757
10.5M
    switch (BYTE_TYPE(enc, ptr)) {
758
38.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
67.2k
    case BT_S:
777
79.5k
    case BT_CR:
778
86.8k
    case BT_LF: {
779
86.8k
      ptr += MINBPC(enc);
780
122k
      while (HAS_CHAR(enc, ptr, end)) {
781
122k
        switch (BYTE_TYPE(enc, ptr)) {
782
64.8k
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
783
3.28k
        case BT_GT:
784
3.28k
          goto gt;
785
5.43k
        case BT_SOL:
786
5.43k
          goto sol;
787
3.13k
        case BT_S:
788
28.1k
        case BT_CR:
789
35.4k
        case BT_LF:
790
35.4k
          ptr += MINBPC(enc);
791
35.4k
          continue;
792
3
        default:
793
3
          *nextTokPtr = ptr;
794
3
          return XML_TOK_INVALID;
795
122k
        }
796
78.0k
        return PREFIX(scanAtts)(enc, ptr, end, nextTokPtr);
797
122k
      }
798
56
      return XML_TOK_PARTIAL;
799
86.8k
    }
800
655k
    case BT_GT:
801
658k
    gt:
802
658k
      *nextTokPtr = ptr + MINBPC(enc);
803
658k
      return XML_TOK_START_TAG_NO_ATTS;
804
39.1k
    case BT_SOL:
805
44.6k
    sol:
806
44.6k
      ptr += MINBPC(enc);
807
44.6k
      REQUIRE_CHAR(enc, ptr, end);
808
44.6k
      if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
809
9
        *nextTokPtr = ptr;
810
9
        return XML_TOK_INVALID;
811
9
      }
812
44.5k
      *nextTokPtr = ptr + MINBPC(enc);
813
44.5k
      return XML_TOK_EMPTY_ELEMENT_NO_ATTS;
814
21
    default:
815
21
      *nextTokPtr = ptr;
816
21
      return XML_TOK_INVALID;
817
10.5M
    }
818
10.5M
  }
819
210
  return XML_TOK_PARTIAL;
820
781k
}
xmltok.c:normal_scanLt
Line
Count
Source
726
900k
               const char **nextTokPtr) {
727
#  ifdef XML_NS
728
  int hadColon;
729
#  endif
730
900k
  REQUIRE_CHAR(enc, ptr, end);
731
900k
  switch (BYTE_TYPE(enc, ptr)) {
732
764k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
733
25.9k
  case BT_EXCL:
734
25.9k
    ptr += MINBPC(enc);
735
25.9k
    REQUIRE_CHAR(enc, ptr, end);
736
25.9k
    switch (BYTE_TYPE(enc, ptr)) {
737
23.2k
    case BT_MINUS:
738
23.2k
      return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
739
2.62k
    case BT_LSQB:
740
2.62k
      return PREFIX(scanCdataSection)(enc, ptr + MINBPC(enc), end, nextTokPtr);
741
25.9k
    }
742
1
    *nextTokPtr = ptr;
743
1
    return XML_TOK_INVALID;
744
33.5k
  case BT_QUEST:
745
33.5k
    return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
746
59.0k
  case BT_SOL:
747
59.0k
    return PREFIX(scanEndTag)(enc, ptr + MINBPC(enc), end, nextTokPtr);
748
8
  default:
749
8
    *nextTokPtr = ptr;
750
8
    return XML_TOK_INVALID;
751
900k
  }
752
#  ifdef XML_NS
753
  hadColon = 0;
754
#  endif
755
  /* we have a start-tag */
756
10.5M
  while (HAS_CHAR(enc, ptr, end)) {
757
10.5M
    switch (BYTE_TYPE(enc, ptr)) {
758
38.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
67.2k
    case BT_S:
777
79.5k
    case BT_CR:
778
86.8k
    case BT_LF: {
779
86.8k
      ptr += MINBPC(enc);
780
122k
      while (HAS_CHAR(enc, ptr, end)) {
781
122k
        switch (BYTE_TYPE(enc, ptr)) {
782
64.8k
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
783
3.28k
        case BT_GT:
784
3.28k
          goto gt;
785
5.43k
        case BT_SOL:
786
5.43k
          goto sol;
787
3.13k
        case BT_S:
788
28.1k
        case BT_CR:
789
35.4k
        case BT_LF:
790
35.4k
          ptr += MINBPC(enc);
791
35.4k
          continue;
792
3
        default:
793
3
          *nextTokPtr = ptr;
794
3
          return XML_TOK_INVALID;
795
122k
        }
796
78.0k
        return PREFIX(scanAtts)(enc, ptr, end, nextTokPtr);
797
122k
      }
798
56
      return XML_TOK_PARTIAL;
799
86.8k
    }
800
655k
    case BT_GT:
801
658k
    gt:
802
658k
      *nextTokPtr = ptr + MINBPC(enc);
803
658k
      return XML_TOK_START_TAG_NO_ATTS;
804
39.1k
    case BT_SOL:
805
44.6k
    sol:
806
44.6k
      ptr += MINBPC(enc);
807
44.6k
      REQUIRE_CHAR(enc, ptr, end);
808
44.6k
      if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
809
9
        *nextTokPtr = ptr;
810
9
        return XML_TOK_INVALID;
811
9
      }
812
44.5k
      *nextTokPtr = ptr + MINBPC(enc);
813
44.5k
      return XML_TOK_EMPTY_ELEMENT_NO_ATTS;
814
21
    default:
815
21
      *nextTokPtr = ptr;
816
21
      return XML_TOK_INVALID;
817
10.5M
    }
818
10.5M
  }
819
210
  return XML_TOK_PARTIAL;
820
781k
}
Unexecuted instantiation: xmltok.c:little2_scanLt
Unexecuted instantiation: xmltok.c:big2_scanLt
821
822
static int PTRCALL
823
PREFIX(contentTok)(const ENCODING *enc, const char *ptr, const char *end,
824
4.54M
                   const char **nextTokPtr) {
825
4.54M
  if (ptr >= end)
826
9.51k
    return XML_TOK_NONE;
827
4.53M
  if (MINBPC(enc) > 1) {
828
0
    size_t n = end - ptr;
829
0
    if (n & (MINBPC(enc) - 1)) {
830
0
      n &= ~(MINBPC(enc) - 1);
831
0
      if (n == 0)
832
0
        return XML_TOK_PARTIAL;
833
0
      end = ptr + n;
834
0
    }
835
0
  }
836
4.53M
  switch (BYTE_TYPE(enc, ptr)) {
837
900k
  case BT_LT:
838
900k
    return PREFIX(scanLt)(enc, ptr + MINBPC(enc), end, nextTokPtr);
839
107k
  case BT_AMP:
840
107k
    return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
841
1.61M
  case BT_CR:
842
1.61M
    ptr += MINBPC(enc);
843
1.61M
    if (! HAS_CHAR(enc, ptr, end))
844
22
      return XML_TOK_TRAILING_CR;
845
1.61M
    if (BYTE_TYPE(enc, ptr) == BT_LF)
846
178k
      ptr += MINBPC(enc);
847
1.61M
    *nextTokPtr = ptr;
848
1.61M
    return XML_TOK_DATA_NEWLINE;
849
802k
  case BT_LF:
850
802k
    *nextTokPtr = ptr + MINBPC(enc);
851
802k
    return XML_TOK_DATA_NEWLINE;
852
286k
  case BT_RSQB:
853
286k
    ptr += MINBPC(enc);
854
286k
    if (! HAS_CHAR(enc, ptr, end))
855
12
      return XML_TOK_TRAILING_RSQB;
856
286k
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
857
45.7k
      break;
858
240k
    ptr += MINBPC(enc);
859
240k
    if (! HAS_CHAR(enc, ptr, end))
860
6
      return XML_TOK_TRAILING_RSQB;
861
240k
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
862
240k
      ptr -= MINBPC(enc);
863
240k
      break;
864
240k
    }
865
1
    *nextTokPtr = ptr;
866
1
    return XML_TOK_INVALID;
867
108k
    INVALID_CASES(ptr, nextTokPtr)
868
767k
  default:
869
767k
    ptr += MINBPC(enc);
870
767k
    break;
871
4.53M
  }
872
19.6M
  while (HAS_CHAR(enc, ptr, end)) {
873
19.6M
    switch (BYTE_TYPE(enc, ptr)) {
874
0
#  define LEAD_CASE(n)                                                         \
875
146k
  case BT_LEAD##n:                                                             \
876
146k
    if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) {                       \
877
34
      *nextTokPtr = ptr;                                                       \
878
34
      return XML_TOK_DATA_CHARS;                                               \
879
34
    }                                                                          \
880
146k
    ptr += n;                                                                  \
881
146k
    break;
882
91.4k
      LEAD_CASE(2)
883
31.2k
      LEAD_CASE(3)
884
23.9k
      LEAD_CASE(4)
885
0
#  undef LEAD_CASE
886
716k
    case BT_RSQB:
887
716k
      if (HAS_CHARS(enc, ptr, end, 2)) {
888
716k
        if (! CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_RSQB)) {
889
371k
          ptr += MINBPC(enc);
890
371k
          break;
891
371k
        }
892
345k
        if (HAS_CHARS(enc, ptr, end, 3)) {
893
345k
          if (! CHAR_MATCHES(enc, ptr + 2 * MINBPC(enc), ASCII_GT)) {
894
345k
            ptr += MINBPC(enc);
895
345k
            break;
896
345k
          }
897
2
          *nextTokPtr = ptr + 2 * MINBPC(enc);
898
2
          return XML_TOK_INVALID;
899
345k
        }
900
345k
      }
901
      /* fall through */
902
56.3k
    case BT_AMP:
903
214k
    case BT_LT:
904
214k
    case BT_NONXML:
905
214k
    case BT_MALFORM:
906
214k
    case BT_TRAIL:
907
875k
    case BT_CR:
908
1.10M
    case BT_LF:
909
1.10M
      *nextTokPtr = ptr;
910
1.10M
      return XML_TOK_DATA_CHARS;
911
17.6M
    default:
912
17.6M
      ptr += MINBPC(enc);
913
17.6M
      break;
914
19.6M
    }
915
19.6M
  }
916
7.75k
  *nextTokPtr = ptr;
917
7.75k
  return XML_TOK_DATA_CHARS;
918
1.10M
}
xmltok.c:normal_contentTok
Line
Count
Source
824
4.54M
                   const char **nextTokPtr) {
825
4.54M
  if (ptr >= end)
826
9.51k
    return XML_TOK_NONE;
827
4.53M
  if (MINBPC(enc) > 1) {
828
0
    size_t n = end - ptr;
829
0
    if (n & (MINBPC(enc) - 1)) {
830
0
      n &= ~(MINBPC(enc) - 1);
831
0
      if (n == 0)
832
0
        return XML_TOK_PARTIAL;
833
0
      end = ptr + n;
834
0
    }
835
0
  }
836
4.53M
  switch (BYTE_TYPE(enc, ptr)) {
837
900k
  case BT_LT:
838
900k
    return PREFIX(scanLt)(enc, ptr + MINBPC(enc), end, nextTokPtr);
839
107k
  case BT_AMP:
840
107k
    return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
841
1.61M
  case BT_CR:
842
1.61M
    ptr += MINBPC(enc);
843
1.61M
    if (! HAS_CHAR(enc, ptr, end))
844
22
      return XML_TOK_TRAILING_CR;
845
1.61M
    if (BYTE_TYPE(enc, ptr) == BT_LF)
846
178k
      ptr += MINBPC(enc);
847
1.61M
    *nextTokPtr = ptr;
848
1.61M
    return XML_TOK_DATA_NEWLINE;
849
802k
  case BT_LF:
850
802k
    *nextTokPtr = ptr + MINBPC(enc);
851
802k
    return XML_TOK_DATA_NEWLINE;
852
286k
  case BT_RSQB:
853
286k
    ptr += MINBPC(enc);
854
286k
    if (! HAS_CHAR(enc, ptr, end))
855
12
      return XML_TOK_TRAILING_RSQB;
856
286k
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
857
45.7k
      break;
858
240k
    ptr += MINBPC(enc);
859
240k
    if (! HAS_CHAR(enc, ptr, end))
860
6
      return XML_TOK_TRAILING_RSQB;
861
240k
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
862
240k
      ptr -= MINBPC(enc);
863
240k
      break;
864
240k
    }
865
1
    *nextTokPtr = ptr;
866
1
    return XML_TOK_INVALID;
867
108k
    INVALID_CASES(ptr, nextTokPtr)
868
767k
  default:
869
767k
    ptr += MINBPC(enc);
870
767k
    break;
871
4.53M
  }
872
19.6M
  while (HAS_CHAR(enc, ptr, end)) {
873
19.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
91.4k
      LEAD_CASE(2)
883
31.2k
      LEAD_CASE(3)
884
23.9k
      LEAD_CASE(4)
885
0
#  undef LEAD_CASE
886
716k
    case BT_RSQB:
887
716k
      if (HAS_CHARS(enc, ptr, end, 2)) {
888
716k
        if (! CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_RSQB)) {
889
371k
          ptr += MINBPC(enc);
890
371k
          break;
891
371k
        }
892
345k
        if (HAS_CHARS(enc, ptr, end, 3)) {
893
345k
          if (! CHAR_MATCHES(enc, ptr + 2 * MINBPC(enc), ASCII_GT)) {
894
345k
            ptr += MINBPC(enc);
895
345k
            break;
896
345k
          }
897
2
          *nextTokPtr = ptr + 2 * MINBPC(enc);
898
2
          return XML_TOK_INVALID;
899
345k
        }
900
345k
      }
901
      /* fall through */
902
56.3k
    case BT_AMP:
903
214k
    case BT_LT:
904
214k
    case BT_NONXML:
905
214k
    case BT_MALFORM:
906
214k
    case BT_TRAIL:
907
875k
    case BT_CR:
908
1.10M
    case BT_LF:
909
1.10M
      *nextTokPtr = ptr;
910
1.10M
      return XML_TOK_DATA_CHARS;
911
17.6M
    default:
912
17.6M
      ptr += MINBPC(enc);
913
17.6M
      break;
914
19.6M
    }
915
19.6M
  }
916
7.75k
  *nextTokPtr = ptr;
917
7.75k
  return XML_TOK_DATA_CHARS;
918
1.10M
}
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
6.31k
                    const char **nextTokPtr) {
925
6.31k
  REQUIRE_CHAR(enc, ptr, end);
926
6.29k
  switch (BYTE_TYPE(enc, ptr)) {
927
6.44k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
928
723
  case BT_S:
929
1.33k
  case BT_LF:
930
1.87k
  case BT_CR:
931
1.88k
  case BT_PERCNT:
932
1.88k
    *nextTokPtr = ptr;
933
1.88k
    return XML_TOK_PERCENT;
934
2
  default:
935
2
    *nextTokPtr = ptr;
936
2
    return XML_TOK_INVALID;
937
6.29k
  }
938
31.5k
  while (HAS_CHAR(enc, ptr, end)) {
939
31.5k
    switch (BYTE_TYPE(enc, ptr)) {
940
81.1k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
941
4.20k
    case BT_SEMI:
942
4.20k
      *nextTokPtr = ptr + MINBPC(enc);
943
4.20k
      return XML_TOK_PARAM_ENTITY_REF;
944
24
    default:
945
24
      *nextTokPtr = ptr;
946
24
      return XML_TOK_INVALID;
947
31.5k
    }
948
31.5k
  }
949
86
  return XML_TOK_PARTIAL;
950
4.37k
}
xmltok.c:normal_scanPercent
Line
Count
Source
924
6.31k
                    const char **nextTokPtr) {
925
6.31k
  REQUIRE_CHAR(enc, ptr, end);
926
6.29k
  switch (BYTE_TYPE(enc, ptr)) {
927
6.44k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
928
723
  case BT_S:
929
1.33k
  case BT_LF:
930
1.87k
  case BT_CR:
931
1.88k
  case BT_PERCNT:
932
1.88k
    *nextTokPtr = ptr;
933
1.88k
    return XML_TOK_PERCENT;
934
2
  default:
935
2
    *nextTokPtr = ptr;
936
2
    return XML_TOK_INVALID;
937
6.29k
  }
938
31.5k
  while (HAS_CHAR(enc, ptr, end)) {
939
31.5k
    switch (BYTE_TYPE(enc, ptr)) {
940
81.1k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
941
4.20k
    case BT_SEMI:
942
4.20k
      *nextTokPtr = ptr + MINBPC(enc);
943
4.20k
      return XML_TOK_PARAM_ENTITY_REF;
944
24
    default:
945
24
      *nextTokPtr = ptr;
946
24
      return XML_TOK_INVALID;
947
31.5k
    }
948
31.5k
  }
949
86
  return XML_TOK_PARTIAL;
950
4.37k
}
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
283k
                      const char **nextTokPtr) {
955
283k
  REQUIRE_CHAR(enc, ptr, end);
956
283k
  switch (BYTE_TYPE(enc, ptr)) {
957
282k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
958
7
  default:
959
7
    *nextTokPtr = ptr;
960
7
    return XML_TOK_INVALID;
961
283k
  }
962
2.04M
  while (HAS_CHAR(enc, ptr, end)) {
963
2.04M
    switch (BYTE_TYPE(enc, ptr)) {
964
6.41M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
965
12.6k
    case BT_CR:
966
18.5k
    case BT_LF:
967
280k
    case BT_S:
968
280k
    case BT_RPAR:
969
282k
    case BT_GT:
970
282k
    case BT_PERCNT:
971
282k
    case BT_VERBAR:
972
282k
      *nextTokPtr = ptr;
973
282k
      return XML_TOK_POUND_NAME;
974
14
    default:
975
14
      *nextTokPtr = ptr;
976
14
      return XML_TOK_INVALID;
977
2.04M
    }
978
2.04M
  }
979
230
  return -XML_TOK_POUND_NAME;
980
283k
}
xmltok.c:normal_scanPoundName
Line
Count
Source
954
283k
                      const char **nextTokPtr) {
955
283k
  REQUIRE_CHAR(enc, ptr, end);
956
283k
  switch (BYTE_TYPE(enc, ptr)) {
957
282k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
958
7
  default:
959
7
    *nextTokPtr = ptr;
960
7
    return XML_TOK_INVALID;
961
283k
  }
962
2.04M
  while (HAS_CHAR(enc, ptr, end)) {
963
2.04M
    switch (BYTE_TYPE(enc, ptr)) {
964
6.41M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
965
12.6k
    case BT_CR:
966
18.5k
    case BT_LF:
967
280k
    case BT_S:
968
280k
    case BT_RPAR:
969
282k
    case BT_GT:
970
282k
    case BT_PERCNT:
971
282k
    case BT_VERBAR:
972
282k
      *nextTokPtr = ptr;
973
282k
      return XML_TOK_POUND_NAME;
974
14
    default:
975
14
      *nextTokPtr = ptr;
976
14
      return XML_TOK_INVALID;
977
2.04M
    }
978
2.04M
  }
979
230
  return -XML_TOK_POUND_NAME;
980
283k
}
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
37.5k
                const char **nextTokPtr) {
985
7.52M
  while (HAS_CHAR(enc, ptr, end)) {
986
7.52M
    int t = BYTE_TYPE(enc, ptr);
987
7.52M
    switch (t) {
988
93.5k
      INVALID_CASES(ptr, nextTokPtr)
989
12.2k
    case BT_QUOT:
990
43.0k
    case BT_APOS:
991
43.0k
      ptr += MINBPC(enc);
992
43.0k
      if (t != open)
993
5.68k
        break;
994
37.3k
      if (! HAS_CHAR(enc, ptr, end))
995
539
        return -XML_TOK_LITERAL;
996
36.8k
      *nextTokPtr = ptr;
997
36.8k
      switch (BYTE_TYPE(enc, ptr)) {
998
5.54k
      case BT_S:
999
8.29k
      case BT_CR:
1000
18.5k
      case BT_LF:
1001
36.5k
      case BT_GT:
1002
36.5k
      case BT_PERCNT:
1003
36.8k
      case BT_LSQB:
1004
36.8k
        return XML_TOK_LITERAL;
1005
19
      default:
1006
19
        return XML_TOK_INVALID;
1007
36.8k
      }
1008
7.43M
    default:
1009
7.43M
      ptr += MINBPC(enc);
1010
7.43M
      break;
1011
7.52M
    }
1012
7.52M
  }
1013
122
  return XML_TOK_PARTIAL;
1014
37.5k
}
xmltok.c:normal_scanLit
Line
Count
Source
984
37.5k
                const char **nextTokPtr) {
985
7.52M
  while (HAS_CHAR(enc, ptr, end)) {
986
7.52M
    int t = BYTE_TYPE(enc, ptr);
987
7.52M
    switch (t) {
988
93.5k
      INVALID_CASES(ptr, nextTokPtr)
989
12.2k
    case BT_QUOT:
990
43.0k
    case BT_APOS:
991
43.0k
      ptr += MINBPC(enc);
992
43.0k
      if (t != open)
993
5.68k
        break;
994
37.3k
      if (! HAS_CHAR(enc, ptr, end))
995
539
        return -XML_TOK_LITERAL;
996
36.8k
      *nextTokPtr = ptr;
997
36.8k
      switch (BYTE_TYPE(enc, ptr)) {
998
5.54k
      case BT_S:
999
8.29k
      case BT_CR:
1000
18.5k
      case BT_LF:
1001
36.5k
      case BT_GT:
1002
36.5k
      case BT_PERCNT:
1003
36.8k
      case BT_LSQB:
1004
36.8k
        return XML_TOK_LITERAL;
1005
19
      default:
1006
19
        return XML_TOK_INVALID;
1007
36.8k
      }
1008
7.43M
    default:
1009
7.43M
      ptr += MINBPC(enc);
1010
7.43M
      break;
1011
7.52M
    }
1012
7.52M
  }
1013
122
  return XML_TOK_PARTIAL;
1014
37.5k
}
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
8.02M
                  const char **nextTokPtr) {
1019
8.02M
  int tok;
1020
8.02M
  if (ptr >= end)
1021
7.18k
    return XML_TOK_NONE;
1022
8.01M
  if (MINBPC(enc) > 1) {
1023
259
    size_t n = end - ptr;
1024
259
    if (n & (MINBPC(enc) - 1)) {
1025
45
      n &= ~(MINBPC(enc) - 1);
1026
45
      if (n == 0)
1027
4
        return XML_TOK_PARTIAL;
1028
41
      end = ptr + n;
1029
41
    }
1030
259
  }
1031
8.01M
  switch (BYTE_TYPE(enc, ptr)) {
1032
7.59k
  case BT_QUOT:
1033
7.59k
    return PREFIX(scanLit)(BT_QUOT, enc, ptr + MINBPC(enc), end, nextTokPtr);
1034
29.9k
  case BT_APOS:
1035
29.9k
    return PREFIX(scanLit)(BT_APOS, enc, ptr + MINBPC(enc), end, nextTokPtr);
1036
57.3k
  case BT_LT: {
1037
57.3k
    ptr += MINBPC(enc);
1038
57.3k
    REQUIRE_CHAR(enc, ptr, end);
1039
57.3k
    switch (BYTE_TYPE(enc, ptr)) {
1040
42.3k
    case BT_EXCL:
1041
42.3k
      return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1042
9.28k
    case BT_QUEST:
1043
9.28k
      return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1044
4.33k
    case BT_NMSTRT:
1045
5.55k
    case BT_HEX:
1046
5.55k
    case BT_NONASCII:
1047
5.61k
    case BT_LEAD2:
1048
5.64k
    case BT_LEAD3:
1049
5.65k
    case BT_LEAD4:
1050
5.65k
      *nextTokPtr = ptr - MINBPC(enc);
1051
5.65k
      return XML_TOK_INSTANCE_START;
1052
57.3k
    }
1053
17
    *nextTokPtr = ptr;
1054
17
    return XML_TOK_INVALID;
1055
57.3k
  }
1056
366k
  case BT_CR:
1057
366k
    if (ptr + MINBPC(enc) == end) {
1058
429
      *nextTokPtr = end;
1059
      /* indicate that this might be part of a CR/LF pair */
1060
429
      return -XML_TOK_PROLOG_S;
1061
429
    }
1062
    /* fall through */
1063
975k
  case BT_S:
1064
1.02M
  case BT_LF:
1065
1.05M
    for (;;) {
1066
1.05M
      ptr += MINBPC(enc);
1067
1.05M
      if (! HAS_CHAR(enc, ptr, end))
1068
253
        break;
1069
1.05M
      switch (BYTE_TYPE(enc, ptr)) {
1070
5.77k
      case BT_S:
1071
23.9k
      case BT_LF:
1072
23.9k
        break;
1073
2.10k
      case BT_CR:
1074
        /* don't split CR/LF pair */
1075
2.10k
        if (ptr + MINBPC(enc) != end)
1076
1.90k
          break;
1077
        /* fall through */
1078
1.02M
      default:
1079
1.02M
        *nextTokPtr = ptr;
1080
1.02M
        return XML_TOK_PROLOG_S;
1081
1.05M
      }
1082
1.05M
    }
1083
253
    *nextTokPtr = ptr;
1084
253
    return XML_TOK_PROLOG_S;
1085
6.31k
  case BT_PERCNT:
1086
6.31k
    return PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1087
8.36k
  case BT_COMMA:
1088
8.36k
    *nextTokPtr = ptr + MINBPC(enc);
1089
8.36k
    return XML_TOK_COMMA;
1090
2.69k
  case BT_LSQB:
1091
2.69k
    *nextTokPtr = ptr + MINBPC(enc);
1092
2.69k
    return XML_TOK_OPEN_BRACKET;
1093
1.15k
  case BT_RSQB:
1094
1.15k
    ptr += MINBPC(enc);
1095
1.15k
    if (! HAS_CHAR(enc, ptr, end))
1096
17
      return -XML_TOK_CLOSE_BRACKET;
1097
1.14k
    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
2
        *nextTokPtr = ptr + 2 * MINBPC(enc);
1101
2
        return XML_TOK_COND_SECT_CLOSE;
1102
2
      }
1103
29
    }
1104
1.13k
    *nextTokPtr = ptr;
1105
1.13k
    return XML_TOK_CLOSE_BRACKET;
1106
5.45M
  case BT_LPAR:
1107
5.45M
    *nextTokPtr = ptr + MINBPC(enc);
1108
5.45M
    return XML_TOK_OPEN_PAREN;
1109
362k
  case BT_RPAR:
1110
362k
    ptr += MINBPC(enc);
1111
362k
    if (! HAS_CHAR(enc, ptr, end))
1112
101
      return -XML_TOK_CLOSE_PAREN;
1113
362k
    switch (BYTE_TYPE(enc, ptr)) {
1114
19.7k
    case BT_AST:
1115
19.7k
      *nextTokPtr = ptr + MINBPC(enc);
1116
19.7k
      return XML_TOK_CLOSE_PAREN_ASTERISK;
1117
7.80k
    case BT_QUEST:
1118
7.80k
      *nextTokPtr = ptr + MINBPC(enc);
1119
7.80k
      return XML_TOK_CLOSE_PAREN_QUESTION;
1120
8.84k
    case BT_PLUS:
1121
8.84k
      *nextTokPtr = ptr + MINBPC(enc);
1122
8.84k
      return XML_TOK_CLOSE_PAREN_PLUS;
1123
11.1k
    case BT_CR:
1124
11.6k
    case BT_LF:
1125
286k
    case BT_S:
1126
287k
    case BT_GT:
1127
288k
    case BT_COMMA:
1128
296k
    case BT_VERBAR:
1129
326k
    case BT_RPAR:
1130
326k
      *nextTokPtr = ptr;
1131
326k
      return XML_TOK_CLOSE_PAREN;
1132
362k
    }
1133
14
    *nextTokPtr = ptr;
1134
14
    return XML_TOK_INVALID;
1135
34.1k
  case BT_VERBAR:
1136
34.1k
    *nextTokPtr = ptr + MINBPC(enc);
1137
34.1k
    return XML_TOK_OR;
1138
37.0k
  case BT_GT:
1139
37.0k
    *nextTokPtr = ptr + MINBPC(enc);
1140
37.0k
    return XML_TOK_DECL_CLOSE;
1141
283k
  case BT_NUM:
1142
283k
    return PREFIX(scanPoundName)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1143
0
#  define LEAD_CASE(n)                                                         \
1144
8.38k
  case BT_LEAD##n:                                                             \
1145
8.38k
    if (end - ptr < n)                                                         \
1146
84
      return XML_TOK_PARTIAL_CHAR;                                             \
1147
8.32k
    if (IS_INVALID_CHAR(enc, ptr, n)) {                                        \
1148
84
      *nextTokPtr = ptr;                                                       \
1149
84
      return XML_TOK_INVALID;                                                  \
1150
84
    }                                                                          \
1151
8.32k
    if (IS_NMSTRT_CHAR(enc, ptr, n)) {                                         \
1152
2.80k
      ptr += n;                                                                \
1153
2.80k
      tok = XML_TOK_NAME;                                                      \
1154
2.80k
      break;                                                                   \
1155
2.80k
    }                                                                          \
1156
8.24k
    if (IS_NAME_CHAR(enc, ptr, n)) {                                           \
1157
5.35k
      ptr += n;                                                                \
1158
5.35k
      tok = XML_TOK_NMTOKEN;                                                   \
1159
5.35k
      break;                                                                   \
1160
5.35k
    }                                                                          \
1161
5.43k
    *nextTokPtr = ptr;                                                         \
1162
84
    return XML_TOK_INVALID;
1163
3.55k
    LEAD_CASE(2)
1164
26.5k
    LEAD_CASE(3)
1165
308
    LEAD_CASE(4)
1166
0
#  undef LEAD_CASE
1167
377k
  case BT_NMSTRT:
1168
690k
  case BT_HEX:
1169
690k
    tok = XML_TOK_NAME;
1170
690k
    ptr += MINBPC(enc);
1171
690k
    break;
1172
445
  case BT_DIGIT:
1173
1.06k
  case BT_NAME:
1174
2.10k
  case BT_MINUS:
1175
#  ifdef XML_NS
1176
  case BT_COLON:
1177
#  endif
1178
2.10k
    tok = XML_TOK_NMTOKEN;
1179
2.10k
    ptr += MINBPC(enc);
1180
2.10k
    break;
1181
199
  case BT_NONASCII:
1182
199
    if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {
1183
160
      ptr += MINBPC(enc);
1184
160
      tok = XML_TOK_NAME;
1185
160
      break;
1186
160
    }
1187
39
    if (IS_NAME_CHAR_MINBPC(enc, ptr)) {
1188
13
      ptr += MINBPC(enc);
1189
13
      tok = XML_TOK_NMTOKEN;
1190
13
      break;
1191
13
    }
1192
    /* fall through */
1193
79
  default:
1194
79
    *nextTokPtr = ptr;
1195
79
    return XML_TOK_INVALID;
1196
8.01M
  }
1197
12.3M
  while (HAS_CHAR(enc, ptr, end)) {
1198
12.3M
    switch (BYTE_TYPE(enc, ptr)) {
1199
31.0M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1200
11.5k
    case BT_GT:
1201
307k
    case BT_RPAR:
1202
307k
    case BT_COMMA:
1203
324k
    case BT_VERBAR:
1204
326k
    case BT_LSQB:
1205
326k
    case BT_PERCNT:
1206
376k
    case BT_S:
1207
673k
    case BT_CR:
1208
691k
    case BT_LF:
1209
691k
      *nextTokPtr = ptr;
1210
691k
      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
451
    case BT_PLUS:
1232
451
      if (tok == XML_TOK_NMTOKEN) {
1233
4
        *nextTokPtr = ptr;
1234
4
        return XML_TOK_INVALID;
1235
4
      }
1236
447
      *nextTokPtr = ptr + MINBPC(enc);
1237
447
      return XML_TOK_NAME_PLUS;
1238
7.53k
    case BT_AST:
1239
7.53k
      if (tok == XML_TOK_NMTOKEN) {
1240
1
        *nextTokPtr = ptr;
1241
1
        return XML_TOK_INVALID;
1242
1
      }
1243
7.53k
      *nextTokPtr = ptr + MINBPC(enc);
1244
7.53k
      return XML_TOK_NAME_ASTERISK;
1245
489
    case BT_QUEST:
1246
489
      if (tok == XML_TOK_NMTOKEN) {
1247
4
        *nextTokPtr = ptr;
1248
4
        return XML_TOK_INVALID;
1249
4
      }
1250
485
      *nextTokPtr = ptr + MINBPC(enc);
1251
485
      return XML_TOK_NAME_QUESTION;
1252
64
    default:
1253
64
      *nextTokPtr = ptr;
1254
64
      return XML_TOK_INVALID;
1255
12.3M
    }
1256
12.3M
  }
1257
777
  return -tok;
1258
700k
}
xmltok.c:normal_prologTok
Line
Count
Source
1018
8.02M
                  const char **nextTokPtr) {
1019
8.02M
  int tok;
1020
8.02M
  if (ptr >= end)
1021
7.18k
    return XML_TOK_NONE;
1022
8.01M
  if (MINBPC(enc) > 1) {
1023
0
    size_t n = end - ptr;
1024
0
    if (n & (MINBPC(enc) - 1)) {
1025
0
      n &= ~(MINBPC(enc) - 1);
1026
0
      if (n == 0)
1027
0
        return XML_TOK_PARTIAL;
1028
0
      end = ptr + n;
1029
0
    }
1030
0
  }
1031
8.01M
  switch (BYTE_TYPE(enc, ptr)) {
1032
7.59k
  case BT_QUOT:
1033
7.59k
    return PREFIX(scanLit)(BT_QUOT, enc, ptr + MINBPC(enc), end, nextTokPtr);
1034
29.9k
  case BT_APOS:
1035
29.9k
    return PREFIX(scanLit)(BT_APOS, enc, ptr + MINBPC(enc), end, nextTokPtr);
1036
57.3k
  case BT_LT: {
1037
57.3k
    ptr += MINBPC(enc);
1038
57.3k
    REQUIRE_CHAR(enc, ptr, end);
1039
57.3k
    switch (BYTE_TYPE(enc, ptr)) {
1040
42.3k
    case BT_EXCL:
1041
42.3k
      return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1042
9.28k
    case BT_QUEST:
1043
9.28k
      return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1044
4.33k
    case BT_NMSTRT:
1045
5.55k
    case BT_HEX:
1046
5.55k
    case BT_NONASCII:
1047
5.61k
    case BT_LEAD2:
1048
5.64k
    case BT_LEAD3:
1049
5.65k
    case BT_LEAD4:
1050
5.65k
      *nextTokPtr = ptr - MINBPC(enc);
1051
5.65k
      return XML_TOK_INSTANCE_START;
1052
57.3k
    }
1053
17
    *nextTokPtr = ptr;
1054
17
    return XML_TOK_INVALID;
1055
57.3k
  }
1056
366k
  case BT_CR:
1057
366k
    if (ptr + MINBPC(enc) == end) {
1058
429
      *nextTokPtr = end;
1059
      /* indicate that this might be part of a CR/LF pair */
1060
429
      return -XML_TOK_PROLOG_S;
1061
429
    }
1062
    /* fall through */
1063
975k
  case BT_S:
1064
1.02M
  case BT_LF:
1065
1.05M
    for (;;) {
1066
1.05M
      ptr += MINBPC(enc);
1067
1.05M
      if (! HAS_CHAR(enc, ptr, end))
1068
253
        break;
1069
1.05M
      switch (BYTE_TYPE(enc, ptr)) {
1070
5.77k
      case BT_S:
1071
23.9k
      case BT_LF:
1072
23.9k
        break;
1073
2.10k
      case BT_CR:
1074
        /* don't split CR/LF pair */
1075
2.10k
        if (ptr + MINBPC(enc) != end)
1076
1.90k
          break;
1077
        /* fall through */
1078
1.02M
      default:
1079
1.02M
        *nextTokPtr = ptr;
1080
1.02M
        return XML_TOK_PROLOG_S;
1081
1.05M
      }
1082
1.05M
    }
1083
253
    *nextTokPtr = ptr;
1084
253
    return XML_TOK_PROLOG_S;
1085
6.31k
  case BT_PERCNT:
1086
6.31k
    return PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1087
8.36k
  case BT_COMMA:
1088
8.36k
    *nextTokPtr = ptr + MINBPC(enc);
1089
8.36k
    return XML_TOK_COMMA;
1090
2.69k
  case BT_LSQB:
1091
2.69k
    *nextTokPtr = ptr + MINBPC(enc);
1092
2.69k
    return XML_TOK_OPEN_BRACKET;
1093
1.15k
  case BT_RSQB:
1094
1.15k
    ptr += MINBPC(enc);
1095
1.15k
    if (! HAS_CHAR(enc, ptr, end))
1096
17
      return -XML_TOK_CLOSE_BRACKET;
1097
1.14k
    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
2
        *nextTokPtr = ptr + 2 * MINBPC(enc);
1101
2
        return XML_TOK_COND_SECT_CLOSE;
1102
2
      }
1103
29
    }
1104
1.13k
    *nextTokPtr = ptr;
1105
1.13k
    return XML_TOK_CLOSE_BRACKET;
1106
5.45M
  case BT_LPAR:
1107
5.45M
    *nextTokPtr = ptr + MINBPC(enc);
1108
5.45M
    return XML_TOK_OPEN_PAREN;
1109
362k
  case BT_RPAR:
1110
362k
    ptr += MINBPC(enc);
1111
362k
    if (! HAS_CHAR(enc, ptr, end))
1112
101
      return -XML_TOK_CLOSE_PAREN;
1113
362k
    switch (BYTE_TYPE(enc, ptr)) {
1114
19.7k
    case BT_AST:
1115
19.7k
      *nextTokPtr = ptr + MINBPC(enc);
1116
19.7k
      return XML_TOK_CLOSE_PAREN_ASTERISK;
1117
7.80k
    case BT_QUEST:
1118
7.80k
      *nextTokPtr = ptr + MINBPC(enc);
1119
7.80k
      return XML_TOK_CLOSE_PAREN_QUESTION;
1120
8.84k
    case BT_PLUS:
1121
8.84k
      *nextTokPtr = ptr + MINBPC(enc);
1122
8.84k
      return XML_TOK_CLOSE_PAREN_PLUS;
1123
11.1k
    case BT_CR:
1124
11.6k
    case BT_LF:
1125
286k
    case BT_S:
1126
287k
    case BT_GT:
1127
288k
    case BT_COMMA:
1128
296k
    case BT_VERBAR:
1129
326k
    case BT_RPAR:
1130
326k
      *nextTokPtr = ptr;
1131
326k
      return XML_TOK_CLOSE_PAREN;
1132
362k
    }
1133
14
    *nextTokPtr = ptr;
1134
14
    return XML_TOK_INVALID;
1135
34.1k
  case BT_VERBAR:
1136
34.1k
    *nextTokPtr = ptr + MINBPC(enc);
1137
34.1k
    return XML_TOK_OR;
1138
37.0k
  case BT_GT:
1139
37.0k
    *nextTokPtr = ptr + MINBPC(enc);
1140
37.0k
    return XML_TOK_DECL_CLOSE;
1141
283k
  case BT_NUM:
1142
283k
    return PREFIX(scanPoundName)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1143
0
#  define LEAD_CASE(n)                                                         \
1144
0
  case BT_LEAD##n:                                                             \
1145
0
    if (end - ptr < n)                                                         \
1146
0
      return XML_TOK_PARTIAL_CHAR;                                             \
1147
0
    if (IS_INVALID_CHAR(enc, ptr, n)) {                                        \
1148
0
      *nextTokPtr = ptr;                                                       \
1149
0
      return XML_TOK_INVALID;                                                  \
1150
0
    }                                                                          \
1151
0
    if (IS_NMSTRT_CHAR(enc, ptr, n)) {                                         \
1152
0
      ptr += n;                                                                \
1153
0
      tok = XML_TOK_NAME;                                                      \
1154
0
      break;                                                                   \
1155
0
    }                                                                          \
1156
0
    if (IS_NAME_CHAR(enc, ptr, n)) {                                           \
1157
0
      ptr += n;                                                                \
1158
0
      tok = XML_TOK_NMTOKEN;                                                   \
1159
0
      break;                                                                   \
1160
0
    }                                                                          \
1161
0
    *nextTokPtr = ptr;                                                         \
1162
0
    return XML_TOK_INVALID;
1163
3.55k
    LEAD_CASE(2)
1164
26.5k
    LEAD_CASE(3)
1165
172
    LEAD_CASE(4)
1166
0
#  undef LEAD_CASE
1167
377k
  case BT_NMSTRT:
1168
690k
  case BT_HEX:
1169
690k
    tok = XML_TOK_NAME;
1170
690k
    ptr += MINBPC(enc);
1171
690k
    break;
1172
445
  case BT_DIGIT:
1173
1.06k
  case BT_NAME:
1174
2.10k
  case BT_MINUS:
1175
#  ifdef XML_NS
1176
  case BT_COLON:
1177
#  endif
1178
2.10k
    tok = XML_TOK_NMTOKEN;
1179
2.10k
    ptr += MINBPC(enc);
1180
2.10k
    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
43
  default:
1194
43
    *nextTokPtr = ptr;
1195
43
    return XML_TOK_INVALID;
1196
8.01M
  }
1197
12.3M
  while (HAS_CHAR(enc, ptr, end)) {
1198
12.3M
    switch (BYTE_TYPE(enc, ptr)) {
1199
30.9M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1200
11.5k
    case BT_GT:
1201
307k
    case BT_RPAR:
1202
307k
    case BT_COMMA:
1203
324k
    case BT_VERBAR:
1204
326k
    case BT_LSQB:
1205
326k
    case BT_PERCNT:
1206
376k
    case BT_S:
1207
673k
    case BT_CR:
1208
691k
    case BT_LF:
1209
691k
      *nextTokPtr = ptr;
1210
691k
      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
451
    case BT_PLUS:
1232
451
      if (tok == XML_TOK_NMTOKEN) {
1233
4
        *nextTokPtr = ptr;
1234
4
        return XML_TOK_INVALID;
1235
4
      }
1236
447
      *nextTokPtr = ptr + MINBPC(enc);
1237
447
      return XML_TOK_NAME_PLUS;
1238
7.53k
    case BT_AST:
1239
7.53k
      if (tok == XML_TOK_NMTOKEN) {
1240
1
        *nextTokPtr = ptr;
1241
1
        return XML_TOK_INVALID;
1242
1
      }
1243
7.53k
      *nextTokPtr = ptr + MINBPC(enc);
1244
7.53k
      return XML_TOK_NAME_ASTERISK;
1245
489
    case BT_QUEST:
1246
489
      if (tok == XML_TOK_NMTOKEN) {
1247
4
        *nextTokPtr = ptr;
1248
4
        return XML_TOK_INVALID;
1249
4
      }
1250
485
      *nextTokPtr = ptr + MINBPC(enc);
1251
485
      return XML_TOK_NAME_QUESTION;
1252
47
    default:
1253
47
      *nextTokPtr = ptr;
1254
47
      return XML_TOK_INVALID;
1255
12.3M
    }
1256
12.3M
  }
1257
735
  return -tok;
1258
700k
}
xmltok.c:little2_prologTok
Line
Count
Source
1018
135
                  const char **nextTokPtr) {
1019
135
  int tok;
1020
135
  if (ptr >= end)
1021
2
    return XML_TOK_NONE;
1022
133
  if (MINBPC(enc) > 1) {
1023
133
    size_t n = end - ptr;
1024
133
    if (n & (MINBPC(enc) - 1)) {
1025
26
      n &= ~(MINBPC(enc) - 1);
1026
26
      if (n == 0)
1027
2
        return XML_TOK_PARTIAL;
1028
24
      end = ptr + n;
1029
24
    }
1030
133
  }
1031
131
  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
76
    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
101
  case BT_NONASCII:
1182
101
    if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {
1183
81
      ptr += MINBPC(enc);
1184
81
      tok = XML_TOK_NAME;
1185
81
      break;
1186
81
    }
1187
20
    if (IS_NAME_CHAR_MINBPC(enc, ptr)) {
1188
7
      ptr += MINBPC(enc);
1189
7
      tok = XML_TOK_NMTOKEN;
1190
7
      break;
1191
7
    }
1192
    /* fall through */
1193
18
  default:
1194
18
    *nextTokPtr = ptr;
1195
18
    return XML_TOK_INVALID;
1196
131
  }
1197
938
  while (HAS_CHAR(enc, ptr, end)) {
1198
938
    switch (BYTE_TYPE(enc, ptr)) {
1199
4.44k
      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
938
    }
1256
938
  }
1257
22
  return -tok;
1258
88
}
xmltok.c:big2_prologTok
Line
Count
Source
1018
128
                  const char **nextTokPtr) {
1019
128
  int tok;
1020
128
  if (ptr >= end)
1021
2
    return XML_TOK_NONE;
1022
126
  if (MINBPC(enc) > 1) {
1023
126
    size_t n = end - ptr;
1024
126
    if (n & (MINBPC(enc) - 1)) {
1025
19
      n &= ~(MINBPC(enc) - 1);
1026
19
      if (n == 0)
1027
2
        return XML_TOK_PARTIAL;
1028
17
      end = ptr + n;
1029
17
    }
1030
126
  }
1031
124
  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
98
  case BT_NONASCII:
1182
98
    if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {
1183
79
      ptr += MINBPC(enc);
1184
79
      tok = XML_TOK_NAME;
1185
79
      break;
1186
79
    }
1187
19
    if (IS_NAME_CHAR_MINBPC(enc, ptr)) {
1188
6
      ptr += MINBPC(enc);
1189
6
      tok = XML_TOK_NMTOKEN;
1190
6
      break;
1191
6
    }
1192
    /* fall through */
1193
18
  default:
1194
18
    *nextTokPtr = ptr;
1195
18
    return XML_TOK_INVALID;
1196
124
  }
1197
12.6k
  while (HAS_CHAR(enc, ptr, end)) {
1198
12.6k
    switch (BYTE_TYPE(enc, ptr)) {
1199
63.2k
      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
12.6k
    }
1256
12.6k
  }
1257
20
  return -tok;
1258
85
}
1259
1260
static int PTRCALL
1261
PREFIX(attributeValueTok)(const ENCODING *enc, const char *ptr, const char *end,
1262
1.63M
                          const char **nextTokPtr) {
1263
1.63M
  const char *start;
1264
1.63M
  if (ptr >= end)
1265
73.3k
    return XML_TOK_NONE;
1266
1.56M
  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.56M
  start = ptr;
1275
17.4M
  while (HAS_CHAR(enc, ptr, end)) {
1276
17.4M
    switch (BYTE_TYPE(enc, ptr)) {
1277
0
#  define LEAD_CASE(n)                                                         \
1278
132k
  case BT_LEAD##n:                                                             \
1279
132k
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1280
132k
    break;
1281
35.3k
      LEAD_CASE(2)
1282
43.8k
      LEAD_CASE(3)
1283
53.6k
      LEAD_CASE(4)
1284
0
#  undef LEAD_CASE
1285
124k
    case BT_AMP:
1286
124k
      if (ptr == start)
1287
95.4k
        return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1288
29.0k
      *nextTokPtr = ptr;
1289
29.0k
      return XML_TOK_DATA_CHARS;
1290
4
    case BT_LT:
1291
      /* this is for inside entity references */
1292
4
      *nextTokPtr = ptr;
1293
4
      return XML_TOK_INVALID;
1294
510k
    case BT_LF:
1295
510k
      if (ptr == start) {
1296
426k
        *nextTokPtr = ptr + MINBPC(enc);
1297
426k
        return XML_TOK_DATA_NEWLINE;
1298
426k
      }
1299
83.8k
      *nextTokPtr = ptr;
1300
83.8k
      return XML_TOK_DATA_CHARS;
1301
673k
    case BT_CR:
1302
673k
      if (ptr == start) {
1303
535k
        ptr += MINBPC(enc);
1304
535k
        if (! HAS_CHAR(enc, ptr, end))
1305
3.95k
          return XML_TOK_TRAILING_CR;
1306
531k
        if (BYTE_TYPE(enc, ptr) == BT_LF)
1307
190k
          ptr += MINBPC(enc);
1308
531k
        *nextTokPtr = ptr;
1309
531k
        return XML_TOK_DATA_NEWLINE;
1310
535k
      }
1311
138k
      *nextTokPtr = ptr;
1312
138k
      return XML_TOK_DATA_CHARS;
1313
194k
    case BT_S:
1314
194k
      if (ptr == start) {
1315
117k
        *nextTokPtr = ptr + MINBPC(enc);
1316
117k
        return XML_TOK_ATTRIBUTE_VALUE_S;
1317
117k
      }
1318
76.8k
      *nextTokPtr = ptr;
1319
76.8k
      return XML_TOK_DATA_CHARS;
1320
15.8M
    default:
1321
15.8M
      ptr += MINBPC(enc);
1322
15.8M
      break;
1323
17.4M
    }
1324
17.4M
  }
1325
56.7k
  *nextTokPtr = ptr;
1326
56.7k
  return XML_TOK_DATA_CHARS;
1327
1.56M
}
xmltok.c:normal_attributeValueTok
Line
Count
Source
1262
1.63M
                          const char **nextTokPtr) {
1263
1.63M
  const char *start;
1264
1.63M
  if (ptr >= end)
1265
73.3k
    return XML_TOK_NONE;
1266
1.56M
  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.56M
  start = ptr;
1275
17.4M
  while (HAS_CHAR(enc, ptr, end)) {
1276
17.4M
    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
35.3k
      LEAD_CASE(2)
1282
43.8k
      LEAD_CASE(3)
1283
53.6k
      LEAD_CASE(4)
1284
0
#  undef LEAD_CASE
1285
124k
    case BT_AMP:
1286
124k
      if (ptr == start)
1287
95.4k
        return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1288
29.0k
      *nextTokPtr = ptr;
1289
29.0k
      return XML_TOK_DATA_CHARS;
1290
4
    case BT_LT:
1291
      /* this is for inside entity references */
1292
4
      *nextTokPtr = ptr;
1293
4
      return XML_TOK_INVALID;
1294
510k
    case BT_LF:
1295
510k
      if (ptr == start) {
1296
426k
        *nextTokPtr = ptr + MINBPC(enc);
1297
426k
        return XML_TOK_DATA_NEWLINE;
1298
426k
      }
1299
83.8k
      *nextTokPtr = ptr;
1300
83.8k
      return XML_TOK_DATA_CHARS;
1301
673k
    case BT_CR:
1302
673k
      if (ptr == start) {
1303
535k
        ptr += MINBPC(enc);
1304
535k
        if (! HAS_CHAR(enc, ptr, end))
1305
3.95k
          return XML_TOK_TRAILING_CR;
1306
531k
        if (BYTE_TYPE(enc, ptr) == BT_LF)
1307
190k
          ptr += MINBPC(enc);
1308
531k
        *nextTokPtr = ptr;
1309
531k
        return XML_TOK_DATA_NEWLINE;
1310
535k
      }
1311
138k
      *nextTokPtr = ptr;
1312
138k
      return XML_TOK_DATA_CHARS;
1313
194k
    case BT_S:
1314
194k
      if (ptr == start) {
1315
117k
        *nextTokPtr = ptr + MINBPC(enc);
1316
117k
        return XML_TOK_ATTRIBUTE_VALUE_S;
1317
117k
      }
1318
76.8k
      *nextTokPtr = ptr;
1319
76.8k
      return XML_TOK_DATA_CHARS;
1320
15.8M
    default:
1321
15.8M
      ptr += MINBPC(enc);
1322
15.8M
      break;
1323
17.4M
    }
1324
17.4M
  }
1325
56.7k
  *nextTokPtr = ptr;
1326
56.7k
  return XML_TOK_DATA_CHARS;
1327
1.56M
}
Unexecuted instantiation: xmltok.c:little2_attributeValueTok
Unexecuted instantiation: xmltok.c:big2_attributeValueTok
1328
1329
static int PTRCALL
1330
PREFIX(entityValueTok)(const ENCODING *enc, const char *ptr, const char *end,
1331
0
                       const char **nextTokPtr) {
1332
0
  const char *start;
1333
0
  if (ptr >= end)
1334
0
    return XML_TOK_NONE;
1335
0
  else if (! HAS_CHAR(enc, ptr, end)) {
1336
    /* This line cannot be executed.  The incoming data has already
1337
     * been tokenized once, so incomplete characters like this have
1338
     * already been eliminated from the input.  Retaining the paranoia
1339
     * check is still valuable, however.
1340
     */
1341
0
    return XML_TOK_PARTIAL; /* LCOV_EXCL_LINE */
1342
0
  }
1343
0
  start = ptr;
1344
0
  while (HAS_CHAR(enc, ptr, end)) {
1345
0
    switch (BYTE_TYPE(enc, ptr)) {
1346
0
#  define LEAD_CASE(n)                                                         \
1347
0
  case BT_LEAD##n:                                                             \
1348
0
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1349
0
    break;
1350
0
      LEAD_CASE(2)
1351
0
      LEAD_CASE(3)
1352
0
      LEAD_CASE(4)
1353
0
#  undef LEAD_CASE
1354
0
    case BT_AMP:
1355
0
      if (ptr == start)
1356
0
        return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1357
0
      *nextTokPtr = ptr;
1358
0
      return XML_TOK_DATA_CHARS;
1359
0
    case BT_PERCNT:
1360
0
      if (ptr == start) {
1361
0
        int tok = PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1362
0
        return (tok == XML_TOK_PERCENT) ? XML_TOK_INVALID : tok;
1363
0
      }
1364
0
      *nextTokPtr = ptr;
1365
0
      return XML_TOK_DATA_CHARS;
1366
0
    case BT_LF:
1367
0
      if (ptr == start) {
1368
0
        *nextTokPtr = ptr + MINBPC(enc);
1369
0
        return XML_TOK_DATA_NEWLINE;
1370
0
      }
1371
0
      *nextTokPtr = ptr;
1372
0
      return XML_TOK_DATA_CHARS;
1373
0
    case BT_CR:
1374
0
      if (ptr == start) {
1375
0
        ptr += MINBPC(enc);
1376
0
        if (! HAS_CHAR(enc, ptr, end))
1377
0
          return XML_TOK_TRAILING_CR;
1378
0
        if (BYTE_TYPE(enc, ptr) == BT_LF)
1379
0
          ptr += MINBPC(enc);
1380
0
        *nextTokPtr = ptr;
1381
0
        return XML_TOK_DATA_NEWLINE;
1382
0
      }
1383
0
      *nextTokPtr = ptr;
1384
0
      return XML_TOK_DATA_CHARS;
1385
0
    default:
1386
0
      ptr += MINBPC(enc);
1387
0
      break;
1388
0
    }
1389
0
  }
1390
0
  *nextTokPtr = ptr;
1391
0
  return XML_TOK_DATA_CHARS;
1392
0
}
Unexecuted instantiation: xmltok.c:normal_entityValueTok
Unexecuted instantiation: xmltok.c:little2_entityValueTok
Unexecuted instantiation: xmltok.c:big2_entityValueTok
1393
1394
#  ifdef XML_DTD
1395
1396
static int PTRCALL
1397
PREFIX(ignoreSectionTok)(const ENCODING *enc, const char *ptr, const char *end,
1398
                         const char **nextTokPtr) {
1399
  int level = 0;
1400
  if (MINBPC(enc) > 1) {
1401
    size_t n = end - ptr;
1402
    if (n & (MINBPC(enc) - 1)) {
1403
      n &= ~(MINBPC(enc) - 1);
1404
      end = ptr + n;
1405
    }
1406
  }
1407
  while (HAS_CHAR(enc, ptr, end)) {
1408
    switch (BYTE_TYPE(enc, ptr)) {
1409
      INVALID_CASES(ptr, nextTokPtr)
1410
    case BT_LT:
1411
      ptr += MINBPC(enc);
1412
      REQUIRE_CHAR(enc, ptr, end);
1413
      if (CHAR_MATCHES(enc, ptr, ASCII_EXCL)) {
1414
        ptr += MINBPC(enc);
1415
        REQUIRE_CHAR(enc, ptr, end);
1416
        if (CHAR_MATCHES(enc, ptr, ASCII_LSQB)) {
1417
          ++level;
1418
          ptr += MINBPC(enc);
1419
        }
1420
      }
1421
      break;
1422
    case BT_RSQB:
1423
      ptr += MINBPC(enc);
1424
      REQUIRE_CHAR(enc, ptr, end);
1425
      if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) {
1426
        ptr += MINBPC(enc);
1427
        REQUIRE_CHAR(enc, ptr, end);
1428
        if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
1429
          ptr += MINBPC(enc);
1430
          if (level == 0) {
1431
            *nextTokPtr = ptr;
1432
            return XML_TOK_IGNORE_SECT;
1433
          }
1434
          --level;
1435
        }
1436
      }
1437
      break;
1438
    default:
1439
      ptr += MINBPC(enc);
1440
      break;
1441
    }
1442
  }
1443
  return XML_TOK_PARTIAL;
1444
}
1445
1446
#  endif /* XML_DTD */
1447
1448
static int PTRCALL
1449
PREFIX(isPublicId)(const ENCODING *enc, const char *ptr, const char *end,
1450
3.19k
                   const char **badPtr) {
1451
3.19k
  ptr += MINBPC(enc);
1452
3.19k
  end -= MINBPC(enc);
1453
815k
  for (; HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
1454
815k
    switch (BYTE_TYPE(enc, ptr)) {
1455
348k
    case BT_DIGIT:
1456
534k
    case BT_HEX:
1457
535k
    case BT_MINUS:
1458
536k
    case BT_APOS:
1459
536k
    case BT_LPAR:
1460
593k
    case BT_RPAR:
1461
594k
    case BT_PLUS:
1462
595k
    case BT_COMMA:
1463
679k
    case BT_SOL:
1464
680k
    case BT_EQUALS:
1465
686k
    case BT_QUEST:
1466
689k
    case BT_CR:
1467
690k
    case BT_LF:
1468
691k
    case BT_SEMI:
1469
691k
    case BT_EXCL:
1470
693k
    case BT_AST:
1471
697k
    case BT_PERCNT:
1472
706k
    case BT_NUM:
1473
#  ifdef XML_NS
1474
    case BT_COLON:
1475
#  endif
1476
706k
      break;
1477
2.26k
    case BT_S:
1478
2.26k
      if (CHAR_MATCHES(enc, ptr, ASCII_TAB)) {
1479
1
        *badPtr = ptr;
1480
1
        return 0;
1481
1
      }
1482
2.26k
      break;
1483
4.67k
    case BT_NAME:
1484
104k
    case BT_NMSTRT:
1485
104k
      if (! (BYTE_TO_ASCII(enc, ptr) & ~0x7f))
1486
104k
        break;
1487
      /* fall through */
1488
2.16k
    default:
1489
2.16k
      switch (BYTE_TO_ASCII(enc, ptr)) {
1490
1.88k
      case 0x24: /* $ */
1491
2.14k
      case 0x40: /* @ */
1492
2.14k
        break;
1493
13
      default:
1494
13
        *badPtr = ptr;
1495
13
        return 0;
1496
2.16k
      }
1497
2.14k
      break;
1498
815k
    }
1499
815k
  }
1500
3.17k
  return 1;
1501
3.19k
}
xmltok.c:normal_isPublicId
Line
Count
Source
1450
3.19k
                   const char **badPtr) {
1451
3.19k
  ptr += MINBPC(enc);
1452
3.19k
  end -= MINBPC(enc);
1453
815k
  for (; HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
1454
815k
    switch (BYTE_TYPE(enc, ptr)) {
1455
348k
    case BT_DIGIT:
1456
534k
    case BT_HEX:
1457
535k
    case BT_MINUS:
1458
536k
    case BT_APOS:
1459
536k
    case BT_LPAR:
1460
593k
    case BT_RPAR:
1461
594k
    case BT_PLUS:
1462
595k
    case BT_COMMA:
1463
679k
    case BT_SOL:
1464
680k
    case BT_EQUALS:
1465
686k
    case BT_QUEST:
1466
689k
    case BT_CR:
1467
690k
    case BT_LF:
1468
691k
    case BT_SEMI:
1469
691k
    case BT_EXCL:
1470
693k
    case BT_AST:
1471
697k
    case BT_PERCNT:
1472
706k
    case BT_NUM:
1473
#  ifdef XML_NS
1474
    case BT_COLON:
1475
#  endif
1476
706k
      break;
1477
2.26k
    case BT_S:
1478
2.26k
      if (CHAR_MATCHES(enc, ptr, ASCII_TAB)) {
1479
1
        *badPtr = ptr;
1480
1
        return 0;
1481
1
      }
1482
2.26k
      break;
1483
4.67k
    case BT_NAME:
1484
104k
    case BT_NMSTRT:
1485
104k
      if (! (BYTE_TO_ASCII(enc, ptr) & ~0x7f))
1486
104k
        break;
1487
      /* fall through */
1488
2.16k
    default:
1489
2.16k
      switch (BYTE_TO_ASCII(enc, ptr)) {
1490
1.88k
      case 0x24: /* $ */
1491
2.14k
      case 0x40: /* @ */
1492
2.14k
        break;
1493
13
      default:
1494
13
        *badPtr = ptr;
1495
13
        return 0;
1496
2.16k
      }
1497
2.14k
      break;
1498
815k
    }
1499
815k
  }
1500
3.17k
  return 1;
1501
3.19k
}
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
780k
                ATTRIBUTE *atts) {
1511
780k
  enum { other, inName, inValue } state = inName;
1512
780k
  int nAtts = 0;
1513
780k
  int open = 0; /* defined when state == inValue;
1514
                   initialization just to shut up compilers */
1515
1516
54.3M
  for (ptr += MINBPC(enc);; ptr += MINBPC(enc)) {
1517
54.3M
    switch (BYTE_TYPE(enc, ptr)) {
1518
0
#  define START_NAME                                                           \
1519
29.8M
    if (state == other) {                                                      \
1520
4.97M
      if (nAtts < attsMax) {                                                   \
1521
2.55M
        atts[nAtts].name = ptr;                                                \
1522
2.55M
        atts[nAtts].normalized = 1;                                            \
1523
2.55M
      }                                                                        \
1524
4.97M
      state = inName;                                                          \
1525
4.97M
    }
1526
0
#  define LEAD_CASE(n)                                                         \
1527
249k
  case BT_LEAD##n: /* NOTE: The encoding has already been validated. */        \
1528
249k
    START_NAME ptr += (n - MINBPC(enc));                                       \
1529
249k
    break;
1530
129k
      LEAD_CASE(2)
1531
87.9k
      LEAD_CASE(3)
1532
32.2k
      LEAD_CASE(4)
1533
0
#  undef LEAD_CASE
1534
0
    case BT_NONASCII:
1535
27.7M
    case BT_NMSTRT:
1536
29.6M
    case BT_HEX:
1537
29.6M
      START_NAME
1538
29.6M
      break;
1539
0
#  undef START_NAME
1540
730k
    case BT_QUOT:
1541
730k
      if (state != inValue) {
1542
289k
        if (nAtts < attsMax)
1543
205k
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1544
289k
        state = inValue;
1545
289k
        open = BT_QUOT;
1546
441k
      } else if (open == BT_QUOT) {
1547
289k
        state = other;
1548
289k
        if (nAtts < attsMax)
1549
205k
          atts[nAtts].valueEnd = ptr;
1550
289k
        nAtts++;
1551
289k
      }
1552
730k
      break;
1553
9.39M
    case BT_APOS:
1554
9.39M
      if (state != inValue) {
1555
4.68M
        if (nAtts < attsMax)
1556
2.35M
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1557
4.68M
        state = inValue;
1558
4.68M
        open = BT_APOS;
1559
4.70M
      } else if (open == BT_APOS) {
1560
4.68M
        state = other;
1561
4.68M
        if (nAtts < attsMax)
1562
2.35M
          atts[nAtts].valueEnd = ptr;
1563
4.68M
        nAtts++;
1564
4.68M
      }
1565
9.39M
      break;
1566
39.1k
    case BT_AMP:
1567
39.1k
      if (nAtts < attsMax)
1568
38.6k
        atts[nAtts].normalized = 0;
1569
39.1k
      break;
1570
3.27M
    case BT_S:
1571
3.27M
      if (state == inName)
1572
75.9k
        state = other;
1573
3.20M
      else if (state == inValue && nAtts < attsMax && atts[nAtts].normalized
1574
114k
               && (ptr == atts[nAtts].valuePtr
1575
17.2k
                   || BYTE_TO_ASCII(enc, ptr) != ASCII_SPACE
1576
8.50k
                   || BYTE_TO_ASCII(enc, ptr + MINBPC(enc)) == ASCII_SPACE
1577
7.48k
                   || BYTE_TYPE(enc, ptr + MINBPC(enc)) == open))
1578
107k
        atts[nAtts].normalized = 0;
1579
3.27M
      break;
1580
2.92M
    case BT_CR:
1581
3.65M
    case BT_LF:
1582
      /* This case ensures that the first attribute name is counted
1583
         Apart from that we could just change state on the quote. */
1584
3.65M
      if (state == inName)
1585
39.4k
        state = other;
1586
3.61M
      else if (state == inValue && nAtts < attsMax)
1587
1.00M
        atts[nAtts].normalized = 0;
1588
3.65M
      break;
1589
686k
    case BT_GT:
1590
806k
    case BT_SOL:
1591
806k
      if (state != inValue)
1592
780k
        return nAtts;
1593
25.8k
      break;
1594
6.54M
    default:
1595
6.54M
      break;
1596
54.3M
    }
1597
54.3M
  }
1598
  /* not reached */
1599
780k
}
xmltok.c:normal_getAtts
Line
Count
Source
1510
780k
                ATTRIBUTE *atts) {
1511
780k
  enum { other, inName, inValue } state = inName;
1512
780k
  int nAtts = 0;
1513
780k
  int open = 0; /* defined when state == inValue;
1514
                   initialization just to shut up compilers */
1515
1516
54.3M
  for (ptr += MINBPC(enc);; ptr += MINBPC(enc)) {
1517
54.3M
    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
129k
      LEAD_CASE(2)
1531
87.9k
      LEAD_CASE(3)
1532
32.2k
      LEAD_CASE(4)
1533
0
#  undef LEAD_CASE
1534
0
    case BT_NONASCII:
1535
27.7M
    case BT_NMSTRT:
1536
29.6M
    case BT_HEX:
1537
29.6M
      START_NAME
1538
29.6M
      break;
1539
0
#  undef START_NAME
1540
730k
    case BT_QUOT:
1541
730k
      if (state != inValue) {
1542
289k
        if (nAtts < attsMax)
1543
205k
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1544
289k
        state = inValue;
1545
289k
        open = BT_QUOT;
1546
441k
      } else if (open == BT_QUOT) {
1547
289k
        state = other;
1548
289k
        if (nAtts < attsMax)
1549
205k
          atts[nAtts].valueEnd = ptr;
1550
289k
        nAtts++;
1551
289k
      }
1552
730k
      break;
1553
9.39M
    case BT_APOS:
1554
9.39M
      if (state != inValue) {
1555
4.68M
        if (nAtts < attsMax)
1556
2.35M
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1557
4.68M
        state = inValue;
1558
4.68M
        open = BT_APOS;
1559
4.70M
      } else if (open == BT_APOS) {
1560
4.68M
        state = other;
1561
4.68M
        if (nAtts < attsMax)
1562
2.35M
          atts[nAtts].valueEnd = ptr;
1563
4.68M
        nAtts++;
1564
4.68M
      }
1565
9.39M
      break;
1566
39.1k
    case BT_AMP:
1567
39.1k
      if (nAtts < attsMax)
1568
38.6k
        atts[nAtts].normalized = 0;
1569
39.1k
      break;
1570
3.27M
    case BT_S:
1571
3.27M
      if (state == inName)
1572
75.9k
        state = other;
1573
3.20M
      else if (state == inValue && nAtts < attsMax && atts[nAtts].normalized
1574
114k
               && (ptr == atts[nAtts].valuePtr
1575
17.2k
                   || BYTE_TO_ASCII(enc, ptr) != ASCII_SPACE
1576
8.50k
                   || BYTE_TO_ASCII(enc, ptr + MINBPC(enc)) == ASCII_SPACE
1577
7.48k
                   || BYTE_TYPE(enc, ptr + MINBPC(enc)) == open))
1578
107k
        atts[nAtts].normalized = 0;
1579
3.27M
      break;
1580
2.92M
    case BT_CR:
1581
3.65M
    case BT_LF:
1582
      /* This case ensures that the first attribute name is counted
1583
         Apart from that we could just change state on the quote. */
1584
3.65M
      if (state == inName)
1585
39.4k
        state = other;
1586
3.61M
      else if (state == inValue && nAtts < attsMax)
1587
1.00M
        atts[nAtts].normalized = 0;
1588
3.65M
      break;
1589
686k
    case BT_GT:
1590
806k
    case BT_SOL:
1591
806k
      if (state != inValue)
1592
780k
        return nAtts;
1593
25.8k
      break;
1594
6.54M
    default:
1595
6.54M
      break;
1596
54.3M
    }
1597
54.3M
  }
1598
  /* not reached */
1599
780k
}
Unexecuted instantiation: xmltok.c:little2_getAtts
Unexecuted instantiation: xmltok.c:big2_getAtts
1600
1601
static int PTRFASTCALL
1602
57.8k
PREFIX(charRefNumber)(const ENCODING *enc, const char *ptr) {
1603
57.8k
  int result = 0;
1604
  /* skip &# */
1605
57.8k
  UNUSED_P(enc);
1606
57.8k
  ptr += 2 * MINBPC(enc);
1607
57.8k
  if (CHAR_MATCHES(enc, ptr, ASCII_x)) {
1608
211k
    for (ptr += MINBPC(enc); ! CHAR_MATCHES(enc, ptr, ASCII_SEMI);
1609
165k
         ptr += MINBPC(enc)) {
1610
165k
      int c = BYTE_TO_ASCII(enc, ptr);
1611
165k
      switch (c) {
1612
6.69k
      case ASCII_0:
1613
19.7k
      case ASCII_1:
1614
36.8k
      case ASCII_2:
1615
39.7k
      case ASCII_3:
1616
59.4k
      case ASCII_4:
1617
74.4k
      case ASCII_5:
1618
75.7k
      case ASCII_6:
1619
85.7k
      case ASCII_7:
1620
99.8k
      case ASCII_8:
1621
103k
      case ASCII_9:
1622
103k
        result <<= 4;
1623
103k
        result |= (c - ASCII_0);
1624
103k
        break;
1625
14.8k
      case ASCII_A:
1626
15.3k
      case ASCII_B:
1627
16.6k
      case ASCII_C:
1628
18.8k
      case ASCII_D:
1629
19.8k
      case ASCII_E:
1630
34.1k
      case ASCII_F:
1631
34.1k
        result <<= 4;
1632
34.1k
        result += 10 + (c - ASCII_A);
1633
34.1k
        break;
1634
466
      case ASCII_a:
1635
7.27k
      case ASCII_b:
1636
8.25k
      case ASCII_c:
1637
21.6k
      case ASCII_d:
1638
22.3k
      case ASCII_e:
1639
27.3k
      case ASCII_f:
1640
27.3k
        result <<= 4;
1641
27.3k
        result += 10 + (c - ASCII_a);
1642
27.3k
        break;
1643
165k
      }
1644
165k
      if (result >= 0x110000)
1645
12
        return -1;
1646
165k
    }
1647
45.9k
  } else {
1648
60.9k
    for (; ! CHAR_MATCHES(enc, ptr, ASCII_SEMI); ptr += MINBPC(enc)) {
1649
49.1k
      int c = BYTE_TO_ASCII(enc, ptr);
1650
49.1k
      result *= 10;
1651
49.1k
      result += (c - ASCII_0);
1652
49.1k
      if (result >= 0x110000)
1653
3
        return -1;
1654
49.1k
    }
1655
11.8k
  }
1656
57.7k
  return checkCharRefNumber(result);
1657
57.8k
}
xmltok.c:normal_charRefNumber
Line
Count
Source
1602
57.8k
PREFIX(charRefNumber)(const ENCODING *enc, const char *ptr) {
1603
57.8k
  int result = 0;
1604
  /* skip &# */
1605
57.8k
  UNUSED_P(enc);
1606
57.8k
  ptr += 2 * MINBPC(enc);
1607
57.8k
  if (CHAR_MATCHES(enc, ptr, ASCII_x)) {
1608
211k
    for (ptr += MINBPC(enc); ! CHAR_MATCHES(enc, ptr, ASCII_SEMI);
1609
165k
         ptr += MINBPC(enc)) {
1610
165k
      int c = BYTE_TO_ASCII(enc, ptr);
1611
165k
      switch (c) {
1612
6.69k
      case ASCII_0:
1613
19.7k
      case ASCII_1:
1614
36.8k
      case ASCII_2:
1615
39.7k
      case ASCII_3:
1616
59.4k
      case ASCII_4:
1617
74.4k
      case ASCII_5:
1618
75.7k
      case ASCII_6:
1619
85.7k
      case ASCII_7:
1620
99.8k
      case ASCII_8:
1621
103k
      case ASCII_9:
1622
103k
        result <<= 4;
1623
103k
        result |= (c - ASCII_0);
1624
103k
        break;
1625
14.8k
      case ASCII_A:
1626
15.3k
      case ASCII_B:
1627
16.6k
      case ASCII_C:
1628
18.8k
      case ASCII_D:
1629
19.8k
      case ASCII_E:
1630
34.1k
      case ASCII_F:
1631
34.1k
        result <<= 4;
1632
34.1k
        result += 10 + (c - ASCII_A);
1633
34.1k
        break;
1634
466
      case ASCII_a:
1635
7.27k
      case ASCII_b:
1636
8.25k
      case ASCII_c:
1637
21.6k
      case ASCII_d:
1638
22.3k
      case ASCII_e:
1639
27.3k
      case ASCII_f:
1640
27.3k
        result <<= 4;
1641
27.3k
        result += 10 + (c - ASCII_a);
1642
27.3k
        break;
1643
165k
      }
1644
165k
      if (result >= 0x110000)
1645
12
        return -1;
1646
165k
    }
1647
45.9k
  } else {
1648
60.9k
    for (; ! CHAR_MATCHES(enc, ptr, ASCII_SEMI); ptr += MINBPC(enc)) {
1649
49.1k
      int c = BYTE_TO_ASCII(enc, ptr);
1650
49.1k
      result *= 10;
1651
49.1k
      result += (c - ASCII_0);
1652
49.1k
      if (result >= 0x110000)
1653
3
        return -1;
1654
49.1k
    }
1655
11.8k
  }
1656
57.7k
  return checkCharRefNumber(result);
1657
57.8k
}
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
152k
                             const char *end) {
1662
152k
  UNUSED_P(enc);
1663
152k
  switch ((end - ptr) / MINBPC(enc)) {
1664
17.0k
  case 2:
1665
17.0k
    if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_t)) {
1666
1.19k
      switch (BYTE_TO_ASCII(enc, ptr)) {
1667
758
      case ASCII_l:
1668
758
        return ASCII_LT;
1669
172
      case ASCII_g:
1670
172
        return ASCII_GT;
1671
1.19k
      }
1672
1.19k
    }
1673
16.1k
    break;
1674
30.5k
  case 3:
1675
30.5k
    if (CHAR_MATCHES(enc, ptr, ASCII_a)) {
1676
29.1k
      ptr += MINBPC(enc);
1677
29.1k
      if (CHAR_MATCHES(enc, ptr, ASCII_m)) {
1678
26.1k
        ptr += MINBPC(enc);
1679
26.1k
        if (CHAR_MATCHES(enc, ptr, ASCII_p))
1680
25.9k
          return ASCII_AMP;
1681
26.1k
      }
1682
29.1k
    }
1683
4.54k
    break;
1684
5.26k
  case 4:
1685
5.26k
    switch (BYTE_TO_ASCII(enc, ptr)) {
1686
1.23k
    case ASCII_q:
1687
1.23k
      ptr += MINBPC(enc);
1688
1.23k
      if (CHAR_MATCHES(enc, ptr, ASCII_u)) {
1689
801
        ptr += MINBPC(enc);
1690
801
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1691
585
          ptr += MINBPC(enc);
1692
585
          if (CHAR_MATCHES(enc, ptr, ASCII_t))
1693
382
            return ASCII_QUOT;
1694
585
        }
1695
801
      }
1696
856
      break;
1697
2.37k
    case ASCII_a:
1698
2.37k
      ptr += MINBPC(enc);
1699
2.37k
      if (CHAR_MATCHES(enc, ptr, ASCII_p)) {
1700
840
        ptr += MINBPC(enc);
1701
840
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1702
589
          ptr += MINBPC(enc);
1703
589
          if (CHAR_MATCHES(enc, ptr, ASCII_s))
1704
365
            return ASCII_APOS;
1705
589
        }
1706
840
      }
1707
2.00k
      break;
1708
5.26k
    }
1709
152k
  }
1710
124k
  return 0;
1711
152k
}
xmltok.c:normal_predefinedEntityName
Line
Count
Source
1661
152k
                             const char *end) {
1662
152k
  UNUSED_P(enc);
1663
152k
  switch ((end - ptr) / MINBPC(enc)) {
1664
17.0k
  case 2:
1665
17.0k
    if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_t)) {
1666
1.19k
      switch (BYTE_TO_ASCII(enc, ptr)) {
1667
758
      case ASCII_l:
1668
758
        return ASCII_LT;
1669
172
      case ASCII_g:
1670
172
        return ASCII_GT;
1671
1.19k
      }
1672
1.19k
    }
1673
16.1k
    break;
1674
30.5k
  case 3:
1675
30.5k
    if (CHAR_MATCHES(enc, ptr, ASCII_a)) {
1676
29.1k
      ptr += MINBPC(enc);
1677
29.1k
      if (CHAR_MATCHES(enc, ptr, ASCII_m)) {
1678
26.1k
        ptr += MINBPC(enc);
1679
26.1k
        if (CHAR_MATCHES(enc, ptr, ASCII_p))
1680
25.9k
          return ASCII_AMP;
1681
26.1k
      }
1682
29.1k
    }
1683
4.54k
    break;
1684
5.26k
  case 4:
1685
5.26k
    switch (BYTE_TO_ASCII(enc, ptr)) {
1686
1.23k
    case ASCII_q:
1687
1.23k
      ptr += MINBPC(enc);
1688
1.23k
      if (CHAR_MATCHES(enc, ptr, ASCII_u)) {
1689
801
        ptr += MINBPC(enc);
1690
801
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1691
585
          ptr += MINBPC(enc);
1692
585
          if (CHAR_MATCHES(enc, ptr, ASCII_t))
1693
382
            return ASCII_QUOT;
1694
585
        }
1695
801
      }
1696
856
      break;
1697
2.37k
    case ASCII_a:
1698
2.37k
      ptr += MINBPC(enc);
1699
2.37k
      if (CHAR_MATCHES(enc, ptr, ASCII_p)) {
1700
840
        ptr += MINBPC(enc);
1701
840
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1702
589
          ptr += MINBPC(enc);
1703
589
          if (CHAR_MATCHES(enc, ptr, ASCII_s))
1704
365
            return ASCII_APOS;
1705
589
        }
1706
840
      }
1707
2.00k
      break;
1708
5.26k
    }
1709
152k
  }
1710
124k
  return 0;
1711
152k
}
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
454k
                         const char *end1, const char *ptr2) {
1716
454k
  UNUSED_P(enc);
1717
2.89M
  for (; *ptr2; ptr1 += MINBPC(enc), ptr2++) {
1718
2.53M
    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
51
      return 0; /* LCOV_EXCL_LINE */
1725
51
    }
1726
2.53M
    if (! CHAR_MATCHES(enc, ptr1, *ptr2))
1727
95.5k
      return 0;
1728
2.53M
  }
1729
358k
  return ptr1 == end1;
1730
454k
}
xmltok.c:normal_nameMatchesAscii
Line
Count
Source
1715
454k
                         const char *end1, const char *ptr2) {
1716
454k
  UNUSED_P(enc);
1717
2.89M
  for (; *ptr2; ptr1 += MINBPC(enc), ptr2++) {
1718
2.53M
    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
51
      return 0; /* LCOV_EXCL_LINE */
1725
51
    }
1726
2.53M
    if (! CHAR_MATCHES(enc, ptr1, *ptr2))
1727
95.5k
      return 0;
1728
2.53M
  }
1729
358k
  return ptr1 == end1;
1730
454k
}
Unexecuted instantiation: xmltok.c:little2_nameMatchesAscii
Unexecuted instantiation: xmltok.c:big2_nameMatchesAscii
1731
1732
static int PTRFASTCALL
1733
967k
PREFIX(nameLength)(const ENCODING *enc, const char *ptr) {
1734
967k
  const char *start = ptr;
1735
12.2M
  for (;;) {
1736
12.2M
    switch (BYTE_TYPE(enc, ptr)) {
1737
0
#  define LEAD_CASE(n)                                                         \
1738
77.2k
  case BT_LEAD##n:                                                             \
1739
77.2k
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1740
77.2k
    break;
1741
37.4k
      LEAD_CASE(2)
1742
39.8k
      LEAD_CASE(3)
1743
0
      LEAD_CASE(4)
1744
0
#  undef LEAD_CASE
1745
0
    case BT_NONASCII:
1746
9.91M
    case BT_NMSTRT:
1747
#  ifdef XML_NS
1748
    case BT_COLON:
1749
#  endif
1750
11.1M
    case BT_HEX:
1751
11.1M
    case BT_DIGIT:
1752
11.2M
    case BT_NAME:
1753
11.2M
    case BT_MINUS:
1754
11.2M
      ptr += MINBPC(enc);
1755
11.2M
      break;
1756
967k
    default:
1757
967k
      return (int)(ptr - start);
1758
12.2M
    }
1759
12.2M
  }
1760
967k
}
xmltok.c:normal_nameLength
Line
Count
Source
1733
967k
PREFIX(nameLength)(const ENCODING *enc, const char *ptr) {
1734
967k
  const char *start = ptr;
1735
12.2M
  for (;;) {
1736
12.2M
    switch (BYTE_TYPE(enc, ptr)) {
1737
0
#  define LEAD_CASE(n)                                                         \
1738
0
  case BT_LEAD##n:                                                             \
1739
0
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1740
0
    break;
1741
37.4k
      LEAD_CASE(2)
1742
39.8k
      LEAD_CASE(3)
1743
0
      LEAD_CASE(4)
1744
0
#  undef LEAD_CASE
1745
0
    case BT_NONASCII:
1746
9.91M
    case BT_NMSTRT:
1747
#  ifdef XML_NS
1748
    case BT_COLON:
1749
#  endif
1750
11.1M
    case BT_HEX:
1751
11.1M
    case BT_DIGIT:
1752
11.2M
    case BT_NAME:
1753
11.2M
    case BT_MINUS:
1754
11.2M
      ptr += MINBPC(enc);
1755
11.2M
      break;
1756
967k
    default:
1757
967k
      return (int)(ptr - start);
1758
12.2M
    }
1759
12.2M
  }
1760
967k
}
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
19.8k
                       POSITION *pos) {
1780
130M
  while (HAS_CHAR(enc, ptr, end)) {
1781
130M
    switch (BYTE_TYPE(enc, ptr)) {
1782
0
#  define LEAD_CASE(n)                                                         \
1783
1.55M
  case BT_LEAD##n:                                                             \
1784
1.55M
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1785
1.55M
    pos->columnNumber++;                                                       \
1786
1.55M
    break;
1787
676k
      LEAD_CASE(2)
1788
600k
      LEAD_CASE(3)
1789
275k
      LEAD_CASE(4)
1790
0
#  undef LEAD_CASE
1791
3.76M
    case BT_LF:
1792
3.76M
      pos->columnNumber = 0;
1793
3.76M
      pos->lineNumber++;
1794
3.76M
      ptr += MINBPC(enc);
1795
3.76M
      break;
1796
5.60M
    case BT_CR:
1797
5.60M
      pos->lineNumber++;
1798
5.60M
      ptr += MINBPC(enc);
1799
5.60M
      if (HAS_CHAR(enc, ptr, end) && BYTE_TYPE(enc, ptr) == BT_LF)
1800
1.07M
        ptr += MINBPC(enc);
1801
5.60M
      pos->columnNumber = 0;
1802
5.60M
      break;
1803
119M
    default:
1804
119M
      ptr += MINBPC(enc);
1805
119M
      pos->columnNumber++;
1806
119M
      break;
1807
130M
    }
1808
130M
  }
1809
19.8k
}
xmltok.c:normal_updatePosition
Line
Count
Source
1779
19.3k
                       POSITION *pos) {
1780
130M
  while (HAS_CHAR(enc, ptr, end)) {
1781
130M
    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
676k
      LEAD_CASE(2)
1788
600k
      LEAD_CASE(3)
1789
275k
      LEAD_CASE(4)
1790
0
#  undef LEAD_CASE
1791
3.76M
    case BT_LF:
1792
3.76M
      pos->columnNumber = 0;
1793
3.76M
      pos->lineNumber++;
1794
3.76M
      ptr += MINBPC(enc);
1795
3.76M
      break;
1796
5.60M
    case BT_CR:
1797
5.60M
      pos->lineNumber++;
1798
5.60M
      ptr += MINBPC(enc);
1799
5.60M
      if (HAS_CHAR(enc, ptr, end) && BYTE_TYPE(enc, ptr) == BT_LF)
1800
1.07M
        ptr += MINBPC(enc);
1801
5.60M
      pos->columnNumber = 0;
1802
5.60M
      break;
1803
119M
    default:
1804
119M
      ptr += MINBPC(enc);
1805
119M
      pos->columnNumber++;
1806
119M
      break;
1807
130M
    }
1808
130M
  }
1809
19.3k
}
xmltok.c:little2_updatePosition
Line
Count
Source
1779
247
                       POSITION *pos) {
1780
782
  while (HAS_CHAR(enc, ptr, end)) {
1781
782
    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
782
    default:
1804
782
      ptr += MINBPC(enc);
1805
782
      pos->columnNumber++;
1806
782
      break;
1807
782
    }
1808
782
  }
1809
247
}
xmltok.c:big2_updatePosition
Line
Count
Source
1779
233
                       POSITION *pos) {
1780
12.5k
  while (HAS_CHAR(enc, ptr, end)) {
1781
12.5k
    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
12.5k
    default:
1804
12.5k
      ptr += MINBPC(enc);
1805
12.5k
      pos->columnNumber++;
1806
12.5k
      break;
1807
12.5k
    }
1808
12.5k
  }
1809
233
}
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 */