Coverage Report

Created: 2026-07-30 06:52

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
106
#    define IS_INVALID_CHAR(enc, ptr, n) (0)
46
#  endif
47
48
#  define INVALID_LEAD_CASE(n, ptr, nextTokPtr)                                \
49
656k
  case BT_LEAD##n:                                                             \
50
656k
    if (end - ptr < n)                                                         \
51
656k
      return XML_TOK_PARTIAL_CHAR;                                             \
52
656k
    if (IS_INVALID_CHAR(enc, ptr, n)) {                                        \
53
109
      *(nextTokPtr) = (ptr);                                                   \
54
109
      return XML_TOK_INVALID;                                                  \
55
109
    }                                                                          \
56
656k
    ptr += n;                                                                  \
57
656k
    break;
58
59
#  define INVALID_CASES(ptr, nextTokPtr)                                       \
60
251k
    INVALID_LEAD_CASE(2, ptr, nextTokPtr)                                      \
61
274k
    INVALID_LEAD_CASE(3, ptr, nextTokPtr)                                      \
62
274k
    INVALID_LEAD_CASE(4, ptr, nextTokPtr)                                      \
63
131k
  case BT_NONXML:                                                              \
64
60
  case BT_MALFORM:                                                             \
65
118
  case BT_TRAIL:                                                               \
66
118
    *(nextTokPtr) = (ptr);                                                     \
67
118
    return XML_TOK_INVALID;
68
69
#  define CHECK_NAME_CASE(n, enc, ptr, end, nextTokPtr)                        \
70
129k
  case BT_LEAD##n:                                                             \
71
129k
    if (end - ptr < n)                                                         \
72
129k
      return XML_TOK_PARTIAL_CHAR;                                             \
73
129k
    if (IS_INVALID_CHAR(enc, ptr, n) || ! IS_NAME_CHAR(enc, ptr, n)) {         \
74
301
      *nextTokPtr = ptr;                                                       \
75
301
      return XML_TOK_INVALID;                                                  \
76
301
    }                                                                          \
77
129k
    ptr += n;                                                                  \
78
129k
    break;
79
80
#  define CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)                          \
81
24.4M
  case BT_NONASCII:                                                            \
82
24.4M
    if (! IS_NAME_CHAR_MINBPC(enc, ptr)) {                                     \
83
48
      *nextTokPtr = ptr;                                                       \
84
48
      return XML_TOK_INVALID;                                                  \
85
48
    }                                                                          \
86
24.4M
    /* fall through */                                                         \
87
24.4M
  case BT_NMSTRT:                                                              \
88
17.8M
  case BT_HEX:                                                                 \
89
23.1M
  case BT_DIGIT:                                                               \
90
23.2M
  case BT_NAME:                                                                \
91
24.4M
  case BT_MINUS:                                                               \
92
24.4M
    ptr += MINBPC(enc);                                                        \
93
24.4M
    break;                                                                     \
94
24.4M
    CHECK_NAME_CASE(2, enc, ptr, end, nextTokPtr)                              \
95
66.1k
    CHECK_NAME_CASE(3, enc, ptr, end, nextTokPtr)                              \
96
63.0k
    CHECK_NAME_CASE(4, enc, ptr, end, nextTokPtr)
97
98
#  define CHECK_NMSTRT_CASE(n, enc, ptr, end, nextTokPtr)                      \
99
86.6k
  case BT_LEAD##n:                                                             \
100
86.6k
    if ((end) - (ptr) < (n))                                                   \
101
86.3k
      return XML_TOK_PARTIAL_CHAR;                                             \
102
86.5k
    if (IS_INVALID_CHAR(enc, ptr, n) || ! IS_NMSTRT_CHAR(enc, ptr, n)) {       \
103
167
      *nextTokPtr = ptr;                                                       \
104
167
      return XML_TOK_INVALID;                                                  \
105
167
    }                                                                          \
106
86.5k
    ptr += n;                                                                  \
107
86.3k
    break;
108
109
#  define CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)                        \
110
3.44M
  case BT_NONASCII:                                                            \
111
3.44M
    if (! IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {                                   \
112
0
      *nextTokPtr = ptr;                                                       \
113
0
      return XML_TOK_INVALID;                                                  \
114
0
    }                                                                          \
115
3.44M
    /* fall through */                                                         \
116
3.44M
  case BT_NMSTRT:                                                              \
117
3.44M
  case BT_HEX:                                                                 \
118
3.44M
    ptr += MINBPC(enc);                                                        \
119
3.44M
    break;                                                                     \
120
3.44M
    CHECK_NMSTRT_CASE(2, enc, ptr, end, nextTokPtr)                            \
121
52.4k
    CHECK_NMSTRT_CASE(3, enc, ptr, end, nextTokPtr)                            \
122
33.9k
    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
291M
    ((end) - (ptr) >= ((count) * MINBPC(enc)))
130
131
10.9M
#  define HAS_CHAR(enc, ptr, end) HAS_CHARS(enc, ptr, end, 1)
132
133
#  define REQUIRE_CHARS(enc, ptr, end, count)                                  \
134
31.2M
    {                                                                          \
135
31.2M
      if (! HAS_CHARS(enc, ptr, end, count)) {                                 \
136
658
        return XML_TOK_PARTIAL;                                                \
137
658
      }                                                                        \
138
31.2M
    }
139
140
31.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
24.6k
                    const char **nextTokPtr) {
147
24.6k
  if (HAS_CHAR(enc, ptr, end)) {
148
24.6k
    if (! CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
149
11
      *nextTokPtr = ptr;
150
11
      return XML_TOK_INVALID;
151
11
    }
152
24.6k
    ptr += MINBPC(enc);
153
4.98M
    while (HAS_CHAR(enc, ptr, end)) {
154
4.98M
      switch (BYTE_TYPE(enc, ptr)) {
155
168k
        INVALID_CASES(ptr, nextTokPtr)
156
41.4k
      case BT_MINUS:
157
41.4k
        ptr += MINBPC(enc);
158
41.4k
        REQUIRE_CHAR(enc, ptr, end);
159
41.4k
        if (CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
160
24.4k
          ptr += MINBPC(enc);
161
24.4k
          REQUIRE_CHAR(enc, ptr, end);
162
24.4k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
163
7
            *nextTokPtr = ptr;
164
7
            return XML_TOK_INVALID;
165
7
          }
166
24.4k
          *nextTokPtr = ptr + MINBPC(enc);
167
24.4k
          return XML_TOK_COMMENT;
168
24.4k
        }
169
16.9k
        break;
170
4.85M
      default:
171
4.85M
        ptr += MINBPC(enc);
172
4.85M
        break;
173
4.98M
      }
174
4.98M
    }
175
24.6k
  }
176
76
  return XML_TOK_PARTIAL;
177
24.6k
}
xmltok.c:normal_scanComment
Line
Count
Source
146
24.6k
                    const char **nextTokPtr) {
147
24.6k
  if (HAS_CHAR(enc, ptr, end)) {
148
24.6k
    if (! CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
149
11
      *nextTokPtr = ptr;
150
11
      return XML_TOK_INVALID;
151
11
    }
152
24.6k
    ptr += MINBPC(enc);
153
4.98M
    while (HAS_CHAR(enc, ptr, end)) {
154
4.98M
      switch (BYTE_TYPE(enc, ptr)) {
155
168k
        INVALID_CASES(ptr, nextTokPtr)
156
41.4k
      case BT_MINUS:
157
41.4k
        ptr += MINBPC(enc);
158
41.4k
        REQUIRE_CHAR(enc, ptr, end);
159
41.4k
        if (CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
160
24.4k
          ptr += MINBPC(enc);
161
24.4k
          REQUIRE_CHAR(enc, ptr, end);
162
24.4k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
163
7
            *nextTokPtr = ptr;
164
7
            return XML_TOK_INVALID;
165
7
          }
166
24.4k
          *nextTokPtr = ptr + MINBPC(enc);
167
24.4k
          return XML_TOK_COMMENT;
168
24.4k
        }
169
16.9k
        break;
170
4.85M
      default:
171
4.85M
        ptr += MINBPC(enc);
172
4.85M
        break;
173
4.98M
      }
174
4.98M
    }
175
24.6k
  }
176
76
  return XML_TOK_PARTIAL;
177
24.6k
}
Unexecuted instantiation: xmltok.c:little2_scanComment
Unexecuted instantiation: xmltok.c:big2_scanComment
178
179
/* ptr points to character following "<!" */
180
181
static int PTRCALL
182
PREFIX(scanDecl)(const ENCODING *enc, const char *ptr, const char *end,
183
41.4k
                 const char **nextTokPtr) {
184
41.4k
  REQUIRE_CHAR(enc, ptr, end);
185
41.4k
  switch (BYTE_TYPE(enc, ptr)) {
186
2.59k
  case BT_MINUS:
187
2.59k
    return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
188
1
  case BT_LSQB:
189
1
    *nextTokPtr = ptr + MINBPC(enc);
190
1
    return XML_TOK_COND_SECT_OPEN;
191
1.21k
  case BT_NMSTRT:
192
38.8k
  case BT_HEX:
193
38.8k
    ptr += MINBPC(enc);
194
38.8k
    break;
195
5
  default:
196
5
    *nextTokPtr = ptr;
197
5
    return XML_TOK_INVALID;
198
41.4k
  }
199
264k
  while (HAS_CHAR(enc, ptr, end)) {
200
264k
    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
14.3k
    case BT_S:
214
34.6k
    case BT_CR:
215
38.7k
    case BT_LF:
216
38.7k
      *nextTokPtr = ptr;
217
38.7k
      return XML_TOK_DECL_OPEN;
218
208k
    case BT_NMSTRT:
219
225k
    case BT_HEX:
220
225k
      ptr += MINBPC(enc);
221
225k
      break;
222
8
    default:
223
8
      *nextTokPtr = ptr;
224
8
      return XML_TOK_INVALID;
225
264k
    }
226
264k
  }
227
68
  return XML_TOK_PARTIAL;
228
38.8k
}
xmltok.c:normal_scanDecl
Line
Count
Source
183
41.4k
                 const char **nextTokPtr) {
184
41.4k
  REQUIRE_CHAR(enc, ptr, end);
185
41.4k
  switch (BYTE_TYPE(enc, ptr)) {
186
2.59k
  case BT_MINUS:
187
2.59k
    return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
188
1
  case BT_LSQB:
189
1
    *nextTokPtr = ptr + MINBPC(enc);
190
1
    return XML_TOK_COND_SECT_OPEN;
191
1.21k
  case BT_NMSTRT:
192
38.8k
  case BT_HEX:
193
38.8k
    ptr += MINBPC(enc);
194
38.8k
    break;
195
5
  default:
196
5
    *nextTokPtr = ptr;
197
5
    return XML_TOK_INVALID;
198
41.4k
  }
199
264k
  while (HAS_CHAR(enc, ptr, end)) {
200
264k
    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
14.3k
    case BT_S:
214
34.6k
    case BT_CR:
215
38.7k
    case BT_LF:
216
38.7k
      *nextTokPtr = ptr;
217
38.7k
      return XML_TOK_DECL_OPEN;
218
208k
    case BT_NMSTRT:
219
225k
    case BT_HEX:
220
225k
      ptr += MINBPC(enc);
221
225k
      break;
222
8
    default:
223
8
      *nextTokPtr = ptr;
224
8
      return XML_TOK_INVALID;
225
264k
    }
226
264k
  }
227
68
  return XML_TOK_PARTIAL;
228
38.8k
}
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
48.2k
                      int *tokPtr) {
233
48.2k
  int upper = 0;
234
48.2k
  UNUSED_P(enc);
235
48.2k
  *tokPtr = XML_TOK_PI;
236
48.2k
  if (end - ptr != MINBPC(enc) * 3)
237
38.5k
    return 1;
238
9.73k
  switch (BYTE_TO_ASCII(enc, ptr)) {
239
5.45k
  case ASCII_x:
240
5.45k
    break;
241
1.99k
  case ASCII_X:
242
1.99k
    upper = 1;
243
1.99k
    break;
244
2.29k
  default:
245
2.29k
    return 1;
246
9.73k
  }
247
7.44k
  ptr += MINBPC(enc);
248
7.44k
  switch (BYTE_TO_ASCII(enc, ptr)) {
249
1.77k
  case ASCII_m:
250
1.77k
    break;
251
1.46k
  case ASCII_M:
252
1.46k
    upper = 1;
253
1.46k
    break;
254
4.19k
  default:
255
4.19k
    return 1;
256
7.44k
  }
257
3.24k
  ptr += MINBPC(enc);
258
3.24k
  switch (BYTE_TO_ASCII(enc, ptr)) {
259
1.12k
  case ASCII_l:
260
1.12k
    break;
261
2
  case ASCII_L:
262
2
    upper = 1;
263
2
    break;
264
2.12k
  default:
265
2.12k
    return 1;
266
3.24k
  }
267
1.12k
  if (upper)
268
5
    return 0;
269
1.11k
  *tokPtr = XML_TOK_XML_DECL;
270
1.11k
  return 1;
271
1.12k
}
xmltok.c:normal_checkPiTarget
Line
Count
Source
232
48.2k
                      int *tokPtr) {
233
48.2k
  int upper = 0;
234
48.2k
  UNUSED_P(enc);
235
48.2k
  *tokPtr = XML_TOK_PI;
236
48.2k
  if (end - ptr != MINBPC(enc) * 3)
237
38.5k
    return 1;
238
9.73k
  switch (BYTE_TO_ASCII(enc, ptr)) {
239
5.45k
  case ASCII_x:
240
5.45k
    break;
241
1.99k
  case ASCII_X:
242
1.99k
    upper = 1;
243
1.99k
    break;
244
2.29k
  default:
245
2.29k
    return 1;
246
9.73k
  }
247
7.44k
  ptr += MINBPC(enc);
248
7.44k
  switch (BYTE_TO_ASCII(enc, ptr)) {
249
1.77k
  case ASCII_m:
250
1.77k
    break;
251
1.46k
  case ASCII_M:
252
1.46k
    upper = 1;
253
1.46k
    break;
254
4.19k
  default:
255
4.19k
    return 1;
256
7.44k
  }
257
3.24k
  ptr += MINBPC(enc);
258
3.24k
  switch (BYTE_TO_ASCII(enc, ptr)) {
259
1.12k
  case ASCII_l:
260
1.12k
    break;
261
2
  case ASCII_L:
262
2
    upper = 1;
263
2
    break;
264
2.12k
  default:
265
2.12k
    return 1;
266
3.24k
  }
267
1.12k
  if (upper)
268
5
    return 0;
269
1.11k
  *tokPtr = XML_TOK_XML_DECL;
270
1.11k
  return 1;
271
1.12k
}
Unexecuted instantiation: xmltok.c:little2_checkPiTarget
Unexecuted instantiation: xmltok.c:big2_checkPiTarget
272
273
/* ptr points to character following "<?" */
274
275
static int PTRCALL
276
PREFIX(scanPi)(const ENCODING *enc, const char *ptr, const char *end,
277
48.4k
               const char **nextTokPtr) {
278
48.4k
  int tok;
279
48.4k
  const char *target = ptr;
280
48.4k
  REQUIRE_CHAR(enc, ptr, end);
281
48.4k
  switch (BYTE_TYPE(enc, ptr)) {
282
57.1k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
283
2
  default:
284
2
    *nextTokPtr = ptr;
285
2
    return XML_TOK_INVALID;
286
48.4k
  }
287
1.08M
  while (HAS_CHAR(enc, ptr, end)) {
288
1.08M
    switch (BYTE_TYPE(enc, ptr)) {
289
3.84M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
290
7.56k
    case BT_S:
291
22.1k
    case BT_CR:
292
27.0k
    case BT_LF:
293
27.0k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
294
3
        *nextTokPtr = ptr;
295
3
        return XML_TOK_INVALID;
296
3
      }
297
27.0k
      ptr += MINBPC(enc);
298
25.5M
      while (HAS_CHAR(enc, ptr, end)) {
299
25.5M
        switch (BYTE_TYPE(enc, ptr)) {
300
689k
          INVALID_CASES(ptr, nextTokPtr)
301
177k
        case BT_QUEST:
302
177k
          ptr += MINBPC(enc);
303
177k
          REQUIRE_CHAR(enc, ptr, end);
304
177k
          if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
305
26.8k
            *nextTokPtr = ptr + MINBPC(enc);
306
26.8k
            return tok;
307
26.8k
          }
308
150k
          break;
309
24.9M
        default:
310
24.9M
          ptr += MINBPC(enc);
311
24.9M
          break;
312
25.5M
        }
313
25.5M
      }
314
160
      return XML_TOK_PARTIAL;
315
21.2k
    case BT_QUEST:
316
21.2k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
317
2
        *nextTokPtr = ptr;
318
2
        return XML_TOK_INVALID;
319
2
      }
320
21.2k
      ptr += MINBPC(enc);
321
21.2k
      REQUIRE_CHAR(enc, ptr, end);
322
21.1k
      if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
323
21.1k
        *nextTokPtr = ptr + MINBPC(enc);
324
21.1k
        return tok;
325
21.1k
      }
326
      /* fall through */
327
35
    default:
328
35
      *nextTokPtr = ptr;
329
35
      return XML_TOK_INVALID;
330
1.08M
    }
331
1.08M
  }
332
90
  return XML_TOK_PARTIAL;
333
48.4k
}
xmltok.c:normal_scanPi
Line
Count
Source
277
48.4k
               const char **nextTokPtr) {
278
48.4k
  int tok;
279
48.4k
  const char *target = ptr;
280
48.4k
  REQUIRE_CHAR(enc, ptr, end);
281
48.4k
  switch (BYTE_TYPE(enc, ptr)) {
282
57.1k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
283
2
  default:
284
2
    *nextTokPtr = ptr;
285
2
    return XML_TOK_INVALID;
286
48.4k
  }
287
1.08M
  while (HAS_CHAR(enc, ptr, end)) {
288
1.08M
    switch (BYTE_TYPE(enc, ptr)) {
289
3.84M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
290
7.56k
    case BT_S:
291
22.1k
    case BT_CR:
292
27.0k
    case BT_LF:
293
27.0k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
294
3
        *nextTokPtr = ptr;
295
3
        return XML_TOK_INVALID;
296
3
      }
297
27.0k
      ptr += MINBPC(enc);
298
25.5M
      while (HAS_CHAR(enc, ptr, end)) {
299
25.5M
        switch (BYTE_TYPE(enc, ptr)) {
300
689k
          INVALID_CASES(ptr, nextTokPtr)
301
177k
        case BT_QUEST:
302
177k
          ptr += MINBPC(enc);
303
177k
          REQUIRE_CHAR(enc, ptr, end);
304
177k
          if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
305
26.8k
            *nextTokPtr = ptr + MINBPC(enc);
306
26.8k
            return tok;
307
26.8k
          }
308
150k
          break;
309
24.9M
        default:
310
24.9M
          ptr += MINBPC(enc);
311
24.9M
          break;
312
25.5M
        }
313
25.5M
      }
314
160
      return XML_TOK_PARTIAL;
315
21.2k
    case BT_QUEST:
316
21.2k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
317
2
        *nextTokPtr = ptr;
318
2
        return XML_TOK_INVALID;
319
2
      }
320
21.2k
      ptr += MINBPC(enc);
321
21.2k
      REQUIRE_CHAR(enc, ptr, end);
322
21.1k
      if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
323
21.1k
        *nextTokPtr = ptr + MINBPC(enc);
324
21.1k
        return tok;
325
21.1k
      }
326
      /* fall through */
327
35
    default:
328
35
      *nextTokPtr = ptr;
329
35
      return XML_TOK_INVALID;
330
1.08M
    }
331
1.08M
  }
332
90
  return XML_TOK_PARTIAL;
333
48.4k
}
Unexecuted instantiation: xmltok.c:little2_scanPi
Unexecuted instantiation: xmltok.c:big2_scanPi
334
335
static int PTRCALL
336
PREFIX(scanCdataSection)(const ENCODING *enc, const char *ptr, const char *end,
337
2.33k
                         const char **nextTokPtr) {
338
2.33k
  static const char CDATA_LSQB[]
339
2.33k
      = {ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, ASCII_LSQB};
340
2.33k
  int i;
341
2.33k
  UNUSED_P(enc);
342
  /* CDATA[ */
343
2.33k
  REQUIRE_CHARS(enc, ptr, end, 6);
344
15.9k
  for (i = 0; i < 6; i++, ptr += MINBPC(enc)) {
345
13.7k
    if (! CHAR_MATCHES(enc, ptr, CDATA_LSQB[i])) {
346
55
      *nextTokPtr = ptr;
347
55
      return XML_TOK_INVALID;
348
55
    }
349
13.7k
  }
350
2.25k
  *nextTokPtr = ptr;
351
2.25k
  return XML_TOK_CDATA_SECT_OPEN;
352
2.31k
}
xmltok.c:normal_scanCdataSection
Line
Count
Source
337
2.33k
                         const char **nextTokPtr) {
338
2.33k
  static const char CDATA_LSQB[]
339
2.33k
      = {ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, ASCII_LSQB};
340
2.33k
  int i;
341
2.33k
  UNUSED_P(enc);
342
  /* CDATA[ */
343
2.33k
  REQUIRE_CHARS(enc, ptr, end, 6);
344
15.9k
  for (i = 0; i < 6; i++, ptr += MINBPC(enc)) {
345
13.7k
    if (! CHAR_MATCHES(enc, ptr, CDATA_LSQB[i])) {
346
55
      *nextTokPtr = ptr;
347
55
      return XML_TOK_INVALID;
348
55
    }
349
13.7k
  }
350
2.25k
  *nextTokPtr = ptr;
351
2.25k
  return XML_TOK_CDATA_SECT_OPEN;
352
2.31k
}
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
4.68M
                        const char **nextTokPtr) {
357
4.68M
  if (ptr >= end)
358
240
    return XML_TOK_NONE;
359
4.68M
  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
4.68M
  switch (BYTE_TYPE(enc, ptr)) {
369
636k
  case BT_RSQB:
370
636k
    ptr += MINBPC(enc);
371
636k
    REQUIRE_CHAR(enc, ptr, end);
372
636k
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
373
333k
      break;
374
303k
    ptr += MINBPC(enc);
375
303k
    REQUIRE_CHAR(enc, ptr, end);
376
303k
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
377
301k
      ptr -= MINBPC(enc);
378
301k
      break;
379
301k
    }
380
2.08k
    *nextTokPtr = ptr + MINBPC(enc);
381
2.08k
    return XML_TOK_CDATA_SECT_CLOSE;
382
1.66M
  case BT_CR:
383
1.66M
    ptr += MINBPC(enc);
384
1.66M
    REQUIRE_CHAR(enc, ptr, end);
385
1.66M
    if (BYTE_TYPE(enc, ptr) == BT_LF)
386
347k
      ptr += MINBPC(enc);
387
1.66M
    *nextTokPtr = ptr;
388
1.66M
    return XML_TOK_DATA_NEWLINE;
389
1.38M
  case BT_LF:
390
1.38M
    *nextTokPtr = ptr + MINBPC(enc);
391
1.38M
    return XML_TOK_DATA_NEWLINE;
392
1.38M
    INVALID_CASES(ptr, nextTokPtr)
393
921k
  default:
394
921k
    ptr += MINBPC(enc);
395
921k
    break;
396
4.68M
  }
397
25.2M
  while (HAS_CHAR(enc, ptr, end)) {
398
25.2M
    switch (BYTE_TYPE(enc, ptr)) {
399
0
#  define LEAD_CASE(n)                                                         \
400
385k
  case BT_LEAD##n:                                                             \
401
385k
    if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) {                       \
402
20
      *nextTokPtr = ptr;                                                       \
403
20
      return XML_TOK_DATA_CHARS;                                               \
404
20
    }                                                                          \
405
385k
    ptr += n;                                                                  \
406
385k
    break;
407
168k
      LEAD_CASE(2)
408
157k
      LEAD_CASE(3)
409
59.7k
      LEAD_CASE(4)
410
0
#  undef LEAD_CASE
411
2
    case BT_NONXML:
412
4
    case BT_MALFORM:
413
8
    case BT_TRAIL:
414
699k
    case BT_CR:
415
1.10M
    case BT_LF:
416
1.63M
    case BT_RSQB:
417
1.63M
      *nextTokPtr = ptr;
418
1.63M
      return XML_TOK_DATA_CHARS;
419
23.1M
    default:
420
23.1M
      ptr += MINBPC(enc);
421
23.1M
      break;
422
25.2M
    }
423
25.2M
  }
424
69
  *nextTokPtr = ptr;
425
69
  return XML_TOK_DATA_CHARS;
426
1.63M
}
xmltok.c:normal_cdataSectionTok
Line
Count
Source
356
4.68M
                        const char **nextTokPtr) {
357
4.68M
  if (ptr >= end)
358
240
    return XML_TOK_NONE;
359
4.68M
  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
4.68M
  switch (BYTE_TYPE(enc, ptr)) {
369
636k
  case BT_RSQB:
370
636k
    ptr += MINBPC(enc);
371
636k
    REQUIRE_CHAR(enc, ptr, end);
372
636k
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
373
333k
      break;
374
303k
    ptr += MINBPC(enc);
375
303k
    REQUIRE_CHAR(enc, ptr, end);
376
303k
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
377
301k
      ptr -= MINBPC(enc);
378
301k
      break;
379
301k
    }
380
2.08k
    *nextTokPtr = ptr + MINBPC(enc);
381
2.08k
    return XML_TOK_CDATA_SECT_CLOSE;
382
1.66M
  case BT_CR:
383
1.66M
    ptr += MINBPC(enc);
384
1.66M
    REQUIRE_CHAR(enc, ptr, end);
385
1.66M
    if (BYTE_TYPE(enc, ptr) == BT_LF)
386
347k
      ptr += MINBPC(enc);
387
1.66M
    *nextTokPtr = ptr;
388
1.66M
    return XML_TOK_DATA_NEWLINE;
389
1.38M
  case BT_LF:
390
1.38M
    *nextTokPtr = ptr + MINBPC(enc);
391
1.38M
    return XML_TOK_DATA_NEWLINE;
392
1.38M
    INVALID_CASES(ptr, nextTokPtr)
393
921k
  default:
394
921k
    ptr += MINBPC(enc);
395
921k
    break;
396
4.68M
  }
397
25.2M
  while (HAS_CHAR(enc, ptr, end)) {
398
25.2M
    switch (BYTE_TYPE(enc, ptr)) {
399
0
#  define LEAD_CASE(n)                                                         \
400
0
  case BT_LEAD##n:                                                             \
401
0
    if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) {                       \
402
0
      *nextTokPtr = ptr;                                                       \
403
0
      return XML_TOK_DATA_CHARS;                                               \
404
0
    }                                                                          \
405
0
    ptr += n;                                                                  \
406
0
    break;
407
168k
      LEAD_CASE(2)
408
157k
      LEAD_CASE(3)
409
59.7k
      LEAD_CASE(4)
410
0
#  undef LEAD_CASE
411
2
    case BT_NONXML:
412
4
    case BT_MALFORM:
413
8
    case BT_TRAIL:
414
699k
    case BT_CR:
415
1.10M
    case BT_LF:
416
1.63M
    case BT_RSQB:
417
1.63M
      *nextTokPtr = ptr;
418
1.63M
      return XML_TOK_DATA_CHARS;
419
23.1M
    default:
420
23.1M
      ptr += MINBPC(enc);
421
23.1M
      break;
422
25.2M
    }
423
25.2M
  }
424
69
  *nextTokPtr = ptr;
425
69
  return XML_TOK_DATA_CHARS;
426
1.63M
}
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
189k
                   const char **nextTokPtr) {
433
189k
  REQUIRE_CHAR(enc, ptr, end);
434
189k
  switch (BYTE_TYPE(enc, ptr)) {
435
145k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
436
14
  default:
437
14
    *nextTokPtr = ptr;
438
14
    return XML_TOK_INVALID;
439
189k
  }
440
1.40M
  while (HAS_CHAR(enc, ptr, end)) {
441
1.40M
    switch (BYTE_TYPE(enc, ptr)) {
442
4.04M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
443
333
    case BT_S:
444
1.08k
    case BT_CR:
445
2.14k
    case BT_LF:
446
6.12k
      for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
447
6.12k
        switch (BYTE_TYPE(enc, ptr)) {
448
223
        case BT_S:
449
1.61k
        case BT_CR:
450
4.01k
        case BT_LF:
451
4.01k
          break;
452
2.10k
        case BT_GT:
453
2.10k
          *nextTokPtr = ptr + MINBPC(enc);
454
2.10k
          return XML_TOK_END_TAG;
455
1
        default:
456
1
          *nextTokPtr = ptr;
457
1
          return XML_TOK_INVALID;
458
6.12k
        }
459
6.12k
      }
460
46
      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
187k
    case BT_GT:
469
187k
      *nextTokPtr = ptr + MINBPC(enc);
470
187k
      return XML_TOK_END_TAG;
471
16
    default:
472
16
      *nextTokPtr = ptr;
473
16
      return XML_TOK_INVALID;
474
1.40M
    }
475
1.40M
  }
476
116
  return XML_TOK_PARTIAL;
477
189k
}
xmltok.c:normal_scanEndTag
Line
Count
Source
432
189k
                   const char **nextTokPtr) {
433
189k
  REQUIRE_CHAR(enc, ptr, end);
434
189k
  switch (BYTE_TYPE(enc, ptr)) {
435
145k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
436
14
  default:
437
14
    *nextTokPtr = ptr;
438
14
    return XML_TOK_INVALID;
439
189k
  }
440
1.40M
  while (HAS_CHAR(enc, ptr, end)) {
441
1.40M
    switch (BYTE_TYPE(enc, ptr)) {
442
4.04M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
443
333
    case BT_S:
444
1.08k
    case BT_CR:
445
2.14k
    case BT_LF:
446
6.12k
      for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
447
6.12k
        switch (BYTE_TYPE(enc, ptr)) {
448
223
        case BT_S:
449
1.61k
        case BT_CR:
450
4.01k
        case BT_LF:
451
4.01k
          break;
452
2.10k
        case BT_GT:
453
2.10k
          *nextTokPtr = ptr + MINBPC(enc);
454
2.10k
          return XML_TOK_END_TAG;
455
1
        default:
456
1
          *nextTokPtr = ptr;
457
1
          return XML_TOK_INVALID;
458
6.12k
        }
459
6.12k
      }
460
46
      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
187k
    case BT_GT:
469
187k
      *nextTokPtr = ptr + MINBPC(enc);
470
187k
      return XML_TOK_END_TAG;
471
16
    default:
472
16
      *nextTokPtr = ptr;
473
16
      return XML_TOK_INVALID;
474
1.40M
    }
475
1.40M
  }
476
116
  return XML_TOK_PARTIAL;
477
189k
}
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
18.3k
                       const char **nextTokPtr) {
484
18.3k
  if (HAS_CHAR(enc, ptr, end)) {
485
18.3k
    switch (BYTE_TYPE(enc, ptr)) {
486
9.85k
    case BT_DIGIT:
487
18.3k
    case BT_HEX:
488
18.3k
      break;
489
5
    default:
490
5
      *nextTokPtr = ptr;
491
5
      return XML_TOK_INVALID;
492
18.3k
    }
493
67.4k
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
494
67.4k
      switch (BYTE_TYPE(enc, ptr)) {
495
28.3k
      case BT_DIGIT:
496
49.1k
      case BT_HEX:
497
49.1k
        break;
498
18.2k
      case BT_SEMI:
499
18.2k
        *nextTokPtr = ptr + MINBPC(enc);
500
18.2k
        return XML_TOK_CHAR_REF;
501
4
      default:
502
4
        *nextTokPtr = ptr;
503
4
        return XML_TOK_INVALID;
504
67.4k
      }
505
67.4k
    }
506
18.3k
  }
507
31
  return XML_TOK_PARTIAL;
508
18.3k
}
xmltok.c:normal_scanHexCharRef
Line
Count
Source
483
18.3k
                       const char **nextTokPtr) {
484
18.3k
  if (HAS_CHAR(enc, ptr, end)) {
485
18.3k
    switch (BYTE_TYPE(enc, ptr)) {
486
9.85k
    case BT_DIGIT:
487
18.3k
    case BT_HEX:
488
18.3k
      break;
489
5
    default:
490
5
      *nextTokPtr = ptr;
491
5
      return XML_TOK_INVALID;
492
18.3k
    }
493
67.4k
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
494
67.4k
      switch (BYTE_TYPE(enc, ptr)) {
495
28.3k
      case BT_DIGIT:
496
49.1k
      case BT_HEX:
497
49.1k
        break;
498
18.2k
      case BT_SEMI:
499
18.2k
        *nextTokPtr = ptr + MINBPC(enc);
500
18.2k
        return XML_TOK_CHAR_REF;
501
4
      default:
502
4
        *nextTokPtr = ptr;
503
4
        return XML_TOK_INVALID;
504
67.4k
      }
505
67.4k
    }
506
18.3k
  }
507
31
  return XML_TOK_PARTIAL;
508
18.3k
}
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
28.7k
                    const char **nextTokPtr) {
515
28.7k
  if (HAS_CHAR(enc, ptr, end)) {
516
28.7k
    if (CHAR_MATCHES(enc, ptr, ASCII_x))
517
18.3k
      return PREFIX(scanHexCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
518
10.4k
    switch (BYTE_TYPE(enc, ptr)) {
519
10.3k
    case BT_DIGIT:
520
10.3k
      break;
521
11
    default:
522
11
      *nextTokPtr = ptr;
523
11
      return XML_TOK_INVALID;
524
10.4k
    }
525
35.1k
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
526
35.1k
      switch (BYTE_TYPE(enc, ptr)) {
527
24.7k
      case BT_DIGIT:
528
24.7k
        break;
529
10.3k
      case BT_SEMI:
530
10.3k
        *nextTokPtr = ptr + MINBPC(enc);
531
10.3k
        return XML_TOK_CHAR_REF;
532
3
      default:
533
3
        *nextTokPtr = ptr;
534
3
        return XML_TOK_INVALID;
535
35.1k
      }
536
35.1k
    }
537
10.3k
  }
538
22
  return XML_TOK_PARTIAL;
539
28.7k
}
xmltok.c:normal_scanCharRef
Line
Count
Source
514
28.7k
                    const char **nextTokPtr) {
515
28.7k
  if (HAS_CHAR(enc, ptr, end)) {
516
28.7k
    if (CHAR_MATCHES(enc, ptr, ASCII_x))
517
18.3k
      return PREFIX(scanHexCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
518
10.4k
    switch (BYTE_TYPE(enc, ptr)) {
519
10.3k
    case BT_DIGIT:
520
10.3k
      break;
521
11
    default:
522
11
      *nextTokPtr = ptr;
523
11
      return XML_TOK_INVALID;
524
10.4k
    }
525
35.1k
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
526
35.1k
      switch (BYTE_TYPE(enc, ptr)) {
527
24.7k
      case BT_DIGIT:
528
24.7k
        break;
529
10.3k
      case BT_SEMI:
530
10.3k
        *nextTokPtr = ptr + MINBPC(enc);
531
10.3k
        return XML_TOK_CHAR_REF;
532
3
      default:
533
3
        *nextTokPtr = ptr;
534
3
        return XML_TOK_INVALID;
535
35.1k
      }
536
35.1k
    }
537
10.3k
  }
538
22
  return XML_TOK_PARTIAL;
539
28.7k
}
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
145k
                const char **nextTokPtr) {
546
145k
  REQUIRE_CHAR(enc, ptr, end);
547
145k
  switch (BYTE_TYPE(enc, ptr)) {
548
56.4k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
549
28.7k
  case BT_NUM:
550
28.7k
    return PREFIX(scanCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
551
7
  default:
552
7
    *nextTokPtr = ptr;
553
7
    return XML_TOK_INVALID;
554
145k
  }
555
411k
  while (HAS_CHAR(enc, ptr, end)) {
556
411k
    switch (BYTE_TYPE(enc, ptr)) {
557
1.05M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
558
116k
    case BT_SEMI:
559
116k
      *nextTokPtr = ptr + MINBPC(enc);
560
116k
      return XML_TOK_ENTITY_REF;
561
18
    default:
562
18
      *nextTokPtr = ptr;
563
18
      return XML_TOK_INVALID;
564
411k
    }
565
411k
  }
566
94
  return XML_TOK_PARTIAL;
567
117k
}
xmltok.c:normal_scanRef
Line
Count
Source
545
145k
                const char **nextTokPtr) {
546
145k
  REQUIRE_CHAR(enc, ptr, end);
547
145k
  switch (BYTE_TYPE(enc, ptr)) {
548
56.4k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
549
28.7k
  case BT_NUM:
550
28.7k
    return PREFIX(scanCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
551
7
  default:
552
7
    *nextTokPtr = ptr;
553
7
    return XML_TOK_INVALID;
554
145k
  }
555
411k
  while (HAS_CHAR(enc, ptr, end)) {
556
411k
    switch (BYTE_TYPE(enc, ptr)) {
557
1.05M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
558
116k
    case BT_SEMI:
559
116k
      *nextTokPtr = ptr + MINBPC(enc);
560
116k
      return XML_TOK_ENTITY_REF;
561
18
    default:
562
18
      *nextTokPtr = ptr;
563
18
      return XML_TOK_INVALID;
564
411k
    }
565
411k
  }
566
94
  return XML_TOK_PARTIAL;
567
117k
}
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
66.2k
                 const char **nextTokPtr) {
574
#  ifdef XML_NS
575
  int hadColon = 0;
576
#  endif
577
2.54M
  while (HAS_CHAR(enc, ptr, end)) {
578
2.54M
    switch (BYTE_TYPE(enc, ptr)) {
579
1.97M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
580
#  ifdef XML_NS
581
    case BT_COLON:
582
      if (hadColon) {
583
        *nextTokPtr = ptr;
584
        return XML_TOK_INVALID;
585
      }
586
      hadColon = 1;
587
      ptr += MINBPC(enc);
588
      REQUIRE_CHAR(enc, ptr, end);
589
      switch (BYTE_TYPE(enc, ptr)) {
590
        CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
591
      default:
592
        *nextTokPtr = ptr;
593
        return XML_TOK_INVALID;
594
      }
595
      break;
596
#  endif
597
1.56k
    case BT_S:
598
12.9k
    case BT_CR:
599
15.5k
    case BT_LF:
600
36.1k
      for (;;) {
601
36.1k
        int t;
602
603
36.1k
        ptr += MINBPC(enc);
604
36.1k
        REQUIRE_CHAR(enc, ptr, end);
605
36.0k
        t = BYTE_TYPE(enc, ptr);
606
36.0k
        if (t == BT_EQUALS)
607
15.4k
          break;
608
20.6k
        switch (t) {
609
2.53k
        case BT_S:
610
5.04k
        case BT_LF:
611
20.5k
        case BT_CR:
612
20.5k
          break;
613
11
        default:
614
11
          *nextTokPtr = ptr;
615
11
          return XML_TOK_INVALID;
616
20.6k
        }
617
20.6k
      }
618
      /* fall through */
619
1.96M
    case BT_EQUALS: {
620
1.96M
      int open;
621
#  ifdef XML_NS
622
      hadColon = 0;
623
#  endif
624
2.00M
      for (;;) {
625
2.00M
        ptr += MINBPC(enc);
626
2.00M
        REQUIRE_CHAR(enc, ptr, end);
627
2.00M
        open = BYTE_TYPE(enc, ptr);
628
2.00M
        if (open == BT_QUOT || open == BT_APOS)
629
1.96M
          break;
630
38.1k
        switch (open) {
631
6.34k
        case BT_S:
632
15.6k
        case BT_LF:
633
38.1k
        case BT_CR:
634
38.1k
          break;
635
15
        default:
636
15
          *nextTokPtr = ptr;
637
15
          return XML_TOK_INVALID;
638
38.1k
        }
639
38.1k
      }
640
1.96M
      ptr += MINBPC(enc);
641
      /* in attribute value */
642
20.2M
      for (;;) {
643
20.2M
        int t;
644
20.2M
        REQUIRE_CHAR(enc, ptr, end);
645
20.2M
        t = BYTE_TYPE(enc, ptr);
646
20.2M
        if (t == open)
647
1.96M
          break;
648
18.2M
        switch (t) {
649
169k
          INVALID_CASES(ptr, nextTokPtr)
650
29.1k
        case BT_AMP: {
651
29.1k
          int tok = PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, &ptr);
652
29.1k
          if (tok <= 0) {
653
52
            if (tok == XML_TOK_INVALID)
654
16
              *nextTokPtr = ptr;
655
52
            return tok;
656
52
          }
657
29.0k
          break;
658
29.1k
        }
659
29.0k
        case BT_LT:
660
9
          *nextTokPtr = ptr;
661
9
          return XML_TOK_INVALID;
662
18.1M
        default:
663
18.1M
          ptr += MINBPC(enc);
664
18.1M
          break;
665
18.2M
        }
666
18.2M
      }
667
1.96M
      ptr += MINBPC(enc);
668
1.96M
      REQUIRE_CHAR(enc, ptr, end);
669
1.96M
      switch (BYTE_TYPE(enc, ptr)) {
670
1.02M
      case BT_S:
671
1.90M
      case BT_CR:
672
1.93M
      case BT_LF:
673
1.93M
        break;
674
18.5k
      case BT_SOL:
675
18.5k
        goto sol;
676
11.8k
      case BT_GT:
677
11.8k
        goto gt;
678
6
      default:
679
6
        *nextTokPtr = ptr;
680
6
        return XML_TOK_INVALID;
681
1.96M
      }
682
      /* ptr points to closing quote */
683
2.11M
      for (;;) {
684
2.11M
        ptr += MINBPC(enc);
685
2.11M
        REQUIRE_CHAR(enc, ptr, end);
686
2.11M
        switch (BYTE_TYPE(enc, ptr)) {
687
1.91M
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
688
123k
        case BT_S:
689
154k
        case BT_CR:
690
177k
        case BT_LF:
691
177k
          continue;
692
409
        case BT_GT:
693
12.2k
        gt:
694
12.2k
          *nextTokPtr = ptr + MINBPC(enc);
695
12.2k
          return XML_TOK_START_TAG_WITH_ATTS;
696
34.7k
        case BT_SOL:
697
53.2k
        sol:
698
53.2k
          ptr += MINBPC(enc);
699
53.2k
          REQUIRE_CHAR(enc, ptr, end);
700
53.2k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
701
9
            *nextTokPtr = ptr;
702
9
            return XML_TOK_INVALID;
703
9
          }
704
53.2k
          *nextTokPtr = ptr + MINBPC(enc);
705
53.2k
          return XML_TOK_EMPTY_ELEMENT_WITH_ATTS;
706
8
        default:
707
8
          *nextTokPtr = ptr;
708
8
          return XML_TOK_INVALID;
709
2.11M
        }
710
1.90M
        break;
711
2.11M
      }
712
1.90M
      break;
713
1.93M
    }
714
1.90M
    default:
715
24
      *nextTokPtr = ptr;
716
24
      return XML_TOK_INVALID;
717
2.54M
    }
718
2.54M
  }
719
116
  return XML_TOK_PARTIAL;
720
66.2k
}
xmltok.c:normal_scanAtts
Line
Count
Source
573
66.2k
                 const char **nextTokPtr) {
574
#  ifdef XML_NS
575
  int hadColon = 0;
576
#  endif
577
2.54M
  while (HAS_CHAR(enc, ptr, end)) {
578
2.54M
    switch (BYTE_TYPE(enc, ptr)) {
579
1.97M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
580
#  ifdef XML_NS
581
    case BT_COLON:
582
      if (hadColon) {
583
        *nextTokPtr = ptr;
584
        return XML_TOK_INVALID;
585
      }
586
      hadColon = 1;
587
      ptr += MINBPC(enc);
588
      REQUIRE_CHAR(enc, ptr, end);
589
      switch (BYTE_TYPE(enc, ptr)) {
590
        CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
591
      default:
592
        *nextTokPtr = ptr;
593
        return XML_TOK_INVALID;
594
      }
595
      break;
596
#  endif
597
1.56k
    case BT_S:
598
12.9k
    case BT_CR:
599
15.5k
    case BT_LF:
600
36.1k
      for (;;) {
601
36.1k
        int t;
602
603
36.1k
        ptr += MINBPC(enc);
604
36.1k
        REQUIRE_CHAR(enc, ptr, end);
605
36.0k
        t = BYTE_TYPE(enc, ptr);
606
36.0k
        if (t == BT_EQUALS)
607
15.4k
          break;
608
20.6k
        switch (t) {
609
2.53k
        case BT_S:
610
5.04k
        case BT_LF:
611
20.5k
        case BT_CR:
612
20.5k
          break;
613
11
        default:
614
11
          *nextTokPtr = ptr;
615
11
          return XML_TOK_INVALID;
616
20.6k
        }
617
20.6k
      }
618
      /* fall through */
619
1.96M
    case BT_EQUALS: {
620
1.96M
      int open;
621
#  ifdef XML_NS
622
      hadColon = 0;
623
#  endif
624
2.00M
      for (;;) {
625
2.00M
        ptr += MINBPC(enc);
626
2.00M
        REQUIRE_CHAR(enc, ptr, end);
627
2.00M
        open = BYTE_TYPE(enc, ptr);
628
2.00M
        if (open == BT_QUOT || open == BT_APOS)
629
1.96M
          break;
630
38.1k
        switch (open) {
631
6.34k
        case BT_S:
632
15.6k
        case BT_LF:
633
38.1k
        case BT_CR:
634
38.1k
          break;
635
15
        default:
636
15
          *nextTokPtr = ptr;
637
15
          return XML_TOK_INVALID;
638
38.1k
        }
639
38.1k
      }
640
1.96M
      ptr += MINBPC(enc);
641
      /* in attribute value */
642
20.2M
      for (;;) {
643
20.2M
        int t;
644
20.2M
        REQUIRE_CHAR(enc, ptr, end);
645
20.2M
        t = BYTE_TYPE(enc, ptr);
646
20.2M
        if (t == open)
647
1.96M
          break;
648
18.2M
        switch (t) {
649
169k
          INVALID_CASES(ptr, nextTokPtr)
650
29.1k
        case BT_AMP: {
651
29.1k
          int tok = PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, &ptr);
652
29.1k
          if (tok <= 0) {
653
52
            if (tok == XML_TOK_INVALID)
654
16
              *nextTokPtr = ptr;
655
52
            return tok;
656
52
          }
657
29.0k
          break;
658
29.1k
        }
659
29.0k
        case BT_LT:
660
9
          *nextTokPtr = ptr;
661
9
          return XML_TOK_INVALID;
662
18.1M
        default:
663
18.1M
          ptr += MINBPC(enc);
664
18.1M
          break;
665
18.2M
        }
666
18.2M
      }
667
1.96M
      ptr += MINBPC(enc);
668
1.96M
      REQUIRE_CHAR(enc, ptr, end);
669
1.96M
      switch (BYTE_TYPE(enc, ptr)) {
670
1.02M
      case BT_S:
671
1.90M
      case BT_CR:
672
1.93M
      case BT_LF:
673
1.93M
        break;
674
18.5k
      case BT_SOL:
675
18.5k
        goto sol;
676
11.8k
      case BT_GT:
677
11.8k
        goto gt;
678
6
      default:
679
6
        *nextTokPtr = ptr;
680
6
        return XML_TOK_INVALID;
681
1.96M
      }
682
      /* ptr points to closing quote */
683
2.11M
      for (;;) {
684
2.11M
        ptr += MINBPC(enc);
685
2.11M
        REQUIRE_CHAR(enc, ptr, end);
686
2.11M
        switch (BYTE_TYPE(enc, ptr)) {
687
1.91M
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
688
123k
        case BT_S:
689
154k
        case BT_CR:
690
177k
        case BT_LF:
691
177k
          continue;
692
409
        case BT_GT:
693
12.2k
        gt:
694
12.2k
          *nextTokPtr = ptr + MINBPC(enc);
695
12.2k
          return XML_TOK_START_TAG_WITH_ATTS;
696
34.7k
        case BT_SOL:
697
53.2k
        sol:
698
53.2k
          ptr += MINBPC(enc);
699
53.2k
          REQUIRE_CHAR(enc, ptr, end);
700
53.2k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
701
9
            *nextTokPtr = ptr;
702
9
            return XML_TOK_INVALID;
703
9
          }
704
53.2k
          *nextTokPtr = ptr + MINBPC(enc);
705
53.2k
          return XML_TOK_EMPTY_ELEMENT_WITH_ATTS;
706
8
        default:
707
8
          *nextTokPtr = ptr;
708
8
          return XML_TOK_INVALID;
709
2.11M
        }
710
1.90M
        break;
711
2.11M
      }
712
1.90M
      break;
713
1.93M
    }
714
1.90M
    default:
715
24
      *nextTokPtr = ptr;
716
24
      return XML_TOK_INVALID;
717
2.54M
    }
718
2.54M
  }
719
116
  return XML_TOK_PARTIAL;
720
66.2k
}
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
1.19M
               const char **nextTokPtr) {
727
#  ifdef XML_NS
728
  int hadColon;
729
#  endif
730
1.19M
  REQUIRE_CHAR(enc, ptr, end);
731
1.19M
  switch (BYTE_TYPE(enc, ptr)) {
732
894k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
733
24.3k
  case BT_EXCL:
734
24.3k
    ptr += MINBPC(enc);
735
24.3k
    REQUIRE_CHAR(enc, ptr, end);
736
24.3k
    switch (BYTE_TYPE(enc, ptr)) {
737
22.0k
    case BT_MINUS:
738
22.0k
      return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
739
2.33k
    case BT_LSQB:
740
2.33k
      return PREFIX(scanCdataSection)(enc, ptr + MINBPC(enc), end, nextTokPtr);
741
24.3k
    }
742
3
    *nextTokPtr = ptr;
743
3
    return XML_TOK_INVALID;
744
36.4k
  case BT_QUEST:
745
36.4k
    return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
746
189k
  case BT_SOL:
747
189k
    return PREFIX(scanEndTag)(enc, ptr + MINBPC(enc), end, nextTokPtr);
748
15
  default:
749
15
    *nextTokPtr = ptr;
750
15
    return XML_TOK_INVALID;
751
1.19M
  }
752
#  ifdef XML_NS
753
  hadColon = 0;
754
#  endif
755
  /* we have a start-tag */
756
9.94M
  while (HAS_CHAR(enc, ptr, end)) {
757
9.94M
    switch (BYTE_TYPE(enc, ptr)) {
758
30.8M
      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
61.8k
    case BT_S:
777
70.5k
    case BT_CR:
778
74.3k
    case BT_LF: {
779
74.3k
      ptr += MINBPC(enc);
780
95.2k
      while (HAS_CHAR(enc, ptr, end)) {
781
95.2k
        switch (BYTE_TYPE(enc, ptr)) {
782
54.1k
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
783
2.19k
        case BT_GT:
784
2.19k
          goto gt;
785
5.82k
        case BT_SOL:
786
5.82k
          goto sol;
787
1.60k
        case BT_S:
788
18.1k
        case BT_CR:
789
20.9k
        case BT_LF:
790
20.9k
          ptr += MINBPC(enc);
791
20.9k
          continue;
792
2
        default:
793
2
          *nextTokPtr = ptr;
794
2
          return XML_TOK_INVALID;
795
95.2k
        }
796
66.2k
        return PREFIX(scanAtts)(enc, ptr, end, nextTokPtr);
797
95.2k
      }
798
72
      return XML_TOK_PARTIAL;
799
74.3k
    }
800
846k
    case BT_GT:
801
848k
    gt:
802
848k
      *nextTokPtr = ptr + MINBPC(enc);
803
848k
      return XML_TOK_START_TAG_NO_ATTS;
804
27.9k
    case BT_SOL:
805
33.7k
    sol:
806
33.7k
      ptr += MINBPC(enc);
807
33.7k
      REQUIRE_CHAR(enc, ptr, end);
808
33.7k
      if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
809
11
        *nextTokPtr = ptr;
810
11
        return XML_TOK_INVALID;
811
11
      }
812
33.7k
      *nextTokPtr = ptr + MINBPC(enc);
813
33.7k
      return XML_TOK_EMPTY_ELEMENT_NO_ATTS;
814
18
    default:
815
18
      *nextTokPtr = ptr;
816
18
      return XML_TOK_INVALID;
817
9.94M
    }
818
9.94M
  }
819
188
  return XML_TOK_PARTIAL;
820
949k
}
xmltok.c:normal_scanLt
Line
Count
Source
726
1.19M
               const char **nextTokPtr) {
727
#  ifdef XML_NS
728
  int hadColon;
729
#  endif
730
1.19M
  REQUIRE_CHAR(enc, ptr, end);
731
1.19M
  switch (BYTE_TYPE(enc, ptr)) {
732
894k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
733
24.3k
  case BT_EXCL:
734
24.3k
    ptr += MINBPC(enc);
735
24.3k
    REQUIRE_CHAR(enc, ptr, end);
736
24.3k
    switch (BYTE_TYPE(enc, ptr)) {
737
22.0k
    case BT_MINUS:
738
22.0k
      return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
739
2.33k
    case BT_LSQB:
740
2.33k
      return PREFIX(scanCdataSection)(enc, ptr + MINBPC(enc), end, nextTokPtr);
741
24.3k
    }
742
3
    *nextTokPtr = ptr;
743
3
    return XML_TOK_INVALID;
744
36.4k
  case BT_QUEST:
745
36.4k
    return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
746
189k
  case BT_SOL:
747
189k
    return PREFIX(scanEndTag)(enc, ptr + MINBPC(enc), end, nextTokPtr);
748
15
  default:
749
15
    *nextTokPtr = ptr;
750
15
    return XML_TOK_INVALID;
751
1.19M
  }
752
#  ifdef XML_NS
753
  hadColon = 0;
754
#  endif
755
  /* we have a start-tag */
756
9.94M
  while (HAS_CHAR(enc, ptr, end)) {
757
9.94M
    switch (BYTE_TYPE(enc, ptr)) {
758
30.8M
      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
61.8k
    case BT_S:
777
70.5k
    case BT_CR:
778
74.3k
    case BT_LF: {
779
74.3k
      ptr += MINBPC(enc);
780
95.2k
      while (HAS_CHAR(enc, ptr, end)) {
781
95.2k
        switch (BYTE_TYPE(enc, ptr)) {
782
54.1k
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
783
2.19k
        case BT_GT:
784
2.19k
          goto gt;
785
5.82k
        case BT_SOL:
786
5.82k
          goto sol;
787
1.60k
        case BT_S:
788
18.1k
        case BT_CR:
789
20.9k
        case BT_LF:
790
20.9k
          ptr += MINBPC(enc);
791
20.9k
          continue;
792
2
        default:
793
2
          *nextTokPtr = ptr;
794
2
          return XML_TOK_INVALID;
795
95.2k
        }
796
66.2k
        return PREFIX(scanAtts)(enc, ptr, end, nextTokPtr);
797
95.2k
      }
798
72
      return XML_TOK_PARTIAL;
799
74.3k
    }
800
846k
    case BT_GT:
801
848k
    gt:
802
848k
      *nextTokPtr = ptr + MINBPC(enc);
803
848k
      return XML_TOK_START_TAG_NO_ATTS;
804
27.9k
    case BT_SOL:
805
33.7k
    sol:
806
33.7k
      ptr += MINBPC(enc);
807
33.7k
      REQUIRE_CHAR(enc, ptr, end);
808
33.7k
      if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
809
11
        *nextTokPtr = ptr;
810
11
        return XML_TOK_INVALID;
811
11
      }
812
33.7k
      *nextTokPtr = ptr + MINBPC(enc);
813
33.7k
      return XML_TOK_EMPTY_ELEMENT_NO_ATTS;
814
18
    default:
815
18
      *nextTokPtr = ptr;
816
18
      return XML_TOK_INVALID;
817
9.94M
    }
818
9.94M
  }
819
188
  return XML_TOK_PARTIAL;
820
949k
}
Unexecuted instantiation: xmltok.c:little2_scanLt
Unexecuted instantiation: xmltok.c:big2_scanLt
821
822
static int PTRCALL
823
PREFIX(contentTok)(const ENCODING *enc, const char *ptr, const char *end,
824
3.55M
                   const char **nextTokPtr) {
825
3.55M
  if (ptr >= end)
826
8.89k
    return XML_TOK_NONE;
827
3.55M
  if (MINBPC(enc) > 1) {
828
0
    size_t n = end - ptr;
829
0
    if (n & (MINBPC(enc) - 1)) {
830
0
      n &= ~(MINBPC(enc) - 1);
831
0
      if (n == 0)
832
0
        return XML_TOK_PARTIAL;
833
0
      end = ptr + n;
834
0
    }
835
0
  }
836
3.55M
  switch (BYTE_TYPE(enc, ptr)) {
837
1.19M
  case BT_LT:
838
1.19M
    return PREFIX(scanLt)(enc, ptr + MINBPC(enc), end, nextTokPtr);
839
32.0k
  case BT_AMP:
840
32.0k
    return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
841
1.02M
  case BT_CR:
842
1.02M
    ptr += MINBPC(enc);
843
1.02M
    if (! HAS_CHAR(enc, ptr, end))
844
18
      return XML_TOK_TRAILING_CR;
845
1.02M
    if (BYTE_TYPE(enc, ptr) == BT_LF)
846
141k
      ptr += MINBPC(enc);
847
1.02M
    *nextTokPtr = ptr;
848
1.02M
    return XML_TOK_DATA_NEWLINE;
849
623k
  case BT_LF:
850
623k
    *nextTokPtr = ptr + MINBPC(enc);
851
623k
    return XML_TOK_DATA_NEWLINE;
852
117k
  case BT_RSQB:
853
117k
    ptr += MINBPC(enc);
854
117k
    if (! HAS_CHAR(enc, ptr, end))
855
22
      return XML_TOK_TRAILING_RSQB;
856
117k
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
857
23.1k
      break;
858
93.9k
    ptr += MINBPC(enc);
859
93.9k
    if (! HAS_CHAR(enc, ptr, end))
860
6
      return XML_TOK_TRAILING_RSQB;
861
93.8k
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
862
93.8k
      ptr -= MINBPC(enc);
863
93.8k
      break;
864
93.8k
    }
865
1
    *nextTokPtr = ptr;
866
1
    return XML_TOK_INVALID;
867
69.1k
    INVALID_CASES(ptr, nextTokPtr)
868
522k
  default:
869
522k
    ptr += MINBPC(enc);
870
522k
    break;
871
3.55M
  }
872
12.3M
  while (HAS_CHAR(enc, ptr, end)) {
873
12.3M
    switch (BYTE_TYPE(enc, ptr)) {
874
0
#  define LEAD_CASE(n)                                                         \
875
103k
  case BT_LEAD##n:                                                             \
876
103k
    if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) {                       \
877
43
      *nextTokPtr = ptr;                                                       \
878
43
      return XML_TOK_DATA_CHARS;                                               \
879
43
    }                                                                          \
880
103k
    ptr += n;                                                                  \
881
103k
    break;
882
59.7k
      LEAD_CASE(2)
883
25.0k
      LEAD_CASE(3)
884
18.9k
      LEAD_CASE(4)
885
0
#  undef LEAD_CASE
886
372k
    case BT_RSQB:
887
372k
      if (HAS_CHARS(enc, ptr, end, 2)) {
888
372k
        if (! CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_RSQB)) {
889
172k
          ptr += MINBPC(enc);
890
172k
          break;
891
172k
        }
892
200k
        if (HAS_CHARS(enc, ptr, end, 3)) {
893
200k
          if (! CHAR_MATCHES(enc, ptr + 2 * MINBPC(enc), ASCII_GT)) {
894
200k
            ptr += MINBPC(enc);
895
200k
            break;
896
200k
          }
897
2
          *nextTokPtr = ptr + 2 * MINBPC(enc);
898
2
          return XML_TOK_INVALID;
899
200k
        }
900
200k
      }
901
      /* fall through */
902
11.0k
    case BT_AMP:
903
174k
    case BT_LT:
904
174k
    case BT_NONXML:
905
174k
    case BT_MALFORM:
906
174k
    case BT_TRAIL:
907
522k
    case BT_CR:
908
666k
    case BT_LF:
909
666k
      *nextTokPtr = ptr;
910
666k
      return XML_TOK_DATA_CHARS;
911
11.2M
    default:
912
11.2M
      ptr += MINBPC(enc);
913
11.2M
      break;
914
12.3M
    }
915
12.3M
  }
916
7.01k
  *nextTokPtr = ptr;
917
7.01k
  return XML_TOK_DATA_CHARS;
918
673k
}
xmltok.c:normal_contentTok
Line
Count
Source
824
3.55M
                   const char **nextTokPtr) {
825
3.55M
  if (ptr >= end)
826
8.89k
    return XML_TOK_NONE;
827
3.55M
  if (MINBPC(enc) > 1) {
828
0
    size_t n = end - ptr;
829
0
    if (n & (MINBPC(enc) - 1)) {
830
0
      n &= ~(MINBPC(enc) - 1);
831
0
      if (n == 0)
832
0
        return XML_TOK_PARTIAL;
833
0
      end = ptr + n;
834
0
    }
835
0
  }
836
3.55M
  switch (BYTE_TYPE(enc, ptr)) {
837
1.19M
  case BT_LT:
838
1.19M
    return PREFIX(scanLt)(enc, ptr + MINBPC(enc), end, nextTokPtr);
839
32.0k
  case BT_AMP:
840
32.0k
    return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
841
1.02M
  case BT_CR:
842
1.02M
    ptr += MINBPC(enc);
843
1.02M
    if (! HAS_CHAR(enc, ptr, end))
844
18
      return XML_TOK_TRAILING_CR;
845
1.02M
    if (BYTE_TYPE(enc, ptr) == BT_LF)
846
141k
      ptr += MINBPC(enc);
847
1.02M
    *nextTokPtr = ptr;
848
1.02M
    return XML_TOK_DATA_NEWLINE;
849
623k
  case BT_LF:
850
623k
    *nextTokPtr = ptr + MINBPC(enc);
851
623k
    return XML_TOK_DATA_NEWLINE;
852
117k
  case BT_RSQB:
853
117k
    ptr += MINBPC(enc);
854
117k
    if (! HAS_CHAR(enc, ptr, end))
855
22
      return XML_TOK_TRAILING_RSQB;
856
117k
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
857
23.1k
      break;
858
93.9k
    ptr += MINBPC(enc);
859
93.9k
    if (! HAS_CHAR(enc, ptr, end))
860
6
      return XML_TOK_TRAILING_RSQB;
861
93.8k
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
862
93.8k
      ptr -= MINBPC(enc);
863
93.8k
      break;
864
93.8k
    }
865
1
    *nextTokPtr = ptr;
866
1
    return XML_TOK_INVALID;
867
69.1k
    INVALID_CASES(ptr, nextTokPtr)
868
522k
  default:
869
522k
    ptr += MINBPC(enc);
870
522k
    break;
871
3.55M
  }
872
12.3M
  while (HAS_CHAR(enc, ptr, end)) {
873
12.3M
    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
59.7k
      LEAD_CASE(2)
883
25.0k
      LEAD_CASE(3)
884
18.9k
      LEAD_CASE(4)
885
0
#  undef LEAD_CASE
886
372k
    case BT_RSQB:
887
372k
      if (HAS_CHARS(enc, ptr, end, 2)) {
888
372k
        if (! CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_RSQB)) {
889
172k
          ptr += MINBPC(enc);
890
172k
          break;
891
172k
        }
892
200k
        if (HAS_CHARS(enc, ptr, end, 3)) {
893
200k
          if (! CHAR_MATCHES(enc, ptr + 2 * MINBPC(enc), ASCII_GT)) {
894
200k
            ptr += MINBPC(enc);
895
200k
            break;
896
200k
          }
897
2
          *nextTokPtr = ptr + 2 * MINBPC(enc);
898
2
          return XML_TOK_INVALID;
899
200k
        }
900
200k
      }
901
      /* fall through */
902
11.0k
    case BT_AMP:
903
174k
    case BT_LT:
904
174k
    case BT_NONXML:
905
174k
    case BT_MALFORM:
906
174k
    case BT_TRAIL:
907
522k
    case BT_CR:
908
666k
    case BT_LF:
909
666k
      *nextTokPtr = ptr;
910
666k
      return XML_TOK_DATA_CHARS;
911
11.2M
    default:
912
11.2M
      ptr += MINBPC(enc);
913
11.2M
      break;
914
12.3M
    }
915
12.3M
  }
916
7.01k
  *nextTokPtr = ptr;
917
7.01k
  return XML_TOK_DATA_CHARS;
918
673k
}
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.19k
                    const char **nextTokPtr) {
925
6.19k
  REQUIRE_CHAR(enc, ptr, end);
926
6.16k
  switch (BYTE_TYPE(enc, ptr)) {
927
4.68k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
928
921
  case BT_S:
929
1.64k
  case BT_LF:
930
2.13k
  case BT_CR:
931
2.13k
  case BT_PERCNT:
932
2.13k
    *nextTokPtr = ptr;
933
2.13k
    return XML_TOK_PERCENT;
934
2
  default:
935
2
    *nextTokPtr = ptr;
936
2
    return XML_TOK_INVALID;
937
6.16k
  }
938
41.3k
  while (HAS_CHAR(enc, ptr, end)) {
939
41.3k
    switch (BYTE_TYPE(enc, ptr)) {
940
109k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
941
3.80k
    case BT_SEMI:
942
3.80k
      *nextTokPtr = ptr + MINBPC(enc);
943
3.80k
      return XML_TOK_PARAM_ENTITY_REF;
944
20
    default:
945
20
      *nextTokPtr = ptr;
946
20
      return XML_TOK_INVALID;
947
41.3k
    }
948
41.3k
  }
949
106
  return XML_TOK_PARTIAL;
950
3.98k
}
xmltok.c:normal_scanPercent
Line
Count
Source
924
6.19k
                    const char **nextTokPtr) {
925
6.19k
  REQUIRE_CHAR(enc, ptr, end);
926
6.16k
  switch (BYTE_TYPE(enc, ptr)) {
927
4.68k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
928
921
  case BT_S:
929
1.64k
  case BT_LF:
930
2.13k
  case BT_CR:
931
2.13k
  case BT_PERCNT:
932
2.13k
    *nextTokPtr = ptr;
933
2.13k
    return XML_TOK_PERCENT;
934
2
  default:
935
2
    *nextTokPtr = ptr;
936
2
    return XML_TOK_INVALID;
937
6.16k
  }
938
41.3k
  while (HAS_CHAR(enc, ptr, end)) {
939
41.3k
    switch (BYTE_TYPE(enc, ptr)) {
940
109k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
941
3.80k
    case BT_SEMI:
942
3.80k
      *nextTokPtr = ptr + MINBPC(enc);
943
3.80k
      return XML_TOK_PARAM_ENTITY_REF;
944
20
    default:
945
20
      *nextTokPtr = ptr;
946
20
      return XML_TOK_INVALID;
947
41.3k
    }
948
41.3k
  }
949
106
  return XML_TOK_PARTIAL;
950
3.98k
}
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
257k
                      const char **nextTokPtr) {
955
257k
  REQUIRE_CHAR(enc, ptr, end);
956
257k
  switch (BYTE_TYPE(enc, ptr)) {
957
256k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
958
6
  default:
959
6
    *nextTokPtr = ptr;
960
6
    return XML_TOK_INVALID;
961
257k
  }
962
1.85M
  while (HAS_CHAR(enc, ptr, end)) {
963
1.85M
    switch (BYTE_TYPE(enc, ptr)) {
964
5.83M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
965
37.0k
    case BT_CR:
966
41.3k
    case BT_LF:
967
254k
    case BT_S:
968
254k
    case BT_RPAR:
969
256k
    case BT_GT:
970
256k
    case BT_PERCNT:
971
256k
    case BT_VERBAR:
972
256k
      *nextTokPtr = ptr;
973
256k
      return XML_TOK_POUND_NAME;
974
22
    default:
975
22
      *nextTokPtr = ptr;
976
22
      return XML_TOK_INVALID;
977
1.85M
    }
978
1.85M
  }
979
234
  return -XML_TOK_POUND_NAME;
980
257k
}
xmltok.c:normal_scanPoundName
Line
Count
Source
954
257k
                      const char **nextTokPtr) {
955
257k
  REQUIRE_CHAR(enc, ptr, end);
956
257k
  switch (BYTE_TYPE(enc, ptr)) {
957
256k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
958
6
  default:
959
6
    *nextTokPtr = ptr;
960
6
    return XML_TOK_INVALID;
961
257k
  }
962
1.85M
  while (HAS_CHAR(enc, ptr, end)) {
963
1.85M
    switch (BYTE_TYPE(enc, ptr)) {
964
5.83M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
965
37.0k
    case BT_CR:
966
41.3k
    case BT_LF:
967
254k
    case BT_S:
968
254k
    case BT_RPAR:
969
256k
    case BT_GT:
970
256k
    case BT_PERCNT:
971
256k
    case BT_VERBAR:
972
256k
      *nextTokPtr = ptr;
973
256k
      return XML_TOK_POUND_NAME;
974
22
    default:
975
22
      *nextTokPtr = ptr;
976
22
      return XML_TOK_INVALID;
977
1.85M
    }
978
1.85M
  }
979
234
  return -XML_TOK_POUND_NAME;
980
257k
}
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
59.9k
                const char **nextTokPtr) {
985
6.64M
  while (HAS_CHAR(enc, ptr, end)) {
986
6.64M
    int t = BYTE_TYPE(enc, ptr);
987
6.64M
    switch (t) {
988
60.7k
      INVALID_CASES(ptr, nextTokPtr)
989
9.01k
    case BT_QUOT:
990
62.4k
    case BT_APOS:
991
62.4k
      ptr += MINBPC(enc);
992
62.4k
      if (t != open)
993
2.63k
        break;
994
59.7k
      if (! HAS_CHAR(enc, ptr, end))
995
619
        return -XML_TOK_LITERAL;
996
59.1k
      *nextTokPtr = ptr;
997
59.1k
      switch (BYTE_TYPE(enc, ptr)) {
998
8.67k
      case BT_S:
999
11.6k
      case BT_CR:
1000
42.5k
      case BT_LF:
1001
58.9k
      case BT_GT:
1002
58.9k
      case BT_PERCNT:
1003
59.1k
      case BT_LSQB:
1004
59.1k
        return XML_TOK_LITERAL;
1005
23
      default:
1006
23
        return XML_TOK_INVALID;
1007
59.1k
      }
1008
6.55M
    default:
1009
6.55M
      ptr += MINBPC(enc);
1010
6.55M
      break;
1011
6.64M
    }
1012
6.64M
  }
1013
106
  return XML_TOK_PARTIAL;
1014
59.9k
}
xmltok.c:normal_scanLit
Line
Count
Source
984
59.9k
                const char **nextTokPtr) {
985
6.64M
  while (HAS_CHAR(enc, ptr, end)) {
986
6.64M
    int t = BYTE_TYPE(enc, ptr);
987
6.64M
    switch (t) {
988
60.7k
      INVALID_CASES(ptr, nextTokPtr)
989
9.01k
    case BT_QUOT:
990
62.4k
    case BT_APOS:
991
62.4k
      ptr += MINBPC(enc);
992
62.4k
      if (t != open)
993
2.63k
        break;
994
59.7k
      if (! HAS_CHAR(enc, ptr, end))
995
619
        return -XML_TOK_LITERAL;
996
59.1k
      *nextTokPtr = ptr;
997
59.1k
      switch (BYTE_TYPE(enc, ptr)) {
998
8.67k
      case BT_S:
999
11.6k
      case BT_CR:
1000
42.5k
      case BT_LF:
1001
58.9k
      case BT_GT:
1002
58.9k
      case BT_PERCNT:
1003
59.1k
      case BT_LSQB:
1004
59.1k
        return XML_TOK_LITERAL;
1005
23
      default:
1006
23
        return XML_TOK_INVALID;
1007
59.1k
      }
1008
6.55M
    default:
1009
6.55M
      ptr += MINBPC(enc);
1010
6.55M
      break;
1011
6.64M
    }
1012
6.64M
  }
1013
106
  return XML_TOK_PARTIAL;
1014
59.9k
}
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
3.93M
                  const char **nextTokPtr) {
1019
3.93M
  int tok;
1020
3.93M
  if (ptr >= end)
1021
7.10k
    return XML_TOK_NONE;
1022
3.92M
  if (MINBPC(enc) > 1) {
1023
270
    size_t n = end - ptr;
1024
270
    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
270
  }
1031
3.92M
  switch (BYTE_TYPE(enc, ptr)) {
1032
7.25k
  case BT_QUOT:
1033
7.25k
    return PREFIX(scanLit)(BT_QUOT, enc, ptr + MINBPC(enc), end, nextTokPtr);
1034
52.7k
  case BT_APOS:
1035
52.7k
    return PREFIX(scanLit)(BT_APOS, enc, ptr + MINBPC(enc), end, nextTokPtr);
1036
59.1k
  case BT_LT: {
1037
59.1k
    ptr += MINBPC(enc);
1038
59.1k
    REQUIRE_CHAR(enc, ptr, end);
1039
59.1k
    switch (BYTE_TYPE(enc, ptr)) {
1040
41.4k
    case BT_EXCL:
1041
41.4k
      return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1042
12.0k
    case BT_QUEST:
1043
12.0k
      return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1044
4.24k
    case BT_NMSTRT:
1045
5.49k
    case BT_HEX:
1046
5.49k
    case BT_NONASCII:
1047
5.54k
    case BT_LEAD2:
1048
5.58k
    case BT_LEAD3:
1049
5.59k
    case BT_LEAD4:
1050
5.59k
      *nextTokPtr = ptr - MINBPC(enc);
1051
5.59k
      return XML_TOK_INSTANCE_START;
1052
59.1k
    }
1053
24
    *nextTokPtr = ptr;
1054
24
    return XML_TOK_INVALID;
1055
59.1k
  }
1056
357k
  case BT_CR:
1057
357k
    if (ptr + MINBPC(enc) == end) {
1058
477
      *nextTokPtr = end;
1059
      /* indicate that this might be part of a CR/LF pair */
1060
477
      return -XML_TOK_PROLOG_S;
1061
477
    }
1062
    /* fall through */
1063
913k
  case BT_S:
1064
1.00M
  case BT_LF:
1065
1.45M
    for (;;) {
1066
1.45M
      ptr += MINBPC(enc);
1067
1.45M
      if (! HAS_CHAR(enc, ptr, end))
1068
269
        break;
1069
1.45M
      switch (BYTE_TYPE(enc, ptr)) {
1070
426k
      case BT_S:
1071
440k
      case BT_LF:
1072
440k
        break;
1073
5.26k
      case BT_CR:
1074
        /* don't split CR/LF pair */
1075
5.26k
        if (ptr + MINBPC(enc) != end)
1076
5.04k
          break;
1077
        /* fall through */
1078
1.00M
      default:
1079
1.00M
        *nextTokPtr = ptr;
1080
1.00M
        return XML_TOK_PROLOG_S;
1081
1.45M
      }
1082
1.45M
    }
1083
269
    *nextTokPtr = ptr;
1084
269
    return XML_TOK_PROLOG_S;
1085
6.19k
  case BT_PERCNT:
1086
6.19k
    return PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1087
5.51k
  case BT_COMMA:
1088
5.51k
    *nextTokPtr = ptr + MINBPC(enc);
1089
5.51k
    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.10k
  case BT_RSQB:
1094
1.10k
    ptr += MINBPC(enc);
1095
1.10k
    if (! HAS_CHAR(enc, ptr, end))
1096
9
      return -XML_TOK_CLOSE_BRACKET;
1097
1.09k
    if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) {
1098
33
      REQUIRE_CHARS(enc, ptr, end, 2);
1099
31
      if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_GT)) {
1100
6
        *nextTokPtr = ptr + 2 * MINBPC(enc);
1101
6
        return XML_TOK_COND_SECT_CLOSE;
1102
6
      }
1103
31
    }
1104
1.08k
    *nextTokPtr = ptr;
1105
1.08k
    return XML_TOK_CLOSE_BRACKET;
1106
1.47M
  case BT_LPAR:
1107
1.47M
    *nextTokPtr = ptr + MINBPC(enc);
1108
1.47M
    return XML_TOK_OPEN_PAREN;
1109
313k
  case BT_RPAR:
1110
313k
    ptr += MINBPC(enc);
1111
313k
    if (! HAS_CHAR(enc, ptr, end))
1112
101
      return -XML_TOK_CLOSE_PAREN;
1113
313k
    switch (BYTE_TYPE(enc, ptr)) {
1114
16.9k
    case BT_AST:
1115
16.9k
      *nextTokPtr = ptr + MINBPC(enc);
1116
16.9k
      return XML_TOK_CLOSE_PAREN_ASTERISK;
1117
5.55k
    case BT_QUEST:
1118
5.55k
      *nextTokPtr = ptr + MINBPC(enc);
1119
5.55k
      return XML_TOK_CLOSE_PAREN_QUESTION;
1120
5.29k
    case BT_PLUS:
1121
5.29k
      *nextTokPtr = ptr + MINBPC(enc);
1122
5.29k
      return XML_TOK_CLOSE_PAREN_PLUS;
1123
7.98k
    case BT_CR:
1124
8.66k
    case BT_LF:
1125
258k
    case BT_S:
1126
259k
    case BT_GT:
1127
260k
    case BT_COMMA:
1128
265k
    case BT_VERBAR:
1129
285k
    case BT_RPAR:
1130
285k
      *nextTokPtr = ptr;
1131
285k
      return XML_TOK_CLOSE_PAREN;
1132
313k
    }
1133
10
    *nextTokPtr = ptr;
1134
10
    return XML_TOK_INVALID;
1135
20.1k
  case BT_VERBAR:
1136
20.1k
    *nextTokPtr = ptr + MINBPC(enc);
1137
20.1k
    return XML_TOK_OR;
1138
35.5k
  case BT_GT:
1139
35.5k
    *nextTokPtr = ptr + MINBPC(enc);
1140
35.5k
    return XML_TOK_DECL_CLOSE;
1141
257k
  case BT_NUM:
1142
257k
    return PREFIX(scanPoundName)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1143
0
#  define LEAD_CASE(n)                                                         \
1144
2.79k
  case BT_LEAD##n:                                                             \
1145
2.79k
    if (end - ptr < n)                                                         \
1146
86
      return XML_TOK_PARTIAL_CHAR;                                             \
1147
2.71k
    if (IS_INVALID_CHAR(enc, ptr, n)) {                                        \
1148
91
      *nextTokPtr = ptr;                                                       \
1149
91
      return XML_TOK_INVALID;                                                  \
1150
91
    }                                                                          \
1151
2.71k
    if (IS_NMSTRT_CHAR(enc, ptr, n)) {                                         \
1152
2.20k
      ptr += n;                                                                \
1153
2.20k
      tok = XML_TOK_NAME;                                                      \
1154
2.20k
      break;                                                                   \
1155
2.20k
    }                                                                          \
1156
2.62k
    if (IS_NAME_CHAR(enc, ptr, n)) {                                           \
1157
327
      ptr += n;                                                                \
1158
327
      tok = XML_TOK_NMTOKEN;                                                   \
1159
327
      break;                                                                   \
1160
327
    }                                                                          \
1161
413
    *nextTokPtr = ptr;                                                         \
1162
86
    return XML_TOK_INVALID;
1163
2.72k
    LEAD_CASE(2)
1164
5.46k
    LEAD_CASE(3)
1165
350
    LEAD_CASE(4)
1166
0
#  undef LEAD_CASE
1167
380k
  case BT_NMSTRT:
1168
669k
  case BT_HEX:
1169
669k
    tok = XML_TOK_NAME;
1170
669k
    ptr += MINBPC(enc);
1171
669k
    break;
1172
628
  case BT_DIGIT:
1173
4.74k
  case BT_NAME:
1174
5.36k
  case BT_MINUS:
1175
#  ifdef XML_NS
1176
  case BT_COLON:
1177
#  endif
1178
5.36k
    tok = XML_TOK_NMTOKEN;
1179
5.36k
    ptr += MINBPC(enc);
1180
5.36k
    break;
1181
201
  case BT_NONASCII:
1182
201
    if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {
1183
150
      ptr += MINBPC(enc);
1184
150
      tok = XML_TOK_NAME;
1185
150
      break;
1186
150
    }
1187
51
    if (IS_NAME_CHAR_MINBPC(enc, ptr)) {
1188
24
      ptr += MINBPC(enc);
1189
24
      tok = XML_TOK_NMTOKEN;
1190
24
      break;
1191
24
    }
1192
    /* fall through */
1193
76
  default:
1194
76
    *nextTokPtr = ptr;
1195
76
    return XML_TOK_INVALID;
1196
3.92M
  }
1197
11.4M
  while (HAS_CHAR(enc, ptr, end)) {
1198
11.4M
    switch (BYTE_TYPE(enc, ptr)) {
1199
28.5M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1200
10.9k
    case BT_GT:
1201
275k
    case BT_RPAR:
1202
276k
    case BT_COMMA:
1203
283k
    case BT_VERBAR:
1204
286k
    case BT_LSQB:
1205
286k
    case BT_PERCNT:
1206
355k
    case BT_S:
1207
628k
    case BT_CR:
1208
670k
    case BT_LF:
1209
670k
      *nextTokPtr = ptr;
1210
670k
      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
468
    case BT_PLUS:
1232
468
      if (tok == XML_TOK_NMTOKEN) {
1233
3
        *nextTokPtr = ptr;
1234
3
        return XML_TOK_INVALID;
1235
3
      }
1236
465
      *nextTokPtr = ptr + MINBPC(enc);
1237
465
      return XML_TOK_NAME_PLUS;
1238
5.19k
    case BT_AST:
1239
5.19k
      if (tok == XML_TOK_NMTOKEN) {
1240
1
        *nextTokPtr = ptr;
1241
1
        return XML_TOK_INVALID;
1242
1
      }
1243
5.19k
      *nextTokPtr = ptr + MINBPC(enc);
1244
5.19k
      return XML_TOK_NAME_ASTERISK;
1245
334
    case BT_QUEST:
1246
334
      if (tok == XML_TOK_NMTOKEN) {
1247
1
        *nextTokPtr = ptr;
1248
1
        return XML_TOK_INVALID;
1249
1
      }
1250
333
      *nextTokPtr = ptr + MINBPC(enc);
1251
333
      return XML_TOK_NAME_QUESTION;
1252
73
    default:
1253
73
      *nextTokPtr = ptr;
1254
73
      return XML_TOK_INVALID;
1255
11.4M
    }
1256
11.4M
  }
1257
786
  return -tok;
1258
677k
}
xmltok.c:normal_prologTok
Line
Count
Source
1018
3.93M
                  const char **nextTokPtr) {
1019
3.93M
  int tok;
1020
3.93M
  if (ptr >= end)
1021
7.10k
    return XML_TOK_NONE;
1022
3.92M
  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
3.92M
  switch (BYTE_TYPE(enc, ptr)) {
1032
7.25k
  case BT_QUOT:
1033
7.25k
    return PREFIX(scanLit)(BT_QUOT, enc, ptr + MINBPC(enc), end, nextTokPtr);
1034
52.7k
  case BT_APOS:
1035
52.7k
    return PREFIX(scanLit)(BT_APOS, enc, ptr + MINBPC(enc), end, nextTokPtr);
1036
59.1k
  case BT_LT: {
1037
59.1k
    ptr += MINBPC(enc);
1038
59.1k
    REQUIRE_CHAR(enc, ptr, end);
1039
59.1k
    switch (BYTE_TYPE(enc, ptr)) {
1040
41.4k
    case BT_EXCL:
1041
41.4k
      return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1042
12.0k
    case BT_QUEST:
1043
12.0k
      return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1044
4.24k
    case BT_NMSTRT:
1045
5.49k
    case BT_HEX:
1046
5.49k
    case BT_NONASCII:
1047
5.54k
    case BT_LEAD2:
1048
5.58k
    case BT_LEAD3:
1049
5.59k
    case BT_LEAD4:
1050
5.59k
      *nextTokPtr = ptr - MINBPC(enc);
1051
5.59k
      return XML_TOK_INSTANCE_START;
1052
59.1k
    }
1053
24
    *nextTokPtr = ptr;
1054
24
    return XML_TOK_INVALID;
1055
59.1k
  }
1056
357k
  case BT_CR:
1057
357k
    if (ptr + MINBPC(enc) == end) {
1058
477
      *nextTokPtr = end;
1059
      /* indicate that this might be part of a CR/LF pair */
1060
477
      return -XML_TOK_PROLOG_S;
1061
477
    }
1062
    /* fall through */
1063
913k
  case BT_S:
1064
1.00M
  case BT_LF:
1065
1.45M
    for (;;) {
1066
1.45M
      ptr += MINBPC(enc);
1067
1.45M
      if (! HAS_CHAR(enc, ptr, end))
1068
269
        break;
1069
1.45M
      switch (BYTE_TYPE(enc, ptr)) {
1070
426k
      case BT_S:
1071
440k
      case BT_LF:
1072
440k
        break;
1073
5.26k
      case BT_CR:
1074
        /* don't split CR/LF pair */
1075
5.26k
        if (ptr + MINBPC(enc) != end)
1076
5.04k
          break;
1077
        /* fall through */
1078
1.00M
      default:
1079
1.00M
        *nextTokPtr = ptr;
1080
1.00M
        return XML_TOK_PROLOG_S;
1081
1.45M
      }
1082
1.45M
    }
1083
269
    *nextTokPtr = ptr;
1084
269
    return XML_TOK_PROLOG_S;
1085
6.19k
  case BT_PERCNT:
1086
6.19k
    return PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1087
5.51k
  case BT_COMMA:
1088
5.51k
    *nextTokPtr = ptr + MINBPC(enc);
1089
5.51k
    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.10k
  case BT_RSQB:
1094
1.10k
    ptr += MINBPC(enc);
1095
1.10k
    if (! HAS_CHAR(enc, ptr, end))
1096
9
      return -XML_TOK_CLOSE_BRACKET;
1097
1.09k
    if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) {
1098
33
      REQUIRE_CHARS(enc, ptr, end, 2);
1099
31
      if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_GT)) {
1100
6
        *nextTokPtr = ptr + 2 * MINBPC(enc);
1101
6
        return XML_TOK_COND_SECT_CLOSE;
1102
6
      }
1103
31
    }
1104
1.08k
    *nextTokPtr = ptr;
1105
1.08k
    return XML_TOK_CLOSE_BRACKET;
1106
1.47M
  case BT_LPAR:
1107
1.47M
    *nextTokPtr = ptr + MINBPC(enc);
1108
1.47M
    return XML_TOK_OPEN_PAREN;
1109
313k
  case BT_RPAR:
1110
313k
    ptr += MINBPC(enc);
1111
313k
    if (! HAS_CHAR(enc, ptr, end))
1112
101
      return -XML_TOK_CLOSE_PAREN;
1113
313k
    switch (BYTE_TYPE(enc, ptr)) {
1114
16.9k
    case BT_AST:
1115
16.9k
      *nextTokPtr = ptr + MINBPC(enc);
1116
16.9k
      return XML_TOK_CLOSE_PAREN_ASTERISK;
1117
5.55k
    case BT_QUEST:
1118
5.55k
      *nextTokPtr = ptr + MINBPC(enc);
1119
5.55k
      return XML_TOK_CLOSE_PAREN_QUESTION;
1120
5.29k
    case BT_PLUS:
1121
5.29k
      *nextTokPtr = ptr + MINBPC(enc);
1122
5.29k
      return XML_TOK_CLOSE_PAREN_PLUS;
1123
7.98k
    case BT_CR:
1124
8.66k
    case BT_LF:
1125
258k
    case BT_S:
1126
259k
    case BT_GT:
1127
260k
    case BT_COMMA:
1128
265k
    case BT_VERBAR:
1129
285k
    case BT_RPAR:
1130
285k
      *nextTokPtr = ptr;
1131
285k
      return XML_TOK_CLOSE_PAREN;
1132
313k
    }
1133
10
    *nextTokPtr = ptr;
1134
10
    return XML_TOK_INVALID;
1135
20.1k
  case BT_VERBAR:
1136
20.1k
    *nextTokPtr = ptr + MINBPC(enc);
1137
20.1k
    return XML_TOK_OR;
1138
35.5k
  case BT_GT:
1139
35.5k
    *nextTokPtr = ptr + MINBPC(enc);
1140
35.5k
    return XML_TOK_DECL_CLOSE;
1141
257k
  case BT_NUM:
1142
257k
    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
2.72k
    LEAD_CASE(2)
1164
5.46k
    LEAD_CASE(3)
1165
194
    LEAD_CASE(4)
1166
0
#  undef LEAD_CASE
1167
380k
  case BT_NMSTRT:
1168
669k
  case BT_HEX:
1169
669k
    tok = XML_TOK_NAME;
1170
669k
    ptr += MINBPC(enc);
1171
669k
    break;
1172
628
  case BT_DIGIT:
1173
4.74k
  case BT_NAME:
1174
5.36k
  case BT_MINUS:
1175
#  ifdef XML_NS
1176
  case BT_COLON:
1177
#  endif
1178
5.36k
    tok = XML_TOK_NMTOKEN;
1179
5.36k
    ptr += MINBPC(enc);
1180
5.36k
    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
38
  default:
1194
38
    *nextTokPtr = ptr;
1195
38
    return XML_TOK_INVALID;
1196
3.92M
  }
1197
11.4M
  while (HAS_CHAR(enc, ptr, end)) {
1198
11.4M
    switch (BYTE_TYPE(enc, ptr)) {
1199
28.5M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1200
10.9k
    case BT_GT:
1201
275k
    case BT_RPAR:
1202
276k
    case BT_COMMA:
1203
283k
    case BT_VERBAR:
1204
286k
    case BT_LSQB:
1205
286k
    case BT_PERCNT:
1206
355k
    case BT_S:
1207
628k
    case BT_CR:
1208
670k
    case BT_LF:
1209
670k
      *nextTokPtr = ptr;
1210
670k
      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
468
    case BT_PLUS:
1232
468
      if (tok == XML_TOK_NMTOKEN) {
1233
3
        *nextTokPtr = ptr;
1234
3
        return XML_TOK_INVALID;
1235
3
      }
1236
465
      *nextTokPtr = ptr + MINBPC(enc);
1237
465
      return XML_TOK_NAME_PLUS;
1238
5.19k
    case BT_AST:
1239
5.19k
      if (tok == XML_TOK_NMTOKEN) {
1240
1
        *nextTokPtr = ptr;
1241
1
        return XML_TOK_INVALID;
1242
1
      }
1243
5.19k
      *nextTokPtr = ptr + MINBPC(enc);
1244
5.19k
      return XML_TOK_NAME_ASTERISK;
1245
334
    case BT_QUEST:
1246
334
      if (tok == XML_TOK_NMTOKEN) {
1247
1
        *nextTokPtr = ptr;
1248
1
        return XML_TOK_INVALID;
1249
1
      }
1250
333
      *nextTokPtr = ptr + MINBPC(enc);
1251
333
      return XML_TOK_NAME_QUESTION;
1252
51
    default:
1253
51
      *nextTokPtr = ptr;
1254
51
      return XML_TOK_INVALID;
1255
11.4M
    }
1256
11.4M
  }
1257
746
  return -tok;
1258
677k
}
xmltok.c:little2_prologTok
Line
Count
Source
1018
140
                  const char **nextTokPtr) {
1019
140
  int tok;
1020
140
  if (ptr >= end)
1021
2
    return XML_TOK_NONE;
1022
138
  if (MINBPC(enc) > 1) {
1023
138
    size_t n = end - ptr;
1024
138
    if (n & (MINBPC(enc) - 1)) {
1025
24
      n &= ~(MINBPC(enc) - 1);
1026
24
      if (n == 0)
1027
2
        return XML_TOK_PARTIAL;
1028
22
      end = ptr + n;
1029
22
    }
1030
138
  }
1031
136
  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
86
    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
75
      ptr += MINBPC(enc);
1184
75
      tok = XML_TOK_NAME;
1185
75
      break;
1186
75
    }
1187
26
    if (IS_NAME_CHAR_MINBPC(enc, ptr)) {
1188
12
      ptr += MINBPC(enc);
1189
12
      tok = XML_TOK_NMTOKEN;
1190
12
      break;
1191
12
    }
1192
    /* fall through */
1193
20
  default:
1194
20
    *nextTokPtr = ptr;
1195
20
    return XML_TOK_INVALID;
1196
136
  }
1197
941
  while (HAS_CHAR(enc, ptr, end)) {
1198
941
    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
10
    default:
1253
10
      *nextTokPtr = ptr;
1254
10
      return XML_TOK_INVALID;
1255
941
    }
1256
941
  }
1257
20
  return -tok;
1258
87
}
xmltok.c:big2_prologTok
Line
Count
Source
1018
134
                  const char **nextTokPtr) {
1019
134
  int tok;
1020
134
  if (ptr >= end)
1021
2
    return XML_TOK_NONE;
1022
132
  if (MINBPC(enc) > 1) {
1023
132
    size_t n = end - ptr;
1024
132
    if (n & (MINBPC(enc) - 1)) {
1025
21
      n &= ~(MINBPC(enc) - 1);
1026
21
      if (n == 0)
1027
2
        return XML_TOK_PARTIAL;
1028
19
      end = ptr + n;
1029
19
    }
1030
132
  }
1031
130
  switch (BYTE_TYPE(enc, ptr)) {
1032
0
  case BT_QUOT:
1033
0
    return PREFIX(scanLit)(BT_QUOT, enc, ptr + MINBPC(enc), end, nextTokPtr);
1034
0
  case BT_APOS:
1035
0
    return PREFIX(scanLit)(BT_APOS, enc, ptr + MINBPC(enc), end, nextTokPtr);
1036
0
  case BT_LT: {
1037
0
    ptr += MINBPC(enc);
1038
0
    REQUIRE_CHAR(enc, ptr, end);
1039
0
    switch (BYTE_TYPE(enc, ptr)) {
1040
0
    case BT_EXCL:
1041
0
      return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1042
0
    case BT_QUEST:
1043
0
      return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1044
0
    case BT_NMSTRT:
1045
0
    case BT_HEX:
1046
0
    case BT_NONASCII:
1047
0
    case BT_LEAD2:
1048
0
    case BT_LEAD3:
1049
0
    case BT_LEAD4:
1050
0
      *nextTokPtr = ptr - MINBPC(enc);
1051
0
      return XML_TOK_INSTANCE_START;
1052
0
    }
1053
0
    *nextTokPtr = ptr;
1054
0
    return XML_TOK_INVALID;
1055
0
  }
1056
0
  case BT_CR:
1057
0
    if (ptr + MINBPC(enc) == end) {
1058
0
      *nextTokPtr = end;
1059
      /* indicate that this might be part of a CR/LF pair */
1060
0
      return -XML_TOK_PROLOG_S;
1061
0
    }
1062
    /* fall through */
1063
0
  case BT_S:
1064
0
  case BT_LF:
1065
0
    for (;;) {
1066
0
      ptr += MINBPC(enc);
1067
0
      if (! HAS_CHAR(enc, ptr, end))
1068
0
        break;
1069
0
      switch (BYTE_TYPE(enc, ptr)) {
1070
0
      case BT_S:
1071
0
      case BT_LF:
1072
0
        break;
1073
0
      case BT_CR:
1074
        /* don't split CR/LF pair */
1075
0
        if (ptr + MINBPC(enc) != end)
1076
0
          break;
1077
        /* fall through */
1078
0
      default:
1079
0
        *nextTokPtr = ptr;
1080
0
        return XML_TOK_PROLOG_S;
1081
0
      }
1082
0
    }
1083
0
    *nextTokPtr = ptr;
1084
0
    return XML_TOK_PROLOG_S;
1085
0
  case BT_PERCNT:
1086
0
    return PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1087
0
  case BT_COMMA:
1088
0
    *nextTokPtr = ptr + MINBPC(enc);
1089
0
    return XML_TOK_COMMA;
1090
0
  case BT_LSQB:
1091
0
    *nextTokPtr = ptr + MINBPC(enc);
1092
0
    return XML_TOK_OPEN_BRACKET;
1093
0
  case BT_RSQB:
1094
0
    ptr += MINBPC(enc);
1095
0
    if (! HAS_CHAR(enc, ptr, end))
1096
0
      return -XML_TOK_CLOSE_BRACKET;
1097
0
    if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) {
1098
0
      REQUIRE_CHARS(enc, ptr, end, 2);
1099
0
      if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_GT)) {
1100
0
        *nextTokPtr = ptr + 2 * MINBPC(enc);
1101
0
        return XML_TOK_COND_SECT_CLOSE;
1102
0
      }
1103
0
    }
1104
0
    *nextTokPtr = ptr;
1105
0
    return XML_TOK_CLOSE_BRACKET;
1106
0
  case BT_LPAR:
1107
0
    *nextTokPtr = ptr + MINBPC(enc);
1108
0
    return XML_TOK_OPEN_PAREN;
1109
0
  case BT_RPAR:
1110
0
    ptr += MINBPC(enc);
1111
0
    if (! HAS_CHAR(enc, ptr, end))
1112
0
      return -XML_TOK_CLOSE_PAREN;
1113
0
    switch (BYTE_TYPE(enc, ptr)) {
1114
0
    case BT_AST:
1115
0
      *nextTokPtr = ptr + MINBPC(enc);
1116
0
      return XML_TOK_CLOSE_PAREN_ASTERISK;
1117
0
    case BT_QUEST:
1118
0
      *nextTokPtr = ptr + MINBPC(enc);
1119
0
      return XML_TOK_CLOSE_PAREN_QUESTION;
1120
0
    case BT_PLUS:
1121
0
      *nextTokPtr = ptr + MINBPC(enc);
1122
0
      return XML_TOK_CLOSE_PAREN_PLUS;
1123
0
    case BT_CR:
1124
0
    case BT_LF:
1125
0
    case BT_S:
1126
0
    case BT_GT:
1127
0
    case BT_COMMA:
1128
0
    case BT_VERBAR:
1129
0
    case BT_RPAR:
1130
0
      *nextTokPtr = ptr;
1131
0
      return XML_TOK_CLOSE_PAREN;
1132
0
    }
1133
0
    *nextTokPtr = ptr;
1134
0
    return XML_TOK_INVALID;
1135
0
  case BT_VERBAR:
1136
0
    *nextTokPtr = ptr + MINBPC(enc);
1137
0
    return XML_TOK_OR;
1138
0
  case BT_GT:
1139
0
    *nextTokPtr = ptr + MINBPC(enc);
1140
0
    return XML_TOK_DECL_CLOSE;
1141
0
  case BT_NUM:
1142
0
    return PREFIX(scanPoundName)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1143
0
#  define LEAD_CASE(n)                                                         \
1144
0
  case BT_LEAD##n:                                                             \
1145
0
    if (end - ptr < n)                                                         \
1146
0
      return XML_TOK_PARTIAL_CHAR;                                             \
1147
0
    if (IS_INVALID_CHAR(enc, ptr, n)) {                                        \
1148
0
      *nextTokPtr = ptr;                                                       \
1149
0
      return XML_TOK_INVALID;                                                  \
1150
0
    }                                                                          \
1151
0
    if (IS_NMSTRT_CHAR(enc, ptr, n)) {                                         \
1152
0
      ptr += n;                                                                \
1153
0
      tok = XML_TOK_NAME;                                                      \
1154
0
      break;                                                                   \
1155
0
    }                                                                          \
1156
0
    if (IS_NAME_CHAR(enc, ptr, n)) {                                           \
1157
0
      ptr += n;                                                                \
1158
0
      tok = XML_TOK_NMTOKEN;                                                   \
1159
0
      break;                                                                   \
1160
0
    }                                                                          \
1161
0
    *nextTokPtr = ptr;                                                         \
1162
0
    return XML_TOK_INVALID;
1163
0
    LEAD_CASE(2)
1164
0
    LEAD_CASE(3)
1165
70
    LEAD_CASE(4)
1166
0
#  undef LEAD_CASE
1167
0
  case BT_NMSTRT:
1168
0
  case BT_HEX:
1169
0
    tok = XML_TOK_NAME;
1170
0
    ptr += MINBPC(enc);
1171
0
    break;
1172
0
  case BT_DIGIT:
1173
0
  case BT_NAME:
1174
0
  case BT_MINUS:
1175
#  ifdef XML_NS
1176
  case BT_COLON:
1177
#  endif
1178
0
    tok = XML_TOK_NMTOKEN;
1179
0
    ptr += MINBPC(enc);
1180
0
    break;
1181
100
  case BT_NONASCII:
1182
100
    if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {
1183
75
      ptr += MINBPC(enc);
1184
75
      tok = XML_TOK_NAME;
1185
75
      break;
1186
75
    }
1187
25
    if (IS_NAME_CHAR_MINBPC(enc, ptr)) {
1188
12
      ptr += MINBPC(enc);
1189
12
      tok = XML_TOK_NMTOKEN;
1190
12
      break;
1191
12
    }
1192
    /* fall through */
1193
18
  default:
1194
18
    *nextTokPtr = ptr;
1195
18
    return XML_TOK_INVALID;
1196
130
  }
1197
13.6k
  while (HAS_CHAR(enc, ptr, end)) {
1198
13.6k
    switch (BYTE_TYPE(enc, ptr)) {
1199
68.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
12
    default:
1253
12
      *nextTokPtr = ptr;
1254
12
      return XML_TOK_INVALID;
1255
13.6k
    }
1256
13.6k
  }
1257
20
  return -tok;
1258
87
}
1259
1260
static int PTRCALL
1261
PREFIX(attributeValueTok)(const ENCODING *enc, const char *ptr, const char *end,
1262
2.21M
                          const char **nextTokPtr) {
1263
2.21M
  const char *start;
1264
2.21M
  if (ptr >= end)
1265
96.0k
    return XML_TOK_NONE;
1266
2.12M
  else if (! HAS_CHAR(enc, ptr, end)) {
1267
    /* This line cannot be executed.  The incoming data has already
1268
     * been tokenized once, so incomplete characters like this have
1269
     * already been eliminated from the input.  Retaining the paranoia
1270
     * check is still valuable, however.
1271
     */
1272
0
    return XML_TOK_PARTIAL; /* LCOV_EXCL_LINE */
1273
0
  }
1274
2.12M
  start = ptr;
1275
17.9M
  while (HAS_CHAR(enc, ptr, end)) {
1276
17.9M
    switch (BYTE_TYPE(enc, ptr)) {
1277
0
#  define LEAD_CASE(n)                                                         \
1278
85.7k
  case BT_LEAD##n:                                                             \
1279
85.7k
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1280
85.7k
    break;
1281
34.6k
      LEAD_CASE(2)
1282
11.5k
      LEAD_CASE(3)
1283
39.4k
      LEAD_CASE(4)
1284
0
#  undef LEAD_CASE
1285
101k
    case BT_AMP:
1286
101k
      if (ptr == start)
1287
84.7k
        return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1288
16.6k
      *nextTokPtr = ptr;
1289
16.6k
      return XML_TOK_DATA_CHARS;
1290
3
    case BT_LT:
1291
      /* this is for inside entity references */
1292
3
      *nextTokPtr = ptr;
1293
3
      return XML_TOK_INVALID;
1294
415k
    case BT_LF:
1295
415k
      if (ptr == start) {
1296
361k
        *nextTokPtr = ptr + MINBPC(enc);
1297
361k
        return XML_TOK_DATA_NEWLINE;
1298
361k
      }
1299
54.7k
      *nextTokPtr = ptr;
1300
54.7k
      return XML_TOK_DATA_CHARS;
1301
887k
    case BT_CR:
1302
887k
      if (ptr == start) {
1303
727k
        ptr += MINBPC(enc);
1304
727k
        if (! HAS_CHAR(enc, ptr, end))
1305
1.34k
          return XML_TOK_TRAILING_CR;
1306
726k
        if (BYTE_TYPE(enc, ptr) == BT_LF)
1307
207k
          ptr += MINBPC(enc);
1308
726k
        *nextTokPtr = ptr;
1309
726k
        return XML_TOK_DATA_NEWLINE;
1310
727k
      }
1311
159k
      *nextTokPtr = ptr;
1312
159k
      return XML_TOK_DATA_CHARS;
1313
650k
    case BT_S:
1314
650k
      if (ptr == start) {
1315
448k
        *nextTokPtr = ptr + MINBPC(enc);
1316
448k
        return XML_TOK_ATTRIBUTE_VALUE_S;
1317
448k
      }
1318
202k
      *nextTokPtr = ptr;
1319
202k
      return XML_TOK_DATA_CHARS;
1320
15.7M
    default:
1321
15.7M
      ptr += MINBPC(enc);
1322
15.7M
      break;
1323
17.9M
    }
1324
17.9M
  }
1325
64.4k
  *nextTokPtr = ptr;
1326
64.4k
  return XML_TOK_DATA_CHARS;
1327
2.12M
}
xmltok.c:normal_attributeValueTok
Line
Count
Source
1262
2.21M
                          const char **nextTokPtr) {
1263
2.21M
  const char *start;
1264
2.21M
  if (ptr >= end)
1265
96.0k
    return XML_TOK_NONE;
1266
2.12M
  else if (! HAS_CHAR(enc, ptr, end)) {
1267
    /* This line cannot be executed.  The incoming data has already
1268
     * been tokenized once, so incomplete characters like this have
1269
     * already been eliminated from the input.  Retaining the paranoia
1270
     * check is still valuable, however.
1271
     */
1272
0
    return XML_TOK_PARTIAL; /* LCOV_EXCL_LINE */
1273
0
  }
1274
2.12M
  start = ptr;
1275
17.9M
  while (HAS_CHAR(enc, ptr, end)) {
1276
17.9M
    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
34.6k
      LEAD_CASE(2)
1282
11.5k
      LEAD_CASE(3)
1283
39.4k
      LEAD_CASE(4)
1284
0
#  undef LEAD_CASE
1285
101k
    case BT_AMP:
1286
101k
      if (ptr == start)
1287
84.7k
        return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1288
16.6k
      *nextTokPtr = ptr;
1289
16.6k
      return XML_TOK_DATA_CHARS;
1290
3
    case BT_LT:
1291
      /* this is for inside entity references */
1292
3
      *nextTokPtr = ptr;
1293
3
      return XML_TOK_INVALID;
1294
415k
    case BT_LF:
1295
415k
      if (ptr == start) {
1296
361k
        *nextTokPtr = ptr + MINBPC(enc);
1297
361k
        return XML_TOK_DATA_NEWLINE;
1298
361k
      }
1299
54.7k
      *nextTokPtr = ptr;
1300
54.7k
      return XML_TOK_DATA_CHARS;
1301
887k
    case BT_CR:
1302
887k
      if (ptr == start) {
1303
727k
        ptr += MINBPC(enc);
1304
727k
        if (! HAS_CHAR(enc, ptr, end))
1305
1.34k
          return XML_TOK_TRAILING_CR;
1306
726k
        if (BYTE_TYPE(enc, ptr) == BT_LF)
1307
207k
          ptr += MINBPC(enc);
1308
726k
        *nextTokPtr = ptr;
1309
726k
        return XML_TOK_DATA_NEWLINE;
1310
727k
      }
1311
159k
      *nextTokPtr = ptr;
1312
159k
      return XML_TOK_DATA_CHARS;
1313
650k
    case BT_S:
1314
650k
      if (ptr == start) {
1315
448k
        *nextTokPtr = ptr + MINBPC(enc);
1316
448k
        return XML_TOK_ATTRIBUTE_VALUE_S;
1317
448k
      }
1318
202k
      *nextTokPtr = ptr;
1319
202k
      return XML_TOK_DATA_CHARS;
1320
15.7M
    default:
1321
15.7M
      ptr += MINBPC(enc);
1322
15.7M
      break;
1323
17.9M
    }
1324
17.9M
  }
1325
64.4k
  *nextTokPtr = ptr;
1326
64.4k
  return XML_TOK_DATA_CHARS;
1327
2.12M
}
Unexecuted instantiation: xmltok.c:little2_attributeValueTok
Unexecuted instantiation: xmltok.c:big2_attributeValueTok
1328
1329
static int PTRCALL
1330
PREFIX(entityValueTok)(const ENCODING *enc, const char *ptr, const char *end,
1331
0
                       const char **nextTokPtr) {
1332
0
  const char *start;
1333
0
  if (ptr >= end)
1334
0
    return XML_TOK_NONE;
1335
0
  else if (! HAS_CHAR(enc, ptr, end)) {
1336
    /* This line cannot be executed.  The incoming data has already
1337
     * been tokenized once, so incomplete characters like this have
1338
     * already been eliminated from the input.  Retaining the paranoia
1339
     * check is still valuable, however.
1340
     */
1341
0
    return XML_TOK_PARTIAL; /* LCOV_EXCL_LINE */
1342
0
  }
1343
0
  start = ptr;
1344
0
  while (HAS_CHAR(enc, ptr, end)) {
1345
0
    switch (BYTE_TYPE(enc, ptr)) {
1346
0
#  define LEAD_CASE(n)                                                         \
1347
0
  case BT_LEAD##n:                                                             \
1348
0
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1349
0
    break;
1350
0
      LEAD_CASE(2)
1351
0
      LEAD_CASE(3)
1352
0
      LEAD_CASE(4)
1353
0
#  undef LEAD_CASE
1354
0
    case BT_AMP:
1355
0
      if (ptr == start)
1356
0
        return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1357
0
      *nextTokPtr = ptr;
1358
0
      return XML_TOK_DATA_CHARS;
1359
0
    case BT_PERCNT:
1360
0
      if (ptr == start) {
1361
0
        int tok = PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1362
0
        return (tok == XML_TOK_PERCENT) ? XML_TOK_INVALID : tok;
1363
0
      }
1364
0
      *nextTokPtr = ptr;
1365
0
      return XML_TOK_DATA_CHARS;
1366
0
    case BT_LF:
1367
0
      if (ptr == start) {
1368
0
        *nextTokPtr = ptr + MINBPC(enc);
1369
0
        return XML_TOK_DATA_NEWLINE;
1370
0
      }
1371
0
      *nextTokPtr = ptr;
1372
0
      return XML_TOK_DATA_CHARS;
1373
0
    case BT_CR:
1374
0
      if (ptr == start) {
1375
0
        ptr += MINBPC(enc);
1376
0
        if (! HAS_CHAR(enc, ptr, end))
1377
0
          return XML_TOK_TRAILING_CR;
1378
0
        if (BYTE_TYPE(enc, ptr) == BT_LF)
1379
0
          ptr += MINBPC(enc);
1380
0
        *nextTokPtr = ptr;
1381
0
        return XML_TOK_DATA_NEWLINE;
1382
0
      }
1383
0
      *nextTokPtr = ptr;
1384
0
      return XML_TOK_DATA_CHARS;
1385
0
    default:
1386
0
      ptr += MINBPC(enc);
1387
0
      break;
1388
0
    }
1389
0
  }
1390
0
  *nextTokPtr = ptr;
1391
0
  return XML_TOK_DATA_CHARS;
1392
0
}
Unexecuted instantiation: xmltok.c:normal_entityValueTok
Unexecuted instantiation: xmltok.c:little2_entityValueTok
Unexecuted instantiation: xmltok.c:big2_entityValueTok
1393
1394
#  ifdef XML_DTD
1395
1396
static int PTRCALL
1397
PREFIX(ignoreSectionTok)(const ENCODING *enc, const char *ptr, const char *end,
1398
                         const char **nextTokPtr) {
1399
  int level = 0;
1400
  if (MINBPC(enc) > 1) {
1401
    size_t n = end - ptr;
1402
    if (n & (MINBPC(enc) - 1)) {
1403
      n &= ~(MINBPC(enc) - 1);
1404
      end = ptr + n;
1405
    }
1406
  }
1407
  while (HAS_CHAR(enc, ptr, end)) {
1408
    switch (BYTE_TYPE(enc, ptr)) {
1409
      INVALID_CASES(ptr, nextTokPtr)
1410
    case BT_LT:
1411
      ptr += MINBPC(enc);
1412
      REQUIRE_CHAR(enc, ptr, end);
1413
      if (CHAR_MATCHES(enc, ptr, ASCII_EXCL)) {
1414
        ptr += MINBPC(enc);
1415
        REQUIRE_CHAR(enc, ptr, end);
1416
        if (CHAR_MATCHES(enc, ptr, ASCII_LSQB)) {
1417
          ++level;
1418
          ptr += MINBPC(enc);
1419
        }
1420
      }
1421
      break;
1422
    case BT_RSQB:
1423
      ptr += MINBPC(enc);
1424
      REQUIRE_CHAR(enc, ptr, end);
1425
      if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) {
1426
        ptr += MINBPC(enc);
1427
        REQUIRE_CHAR(enc, ptr, end);
1428
        if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
1429
          ptr += MINBPC(enc);
1430
          if (level == 0) {
1431
            *nextTokPtr = ptr;
1432
            return XML_TOK_IGNORE_SECT;
1433
          }
1434
          --level;
1435
        }
1436
      }
1437
      break;
1438
    default:
1439
      ptr += MINBPC(enc);
1440
      break;
1441
    }
1442
  }
1443
  return XML_TOK_PARTIAL;
1444
}
1445
1446
#  endif /* XML_DTD */
1447
1448
static int PTRCALL
1449
PREFIX(isPublicId)(const ENCODING *enc, const char *ptr, const char *end,
1450
2.60k
                   const char **badPtr) {
1451
2.60k
  ptr += MINBPC(enc);
1452
2.60k
  end -= MINBPC(enc);
1453
274k
  for (; HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
1454
274k
    switch (BYTE_TYPE(enc, ptr)) {
1455
113k
    case BT_DIGIT:
1456
175k
    case BT_HEX:
1457
176k
    case BT_MINUS:
1458
176k
    case BT_APOS:
1459
176k
    case BT_LPAR:
1460
195k
    case BT_RPAR:
1461
195k
    case BT_PLUS:
1462
196k
    case BT_COMMA:
1463
225k
    case BT_SOL:
1464
225k
    case BT_EQUALS:
1465
227k
    case BT_QUEST:
1466
228k
    case BT_CR:
1467
229k
    case BT_LF:
1468
230k
    case BT_SEMI:
1469
230k
    case BT_EXCL:
1470
231k
    case BT_AST:
1471
232k
    case BT_PERCNT:
1472
236k
    case BT_NUM:
1473
#  ifdef XML_NS
1474
    case BT_COLON:
1475
#  endif
1476
236k
      break;
1477
1.09k
    case BT_S:
1478
1.09k
      if (CHAR_MATCHES(enc, ptr, ASCII_TAB)) {
1479
2
        *badPtr = ptr;
1480
2
        return 0;
1481
2
      }
1482
1.09k
      break;
1483
1.69k
    case BT_NAME:
1484
36.0k
    case BT_NMSTRT:
1485
36.0k
      if (! (BYTE_TO_ASCII(enc, ptr) & ~0x7f))
1486
36.0k
        break;
1487
      /* fall through */
1488
1.23k
    default:
1489
1.23k
      switch (BYTE_TO_ASCII(enc, ptr)) {
1490
930
      case 0x24: /* $ */
1491
1.21k
      case 0x40: /* @ */
1492
1.21k
        break;
1493
17
      default:
1494
17
        *badPtr = ptr;
1495
17
        return 0;
1496
1.23k
      }
1497
1.21k
      break;
1498
274k
    }
1499
274k
  }
1500
2.58k
  return 1;
1501
2.60k
}
xmltok.c:normal_isPublicId
Line
Count
Source
1450
2.60k
                   const char **badPtr) {
1451
2.60k
  ptr += MINBPC(enc);
1452
2.60k
  end -= MINBPC(enc);
1453
274k
  for (; HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
1454
274k
    switch (BYTE_TYPE(enc, ptr)) {
1455
113k
    case BT_DIGIT:
1456
175k
    case BT_HEX:
1457
176k
    case BT_MINUS:
1458
176k
    case BT_APOS:
1459
176k
    case BT_LPAR:
1460
195k
    case BT_RPAR:
1461
195k
    case BT_PLUS:
1462
196k
    case BT_COMMA:
1463
225k
    case BT_SOL:
1464
225k
    case BT_EQUALS:
1465
227k
    case BT_QUEST:
1466
228k
    case BT_CR:
1467
229k
    case BT_LF:
1468
230k
    case BT_SEMI:
1469
230k
    case BT_EXCL:
1470
231k
    case BT_AST:
1471
232k
    case BT_PERCNT:
1472
236k
    case BT_NUM:
1473
#  ifdef XML_NS
1474
    case BT_COLON:
1475
#  endif
1476
236k
      break;
1477
1.09k
    case BT_S:
1478
1.09k
      if (CHAR_MATCHES(enc, ptr, ASCII_TAB)) {
1479
2
        *badPtr = ptr;
1480
2
        return 0;
1481
2
      }
1482
1.09k
      break;
1483
1.69k
    case BT_NAME:
1484
36.0k
    case BT_NMSTRT:
1485
36.0k
      if (! (BYTE_TO_ASCII(enc, ptr) & ~0x7f))
1486
36.0k
        break;
1487
      /* fall through */
1488
1.23k
    default:
1489
1.23k
      switch (BYTE_TO_ASCII(enc, ptr)) {
1490
930
      case 0x24: /* $ */
1491
1.21k
      case 0x40: /* @ */
1492
1.21k
        break;
1493
17
      default:
1494
17
        *badPtr = ptr;
1495
17
        return 0;
1496
1.23k
      }
1497
1.21k
      break;
1498
274k
    }
1499
274k
  }
1500
2.58k
  return 1;
1501
2.60k
}
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
948k
                ATTRIBUTE *atts) {
1511
948k
  enum { other, inName, inValue } state = inName;
1512
948k
  int nAtts = 0;
1513
948k
  int open = 0; /* defined when state == inValue;
1514
                   initialization just to shut up compilers */
1515
1516
48.6M
  for (ptr += MINBPC(enc);; ptr += MINBPC(enc)) {
1517
48.6M
    switch (BYTE_TYPE(enc, ptr)) {
1518
0
#  define START_NAME                                                           \
1519
27.5M
    if (state == other) {                                                      \
1520
3.82M
      if (nAtts < attsMax) {                                                   \
1521
1.96M
        atts[nAtts].name = ptr;                                                \
1522
1.96M
        atts[nAtts].normalized = 1;                                            \
1523
1.96M
      }                                                                        \
1524
3.82M
      state = inName;                                                          \
1525
3.82M
    }
1526
0
#  define LEAD_CASE(n)                                                         \
1527
183k
  case BT_LEAD##n: /* NOTE: The encoding has already been validated. */        \
1528
183k
    START_NAME ptr += (n - MINBPC(enc));                                       \
1529
183k
    break;
1530
105k
      LEAD_CASE(2)
1531
53.6k
      LEAD_CASE(3)
1532
23.9k
      LEAD_CASE(4)
1533
0
#  undef LEAD_CASE
1534
0
    case BT_NONASCII:
1535
24.7M
    case BT_NMSTRT:
1536
27.3M
    case BT_HEX:
1537
27.3M
      START_NAME
1538
27.3M
      break;
1539
0
#  undef START_NAME
1540
612k
    case BT_QUOT:
1541
612k
      if (state != inValue) {
1542
246k
        if (nAtts < attsMax)
1543
175k
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1544
246k
        state = inValue;
1545
246k
        open = BT_QUOT;
1546
365k
      } else if (open == BT_QUOT) {
1547
246k
        state = other;
1548
246k
        if (nAtts < attsMax)
1549
175k
          atts[nAtts].valueEnd = ptr;
1550
246k
        nAtts++;
1551
246k
      }
1552
612k
      break;
1553
7.17M
    case BT_APOS:
1554
7.17M
      if (state != inValue) {
1555
3.57M
        if (nAtts < attsMax)
1556
1.79M
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1557
3.57M
        state = inValue;
1558
3.57M
        open = BT_APOS;
1559
3.59M
      } else if (open == BT_APOS) {
1560
3.57M
        state = other;
1561
3.57M
        if (nAtts < attsMax)
1562
1.79M
          atts[nAtts].valueEnd = ptr;
1563
3.57M
        nAtts++;
1564
3.57M
      }
1565
7.17M
      break;
1566
28.7k
    case BT_AMP:
1567
28.7k
      if (nAtts < attsMax)
1568
28.0k
        atts[nAtts].normalized = 0;
1569
28.7k
      break;
1570
2.85M
    case BT_S:
1571
2.85M
      if (state == inName)
1572
63.8k
        state = other;
1573
2.79M
      else if (state == inValue && nAtts < attsMax && atts[nAtts].normalized
1574
86.5k
               && (ptr == atts[nAtts].valuePtr
1575
12.9k
                   || BYTE_TO_ASCII(enc, ptr) != ASCII_SPACE
1576
6.28k
                   || BYTE_TO_ASCII(enc, ptr + MINBPC(enc)) == ASCII_SPACE
1577
5.85k
                   || BYTE_TYPE(enc, ptr + MINBPC(enc)) == open))
1578
81.1k
        atts[nAtts].normalized = 0;
1579
2.85M
      break;
1580
2.53M
    case BT_CR:
1581
3.19M
    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.19M
      if (state == inName)
1585
25.9k
        state = other;
1586
3.16M
      else if (state == inValue && nAtts < attsMax)
1587
1.18M
        atts[nAtts].normalized = 0;
1588
3.19M
      break;
1589
875k
    case BT_GT:
1590
968k
    case BT_SOL:
1591
968k
      if (state != inValue)
1592
948k
        return nAtts;
1593
20.6k
      break;
1594
6.34M
    default:
1595
6.34M
      break;
1596
48.6M
    }
1597
48.6M
  }
1598
  /* not reached */
1599
948k
}
xmltok.c:normal_getAtts
Line
Count
Source
1510
948k
                ATTRIBUTE *atts) {
1511
948k
  enum { other, inName, inValue } state = inName;
1512
948k
  int nAtts = 0;
1513
948k
  int open = 0; /* defined when state == inValue;
1514
                   initialization just to shut up compilers */
1515
1516
48.6M
  for (ptr += MINBPC(enc);; ptr += MINBPC(enc)) {
1517
48.6M
    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
105k
      LEAD_CASE(2)
1531
53.6k
      LEAD_CASE(3)
1532
23.9k
      LEAD_CASE(4)
1533
0
#  undef LEAD_CASE
1534
0
    case BT_NONASCII:
1535
24.7M
    case BT_NMSTRT:
1536
27.3M
    case BT_HEX:
1537
27.3M
      START_NAME
1538
27.3M
      break;
1539
0
#  undef START_NAME
1540
612k
    case BT_QUOT:
1541
612k
      if (state != inValue) {
1542
246k
        if (nAtts < attsMax)
1543
175k
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1544
246k
        state = inValue;
1545
246k
        open = BT_QUOT;
1546
365k
      } else if (open == BT_QUOT) {
1547
246k
        state = other;
1548
246k
        if (nAtts < attsMax)
1549
175k
          atts[nAtts].valueEnd = ptr;
1550
246k
        nAtts++;
1551
246k
      }
1552
612k
      break;
1553
7.17M
    case BT_APOS:
1554
7.17M
      if (state != inValue) {
1555
3.57M
        if (nAtts < attsMax)
1556
1.79M
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1557
3.57M
        state = inValue;
1558
3.57M
        open = BT_APOS;
1559
3.59M
      } else if (open == BT_APOS) {
1560
3.57M
        state = other;
1561
3.57M
        if (nAtts < attsMax)
1562
1.79M
          atts[nAtts].valueEnd = ptr;
1563
3.57M
        nAtts++;
1564
3.57M
      }
1565
7.17M
      break;
1566
28.7k
    case BT_AMP:
1567
28.7k
      if (nAtts < attsMax)
1568
28.0k
        atts[nAtts].normalized = 0;
1569
28.7k
      break;
1570
2.85M
    case BT_S:
1571
2.85M
      if (state == inName)
1572
63.8k
        state = other;
1573
2.79M
      else if (state == inValue && nAtts < attsMax && atts[nAtts].normalized
1574
86.5k
               && (ptr == atts[nAtts].valuePtr
1575
12.9k
                   || BYTE_TO_ASCII(enc, ptr) != ASCII_SPACE
1576
6.28k
                   || BYTE_TO_ASCII(enc, ptr + MINBPC(enc)) == ASCII_SPACE
1577
5.85k
                   || BYTE_TYPE(enc, ptr + MINBPC(enc)) == open))
1578
81.1k
        atts[nAtts].normalized = 0;
1579
2.85M
      break;
1580
2.53M
    case BT_CR:
1581
3.19M
    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.19M
      if (state == inName)
1585
25.9k
        state = other;
1586
3.16M
      else if (state == inValue && nAtts < attsMax)
1587
1.18M
        atts[nAtts].normalized = 0;
1588
3.19M
      break;
1589
875k
    case BT_GT:
1590
968k
    case BT_SOL:
1591
968k
      if (state != inValue)
1592
948k
        return nAtts;
1593
20.6k
      break;
1594
6.34M
    default:
1595
6.34M
      break;
1596
48.6M
    }
1597
48.6M
  }
1598
  /* not reached */
1599
948k
}
Unexecuted instantiation: xmltok.c:little2_getAtts
Unexecuted instantiation: xmltok.c:big2_getAtts
1600
1601
static int PTRFASTCALL
1602
23.0k
PREFIX(charRefNumber)(const ENCODING *enc, const char *ptr) {
1603
23.0k
  int result = 0;
1604
  /* skip &# */
1605
23.0k
  UNUSED_P(enc);
1606
23.0k
  ptr += 2 * MINBPC(enc);
1607
23.0k
  if (CHAR_MATCHES(enc, ptr, ASCII_x)) {
1608
68.8k
    for (ptr += MINBPC(enc); ! CHAR_MATCHES(enc, ptr, ASCII_SEMI);
1609
54.1k
         ptr += MINBPC(enc)) {
1610
54.1k
      int c = BYTE_TO_ASCII(enc, ptr);
1611
54.1k
      switch (c) {
1612
6.72k
      case ASCII_0:
1613
9.49k
      case ASCII_1:
1614
11.6k
      case ASCII_2:
1615
12.9k
      case ASCII_3:
1616
13.8k
      case ASCII_4:
1617
17.9k
      case ASCII_5:
1618
21.0k
      case ASCII_6:
1619
24.2k
      case ASCII_7:
1620
26.7k
      case ASCII_8:
1621
30.0k
      case ASCII_9:
1622
30.0k
        result <<= 4;
1623
30.0k
        result |= (c - ASCII_0);
1624
30.0k
        break;
1625
2.04k
      case ASCII_A:
1626
2.62k
      case ASCII_B:
1627
3.02k
      case ASCII_C:
1628
4.47k
      case ASCII_D:
1629
5.30k
      case ASCII_E:
1630
10.3k
      case ASCII_F:
1631
10.3k
        result <<= 4;
1632
10.3k
        result += 10 + (c - ASCII_A);
1633
10.3k
        break;
1634
576
      case ASCII_a:
1635
1.34k
      case ASCII_b:
1636
2.77k
      case ASCII_c:
1637
11.7k
      case ASCII_d:
1638
12.1k
      case ASCII_e:
1639
13.7k
      case ASCII_f:
1640
13.7k
        result <<= 4;
1641
13.7k
        result += 10 + (c - ASCII_a);
1642
13.7k
        break;
1643
54.1k
      }
1644
54.1k
      if (result >= 0x110000)
1645
13
        return -1;
1646
54.1k
    }
1647
14.7k
  } else {
1648
35.9k
    for (; ! CHAR_MATCHES(enc, ptr, ASCII_SEMI); ptr += MINBPC(enc)) {
1649
27.6k
      int c = BYTE_TO_ASCII(enc, ptr);
1650
27.6k
      result *= 10;
1651
27.6k
      result += (c - ASCII_0);
1652
27.6k
      if (result >= 0x110000)
1653
4
        return -1;
1654
27.6k
    }
1655
8.34k
  }
1656
23.0k
  return checkCharRefNumber(result);
1657
23.0k
}
xmltok.c:normal_charRefNumber
Line
Count
Source
1602
23.0k
PREFIX(charRefNumber)(const ENCODING *enc, const char *ptr) {
1603
23.0k
  int result = 0;
1604
  /* skip &# */
1605
23.0k
  UNUSED_P(enc);
1606
23.0k
  ptr += 2 * MINBPC(enc);
1607
23.0k
  if (CHAR_MATCHES(enc, ptr, ASCII_x)) {
1608
68.8k
    for (ptr += MINBPC(enc); ! CHAR_MATCHES(enc, ptr, ASCII_SEMI);
1609
54.1k
         ptr += MINBPC(enc)) {
1610
54.1k
      int c = BYTE_TO_ASCII(enc, ptr);
1611
54.1k
      switch (c) {
1612
6.72k
      case ASCII_0:
1613
9.49k
      case ASCII_1:
1614
11.6k
      case ASCII_2:
1615
12.9k
      case ASCII_3:
1616
13.8k
      case ASCII_4:
1617
17.9k
      case ASCII_5:
1618
21.0k
      case ASCII_6:
1619
24.2k
      case ASCII_7:
1620
26.7k
      case ASCII_8:
1621
30.0k
      case ASCII_9:
1622
30.0k
        result <<= 4;
1623
30.0k
        result |= (c - ASCII_0);
1624
30.0k
        break;
1625
2.04k
      case ASCII_A:
1626
2.62k
      case ASCII_B:
1627
3.02k
      case ASCII_C:
1628
4.47k
      case ASCII_D:
1629
5.30k
      case ASCII_E:
1630
10.3k
      case ASCII_F:
1631
10.3k
        result <<= 4;
1632
10.3k
        result += 10 + (c - ASCII_A);
1633
10.3k
        break;
1634
576
      case ASCII_a:
1635
1.34k
      case ASCII_b:
1636
2.77k
      case ASCII_c:
1637
11.7k
      case ASCII_d:
1638
12.1k
      case ASCII_e:
1639
13.7k
      case ASCII_f:
1640
13.7k
        result <<= 4;
1641
13.7k
        result += 10 + (c - ASCII_a);
1642
13.7k
        break;
1643
54.1k
      }
1644
54.1k
      if (result >= 0x110000)
1645
13
        return -1;
1646
54.1k
    }
1647
14.7k
  } else {
1648
35.9k
    for (; ! CHAR_MATCHES(enc, ptr, ASCII_SEMI); ptr += MINBPC(enc)) {
1649
27.6k
      int c = BYTE_TO_ASCII(enc, ptr);
1650
27.6k
      result *= 10;
1651
27.6k
      result += (c - ASCII_0);
1652
27.6k
      if (result >= 0x110000)
1653
4
        return -1;
1654
27.6k
    }
1655
8.34k
  }
1656
23.0k
  return checkCharRefNumber(result);
1657
23.0k
}
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
100k
                             const char *end) {
1662
100k
  UNUSED_P(enc);
1663
100k
  switch ((end - ptr) / MINBPC(enc)) {
1664
5.91k
  case 2:
1665
5.91k
    if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_t)) {
1666
2.69k
      switch (BYTE_TO_ASCII(enc, ptr)) {
1667
1.87k
      case ASCII_l:
1668
1.87k
        return ASCII_LT;
1669
792
      case ASCII_g:
1670
792
        return ASCII_GT;
1671
2.69k
      }
1672
2.69k
    }
1673
3.24k
    break;
1674
36.3k
  case 3:
1675
36.3k
    if (CHAR_MATCHES(enc, ptr, ASCII_a)) {
1676
35.5k
      ptr += MINBPC(enc);
1677
35.5k
      if (CHAR_MATCHES(enc, ptr, ASCII_m)) {
1678
35.0k
        ptr += MINBPC(enc);
1679
35.0k
        if (CHAR_MATCHES(enc, ptr, ASCII_p))
1680
34.7k
          return ASCII_AMP;
1681
35.0k
      }
1682
35.5k
    }
1683
1.61k
    break;
1684
4.71k
  case 4:
1685
4.71k
    switch (BYTE_TO_ASCII(enc, ptr)) {
1686
2.48k
    case ASCII_q:
1687
2.48k
      ptr += MINBPC(enc);
1688
2.48k
      if (CHAR_MATCHES(enc, ptr, ASCII_u)) {
1689
2.19k
        ptr += MINBPC(enc);
1690
2.19k
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1691
1.98k
          ptr += MINBPC(enc);
1692
1.98k
          if (CHAR_MATCHES(enc, ptr, ASCII_t))
1693
1.78k
            return ASCII_QUOT;
1694
1.98k
        }
1695
2.19k
      }
1696
700
      break;
1697
1.72k
    case ASCII_a:
1698
1.72k
      ptr += MINBPC(enc);
1699
1.72k
      if (CHAR_MATCHES(enc, ptr, ASCII_p)) {
1700
965
        ptr += MINBPC(enc);
1701
965
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1702
692
          ptr += MINBPC(enc);
1703
692
          if (CHAR_MATCHES(enc, ptr, ASCII_s))
1704
485
            return ASCII_APOS;
1705
692
        }
1706
965
      }
1707
1.23k
      break;
1708
4.71k
    }
1709
100k
  }
1710
61.1k
  return 0;
1711
100k
}
xmltok.c:normal_predefinedEntityName
Line
Count
Source
1661
100k
                             const char *end) {
1662
100k
  UNUSED_P(enc);
1663
100k
  switch ((end - ptr) / MINBPC(enc)) {
1664
5.91k
  case 2:
1665
5.91k
    if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_t)) {
1666
2.69k
      switch (BYTE_TO_ASCII(enc, ptr)) {
1667
1.87k
      case ASCII_l:
1668
1.87k
        return ASCII_LT;
1669
792
      case ASCII_g:
1670
792
        return ASCII_GT;
1671
2.69k
      }
1672
2.69k
    }
1673
3.24k
    break;
1674
36.3k
  case 3:
1675
36.3k
    if (CHAR_MATCHES(enc, ptr, ASCII_a)) {
1676
35.5k
      ptr += MINBPC(enc);
1677
35.5k
      if (CHAR_MATCHES(enc, ptr, ASCII_m)) {
1678
35.0k
        ptr += MINBPC(enc);
1679
35.0k
        if (CHAR_MATCHES(enc, ptr, ASCII_p))
1680
34.7k
          return ASCII_AMP;
1681
35.0k
      }
1682
35.5k
    }
1683
1.61k
    break;
1684
4.71k
  case 4:
1685
4.71k
    switch (BYTE_TO_ASCII(enc, ptr)) {
1686
2.48k
    case ASCII_q:
1687
2.48k
      ptr += MINBPC(enc);
1688
2.48k
      if (CHAR_MATCHES(enc, ptr, ASCII_u)) {
1689
2.19k
        ptr += MINBPC(enc);
1690
2.19k
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1691
1.98k
          ptr += MINBPC(enc);
1692
1.98k
          if (CHAR_MATCHES(enc, ptr, ASCII_t))
1693
1.78k
            return ASCII_QUOT;
1694
1.98k
        }
1695
2.19k
      }
1696
700
      break;
1697
1.72k
    case ASCII_a:
1698
1.72k
      ptr += MINBPC(enc);
1699
1.72k
      if (CHAR_MATCHES(enc, ptr, ASCII_p)) {
1700
965
        ptr += MINBPC(enc);
1701
965
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1702
692
          ptr += MINBPC(enc);
1703
692
          if (CHAR_MATCHES(enc, ptr, ASCII_s))
1704
485
            return ASCII_APOS;
1705
692
        }
1706
965
      }
1707
1.23k
      break;
1708
4.71k
    }
1709
100k
  }
1710
61.1k
  return 0;
1711
100k
}
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
463k
                         const char *end1, const char *ptr2) {
1716
463k
  UNUSED_P(enc);
1717
2.73M
  for (; *ptr2; ptr1 += MINBPC(enc), ptr2++) {
1718
2.38M
    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
42
      return 0; /* LCOV_EXCL_LINE */
1725
42
    }
1726
2.38M
    if (! CHAR_MATCHES(enc, ptr1, *ptr2))
1727
110k
      return 0;
1728
2.38M
  }
1729
353k
  return ptr1 == end1;
1730
463k
}
xmltok.c:normal_nameMatchesAscii
Line
Count
Source
1715
463k
                         const char *end1, const char *ptr2) {
1716
463k
  UNUSED_P(enc);
1717
2.73M
  for (; *ptr2; ptr1 += MINBPC(enc), ptr2++) {
1718
2.38M
    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
42
      return 0; /* LCOV_EXCL_LINE */
1725
42
    }
1726
2.38M
    if (! CHAR_MATCHES(enc, ptr1, *ptr2))
1727
110k
      return 0;
1728
2.38M
  }
1729
353k
  return ptr1 == end1;
1730
463k
}
Unexecuted instantiation: xmltok.c:little2_nameMatchesAscii
Unexecuted instantiation: xmltok.c:big2_nameMatchesAscii
1731
1732
static int PTRFASTCALL
1733
1.24M
PREFIX(nameLength)(const ENCODING *enc, const char *ptr) {
1734
1.24M
  const char *start = ptr;
1735
13.0M
  for (;;) {
1736
13.0M
    switch (BYTE_TYPE(enc, ptr)) {
1737
0
#  define LEAD_CASE(n)                                                         \
1738
57.2k
  case BT_LEAD##n:                                                             \
1739
57.2k
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1740
57.2k
    break;
1741
35.2k
      LEAD_CASE(2)
1742
21.9k
      LEAD_CASE(3)
1743
0
      LEAD_CASE(4)
1744
0
#  undef LEAD_CASE
1745
0
    case BT_NONASCII:
1746
8.75M
    case BT_NMSTRT:
1747
#  ifdef XML_NS
1748
    case BT_COLON:
1749
#  endif
1750
10.5M
    case BT_HEX:
1751
10.5M
    case BT_DIGIT:
1752
10.5M
    case BT_NAME:
1753
11.7M
    case BT_MINUS:
1754
11.7M
      ptr += MINBPC(enc);
1755
11.7M
      break;
1756
1.24M
    default:
1757
1.24M
      return (int)(ptr - start);
1758
13.0M
    }
1759
13.0M
  }
1760
1.24M
}
xmltok.c:normal_nameLength
Line
Count
Source
1733
1.24M
PREFIX(nameLength)(const ENCODING *enc, const char *ptr) {
1734
1.24M
  const char *start = ptr;
1735
13.0M
  for (;;) {
1736
13.0M
    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
35.2k
      LEAD_CASE(2)
1742
21.9k
      LEAD_CASE(3)
1743
0
      LEAD_CASE(4)
1744
0
#  undef LEAD_CASE
1745
0
    case BT_NONASCII:
1746
8.75M
    case BT_NMSTRT:
1747
#  ifdef XML_NS
1748
    case BT_COLON:
1749
#  endif
1750
10.5M
    case BT_HEX:
1751
10.5M
    case BT_DIGIT:
1752
10.5M
    case BT_NAME:
1753
11.7M
    case BT_MINUS:
1754
11.7M
      ptr += MINBPC(enc);
1755
11.7M
      break;
1756
1.24M
    default:
1757
1.24M
      return (int)(ptr - start);
1758
13.0M
    }
1759
13.0M
  }
1760
1.24M
}
Unexecuted instantiation: xmltok.c:little2_nameLength
Unexecuted instantiation: xmltok.c:big2_nameLength
1761
1762
static const char *PTRFASTCALL
1763
0
PREFIX(skipS)(const ENCODING *enc, const char *ptr) {
1764
0
  for (;;) {
1765
0
    switch (BYTE_TYPE(enc, ptr)) {
1766
0
    case BT_LF:
1767
0
    case BT_CR:
1768
0
    case BT_S:
1769
0
      ptr += MINBPC(enc);
1770
0
      break;
1771
0
    default:
1772
0
      return ptr;
1773
0
    }
1774
0
  }
1775
0
}
Unexecuted instantiation: xmltok.c:normal_skipS
Unexecuted instantiation: xmltok.c:little2_skipS
Unexecuted instantiation: xmltok.c:big2_skipS
1776
1777
static void PTRCALL
1778
PREFIX(updatePosition)(const ENCODING *enc, const char *ptr, const char *end,
1779
20.2k
                       POSITION *pos) {
1780
121M
  while (HAS_CHAR(enc, ptr, end)) {
1781
121M
    switch (BYTE_TYPE(enc, ptr)) {
1782
0
#  define LEAD_CASE(n)                                                         \
1783
1.27M
  case BT_LEAD##n:                                                             \
1784
1.27M
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1785
1.27M
    pos->columnNumber++;                                                       \
1786
1.27M
    break;
1787
552k
      LEAD_CASE(2)
1788
518k
      LEAD_CASE(3)
1789
205k
      LEAD_CASE(4)
1790
0
#  undef LEAD_CASE
1791
3.41M
    case BT_LF:
1792
3.41M
      pos->columnNumber = 0;
1793
3.41M
      pos->lineNumber++;
1794
3.41M
      ptr += MINBPC(enc);
1795
3.41M
      break;
1796
4.92M
    case BT_CR:
1797
4.92M
      pos->lineNumber++;
1798
4.92M
      ptr += MINBPC(enc);
1799
4.92M
      if (HAS_CHAR(enc, ptr, end) && BYTE_TYPE(enc, ptr) == BT_LF)
1800
1.01M
        ptr += MINBPC(enc);
1801
4.92M
      pos->columnNumber = 0;
1802
4.92M
      break;
1803
111M
    default:
1804
111M
      ptr += MINBPC(enc);
1805
111M
      pos->columnNumber++;
1806
111M
      break;
1807
121M
    }
1808
121M
  }
1809
20.2k
}
xmltok.c:normal_updatePosition
Line
Count
Source
1779
19.7k
                       POSITION *pos) {
1780
121M
  while (HAS_CHAR(enc, ptr, end)) {
1781
121M
    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
552k
      LEAD_CASE(2)
1788
518k
      LEAD_CASE(3)
1789
205k
      LEAD_CASE(4)
1790
0
#  undef LEAD_CASE
1791
3.41M
    case BT_LF:
1792
3.41M
      pos->columnNumber = 0;
1793
3.41M
      pos->lineNumber++;
1794
3.41M
      ptr += MINBPC(enc);
1795
3.41M
      break;
1796
4.92M
    case BT_CR:
1797
4.92M
      pos->lineNumber++;
1798
4.92M
      ptr += MINBPC(enc);
1799
4.92M
      if (HAS_CHAR(enc, ptr, end) && BYTE_TYPE(enc, ptr) == BT_LF)
1800
1.01M
        ptr += MINBPC(enc);
1801
4.92M
      pos->columnNumber = 0;
1802
4.92M
      break;
1803
111M
    default:
1804
111M
      ptr += MINBPC(enc);
1805
111M
      pos->columnNumber++;
1806
111M
      break;
1807
121M
    }
1808
121M
  }
1809
19.7k
}
xmltok.c:little2_updatePosition
Line
Count
Source
1779
256
                       POSITION *pos) {
1780
785
  while (HAS_CHAR(enc, ptr, end)) {
1781
785
    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
785
    default:
1804
785
      ptr += MINBPC(enc);
1805
785
      pos->columnNumber++;
1806
785
      break;
1807
785
    }
1808
785
  }
1809
256
}
xmltok.c:big2_updatePosition
Line
Count
Source
1779
244
                       POSITION *pos) {
1780
13.4k
  while (HAS_CHAR(enc, ptr, end)) {
1781
13.4k
    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
13.4k
    default:
1804
13.4k
      ptr += MINBPC(enc);
1805
13.4k
      pos->columnNumber++;
1806
13.4k
      break;
1807
13.4k
    }
1808
13.4k
  }
1809
244
}
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 */