Coverage Report

Created: 2026-06-15 07:03

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
100
#    define IS_INVALID_CHAR(enc, ptr, n) (0)
46
#  endif
47
48
#  define INVALID_LEAD_CASE(n, ptr, nextTokPtr)                                \
49
685k
  case BT_LEAD##n:                                                             \
50
685k
    if (end - ptr < n)                                                         \
51
684k
      return XML_TOK_PARTIAL_CHAR;                                             \
52
685k
    if (IS_INVALID_CHAR(enc, ptr, n)) {                                        \
53
104
      *(nextTokPtr) = (ptr);                                                   \
54
104
      return XML_TOK_INVALID;                                                  \
55
104
    }                                                                          \
56
685k
    ptr += n;                                                                  \
57
684k
    break;
58
59
#  define INVALID_CASES(ptr, nextTokPtr)                                       \
60
250k
    INVALID_LEAD_CASE(2, ptr, nextTokPtr)                                      \
61
253k
    INVALID_LEAD_CASE(3, ptr, nextTokPtr)                                      \
62
253k
    INVALID_LEAD_CASE(4, ptr, nextTokPtr)                                      \
63
181k
  case BT_NONXML:                                                              \
64
61
  case BT_MALFORM:                                                             \
65
122
  case BT_TRAIL:                                                               \
66
122
    *(nextTokPtr) = (ptr);                                                     \
67
122
    return XML_TOK_INVALID;
68
69
#  define CHECK_NAME_CASE(n, enc, ptr, end, nextTokPtr)                        \
70
168k
  case BT_LEAD##n:                                                             \
71
168k
    if (end - ptr < n)                                                         \
72
167k
      return XML_TOK_PARTIAL_CHAR;                                             \
73
168k
    if (IS_INVALID_CHAR(enc, ptr, n) || ! IS_NAME_CHAR(enc, ptr, n)) {         \
74
265
      *nextTokPtr = ptr;                                                       \
75
265
      return XML_TOK_INVALID;                                                  \
76
265
    }                                                                          \
77
168k
    ptr += n;                                                                  \
78
167k
    break;
79
80
#  define CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)                          \
81
22.2M
  case BT_NONASCII:                                                            \
82
22.2M
    if (! IS_NAME_CHAR_MINBPC(enc, ptr)) {                                     \
83
47
      *nextTokPtr = ptr;                                                       \
84
47
      return XML_TOK_INVALID;                                                  \
85
47
    }                                                                          \
86
22.2M
    /* fall through */                                                         \
87
22.2M
  case BT_NMSTRT:                                                              \
88
19.9M
  case BT_HEX:                                                                 \
89
22.0M
  case BT_DIGIT:                                                               \
90
22.1M
  case BT_NAME:                                                                \
91
22.2M
  case BT_MINUS:                                                               \
92
22.2M
    ptr += MINBPC(enc);                                                        \
93
22.2M
    break;                                                                     \
94
22.2M
    CHECK_NAME_CASE(2, enc, ptr, end, nextTokPtr)                              \
95
104k
    CHECK_NAME_CASE(3, enc, ptr, end, nextTokPtr)                              \
96
104k
    CHECK_NAME_CASE(4, enc, ptr, end, nextTokPtr)
97
98
#  define CHECK_NMSTRT_CASE(n, enc, ptr, end, nextTokPtr)                      \
99
89.0k
  case BT_LEAD##n:                                                             \
100
89.0k
    if ((end) - (ptr) < (n))                                                   \
101
88.8k
      return XML_TOK_PARTIAL_CHAR;                                             \
102
89.0k
    if (IS_INVALID_CHAR(enc, ptr, n) || ! IS_NMSTRT_CHAR(enc, ptr, n)) {       \
103
178
      *nextTokPtr = ptr;                                                       \
104
178
      return XML_TOK_INVALID;                                                  \
105
178
    }                                                                          \
106
89.0k
    ptr += n;                                                                  \
107
88.8k
    break;
108
109
#  define CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)                        \
110
3.18M
  case BT_NONASCII:                                                            \
111
3.18M
    if (! IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {                                   \
112
0
      *nextTokPtr = ptr;                                                       \
113
0
      return XML_TOK_INVALID;                                                  \
114
0
    }                                                                          \
115
3.18M
    /* fall through */                                                         \
116
3.18M
  case BT_NMSTRT:                                                              \
117
3.18M
  case BT_HEX:                                                                 \
118
3.18M
    ptr += MINBPC(enc);                                                        \
119
3.18M
    break;                                                                     \
120
3.18M
    CHECK_NMSTRT_CASE(2, enc, ptr, end, nextTokPtr)                            \
121
55.0k
    CHECK_NMSTRT_CASE(3, enc, ptr, end, nextTokPtr)                            \
122
33.7k
    CHECK_NMSTRT_CASE(4, enc, ptr, end, nextTokPtr)
123
124
#  ifndef PREFIX
125
#    define PREFIX(ident) ident
126
#  endif
127
128
#  define HAS_CHARS(enc, ptr, end, count)                                      \
129
289M
    ((end) - (ptr) >= ((count) * MINBPC(enc)))
130
131
12.2M
#  define HAS_CHAR(enc, ptr, end) HAS_CHARS(enc, ptr, end, 1)
132
133
#  define REQUIRE_CHARS(enc, ptr, end, count)                                  \
134
33.3M
    {                                                                          \
135
33.3M
      if (! HAS_CHARS(enc, ptr, end, count)) {                                 \
136
646
        return XML_TOK_PARTIAL;                                                \
137
646
      }                                                                        \
138
33.3M
    }
139
140
33.3M
#  define REQUIRE_CHAR(enc, ptr, end) REQUIRE_CHARS(enc, ptr, end, 1)
141
142
/* ptr points to character following "<!-" */
143
144
static int PTRCALL
145
PREFIX(scanComment)(const ENCODING *enc, const char *ptr, const char *end,
146
20.3k
                    const char **nextTokPtr) {
147
20.3k
  if (HAS_CHAR(enc, ptr, end)) {
148
20.3k
    if (! CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
149
9
      *nextTokPtr = ptr;
150
9
      return XML_TOK_INVALID;
151
9
    }
152
20.3k
    ptr += MINBPC(enc);
153
6.31M
    while (HAS_CHAR(enc, ptr, end)) {
154
6.31M
      switch (BYTE_TYPE(enc, ptr)) {
155
199k
        INVALID_CASES(ptr, nextTokPtr)
156
36.0k
      case BT_MINUS:
157
36.0k
        ptr += MINBPC(enc);
158
36.0k
        REQUIRE_CHAR(enc, ptr, end);
159
36.0k
        if (CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
160
20.2k
          ptr += MINBPC(enc);
161
20.2k
          REQUIRE_CHAR(enc, ptr, end);
162
20.2k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
163
8
            *nextTokPtr = ptr;
164
8
            return XML_TOK_INVALID;
165
8
          }
166
20.2k
          *nextTokPtr = ptr + MINBPC(enc);
167
20.2k
          return XML_TOK_COMMENT;
168
20.2k
        }
169
15.8k
        break;
170
6.18M
      default:
171
6.18M
        ptr += MINBPC(enc);
172
6.18M
        break;
173
6.31M
      }
174
6.31M
    }
175
20.3k
  }
176
82
  return XML_TOK_PARTIAL;
177
20.3k
}
xmltok.c:normal_scanComment
Line
Count
Source
146
20.3k
                    const char **nextTokPtr) {
147
20.3k
  if (HAS_CHAR(enc, ptr, end)) {
148
20.3k
    if (! CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
149
9
      *nextTokPtr = ptr;
150
9
      return XML_TOK_INVALID;
151
9
    }
152
20.3k
    ptr += MINBPC(enc);
153
6.31M
    while (HAS_CHAR(enc, ptr, end)) {
154
6.31M
      switch (BYTE_TYPE(enc, ptr)) {
155
199k
        INVALID_CASES(ptr, nextTokPtr)
156
36.0k
      case BT_MINUS:
157
36.0k
        ptr += MINBPC(enc);
158
36.0k
        REQUIRE_CHAR(enc, ptr, end);
159
36.0k
        if (CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
160
20.2k
          ptr += MINBPC(enc);
161
20.2k
          REQUIRE_CHAR(enc, ptr, end);
162
20.2k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
163
8
            *nextTokPtr = ptr;
164
8
            return XML_TOK_INVALID;
165
8
          }
166
20.2k
          *nextTokPtr = ptr + MINBPC(enc);
167
20.2k
          return XML_TOK_COMMENT;
168
20.2k
        }
169
15.8k
        break;
170
6.18M
      default:
171
6.18M
        ptr += MINBPC(enc);
172
6.18M
        break;
173
6.31M
      }
174
6.31M
    }
175
20.3k
  }
176
82
  return XML_TOK_PARTIAL;
177
20.3k
}
Unexecuted instantiation: xmltok.c:little2_scanComment
Unexecuted instantiation: xmltok.c:big2_scanComment
178
179
/* ptr points to character following "<!" */
180
181
static int PTRCALL
182
PREFIX(scanDecl)(const ENCODING *enc, const char *ptr, const char *end,
183
52.3k
                 const char **nextTokPtr) {
184
52.3k
  REQUIRE_CHAR(enc, ptr, end);
185
52.3k
  switch (BYTE_TYPE(enc, ptr)) {
186
3.86k
  case BT_MINUS:
187
3.86k
    return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
188
3
  case BT_LSQB:
189
3
    *nextTokPtr = ptr + MINBPC(enc);
190
3
    return XML_TOK_COND_SECT_OPEN;
191
1.25k
  case BT_NMSTRT:
192
48.4k
  case BT_HEX:
193
48.4k
    ptr += MINBPC(enc);
194
48.4k
    break;
195
5
  default:
196
5
    *nextTokPtr = ptr;
197
5
    return XML_TOK_INVALID;
198
52.3k
  }
199
331k
  while (HAS_CHAR(enc, ptr, end)) {
200
331k
    switch (BYTE_TYPE(enc, ptr)) {
201
26
    case BT_PERCNT:
202
26
      REQUIRE_CHARS(enc, ptr, end, 2);
203
      /* don't allow <!ENTITY% foo "whatever"> */
204
22
      switch (BYTE_TYPE(enc, ptr + MINBPC(enc))) {
205
2
      case BT_S:
206
3
      case BT_CR:
207
5
      case BT_LF:
208
9
      case BT_PERCNT:
209
9
        *nextTokPtr = ptr;
210
9
        return XML_TOK_INVALID;
211
22
      }
212
      /* fall through */
213
20.7k
    case BT_S:
214
44.4k
    case BT_CR:
215
48.3k
    case BT_LF:
216
48.3k
      *nextTokPtr = ptr;
217
48.3k
      return XML_TOK_DECL_OPEN;
218
267k
    case BT_NMSTRT:
219
283k
    case BT_HEX:
220
283k
      ptr += MINBPC(enc);
221
283k
      break;
222
10
    default:
223
10
      *nextTokPtr = ptr;
224
10
      return XML_TOK_INVALID;
225
331k
    }
226
331k
  }
227
56
  return XML_TOK_PARTIAL;
228
48.4k
}
xmltok.c:normal_scanDecl
Line
Count
Source
183
52.3k
                 const char **nextTokPtr) {
184
52.3k
  REQUIRE_CHAR(enc, ptr, end);
185
52.3k
  switch (BYTE_TYPE(enc, ptr)) {
186
3.86k
  case BT_MINUS:
187
3.86k
    return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
188
3
  case BT_LSQB:
189
3
    *nextTokPtr = ptr + MINBPC(enc);
190
3
    return XML_TOK_COND_SECT_OPEN;
191
1.25k
  case BT_NMSTRT:
192
48.4k
  case BT_HEX:
193
48.4k
    ptr += MINBPC(enc);
194
48.4k
    break;
195
5
  default:
196
5
    *nextTokPtr = ptr;
197
5
    return XML_TOK_INVALID;
198
52.3k
  }
199
331k
  while (HAS_CHAR(enc, ptr, end)) {
200
331k
    switch (BYTE_TYPE(enc, ptr)) {
201
26
    case BT_PERCNT:
202
26
      REQUIRE_CHARS(enc, ptr, end, 2);
203
      /* don't allow <!ENTITY% foo "whatever"> */
204
22
      switch (BYTE_TYPE(enc, ptr + MINBPC(enc))) {
205
2
      case BT_S:
206
3
      case BT_CR:
207
5
      case BT_LF:
208
9
      case BT_PERCNT:
209
9
        *nextTokPtr = ptr;
210
9
        return XML_TOK_INVALID;
211
22
      }
212
      /* fall through */
213
20.7k
    case BT_S:
214
44.4k
    case BT_CR:
215
48.3k
    case BT_LF:
216
48.3k
      *nextTokPtr = ptr;
217
48.3k
      return XML_TOK_DECL_OPEN;
218
267k
    case BT_NMSTRT:
219
283k
    case BT_HEX:
220
283k
      ptr += MINBPC(enc);
221
283k
      break;
222
10
    default:
223
10
      *nextTokPtr = ptr;
224
10
      return XML_TOK_INVALID;
225
331k
    }
226
331k
  }
227
56
  return XML_TOK_PARTIAL;
228
48.4k
}
Unexecuted instantiation: xmltok.c:little2_scanDecl
Unexecuted instantiation: xmltok.c:big2_scanDecl
229
230
static int PTRCALL
231
PREFIX(checkPiTarget)(const ENCODING *enc, const char *ptr, const char *end,
232
42.9k
                      int *tokPtr) {
233
42.9k
  int upper = 0;
234
42.9k
  UNUSED_P(enc);
235
42.9k
  *tokPtr = XML_TOK_PI;
236
42.9k
  if (end - ptr != MINBPC(enc) * 3)
237
34.7k
    return 1;
238
8.23k
  switch (BYTE_TO_ASCII(enc, ptr)) {
239
3.66k
  case ASCII_x:
240
3.66k
    break;
241
1.85k
  case ASCII_X:
242
1.85k
    upper = 1;
243
1.85k
    break;
244
2.72k
  default:
245
2.72k
    return 1;
246
8.23k
  }
247
5.51k
  ptr += MINBPC(enc);
248
5.51k
  switch (BYTE_TO_ASCII(enc, ptr)) {
249
1.85k
  case ASCII_m:
250
1.85k
    break;
251
558
  case ASCII_M:
252
558
    upper = 1;
253
558
    break;
254
3.10k
  default:
255
3.10k
    return 1;
256
5.51k
  }
257
2.41k
  ptr += MINBPC(enc);
258
2.41k
  switch (BYTE_TO_ASCII(enc, ptr)) {
259
1.07k
  case ASCII_l:
260
1.07k
    break;
261
2
  case ASCII_L:
262
2
    upper = 1;
263
2
    break;
264
1.33k
  default:
265
1.33k
    return 1;
266
2.41k
  }
267
1.07k
  if (upper)
268
5
    return 0;
269
1.07k
  *tokPtr = XML_TOK_XML_DECL;
270
1.07k
  return 1;
271
1.07k
}
xmltok.c:normal_checkPiTarget
Line
Count
Source
232
42.9k
                      int *tokPtr) {
233
42.9k
  int upper = 0;
234
42.9k
  UNUSED_P(enc);
235
42.9k
  *tokPtr = XML_TOK_PI;
236
42.9k
  if (end - ptr != MINBPC(enc) * 3)
237
34.7k
    return 1;
238
8.23k
  switch (BYTE_TO_ASCII(enc, ptr)) {
239
3.66k
  case ASCII_x:
240
3.66k
    break;
241
1.85k
  case ASCII_X:
242
1.85k
    upper = 1;
243
1.85k
    break;
244
2.72k
  default:
245
2.72k
    return 1;
246
8.23k
  }
247
5.51k
  ptr += MINBPC(enc);
248
5.51k
  switch (BYTE_TO_ASCII(enc, ptr)) {
249
1.85k
  case ASCII_m:
250
1.85k
    break;
251
558
  case ASCII_M:
252
558
    upper = 1;
253
558
    break;
254
3.10k
  default:
255
3.10k
    return 1;
256
5.51k
  }
257
2.41k
  ptr += MINBPC(enc);
258
2.41k
  switch (BYTE_TO_ASCII(enc, ptr)) {
259
1.07k
  case ASCII_l:
260
1.07k
    break;
261
2
  case ASCII_L:
262
2
    upper = 1;
263
2
    break;
264
1.33k
  default:
265
1.33k
    return 1;
266
2.41k
  }
267
1.07k
  if (upper)
268
5
    return 0;
269
1.07k
  *tokPtr = XML_TOK_XML_DECL;
270
1.07k
  return 1;
271
1.07k
}
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
43.1k
               const char **nextTokPtr) {
278
43.1k
  int tok;
279
43.1k
  const char *target = ptr;
280
43.1k
  REQUIRE_CHAR(enc, ptr, end);
281
43.1k
  switch (BYTE_TYPE(enc, ptr)) {
282
56.2k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
283
3
  default:
284
3
    *nextTokPtr = ptr;
285
3
    return XML_TOK_INVALID;
286
43.1k
  }
287
1.15M
  while (HAS_CHAR(enc, ptr, end)) {
288
1.15M
    switch (BYTE_TYPE(enc, ptr)) {
289
3.93M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
290
6.78k
    case BT_S:
291
13.8k
    case BT_CR:
292
18.0k
    case BT_LF:
293
18.0k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
294
3
        *nextTokPtr = ptr;
295
3
        return XML_TOK_INVALID;
296
3
      }
297
18.0k
      ptr += MINBPC(enc);
298
19.9M
      while (HAS_CHAR(enc, ptr, end)) {
299
19.9M
        switch (BYTE_TYPE(enc, ptr)) {
300
505k
          INVALID_CASES(ptr, nextTokPtr)
301
121k
        case BT_QUEST:
302
121k
          ptr += MINBPC(enc);
303
121k
          REQUIRE_CHAR(enc, ptr, end);
304
121k
          if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
305
17.7k
            *nextTokPtr = ptr + MINBPC(enc);
306
17.7k
            return tok;
307
17.7k
          }
308
103k
          break;
309
19.5M
        default:
310
19.5M
          ptr += MINBPC(enc);
311
19.5M
          break;
312
19.9M
        }
313
19.9M
      }
314
158
      return XML_TOK_PARTIAL;
315
24.9k
    case BT_QUEST:
316
24.9k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
317
2
        *nextTokPtr = ptr;
318
2
        return XML_TOK_INVALID;
319
2
      }
320
24.9k
      ptr += MINBPC(enc);
321
24.9k
      REQUIRE_CHAR(enc, ptr, end);
322
24.9k
      if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
323
24.9k
        *nextTokPtr = ptr + MINBPC(enc);
324
24.9k
        return tok;
325
24.9k
      }
326
      /* fall through */
327
33
    default:
328
33
      *nextTokPtr = ptr;
329
33
      return XML_TOK_INVALID;
330
1.15M
    }
331
1.15M
  }
332
82
  return XML_TOK_PARTIAL;
333
43.1k
}
xmltok.c:normal_scanPi
Line
Count
Source
277
43.1k
               const char **nextTokPtr) {
278
43.1k
  int tok;
279
43.1k
  const char *target = ptr;
280
43.1k
  REQUIRE_CHAR(enc, ptr, end);
281
43.1k
  switch (BYTE_TYPE(enc, ptr)) {
282
56.2k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
283
3
  default:
284
3
    *nextTokPtr = ptr;
285
3
    return XML_TOK_INVALID;
286
43.1k
  }
287
1.15M
  while (HAS_CHAR(enc, ptr, end)) {
288
1.15M
    switch (BYTE_TYPE(enc, ptr)) {
289
3.93M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
290
6.78k
    case BT_S:
291
13.8k
    case BT_CR:
292
18.0k
    case BT_LF:
293
18.0k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
294
3
        *nextTokPtr = ptr;
295
3
        return XML_TOK_INVALID;
296
3
      }
297
18.0k
      ptr += MINBPC(enc);
298
19.9M
      while (HAS_CHAR(enc, ptr, end)) {
299
19.9M
        switch (BYTE_TYPE(enc, ptr)) {
300
505k
          INVALID_CASES(ptr, nextTokPtr)
301
121k
        case BT_QUEST:
302
121k
          ptr += MINBPC(enc);
303
121k
          REQUIRE_CHAR(enc, ptr, end);
304
121k
          if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
305
17.7k
            *nextTokPtr = ptr + MINBPC(enc);
306
17.7k
            return tok;
307
17.7k
          }
308
103k
          break;
309
19.5M
        default:
310
19.5M
          ptr += MINBPC(enc);
311
19.5M
          break;
312
19.9M
        }
313
19.9M
      }
314
158
      return XML_TOK_PARTIAL;
315
24.9k
    case BT_QUEST:
316
24.9k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
317
2
        *nextTokPtr = ptr;
318
2
        return XML_TOK_INVALID;
319
2
      }
320
24.9k
      ptr += MINBPC(enc);
321
24.9k
      REQUIRE_CHAR(enc, ptr, end);
322
24.9k
      if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
323
24.9k
        *nextTokPtr = ptr + MINBPC(enc);
324
24.9k
        return tok;
325
24.9k
      }
326
      /* fall through */
327
33
    default:
328
33
      *nextTokPtr = ptr;
329
33
      return XML_TOK_INVALID;
330
1.15M
    }
331
1.15M
  }
332
82
  return XML_TOK_PARTIAL;
333
43.1k
}
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.38k
                         const char **nextTokPtr) {
338
2.38k
  static const char CDATA_LSQB[]
339
2.38k
      = {ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, ASCII_LSQB};
340
2.38k
  int i;
341
2.38k
  UNUSED_P(enc);
342
  /* CDATA[ */
343
2.38k
  REQUIRE_CHARS(enc, ptr, end, 6);
344
16.3k
  for (i = 0; i < 6; i++, ptr += MINBPC(enc)) {
345
14.0k
    if (! CHAR_MATCHES(enc, ptr, CDATA_LSQB[i])) {
346
57
      *nextTokPtr = ptr;
347
57
      return XML_TOK_INVALID;
348
57
    }
349
14.0k
  }
350
2.30k
  *nextTokPtr = ptr;
351
2.30k
  return XML_TOK_CDATA_SECT_OPEN;
352
2.35k
}
xmltok.c:normal_scanCdataSection
Line
Count
Source
337
2.38k
                         const char **nextTokPtr) {
338
2.38k
  static const char CDATA_LSQB[]
339
2.38k
      = {ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, ASCII_LSQB};
340
2.38k
  int i;
341
2.38k
  UNUSED_P(enc);
342
  /* CDATA[ */
343
2.38k
  REQUIRE_CHARS(enc, ptr, end, 6);
344
16.3k
  for (i = 0; i < 6; i++, ptr += MINBPC(enc)) {
345
14.0k
    if (! CHAR_MATCHES(enc, ptr, CDATA_LSQB[i])) {
346
57
      *nextTokPtr = ptr;
347
57
      return XML_TOK_INVALID;
348
57
    }
349
14.0k
  }
350
2.30k
  *nextTokPtr = ptr;
351
2.30k
  return XML_TOK_CDATA_SECT_OPEN;
352
2.35k
}
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.56M
                        const char **nextTokPtr) {
357
4.56M
  if (ptr >= end)
358
196
    return XML_TOK_NONE;
359
4.56M
  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.56M
  switch (BYTE_TYPE(enc, ptr)) {
369
648k
  case BT_RSQB:
370
648k
    ptr += MINBPC(enc);
371
648k
    REQUIRE_CHAR(enc, ptr, end);
372
648k
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
373
339k
      break;
374
309k
    ptr += MINBPC(enc);
375
309k
    REQUIRE_CHAR(enc, ptr, end);
376
309k
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
377
307k
      ptr -= MINBPC(enc);
378
307k
      break;
379
307k
    }
380
2.13k
    *nextTokPtr = ptr + MINBPC(enc);
381
2.13k
    return XML_TOK_CDATA_SECT_CLOSE;
382
1.50M
  case BT_CR:
383
1.50M
    ptr += MINBPC(enc);
384
1.50M
    REQUIRE_CHAR(enc, ptr, end);
385
1.50M
    if (BYTE_TYPE(enc, ptr) == BT_LF)
386
320k
      ptr += MINBPC(enc);
387
1.50M
    *nextTokPtr = ptr;
388
1.50M
    return XML_TOK_DATA_NEWLINE;
389
1.40M
  case BT_LF:
390
1.40M
    *nextTokPtr = ptr + MINBPC(enc);
391
1.40M
    return XML_TOK_DATA_NEWLINE;
392
1.40M
    INVALID_CASES(ptr, nextTokPtr)
393
904k
  default:
394
904k
    ptr += MINBPC(enc);
395
904k
    break;
396
4.56M
  }
397
23.7M
  while (HAS_CHAR(enc, ptr, end)) {
398
23.7M
    switch (BYTE_TYPE(enc, ptr)) {
399
0
#  define LEAD_CASE(n)                                                         \
400
337k
  case BT_LEAD##n:                                                             \
401
337k
    if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) {                       \
402
21
      *nextTokPtr = ptr;                                                       \
403
21
      return XML_TOK_DATA_CHARS;                                               \
404
21
    }                                                                          \
405
337k
    ptr += n;                                                                  \
406
337k
    break;
407
131k
      LEAD_CASE(2)
408
144k
      LEAD_CASE(3)
409
61.0k
      LEAD_CASE(4)
410
0
#  undef LEAD_CASE
411
3
    case BT_NONXML:
412
7
    case BT_MALFORM:
413
17
    case BT_TRAIL:
414
642k
    case BT_CR:
415
1.08M
    case BT_LF:
416
1.65M
    case BT_RSQB:
417
1.65M
      *nextTokPtr = ptr;
418
1.65M
      return XML_TOK_DATA_CHARS;
419
21.7M
    default:
420
21.7M
      ptr += MINBPC(enc);
421
21.7M
      break;
422
23.7M
    }
423
23.7M
  }
424
56
  *nextTokPtr = ptr;
425
56
  return XML_TOK_DATA_CHARS;
426
1.65M
}
xmltok.c:normal_cdataSectionTok
Line
Count
Source
356
4.56M
                        const char **nextTokPtr) {
357
4.56M
  if (ptr >= end)
358
196
    return XML_TOK_NONE;
359
4.56M
  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.56M
  switch (BYTE_TYPE(enc, ptr)) {
369
648k
  case BT_RSQB:
370
648k
    ptr += MINBPC(enc);
371
648k
    REQUIRE_CHAR(enc, ptr, end);
372
648k
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
373
339k
      break;
374
309k
    ptr += MINBPC(enc);
375
309k
    REQUIRE_CHAR(enc, ptr, end);
376
309k
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
377
307k
      ptr -= MINBPC(enc);
378
307k
      break;
379
307k
    }
380
2.13k
    *nextTokPtr = ptr + MINBPC(enc);
381
2.13k
    return XML_TOK_CDATA_SECT_CLOSE;
382
1.50M
  case BT_CR:
383
1.50M
    ptr += MINBPC(enc);
384
1.50M
    REQUIRE_CHAR(enc, ptr, end);
385
1.50M
    if (BYTE_TYPE(enc, ptr) == BT_LF)
386
320k
      ptr += MINBPC(enc);
387
1.50M
    *nextTokPtr = ptr;
388
1.50M
    return XML_TOK_DATA_NEWLINE;
389
1.40M
  case BT_LF:
390
1.40M
    *nextTokPtr = ptr + MINBPC(enc);
391
1.40M
    return XML_TOK_DATA_NEWLINE;
392
1.40M
    INVALID_CASES(ptr, nextTokPtr)
393
904k
  default:
394
904k
    ptr += MINBPC(enc);
395
904k
    break;
396
4.56M
  }
397
23.7M
  while (HAS_CHAR(enc, ptr, end)) {
398
23.7M
    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
131k
      LEAD_CASE(2)
408
144k
      LEAD_CASE(3)
409
61.0k
      LEAD_CASE(4)
410
0
#  undef LEAD_CASE
411
3
    case BT_NONXML:
412
7
    case BT_MALFORM:
413
17
    case BT_TRAIL:
414
642k
    case BT_CR:
415
1.08M
    case BT_LF:
416
1.65M
    case BT_RSQB:
417
1.65M
      *nextTokPtr = ptr;
418
1.65M
      return XML_TOK_DATA_CHARS;
419
21.7M
    default:
420
21.7M
      ptr += MINBPC(enc);
421
21.7M
      break;
422
23.7M
    }
423
23.7M
  }
424
56
  *nextTokPtr = ptr;
425
56
  return XML_TOK_DATA_CHARS;
426
1.65M
}
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
96.6k
                   const char **nextTokPtr) {
433
96.6k
  REQUIRE_CHAR(enc, ptr, end);
434
96.5k
  switch (BYTE_TYPE(enc, ptr)) {
435
72.2k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
436
10
  default:
437
10
    *nextTokPtr = ptr;
438
10
    return XML_TOK_INVALID;
439
96.5k
  }
440
1.13M
  while (HAS_CHAR(enc, ptr, end)) {
441
1.13M
    switch (BYTE_TYPE(enc, ptr)) {
442
3.32M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
443
347
    case BT_S:
444
1.32k
    case BT_CR:
445
2.52k
    case BT_LF:
446
6.47k
      for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
447
6.47k
        switch (BYTE_TYPE(enc, ptr)) {
448
255
        case BT_S:
449
1.65k
        case BT_CR:
450
3.99k
        case BT_LF:
451
3.99k
          break;
452
2.47k
        case BT_GT:
453
2.47k
          *nextTokPtr = ptr + MINBPC(enc);
454
2.47k
          return XML_TOK_END_TAG;
455
3
        default:
456
3
          *nextTokPtr = ptr;
457
3
          return XML_TOK_INVALID;
458
6.47k
        }
459
6.47k
      }
460
44
      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
93.8k
    case BT_GT:
469
93.8k
      *nextTokPtr = ptr + MINBPC(enc);
470
93.8k
      return XML_TOK_END_TAG;
471
9
    default:
472
9
      *nextTokPtr = ptr;
473
9
      return XML_TOK_INVALID;
474
1.13M
    }
475
1.13M
  }
476
118
  return XML_TOK_PARTIAL;
477
96.5k
}
xmltok.c:normal_scanEndTag
Line
Count
Source
432
96.6k
                   const char **nextTokPtr) {
433
96.6k
  REQUIRE_CHAR(enc, ptr, end);
434
96.5k
  switch (BYTE_TYPE(enc, ptr)) {
435
72.2k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
436
10
  default:
437
10
    *nextTokPtr = ptr;
438
10
    return XML_TOK_INVALID;
439
96.5k
  }
440
1.13M
  while (HAS_CHAR(enc, ptr, end)) {
441
1.13M
    switch (BYTE_TYPE(enc, ptr)) {
442
3.32M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
443
347
    case BT_S:
444
1.32k
    case BT_CR:
445
2.52k
    case BT_LF:
446
6.47k
      for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
447
6.47k
        switch (BYTE_TYPE(enc, ptr)) {
448
255
        case BT_S:
449
1.65k
        case BT_CR:
450
3.99k
        case BT_LF:
451
3.99k
          break;
452
2.47k
        case BT_GT:
453
2.47k
          *nextTokPtr = ptr + MINBPC(enc);
454
2.47k
          return XML_TOK_END_TAG;
455
3
        default:
456
3
          *nextTokPtr = ptr;
457
3
          return XML_TOK_INVALID;
458
6.47k
        }
459
6.47k
      }
460
44
      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
93.8k
    case BT_GT:
469
93.8k
      *nextTokPtr = ptr + MINBPC(enc);
470
93.8k
      return XML_TOK_END_TAG;
471
9
    default:
472
9
      *nextTokPtr = ptr;
473
9
      return XML_TOK_INVALID;
474
1.13M
    }
475
1.13M
  }
476
118
  return XML_TOK_PARTIAL;
477
96.5k
}
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
79.1k
                       const char **nextTokPtr) {
484
79.1k
  if (HAS_CHAR(enc, ptr, end)) {
485
79.1k
    switch (BYTE_TYPE(enc, ptr)) {
486
32.9k
    case BT_DIGIT:
487
79.1k
    case BT_HEX:
488
79.1k
      break;
489
4
    default:
490
4
      *nextTokPtr = ptr;
491
4
      return XML_TOK_INVALID;
492
79.1k
    }
493
282k
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
494
282k
      switch (BYTE_TYPE(enc, ptr)) {
495
143k
      case BT_DIGIT:
496
203k
      case BT_HEX:
497
203k
        break;
498
79.1k
      case BT_SEMI:
499
79.1k
        *nextTokPtr = ptr + MINBPC(enc);
500
79.1k
        return XML_TOK_CHAR_REF;
501
2
      default:
502
2
        *nextTokPtr = ptr;
503
2
        return XML_TOK_INVALID;
504
282k
      }
505
282k
    }
506
79.1k
  }
507
25
  return XML_TOK_PARTIAL;
508
79.1k
}
xmltok.c:normal_scanHexCharRef
Line
Count
Source
483
79.1k
                       const char **nextTokPtr) {
484
79.1k
  if (HAS_CHAR(enc, ptr, end)) {
485
79.1k
    switch (BYTE_TYPE(enc, ptr)) {
486
32.9k
    case BT_DIGIT:
487
79.1k
    case BT_HEX:
488
79.1k
      break;
489
4
    default:
490
4
      *nextTokPtr = ptr;
491
4
      return XML_TOK_INVALID;
492
79.1k
    }
493
282k
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
494
282k
      switch (BYTE_TYPE(enc, ptr)) {
495
143k
      case BT_DIGIT:
496
203k
      case BT_HEX:
497
203k
        break;
498
79.1k
      case BT_SEMI:
499
79.1k
        *nextTokPtr = ptr + MINBPC(enc);
500
79.1k
        return XML_TOK_CHAR_REF;
501
2
      default:
502
2
        *nextTokPtr = ptr;
503
2
        return XML_TOK_INVALID;
504
282k
      }
505
282k
    }
506
79.1k
  }
507
25
  return XML_TOK_PARTIAL;
508
79.1k
}
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
89.3k
                    const char **nextTokPtr) {
515
89.3k
  if (HAS_CHAR(enc, ptr, end)) {
516
89.3k
    if (CHAR_MATCHES(enc, ptr, ASCII_x))
517
79.1k
      return PREFIX(scanHexCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
518
10.1k
    switch (BYTE_TYPE(enc, ptr)) {
519
10.1k
    case BT_DIGIT:
520
10.1k
      break;
521
16
    default:
522
16
      *nextTokPtr = ptr;
523
16
      return XML_TOK_INVALID;
524
10.1k
    }
525
40.6k
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
526
40.6k
      switch (BYTE_TYPE(enc, ptr)) {
527
30.5k
      case BT_DIGIT:
528
30.5k
        break;
529
10.1k
      case BT_SEMI:
530
10.1k
        *nextTokPtr = ptr + MINBPC(enc);
531
10.1k
        return XML_TOK_CHAR_REF;
532
2
      default:
533
2
        *nextTokPtr = ptr;
534
2
        return XML_TOK_INVALID;
535
40.6k
      }
536
40.6k
    }
537
10.1k
  }
538
16
  return XML_TOK_PARTIAL;
539
89.3k
}
xmltok.c:normal_scanCharRef
Line
Count
Source
514
89.3k
                    const char **nextTokPtr) {
515
89.3k
  if (HAS_CHAR(enc, ptr, end)) {
516
89.3k
    if (CHAR_MATCHES(enc, ptr, ASCII_x))
517
79.1k
      return PREFIX(scanHexCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
518
10.1k
    switch (BYTE_TYPE(enc, ptr)) {
519
10.1k
    case BT_DIGIT:
520
10.1k
      break;
521
16
    default:
522
16
      *nextTokPtr = ptr;
523
16
      return XML_TOK_INVALID;
524
10.1k
    }
525
40.6k
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
526
40.6k
      switch (BYTE_TYPE(enc, ptr)) {
527
30.5k
      case BT_DIGIT:
528
30.5k
        break;
529
10.1k
      case BT_SEMI:
530
10.1k
        *nextTokPtr = ptr + MINBPC(enc);
531
10.1k
        return XML_TOK_CHAR_REF;
532
2
      default:
533
2
        *nextTokPtr = ptr;
534
2
        return XML_TOK_INVALID;
535
40.6k
      }
536
40.6k
    }
537
10.1k
  }
538
16
  return XML_TOK_PARTIAL;
539
89.3k
}
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
179k
                const char **nextTokPtr) {
546
179k
  REQUIRE_CHAR(enc, ptr, end);
547
179k
  switch (BYTE_TYPE(enc, ptr)) {
548
56.6k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
549
89.3k
  case BT_NUM:
550
89.3k
    return PREFIX(scanCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
551
11
  default:
552
11
    *nextTokPtr = ptr;
553
11
    return XML_TOK_INVALID;
554
179k
  }
555
325k
  while (HAS_CHAR(enc, ptr, end)) {
556
325k
    switch (BYTE_TYPE(enc, ptr)) {
557
810k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
558
89.7k
    case BT_SEMI:
559
89.7k
      *nextTokPtr = ptr + MINBPC(enc);
560
89.7k
      return XML_TOK_ENTITY_REF;
561
14
    default:
562
14
      *nextTokPtr = ptr;
563
14
      return XML_TOK_INVALID;
564
325k
    }
565
325k
  }
566
82
  return XML_TOK_PARTIAL;
567
89.9k
}
xmltok.c:normal_scanRef
Line
Count
Source
545
179k
                const char **nextTokPtr) {
546
179k
  REQUIRE_CHAR(enc, ptr, end);
547
179k
  switch (BYTE_TYPE(enc, ptr)) {
548
56.6k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
549
89.3k
  case BT_NUM:
550
89.3k
    return PREFIX(scanCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
551
11
  default:
552
11
    *nextTokPtr = ptr;
553
11
    return XML_TOK_INVALID;
554
179k
  }
555
325k
  while (HAS_CHAR(enc, ptr, end)) {
556
325k
    switch (BYTE_TYPE(enc, ptr)) {
557
810k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
558
89.7k
    case BT_SEMI:
559
89.7k
      *nextTokPtr = ptr + MINBPC(enc);
560
89.7k
      return XML_TOK_ENTITY_REF;
561
14
    default:
562
14
      *nextTokPtr = ptr;
563
14
      return XML_TOK_INVALID;
564
325k
    }
565
325k
  }
566
82
  return XML_TOK_PARTIAL;
567
89.9k
}
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
34.8k
                 const char **nextTokPtr) {
574
#  ifdef XML_NS
575
  int hadColon = 0;
576
#  endif
577
2.36M
  while (HAS_CHAR(enc, ptr, end)) {
578
2.36M
    switch (BYTE_TYPE(enc, ptr)) {
579
1.57M
      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
2.15k
    case BT_S:
598
12.8k
    case BT_CR:
599
16.1k
    case BT_LF:
600
33.0k
      for (;;) {
601
33.0k
        int t;
602
603
33.0k
        ptr += MINBPC(enc);
604
33.0k
        REQUIRE_CHAR(enc, ptr, end);
605
32.9k
        t = BYTE_TYPE(enc, ptr);
606
32.9k
        if (t == BT_EQUALS)
607
16.0k
          break;
608
16.8k
        switch (t) {
609
3.10k
        case BT_S:
610
5.54k
        case BT_LF:
611
16.8k
        case BT_CR:
612
16.8k
          break;
613
11
        default:
614
11
          *nextTokPtr = ptr;
615
11
          return XML_TOK_INVALID;
616
16.8k
        }
617
16.8k
      }
618
      /* fall through */
619
1.90M
    case BT_EQUALS: {
620
1.90M
      int open;
621
#  ifdef XML_NS
622
      hadColon = 0;
623
#  endif
624
1.95M
      for (;;) {
625
1.95M
        ptr += MINBPC(enc);
626
1.95M
        REQUIRE_CHAR(enc, ptr, end);
627
1.95M
        open = BYTE_TYPE(enc, ptr);
628
1.95M
        if (open == BT_QUOT || open == BT_APOS)
629
1.90M
          break;
630
48.4k
        switch (open) {
631
8.25k
        case BT_S:
632
20.4k
        case BT_LF:
633
48.4k
        case BT_CR:
634
48.4k
          break;
635
14
        default:
636
14
          *nextTokPtr = ptr;
637
14
          return XML_TOK_INVALID;
638
48.4k
        }
639
48.4k
      }
640
1.90M
      ptr += MINBPC(enc);
641
      /* in attribute value */
642
22.8M
      for (;;) {
643
22.8M
        int t;
644
22.8M
        REQUIRE_CHAR(enc, ptr, end);
645
22.8M
        t = BYTE_TYPE(enc, ptr);
646
22.8M
        if (t == open)
647
1.90M
          break;
648
20.9M
        switch (t) {
649
318k
          INVALID_CASES(ptr, nextTokPtr)
650
50.2k
        case BT_AMP: {
651
50.2k
          int tok = PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, &ptr);
652
50.2k
          if (tok <= 0) {
653
52
            if (tok == XML_TOK_INVALID)
654
20
              *nextTokPtr = ptr;
655
52
            return tok;
656
52
          }
657
50.2k
          break;
658
50.2k
        }
659
50.2k
        case BT_LT:
660
7
          *nextTokPtr = ptr;
661
7
          return XML_TOK_INVALID;
662
20.7M
        default:
663
20.7M
          ptr += MINBPC(enc);
664
20.7M
          break;
665
20.9M
        }
666
20.9M
      }
667
1.90M
      ptr += MINBPC(enc);
668
1.90M
      REQUIRE_CHAR(enc, ptr, end);
669
1.90M
      switch (BYTE_TYPE(enc, ptr)) {
670
967k
      case BT_S:
671
1.83M
      case BT_CR:
672
1.88M
      case BT_LF:
673
1.88M
        break;
674
21.0k
      case BT_SOL:
675
21.0k
        goto sol;
676
5.13k
      case BT_GT:
677
5.13k
        goto gt;
678
8
      default:
679
8
        *nextTokPtr = ptr;
680
8
        return XML_TOK_INVALID;
681
1.90M
      }
682
      /* ptr points to closing quote */
683
2.05M
      for (;;) {
684
2.05M
        ptr += MINBPC(enc);
685
2.05M
        REQUIRE_CHAR(enc, ptr, end);
686
2.05M
        switch (BYTE_TYPE(enc, ptr)) {
687
1.88M
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
688
122k
        case BT_S:
689
154k
        case BT_CR:
690
178k
        case BT_LF:
691
178k
          continue;
692
266
        case BT_GT:
693
5.39k
        gt:
694
5.39k
          *nextTokPtr = ptr + MINBPC(enc);
695
5.39k
          return XML_TOK_START_TAG_WITH_ATTS;
696
7.73k
        case BT_SOL:
697
28.7k
        sol:
698
28.7k
          ptr += MINBPC(enc);
699
28.7k
          REQUIRE_CHAR(enc, ptr, end);
700
28.7k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
701
5
            *nextTokPtr = ptr;
702
5
            return XML_TOK_INVALID;
703
5
          }
704
28.7k
          *nextTokPtr = ptr + MINBPC(enc);
705
28.7k
          return XML_TOK_EMPTY_ELEMENT_WITH_ATTS;
706
9
        default:
707
9
          *nextTokPtr = ptr;
708
9
          return XML_TOK_INVALID;
709
2.05M
        }
710
1.87M
        break;
711
2.05M
      }
712
1.87M
      break;
713
1.88M
    }
714
1.87M
    default:
715
19
      *nextTokPtr = ptr;
716
19
      return XML_TOK_INVALID;
717
2.36M
    }
718
2.36M
  }
719
96
  return XML_TOK_PARTIAL;
720
34.8k
}
xmltok.c:normal_scanAtts
Line
Count
Source
573
34.8k
                 const char **nextTokPtr) {
574
#  ifdef XML_NS
575
  int hadColon = 0;
576
#  endif
577
2.36M
  while (HAS_CHAR(enc, ptr, end)) {
578
2.36M
    switch (BYTE_TYPE(enc, ptr)) {
579
1.57M
      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
2.15k
    case BT_S:
598
12.8k
    case BT_CR:
599
16.1k
    case BT_LF:
600
33.0k
      for (;;) {
601
33.0k
        int t;
602
603
33.0k
        ptr += MINBPC(enc);
604
33.0k
        REQUIRE_CHAR(enc, ptr, end);
605
32.9k
        t = BYTE_TYPE(enc, ptr);
606
32.9k
        if (t == BT_EQUALS)
607
16.0k
          break;
608
16.8k
        switch (t) {
609
3.10k
        case BT_S:
610
5.54k
        case BT_LF:
611
16.8k
        case BT_CR:
612
16.8k
          break;
613
11
        default:
614
11
          *nextTokPtr = ptr;
615
11
          return XML_TOK_INVALID;
616
16.8k
        }
617
16.8k
      }
618
      /* fall through */
619
1.90M
    case BT_EQUALS: {
620
1.90M
      int open;
621
#  ifdef XML_NS
622
      hadColon = 0;
623
#  endif
624
1.95M
      for (;;) {
625
1.95M
        ptr += MINBPC(enc);
626
1.95M
        REQUIRE_CHAR(enc, ptr, end);
627
1.95M
        open = BYTE_TYPE(enc, ptr);
628
1.95M
        if (open == BT_QUOT || open == BT_APOS)
629
1.90M
          break;
630
48.4k
        switch (open) {
631
8.25k
        case BT_S:
632
20.4k
        case BT_LF:
633
48.4k
        case BT_CR:
634
48.4k
          break;
635
14
        default:
636
14
          *nextTokPtr = ptr;
637
14
          return XML_TOK_INVALID;
638
48.4k
        }
639
48.4k
      }
640
1.90M
      ptr += MINBPC(enc);
641
      /* in attribute value */
642
22.8M
      for (;;) {
643
22.8M
        int t;
644
22.8M
        REQUIRE_CHAR(enc, ptr, end);
645
22.8M
        t = BYTE_TYPE(enc, ptr);
646
22.8M
        if (t == open)
647
1.90M
          break;
648
20.9M
        switch (t) {
649
318k
          INVALID_CASES(ptr, nextTokPtr)
650
50.2k
        case BT_AMP: {
651
50.2k
          int tok = PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, &ptr);
652
50.2k
          if (tok <= 0) {
653
52
            if (tok == XML_TOK_INVALID)
654
20
              *nextTokPtr = ptr;
655
52
            return tok;
656
52
          }
657
50.2k
          break;
658
50.2k
        }
659
50.2k
        case BT_LT:
660
7
          *nextTokPtr = ptr;
661
7
          return XML_TOK_INVALID;
662
20.7M
        default:
663
20.7M
          ptr += MINBPC(enc);
664
20.7M
          break;
665
20.9M
        }
666
20.9M
      }
667
1.90M
      ptr += MINBPC(enc);
668
1.90M
      REQUIRE_CHAR(enc, ptr, end);
669
1.90M
      switch (BYTE_TYPE(enc, ptr)) {
670
967k
      case BT_S:
671
1.83M
      case BT_CR:
672
1.88M
      case BT_LF:
673
1.88M
        break;
674
21.0k
      case BT_SOL:
675
21.0k
        goto sol;
676
5.13k
      case BT_GT:
677
5.13k
        goto gt;
678
8
      default:
679
8
        *nextTokPtr = ptr;
680
8
        return XML_TOK_INVALID;
681
1.90M
      }
682
      /* ptr points to closing quote */
683
2.05M
      for (;;) {
684
2.05M
        ptr += MINBPC(enc);
685
2.05M
        REQUIRE_CHAR(enc, ptr, end);
686
2.05M
        switch (BYTE_TYPE(enc, ptr)) {
687
1.88M
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
688
122k
        case BT_S:
689
154k
        case BT_CR:
690
178k
        case BT_LF:
691
178k
          continue;
692
266
        case BT_GT:
693
5.39k
        gt:
694
5.39k
          *nextTokPtr = ptr + MINBPC(enc);
695
5.39k
          return XML_TOK_START_TAG_WITH_ATTS;
696
7.73k
        case BT_SOL:
697
28.7k
        sol:
698
28.7k
          ptr += MINBPC(enc);
699
28.7k
          REQUIRE_CHAR(enc, ptr, end);
700
28.7k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
701
5
            *nextTokPtr = ptr;
702
5
            return XML_TOK_INVALID;
703
5
          }
704
28.7k
          *nextTokPtr = ptr + MINBPC(enc);
705
28.7k
          return XML_TOK_EMPTY_ELEMENT_WITH_ATTS;
706
9
        default:
707
9
          *nextTokPtr = ptr;
708
9
          return XML_TOK_INVALID;
709
2.05M
        }
710
1.87M
        break;
711
2.05M
      }
712
1.87M
      break;
713
1.88M
    }
714
1.87M
    default:
715
19
      *nextTokPtr = ptr;
716
19
      return XML_TOK_INVALID;
717
2.36M
    }
718
2.36M
  }
719
96
  return XML_TOK_PARTIAL;
720
34.8k
}
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.03M
               const char **nextTokPtr) {
727
#  ifdef XML_NS
728
  int hadColon;
729
#  endif
730
1.03M
  REQUIRE_CHAR(enc, ptr, end);
731
1.03M
  switch (BYTE_TYPE(enc, ptr)) {
732
859k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
733
18.8k
  case BT_EXCL:
734
18.8k
    ptr += MINBPC(enc);
735
18.8k
    REQUIRE_CHAR(enc, ptr, end);
736
18.8k
    switch (BYTE_TYPE(enc, ptr)) {
737
16.5k
    case BT_MINUS:
738
16.5k
      return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
739
2.38k
    case BT_LSQB:
740
2.38k
      return PREFIX(scanCdataSection)(enc, ptr + MINBPC(enc), end, nextTokPtr);
741
18.8k
    }
742
2
    *nextTokPtr = ptr;
743
2
    return XML_TOK_INVALID;
744
29.3k
  case BT_QUEST:
745
29.3k
    return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
746
96.6k
  case BT_SOL:
747
96.6k
    return PREFIX(scanEndTag)(enc, ptr + MINBPC(enc), end, nextTokPtr);
748
22
  default:
749
22
    *nextTokPtr = ptr;
750
22
    return XML_TOK_INVALID;
751
1.03M
  }
752
#  ifdef XML_NS
753
  hadColon = 0;
754
#  endif
755
  /* we have a start-tag */
756
9.68M
  while (HAS_CHAR(enc, ptr, end)) {
757
9.68M
    switch (BYTE_TYPE(enc, ptr)) {
758
34.2M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
759
#  ifdef XML_NS
760
    case BT_COLON:
761
      if (hadColon) {
762
        *nextTokPtr = ptr;
763
        return XML_TOK_INVALID;
764
      }
765
      hadColon = 1;
766
      ptr += MINBPC(enc);
767
      REQUIRE_CHAR(enc, ptr, end);
768
      switch (BYTE_TYPE(enc, ptr)) {
769
        CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
770
      default:
771
        *nextTokPtr = ptr;
772
        return XML_TOK_INVALID;
773
      }
774
      break;
775
#  endif
776
30.7k
    case BT_S:
777
38.0k
    case BT_CR:
778
42.0k
    case BT_LF: {
779
42.0k
      ptr += MINBPC(enc);
780
65.4k
      while (HAS_CHAR(enc, ptr, end)) {
781
65.4k
        switch (BYTE_TYPE(enc, ptr)) {
782
20.4k
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
783
2.86k
        case BT_GT:
784
2.86k
          goto gt;
785
4.17k
        case BT_SOL:
786
4.17k
          goto sol;
787
1.85k
        case BT_S:
788
18.9k
        case BT_CR:
789
23.4k
        case BT_LF:
790
23.4k
          ptr += MINBPC(enc);
791
23.4k
          continue;
792
3
        default:
793
3
          *nextTokPtr = ptr;
794
3
          return XML_TOK_INVALID;
795
65.4k
        }
796
34.8k
        return PREFIX(scanAtts)(enc, ptr, end, nextTokPtr);
797
65.4k
      }
798
56
      return XML_TOK_PARTIAL;
799
42.0k
    }
800
824k
    case BT_GT:
801
827k
    gt:
802
827k
      *nextTokPtr = ptr + MINBPC(enc);
803
827k
      return XML_TOK_START_TAG_NO_ATTS;
804
27.4k
    case BT_SOL:
805
31.6k
    sol:
806
31.6k
      ptr += MINBPC(enc);
807
31.6k
      REQUIRE_CHAR(enc, ptr, end);
808
31.5k
      if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
809
10
        *nextTokPtr = ptr;
810
10
        return XML_TOK_INVALID;
811
10
      }
812
31.5k
      *nextTokPtr = ptr + MINBPC(enc);
813
31.5k
      return XML_TOK_EMPTY_ELEMENT_NO_ATTS;
814
21
    default:
815
21
      *nextTokPtr = ptr;
816
21
      return XML_TOK_INVALID;
817
9.68M
    }
818
9.68M
  }
819
178
  return XML_TOK_PARTIAL;
820
894k
}
xmltok.c:normal_scanLt
Line
Count
Source
726
1.03M
               const char **nextTokPtr) {
727
#  ifdef XML_NS
728
  int hadColon;
729
#  endif
730
1.03M
  REQUIRE_CHAR(enc, ptr, end);
731
1.03M
  switch (BYTE_TYPE(enc, ptr)) {
732
859k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
733
18.8k
  case BT_EXCL:
734
18.8k
    ptr += MINBPC(enc);
735
18.8k
    REQUIRE_CHAR(enc, ptr, end);
736
18.8k
    switch (BYTE_TYPE(enc, ptr)) {
737
16.5k
    case BT_MINUS:
738
16.5k
      return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
739
2.38k
    case BT_LSQB:
740
2.38k
      return PREFIX(scanCdataSection)(enc, ptr + MINBPC(enc), end, nextTokPtr);
741
18.8k
    }
742
2
    *nextTokPtr = ptr;
743
2
    return XML_TOK_INVALID;
744
29.3k
  case BT_QUEST:
745
29.3k
    return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
746
96.6k
  case BT_SOL:
747
96.6k
    return PREFIX(scanEndTag)(enc, ptr + MINBPC(enc), end, nextTokPtr);
748
22
  default:
749
22
    *nextTokPtr = ptr;
750
22
    return XML_TOK_INVALID;
751
1.03M
  }
752
#  ifdef XML_NS
753
  hadColon = 0;
754
#  endif
755
  /* we have a start-tag */
756
9.68M
  while (HAS_CHAR(enc, ptr, end)) {
757
9.68M
    switch (BYTE_TYPE(enc, ptr)) {
758
34.2M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
759
#  ifdef XML_NS
760
    case BT_COLON:
761
      if (hadColon) {
762
        *nextTokPtr = ptr;
763
        return XML_TOK_INVALID;
764
      }
765
      hadColon = 1;
766
      ptr += MINBPC(enc);
767
      REQUIRE_CHAR(enc, ptr, end);
768
      switch (BYTE_TYPE(enc, ptr)) {
769
        CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
770
      default:
771
        *nextTokPtr = ptr;
772
        return XML_TOK_INVALID;
773
      }
774
      break;
775
#  endif
776
30.7k
    case BT_S:
777
38.0k
    case BT_CR:
778
42.0k
    case BT_LF: {
779
42.0k
      ptr += MINBPC(enc);
780
65.4k
      while (HAS_CHAR(enc, ptr, end)) {
781
65.4k
        switch (BYTE_TYPE(enc, ptr)) {
782
20.4k
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
783
2.86k
        case BT_GT:
784
2.86k
          goto gt;
785
4.17k
        case BT_SOL:
786
4.17k
          goto sol;
787
1.85k
        case BT_S:
788
18.9k
        case BT_CR:
789
23.4k
        case BT_LF:
790
23.4k
          ptr += MINBPC(enc);
791
23.4k
          continue;
792
3
        default:
793
3
          *nextTokPtr = ptr;
794
3
          return XML_TOK_INVALID;
795
65.4k
        }
796
34.8k
        return PREFIX(scanAtts)(enc, ptr, end, nextTokPtr);
797
65.4k
      }
798
56
      return XML_TOK_PARTIAL;
799
42.0k
    }
800
824k
    case BT_GT:
801
827k
    gt:
802
827k
      *nextTokPtr = ptr + MINBPC(enc);
803
827k
      return XML_TOK_START_TAG_NO_ATTS;
804
27.4k
    case BT_SOL:
805
31.6k
    sol:
806
31.6k
      ptr += MINBPC(enc);
807
31.6k
      REQUIRE_CHAR(enc, ptr, end);
808
31.5k
      if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
809
10
        *nextTokPtr = ptr;
810
10
        return XML_TOK_INVALID;
811
10
      }
812
31.5k
      *nextTokPtr = ptr + MINBPC(enc);
813
31.5k
      return XML_TOK_EMPTY_ELEMENT_NO_ATTS;
814
21
    default:
815
21
      *nextTokPtr = ptr;
816
21
      return XML_TOK_INVALID;
817
9.68M
    }
818
9.68M
  }
819
178
  return XML_TOK_PARTIAL;
820
894k
}
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.71M
                   const char **nextTokPtr) {
825
3.71M
  if (ptr >= end)
826
3.80k
    return XML_TOK_NONE;
827
3.71M
  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.71M
  switch (BYTE_TYPE(enc, ptr)) {
837
1.03M
  case BT_LT:
838
1.03M
    return PREFIX(scanLt)(enc, ptr + MINBPC(enc), end, nextTokPtr);
839
28.7k
  case BT_AMP:
840
28.7k
    return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
841
1.19M
  case BT_CR:
842
1.19M
    ptr += MINBPC(enc);
843
1.19M
    if (! HAS_CHAR(enc, ptr, end))
844
16
      return XML_TOK_TRAILING_CR;
845
1.19M
    if (BYTE_TYPE(enc, ptr) == BT_LF)
846
207k
      ptr += MINBPC(enc);
847
1.19M
    *nextTokPtr = ptr;
848
1.19M
    return XML_TOK_DATA_NEWLINE;
849
689k
  case BT_LF:
850
689k
    *nextTokPtr = ptr + MINBPC(enc);
851
689k
    return XML_TOK_DATA_NEWLINE;
852
196k
  case BT_RSQB:
853
196k
    ptr += MINBPC(enc);
854
196k
    if (! HAS_CHAR(enc, ptr, end))
855
20
      return XML_TOK_TRAILING_RSQB;
856
196k
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
857
31.2k
      break;
858
165k
    ptr += MINBPC(enc);
859
165k
    if (! HAS_CHAR(enc, ptr, end))
860
6
      return XML_TOK_TRAILING_RSQB;
861
165k
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
862
165k
      ptr -= MINBPC(enc);
863
165k
      break;
864
165k
    }
865
1
    *nextTokPtr = ptr;
866
1
    return XML_TOK_INVALID;
867
60.1k
    INVALID_CASES(ptr, nextTokPtr)
868
533k
  default:
869
533k
    ptr += MINBPC(enc);
870
533k
    break;
871
3.71M
  }
872
12.5M
  while (HAS_CHAR(enc, ptr, end)) {
873
12.5M
    switch (BYTE_TYPE(enc, ptr)) {
874
0
#  define LEAD_CASE(n)                                                         \
875
110k
  case BT_LEAD##n:                                                             \
876
110k
    if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) {                       \
877
33
      *nextTokPtr = ptr;                                                       \
878
33
      return XML_TOK_DATA_CHARS;                                               \
879
33
    }                                                                          \
880
110k
    ptr += n;                                                                  \
881
110k
    break;
882
60.9k
      LEAD_CASE(2)
883
21.9k
      LEAD_CASE(3)
884
27.2k
      LEAD_CASE(4)
885
0
#  undef LEAD_CASE
886
523k
    case BT_RSQB:
887
523k
      if (HAS_CHARS(enc, ptr, end, 2)) {
888
523k
        if (! CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_RSQB)) {
889
261k
          ptr += MINBPC(enc);
890
261k
          break;
891
261k
        }
892
262k
        if (HAS_CHARS(enc, ptr, end, 3)) {
893
262k
          if (! CHAR_MATCHES(enc, ptr + 2 * MINBPC(enc), ASCII_GT)) {
894
262k
            ptr += MINBPC(enc);
895
262k
            break;
896
262k
          }
897
2
          *nextTokPtr = ptr + 2 * MINBPC(enc);
898
2
          return XML_TOK_INVALID;
899
262k
        }
900
262k
      }
901
      /* fall through */
902
14.5k
    case BT_AMP:
903
150k
    case BT_LT:
904
150k
    case BT_NONXML:
905
150k
    case BT_MALFORM:
906
150k
    case BT_TRAIL:
907
586k
    case BT_CR:
908
757k
    case BT_LF:
909
757k
      *nextTokPtr = ptr;
910
757k
      return XML_TOK_DATA_CHARS;
911
11.1M
    default:
912
11.1M
      ptr += MINBPC(enc);
913
11.1M
      break;
914
12.5M
    }
915
12.5M
  }
916
1.99k
  *nextTokPtr = ptr;
917
1.99k
  return XML_TOK_DATA_CHARS;
918
759k
}
xmltok.c:normal_contentTok
Line
Count
Source
824
3.71M
                   const char **nextTokPtr) {
825
3.71M
  if (ptr >= end)
826
3.80k
    return XML_TOK_NONE;
827
3.71M
  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.71M
  switch (BYTE_TYPE(enc, ptr)) {
837
1.03M
  case BT_LT:
838
1.03M
    return PREFIX(scanLt)(enc, ptr + MINBPC(enc), end, nextTokPtr);
839
28.7k
  case BT_AMP:
840
28.7k
    return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
841
1.19M
  case BT_CR:
842
1.19M
    ptr += MINBPC(enc);
843
1.19M
    if (! HAS_CHAR(enc, ptr, end))
844
16
      return XML_TOK_TRAILING_CR;
845
1.19M
    if (BYTE_TYPE(enc, ptr) == BT_LF)
846
207k
      ptr += MINBPC(enc);
847
1.19M
    *nextTokPtr = ptr;
848
1.19M
    return XML_TOK_DATA_NEWLINE;
849
689k
  case BT_LF:
850
689k
    *nextTokPtr = ptr + MINBPC(enc);
851
689k
    return XML_TOK_DATA_NEWLINE;
852
196k
  case BT_RSQB:
853
196k
    ptr += MINBPC(enc);
854
196k
    if (! HAS_CHAR(enc, ptr, end))
855
20
      return XML_TOK_TRAILING_RSQB;
856
196k
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
857
31.2k
      break;
858
165k
    ptr += MINBPC(enc);
859
165k
    if (! HAS_CHAR(enc, ptr, end))
860
6
      return XML_TOK_TRAILING_RSQB;
861
165k
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
862
165k
      ptr -= MINBPC(enc);
863
165k
      break;
864
165k
    }
865
1
    *nextTokPtr = ptr;
866
1
    return XML_TOK_INVALID;
867
60.1k
    INVALID_CASES(ptr, nextTokPtr)
868
533k
  default:
869
533k
    ptr += MINBPC(enc);
870
533k
    break;
871
3.71M
  }
872
12.5M
  while (HAS_CHAR(enc, ptr, end)) {
873
12.5M
    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
60.9k
      LEAD_CASE(2)
883
21.9k
      LEAD_CASE(3)
884
27.2k
      LEAD_CASE(4)
885
0
#  undef LEAD_CASE
886
523k
    case BT_RSQB:
887
523k
      if (HAS_CHARS(enc, ptr, end, 2)) {
888
523k
        if (! CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_RSQB)) {
889
261k
          ptr += MINBPC(enc);
890
261k
          break;
891
261k
        }
892
262k
        if (HAS_CHARS(enc, ptr, end, 3)) {
893
262k
          if (! CHAR_MATCHES(enc, ptr + 2 * MINBPC(enc), ASCII_GT)) {
894
262k
            ptr += MINBPC(enc);
895
262k
            break;
896
262k
          }
897
2
          *nextTokPtr = ptr + 2 * MINBPC(enc);
898
2
          return XML_TOK_INVALID;
899
262k
        }
900
262k
      }
901
      /* fall through */
902
14.5k
    case BT_AMP:
903
150k
    case BT_LT:
904
150k
    case BT_NONXML:
905
150k
    case BT_MALFORM:
906
150k
    case BT_TRAIL:
907
586k
    case BT_CR:
908
757k
    case BT_LF:
909
757k
      *nextTokPtr = ptr;
910
757k
      return XML_TOK_DATA_CHARS;
911
11.1M
    default:
912
11.1M
      ptr += MINBPC(enc);
913
11.1M
      break;
914
12.5M
    }
915
12.5M
  }
916
1.99k
  *nextTokPtr = ptr;
917
1.99k
  return XML_TOK_DATA_CHARS;
918
759k
}
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
5.76k
                    const char **nextTokPtr) {
925
5.76k
  REQUIRE_CHAR(enc, ptr, end);
926
5.74k
  switch (BYTE_TYPE(enc, ptr)) {
927
5.36k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
928
451
  case BT_S:
929
1.07k
  case BT_LF:
930
1.57k
  case BT_CR:
931
1.57k
  case BT_PERCNT:
932
1.57k
    *nextTokPtr = ptr;
933
1.57k
    return XML_TOK_PERCENT;
934
3
  default:
935
3
    *nextTokPtr = ptr;
936
3
    return XML_TOK_INVALID;
937
5.74k
  }
938
39.2k
  while (HAS_CHAR(enc, ptr, end)) {
939
39.2k
    switch (BYTE_TYPE(enc, ptr)) {
940
103k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
941
3.93k
    case BT_SEMI:
942
3.93k
      *nextTokPtr = ptr + MINBPC(enc);
943
3.93k
      return XML_TOK_PARAM_ENTITY_REF;
944
20
    default:
945
20
      *nextTokPtr = ptr;
946
20
      return XML_TOK_INVALID;
947
39.2k
    }
948
39.2k
  }
949
100
  return XML_TOK_PARTIAL;
950
4.11k
}
xmltok.c:normal_scanPercent
Line
Count
Source
924
5.76k
                    const char **nextTokPtr) {
925
5.76k
  REQUIRE_CHAR(enc, ptr, end);
926
5.74k
  switch (BYTE_TYPE(enc, ptr)) {
927
5.36k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
928
451
  case BT_S:
929
1.07k
  case BT_LF:
930
1.57k
  case BT_CR:
931
1.57k
  case BT_PERCNT:
932
1.57k
    *nextTokPtr = ptr;
933
1.57k
    return XML_TOK_PERCENT;
934
3
  default:
935
3
    *nextTokPtr = ptr;
936
3
    return XML_TOK_INVALID;
937
5.74k
  }
938
39.2k
  while (HAS_CHAR(enc, ptr, end)) {
939
39.2k
    switch (BYTE_TYPE(enc, ptr)) {
940
103k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
941
3.93k
    case BT_SEMI:
942
3.93k
      *nextTokPtr = ptr + MINBPC(enc);
943
3.93k
      return XML_TOK_PARAM_ENTITY_REF;
944
20
    default:
945
20
      *nextTokPtr = ptr;
946
20
      return XML_TOK_INVALID;
947
39.2k
    }
948
39.2k
  }
949
100
  return XML_TOK_PARTIAL;
950
4.11k
}
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
242k
                      const char **nextTokPtr) {
955
242k
  REQUIRE_CHAR(enc, ptr, end);
956
242k
  switch (BYTE_TYPE(enc, ptr)) {
957
241k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
958
4
  default:
959
4
    *nextTokPtr = ptr;
960
4
    return XML_TOK_INVALID;
961
242k
  }
962
1.79M
  while (HAS_CHAR(enc, ptr, end)) {
963
1.79M
    switch (BYTE_TYPE(enc, ptr)) {
964
5.63M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
965
79.8k
    case BT_CR:
966
85.5k
    case BT_LF:
967
237k
    case BT_S:
968
237k
    case BT_RPAR:
969
241k
    case BT_GT:
970
241k
    case BT_PERCNT:
971
241k
    case BT_VERBAR:
972
241k
      *nextTokPtr = ptr;
973
241k
      return XML_TOK_POUND_NAME;
974
19
    default:
975
19
      *nextTokPtr = ptr;
976
19
      return XML_TOK_INVALID;
977
1.79M
    }
978
1.79M
  }
979
234
  return -XML_TOK_POUND_NAME;
980
242k
}
xmltok.c:normal_scanPoundName
Line
Count
Source
954
242k
                      const char **nextTokPtr) {
955
242k
  REQUIRE_CHAR(enc, ptr, end);
956
242k
  switch (BYTE_TYPE(enc, ptr)) {
957
241k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
958
4
  default:
959
4
    *nextTokPtr = ptr;
960
4
    return XML_TOK_INVALID;
961
242k
  }
962
1.79M
  while (HAS_CHAR(enc, ptr, end)) {
963
1.79M
    switch (BYTE_TYPE(enc, ptr)) {
964
5.63M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
965
79.8k
    case BT_CR:
966
85.5k
    case BT_LF:
967
237k
    case BT_S:
968
237k
    case BT_RPAR:
969
241k
    case BT_GT:
970
241k
    case BT_PERCNT:
971
241k
    case BT_VERBAR:
972
241k
      *nextTokPtr = ptr;
973
241k
      return XML_TOK_POUND_NAME;
974
19
    default:
975
19
      *nextTokPtr = ptr;
976
19
      return XML_TOK_INVALID;
977
1.79M
    }
978
1.79M
  }
979
234
  return -XML_TOK_POUND_NAME;
980
242k
}
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
93.6k
                const char **nextTokPtr) {
985
7.85M
  while (HAS_CHAR(enc, ptr, end)) {
986
7.85M
    int t = BYTE_TYPE(enc, ptr);
987
7.85M
    switch (t) {
988
84.5k
      INVALID_CASES(ptr, nextTokPtr)
989
8.17k
    case BT_QUOT:
990
96.2k
    case BT_APOS:
991
96.2k
      ptr += MINBPC(enc);
992
96.2k
      if (t != open)
993
2.77k
        break;
994
93.5k
      if (! HAS_CHAR(enc, ptr, end))
995
573
        return -XML_TOK_LITERAL;
996
92.9k
      *nextTokPtr = ptr;
997
92.9k
      switch (BYTE_TYPE(enc, ptr)) {
998
13.5k
      case BT_S:
999
18.0k
      case BT_CR:
1000
72.0k
      case BT_LF:
1001
92.6k
      case BT_GT:
1002
92.6k
      case BT_PERCNT:
1003
92.9k
      case BT_LSQB:
1004
92.9k
        return XML_TOK_LITERAL;
1005
17
      default:
1006
17
        return XML_TOK_INVALID;
1007
92.9k
      }
1008
7.71M
    default:
1009
7.71M
      ptr += MINBPC(enc);
1010
7.71M
      break;
1011
7.85M
    }
1012
7.85M
  }
1013
88
  return XML_TOK_PARTIAL;
1014
93.6k
}
xmltok.c:normal_scanLit
Line
Count
Source
984
93.6k
                const char **nextTokPtr) {
985
7.85M
  while (HAS_CHAR(enc, ptr, end)) {
986
7.85M
    int t = BYTE_TYPE(enc, ptr);
987
7.85M
    switch (t) {
988
84.5k
      INVALID_CASES(ptr, nextTokPtr)
989
8.17k
    case BT_QUOT:
990
96.2k
    case BT_APOS:
991
96.2k
      ptr += MINBPC(enc);
992
96.2k
      if (t != open)
993
2.77k
        break;
994
93.5k
      if (! HAS_CHAR(enc, ptr, end))
995
573
        return -XML_TOK_LITERAL;
996
92.9k
      *nextTokPtr = ptr;
997
92.9k
      switch (BYTE_TYPE(enc, ptr)) {
998
13.5k
      case BT_S:
999
18.0k
      case BT_CR:
1000
72.0k
      case BT_LF:
1001
92.6k
      case BT_GT:
1002
92.6k
      case BT_PERCNT:
1003
92.9k
      case BT_LSQB:
1004
92.9k
        return XML_TOK_LITERAL;
1005
17
      default:
1006
17
        return XML_TOK_INVALID;
1007
92.9k
      }
1008
7.71M
    default:
1009
7.71M
      ptr += MINBPC(enc);
1010
7.71M
      break;
1011
7.85M
    }
1012
7.85M
  }
1013
88
  return XML_TOK_PARTIAL;
1014
93.6k
}
Unexecuted instantiation: xmltok.c:little2_scanLit
Unexecuted instantiation: xmltok.c:big2_scanLit
1015
1016
static int PTRCALL
1017
PREFIX(prologTok)(const ENCODING *enc, const char *ptr, const char *end,
1018
4.34M
                  const char **nextTokPtr) {
1019
4.34M
  int tok;
1020
4.34M
  if (ptr >= end)
1021
6.76k
    return XML_TOK_NONE;
1022
4.33M
  if (MINBPC(enc) > 1) {
1023
249
    size_t n = end - ptr;
1024
249
    if (n & (MINBPC(enc) - 1)) {
1025
44
      n &= ~(MINBPC(enc) - 1);
1026
44
      if (n == 0)
1027
4
        return XML_TOK_PARTIAL;
1028
40
      end = ptr + n;
1029
40
    }
1030
249
  }
1031
4.33M
  switch (BYTE_TYPE(enc, ptr)) {
1032
6.48k
  case BT_QUOT:
1033
6.48k
    return PREFIX(scanLit)(BT_QUOT, enc, ptr + MINBPC(enc), end, nextTokPtr);
1034
87.2k
  case BT_APOS:
1035
87.2k
    return PREFIX(scanLit)(BT_APOS, enc, ptr + MINBPC(enc), end, nextTokPtr);
1036
71.5k
  case BT_LT: {
1037
71.5k
    ptr += MINBPC(enc);
1038
71.5k
    REQUIRE_CHAR(enc, ptr, end);
1039
71.5k
    switch (BYTE_TYPE(enc, ptr)) {
1040
52.3k
    case BT_EXCL:
1041
52.3k
      return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1042
13.8k
    case BT_QUEST:
1043
13.8k
      return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1044
4.04k
    case BT_NMSTRT:
1045
5.24k
    case BT_HEX:
1046
5.24k
    case BT_NONASCII:
1047
5.29k
    case BT_LEAD2:
1048
5.33k
    case BT_LEAD3:
1049
5.34k
    case BT_LEAD4:
1050
5.34k
      *nextTokPtr = ptr - MINBPC(enc);
1051
5.34k
      return XML_TOK_INSTANCE_START;
1052
71.5k
    }
1053
22
    *nextTokPtr = ptr;
1054
22
    return XML_TOK_INVALID;
1055
71.5k
  }
1056
390k
  case BT_CR:
1057
390k
    if (ptr + MINBPC(enc) == end) {
1058
430
      *nextTokPtr = end;
1059
      /* indicate that this might be part of a CR/LF pair */
1060
430
      return -XML_TOK_PROLOG_S;
1061
430
    }
1062
    /* fall through */
1063
918k
  case BT_S:
1064
1.07M
  case BT_LF:
1065
1.10M
    for (;;) {
1066
1.10M
      ptr += MINBPC(enc);
1067
1.10M
      if (! HAS_CHAR(enc, ptr, end))
1068
239
        break;
1069
1.10M
      switch (BYTE_TYPE(enc, ptr)) {
1070
14.7k
      case BT_S:
1071
27.3k
      case BT_LF:
1072
27.3k
        break;
1073
4.79k
      case BT_CR:
1074
        /* don't split CR/LF pair */
1075
4.79k
        if (ptr + MINBPC(enc) != end)
1076
4.58k
          break;
1077
        /* fall through */
1078
1.07M
      default:
1079
1.07M
        *nextTokPtr = ptr;
1080
1.07M
        return XML_TOK_PROLOG_S;
1081
1.10M
      }
1082
1.10M
    }
1083
239
    *nextTokPtr = ptr;
1084
239
    return XML_TOK_PROLOG_S;
1085
5.76k
  case BT_PERCNT:
1086
5.76k
    return PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1087
3.56k
  case BT_COMMA:
1088
3.56k
    *nextTokPtr = ptr + MINBPC(enc);
1089
3.56k
    return XML_TOK_COMMA;
1090
2.61k
  case BT_LSQB:
1091
2.61k
    *nextTokPtr = ptr + MINBPC(enc);
1092
2.61k
    return XML_TOK_OPEN_BRACKET;
1093
1.14k
  case BT_RSQB:
1094
1.14k
    ptr += MINBPC(enc);
1095
1.14k
    if (! HAS_CHAR(enc, ptr, end))
1096
15
      return -XML_TOK_CLOSE_BRACKET;
1097
1.13k
    if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) {
1098
34
      REQUIRE_CHARS(enc, ptr, end, 2);
1099
32
      if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_GT)) {
1100
7
        *nextTokPtr = ptr + 2 * MINBPC(enc);
1101
7
        return XML_TOK_COND_SECT_CLOSE;
1102
7
      }
1103
32
    }
1104
1.12k
    *nextTokPtr = ptr;
1105
1.12k
    return XML_TOK_CLOSE_BRACKET;
1106
1.79M
  case BT_LPAR:
1107
1.79M
    *nextTokPtr = ptr + MINBPC(enc);
1108
1.79M
    return XML_TOK_OPEN_PAREN;
1109
266k
  case BT_RPAR:
1110
266k
    ptr += MINBPC(enc);
1111
266k
    if (! HAS_CHAR(enc, ptr, end))
1112
99
      return -XML_TOK_CLOSE_PAREN;
1113
266k
    switch (BYTE_TYPE(enc, ptr)) {
1114
4.27k
    case BT_AST:
1115
4.27k
      *nextTokPtr = ptr + MINBPC(enc);
1116
4.27k
      return XML_TOK_CLOSE_PAREN_ASTERISK;
1117
3.26k
    case BT_QUEST:
1118
3.26k
      *nextTokPtr = ptr + MINBPC(enc);
1119
3.26k
      return XML_TOK_CLOSE_PAREN_QUESTION;
1120
3.18k
    case BT_PLUS:
1121
3.18k
      *nextTokPtr = ptr + MINBPC(enc);
1122
3.18k
      return XML_TOK_CLOSE_PAREN_PLUS;
1123
7.36k
    case BT_CR:
1124
8.07k
    case BT_LF:
1125
240k
    case BT_S:
1126
241k
    case BT_GT:
1127
241k
    case BT_COMMA:
1128
244k
    case BT_VERBAR:
1129
255k
    case BT_RPAR:
1130
255k
      *nextTokPtr = ptr;
1131
255k
      return XML_TOK_CLOSE_PAREN;
1132
266k
    }
1133
10
    *nextTokPtr = ptr;
1134
10
    return XML_TOK_INVALID;
1135
14.0k
  case BT_VERBAR:
1136
14.0k
    *nextTokPtr = ptr + MINBPC(enc);
1137
14.0k
    return XML_TOK_OR;
1138
45.3k
  case BT_GT:
1139
45.3k
    *nextTokPtr = ptr + MINBPC(enc);
1140
45.3k
    return XML_TOK_DECL_CLOSE;
1141
242k
  case BT_NUM:
1142
242k
    return PREFIX(scanPoundName)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1143
0
#  define LEAD_CASE(n)                                                         \
1144
3.38k
  case BT_LEAD##n:                                                             \
1145
3.38k
    if (end - ptr < n)                                                         \
1146
79
      return XML_TOK_PARTIAL_CHAR;                                             \
1147
3.30k
    if (IS_INVALID_CHAR(enc, ptr, n)) {                                        \
1148
83
      *nextTokPtr = ptr;                                                       \
1149
83
      return XML_TOK_INVALID;                                                  \
1150
83
    }                                                                          \
1151
3.30k
    if (IS_NMSTRT_CHAR(enc, ptr, n)) {                                         \
1152
2.60k
      ptr += n;                                                                \
1153
2.60k
      tok = XML_TOK_NAME;                                                      \
1154
2.60k
      break;                                                                   \
1155
2.60k
    }                                                                          \
1156
3.22k
    if (IS_NAME_CHAR(enc, ptr, n)) {                                           \
1157
538
      ptr += n;                                                                \
1158
538
      tok = XML_TOK_NMTOKEN;                                                   \
1159
538
      break;                                                                   \
1160
538
    }                                                                          \
1161
617
    *nextTokPtr = ptr;                                                         \
1162
79
    return XML_TOK_INVALID;
1163
2.79k
    LEAD_CASE(2)
1164
7.43k
    LEAD_CASE(3)
1165
298
    LEAD_CASE(4)
1166
0
#  undef LEAD_CASE
1167
416k
  case BT_NMSTRT:
1168
704k
  case BT_HEX:
1169
704k
    tok = XML_TOK_NAME;
1170
704k
    ptr += MINBPC(enc);
1171
704k
    break;
1172
399
  case BT_DIGIT:
1173
7.90k
  case BT_NAME:
1174
8.62k
  case BT_MINUS:
1175
#  ifdef XML_NS
1176
  case BT_COLON:
1177
#  endif
1178
8.62k
    tok = XML_TOK_NMTOKEN;
1179
8.62k
    ptr += MINBPC(enc);
1180
8.62k
    break;
1181
187
  case BT_NONASCII:
1182
187
    if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {
1183
141
      ptr += MINBPC(enc);
1184
141
      tok = XML_TOK_NAME;
1185
141
      break;
1186
141
    }
1187
46
    if (IS_NAME_CHAR_MINBPC(enc, ptr)) {
1188
19
      ptr += MINBPC(enc);
1189
19
      tok = XML_TOK_NMTOKEN;
1190
19
      break;
1191
19
    }
1192
    /* fall through */
1193
78
  default:
1194
78
    *nextTokPtr = ptr;
1195
78
    return XML_TOK_INVALID;
1196
4.33M
  }
1197
9.89M
  while (HAS_CHAR(enc, ptr, end)) {
1198
9.89M
    switch (BYTE_TYPE(enc, ptr)) {
1199
26.9M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1200
15.6k
    case BT_GT:
1201
259k
    case BT_RPAR:
1202
260k
    case BT_COMMA:
1203
266k
    case BT_VERBAR:
1204
268k
    case BT_LSQB:
1205
268k
    case BT_PERCNT:
1206
377k
    case BT_S:
1207
636k
    case BT_CR:
1208
711k
    case BT_LF:
1209
711k
      *nextTokPtr = ptr;
1210
711k
      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
1.18k
    case BT_PLUS:
1232
1.18k
      if (tok == XML_TOK_NMTOKEN) {
1233
2
        *nextTokPtr = ptr;
1234
2
        return XML_TOK_INVALID;
1235
2
      }
1236
1.18k
      *nextTokPtr = ptr + MINBPC(enc);
1237
1.18k
      return XML_TOK_NAME_PLUS;
1238
3.39k
    case BT_AST:
1239
3.39k
      if (tok == XML_TOK_NMTOKEN) {
1240
1
        *nextTokPtr = ptr;
1241
1
        return XML_TOK_INVALID;
1242
1
      }
1243
3.38k
      *nextTokPtr = ptr + MINBPC(enc);
1244
3.38k
      return XML_TOK_NAME_ASTERISK;
1245
182
    case BT_QUEST:
1246
182
      if (tok == XML_TOK_NMTOKEN) {
1247
2
        *nextTokPtr = ptr;
1248
2
        return XML_TOK_INVALID;
1249
2
      }
1250
180
      *nextTokPtr = ptr + MINBPC(enc);
1251
180
      return XML_TOK_NAME_QUESTION;
1252
58
    default:
1253
58
      *nextTokPtr = ptr;
1254
58
      return XML_TOK_INVALID;
1255
9.89M
    }
1256
9.89M
  }
1257
710
  return -tok;
1258
716k
}
xmltok.c:normal_prologTok
Line
Count
Source
1018
4.34M
                  const char **nextTokPtr) {
1019
4.34M
  int tok;
1020
4.34M
  if (ptr >= end)
1021
6.75k
    return XML_TOK_NONE;
1022
4.33M
  if (MINBPC(enc) > 1) {
1023
0
    size_t n = end - ptr;
1024
0
    if (n & (MINBPC(enc) - 1)) {
1025
0
      n &= ~(MINBPC(enc) - 1);
1026
0
      if (n == 0)
1027
0
        return XML_TOK_PARTIAL;
1028
0
      end = ptr + n;
1029
0
    }
1030
0
  }
1031
4.33M
  switch (BYTE_TYPE(enc, ptr)) {
1032
6.48k
  case BT_QUOT:
1033
6.48k
    return PREFIX(scanLit)(BT_QUOT, enc, ptr + MINBPC(enc), end, nextTokPtr);
1034
87.2k
  case BT_APOS:
1035
87.2k
    return PREFIX(scanLit)(BT_APOS, enc, ptr + MINBPC(enc), end, nextTokPtr);
1036
71.5k
  case BT_LT: {
1037
71.5k
    ptr += MINBPC(enc);
1038
71.5k
    REQUIRE_CHAR(enc, ptr, end);
1039
71.5k
    switch (BYTE_TYPE(enc, ptr)) {
1040
52.3k
    case BT_EXCL:
1041
52.3k
      return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1042
13.8k
    case BT_QUEST:
1043
13.8k
      return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1044
4.04k
    case BT_NMSTRT:
1045
5.24k
    case BT_HEX:
1046
5.24k
    case BT_NONASCII:
1047
5.29k
    case BT_LEAD2:
1048
5.33k
    case BT_LEAD3:
1049
5.34k
    case BT_LEAD4:
1050
5.34k
      *nextTokPtr = ptr - MINBPC(enc);
1051
5.34k
      return XML_TOK_INSTANCE_START;
1052
71.5k
    }
1053
22
    *nextTokPtr = ptr;
1054
22
    return XML_TOK_INVALID;
1055
71.5k
  }
1056
390k
  case BT_CR:
1057
390k
    if (ptr + MINBPC(enc) == end) {
1058
430
      *nextTokPtr = end;
1059
      /* indicate that this might be part of a CR/LF pair */
1060
430
      return -XML_TOK_PROLOG_S;
1061
430
    }
1062
    /* fall through */
1063
918k
  case BT_S:
1064
1.07M
  case BT_LF:
1065
1.10M
    for (;;) {
1066
1.10M
      ptr += MINBPC(enc);
1067
1.10M
      if (! HAS_CHAR(enc, ptr, end))
1068
239
        break;
1069
1.10M
      switch (BYTE_TYPE(enc, ptr)) {
1070
14.7k
      case BT_S:
1071
27.3k
      case BT_LF:
1072
27.3k
        break;
1073
4.79k
      case BT_CR:
1074
        /* don't split CR/LF pair */
1075
4.79k
        if (ptr + MINBPC(enc) != end)
1076
4.58k
          break;
1077
        /* fall through */
1078
1.07M
      default:
1079
1.07M
        *nextTokPtr = ptr;
1080
1.07M
        return XML_TOK_PROLOG_S;
1081
1.10M
      }
1082
1.10M
    }
1083
239
    *nextTokPtr = ptr;
1084
239
    return XML_TOK_PROLOG_S;
1085
5.76k
  case BT_PERCNT:
1086
5.76k
    return PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1087
3.56k
  case BT_COMMA:
1088
3.56k
    *nextTokPtr = ptr + MINBPC(enc);
1089
3.56k
    return XML_TOK_COMMA;
1090
2.61k
  case BT_LSQB:
1091
2.61k
    *nextTokPtr = ptr + MINBPC(enc);
1092
2.61k
    return XML_TOK_OPEN_BRACKET;
1093
1.14k
  case BT_RSQB:
1094
1.14k
    ptr += MINBPC(enc);
1095
1.14k
    if (! HAS_CHAR(enc, ptr, end))
1096
15
      return -XML_TOK_CLOSE_BRACKET;
1097
1.13k
    if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) {
1098
34
      REQUIRE_CHARS(enc, ptr, end, 2);
1099
32
      if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_GT)) {
1100
7
        *nextTokPtr = ptr + 2 * MINBPC(enc);
1101
7
        return XML_TOK_COND_SECT_CLOSE;
1102
7
      }
1103
32
    }
1104
1.12k
    *nextTokPtr = ptr;
1105
1.12k
    return XML_TOK_CLOSE_BRACKET;
1106
1.79M
  case BT_LPAR:
1107
1.79M
    *nextTokPtr = ptr + MINBPC(enc);
1108
1.79M
    return XML_TOK_OPEN_PAREN;
1109
266k
  case BT_RPAR:
1110
266k
    ptr += MINBPC(enc);
1111
266k
    if (! HAS_CHAR(enc, ptr, end))
1112
99
      return -XML_TOK_CLOSE_PAREN;
1113
266k
    switch (BYTE_TYPE(enc, ptr)) {
1114
4.27k
    case BT_AST:
1115
4.27k
      *nextTokPtr = ptr + MINBPC(enc);
1116
4.27k
      return XML_TOK_CLOSE_PAREN_ASTERISK;
1117
3.26k
    case BT_QUEST:
1118
3.26k
      *nextTokPtr = ptr + MINBPC(enc);
1119
3.26k
      return XML_TOK_CLOSE_PAREN_QUESTION;
1120
3.18k
    case BT_PLUS:
1121
3.18k
      *nextTokPtr = ptr + MINBPC(enc);
1122
3.18k
      return XML_TOK_CLOSE_PAREN_PLUS;
1123
7.36k
    case BT_CR:
1124
8.07k
    case BT_LF:
1125
240k
    case BT_S:
1126
241k
    case BT_GT:
1127
241k
    case BT_COMMA:
1128
244k
    case BT_VERBAR:
1129
255k
    case BT_RPAR:
1130
255k
      *nextTokPtr = ptr;
1131
255k
      return XML_TOK_CLOSE_PAREN;
1132
266k
    }
1133
10
    *nextTokPtr = ptr;
1134
10
    return XML_TOK_INVALID;
1135
14.0k
  case BT_VERBAR:
1136
14.0k
    *nextTokPtr = ptr + MINBPC(enc);
1137
14.0k
    return XML_TOK_OR;
1138
45.3k
  case BT_GT:
1139
45.3k
    *nextTokPtr = ptr + MINBPC(enc);
1140
45.3k
    return XML_TOK_DECL_CLOSE;
1141
242k
  case BT_NUM:
1142
242k
    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.79k
    LEAD_CASE(2)
1164
7.43k
    LEAD_CASE(3)
1165
162
    LEAD_CASE(4)
1166
0
#  undef LEAD_CASE
1167
416k
  case BT_NMSTRT:
1168
704k
  case BT_HEX:
1169
704k
    tok = XML_TOK_NAME;
1170
704k
    ptr += MINBPC(enc);
1171
704k
    break;
1172
399
  case BT_DIGIT:
1173
7.90k
  case BT_NAME:
1174
8.62k
  case BT_MINUS:
1175
#  ifdef XML_NS
1176
  case BT_COLON:
1177
#  endif
1178
8.62k
    tok = XML_TOK_NMTOKEN;
1179
8.62k
    ptr += MINBPC(enc);
1180
8.62k
    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
39
  default:
1194
39
    *nextTokPtr = ptr;
1195
39
    return XML_TOK_INVALID;
1196
4.33M
  }
1197
9.87M
  while (HAS_CHAR(enc, ptr, end)) {
1198
9.87M
    switch (BYTE_TYPE(enc, ptr)) {
1199
26.8M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1200
15.6k
    case BT_GT:
1201
259k
    case BT_RPAR:
1202
260k
    case BT_COMMA:
1203
266k
    case BT_VERBAR:
1204
268k
    case BT_LSQB:
1205
268k
    case BT_PERCNT:
1206
377k
    case BT_S:
1207
636k
    case BT_CR:
1208
711k
    case BT_LF:
1209
711k
      *nextTokPtr = ptr;
1210
711k
      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
1.18k
    case BT_PLUS:
1232
1.18k
      if (tok == XML_TOK_NMTOKEN) {
1233
2
        *nextTokPtr = ptr;
1234
2
        return XML_TOK_INVALID;
1235
2
      }
1236
1.18k
      *nextTokPtr = ptr + MINBPC(enc);
1237
1.18k
      return XML_TOK_NAME_PLUS;
1238
3.39k
    case BT_AST:
1239
3.39k
      if (tok == XML_TOK_NMTOKEN) {
1240
1
        *nextTokPtr = ptr;
1241
1
        return XML_TOK_INVALID;
1242
1
      }
1243
3.38k
      *nextTokPtr = ptr + MINBPC(enc);
1244
3.38k
      return XML_TOK_NAME_ASTERISK;
1245
182
    case BT_QUEST:
1246
182
      if (tok == XML_TOK_NMTOKEN) {
1247
2
        *nextTokPtr = ptr;
1248
2
        return XML_TOK_INVALID;
1249
2
      }
1250
180
      *nextTokPtr = ptr + MINBPC(enc);
1251
180
      return XML_TOK_NAME_QUESTION;
1252
38
    default:
1253
38
      *nextTokPtr = ptr;
1254
38
      return XML_TOK_INVALID;
1255
9.87M
    }
1256
9.87M
  }
1257
680
  return -tok;
1258
716k
}
xmltok.c:little2_prologTok
Line
Count
Source
1018
124
                  const char **nextTokPtr) {
1019
124
  int tok;
1020
124
  if (ptr >= end)
1021
2
    return XML_TOK_NONE;
1022
122
  if (MINBPC(enc) > 1) {
1023
122
    size_t n = end - ptr;
1024
122
    if (n & (MINBPC(enc) - 1)) {
1025
26
      n &= ~(MINBPC(enc) - 1);
1026
26
      if (n == 0)
1027
2
        return XML_TOK_PARTIAL;
1028
24
      end = ptr + n;
1029
24
    }
1030
122
  }
1031
120
  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
68
    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
90
  case BT_NONASCII:
1182
90
    if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {
1183
63
      ptr += MINBPC(enc);
1184
63
      tok = XML_TOK_NAME;
1185
63
      break;
1186
63
    }
1187
27
    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
22
  default:
1194
22
    *nextTokPtr = ptr;
1195
22
    return XML_TOK_INVALID;
1196
120
  }
1197
822
  while (HAS_CHAR(enc, ptr, end)) {
1198
822
    switch (BYTE_TYPE(enc, ptr)) {
1199
3.87k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1200
0
    case BT_GT:
1201
0
    case BT_RPAR:
1202
0
    case BT_COMMA:
1203
0
    case BT_VERBAR:
1204
0
    case BT_LSQB:
1205
0
    case BT_PERCNT:
1206
0
    case BT_S:
1207
0
    case BT_CR:
1208
0
    case BT_LF:
1209
0
      *nextTokPtr = ptr;
1210
0
      return tok;
1211
#  ifdef XML_NS
1212
    case BT_COLON:
1213
      ptr += MINBPC(enc);
1214
      switch (tok) {
1215
      case XML_TOK_NAME:
1216
        REQUIRE_CHAR(enc, ptr, end);
1217
        tok = XML_TOK_PREFIXED_NAME;
1218
        switch (BYTE_TYPE(enc, ptr)) {
1219
          CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1220
        default:
1221
          tok = XML_TOK_NMTOKEN;
1222
          break;
1223
        }
1224
        break;
1225
      case XML_TOK_PREFIXED_NAME:
1226
        tok = XML_TOK_NMTOKEN;
1227
        break;
1228
      }
1229
      break;
1230
#  endif
1231
0
    case BT_PLUS:
1232
0
      if (tok == XML_TOK_NMTOKEN) {
1233
0
        *nextTokPtr = ptr;
1234
0
        return XML_TOK_INVALID;
1235
0
      }
1236
0
      *nextTokPtr = ptr + MINBPC(enc);
1237
0
      return XML_TOK_NAME_PLUS;
1238
0
    case BT_AST:
1239
0
      if (tok == XML_TOK_NMTOKEN) {
1240
0
        *nextTokPtr = ptr;
1241
0
        return XML_TOK_INVALID;
1242
0
      }
1243
0
      *nextTokPtr = ptr + MINBPC(enc);
1244
0
      return XML_TOK_NAME_ASTERISK;
1245
0
    case BT_QUEST:
1246
0
      if (tok == XML_TOK_NMTOKEN) {
1247
0
        *nextTokPtr = ptr;
1248
0
        return XML_TOK_INVALID;
1249
0
      }
1250
0
      *nextTokPtr = ptr + MINBPC(enc);
1251
0
      return XML_TOK_NAME_QUESTION;
1252
11
    default:
1253
11
      *nextTokPtr = ptr;
1254
11
      return XML_TOK_INVALID;
1255
822
    }
1256
822
  }
1257
14
  return -tok;
1258
75
}
xmltok.c:big2_prologTok
Line
Count
Source
1018
129
                  const char **nextTokPtr) {
1019
129
  int tok;
1020
129
  if (ptr >= end)
1021
2
    return XML_TOK_NONE;
1022
127
  if (MINBPC(enc) > 1) {
1023
127
    size_t n = end - ptr;
1024
127
    if (n & (MINBPC(enc) - 1)) {
1025
18
      n &= ~(MINBPC(enc) - 1);
1026
18
      if (n == 0)
1027
2
        return XML_TOK_PARTIAL;
1028
16
      end = ptr + n;
1029
16
    }
1030
127
  }
1031
125
  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
68
    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
97
  case BT_NONASCII:
1182
97
    if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {
1183
78
      ptr += MINBPC(enc);
1184
78
      tok = XML_TOK_NAME;
1185
78
      break;
1186
78
    }
1187
19
    if (IS_NAME_CHAR_MINBPC(enc, ptr)) {
1188
7
      ptr += MINBPC(enc);
1189
7
      tok = XML_TOK_NMTOKEN;
1190
7
      break;
1191
7
    }
1192
    /* fall through */
1193
17
  default:
1194
17
    *nextTokPtr = ptr;
1195
17
    return XML_TOK_INVALID;
1196
125
  }
1197
19.9k
  while (HAS_CHAR(enc, ptr, end)) {
1198
19.9k
    switch (BYTE_TYPE(enc, ptr)) {
1199
99.6k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1200
0
    case BT_GT:
1201
0
    case BT_RPAR:
1202
0
    case BT_COMMA:
1203
0
    case BT_VERBAR:
1204
0
    case BT_LSQB:
1205
0
    case BT_PERCNT:
1206
0
    case BT_S:
1207
0
    case BT_CR:
1208
0
    case BT_LF:
1209
0
      *nextTokPtr = ptr;
1210
0
      return tok;
1211
#  ifdef XML_NS
1212
    case BT_COLON:
1213
      ptr += MINBPC(enc);
1214
      switch (tok) {
1215
      case XML_TOK_NAME:
1216
        REQUIRE_CHAR(enc, ptr, end);
1217
        tok = XML_TOK_PREFIXED_NAME;
1218
        switch (BYTE_TYPE(enc, ptr)) {
1219
          CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1220
        default:
1221
          tok = XML_TOK_NMTOKEN;
1222
          break;
1223
        }
1224
        break;
1225
      case XML_TOK_PREFIXED_NAME:
1226
        tok = XML_TOK_NMTOKEN;
1227
        break;
1228
      }
1229
      break;
1230
#  endif
1231
0
    case BT_PLUS:
1232
0
      if (tok == XML_TOK_NMTOKEN) {
1233
0
        *nextTokPtr = ptr;
1234
0
        return XML_TOK_INVALID;
1235
0
      }
1236
0
      *nextTokPtr = ptr + MINBPC(enc);
1237
0
      return XML_TOK_NAME_PLUS;
1238
0
    case BT_AST:
1239
0
      if (tok == XML_TOK_NMTOKEN) {
1240
0
        *nextTokPtr = ptr;
1241
0
        return XML_TOK_INVALID;
1242
0
      }
1243
0
      *nextTokPtr = ptr + MINBPC(enc);
1244
0
      return XML_TOK_NAME_ASTERISK;
1245
0
    case BT_QUEST:
1246
0
      if (tok == XML_TOK_NMTOKEN) {
1247
0
        *nextTokPtr = ptr;
1248
0
        return XML_TOK_INVALID;
1249
0
      }
1250
0
      *nextTokPtr = ptr + MINBPC(enc);
1251
0
      return XML_TOK_NAME_QUESTION;
1252
9
    default:
1253
9
      *nextTokPtr = ptr;
1254
9
      return XML_TOK_INVALID;
1255
19.9k
    }
1256
19.9k
  }
1257
16
  return -tok;
1258
85
}
1259
1260
static int PTRCALL
1261
PREFIX(attributeValueTok)(const ENCODING *enc, const char *ptr, const char *end,
1262
2.80M
                          const char **nextTokPtr) {
1263
2.80M
  const char *start;
1264
2.80M
  if (ptr >= end)
1265
122k
    return XML_TOK_NONE;
1266
2.67M
  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.67M
  start = ptr;
1275
20.0M
  while (HAS_CHAR(enc, ptr, end)) {
1276
20.0M
    switch (BYTE_TYPE(enc, ptr)) {
1277
0
#  define LEAD_CASE(n)                                                         \
1278
176k
  case BT_LEAD##n:                                                             \
1279
176k
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1280
176k
    break;
1281
50.3k
      LEAD_CASE(2)
1282
43.4k
      LEAD_CASE(3)
1283
82.4k
      LEAD_CASE(4)
1284
0
#  undef LEAD_CASE
1285
135k
    case BT_AMP:
1286
135k
      if (ptr == start)
1287
100k
        return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1288
35.0k
      *nextTokPtr = ptr;
1289
35.0k
      return XML_TOK_DATA_CHARS;
1290
1
    case BT_LT:
1291
      /* this is for inside entity references */
1292
1
      *nextTokPtr = ptr;
1293
1
      return XML_TOK_INVALID;
1294
846k
    case BT_LF:
1295
846k
      if (ptr == start) {
1296
734k
        *nextTokPtr = ptr + MINBPC(enc);
1297
734k
        return XML_TOK_DATA_NEWLINE;
1298
734k
      }
1299
112k
      *nextTokPtr = ptr;
1300
112k
      return XML_TOK_DATA_CHARS;
1301
1.16M
    case BT_CR:
1302
1.16M
      if (ptr == start) {
1303
953k
        ptr += MINBPC(enc);
1304
953k
        if (! HAS_CHAR(enc, ptr, end))
1305
1.92k
          return XML_TOK_TRAILING_CR;
1306
951k
        if (BYTE_TYPE(enc, ptr) == BT_LF)
1307
375k
          ptr += MINBPC(enc);
1308
951k
        *nextTokPtr = ptr;
1309
951k
        return XML_TOK_DATA_NEWLINE;
1310
953k
      }
1311
210k
      *nextTokPtr = ptr;
1312
210k
      return XML_TOK_DATA_CHARS;
1313
459k
    case BT_S:
1314
459k
      if (ptr == start) {
1315
267k
        *nextTokPtr = ptr + MINBPC(enc);
1316
267k
        return XML_TOK_ATTRIBUTE_VALUE_S;
1317
267k
      }
1318
192k
      *nextTokPtr = ptr;
1319
192k
      return XML_TOK_DATA_CHARS;
1320
17.2M
    default:
1321
17.2M
      ptr += MINBPC(enc);
1322
17.2M
      break;
1323
20.0M
    }
1324
20.0M
  }
1325
73.3k
  *nextTokPtr = ptr;
1326
73.3k
  return XML_TOK_DATA_CHARS;
1327
2.67M
}
xmltok.c:normal_attributeValueTok
Line
Count
Source
1262
2.80M
                          const char **nextTokPtr) {
1263
2.80M
  const char *start;
1264
2.80M
  if (ptr >= end)
1265
122k
    return XML_TOK_NONE;
1266
2.67M
  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.67M
  start = ptr;
1275
20.0M
  while (HAS_CHAR(enc, ptr, end)) {
1276
20.0M
    switch (BYTE_TYPE(enc, ptr)) {
1277
0
#  define LEAD_CASE(n)                                                         \
1278
0
  case BT_LEAD##n:                                                             \
1279
0
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1280
0
    break;
1281
50.3k
      LEAD_CASE(2)
1282
43.4k
      LEAD_CASE(3)
1283
82.4k
      LEAD_CASE(4)
1284
0
#  undef LEAD_CASE
1285
135k
    case BT_AMP:
1286
135k
      if (ptr == start)
1287
100k
        return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1288
35.0k
      *nextTokPtr = ptr;
1289
35.0k
      return XML_TOK_DATA_CHARS;
1290
1
    case BT_LT:
1291
      /* this is for inside entity references */
1292
1
      *nextTokPtr = ptr;
1293
1
      return XML_TOK_INVALID;
1294
846k
    case BT_LF:
1295
846k
      if (ptr == start) {
1296
734k
        *nextTokPtr = ptr + MINBPC(enc);
1297
734k
        return XML_TOK_DATA_NEWLINE;
1298
734k
      }
1299
112k
      *nextTokPtr = ptr;
1300
112k
      return XML_TOK_DATA_CHARS;
1301
1.16M
    case BT_CR:
1302
1.16M
      if (ptr == start) {
1303
953k
        ptr += MINBPC(enc);
1304
953k
        if (! HAS_CHAR(enc, ptr, end))
1305
1.92k
          return XML_TOK_TRAILING_CR;
1306
951k
        if (BYTE_TYPE(enc, ptr) == BT_LF)
1307
375k
          ptr += MINBPC(enc);
1308
951k
        *nextTokPtr = ptr;
1309
951k
        return XML_TOK_DATA_NEWLINE;
1310
953k
      }
1311
210k
      *nextTokPtr = ptr;
1312
210k
      return XML_TOK_DATA_CHARS;
1313
459k
    case BT_S:
1314
459k
      if (ptr == start) {
1315
267k
        *nextTokPtr = ptr + MINBPC(enc);
1316
267k
        return XML_TOK_ATTRIBUTE_VALUE_S;
1317
267k
      }
1318
192k
      *nextTokPtr = ptr;
1319
192k
      return XML_TOK_DATA_CHARS;
1320
17.2M
    default:
1321
17.2M
      ptr += MINBPC(enc);
1322
17.2M
      break;
1323
20.0M
    }
1324
20.0M
  }
1325
73.3k
  *nextTokPtr = ptr;
1326
73.3k
  return XML_TOK_DATA_CHARS;
1327
2.67M
}
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.65k
                   const char **badPtr) {
1451
2.65k
  ptr += MINBPC(enc);
1452
2.65k
  end -= MINBPC(enc);
1453
851k
  for (; HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
1454
851k
    switch (BYTE_TYPE(enc, ptr)) {
1455
354k
    case BT_DIGIT:
1456
546k
    case BT_HEX:
1457
547k
    case BT_MINUS:
1458
547k
    case BT_APOS:
1459
547k
    case BT_LPAR:
1460
610k
    case BT_RPAR:
1461
613k
    case BT_PLUS:
1462
614k
    case BT_COMMA:
1463
700k
    case BT_SOL:
1464
700k
    case BT_EQUALS:
1465
706k
    case BT_QUEST:
1466
710k
    case BT_CR:
1467
712k
    case BT_LF:
1468
713k
    case BT_SEMI:
1469
714k
    case BT_EXCL:
1470
715k
    case BT_AST:
1471
719k
    case BT_PERCNT:
1472
729k
    case BT_NUM:
1473
#  ifdef XML_NS
1474
    case BT_COLON:
1475
#  endif
1476
729k
      break;
1477
2.35k
    case BT_S:
1478
2.35k
      if (CHAR_MATCHES(enc, ptr, ASCII_TAB)) {
1479
2
        *badPtr = ptr;
1480
2
        return 0;
1481
2
      }
1482
2.35k
      break;
1483
4.82k
    case BT_NAME:
1484
117k
    case BT_NMSTRT:
1485
117k
      if (! (BYTE_TO_ASCII(enc, ptr) & ~0x7f))
1486
117k
        break;
1487
      /* fall through */
1488
1.84k
    default:
1489
1.84k
      switch (BYTE_TO_ASCII(enc, ptr)) {
1490
1.58k
      case 0x24: /* $ */
1491
1.82k
      case 0x40: /* @ */
1492
1.82k
        break;
1493
17
      default:
1494
17
        *badPtr = ptr;
1495
17
        return 0;
1496
1.84k
      }
1497
1.82k
      break;
1498
851k
    }
1499
851k
  }
1500
2.63k
  return 1;
1501
2.65k
}
xmltok.c:normal_isPublicId
Line
Count
Source
1450
2.65k
                   const char **badPtr) {
1451
2.65k
  ptr += MINBPC(enc);
1452
2.65k
  end -= MINBPC(enc);
1453
851k
  for (; HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
1454
851k
    switch (BYTE_TYPE(enc, ptr)) {
1455
354k
    case BT_DIGIT:
1456
546k
    case BT_HEX:
1457
547k
    case BT_MINUS:
1458
547k
    case BT_APOS:
1459
547k
    case BT_LPAR:
1460
610k
    case BT_RPAR:
1461
613k
    case BT_PLUS:
1462
614k
    case BT_COMMA:
1463
700k
    case BT_SOL:
1464
700k
    case BT_EQUALS:
1465
706k
    case BT_QUEST:
1466
710k
    case BT_CR:
1467
712k
    case BT_LF:
1468
713k
    case BT_SEMI:
1469
714k
    case BT_EXCL:
1470
715k
    case BT_AST:
1471
719k
    case BT_PERCNT:
1472
729k
    case BT_NUM:
1473
#  ifdef XML_NS
1474
    case BT_COLON:
1475
#  endif
1476
729k
      break;
1477
2.35k
    case BT_S:
1478
2.35k
      if (CHAR_MATCHES(enc, ptr, ASCII_TAB)) {
1479
2
        *badPtr = ptr;
1480
2
        return 0;
1481
2
      }
1482
2.35k
      break;
1483
4.82k
    case BT_NAME:
1484
117k
    case BT_NMSTRT:
1485
117k
      if (! (BYTE_TO_ASCII(enc, ptr) & ~0x7f))
1486
117k
        break;
1487
      /* fall through */
1488
1.84k
    default:
1489
1.84k
      switch (BYTE_TO_ASCII(enc, ptr)) {
1490
1.58k
      case 0x24: /* $ */
1491
1.82k
      case 0x40: /* @ */
1492
1.82k
        break;
1493
17
      default:
1494
17
        *badPtr = ptr;
1495
17
        return 0;
1496
1.84k
      }
1497
1.82k
      break;
1498
851k
    }
1499
851k
  }
1500
2.63k
  return 1;
1501
2.65k
}
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
893k
                ATTRIBUTE *atts) {
1511
893k
  enum { other, inName, inValue } state = inName;
1512
893k
  int nAtts = 0;
1513
893k
  int open = 0; /* defined when state == inValue;
1514
                   initialization just to shut up compilers */
1515
1516
48.4M
  for (ptr += MINBPC(enc);; ptr += MINBPC(enc)) {
1517
48.4M
    switch (BYTE_TYPE(enc, ptr)) {
1518
0
#  define START_NAME                                                           \
1519
27.4M
    if (state == other) {                                                      \
1520
3.75M
      if (nAtts < attsMax) {                                                   \
1521
1.90M
        atts[nAtts].name = ptr;                                                \
1522
1.90M
        atts[nAtts].normalized = 1;                                            \
1523
1.90M
      }                                                                        \
1524
3.75M
      state = inName;                                                          \
1525
3.75M
    }
1526
0
#  define LEAD_CASE(n)                                                         \
1527
242k
  case BT_LEAD##n: /* NOTE: The encoding has already been validated. */        \
1528
242k
    START_NAME ptr += (n - MINBPC(enc));                                       \
1529
242k
    break;
1530
105k
      LEAD_CASE(2)
1531
83.1k
      LEAD_CASE(3)
1532
53.4k
      LEAD_CASE(4)
1533
0
#  undef LEAD_CASE
1534
0
    case BT_NONASCII:
1535
24.4M
    case BT_NMSTRT:
1536
27.1M
    case BT_HEX:
1537
27.1M
      START_NAME
1538
27.1M
      break;
1539
0
#  undef START_NAME
1540
510k
    case BT_QUOT:
1541
510k
      if (state != inValue) {
1542
196k
        if (nAtts < attsMax)
1543
123k
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1544
196k
        state = inValue;
1545
196k
        open = BT_QUOT;
1546
314k
      } else if (open == BT_QUOT) {
1547
196k
        state = other;
1548
196k
        if (nAtts < attsMax)
1549
123k
          atts[nAtts].valueEnd = ptr;
1550
196k
        nAtts++;
1551
196k
      }
1552
510k
      break;
1553
7.13M
    case BT_APOS:
1554
7.13M
      if (state != inValue) {
1555
3.55M
        if (nAtts < attsMax)
1556
1.78M
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1557
3.55M
        state = inValue;
1558
3.55M
        open = BT_APOS;
1559
3.57M
      } else if (open == BT_APOS) {
1560
3.55M
        state = other;
1561
3.55M
        if (nAtts < attsMax)
1562
1.78M
          atts[nAtts].valueEnd = ptr;
1563
3.55M
        nAtts++;
1564
3.55M
      }
1565
7.13M
      break;
1566
49.7k
    case BT_AMP:
1567
49.7k
      if (nAtts < attsMax)
1568
49.0k
        atts[nAtts].normalized = 0;
1569
49.7k
      break;
1570
2.56M
    case BT_S:
1571
2.56M
      if (state == inName)
1572
34.3k
        state = other;
1573
2.53M
      else if (state == inValue && nAtts < attsMax && atts[nAtts].normalized
1574
87.0k
               && (ptr == atts[nAtts].valuePtr
1575
13.0k
                   || BYTE_TO_ASCII(enc, ptr) != ASCII_SPACE
1576
6.54k
                   || BYTE_TO_ASCII(enc, ptr + MINBPC(enc)) == ASCII_SPACE
1577
6.19k
                   || BYTE_TYPE(enc, ptr + MINBPC(enc)) == open))
1578
81.3k
        atts[nAtts].normalized = 0;
1579
2.56M
      break;
1580
2.67M
    case BT_CR:
1581
3.81M
    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.81M
      if (state == inName)
1585
24.6k
        state = other;
1586
3.79M
      else if (state == inValue && nAtts < attsMax)
1587
1.79M
        atts[nAtts].normalized = 0;
1588
3.81M
      break;
1589
850k
    case BT_GT:
1590
916k
    case BT_SOL:
1591
916k
      if (state != inValue)
1592
893k
        return nAtts;
1593
23.5k
      break;
1594
5.99M
    default:
1595
5.99M
      break;
1596
48.4M
    }
1597
48.4M
  }
1598
  /* not reached */
1599
893k
}
xmltok.c:normal_getAtts
Line
Count
Source
1510
893k
                ATTRIBUTE *atts) {
1511
893k
  enum { other, inName, inValue } state = inName;
1512
893k
  int nAtts = 0;
1513
893k
  int open = 0; /* defined when state == inValue;
1514
                   initialization just to shut up compilers */
1515
1516
48.4M
  for (ptr += MINBPC(enc);; ptr += MINBPC(enc)) {
1517
48.4M
    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
83.1k
      LEAD_CASE(3)
1532
53.4k
      LEAD_CASE(4)
1533
0
#  undef LEAD_CASE
1534
0
    case BT_NONASCII:
1535
24.4M
    case BT_NMSTRT:
1536
27.1M
    case BT_HEX:
1537
27.1M
      START_NAME
1538
27.1M
      break;
1539
0
#  undef START_NAME
1540
510k
    case BT_QUOT:
1541
510k
      if (state != inValue) {
1542
196k
        if (nAtts < attsMax)
1543
123k
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1544
196k
        state = inValue;
1545
196k
        open = BT_QUOT;
1546
314k
      } else if (open == BT_QUOT) {
1547
196k
        state = other;
1548
196k
        if (nAtts < attsMax)
1549
123k
          atts[nAtts].valueEnd = ptr;
1550
196k
        nAtts++;
1551
196k
      }
1552
510k
      break;
1553
7.13M
    case BT_APOS:
1554
7.13M
      if (state != inValue) {
1555
3.55M
        if (nAtts < attsMax)
1556
1.78M
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1557
3.55M
        state = inValue;
1558
3.55M
        open = BT_APOS;
1559
3.57M
      } else if (open == BT_APOS) {
1560
3.55M
        state = other;
1561
3.55M
        if (nAtts < attsMax)
1562
1.78M
          atts[nAtts].valueEnd = ptr;
1563
3.55M
        nAtts++;
1564
3.55M
      }
1565
7.13M
      break;
1566
49.7k
    case BT_AMP:
1567
49.7k
      if (nAtts < attsMax)
1568
49.0k
        atts[nAtts].normalized = 0;
1569
49.7k
      break;
1570
2.56M
    case BT_S:
1571
2.56M
      if (state == inName)
1572
34.3k
        state = other;
1573
2.53M
      else if (state == inValue && nAtts < attsMax && atts[nAtts].normalized
1574
87.0k
               && (ptr == atts[nAtts].valuePtr
1575
13.0k
                   || BYTE_TO_ASCII(enc, ptr) != ASCII_SPACE
1576
6.54k
                   || BYTE_TO_ASCII(enc, ptr + MINBPC(enc)) == ASCII_SPACE
1577
6.19k
                   || BYTE_TYPE(enc, ptr + MINBPC(enc)) == open))
1578
81.3k
        atts[nAtts].normalized = 0;
1579
2.56M
      break;
1580
2.67M
    case BT_CR:
1581
3.81M
    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.81M
      if (state == inName)
1585
24.6k
        state = other;
1586
3.79M
      else if (state == inValue && nAtts < attsMax)
1587
1.79M
        atts[nAtts].normalized = 0;
1588
3.81M
      break;
1589
850k
    case BT_GT:
1590
916k
    case BT_SOL:
1591
916k
      if (state != inValue)
1592
893k
        return nAtts;
1593
23.5k
      break;
1594
5.99M
    default:
1595
5.99M
      break;
1596
48.4M
    }
1597
48.4M
  }
1598
  /* not reached */
1599
893k
}
Unexecuted instantiation: xmltok.c:little2_getAtts
Unexecuted instantiation: xmltok.c:big2_getAtts
1600
1601
static int PTRFASTCALL
1602
54.3k
PREFIX(charRefNumber)(const ENCODING *enc, const char *ptr) {
1603
54.3k
  int result = 0;
1604
  /* skip &# */
1605
54.3k
  UNUSED_P(enc);
1606
54.3k
  ptr += 2 * MINBPC(enc);
1607
54.3k
  if (CHAR_MATCHES(enc, ptr, ASCII_x)) {
1608
207k
    for (ptr += MINBPC(enc); ! CHAR_MATCHES(enc, ptr, ASCII_SEMI);
1609
161k
         ptr += MINBPC(enc)) {
1610
161k
      int c = BYTE_TO_ASCII(enc, ptr);
1611
161k
      switch (c) {
1612
5.60k
      case ASCII_0:
1613
16.6k
      case ASCII_1:
1614
32.8k
      case ASCII_2:
1615
36.5k
      case ASCII_3:
1616
54.4k
      case ASCII_4:
1617
68.4k
      case ASCII_5:
1618
70.4k
      case ASCII_6:
1619
80.6k
      case ASCII_7:
1620
92.0k
      case ASCII_8:
1621
97.4k
      case ASCII_9:
1622
97.4k
        result <<= 4;
1623
97.4k
        result |= (c - ASCII_0);
1624
97.4k
        break;
1625
14.5k
      case ASCII_A:
1626
16.4k
      case ASCII_B:
1627
16.8k
      case ASCII_C:
1628
18.8k
      case ASCII_D:
1629
19.3k
      case ASCII_E:
1630
30.8k
      case ASCII_F:
1631
30.8k
        result <<= 4;
1632
30.8k
        result += 10 + (c - ASCII_A);
1633
30.8k
        break;
1634
600
      case ASCII_a:
1635
7.00k
      case ASCII_b:
1636
10.4k
      case ASCII_c:
1637
31.3k
      case ASCII_d:
1638
31.7k
      case ASCII_e:
1639
33.4k
      case ASCII_f:
1640
33.4k
        result <<= 4;
1641
33.4k
        result += 10 + (c - ASCII_a);
1642
33.4k
        break;
1643
161k
      }
1644
161k
      if (result >= 0x110000)
1645
11
        return -1;
1646
161k
    }
1647
45.4k
  } else {
1648
45.9k
    for (; ! CHAR_MATCHES(enc, ptr, ASCII_SEMI); ptr += MINBPC(enc)) {
1649
37.0k
      int c = BYTE_TO_ASCII(enc, ptr);
1650
37.0k
      result *= 10;
1651
37.0k
      result += (c - ASCII_0);
1652
37.0k
      if (result >= 0x110000)
1653
3
        return -1;
1654
37.0k
    }
1655
8.88k
  }
1656
54.3k
  return checkCharRefNumber(result);
1657
54.3k
}
xmltok.c:normal_charRefNumber
Line
Count
Source
1602
54.3k
PREFIX(charRefNumber)(const ENCODING *enc, const char *ptr) {
1603
54.3k
  int result = 0;
1604
  /* skip &# */
1605
54.3k
  UNUSED_P(enc);
1606
54.3k
  ptr += 2 * MINBPC(enc);
1607
54.3k
  if (CHAR_MATCHES(enc, ptr, ASCII_x)) {
1608
207k
    for (ptr += MINBPC(enc); ! CHAR_MATCHES(enc, ptr, ASCII_SEMI);
1609
161k
         ptr += MINBPC(enc)) {
1610
161k
      int c = BYTE_TO_ASCII(enc, ptr);
1611
161k
      switch (c) {
1612
5.60k
      case ASCII_0:
1613
16.6k
      case ASCII_1:
1614
32.8k
      case ASCII_2:
1615
36.5k
      case ASCII_3:
1616
54.4k
      case ASCII_4:
1617
68.4k
      case ASCII_5:
1618
70.4k
      case ASCII_6:
1619
80.6k
      case ASCII_7:
1620
92.0k
      case ASCII_8:
1621
97.4k
      case ASCII_9:
1622
97.4k
        result <<= 4;
1623
97.4k
        result |= (c - ASCII_0);
1624
97.4k
        break;
1625
14.5k
      case ASCII_A:
1626
16.4k
      case ASCII_B:
1627
16.8k
      case ASCII_C:
1628
18.8k
      case ASCII_D:
1629
19.3k
      case ASCII_E:
1630
30.8k
      case ASCII_F:
1631
30.8k
        result <<= 4;
1632
30.8k
        result += 10 + (c - ASCII_A);
1633
30.8k
        break;
1634
600
      case ASCII_a:
1635
7.00k
      case ASCII_b:
1636
10.4k
      case ASCII_c:
1637
31.3k
      case ASCII_d:
1638
31.7k
      case ASCII_e:
1639
33.4k
      case ASCII_f:
1640
33.4k
        result <<= 4;
1641
33.4k
        result += 10 + (c - ASCII_a);
1642
33.4k
        break;
1643
161k
      }
1644
161k
      if (result >= 0x110000)
1645
11
        return -1;
1646
161k
    }
1647
45.4k
  } else {
1648
45.9k
    for (; ! CHAR_MATCHES(enc, ptr, ASCII_SEMI); ptr += MINBPC(enc)) {
1649
37.0k
      int c = BYTE_TO_ASCII(enc, ptr);
1650
37.0k
      result *= 10;
1651
37.0k
      result += (c - ASCII_0);
1652
37.0k
      if (result >= 0x110000)
1653
3
        return -1;
1654
37.0k
    }
1655
8.88k
  }
1656
54.3k
  return checkCharRefNumber(result);
1657
54.3k
}
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
81.8k
                             const char *end) {
1662
81.8k
  UNUSED_P(enc);
1663
81.8k
  switch ((end - ptr) / MINBPC(enc)) {
1664
6.28k
  case 2:
1665
6.28k
    if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_t)) {
1666
1.23k
      switch (BYTE_TO_ASCII(enc, ptr)) {
1667
920
      case ASCII_l:
1668
920
        return ASCII_LT;
1669
297
      case ASCII_g:
1670
297
        return ASCII_GT;
1671
1.23k
      }
1672
1.23k
    }
1673
5.07k
    break;
1674
23.5k
  case 3:
1675
23.5k
    if (CHAR_MATCHES(enc, ptr, ASCII_a)) {
1676
22.7k
      ptr += MINBPC(enc);
1677
22.7k
      if (CHAR_MATCHES(enc, ptr, ASCII_m)) {
1678
21.6k
        ptr += MINBPC(enc);
1679
21.6k
        if (CHAR_MATCHES(enc, ptr, ASCII_p))
1680
21.0k
          return ASCII_AMP;
1681
21.6k
      }
1682
22.7k
    }
1683
2.48k
    break;
1684
6.65k
  case 4:
1685
6.65k
    switch (BYTE_TO_ASCII(enc, ptr)) {
1686
2.78k
    case ASCII_q:
1687
2.78k
      ptr += MINBPC(enc);
1688
2.78k
      if (CHAR_MATCHES(enc, ptr, ASCII_u)) {
1689
2.25k
        ptr += MINBPC(enc);
1690
2.25k
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1691
1.74k
          ptr += MINBPC(enc);
1692
1.74k
          if (CHAR_MATCHES(enc, ptr, ASCII_t))
1693
1.50k
            return ASCII_QUOT;
1694
1.74k
        }
1695
2.25k
      }
1696
1.28k
      break;
1697
3.22k
    case ASCII_a:
1698
3.22k
      ptr += MINBPC(enc);
1699
3.22k
      if (CHAR_MATCHES(enc, ptr, ASCII_p)) {
1700
1.12k
        ptr += MINBPC(enc);
1701
1.12k
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1702
723
          ptr += MINBPC(enc);
1703
723
          if (CHAR_MATCHES(enc, ptr, ASCII_s))
1704
517
            return ASCII_APOS;
1705
723
        }
1706
1.12k
      }
1707
2.71k
      break;
1708
6.65k
    }
1709
81.8k
  }
1710
57.5k
  return 0;
1711
81.8k
}
xmltok.c:normal_predefinedEntityName
Line
Count
Source
1661
81.8k
                             const char *end) {
1662
81.8k
  UNUSED_P(enc);
1663
81.8k
  switch ((end - ptr) / MINBPC(enc)) {
1664
6.28k
  case 2:
1665
6.28k
    if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_t)) {
1666
1.23k
      switch (BYTE_TO_ASCII(enc, ptr)) {
1667
920
      case ASCII_l:
1668
920
        return ASCII_LT;
1669
297
      case ASCII_g:
1670
297
        return ASCII_GT;
1671
1.23k
      }
1672
1.23k
    }
1673
5.07k
    break;
1674
23.5k
  case 3:
1675
23.5k
    if (CHAR_MATCHES(enc, ptr, ASCII_a)) {
1676
22.7k
      ptr += MINBPC(enc);
1677
22.7k
      if (CHAR_MATCHES(enc, ptr, ASCII_m)) {
1678
21.6k
        ptr += MINBPC(enc);
1679
21.6k
        if (CHAR_MATCHES(enc, ptr, ASCII_p))
1680
21.0k
          return ASCII_AMP;
1681
21.6k
      }
1682
22.7k
    }
1683
2.48k
    break;
1684
6.65k
  case 4:
1685
6.65k
    switch (BYTE_TO_ASCII(enc, ptr)) {
1686
2.78k
    case ASCII_q:
1687
2.78k
      ptr += MINBPC(enc);
1688
2.78k
      if (CHAR_MATCHES(enc, ptr, ASCII_u)) {
1689
2.25k
        ptr += MINBPC(enc);
1690
2.25k
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1691
1.74k
          ptr += MINBPC(enc);
1692
1.74k
          if (CHAR_MATCHES(enc, ptr, ASCII_t))
1693
1.50k
            return ASCII_QUOT;
1694
1.74k
        }
1695
2.25k
      }
1696
1.28k
      break;
1697
3.22k
    case ASCII_a:
1698
3.22k
      ptr += MINBPC(enc);
1699
3.22k
      if (CHAR_MATCHES(enc, ptr, ASCII_p)) {
1700
1.12k
        ptr += MINBPC(enc);
1701
1.12k
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1702
723
          ptr += MINBPC(enc);
1703
723
          if (CHAR_MATCHES(enc, ptr, ASCII_s))
1704
517
            return ASCII_APOS;
1705
723
        }
1706
1.12k
      }
1707
2.71k
      break;
1708
6.65k
    }
1709
81.8k
  }
1710
57.5k
  return 0;
1711
81.8k
}
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
555k
                         const char *end1, const char *ptr2) {
1716
555k
  UNUSED_P(enc);
1717
2.90M
  for (; *ptr2; ptr1 += MINBPC(enc), ptr2++) {
1718
2.52M
    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.52M
    if (! CHAR_MATCHES(enc, ptr1, *ptr2))
1727
172k
      return 0;
1728
2.52M
  }
1729
382k
  return ptr1 == end1;
1730
555k
}
xmltok.c:normal_nameMatchesAscii
Line
Count
Source
1715
555k
                         const char *end1, const char *ptr2) {
1716
555k
  UNUSED_P(enc);
1717
2.90M
  for (; *ptr2; ptr1 += MINBPC(enc), ptr2++) {
1718
2.52M
    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.52M
    if (! CHAR_MATCHES(enc, ptr1, *ptr2))
1727
172k
      return 0;
1728
2.52M
  }
1729
382k
  return ptr1 == end1;
1730
555k
}
Unexecuted instantiation: xmltok.c:little2_nameMatchesAscii
Unexecuted instantiation: xmltok.c:big2_nameMatchesAscii
1731
1732
static int PTRFASTCALL
1733
1.04M
PREFIX(nameLength)(const ENCODING *enc, const char *ptr) {
1734
1.04M
  const char *start = ptr;
1735
12.1M
  for (;;) {
1736
12.1M
    switch (BYTE_TYPE(enc, ptr)) {
1737
0
#  define LEAD_CASE(n)                                                         \
1738
50.2k
  case BT_LEAD##n:                                                             \
1739
50.2k
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1740
50.2k
    break;
1741
25.6k
      LEAD_CASE(2)
1742
24.6k
      LEAD_CASE(3)
1743
0
      LEAD_CASE(4)
1744
0
#  undef LEAD_CASE
1745
0
    case BT_NONASCII:
1746
9.12M
    case BT_NMSTRT:
1747
#  ifdef XML_NS
1748
    case BT_COLON:
1749
#  endif
1750
10.9M
    case BT_HEX:
1751
10.9M
    case BT_DIGIT:
1752
10.9M
    case BT_NAME:
1753
11.0M
    case BT_MINUS:
1754
11.0M
      ptr += MINBPC(enc);
1755
11.0M
      break;
1756
1.04M
    default:
1757
1.04M
      return (int)(ptr - start);
1758
12.1M
    }
1759
12.1M
  }
1760
1.04M
}
xmltok.c:normal_nameLength
Line
Count
Source
1733
1.04M
PREFIX(nameLength)(const ENCODING *enc, const char *ptr) {
1734
1.04M
  const char *start = ptr;
1735
12.1M
  for (;;) {
1736
12.1M
    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
25.6k
      LEAD_CASE(2)
1742
24.6k
      LEAD_CASE(3)
1743
0
      LEAD_CASE(4)
1744
0
#  undef LEAD_CASE
1745
0
    case BT_NONASCII:
1746
9.12M
    case BT_NMSTRT:
1747
#  ifdef XML_NS
1748
    case BT_COLON:
1749
#  endif
1750
10.9M
    case BT_HEX:
1751
10.9M
    case BT_DIGIT:
1752
10.9M
    case BT_NAME:
1753
11.0M
    case BT_MINUS:
1754
11.0M
      ptr += MINBPC(enc);
1755
11.0M
      break;
1756
1.04M
    default:
1757
1.04M
      return (int)(ptr - start);
1758
12.1M
    }
1759
12.1M
  }
1760
1.04M
}
Unexecuted instantiation: xmltok.c:little2_nameLength
Unexecuted instantiation: xmltok.c:big2_nameLength
1761
1762
static const char *PTRFASTCALL
1763
0
PREFIX(skipS)(const ENCODING *enc, const char *ptr) {
1764
0
  for (;;) {
1765
0
    switch (BYTE_TYPE(enc, ptr)) {
1766
0
    case BT_LF:
1767
0
    case BT_CR:
1768
0
    case BT_S:
1769
0
      ptr += MINBPC(enc);
1770
0
      break;
1771
0
    default:
1772
0
      return ptr;
1773
0
    }
1774
0
  }
1775
0
}
Unexecuted instantiation: xmltok.c:normal_skipS
Unexecuted instantiation: xmltok.c:little2_skipS
Unexecuted instantiation: xmltok.c:big2_skipS
1776
1777
static void PTRCALL
1778
PREFIX(updatePosition)(const ENCODING *enc, const char *ptr, const char *end,
1779
19.0k
                       POSITION *pos) {
1780
119M
  while (HAS_CHAR(enc, ptr, end)) {
1781
119M
    switch (BYTE_TYPE(enc, ptr)) {
1782
0
#  define LEAD_CASE(n)                                                         \
1783
1.31M
  case BT_LEAD##n:                                                             \
1784
1.31M
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1785
1.31M
    pos->columnNumber++;                                                       \
1786
1.31M
    break;
1787
515k
      LEAD_CASE(2)
1788
537k
      LEAD_CASE(3)
1789
261k
      LEAD_CASE(4)
1790
0
#  undef LEAD_CASE
1791
4.04M
    case BT_LF:
1792
4.04M
      pos->columnNumber = 0;
1793
4.04M
      pos->lineNumber++;
1794
4.04M
      ptr += MINBPC(enc);
1795
4.04M
      break;
1796
5.38M
    case BT_CR:
1797
5.38M
      pos->lineNumber++;
1798
5.38M
      ptr += MINBPC(enc);
1799
5.38M
      if (HAS_CHAR(enc, ptr, end) && BYTE_TYPE(enc, ptr) == BT_LF)
1800
1.29M
        ptr += MINBPC(enc);
1801
5.38M
      pos->columnNumber = 0;
1802
5.38M
      break;
1803
108M
    default:
1804
108M
      ptr += MINBPC(enc);
1805
108M
      pos->columnNumber++;
1806
108M
      break;
1807
119M
    }
1808
119M
  }
1809
19.0k
}
xmltok.c:normal_updatePosition
Line
Count
Source
1779
18.6k
                       POSITION *pos) {
1780
119M
  while (HAS_CHAR(enc, ptr, end)) {
1781
119M
    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
515k
      LEAD_CASE(2)
1788
537k
      LEAD_CASE(3)
1789
261k
      LEAD_CASE(4)
1790
0
#  undef LEAD_CASE
1791
4.04M
    case BT_LF:
1792
4.04M
      pos->columnNumber = 0;
1793
4.04M
      pos->lineNumber++;
1794
4.04M
      ptr += MINBPC(enc);
1795
4.04M
      break;
1796
5.38M
    case BT_CR:
1797
5.38M
      pos->lineNumber++;
1798
5.38M
      ptr += MINBPC(enc);
1799
5.38M
      if (HAS_CHAR(enc, ptr, end) && BYTE_TYPE(enc, ptr) == BT_LF)
1800
1.29M
        ptr += MINBPC(enc);
1801
5.38M
      pos->columnNumber = 0;
1802
5.38M
      break;
1803
108M
    default:
1804
108M
      ptr += MINBPC(enc);
1805
108M
      pos->columnNumber++;
1806
108M
      break;
1807
119M
    }
1808
119M
  }
1809
18.6k
}
xmltok.c:little2_updatePosition
Line
Count
Source
1779
228
                       POSITION *pos) {
1780
720
  while (HAS_CHAR(enc, ptr, end)) {
1781
720
    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
720
    default:
1804
720
      ptr += MINBPC(enc);
1805
720
      pos->columnNumber++;
1806
720
      break;
1807
720
    }
1808
720
  }
1809
228
}
xmltok.c:big2_updatePosition
Line
Count
Source
1779
237
                       POSITION *pos) {
1780
19.8k
  while (HAS_CHAR(enc, ptr, end)) {
1781
19.8k
    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
19.8k
    default:
1804
19.8k
      ptr += MINBPC(enc);
1805
19.8k
      pos->columnNumber++;
1806
19.8k
      break;
1807
19.8k
    }
1808
19.8k
  }
1809
237
}
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 */