Coverage Report

Created: 2026-07-14 07:09

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
103
#    define IS_INVALID_CHAR(enc, ptr, n) (0)
46
#  endif
47
48
#  define INVALID_LEAD_CASE(n, ptr, nextTokPtr)                                \
49
643k
  case BT_LEAD##n:                                                             \
50
643k
    if (end - ptr < n)                                                         \
51
643k
      return XML_TOK_PARTIAL_CHAR;                                             \
52
643k
    if (IS_INVALID_CHAR(enc, ptr, n)) {                                        \
53
108
      *(nextTokPtr) = (ptr);                                                   \
54
108
      return XML_TOK_INVALID;                                                  \
55
108
    }                                                                          \
56
643k
    ptr += n;                                                                  \
57
643k
    break;
58
59
#  define INVALID_CASES(ptr, nextTokPtr)                                       \
60
267k
    INVALID_LEAD_CASE(2, ptr, nextTokPtr)                                      \
61
267k
    INVALID_LEAD_CASE(3, ptr, nextTokPtr)                                      \
62
248k
    INVALID_LEAD_CASE(4, ptr, nextTokPtr)                                      \
63
127k
  case BT_NONXML:                                                              \
64
62
  case BT_MALFORM:                                                             \
65
116
  case BT_TRAIL:                                                               \
66
116
    *(nextTokPtr) = (ptr);                                                     \
67
116
    return XML_TOK_INVALID;
68
69
#  define CHECK_NAME_CASE(n, enc, ptr, end, nextTokPtr)                        \
70
158k
  case BT_LEAD##n:                                                             \
71
158k
    if (end - ptr < n)                                                         \
72
158k
      return XML_TOK_PARTIAL_CHAR;                                             \
73
158k
    if (IS_INVALID_CHAR(enc, ptr, n) || ! IS_NAME_CHAR(enc, ptr, n)) {         \
74
299
      *nextTokPtr = ptr;                                                       \
75
299
      return XML_TOK_INVALID;                                                  \
76
299
    }                                                                          \
77
158k
    ptr += n;                                                                  \
78
158k
    break;
79
80
#  define CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)                          \
81
24.9M
  case BT_NONASCII:                                                            \
82
24.9M
    if (! IS_NAME_CHAR_MINBPC(enc, ptr)) {                                     \
83
44
      *nextTokPtr = ptr;                                                       \
84
44
      return XML_TOK_INVALID;                                                  \
85
44
    }                                                                          \
86
24.9M
    /* fall through */                                                         \
87
24.9M
  case BT_NMSTRT:                                                              \
88
18.2M
  case BT_HEX:                                                                 \
89
24.1M
  case BT_DIGIT:                                                               \
90
24.2M
  case BT_NAME:                                                                \
91
24.9M
  case BT_MINUS:                                                               \
92
24.9M
    ptr += MINBPC(enc);                                                        \
93
24.9M
    break;                                                                     \
94
24.9M
    CHECK_NAME_CASE(2, enc, ptr, end, nextTokPtr)                              \
95
92.4k
    CHECK_NAME_CASE(3, enc, ptr, end, nextTokPtr)                              \
96
92.3k
    CHECK_NAME_CASE(4, enc, ptr, end, nextTokPtr)
97
98
#  define CHECK_NMSTRT_CASE(n, enc, ptr, end, nextTokPtr)                      \
99
97.5k
  case BT_LEAD##n:                                                             \
100
97.5k
    if ((end) - (ptr) < (n))                                                   \
101
97.2k
      return XML_TOK_PARTIAL_CHAR;                                             \
102
97.4k
    if (IS_INVALID_CHAR(enc, ptr, n) || ! IS_NMSTRT_CHAR(enc, ptr, n)) {       \
103
184
      *nextTokPtr = ptr;                                                       \
104
184
      return XML_TOK_INVALID;                                                  \
105
184
    }                                                                          \
106
97.4k
    ptr += n;                                                                  \
107
97.2k
    break;
108
109
#  define CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)                        \
110
2.94M
  case BT_NONASCII:                                                            \
111
2.94M
    if (! IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {                                   \
112
0
      *nextTokPtr = ptr;                                                       \
113
0
      return XML_TOK_INVALID;                                                  \
114
0
    }                                                                          \
115
2.94M
    /* fall through */                                                         \
116
2.94M
  case BT_NMSTRT:                                                              \
117
2.94M
  case BT_HEX:                                                                 \
118
2.94M
    ptr += MINBPC(enc);                                                        \
119
2.94M
    break;                                                                     \
120
2.94M
    CHECK_NMSTRT_CASE(2, enc, ptr, end, nextTokPtr)                            \
121
60.0k
    CHECK_NMSTRT_CASE(3, enc, ptr, end, nextTokPtr)                            \
122
37.1k
    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
290M
    ((end) - (ptr) >= ((count) * MINBPC(enc)))
130
131
11.1M
#  define HAS_CHAR(enc, ptr, end) HAS_CHARS(enc, ptr, end, 1)
132
133
#  define REQUIRE_CHARS(enc, ptr, end, count)                                  \
134
28.9M
    {                                                                          \
135
28.9M
      if (! HAS_CHARS(enc, ptr, end, count)) {                                 \
136
636
        return XML_TOK_PARTIAL;                                                \
137
636
      }                                                                        \
138
28.9M
    }
139
140
28.9M
#  define REQUIRE_CHAR(enc, ptr, end) REQUIRE_CHARS(enc, ptr, end, 1)
141
142
/* ptr points to character following "<!-" */
143
144
static int PTRCALL
145
PREFIX(scanComment)(const ENCODING *enc, const char *ptr, const char *end,
146
33.6k
                    const char **nextTokPtr) {
147
33.6k
  if (HAS_CHAR(enc, ptr, end)) {
148
33.5k
    if (! CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
149
11
      *nextTokPtr = ptr;
150
11
      return XML_TOK_INVALID;
151
11
    }
152
33.5k
    ptr += MINBPC(enc);
153
4.96M
    while (HAS_CHAR(enc, ptr, end)) {
154
4.96M
      switch (BYTE_TYPE(enc, ptr)) {
155
176k
        INVALID_CASES(ptr, nextTokPtr)
156
52.9k
      case BT_MINUS:
157
52.9k
        ptr += MINBPC(enc);
158
52.9k
        REQUIRE_CHAR(enc, ptr, end);
159
52.9k
        if (CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
160
33.4k
          ptr += MINBPC(enc);
161
33.4k
          REQUIRE_CHAR(enc, ptr, end);
162
33.4k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
163
10
            *nextTokPtr = ptr;
164
10
            return XML_TOK_INVALID;
165
10
          }
166
33.4k
          *nextTokPtr = ptr + MINBPC(enc);
167
33.4k
          return XML_TOK_COMMENT;
168
33.4k
        }
169
19.5k
        break;
170
4.82M
      default:
171
4.82M
        ptr += MINBPC(enc);
172
4.82M
        break;
173
4.96M
      }
174
4.96M
    }
175
33.5k
  }
176
72
  return XML_TOK_PARTIAL;
177
33.6k
}
xmltok.c:normal_scanComment
Line
Count
Source
146
33.6k
                    const char **nextTokPtr) {
147
33.6k
  if (HAS_CHAR(enc, ptr, end)) {
148
33.5k
    if (! CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
149
11
      *nextTokPtr = ptr;
150
11
      return XML_TOK_INVALID;
151
11
    }
152
33.5k
    ptr += MINBPC(enc);
153
4.96M
    while (HAS_CHAR(enc, ptr, end)) {
154
4.96M
      switch (BYTE_TYPE(enc, ptr)) {
155
176k
        INVALID_CASES(ptr, nextTokPtr)
156
52.9k
      case BT_MINUS:
157
52.9k
        ptr += MINBPC(enc);
158
52.9k
        REQUIRE_CHAR(enc, ptr, end);
159
52.9k
        if (CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
160
33.4k
          ptr += MINBPC(enc);
161
33.4k
          REQUIRE_CHAR(enc, ptr, end);
162
33.4k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
163
10
            *nextTokPtr = ptr;
164
10
            return XML_TOK_INVALID;
165
10
          }
166
33.4k
          *nextTokPtr = ptr + MINBPC(enc);
167
33.4k
          return XML_TOK_COMMENT;
168
33.4k
        }
169
19.5k
        break;
170
4.82M
      default:
171
4.82M
        ptr += MINBPC(enc);
172
4.82M
        break;
173
4.96M
      }
174
4.96M
    }
175
33.5k
  }
176
72
  return XML_TOK_PARTIAL;
177
33.6k
}
Unexecuted instantiation: xmltok.c:little2_scanComment
Unexecuted instantiation: xmltok.c:big2_scanComment
178
179
/* ptr points to character following "<!" */
180
181
static int PTRCALL
182
PREFIX(scanDecl)(const ENCODING *enc, const char *ptr, const char *end,
183
48.5k
                 const char **nextTokPtr) {
184
48.5k
  REQUIRE_CHAR(enc, ptr, end);
185
48.5k
  switch (BYTE_TYPE(enc, ptr)) {
186
3.09k
  case BT_MINUS:
187
3.09k
    return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
188
1
  case BT_LSQB:
189
1
    *nextTokPtr = ptr + MINBPC(enc);
190
1
    return XML_TOK_COND_SECT_OPEN;
191
1.01k
  case BT_NMSTRT:
192
45.4k
  case BT_HEX:
193
45.4k
    ptr += MINBPC(enc);
194
45.4k
    break;
195
5
  default:
196
5
    *nextTokPtr = ptr;
197
5
    return XML_TOK_INVALID;
198
48.5k
  }
199
311k
  while (HAS_CHAR(enc, ptr, end)) {
200
311k
    switch (BYTE_TYPE(enc, ptr)) {
201
22
    case BT_PERCNT:
202
22
      REQUIRE_CHARS(enc, ptr, end, 2);
203
      /* don't allow <!ENTITY% foo "whatever"> */
204
20
      switch (BYTE_TYPE(enc, ptr + MINBPC(enc))) {
205
2
      case BT_S:
206
3
      case BT_CR:
207
4
      case BT_LF:
208
7
      case BT_PERCNT:
209
7
        *nextTokPtr = ptr;
210
7
        return XML_TOK_INVALID;
211
20
      }
212
      /* fall through */
213
18.7k
    case BT_S:
214
40.4k
    case BT_CR:
215
45.3k
    case BT_LF:
216
45.3k
      *nextTokPtr = ptr;
217
45.3k
      return XML_TOK_DECL_OPEN;
218
247k
    case BT_NMSTRT:
219
265k
    case BT_HEX:
220
265k
      ptr += MINBPC(enc);
221
265k
      break;
222
9
    default:
223
9
      *nextTokPtr = ptr;
224
9
      return XML_TOK_INVALID;
225
311k
    }
226
311k
  }
227
74
  return XML_TOK_PARTIAL;
228
45.4k
}
xmltok.c:normal_scanDecl
Line
Count
Source
183
48.5k
                 const char **nextTokPtr) {
184
48.5k
  REQUIRE_CHAR(enc, ptr, end);
185
48.5k
  switch (BYTE_TYPE(enc, ptr)) {
186
3.09k
  case BT_MINUS:
187
3.09k
    return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
188
1
  case BT_LSQB:
189
1
    *nextTokPtr = ptr + MINBPC(enc);
190
1
    return XML_TOK_COND_SECT_OPEN;
191
1.01k
  case BT_NMSTRT:
192
45.4k
  case BT_HEX:
193
45.4k
    ptr += MINBPC(enc);
194
45.4k
    break;
195
5
  default:
196
5
    *nextTokPtr = ptr;
197
5
    return XML_TOK_INVALID;
198
48.5k
  }
199
311k
  while (HAS_CHAR(enc, ptr, end)) {
200
311k
    switch (BYTE_TYPE(enc, ptr)) {
201
22
    case BT_PERCNT:
202
22
      REQUIRE_CHARS(enc, ptr, end, 2);
203
      /* don't allow <!ENTITY% foo "whatever"> */
204
20
      switch (BYTE_TYPE(enc, ptr + MINBPC(enc))) {
205
2
      case BT_S:
206
3
      case BT_CR:
207
4
      case BT_LF:
208
7
      case BT_PERCNT:
209
7
        *nextTokPtr = ptr;
210
7
        return XML_TOK_INVALID;
211
20
      }
212
      /* fall through */
213
18.7k
    case BT_S:
214
40.4k
    case BT_CR:
215
45.3k
    case BT_LF:
216
45.3k
      *nextTokPtr = ptr;
217
45.3k
      return XML_TOK_DECL_OPEN;
218
247k
    case BT_NMSTRT:
219
265k
    case BT_HEX:
220
265k
      ptr += MINBPC(enc);
221
265k
      break;
222
9
    default:
223
9
      *nextTokPtr = ptr;
224
9
      return XML_TOK_INVALID;
225
311k
    }
226
311k
  }
227
74
  return XML_TOK_PARTIAL;
228
45.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
52.2k
                      int *tokPtr) {
233
52.2k
  int upper = 0;
234
52.2k
  UNUSED_P(enc);
235
52.2k
  *tokPtr = XML_TOK_PI;
236
52.2k
  if (end - ptr != MINBPC(enc) * 3)
237
43.3k
    return 1;
238
8.91k
  switch (BYTE_TO_ASCII(enc, ptr)) {
239
4.83k
  case ASCII_x:
240
4.83k
    break;
241
1.05k
  case ASCII_X:
242
1.05k
    upper = 1;
243
1.05k
    break;
244
3.03k
  default:
245
3.03k
    return 1;
246
8.91k
  }
247
5.88k
  ptr += MINBPC(enc);
248
5.88k
  switch (BYTE_TO_ASCII(enc, ptr)) {
249
1.85k
  case ASCII_m:
250
1.85k
    break;
251
907
  case ASCII_M:
252
907
    upper = 1;
253
907
    break;
254
3.12k
  default:
255
3.12k
    return 1;
256
5.88k
  }
257
2.76k
  ptr += MINBPC(enc);
258
2.76k
  switch (BYTE_TO_ASCII(enc, ptr)) {
259
1.12k
  case ASCII_l:
260
1.12k
    break;
261
2
  case ASCII_L:
262
2
    upper = 1;
263
2
    break;
264
1.63k
  default:
265
1.63k
    return 1;
266
2.76k
  }
267
1.12k
  if (upper)
268
5
    return 0;
269
1.12k
  *tokPtr = XML_TOK_XML_DECL;
270
1.12k
  return 1;
271
1.12k
}
xmltok.c:normal_checkPiTarget
Line
Count
Source
232
52.2k
                      int *tokPtr) {
233
52.2k
  int upper = 0;
234
52.2k
  UNUSED_P(enc);
235
52.2k
  *tokPtr = XML_TOK_PI;
236
52.2k
  if (end - ptr != MINBPC(enc) * 3)
237
43.3k
    return 1;
238
8.91k
  switch (BYTE_TO_ASCII(enc, ptr)) {
239
4.83k
  case ASCII_x:
240
4.83k
    break;
241
1.05k
  case ASCII_X:
242
1.05k
    upper = 1;
243
1.05k
    break;
244
3.03k
  default:
245
3.03k
    return 1;
246
8.91k
  }
247
5.88k
  ptr += MINBPC(enc);
248
5.88k
  switch (BYTE_TO_ASCII(enc, ptr)) {
249
1.85k
  case ASCII_m:
250
1.85k
    break;
251
907
  case ASCII_M:
252
907
    upper = 1;
253
907
    break;
254
3.12k
  default:
255
3.12k
    return 1;
256
5.88k
  }
257
2.76k
  ptr += MINBPC(enc);
258
2.76k
  switch (BYTE_TO_ASCII(enc, ptr)) {
259
1.12k
  case ASCII_l:
260
1.12k
    break;
261
2
  case ASCII_L:
262
2
    upper = 1;
263
2
    break;
264
1.63k
  default:
265
1.63k
    return 1;
266
2.76k
  }
267
1.12k
  if (upper)
268
5
    return 0;
269
1.12k
  *tokPtr = XML_TOK_XML_DECL;
270
1.12k
  return 1;
271
1.12k
}
Unexecuted instantiation: xmltok.c:little2_checkPiTarget
Unexecuted instantiation: xmltok.c:big2_checkPiTarget
272
273
/* ptr points to character following "<?" */
274
275
static int PTRCALL
276
PREFIX(scanPi)(const ENCODING *enc, const char *ptr, const char *end,
277
52.4k
               const char **nextTokPtr) {
278
52.4k
  int tok;
279
52.4k
  const char *target = ptr;
280
52.4k
  REQUIRE_CHAR(enc, ptr, end);
281
52.4k
  switch (BYTE_TYPE(enc, ptr)) {
282
65.1k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
283
2
  default:
284
2
    *nextTokPtr = ptr;
285
2
    return XML_TOK_INVALID;
286
52.4k
  }
287
1.25M
  while (HAS_CHAR(enc, ptr, end)) {
288
1.25M
    switch (BYTE_TYPE(enc, ptr)) {
289
4.32M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
290
6.65k
    case BT_S:
291
19.5k
    case BT_CR:
292
24.7k
    case BT_LF:
293
24.7k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
294
3
        *nextTokPtr = ptr;
295
3
        return XML_TOK_INVALID;
296
3
      }
297
24.7k
      ptr += MINBPC(enc);
298
20.9M
      while (HAS_CHAR(enc, ptr, end)) {
299
20.9M
        switch (BYTE_TYPE(enc, ptr)) {
300
606k
          INVALID_CASES(ptr, nextTokPtr)
301
127k
        case BT_QUEST:
302
127k
          ptr += MINBPC(enc);
303
127k
          REQUIRE_CHAR(enc, ptr, end);
304
127k
          if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
305
24.5k
            *nextTokPtr = ptr + MINBPC(enc);
306
24.5k
            return tok;
307
24.5k
          }
308
103k
          break;
309
20.4M
        default:
310
20.4M
          ptr += MINBPC(enc);
311
20.4M
          break;
312
20.9M
        }
313
20.9M
      }
314
146
      return XML_TOK_PARTIAL;
315
27.5k
    case BT_QUEST:
316
27.5k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
317
2
        *nextTokPtr = ptr;
318
2
        return XML_TOK_INVALID;
319
2
      }
320
27.4k
      ptr += MINBPC(enc);
321
27.4k
      REQUIRE_CHAR(enc, ptr, end);
322
27.4k
      if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
323
27.4k
        *nextTokPtr = ptr + MINBPC(enc);
324
27.4k
        return tok;
325
27.4k
      }
326
      /* fall through */
327
33
    default:
328
33
      *nextTokPtr = ptr;
329
33
      return XML_TOK_INVALID;
330
1.25M
    }
331
1.25M
  }
332
82
  return XML_TOK_PARTIAL;
333
52.4k
}
xmltok.c:normal_scanPi
Line
Count
Source
277
52.4k
               const char **nextTokPtr) {
278
52.4k
  int tok;
279
52.4k
  const char *target = ptr;
280
52.4k
  REQUIRE_CHAR(enc, ptr, end);
281
52.4k
  switch (BYTE_TYPE(enc, ptr)) {
282
65.1k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
283
2
  default:
284
2
    *nextTokPtr = ptr;
285
2
    return XML_TOK_INVALID;
286
52.4k
  }
287
1.25M
  while (HAS_CHAR(enc, ptr, end)) {
288
1.25M
    switch (BYTE_TYPE(enc, ptr)) {
289
4.32M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
290
6.65k
    case BT_S:
291
19.5k
    case BT_CR:
292
24.7k
    case BT_LF:
293
24.7k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
294
3
        *nextTokPtr = ptr;
295
3
        return XML_TOK_INVALID;
296
3
      }
297
24.7k
      ptr += MINBPC(enc);
298
20.9M
      while (HAS_CHAR(enc, ptr, end)) {
299
20.9M
        switch (BYTE_TYPE(enc, ptr)) {
300
606k
          INVALID_CASES(ptr, nextTokPtr)
301
127k
        case BT_QUEST:
302
127k
          ptr += MINBPC(enc);
303
127k
          REQUIRE_CHAR(enc, ptr, end);
304
127k
          if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
305
24.5k
            *nextTokPtr = ptr + MINBPC(enc);
306
24.5k
            return tok;
307
24.5k
          }
308
103k
          break;
309
20.4M
        default:
310
20.4M
          ptr += MINBPC(enc);
311
20.4M
          break;
312
20.9M
        }
313
20.9M
      }
314
146
      return XML_TOK_PARTIAL;
315
27.5k
    case BT_QUEST:
316
27.5k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
317
2
        *nextTokPtr = ptr;
318
2
        return XML_TOK_INVALID;
319
2
      }
320
27.4k
      ptr += MINBPC(enc);
321
27.4k
      REQUIRE_CHAR(enc, ptr, end);
322
27.4k
      if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
323
27.4k
        *nextTokPtr = ptr + MINBPC(enc);
324
27.4k
        return tok;
325
27.4k
      }
326
      /* fall through */
327
33
    default:
328
33
      *nextTokPtr = ptr;
329
33
      return XML_TOK_INVALID;
330
1.25M
    }
331
1.25M
  }
332
82
  return XML_TOK_PARTIAL;
333
52.4k
}
Unexecuted instantiation: xmltok.c:little2_scanPi
Unexecuted instantiation: xmltok.c:big2_scanPi
334
335
static int PTRCALL
336
PREFIX(scanCdataSection)(const ENCODING *enc, const char *ptr, const char *end,
337
2.47k
                         const char **nextTokPtr) {
338
2.47k
  static const char CDATA_LSQB[]
339
2.47k
      = {ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, ASCII_LSQB};
340
2.47k
  int i;
341
2.47k
  UNUSED_P(enc);
342
  /* CDATA[ */
343
2.47k
  REQUIRE_CHARS(enc, ptr, end, 6);
344
16.9k
  for (i = 0; i < 6; i++, ptr += MINBPC(enc)) {
345
14.5k
    if (! CHAR_MATCHES(enc, ptr, CDATA_LSQB[i])) {
346
55
      *nextTokPtr = ptr;
347
55
      return XML_TOK_INVALID;
348
55
    }
349
14.5k
  }
350
2.39k
  *nextTokPtr = ptr;
351
2.39k
  return XML_TOK_CDATA_SECT_OPEN;
352
2.45k
}
xmltok.c:normal_scanCdataSection
Line
Count
Source
337
2.47k
                         const char **nextTokPtr) {
338
2.47k
  static const char CDATA_LSQB[]
339
2.47k
      = {ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, ASCII_LSQB};
340
2.47k
  int i;
341
2.47k
  UNUSED_P(enc);
342
  /* CDATA[ */
343
2.47k
  REQUIRE_CHARS(enc, ptr, end, 6);
344
16.9k
  for (i = 0; i < 6; i++, ptr += MINBPC(enc)) {
345
14.5k
    if (! CHAR_MATCHES(enc, ptr, CDATA_LSQB[i])) {
346
55
      *nextTokPtr = ptr;
347
55
      return XML_TOK_INVALID;
348
55
    }
349
14.5k
  }
350
2.39k
  *nextTokPtr = ptr;
351
2.39k
  return XML_TOK_CDATA_SECT_OPEN;
352
2.45k
}
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.80M
                        const char **nextTokPtr) {
357
4.80M
  if (ptr >= end)
358
222
    return XML_TOK_NONE;
359
4.80M
  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.80M
  switch (BYTE_TYPE(enc, ptr)) {
369
625k
  case BT_RSQB:
370
625k
    ptr += MINBPC(enc);
371
625k
    REQUIRE_CHAR(enc, ptr, end);
372
625k
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
373
331k
      break;
374
293k
    ptr += MINBPC(enc);
375
293k
    REQUIRE_CHAR(enc, ptr, end);
376
293k
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
377
290k
      ptr -= MINBPC(enc);
378
290k
      break;
379
290k
    }
380
2.22k
    *nextTokPtr = ptr + MINBPC(enc);
381
2.22k
    return XML_TOK_CDATA_SECT_CLOSE;
382
1.63M
  case BT_CR:
383
1.63M
    ptr += MINBPC(enc);
384
1.63M
    REQUIRE_CHAR(enc, ptr, end);
385
1.63M
    if (BYTE_TYPE(enc, ptr) == BT_LF)
386
316k
      ptr += MINBPC(enc);
387
1.63M
    *nextTokPtr = ptr;
388
1.63M
    return XML_TOK_DATA_NEWLINE;
389
1.46M
  case BT_LF:
390
1.46M
    *nextTokPtr = ptr + MINBPC(enc);
391
1.46M
    return XML_TOK_DATA_NEWLINE;
392
1.46M
    INVALID_CASES(ptr, nextTokPtr)
393
1.00M
  default:
394
1.00M
    ptr += MINBPC(enc);
395
1.00M
    break;
396
4.80M
  }
397
26.2M
  while (HAS_CHAR(enc, ptr, end)) {
398
26.2M
    switch (BYTE_TYPE(enc, ptr)) {
399
0
#  define LEAD_CASE(n)                                                         \
400
448k
  case BT_LEAD##n:                                                             \
401
448k
    if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) {                       \
402
22
      *nextTokPtr = ptr;                                                       \
403
22
      return XML_TOK_DATA_CHARS;                                               \
404
22
    }                                                                          \
405
448k
    ptr += n;                                                                  \
406
448k
    break;
407
201k
      LEAD_CASE(2)
408
188k
      LEAD_CASE(3)
409
57.5k
      LEAD_CASE(4)
410
0
#  undef LEAD_CASE
411
2
    case BT_NONXML:
412
4
    case BT_MALFORM:
413
8
    case BT_TRAIL:
414
749k
    case BT_CR:
415
1.18M
    case BT_LF:
416
1.70M
    case BT_RSQB:
417
1.70M
      *nextTokPtr = ptr;
418
1.70M
      return XML_TOK_DATA_CHARS;
419
24.1M
    default:
420
24.1M
      ptr += MINBPC(enc);
421
24.1M
      break;
422
26.2M
    }
423
26.2M
  }
424
62
  *nextTokPtr = ptr;
425
62
  return XML_TOK_DATA_CHARS;
426
1.70M
}
xmltok.c:normal_cdataSectionTok
Line
Count
Source
356
4.80M
                        const char **nextTokPtr) {
357
4.80M
  if (ptr >= end)
358
222
    return XML_TOK_NONE;
359
4.80M
  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.80M
  switch (BYTE_TYPE(enc, ptr)) {
369
625k
  case BT_RSQB:
370
625k
    ptr += MINBPC(enc);
371
625k
    REQUIRE_CHAR(enc, ptr, end);
372
625k
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
373
331k
      break;
374
293k
    ptr += MINBPC(enc);
375
293k
    REQUIRE_CHAR(enc, ptr, end);
376
293k
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
377
290k
      ptr -= MINBPC(enc);
378
290k
      break;
379
290k
    }
380
2.22k
    *nextTokPtr = ptr + MINBPC(enc);
381
2.22k
    return XML_TOK_CDATA_SECT_CLOSE;
382
1.63M
  case BT_CR:
383
1.63M
    ptr += MINBPC(enc);
384
1.63M
    REQUIRE_CHAR(enc, ptr, end);
385
1.63M
    if (BYTE_TYPE(enc, ptr) == BT_LF)
386
316k
      ptr += MINBPC(enc);
387
1.63M
    *nextTokPtr = ptr;
388
1.63M
    return XML_TOK_DATA_NEWLINE;
389
1.46M
  case BT_LF:
390
1.46M
    *nextTokPtr = ptr + MINBPC(enc);
391
1.46M
    return XML_TOK_DATA_NEWLINE;
392
1.46M
    INVALID_CASES(ptr, nextTokPtr)
393
1.00M
  default:
394
1.00M
    ptr += MINBPC(enc);
395
1.00M
    break;
396
4.80M
  }
397
26.2M
  while (HAS_CHAR(enc, ptr, end)) {
398
26.2M
    switch (BYTE_TYPE(enc, ptr)) {
399
0
#  define LEAD_CASE(n)                                                         \
400
0
  case BT_LEAD##n:                                                             \
401
0
    if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) {                       \
402
0
      *nextTokPtr = ptr;                                                       \
403
0
      return XML_TOK_DATA_CHARS;                                               \
404
0
    }                                                                          \
405
0
    ptr += n;                                                                  \
406
0
    break;
407
201k
      LEAD_CASE(2)
408
188k
      LEAD_CASE(3)
409
57.5k
      LEAD_CASE(4)
410
0
#  undef LEAD_CASE
411
2
    case BT_NONXML:
412
4
    case BT_MALFORM:
413
8
    case BT_TRAIL:
414
749k
    case BT_CR:
415
1.18M
    case BT_LF:
416
1.70M
    case BT_RSQB:
417
1.70M
      *nextTokPtr = ptr;
418
1.70M
      return XML_TOK_DATA_CHARS;
419
24.1M
    default:
420
24.1M
      ptr += MINBPC(enc);
421
24.1M
      break;
422
26.2M
    }
423
26.2M
  }
424
62
  *nextTokPtr = ptr;
425
62
  return XML_TOK_DATA_CHARS;
426
1.70M
}
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
165k
                   const char **nextTokPtr) {
433
165k
  REQUIRE_CHAR(enc, ptr, end);
434
165k
  switch (BYTE_TYPE(enc, ptr)) {
435
121k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
436
16
  default:
437
16
    *nextTokPtr = ptr;
438
16
    return XML_TOK_INVALID;
439
165k
  }
440
1.38M
  while (HAS_CHAR(enc, ptr, end)) {
441
1.38M
    switch (BYTE_TYPE(enc, ptr)) {
442
4.04M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
443
354
    case BT_S:
444
1.22k
    case BT_CR:
445
2.57k
    case BT_LF:
446
7.16k
      for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
447
7.16k
        switch (BYTE_TYPE(enc, ptr)) {
448
389
        case BT_S:
449
1.84k
        case BT_CR:
450
4.63k
        case BT_LF:
451
4.63k
          break;
452
2.53k
        case BT_GT:
453
2.53k
          *nextTokPtr = ptr + MINBPC(enc);
454
2.53k
          return XML_TOK_END_TAG;
455
3
        default:
456
3
          *nextTokPtr = ptr;
457
3
          return XML_TOK_INVALID;
458
7.16k
        }
459
7.16k
      }
460
40
      return XML_TOK_PARTIAL;
461
#  ifdef XML_NS
462
    case BT_COLON:
463
      /* no need to check qname syntax here,
464
         since end-tag must match exactly */
465
      ptr += MINBPC(enc);
466
      break;
467
#  endif
468
162k
    case BT_GT:
469
162k
      *nextTokPtr = ptr + MINBPC(enc);
470
162k
      return XML_TOK_END_TAG;
471
16
    default:
472
16
      *nextTokPtr = ptr;
473
16
      return XML_TOK_INVALID;
474
1.38M
    }
475
1.38M
  }
476
116
  return XML_TOK_PARTIAL;
477
165k
}
xmltok.c:normal_scanEndTag
Line
Count
Source
432
165k
                   const char **nextTokPtr) {
433
165k
  REQUIRE_CHAR(enc, ptr, end);
434
165k
  switch (BYTE_TYPE(enc, ptr)) {
435
121k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
436
16
  default:
437
16
    *nextTokPtr = ptr;
438
16
    return XML_TOK_INVALID;
439
165k
  }
440
1.38M
  while (HAS_CHAR(enc, ptr, end)) {
441
1.38M
    switch (BYTE_TYPE(enc, ptr)) {
442
4.04M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
443
354
    case BT_S:
444
1.22k
    case BT_CR:
445
2.57k
    case BT_LF:
446
7.16k
      for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
447
7.16k
        switch (BYTE_TYPE(enc, ptr)) {
448
389
        case BT_S:
449
1.84k
        case BT_CR:
450
4.63k
        case BT_LF:
451
4.63k
          break;
452
2.53k
        case BT_GT:
453
2.53k
          *nextTokPtr = ptr + MINBPC(enc);
454
2.53k
          return XML_TOK_END_TAG;
455
3
        default:
456
3
          *nextTokPtr = ptr;
457
3
          return XML_TOK_INVALID;
458
7.16k
        }
459
7.16k
      }
460
40
      return XML_TOK_PARTIAL;
461
#  ifdef XML_NS
462
    case BT_COLON:
463
      /* no need to check qname syntax here,
464
         since end-tag must match exactly */
465
      ptr += MINBPC(enc);
466
      break;
467
#  endif
468
162k
    case BT_GT:
469
162k
      *nextTokPtr = ptr + MINBPC(enc);
470
162k
      return XML_TOK_END_TAG;
471
16
    default:
472
16
      *nextTokPtr = ptr;
473
16
      return XML_TOK_INVALID;
474
1.38M
    }
475
1.38M
  }
476
116
  return XML_TOK_PARTIAL;
477
165k
}
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
26.4k
                       const char **nextTokPtr) {
484
26.4k
  if (HAS_CHAR(enc, ptr, end)) {
485
26.4k
    switch (BYTE_TYPE(enc, ptr)) {
486
13.7k
    case BT_DIGIT:
487
26.4k
    case BT_HEX:
488
26.4k
      break;
489
6
    default:
490
6
      *nextTokPtr = ptr;
491
6
      return XML_TOK_INVALID;
492
26.4k
    }
493
81.4k
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
494
81.4k
      switch (BYTE_TYPE(enc, ptr)) {
495
31.2k
      case BT_DIGIT:
496
55.0k
      case BT_HEX:
497
55.0k
        break;
498
26.3k
      case BT_SEMI:
499
26.3k
        *nextTokPtr = ptr + MINBPC(enc);
500
26.3k
        return XML_TOK_CHAR_REF;
501
4
      default:
502
4
        *nextTokPtr = ptr;
503
4
        return XML_TOK_INVALID;
504
81.4k
      }
505
81.4k
    }
506
26.4k
  }
507
29
  return XML_TOK_PARTIAL;
508
26.4k
}
xmltok.c:normal_scanHexCharRef
Line
Count
Source
483
26.4k
                       const char **nextTokPtr) {
484
26.4k
  if (HAS_CHAR(enc, ptr, end)) {
485
26.4k
    switch (BYTE_TYPE(enc, ptr)) {
486
13.7k
    case BT_DIGIT:
487
26.4k
    case BT_HEX:
488
26.4k
      break;
489
6
    default:
490
6
      *nextTokPtr = ptr;
491
6
      return XML_TOK_INVALID;
492
26.4k
    }
493
81.4k
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
494
81.4k
      switch (BYTE_TYPE(enc, ptr)) {
495
31.2k
      case BT_DIGIT:
496
55.0k
      case BT_HEX:
497
55.0k
        break;
498
26.3k
      case BT_SEMI:
499
26.3k
        *nextTokPtr = ptr + MINBPC(enc);
500
26.3k
        return XML_TOK_CHAR_REF;
501
4
      default:
502
4
        *nextTokPtr = ptr;
503
4
        return XML_TOK_INVALID;
504
81.4k
      }
505
81.4k
    }
506
26.4k
  }
507
29
  return XML_TOK_PARTIAL;
508
26.4k
}
Unexecuted instantiation: xmltok.c:little2_scanHexCharRef
Unexecuted instantiation: xmltok.c:big2_scanHexCharRef
509
510
/* ptr points to character following "&#" */
511
512
static int PTRCALL
513
PREFIX(scanCharRef)(const ENCODING *enc, const char *ptr, const char *end,
514
38.1k
                    const char **nextTokPtr) {
515
38.1k
  if (HAS_CHAR(enc, ptr, end)) {
516
38.1k
    if (CHAR_MATCHES(enc, ptr, ASCII_x))
517
26.4k
      return PREFIX(scanHexCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
518
11.6k
    switch (BYTE_TYPE(enc, ptr)) {
519
11.6k
    case BT_DIGIT:
520
11.6k
      break;
521
14
    default:
522
14
      *nextTokPtr = ptr;
523
14
      return XML_TOK_INVALID;
524
11.6k
    }
525
43.4k
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
526
43.4k
      switch (BYTE_TYPE(enc, ptr)) {
527
31.7k
      case BT_DIGIT:
528
31.7k
        break;
529
11.6k
      case BT_SEMI:
530
11.6k
        *nextTokPtr = ptr + MINBPC(enc);
531
11.6k
        return XML_TOK_CHAR_REF;
532
2
      default:
533
2
        *nextTokPtr = ptr;
534
2
        return XML_TOK_INVALID;
535
43.4k
      }
536
43.4k
    }
537
11.6k
  }
538
18
  return XML_TOK_PARTIAL;
539
38.1k
}
xmltok.c:normal_scanCharRef
Line
Count
Source
514
38.1k
                    const char **nextTokPtr) {
515
38.1k
  if (HAS_CHAR(enc, ptr, end)) {
516
38.1k
    if (CHAR_MATCHES(enc, ptr, ASCII_x))
517
26.4k
      return PREFIX(scanHexCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
518
11.6k
    switch (BYTE_TYPE(enc, ptr)) {
519
11.6k
    case BT_DIGIT:
520
11.6k
      break;
521
14
    default:
522
14
      *nextTokPtr = ptr;
523
14
      return XML_TOK_INVALID;
524
11.6k
    }
525
43.4k
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
526
43.4k
      switch (BYTE_TYPE(enc, ptr)) {
527
31.7k
      case BT_DIGIT:
528
31.7k
        break;
529
11.6k
      case BT_SEMI:
530
11.6k
        *nextTokPtr = ptr + MINBPC(enc);
531
11.6k
        return XML_TOK_CHAR_REF;
532
2
      default:
533
2
        *nextTokPtr = ptr;
534
2
        return XML_TOK_INVALID;
535
43.4k
      }
536
43.4k
    }
537
11.6k
  }
538
18
  return XML_TOK_PARTIAL;
539
38.1k
}
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
123k
                const char **nextTokPtr) {
546
123k
  REQUIRE_CHAR(enc, ptr, end);
547
123k
  switch (BYTE_TYPE(enc, ptr)) {
548
56.0k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
549
38.1k
  case BT_NUM:
550
38.1k
    return PREFIX(scanCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
551
9
  default:
552
9
    *nextTokPtr = ptr;
553
9
    return XML_TOK_INVALID;
554
123k
  }
555
317k
  while (HAS_CHAR(enc, ptr, end)) {
556
317k
    switch (BYTE_TYPE(enc, ptr)) {
557
802k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
558
85.2k
    case BT_SEMI:
559
85.2k
      *nextTokPtr = ptr + MINBPC(enc);
560
85.2k
      return XML_TOK_ENTITY_REF;
561
16
    default:
562
16
      *nextTokPtr = ptr;
563
16
      return XML_TOK_INVALID;
564
317k
    }
565
317k
  }
566
82
  return XML_TOK_PARTIAL;
567
85.3k
}
xmltok.c:normal_scanRef
Line
Count
Source
545
123k
                const char **nextTokPtr) {
546
123k
  REQUIRE_CHAR(enc, ptr, end);
547
123k
  switch (BYTE_TYPE(enc, ptr)) {
548
56.0k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
549
38.1k
  case BT_NUM:
550
38.1k
    return PREFIX(scanCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
551
9
  default:
552
9
    *nextTokPtr = ptr;
553
9
    return XML_TOK_INVALID;
554
123k
  }
555
317k
  while (HAS_CHAR(enc, ptr, end)) {
556
317k
    switch (BYTE_TYPE(enc, ptr)) {
557
802k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
558
85.2k
    case BT_SEMI:
559
85.2k
      *nextTokPtr = ptr + MINBPC(enc);
560
85.2k
      return XML_TOK_ENTITY_REF;
561
16
    default:
562
16
      *nextTokPtr = ptr;
563
16
      return XML_TOK_INVALID;
564
317k
    }
565
317k
  }
566
82
  return XML_TOK_PARTIAL;
567
85.3k
}
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
70.4k
                 const char **nextTokPtr) {
574
#  ifdef XML_NS
575
  int hadColon = 0;
576
#  endif
577
2.01M
  while (HAS_CHAR(enc, ptr, end)) {
578
2.01M
    switch (BYTE_TYPE(enc, ptr)) {
579
1.80M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
580
#  ifdef XML_NS
581
    case BT_COLON:
582
      if (hadColon) {
583
        *nextTokPtr = ptr;
584
        return XML_TOK_INVALID;
585
      }
586
      hadColon = 1;
587
      ptr += MINBPC(enc);
588
      REQUIRE_CHAR(enc, ptr, end);
589
      switch (BYTE_TYPE(enc, ptr)) {
590
        CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
591
      default:
592
        *nextTokPtr = ptr;
593
        return XML_TOK_INVALID;
594
      }
595
      break;
596
#  endif
597
1.93k
    case BT_S:
598
15.7k
    case BT_CR:
599
19.3k
    case BT_LF:
600
44.3k
      for (;;) {
601
44.3k
        int t;
602
603
44.3k
        ptr += MINBPC(enc);
604
44.3k
        REQUIRE_CHAR(enc, ptr, end);
605
44.3k
        t = BYTE_TYPE(enc, ptr);
606
44.3k
        if (t == BT_EQUALS)
607
19.2k
          break;
608
25.0k
        switch (t) {
609
3.64k
        case BT_S:
610
6.65k
        case BT_LF:
611
25.0k
        case BT_CR:
612
25.0k
          break;
613
12
        default:
614
12
          *nextTokPtr = ptr;
615
12
          return XML_TOK_INVALID;
616
25.0k
        }
617
25.0k
      }
618
      /* fall through */
619
1.48M
    case BT_EQUALS: {
620
1.48M
      int open;
621
#  ifdef XML_NS
622
      hadColon = 0;
623
#  endif
624
1.54M
      for (;;) {
625
1.54M
        ptr += MINBPC(enc);
626
1.54M
        REQUIRE_CHAR(enc, ptr, end);
627
1.54M
        open = BYTE_TYPE(enc, ptr);
628
1.54M
        if (open == BT_QUOT || open == BT_APOS)
629
1.48M
          break;
630
51.7k
        switch (open) {
631
8.72k
        case BT_S:
632
21.5k
        case BT_LF:
633
51.6k
        case BT_CR:
634
51.6k
          break;
635
18
        default:
636
18
          *nextTokPtr = ptr;
637
18
          return XML_TOK_INVALID;
638
51.7k
        }
639
51.7k
      }
640
1.48M
      ptr += MINBPC(enc);
641
      /* in attribute value */
642
19.4M
      for (;;) {
643
19.4M
        int t;
644
19.4M
        REQUIRE_CHAR(enc, ptr, end);
645
19.4M
        t = BYTE_TYPE(enc, ptr);
646
19.4M
        if (t == open)
647
1.48M
          break;
648
17.9M
        switch (t) {
649
171k
          INVALID_CASES(ptr, nextTokPtr)
650
20.2k
        case BT_AMP: {
651
20.2k
          int tok = PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, &ptr);
652
20.2k
          if (tok <= 0) {
653
46
            if (tok == XML_TOK_INVALID)
654
20
              *nextTokPtr = ptr;
655
46
            return tok;
656
46
          }
657
20.1k
          break;
658
20.2k
        }
659
20.1k
        case BT_LT:
660
8
          *nextTokPtr = ptr;
661
8
          return XML_TOK_INVALID;
662
17.8M
        default:
663
17.8M
          ptr += MINBPC(enc);
664
17.8M
          break;
665
17.9M
        }
666
17.9M
      }
667
1.48M
      ptr += MINBPC(enc);
668
1.48M
      REQUIRE_CHAR(enc, ptr, end);
669
1.48M
      switch (BYTE_TYPE(enc, ptr)) {
670
773k
      case BT_S:
671
1.41M
      case BT_CR:
672
1.45M
      case BT_LF:
673
1.45M
        break;
674
22.7k
      case BT_SOL:
675
22.7k
        goto sol;
676
10.5k
      case BT_GT:
677
10.5k
        goto gt;
678
6
      default:
679
6
        *nextTokPtr = ptr;
680
6
        return XML_TOK_INVALID;
681
1.48M
      }
682
      /* ptr points to closing quote */
683
1.58M
      for (;;) {
684
1.58M
        ptr += MINBPC(enc);
685
1.58M
        REQUIRE_CHAR(enc, ptr, end);
686
1.58M
        switch (BYTE_TYPE(enc, ptr)) {
687
1.42M
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
688
92.2k
        case BT_S:
689
115k
        case BT_CR:
690
133k
        case BT_LF:
691
133k
          continue;
692
379
        case BT_GT:
693
10.8k
        gt:
694
10.8k
          *nextTokPtr = ptr + MINBPC(enc);
695
10.8k
          return XML_TOK_START_TAG_WITH_ATTS;
696
36.0k
        case BT_SOL:
697
58.8k
        sol:
698
58.8k
          ptr += MINBPC(enc);
699
58.8k
          REQUIRE_CHAR(enc, ptr, end);
700
58.7k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
701
9
            *nextTokPtr = ptr;
702
9
            return XML_TOK_INVALID;
703
9
          }
704
58.7k
          *nextTokPtr = ptr + MINBPC(enc);
705
58.7k
          return XML_TOK_EMPTY_ELEMENT_WITH_ATTS;
706
7
        default:
707
7
          *nextTokPtr = ptr;
708
7
          return XML_TOK_INVALID;
709
1.58M
        }
710
1.41M
        break;
711
1.58M
      }
712
1.41M
      break;
713
1.45M
    }
714
1.41M
    default:
715
19
      *nextTokPtr = ptr;
716
19
      return XML_TOK_INVALID;
717
2.01M
    }
718
2.01M
  }
719
110
  return XML_TOK_PARTIAL;
720
70.4k
}
xmltok.c:normal_scanAtts
Line
Count
Source
573
70.4k
                 const char **nextTokPtr) {
574
#  ifdef XML_NS
575
  int hadColon = 0;
576
#  endif
577
2.01M
  while (HAS_CHAR(enc, ptr, end)) {
578
2.01M
    switch (BYTE_TYPE(enc, ptr)) {
579
1.80M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
580
#  ifdef XML_NS
581
    case BT_COLON:
582
      if (hadColon) {
583
        *nextTokPtr = ptr;
584
        return XML_TOK_INVALID;
585
      }
586
      hadColon = 1;
587
      ptr += MINBPC(enc);
588
      REQUIRE_CHAR(enc, ptr, end);
589
      switch (BYTE_TYPE(enc, ptr)) {
590
        CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
591
      default:
592
        *nextTokPtr = ptr;
593
        return XML_TOK_INVALID;
594
      }
595
      break;
596
#  endif
597
1.93k
    case BT_S:
598
15.7k
    case BT_CR:
599
19.3k
    case BT_LF:
600
44.3k
      for (;;) {
601
44.3k
        int t;
602
603
44.3k
        ptr += MINBPC(enc);
604
44.3k
        REQUIRE_CHAR(enc, ptr, end);
605
44.3k
        t = BYTE_TYPE(enc, ptr);
606
44.3k
        if (t == BT_EQUALS)
607
19.2k
          break;
608
25.0k
        switch (t) {
609
3.64k
        case BT_S:
610
6.65k
        case BT_LF:
611
25.0k
        case BT_CR:
612
25.0k
          break;
613
12
        default:
614
12
          *nextTokPtr = ptr;
615
12
          return XML_TOK_INVALID;
616
25.0k
        }
617
25.0k
      }
618
      /* fall through */
619
1.48M
    case BT_EQUALS: {
620
1.48M
      int open;
621
#  ifdef XML_NS
622
      hadColon = 0;
623
#  endif
624
1.54M
      for (;;) {
625
1.54M
        ptr += MINBPC(enc);
626
1.54M
        REQUIRE_CHAR(enc, ptr, end);
627
1.54M
        open = BYTE_TYPE(enc, ptr);
628
1.54M
        if (open == BT_QUOT || open == BT_APOS)
629
1.48M
          break;
630
51.7k
        switch (open) {
631
8.72k
        case BT_S:
632
21.5k
        case BT_LF:
633
51.6k
        case BT_CR:
634
51.6k
          break;
635
18
        default:
636
18
          *nextTokPtr = ptr;
637
18
          return XML_TOK_INVALID;
638
51.7k
        }
639
51.7k
      }
640
1.48M
      ptr += MINBPC(enc);
641
      /* in attribute value */
642
19.4M
      for (;;) {
643
19.4M
        int t;
644
19.4M
        REQUIRE_CHAR(enc, ptr, end);
645
19.4M
        t = BYTE_TYPE(enc, ptr);
646
19.4M
        if (t == open)
647
1.48M
          break;
648
17.9M
        switch (t) {
649
171k
          INVALID_CASES(ptr, nextTokPtr)
650
20.2k
        case BT_AMP: {
651
20.2k
          int tok = PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, &ptr);
652
20.2k
          if (tok <= 0) {
653
46
            if (tok == XML_TOK_INVALID)
654
20
              *nextTokPtr = ptr;
655
46
            return tok;
656
46
          }
657
20.1k
          break;
658
20.2k
        }
659
20.1k
        case BT_LT:
660
8
          *nextTokPtr = ptr;
661
8
          return XML_TOK_INVALID;
662
17.8M
        default:
663
17.8M
          ptr += MINBPC(enc);
664
17.8M
          break;
665
17.9M
        }
666
17.9M
      }
667
1.48M
      ptr += MINBPC(enc);
668
1.48M
      REQUIRE_CHAR(enc, ptr, end);
669
1.48M
      switch (BYTE_TYPE(enc, ptr)) {
670
773k
      case BT_S:
671
1.41M
      case BT_CR:
672
1.45M
      case BT_LF:
673
1.45M
        break;
674
22.7k
      case BT_SOL:
675
22.7k
        goto sol;
676
10.5k
      case BT_GT:
677
10.5k
        goto gt;
678
6
      default:
679
6
        *nextTokPtr = ptr;
680
6
        return XML_TOK_INVALID;
681
1.48M
      }
682
      /* ptr points to closing quote */
683
1.58M
      for (;;) {
684
1.58M
        ptr += MINBPC(enc);
685
1.58M
        REQUIRE_CHAR(enc, ptr, end);
686
1.58M
        switch (BYTE_TYPE(enc, ptr)) {
687
1.42M
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
688
92.2k
        case BT_S:
689
115k
        case BT_CR:
690
133k
        case BT_LF:
691
133k
          continue;
692
379
        case BT_GT:
693
10.8k
        gt:
694
10.8k
          *nextTokPtr = ptr + MINBPC(enc);
695
10.8k
          return XML_TOK_START_TAG_WITH_ATTS;
696
36.0k
        case BT_SOL:
697
58.8k
        sol:
698
58.8k
          ptr += MINBPC(enc);
699
58.8k
          REQUIRE_CHAR(enc, ptr, end);
700
58.7k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
701
9
            *nextTokPtr = ptr;
702
9
            return XML_TOK_INVALID;
703
9
          }
704
58.7k
          *nextTokPtr = ptr + MINBPC(enc);
705
58.7k
          return XML_TOK_EMPTY_ELEMENT_WITH_ATTS;
706
7
        default:
707
7
          *nextTokPtr = ptr;
708
7
          return XML_TOK_INVALID;
709
1.58M
        }
710
1.41M
        break;
711
1.58M
      }
712
1.41M
      break;
713
1.45M
    }
714
1.41M
    default:
715
19
      *nextTokPtr = ptr;
716
19
      return XML_TOK_INVALID;
717
2.01M
    }
718
2.01M
  }
719
110
  return XML_TOK_PARTIAL;
720
70.4k
}
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.22M
               const char **nextTokPtr) {
727
#  ifdef XML_NS
728
  int hadColon;
729
#  endif
730
1.22M
  REQUIRE_CHAR(enc, ptr, end);
731
1.22M
  switch (BYTE_TYPE(enc, ptr)) {
732
932k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
733
32.9k
  case BT_EXCL:
734
32.9k
    ptr += MINBPC(enc);
735
32.9k
    REQUIRE_CHAR(enc, ptr, end);
736
32.9k
    switch (BYTE_TYPE(enc, ptr)) {
737
30.5k
    case BT_MINUS:
738
30.5k
      return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
739
2.47k
    case BT_LSQB:
740
2.47k
      return PREFIX(scanCdataSection)(enc, ptr + MINBPC(enc), end, nextTokPtr);
741
32.9k
    }
742
2
    *nextTokPtr = ptr;
743
2
    return XML_TOK_INVALID;
744
38.0k
  case BT_QUEST:
745
38.0k
    return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
746
165k
  case BT_SOL:
747
165k
    return PREFIX(scanEndTag)(enc, ptr + MINBPC(enc), end, nextTokPtr);
748
14
  default:
749
14
    *nextTokPtr = ptr;
750
14
    return XML_TOK_INVALID;
751
1.22M
  }
752
#  ifdef XML_NS
753
  hadColon = 0;
754
#  endif
755
  /* we have a start-tag */
756
9.45M
  while (HAS_CHAR(enc, ptr, end)) {
757
9.45M
    switch (BYTE_TYPE(enc, ptr)) {
758
30.4M
      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
64.7k
    case BT_S:
777
74.8k
    case BT_CR:
778
79.1k
    case BT_LF: {
779
79.1k
      ptr += MINBPC(enc);
780
106k
      while (HAS_CHAR(enc, ptr, end)) {
781
106k
        switch (BYTE_TYPE(enc, ptr)) {
782
55.7k
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
783
2.53k
        case BT_GT:
784
2.53k
          goto gt;
785
6.08k
        case BT_SOL:
786
6.08k
          goto sol;
787
1.94k
        case BT_S:
788
22.9k
        case BT_CR:
789
27.2k
        case BT_LF:
790
27.2k
          ptr += MINBPC(enc);
791
27.2k
          continue;
792
1
        default:
793
1
          *nextTokPtr = ptr;
794
1
          return XML_TOK_INVALID;
795
106k
        }
796
70.4k
        return PREFIX(scanAtts)(enc, ptr, end, nextTokPtr);
797
106k
      }
798
60
      return XML_TOK_PARTIAL;
799
79.1k
    }
800
873k
    case BT_GT:
801
876k
    gt:
802
876k
      *nextTokPtr = ptr + MINBPC(enc);
803
876k
      return XML_TOK_START_TAG_NO_ATTS;
804
34.9k
    case BT_SOL:
805
41.0k
    sol:
806
41.0k
      ptr += MINBPC(enc);
807
41.0k
      REQUIRE_CHAR(enc, ptr, end);
808
41.0k
      if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
809
10
        *nextTokPtr = ptr;
810
10
        return XML_TOK_INVALID;
811
10
      }
812
41.0k
      *nextTokPtr = ptr + MINBPC(enc);
813
41.0k
      return XML_TOK_EMPTY_ELEMENT_NO_ATTS;
814
24
    default:
815
24
      *nextTokPtr = ptr;
816
24
      return XML_TOK_INVALID;
817
9.45M
    }
818
9.45M
  }
819
178
  return XML_TOK_PARTIAL;
820
988k
}
xmltok.c:normal_scanLt
Line
Count
Source
726
1.22M
               const char **nextTokPtr) {
727
#  ifdef XML_NS
728
  int hadColon;
729
#  endif
730
1.22M
  REQUIRE_CHAR(enc, ptr, end);
731
1.22M
  switch (BYTE_TYPE(enc, ptr)) {
732
932k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
733
32.9k
  case BT_EXCL:
734
32.9k
    ptr += MINBPC(enc);
735
32.9k
    REQUIRE_CHAR(enc, ptr, end);
736
32.9k
    switch (BYTE_TYPE(enc, ptr)) {
737
30.5k
    case BT_MINUS:
738
30.5k
      return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
739
2.47k
    case BT_LSQB:
740
2.47k
      return PREFIX(scanCdataSection)(enc, ptr + MINBPC(enc), end, nextTokPtr);
741
32.9k
    }
742
2
    *nextTokPtr = ptr;
743
2
    return XML_TOK_INVALID;
744
38.0k
  case BT_QUEST:
745
38.0k
    return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
746
165k
  case BT_SOL:
747
165k
    return PREFIX(scanEndTag)(enc, ptr + MINBPC(enc), end, nextTokPtr);
748
14
  default:
749
14
    *nextTokPtr = ptr;
750
14
    return XML_TOK_INVALID;
751
1.22M
  }
752
#  ifdef XML_NS
753
  hadColon = 0;
754
#  endif
755
  /* we have a start-tag */
756
9.45M
  while (HAS_CHAR(enc, ptr, end)) {
757
9.45M
    switch (BYTE_TYPE(enc, ptr)) {
758
30.4M
      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
64.7k
    case BT_S:
777
74.8k
    case BT_CR:
778
79.1k
    case BT_LF: {
779
79.1k
      ptr += MINBPC(enc);
780
106k
      while (HAS_CHAR(enc, ptr, end)) {
781
106k
        switch (BYTE_TYPE(enc, ptr)) {
782
55.7k
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
783
2.53k
        case BT_GT:
784
2.53k
          goto gt;
785
6.08k
        case BT_SOL:
786
6.08k
          goto sol;
787
1.94k
        case BT_S:
788
22.9k
        case BT_CR:
789
27.2k
        case BT_LF:
790
27.2k
          ptr += MINBPC(enc);
791
27.2k
          continue;
792
1
        default:
793
1
          *nextTokPtr = ptr;
794
1
          return XML_TOK_INVALID;
795
106k
        }
796
70.4k
        return PREFIX(scanAtts)(enc, ptr, end, nextTokPtr);
797
106k
      }
798
60
      return XML_TOK_PARTIAL;
799
79.1k
    }
800
873k
    case BT_GT:
801
876k
    gt:
802
876k
      *nextTokPtr = ptr + MINBPC(enc);
803
876k
      return XML_TOK_START_TAG_NO_ATTS;
804
34.9k
    case BT_SOL:
805
41.0k
    sol:
806
41.0k
      ptr += MINBPC(enc);
807
41.0k
      REQUIRE_CHAR(enc, ptr, end);
808
41.0k
      if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
809
10
        *nextTokPtr = ptr;
810
10
        return XML_TOK_INVALID;
811
10
      }
812
41.0k
      *nextTokPtr = ptr + MINBPC(enc);
813
41.0k
      return XML_TOK_EMPTY_ELEMENT_NO_ATTS;
814
24
    default:
815
24
      *nextTokPtr = ptr;
816
24
      return XML_TOK_INVALID;
817
9.45M
    }
818
9.45M
  }
819
178
  return XML_TOK_PARTIAL;
820
988k
}
Unexecuted instantiation: xmltok.c:little2_scanLt
Unexecuted instantiation: xmltok.c:big2_scanLt
821
822
static int PTRCALL
823
PREFIX(contentTok)(const ENCODING *enc, const char *ptr, const char *end,
824
4.19M
                   const char **nextTokPtr) {
825
4.19M
  if (ptr >= end)
826
3.94k
    return XML_TOK_NONE;
827
4.19M
  if (MINBPC(enc) > 1) {
828
0
    size_t n = end - ptr;
829
0
    if (n & (MINBPC(enc) - 1)) {
830
0
      n &= ~(MINBPC(enc) - 1);
831
0
      if (n == 0)
832
0
        return XML_TOK_PARTIAL;
833
0
      end = ptr + n;
834
0
    }
835
0
  }
836
4.19M
  switch (BYTE_TYPE(enc, ptr)) {
837
1.22M
  case BT_LT:
838
1.22M
    return PREFIX(scanLt)(enc, ptr + MINBPC(enc), end, nextTokPtr);
839
33.0k
  case BT_AMP:
840
33.0k
    return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
841
1.30M
  case BT_CR:
842
1.30M
    ptr += MINBPC(enc);
843
1.30M
    if (! HAS_CHAR(enc, ptr, end))
844
18
      return XML_TOK_TRAILING_CR;
845
1.30M
    if (BYTE_TYPE(enc, ptr) == BT_LF)
846
180k
      ptr += MINBPC(enc);
847
1.30M
    *nextTokPtr = ptr;
848
1.30M
    return XML_TOK_DATA_NEWLINE;
849
749k
  case BT_LF:
850
749k
    *nextTokPtr = ptr + MINBPC(enc);
851
749k
    return XML_TOK_DATA_NEWLINE;
852
191k
  case BT_RSQB:
853
191k
    ptr += MINBPC(enc);
854
191k
    if (! HAS_CHAR(enc, ptr, end))
855
18
      return XML_TOK_TRAILING_RSQB;
856
191k
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
857
37.1k
      break;
858
154k
    ptr += MINBPC(enc);
859
154k
    if (! HAS_CHAR(enc, ptr, end))
860
4
      return XML_TOK_TRAILING_RSQB;
861
154k
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
862
154k
      ptr -= MINBPC(enc);
863
154k
      break;
864
154k
    }
865
1
    *nextTokPtr = ptr;
866
1
    return XML_TOK_INVALID;
867
83.4k
    INVALID_CASES(ptr, nextTokPtr)
868
641k
  default:
869
641k
    ptr += MINBPC(enc);
870
641k
    break;
871
4.19M
  }
872
14.8M
  while (HAS_CHAR(enc, ptr, end)) {
873
14.8M
    switch (BYTE_TYPE(enc, ptr)) {
874
0
#  define LEAD_CASE(n)                                                         \
875
129k
  case BT_LEAD##n:                                                             \
876
129k
    if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) {                       \
877
37
      *nextTokPtr = ptr;                                                       \
878
37
      return XML_TOK_DATA_CHARS;                                               \
879
37
    }                                                                          \
880
129k
    ptr += n;                                                                  \
881
129k
    break;
882
75.2k
      LEAD_CASE(2)
883
26.8k
      LEAD_CASE(3)
884
27.0k
      LEAD_CASE(4)
885
0
#  undef LEAD_CASE
886
536k
    case BT_RSQB:
887
536k
      if (HAS_CHARS(enc, ptr, end, 2)) {
888
536k
        if (! CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_RSQB)) {
889
262k
          ptr += MINBPC(enc);
890
262k
          break;
891
262k
        }
892
273k
        if (HAS_CHARS(enc, ptr, end, 3)) {
893
273k
          if (! CHAR_MATCHES(enc, ptr + 2 * MINBPC(enc), ASCII_GT)) {
894
273k
            ptr += MINBPC(enc);
895
273k
            break;
896
273k
          }
897
1
          *nextTokPtr = ptr + 2 * MINBPC(enc);
898
1
          return XML_TOK_INVALID;
899
273k
        }
900
273k
      }
901
      /* fall through */
902
19.5k
    case BT_AMP:
903
204k
    case BT_LT:
904
204k
    case BT_NONXML:
905
204k
    case BT_MALFORM:
906
204k
    case BT_TRAIL:
907
684k
    case BT_CR:
908
872k
    case BT_LF:
909
872k
      *nextTokPtr = ptr;
910
872k
      return XML_TOK_DATA_CHARS;
911
13.2M
    default:
912
13.2M
      ptr += MINBPC(enc);
913
13.2M
      break;
914
14.8M
    }
915
14.8M
  }
916
2.18k
  *nextTokPtr = ptr;
917
2.18k
  return XML_TOK_DATA_CHARS;
918
875k
}
xmltok.c:normal_contentTok
Line
Count
Source
824
4.19M
                   const char **nextTokPtr) {
825
4.19M
  if (ptr >= end)
826
3.94k
    return XML_TOK_NONE;
827
4.19M
  if (MINBPC(enc) > 1) {
828
0
    size_t n = end - ptr;
829
0
    if (n & (MINBPC(enc) - 1)) {
830
0
      n &= ~(MINBPC(enc) - 1);
831
0
      if (n == 0)
832
0
        return XML_TOK_PARTIAL;
833
0
      end = ptr + n;
834
0
    }
835
0
  }
836
4.19M
  switch (BYTE_TYPE(enc, ptr)) {
837
1.22M
  case BT_LT:
838
1.22M
    return PREFIX(scanLt)(enc, ptr + MINBPC(enc), end, nextTokPtr);
839
33.0k
  case BT_AMP:
840
33.0k
    return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
841
1.30M
  case BT_CR:
842
1.30M
    ptr += MINBPC(enc);
843
1.30M
    if (! HAS_CHAR(enc, ptr, end))
844
18
      return XML_TOK_TRAILING_CR;
845
1.30M
    if (BYTE_TYPE(enc, ptr) == BT_LF)
846
180k
      ptr += MINBPC(enc);
847
1.30M
    *nextTokPtr = ptr;
848
1.30M
    return XML_TOK_DATA_NEWLINE;
849
749k
  case BT_LF:
850
749k
    *nextTokPtr = ptr + MINBPC(enc);
851
749k
    return XML_TOK_DATA_NEWLINE;
852
191k
  case BT_RSQB:
853
191k
    ptr += MINBPC(enc);
854
191k
    if (! HAS_CHAR(enc, ptr, end))
855
18
      return XML_TOK_TRAILING_RSQB;
856
191k
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
857
37.1k
      break;
858
154k
    ptr += MINBPC(enc);
859
154k
    if (! HAS_CHAR(enc, ptr, end))
860
4
      return XML_TOK_TRAILING_RSQB;
861
154k
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
862
154k
      ptr -= MINBPC(enc);
863
154k
      break;
864
154k
    }
865
1
    *nextTokPtr = ptr;
866
1
    return XML_TOK_INVALID;
867
83.4k
    INVALID_CASES(ptr, nextTokPtr)
868
641k
  default:
869
641k
    ptr += MINBPC(enc);
870
641k
    break;
871
4.19M
  }
872
14.8M
  while (HAS_CHAR(enc, ptr, end)) {
873
14.8M
    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
75.2k
      LEAD_CASE(2)
883
26.8k
      LEAD_CASE(3)
884
27.0k
      LEAD_CASE(4)
885
0
#  undef LEAD_CASE
886
536k
    case BT_RSQB:
887
536k
      if (HAS_CHARS(enc, ptr, end, 2)) {
888
536k
        if (! CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_RSQB)) {
889
262k
          ptr += MINBPC(enc);
890
262k
          break;
891
262k
        }
892
273k
        if (HAS_CHARS(enc, ptr, end, 3)) {
893
273k
          if (! CHAR_MATCHES(enc, ptr + 2 * MINBPC(enc), ASCII_GT)) {
894
273k
            ptr += MINBPC(enc);
895
273k
            break;
896
273k
          }
897
1
          *nextTokPtr = ptr + 2 * MINBPC(enc);
898
1
          return XML_TOK_INVALID;
899
273k
        }
900
273k
      }
901
      /* fall through */
902
19.5k
    case BT_AMP:
903
204k
    case BT_LT:
904
204k
    case BT_NONXML:
905
204k
    case BT_MALFORM:
906
204k
    case BT_TRAIL:
907
684k
    case BT_CR:
908
872k
    case BT_LF:
909
872k
      *nextTokPtr = ptr;
910
872k
      return XML_TOK_DATA_CHARS;
911
13.2M
    default:
912
13.2M
      ptr += MINBPC(enc);
913
13.2M
      break;
914
14.8M
    }
915
14.8M
  }
916
2.18k
  *nextTokPtr = ptr;
917
2.18k
  return XML_TOK_DATA_CHARS;
918
875k
}
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
8.02k
                    const char **nextTokPtr) {
925
8.02k
  REQUIRE_CHAR(enc, ptr, end);
926
8.00k
  switch (BYTE_TYPE(enc, ptr)) {
927
7.31k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
928
416
  case BT_S:
929
1.98k
  case BT_LF:
930
2.46k
  case BT_CR:
931
2.46k
  case BT_PERCNT:
932
2.46k
    *nextTokPtr = ptr;
933
2.46k
    return XML_TOK_PERCENT;
934
1
  default:
935
1
    *nextTokPtr = ptr;
936
1
    return XML_TOK_INVALID;
937
8.00k
  }
938
94.8k
  while (HAS_CHAR(enc, ptr, end)) {
939
94.8k
    switch (BYTE_TYPE(enc, ptr)) {
940
248k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
941
5.31k
    case BT_SEMI:
942
5.31k
      *nextTokPtr = ptr + MINBPC(enc);
943
5.31k
      return XML_TOK_PARAM_ENTITY_REF;
944
17
    default:
945
17
      *nextTokPtr = ptr;
946
17
      return XML_TOK_INVALID;
947
94.8k
    }
948
94.8k
  }
949
98
  return XML_TOK_PARTIAL;
950
5.48k
}
xmltok.c:normal_scanPercent
Line
Count
Source
924
8.02k
                    const char **nextTokPtr) {
925
8.02k
  REQUIRE_CHAR(enc, ptr, end);
926
8.00k
  switch (BYTE_TYPE(enc, ptr)) {
927
7.31k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
928
416
  case BT_S:
929
1.98k
  case BT_LF:
930
2.46k
  case BT_CR:
931
2.46k
  case BT_PERCNT:
932
2.46k
    *nextTokPtr = ptr;
933
2.46k
    return XML_TOK_PERCENT;
934
1
  default:
935
1
    *nextTokPtr = ptr;
936
1
    return XML_TOK_INVALID;
937
8.00k
  }
938
94.8k
  while (HAS_CHAR(enc, ptr, end)) {
939
94.8k
    switch (BYTE_TYPE(enc, ptr)) {
940
248k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
941
5.31k
    case BT_SEMI:
942
5.31k
      *nextTokPtr = ptr + MINBPC(enc);
943
5.31k
      return XML_TOK_PARAM_ENTITY_REF;
944
17
    default:
945
17
      *nextTokPtr = ptr;
946
17
      return XML_TOK_INVALID;
947
94.8k
    }
948
94.8k
  }
949
98
  return XML_TOK_PARTIAL;
950
5.48k
}
Unexecuted instantiation: xmltok.c:little2_scanPercent
Unexecuted instantiation: xmltok.c:big2_scanPercent
951
952
static int PTRCALL
953
PREFIX(scanPoundName)(const ENCODING *enc, const char *ptr, const char *end,
954
257k
                      const char **nextTokPtr) {
955
257k
  REQUIRE_CHAR(enc, ptr, end);
956
257k
  switch (BYTE_TYPE(enc, ptr)) {
957
257k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
958
5
  default:
959
5
    *nextTokPtr = ptr;
960
5
    return XML_TOK_INVALID;
961
257k
  }
962
1.89M
  while (HAS_CHAR(enc, ptr, end)) {
963
1.89M
    switch (BYTE_TYPE(enc, ptr)) {
964
5.94M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
965
35.3k
    case BT_CR:
966
40.3k
    case BT_LF:
967
253k
    case BT_S:
968
253k
    case BT_RPAR:
969
256k
    case BT_GT:
970
256k
    case BT_PERCNT:
971
257k
    case BT_VERBAR:
972
257k
      *nextTokPtr = ptr;
973
257k
      return XML_TOK_POUND_NAME;
974
21
    default:
975
21
      *nextTokPtr = ptr;
976
21
      return XML_TOK_INVALID;
977
1.89M
    }
978
1.89M
  }
979
234
  return -XML_TOK_POUND_NAME;
980
257k
}
xmltok.c:normal_scanPoundName
Line
Count
Source
954
257k
                      const char **nextTokPtr) {
955
257k
  REQUIRE_CHAR(enc, ptr, end);
956
257k
  switch (BYTE_TYPE(enc, ptr)) {
957
257k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
958
5
  default:
959
5
    *nextTokPtr = ptr;
960
5
    return XML_TOK_INVALID;
961
257k
  }
962
1.89M
  while (HAS_CHAR(enc, ptr, end)) {
963
1.89M
    switch (BYTE_TYPE(enc, ptr)) {
964
5.94M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
965
35.3k
    case BT_CR:
966
40.3k
    case BT_LF:
967
253k
    case BT_S:
968
253k
    case BT_RPAR:
969
256k
    case BT_GT:
970
256k
    case BT_PERCNT:
971
257k
    case BT_VERBAR:
972
257k
      *nextTokPtr = ptr;
973
257k
      return XML_TOK_POUND_NAME;
974
21
    default:
975
21
      *nextTokPtr = ptr;
976
21
      return XML_TOK_INVALID;
977
1.89M
    }
978
1.89M
  }
979
234
  return -XML_TOK_POUND_NAME;
980
257k
}
Unexecuted instantiation: xmltok.c:little2_scanPoundName
Unexecuted instantiation: xmltok.c:big2_scanPoundName
981
982
static int PTRCALL
983
PREFIX(scanLit)(int open, const ENCODING *enc, const char *ptr, const char *end,
984
62.4k
                const char **nextTokPtr) {
985
7.05M
  while (HAS_CHAR(enc, ptr, end)) {
986
7.05M
    int t = BYTE_TYPE(enc, ptr);
987
7.05M
    switch (t) {
988
80.3k
      INVALID_CASES(ptr, nextTokPtr)
989
9.88k
    case BT_QUOT:
990
65.4k
    case BT_APOS:
991
65.4k
      ptr += MINBPC(enc);
992
65.4k
      if (t != open)
993
3.15k
        break;
994
62.2k
      if (! HAS_CHAR(enc, ptr, end))
995
569
        return -XML_TOK_LITERAL;
996
61.6k
      *nextTokPtr = ptr;
997
61.6k
      switch (BYTE_TYPE(enc, ptr)) {
998
9.48k
      case BT_S:
999
12.3k
      case BT_CR:
1000
42.3k
      case BT_LF:
1001
61.4k
      case BT_GT:
1002
61.4k
      case BT_PERCNT:
1003
61.6k
      case BT_LSQB:
1004
61.6k
        return XML_TOK_LITERAL;
1005
17
      default:
1006
17
        return XML_TOK_INVALID;
1007
61.6k
      }
1008
6.95M
    default:
1009
6.95M
      ptr += MINBPC(enc);
1010
6.95M
      break;
1011
7.05M
    }
1012
7.05M
  }
1013
100
  return XML_TOK_PARTIAL;
1014
62.4k
}
xmltok.c:normal_scanLit
Line
Count
Source
984
62.4k
                const char **nextTokPtr) {
985
7.05M
  while (HAS_CHAR(enc, ptr, end)) {
986
7.05M
    int t = BYTE_TYPE(enc, ptr);
987
7.05M
    switch (t) {
988
80.3k
      INVALID_CASES(ptr, nextTokPtr)
989
9.88k
    case BT_QUOT:
990
65.4k
    case BT_APOS:
991
65.4k
      ptr += MINBPC(enc);
992
65.4k
      if (t != open)
993
3.15k
        break;
994
62.2k
      if (! HAS_CHAR(enc, ptr, end))
995
569
        return -XML_TOK_LITERAL;
996
61.6k
      *nextTokPtr = ptr;
997
61.6k
      switch (BYTE_TYPE(enc, ptr)) {
998
9.48k
      case BT_S:
999
12.3k
      case BT_CR:
1000
42.3k
      case BT_LF:
1001
61.4k
      case BT_GT:
1002
61.4k
      case BT_PERCNT:
1003
61.6k
      case BT_LSQB:
1004
61.6k
        return XML_TOK_LITERAL;
1005
17
      default:
1006
17
        return XML_TOK_INVALID;
1007
61.6k
      }
1008
6.95M
    default:
1009
6.95M
      ptr += MINBPC(enc);
1010
6.95M
      break;
1011
7.05M
    }
1012
7.05M
  }
1013
100
  return XML_TOK_PARTIAL;
1014
62.4k
}
Unexecuted instantiation: xmltok.c:little2_scanLit
Unexecuted instantiation: xmltok.c:big2_scanLit
1015
1016
static int PTRCALL
1017
PREFIX(prologTok)(const ENCODING *enc, const char *ptr, const char *end,
1018
3.72M
                  const char **nextTokPtr) {
1019
3.72M
  int tok;
1020
3.72M
  if (ptr >= end)
1021
7.18k
    return XML_TOK_NONE;
1022
3.72M
  if (MINBPC(enc) > 1) {
1023
260
    size_t n = end - ptr;
1024
260
    if (n & (MINBPC(enc) - 1)) {
1025
42
      n &= ~(MINBPC(enc) - 1);
1026
42
      if (n == 0)
1027
4
        return XML_TOK_PARTIAL;
1028
38
      end = ptr + n;
1029
38
    }
1030
260
  }
1031
3.72M
  switch (BYTE_TYPE(enc, ptr)) {
1032
8.09k
  case BT_QUOT:
1033
8.09k
    return PREFIX(scanLit)(BT_QUOT, enc, ptr + MINBPC(enc), end, nextTokPtr);
1034
54.3k
  case BT_APOS:
1035
54.3k
    return PREFIX(scanLit)(BT_APOS, enc, ptr + MINBPC(enc), end, nextTokPtr);
1036
68.6k
  case BT_LT: {
1037
68.6k
    ptr += MINBPC(enc);
1038
68.6k
    REQUIRE_CHAR(enc, ptr, end);
1039
68.6k
    switch (BYTE_TYPE(enc, ptr)) {
1040
48.5k
    case BT_EXCL:
1041
48.5k
      return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1042
14.4k
    case BT_QUEST:
1043
14.4k
      return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1044
4.23k
    case BT_NMSTRT:
1045
5.48k
    case BT_HEX:
1046
5.48k
    case BT_NONASCII:
1047
5.54k
    case BT_LEAD2:
1048
5.57k
    case BT_LEAD3:
1049
5.59k
    case BT_LEAD4:
1050
5.59k
      *nextTokPtr = ptr - MINBPC(enc);
1051
5.59k
      return XML_TOK_INSTANCE_START;
1052
68.6k
    }
1053
26
    *nextTokPtr = ptr;
1054
26
    return XML_TOK_INVALID;
1055
68.6k
  }
1056
358k
  case BT_CR:
1057
358k
    if (ptr + MINBPC(enc) == end) {
1058
449
      *nextTokPtr = end;
1059
      /* indicate that this might be part of a CR/LF pair */
1060
449
      return -XML_TOK_PROLOG_S;
1061
449
    }
1062
    /* fall through */
1063
923k
  case BT_S:
1064
1.02M
  case BT_LF:
1065
1.47M
    for (;;) {
1066
1.47M
      ptr += MINBPC(enc);
1067
1.47M
      if (! HAS_CHAR(enc, ptr, end))
1068
255
        break;
1069
1.47M
      switch (BYTE_TYPE(enc, ptr)) {
1070
425k
      case BT_S:
1071
442k
      case BT_LF:
1072
442k
        break;
1073
5.59k
      case BT_CR:
1074
        /* don't split CR/LF pair */
1075
5.59k
        if (ptr + MINBPC(enc) != end)
1076
5.38k
          break;
1077
        /* fall through */
1078
1.02M
      default:
1079
1.02M
        *nextTokPtr = ptr;
1080
1.02M
        return XML_TOK_PROLOG_S;
1081
1.47M
      }
1082
1.47M
    }
1083
255
    *nextTokPtr = ptr;
1084
255
    return XML_TOK_PROLOG_S;
1085
8.02k
  case BT_PERCNT:
1086
8.02k
    return PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1087
4.81k
  case BT_COMMA:
1088
4.81k
    *nextTokPtr = ptr + MINBPC(enc);
1089
4.81k
    return XML_TOK_COMMA;
1090
2.65k
  case BT_LSQB:
1091
2.65k
    *nextTokPtr = ptr + MINBPC(enc);
1092
2.65k
    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
7
      return -XML_TOK_CLOSE_BRACKET;
1097
1.13k
    if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) {
1098
30
      REQUIRE_CHARS(enc, ptr, end, 2);
1099
28
      if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_GT)) {
1100
5
        *nextTokPtr = ptr + 2 * MINBPC(enc);
1101
5
        return XML_TOK_COND_SECT_CLOSE;
1102
5
      }
1103
28
    }
1104
1.13k
    *nextTokPtr = ptr;
1105
1.13k
    return XML_TOK_CLOSE_BRACKET;
1106
1.24M
  case BT_LPAR:
1107
1.24M
    *nextTokPtr = ptr + MINBPC(enc);
1108
1.24M
    return XML_TOK_OPEN_PAREN;
1109
298k
  case BT_RPAR:
1110
298k
    ptr += MINBPC(enc);
1111
298k
    if (! HAS_CHAR(enc, ptr, end))
1112
99
      return -XML_TOK_CLOSE_PAREN;
1113
298k
    switch (BYTE_TYPE(enc, ptr)) {
1114
6.43k
    case BT_AST:
1115
6.43k
      *nextTokPtr = ptr + MINBPC(enc);
1116
6.43k
      return XML_TOK_CLOSE_PAREN_ASTERISK;
1117
4.78k
    case BT_QUEST:
1118
4.78k
      *nextTokPtr = ptr + MINBPC(enc);
1119
4.78k
      return XML_TOK_CLOSE_PAREN_QUESTION;
1120
4.78k
    case BT_PLUS:
1121
4.78k
      *nextTokPtr = ptr + MINBPC(enc);
1122
4.78k
      return XML_TOK_CLOSE_PAREN_PLUS;
1123
8.20k
    case BT_CR:
1124
8.90k
    case BT_LF:
1125
257k
    case BT_S:
1126
259k
    case BT_GT:
1127
259k
    case BT_COMMA:
1128
264k
    case BT_VERBAR:
1129
282k
    case BT_RPAR:
1130
282k
      *nextTokPtr = ptr;
1131
282k
      return XML_TOK_CLOSE_PAREN;
1132
298k
    }
1133
10
    *nextTokPtr = ptr;
1134
10
    return XML_TOK_INVALID;
1135
19.0k
  case BT_VERBAR:
1136
19.0k
    *nextTokPtr = ptr + MINBPC(enc);
1137
19.0k
    return XML_TOK_OR;
1138
42.3k
  case BT_GT:
1139
42.3k
    *nextTokPtr = ptr + MINBPC(enc);
1140
42.3k
    return XML_TOK_DECL_CLOSE;
1141
257k
  case BT_NUM:
1142
257k
    return PREFIX(scanPoundName)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1143
0
#  define LEAD_CASE(n)                                                         \
1144
4.08k
  case BT_LEAD##n:                                                             \
1145
4.08k
    if (end - ptr < n)                                                         \
1146
80
      return XML_TOK_PARTIAL_CHAR;                                             \
1147
4.00k
    if (IS_INVALID_CHAR(enc, ptr, n)) {                                        \
1148
86
      *nextTokPtr = ptr;                                                       \
1149
86
      return XML_TOK_INVALID;                                                  \
1150
86
    }                                                                          \
1151
4.00k
    if (IS_NMSTRT_CHAR(enc, ptr, n)) {                                         \
1152
3.50k
      ptr += n;                                                                \
1153
3.50k
      tok = XML_TOK_NAME;                                                      \
1154
3.50k
      break;                                                                   \
1155
3.50k
    }                                                                          \
1156
3.91k
    if (IS_NAME_CHAR(enc, ptr, n)) {                                           \
1157
335
      ptr += n;                                                                \
1158
335
      tok = XML_TOK_NMTOKEN;                                                   \
1159
335
      break;                                                                   \
1160
335
    }                                                                          \
1161
415
    *nextTokPtr = ptr;                                                         \
1162
80
    return XML_TOK_INVALID;
1163
3.40k
    LEAD_CASE(2)
1164
8.69k
    LEAD_CASE(3)
1165
320
    LEAD_CASE(4)
1166
0
#  undef LEAD_CASE
1167
382k
  case BT_NMSTRT:
1168
677k
  case BT_HEX:
1169
677k
    tok = XML_TOK_NAME;
1170
677k
    ptr += MINBPC(enc);
1171
677k
    break;
1172
633
  case BT_DIGIT:
1173
4.66k
  case BT_NAME:
1174
5.26k
  case BT_MINUS:
1175
#  ifdef XML_NS
1176
  case BT_COLON:
1177
#  endif
1178
5.26k
    tok = XML_TOK_NMTOKEN;
1179
5.26k
    ptr += MINBPC(enc);
1180
5.26k
    break;
1181
194
  case BT_NONASCII:
1182
194
    if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {
1183
149
      ptr += MINBPC(enc);
1184
149
      tok = XML_TOK_NAME;
1185
149
      break;
1186
149
    }
1187
45
    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
76
  default:
1194
76
    *nextTokPtr = ptr;
1195
76
    return XML_TOK_INVALID;
1196
3.72M
  }
1197
12.4M
  while (HAS_CHAR(enc, ptr, end)) {
1198
12.4M
    switch (BYTE_TYPE(enc, ptr)) {
1199
30.7M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1200
14.7k
    case BT_GT:
1201
278k
    case BT_RPAR:
1202
278k
    case BT_COMMA:
1203
286k
    case BT_VERBAR:
1204
288k
    case BT_LSQB:
1205
288k
    case BT_PERCNT:
1206
362k
    case BT_S:
1207
635k
    case BT_CR:
1208
679k
    case BT_LF:
1209
679k
      *nextTokPtr = ptr;
1210
679k
      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
341
    case BT_PLUS:
1232
341
      if (tok == XML_TOK_NMTOKEN) {
1233
2
        *nextTokPtr = ptr;
1234
2
        return XML_TOK_INVALID;
1235
2
      }
1236
339
      *nextTokPtr = ptr + MINBPC(enc);
1237
339
      return XML_TOK_NAME_PLUS;
1238
4.92k
    case BT_AST:
1239
4.92k
      if (tok == XML_TOK_NMTOKEN) {
1240
1
        *nextTokPtr = ptr;
1241
1
        return XML_TOK_INVALID;
1242
1
      }
1243
4.92k
      *nextTokPtr = ptr + MINBPC(enc);
1244
4.92k
      return XML_TOK_NAME_ASTERISK;
1245
429
    case BT_QUEST:
1246
429
      if (tok == XML_TOK_NMTOKEN) {
1247
1
        *nextTokPtr = ptr;
1248
1
        return XML_TOK_INVALID;
1249
1
      }
1250
428
      *nextTokPtr = ptr + MINBPC(enc);
1251
428
      return XML_TOK_NAME_QUESTION;
1252
73
    default:
1253
73
      *nextTokPtr = ptr;
1254
73
      return XML_TOK_INVALID;
1255
12.4M
    }
1256
12.4M
  }
1257
732
  return -tok;
1258
686k
}
xmltok.c:normal_prologTok
Line
Count
Source
1018
3.72M
                  const char **nextTokPtr) {
1019
3.72M
  int tok;
1020
3.72M
  if (ptr >= end)
1021
7.18k
    return XML_TOK_NONE;
1022
3.72M
  if (MINBPC(enc) > 1) {
1023
0
    size_t n = end - ptr;
1024
0
    if (n & (MINBPC(enc) - 1)) {
1025
0
      n &= ~(MINBPC(enc) - 1);
1026
0
      if (n == 0)
1027
0
        return XML_TOK_PARTIAL;
1028
0
      end = ptr + n;
1029
0
    }
1030
0
  }
1031
3.72M
  switch (BYTE_TYPE(enc, ptr)) {
1032
8.09k
  case BT_QUOT:
1033
8.09k
    return PREFIX(scanLit)(BT_QUOT, enc, ptr + MINBPC(enc), end, nextTokPtr);
1034
54.3k
  case BT_APOS:
1035
54.3k
    return PREFIX(scanLit)(BT_APOS, enc, ptr + MINBPC(enc), end, nextTokPtr);
1036
68.6k
  case BT_LT: {
1037
68.6k
    ptr += MINBPC(enc);
1038
68.6k
    REQUIRE_CHAR(enc, ptr, end);
1039
68.6k
    switch (BYTE_TYPE(enc, ptr)) {
1040
48.5k
    case BT_EXCL:
1041
48.5k
      return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1042
14.4k
    case BT_QUEST:
1043
14.4k
      return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1044
4.23k
    case BT_NMSTRT:
1045
5.48k
    case BT_HEX:
1046
5.48k
    case BT_NONASCII:
1047
5.54k
    case BT_LEAD2:
1048
5.57k
    case BT_LEAD3:
1049
5.59k
    case BT_LEAD4:
1050
5.59k
      *nextTokPtr = ptr - MINBPC(enc);
1051
5.59k
      return XML_TOK_INSTANCE_START;
1052
68.6k
    }
1053
26
    *nextTokPtr = ptr;
1054
26
    return XML_TOK_INVALID;
1055
68.6k
  }
1056
358k
  case BT_CR:
1057
358k
    if (ptr + MINBPC(enc) == end) {
1058
449
      *nextTokPtr = end;
1059
      /* indicate that this might be part of a CR/LF pair */
1060
449
      return -XML_TOK_PROLOG_S;
1061
449
    }
1062
    /* fall through */
1063
923k
  case BT_S:
1064
1.02M
  case BT_LF:
1065
1.47M
    for (;;) {
1066
1.47M
      ptr += MINBPC(enc);
1067
1.47M
      if (! HAS_CHAR(enc, ptr, end))
1068
255
        break;
1069
1.47M
      switch (BYTE_TYPE(enc, ptr)) {
1070
425k
      case BT_S:
1071
442k
      case BT_LF:
1072
442k
        break;
1073
5.59k
      case BT_CR:
1074
        /* don't split CR/LF pair */
1075
5.59k
        if (ptr + MINBPC(enc) != end)
1076
5.38k
          break;
1077
        /* fall through */
1078
1.02M
      default:
1079
1.02M
        *nextTokPtr = ptr;
1080
1.02M
        return XML_TOK_PROLOG_S;
1081
1.47M
      }
1082
1.47M
    }
1083
255
    *nextTokPtr = ptr;
1084
255
    return XML_TOK_PROLOG_S;
1085
8.02k
  case BT_PERCNT:
1086
8.02k
    return PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1087
4.81k
  case BT_COMMA:
1088
4.81k
    *nextTokPtr = ptr + MINBPC(enc);
1089
4.81k
    return XML_TOK_COMMA;
1090
2.65k
  case BT_LSQB:
1091
2.65k
    *nextTokPtr = ptr + MINBPC(enc);
1092
2.65k
    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
7
      return -XML_TOK_CLOSE_BRACKET;
1097
1.13k
    if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) {
1098
30
      REQUIRE_CHARS(enc, ptr, end, 2);
1099
28
      if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_GT)) {
1100
5
        *nextTokPtr = ptr + 2 * MINBPC(enc);
1101
5
        return XML_TOK_COND_SECT_CLOSE;
1102
5
      }
1103
28
    }
1104
1.13k
    *nextTokPtr = ptr;
1105
1.13k
    return XML_TOK_CLOSE_BRACKET;
1106
1.24M
  case BT_LPAR:
1107
1.24M
    *nextTokPtr = ptr + MINBPC(enc);
1108
1.24M
    return XML_TOK_OPEN_PAREN;
1109
298k
  case BT_RPAR:
1110
298k
    ptr += MINBPC(enc);
1111
298k
    if (! HAS_CHAR(enc, ptr, end))
1112
99
      return -XML_TOK_CLOSE_PAREN;
1113
298k
    switch (BYTE_TYPE(enc, ptr)) {
1114
6.43k
    case BT_AST:
1115
6.43k
      *nextTokPtr = ptr + MINBPC(enc);
1116
6.43k
      return XML_TOK_CLOSE_PAREN_ASTERISK;
1117
4.78k
    case BT_QUEST:
1118
4.78k
      *nextTokPtr = ptr + MINBPC(enc);
1119
4.78k
      return XML_TOK_CLOSE_PAREN_QUESTION;
1120
4.78k
    case BT_PLUS:
1121
4.78k
      *nextTokPtr = ptr + MINBPC(enc);
1122
4.78k
      return XML_TOK_CLOSE_PAREN_PLUS;
1123
8.20k
    case BT_CR:
1124
8.90k
    case BT_LF:
1125
257k
    case BT_S:
1126
259k
    case BT_GT:
1127
259k
    case BT_COMMA:
1128
264k
    case BT_VERBAR:
1129
282k
    case BT_RPAR:
1130
282k
      *nextTokPtr = ptr;
1131
282k
      return XML_TOK_CLOSE_PAREN;
1132
298k
    }
1133
10
    *nextTokPtr = ptr;
1134
10
    return XML_TOK_INVALID;
1135
19.0k
  case BT_VERBAR:
1136
19.0k
    *nextTokPtr = ptr + MINBPC(enc);
1137
19.0k
    return XML_TOK_OR;
1138
42.3k
  case BT_GT:
1139
42.3k
    *nextTokPtr = ptr + MINBPC(enc);
1140
42.3k
    return XML_TOK_DECL_CLOSE;
1141
257k
  case BT_NUM:
1142
257k
    return PREFIX(scanPoundName)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1143
0
#  define LEAD_CASE(n)                                                         \
1144
0
  case BT_LEAD##n:                                                             \
1145
0
    if (end - ptr < n)                                                         \
1146
0
      return XML_TOK_PARTIAL_CHAR;                                             \
1147
0
    if (IS_INVALID_CHAR(enc, ptr, n)) {                                        \
1148
0
      *nextTokPtr = ptr;                                                       \
1149
0
      return XML_TOK_INVALID;                                                  \
1150
0
    }                                                                          \
1151
0
    if (IS_NMSTRT_CHAR(enc, ptr, n)) {                                         \
1152
0
      ptr += n;                                                                \
1153
0
      tok = XML_TOK_NAME;                                                      \
1154
0
      break;                                                                   \
1155
0
    }                                                                          \
1156
0
    if (IS_NAME_CHAR(enc, ptr, n)) {                                           \
1157
0
      ptr += n;                                                                \
1158
0
      tok = XML_TOK_NMTOKEN;                                                   \
1159
0
      break;                                                                   \
1160
0
    }                                                                          \
1161
0
    *nextTokPtr = ptr;                                                         \
1162
0
    return XML_TOK_INVALID;
1163
3.40k
    LEAD_CASE(2)
1164
8.69k
    LEAD_CASE(3)
1165
178
    LEAD_CASE(4)
1166
0
#  undef LEAD_CASE
1167
382k
  case BT_NMSTRT:
1168
677k
  case BT_HEX:
1169
677k
    tok = XML_TOK_NAME;
1170
677k
    ptr += MINBPC(enc);
1171
677k
    break;
1172
633
  case BT_DIGIT:
1173
4.66k
  case BT_NAME:
1174
5.26k
  case BT_MINUS:
1175
#  ifdef XML_NS
1176
  case BT_COLON:
1177
#  endif
1178
5.26k
    tok = XML_TOK_NMTOKEN;
1179
5.26k
    ptr += MINBPC(enc);
1180
5.26k
    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
37
  default:
1194
37
    *nextTokPtr = ptr;
1195
37
    return XML_TOK_INVALID;
1196
3.72M
  }
1197
12.4M
  while (HAS_CHAR(enc, ptr, end)) {
1198
12.4M
    switch (BYTE_TYPE(enc, ptr)) {
1199
30.6M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1200
14.7k
    case BT_GT:
1201
278k
    case BT_RPAR:
1202
278k
    case BT_COMMA:
1203
286k
    case BT_VERBAR:
1204
288k
    case BT_LSQB:
1205
288k
    case BT_PERCNT:
1206
362k
    case BT_S:
1207
635k
    case BT_CR:
1208
679k
    case BT_LF:
1209
679k
      *nextTokPtr = ptr;
1210
679k
      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
341
    case BT_PLUS:
1232
341
      if (tok == XML_TOK_NMTOKEN) {
1233
2
        *nextTokPtr = ptr;
1234
2
        return XML_TOK_INVALID;
1235
2
      }
1236
339
      *nextTokPtr = ptr + MINBPC(enc);
1237
339
      return XML_TOK_NAME_PLUS;
1238
4.92k
    case BT_AST:
1239
4.92k
      if (tok == XML_TOK_NMTOKEN) {
1240
1
        *nextTokPtr = ptr;
1241
1
        return XML_TOK_INVALID;
1242
1
      }
1243
4.92k
      *nextTokPtr = ptr + MINBPC(enc);
1244
4.92k
      return XML_TOK_NAME_ASTERISK;
1245
429
    case BT_QUEST:
1246
429
      if (tok == XML_TOK_NMTOKEN) {
1247
1
        *nextTokPtr = ptr;
1248
1
        return XML_TOK_INVALID;
1249
1
      }
1250
428
      *nextTokPtr = ptr + MINBPC(enc);
1251
428
      return XML_TOK_NAME_QUESTION;
1252
49
    default:
1253
49
      *nextTokPtr = ptr;
1254
49
      return XML_TOK_INVALID;
1255
12.4M
    }
1256
12.4M
  }
1257
694
  return -tok;
1258
686k
}
xmltok.c:little2_prologTok
Line
Count
Source
1018
136
                  const char **nextTokPtr) {
1019
136
  int tok;
1020
136
  if (ptr >= end)
1021
2
    return XML_TOK_NONE;
1022
134
  if (MINBPC(enc) > 1) {
1023
134
    size_t n = end - ptr;
1024
134
    if (n & (MINBPC(enc) - 1)) {
1025
25
      n &= ~(MINBPC(enc) - 1);
1026
25
      if (n == 0)
1027
2
        return XML_TOK_PARTIAL;
1028
23
      end = ptr + n;
1029
23
    }
1030
134
  }
1031
132
  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
74
    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
99
  case BT_NONASCII:
1182
99
    if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {
1183
75
      ptr += MINBPC(enc);
1184
75
      tok = XML_TOK_NAME;
1185
75
      break;
1186
75
    }
1187
24
    if (IS_NAME_CHAR_MINBPC(enc, ptr)) {
1188
10
      ptr += MINBPC(enc);
1189
10
      tok = XML_TOK_NMTOKEN;
1190
10
      break;
1191
10
    }
1192
    /* fall through */
1193
21
  default:
1194
21
    *nextTokPtr = ptr;
1195
21
    return XML_TOK_INVALID;
1196
132
  }
1197
884
  while (HAS_CHAR(enc, ptr, end)) {
1198
884
    switch (BYTE_TYPE(enc, ptr)) {
1199
4.16k
      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
884
    }
1256
884
  }
1257
20
  return -tok;
1258
85
}
xmltok.c:big2_prologTok
Line
Count
Source
1018
128
                  const char **nextTokPtr) {
1019
128
  int tok;
1020
128
  if (ptr >= end)
1021
2
    return XML_TOK_NONE;
1022
126
  if (MINBPC(enc) > 1) {
1023
126
    size_t n = end - ptr;
1024
126
    if (n & (MINBPC(enc) - 1)) {
1025
17
      n &= ~(MINBPC(enc) - 1);
1026
17
      if (n == 0)
1027
2
        return XML_TOK_PARTIAL;
1028
15
      end = ptr + n;
1029
15
    }
1030
126
  }
1031
124
  switch (BYTE_TYPE(enc, ptr)) {
1032
0
  case BT_QUOT:
1033
0
    return PREFIX(scanLit)(BT_QUOT, enc, ptr + MINBPC(enc), end, nextTokPtr);
1034
0
  case BT_APOS:
1035
0
    return PREFIX(scanLit)(BT_APOS, enc, ptr + MINBPC(enc), end, nextTokPtr);
1036
0
  case BT_LT: {
1037
0
    ptr += MINBPC(enc);
1038
0
    REQUIRE_CHAR(enc, ptr, end);
1039
0
    switch (BYTE_TYPE(enc, ptr)) {
1040
0
    case BT_EXCL:
1041
0
      return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1042
0
    case BT_QUEST:
1043
0
      return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1044
0
    case BT_NMSTRT:
1045
0
    case BT_HEX:
1046
0
    case BT_NONASCII:
1047
0
    case BT_LEAD2:
1048
0
    case BT_LEAD3:
1049
0
    case BT_LEAD4:
1050
0
      *nextTokPtr = ptr - MINBPC(enc);
1051
0
      return XML_TOK_INSTANCE_START;
1052
0
    }
1053
0
    *nextTokPtr = ptr;
1054
0
    return XML_TOK_INVALID;
1055
0
  }
1056
0
  case BT_CR:
1057
0
    if (ptr + MINBPC(enc) == end) {
1058
0
      *nextTokPtr = end;
1059
      /* indicate that this might be part of a CR/LF pair */
1060
0
      return -XML_TOK_PROLOG_S;
1061
0
    }
1062
    /* fall through */
1063
0
  case BT_S:
1064
0
  case BT_LF:
1065
0
    for (;;) {
1066
0
      ptr += MINBPC(enc);
1067
0
      if (! HAS_CHAR(enc, ptr, end))
1068
0
        break;
1069
0
      switch (BYTE_TYPE(enc, ptr)) {
1070
0
      case BT_S:
1071
0
      case BT_LF:
1072
0
        break;
1073
0
      case BT_CR:
1074
        /* don't split CR/LF pair */
1075
0
        if (ptr + MINBPC(enc) != end)
1076
0
          break;
1077
        /* fall through */
1078
0
      default:
1079
0
        *nextTokPtr = ptr;
1080
0
        return XML_TOK_PROLOG_S;
1081
0
      }
1082
0
    }
1083
0
    *nextTokPtr = ptr;
1084
0
    return XML_TOK_PROLOG_S;
1085
0
  case BT_PERCNT:
1086
0
    return PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1087
0
  case BT_COMMA:
1088
0
    *nextTokPtr = ptr + MINBPC(enc);
1089
0
    return XML_TOK_COMMA;
1090
0
  case BT_LSQB:
1091
0
    *nextTokPtr = ptr + MINBPC(enc);
1092
0
    return XML_TOK_OPEN_BRACKET;
1093
0
  case BT_RSQB:
1094
0
    ptr += MINBPC(enc);
1095
0
    if (! HAS_CHAR(enc, ptr, end))
1096
0
      return -XML_TOK_CLOSE_BRACKET;
1097
0
    if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) {
1098
0
      REQUIRE_CHARS(enc, ptr, end, 2);
1099
0
      if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_GT)) {
1100
0
        *nextTokPtr = ptr + 2 * MINBPC(enc);
1101
0
        return XML_TOK_COND_SECT_CLOSE;
1102
0
      }
1103
0
    }
1104
0
    *nextTokPtr = ptr;
1105
0
    return XML_TOK_CLOSE_BRACKET;
1106
0
  case BT_LPAR:
1107
0
    *nextTokPtr = ptr + MINBPC(enc);
1108
0
    return XML_TOK_OPEN_PAREN;
1109
0
  case BT_RPAR:
1110
0
    ptr += MINBPC(enc);
1111
0
    if (! HAS_CHAR(enc, ptr, end))
1112
0
      return -XML_TOK_CLOSE_PAREN;
1113
0
    switch (BYTE_TYPE(enc, ptr)) {
1114
0
    case BT_AST:
1115
0
      *nextTokPtr = ptr + MINBPC(enc);
1116
0
      return XML_TOK_CLOSE_PAREN_ASTERISK;
1117
0
    case BT_QUEST:
1118
0
      *nextTokPtr = ptr + MINBPC(enc);
1119
0
      return XML_TOK_CLOSE_PAREN_QUESTION;
1120
0
    case BT_PLUS:
1121
0
      *nextTokPtr = ptr + MINBPC(enc);
1122
0
      return XML_TOK_CLOSE_PAREN_PLUS;
1123
0
    case BT_CR:
1124
0
    case BT_LF:
1125
0
    case BT_S:
1126
0
    case BT_GT:
1127
0
    case BT_COMMA:
1128
0
    case BT_VERBAR:
1129
0
    case BT_RPAR:
1130
0
      *nextTokPtr = ptr;
1131
0
      return XML_TOK_CLOSE_PAREN;
1132
0
    }
1133
0
    *nextTokPtr = ptr;
1134
0
    return XML_TOK_INVALID;
1135
0
  case BT_VERBAR:
1136
0
    *nextTokPtr = ptr + MINBPC(enc);
1137
0
    return XML_TOK_OR;
1138
0
  case BT_GT:
1139
0
    *nextTokPtr = ptr + MINBPC(enc);
1140
0
    return XML_TOK_DECL_CLOSE;
1141
0
  case BT_NUM:
1142
0
    return PREFIX(scanPoundName)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1143
0
#  define LEAD_CASE(n)                                                         \
1144
0
  case BT_LEAD##n:                                                             \
1145
0
    if (end - ptr < n)                                                         \
1146
0
      return XML_TOK_PARTIAL_CHAR;                                             \
1147
0
    if (IS_INVALID_CHAR(enc, ptr, n)) {                                        \
1148
0
      *nextTokPtr = ptr;                                                       \
1149
0
      return XML_TOK_INVALID;                                                  \
1150
0
    }                                                                          \
1151
0
    if (IS_NMSTRT_CHAR(enc, ptr, n)) {                                         \
1152
0
      ptr += n;                                                                \
1153
0
      tok = XML_TOK_NAME;                                                      \
1154
0
      break;                                                                   \
1155
0
    }                                                                          \
1156
0
    if (IS_NAME_CHAR(enc, ptr, n)) {                                           \
1157
0
      ptr += n;                                                                \
1158
0
      tok = XML_TOK_NMTOKEN;                                                   \
1159
0
      break;                                                                   \
1160
0
    }                                                                          \
1161
0
    *nextTokPtr = ptr;                                                         \
1162
0
    return XML_TOK_INVALID;
1163
0
    LEAD_CASE(2)
1164
0
    LEAD_CASE(3)
1165
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
95
  case BT_NONASCII:
1182
95
    if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {
1183
74
      ptr += MINBPC(enc);
1184
74
      tok = XML_TOK_NAME;
1185
74
      break;
1186
74
    }
1187
21
    if (IS_NAME_CHAR_MINBPC(enc, ptr)) {
1188
9
      ptr += MINBPC(enc);
1189
9
      tok = XML_TOK_NMTOKEN;
1190
9
      break;
1191
9
    }
1192
    /* fall through */
1193
18
  default:
1194
18
    *nextTokPtr = ptr;
1195
18
    return XML_TOK_INVALID;
1196
124
  }
1197
7.55k
  while (HAS_CHAR(enc, ptr, end)) {
1198
7.55k
    switch (BYTE_TYPE(enc, ptr)) {
1199
37.5k
      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
13
    default:
1253
13
      *nextTokPtr = ptr;
1254
13
      return XML_TOK_INVALID;
1255
7.55k
    }
1256
7.55k
  }
1257
18
  return -tok;
1258
83
}
1259
1260
static int PTRCALL
1261
PREFIX(attributeValueTok)(const ENCODING *enc, const char *ptr, const char *end,
1262
1.90M
                          const char **nextTokPtr) {
1263
1.90M
  const char *start;
1264
1.90M
  if (ptr >= end)
1265
92.9k
    return XML_TOK_NONE;
1266
1.81M
  else if (! HAS_CHAR(enc, ptr, end)) {
1267
    /* This line cannot be executed.  The incoming data has already
1268
     * been tokenized once, so incomplete characters like this have
1269
     * already been eliminated from the input.  Retaining the paranoia
1270
     * check is still valuable, however.
1271
     */
1272
0
    return XML_TOK_PARTIAL; /* LCOV_EXCL_LINE */
1273
0
  }
1274
1.81M
  start = ptr;
1275
18.0M
  while (HAS_CHAR(enc, ptr, end)) {
1276
18.0M
    switch (BYTE_TYPE(enc, ptr)) {
1277
0
#  define LEAD_CASE(n)                                                         \
1278
92.6k
  case BT_LEAD##n:                                                             \
1279
92.6k
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1280
92.6k
    break;
1281
35.5k
      LEAD_CASE(2)
1282
14.4k
      LEAD_CASE(3)
1283
42.5k
      LEAD_CASE(4)
1284
0
#  undef LEAD_CASE
1285
87.0k
    case BT_AMP:
1286
87.0k
      if (ptr == start)
1287
70.2k
        return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1288
16.7k
      *nextTokPtr = ptr;
1289
16.7k
      return XML_TOK_DATA_CHARS;
1290
2
    case BT_LT:
1291
      /* this is for inside entity references */
1292
2
      *nextTokPtr = ptr;
1293
2
      return XML_TOK_INVALID;
1294
429k
    case BT_LF:
1295
429k
      if (ptr == start) {
1296
372k
        *nextTokPtr = ptr + MINBPC(enc);
1297
372k
        return XML_TOK_DATA_NEWLINE;
1298
372k
      }
1299
56.2k
      *nextTokPtr = ptr;
1300
56.2k
      return XML_TOK_DATA_CHARS;
1301
792k
    case BT_CR:
1302
792k
      if (ptr == start) {
1303
625k
        ptr += MINBPC(enc);
1304
625k
        if (! HAS_CHAR(enc, ptr, end))
1305
2.16k
          return XML_TOK_TRAILING_CR;
1306
623k
        if (BYTE_TYPE(enc, ptr) == BT_LF)
1307
216k
          ptr += MINBPC(enc);
1308
623k
        *nextTokPtr = ptr;
1309
623k
        return XML_TOK_DATA_NEWLINE;
1310
625k
      }
1311
166k
      *nextTokPtr = ptr;
1312
166k
      return XML_TOK_DATA_CHARS;
1313
444k
    case BT_S:
1314
444k
      if (ptr == start) {
1315
249k
        *nextTokPtr = ptr + MINBPC(enc);
1316
249k
        return XML_TOK_ATTRIBUTE_VALUE_S;
1317
249k
      }
1318
195k
      *nextTokPtr = ptr;
1319
195k
      return XML_TOK_DATA_CHARS;
1320
16.1M
    default:
1321
16.1M
      ptr += MINBPC(enc);
1322
16.1M
      break;
1323
18.0M
    }
1324
18.0M
  }
1325
61.8k
  *nextTokPtr = ptr;
1326
61.8k
  return XML_TOK_DATA_CHARS;
1327
1.81M
}
xmltok.c:normal_attributeValueTok
Line
Count
Source
1262
1.90M
                          const char **nextTokPtr) {
1263
1.90M
  const char *start;
1264
1.90M
  if (ptr >= end)
1265
92.9k
    return XML_TOK_NONE;
1266
1.81M
  else if (! HAS_CHAR(enc, ptr, end)) {
1267
    /* This line cannot be executed.  The incoming data has already
1268
     * been tokenized once, so incomplete characters like this have
1269
     * already been eliminated from the input.  Retaining the paranoia
1270
     * check is still valuable, however.
1271
     */
1272
0
    return XML_TOK_PARTIAL; /* LCOV_EXCL_LINE */
1273
0
  }
1274
1.81M
  start = ptr;
1275
18.0M
  while (HAS_CHAR(enc, ptr, end)) {
1276
18.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
35.5k
      LEAD_CASE(2)
1282
14.4k
      LEAD_CASE(3)
1283
42.5k
      LEAD_CASE(4)
1284
0
#  undef LEAD_CASE
1285
87.0k
    case BT_AMP:
1286
87.0k
      if (ptr == start)
1287
70.2k
        return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1288
16.7k
      *nextTokPtr = ptr;
1289
16.7k
      return XML_TOK_DATA_CHARS;
1290
2
    case BT_LT:
1291
      /* this is for inside entity references */
1292
2
      *nextTokPtr = ptr;
1293
2
      return XML_TOK_INVALID;
1294
429k
    case BT_LF:
1295
429k
      if (ptr == start) {
1296
372k
        *nextTokPtr = ptr + MINBPC(enc);
1297
372k
        return XML_TOK_DATA_NEWLINE;
1298
372k
      }
1299
56.2k
      *nextTokPtr = ptr;
1300
56.2k
      return XML_TOK_DATA_CHARS;
1301
792k
    case BT_CR:
1302
792k
      if (ptr == start) {
1303
625k
        ptr += MINBPC(enc);
1304
625k
        if (! HAS_CHAR(enc, ptr, end))
1305
2.16k
          return XML_TOK_TRAILING_CR;
1306
623k
        if (BYTE_TYPE(enc, ptr) == BT_LF)
1307
216k
          ptr += MINBPC(enc);
1308
623k
        *nextTokPtr = ptr;
1309
623k
        return XML_TOK_DATA_NEWLINE;
1310
625k
      }
1311
166k
      *nextTokPtr = ptr;
1312
166k
      return XML_TOK_DATA_CHARS;
1313
444k
    case BT_S:
1314
444k
      if (ptr == start) {
1315
249k
        *nextTokPtr = ptr + MINBPC(enc);
1316
249k
        return XML_TOK_ATTRIBUTE_VALUE_S;
1317
249k
      }
1318
195k
      *nextTokPtr = ptr;
1319
195k
      return XML_TOK_DATA_CHARS;
1320
16.1M
    default:
1321
16.1M
      ptr += MINBPC(enc);
1322
16.1M
      break;
1323
18.0M
    }
1324
18.0M
  }
1325
61.8k
  *nextTokPtr = ptr;
1326
61.8k
  return XML_TOK_DATA_CHARS;
1327
1.81M
}
Unexecuted instantiation: xmltok.c:little2_attributeValueTok
Unexecuted instantiation: xmltok.c:big2_attributeValueTok
1328
1329
static int PTRCALL
1330
PREFIX(entityValueTok)(const ENCODING *enc, const char *ptr, const char *end,
1331
0
                       const char **nextTokPtr) {
1332
0
  const char *start;
1333
0
  if (ptr >= end)
1334
0
    return XML_TOK_NONE;
1335
0
  else if (! HAS_CHAR(enc, ptr, end)) {
1336
    /* This line cannot be executed.  The incoming data has already
1337
     * been tokenized once, so incomplete characters like this have
1338
     * already been eliminated from the input.  Retaining the paranoia
1339
     * check is still valuable, however.
1340
     */
1341
0
    return XML_TOK_PARTIAL; /* LCOV_EXCL_LINE */
1342
0
  }
1343
0
  start = ptr;
1344
0
  while (HAS_CHAR(enc, ptr, end)) {
1345
0
    switch (BYTE_TYPE(enc, ptr)) {
1346
0
#  define LEAD_CASE(n)                                                         \
1347
0
  case BT_LEAD##n:                                                             \
1348
0
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1349
0
    break;
1350
0
      LEAD_CASE(2)
1351
0
      LEAD_CASE(3)
1352
0
      LEAD_CASE(4)
1353
0
#  undef LEAD_CASE
1354
0
    case BT_AMP:
1355
0
      if (ptr == start)
1356
0
        return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1357
0
      *nextTokPtr = ptr;
1358
0
      return XML_TOK_DATA_CHARS;
1359
0
    case BT_PERCNT:
1360
0
      if (ptr == start) {
1361
0
        int tok = PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1362
0
        return (tok == XML_TOK_PERCENT) ? XML_TOK_INVALID : tok;
1363
0
      }
1364
0
      *nextTokPtr = ptr;
1365
0
      return XML_TOK_DATA_CHARS;
1366
0
    case BT_LF:
1367
0
      if (ptr == start) {
1368
0
        *nextTokPtr = ptr + MINBPC(enc);
1369
0
        return XML_TOK_DATA_NEWLINE;
1370
0
      }
1371
0
      *nextTokPtr = ptr;
1372
0
      return XML_TOK_DATA_CHARS;
1373
0
    case BT_CR:
1374
0
      if (ptr == start) {
1375
0
        ptr += MINBPC(enc);
1376
0
        if (! HAS_CHAR(enc, ptr, end))
1377
0
          return XML_TOK_TRAILING_CR;
1378
0
        if (BYTE_TYPE(enc, ptr) == BT_LF)
1379
0
          ptr += MINBPC(enc);
1380
0
        *nextTokPtr = ptr;
1381
0
        return XML_TOK_DATA_NEWLINE;
1382
0
      }
1383
0
      *nextTokPtr = ptr;
1384
0
      return XML_TOK_DATA_CHARS;
1385
0
    default:
1386
0
      ptr += MINBPC(enc);
1387
0
      break;
1388
0
    }
1389
0
  }
1390
0
  *nextTokPtr = ptr;
1391
0
  return XML_TOK_DATA_CHARS;
1392
0
}
Unexecuted instantiation: xmltok.c:normal_entityValueTok
Unexecuted instantiation: xmltok.c:little2_entityValueTok
Unexecuted instantiation: xmltok.c:big2_entityValueTok
1393
1394
#  ifdef XML_DTD
1395
1396
static int PTRCALL
1397
PREFIX(ignoreSectionTok)(const ENCODING *enc, const char *ptr, const char *end,
1398
                         const char **nextTokPtr) {
1399
  int level = 0;
1400
  if (MINBPC(enc) > 1) {
1401
    size_t n = end - ptr;
1402
    if (n & (MINBPC(enc) - 1)) {
1403
      n &= ~(MINBPC(enc) - 1);
1404
      end = ptr + n;
1405
    }
1406
  }
1407
  while (HAS_CHAR(enc, ptr, end)) {
1408
    switch (BYTE_TYPE(enc, ptr)) {
1409
      INVALID_CASES(ptr, nextTokPtr)
1410
    case BT_LT:
1411
      ptr += MINBPC(enc);
1412
      REQUIRE_CHAR(enc, ptr, end);
1413
      if (CHAR_MATCHES(enc, ptr, ASCII_EXCL)) {
1414
        ptr += MINBPC(enc);
1415
        REQUIRE_CHAR(enc, ptr, end);
1416
        if (CHAR_MATCHES(enc, ptr, ASCII_LSQB)) {
1417
          ++level;
1418
          ptr += MINBPC(enc);
1419
        }
1420
      }
1421
      break;
1422
    case BT_RSQB:
1423
      ptr += MINBPC(enc);
1424
      REQUIRE_CHAR(enc, ptr, end);
1425
      if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) {
1426
        ptr += MINBPC(enc);
1427
        REQUIRE_CHAR(enc, ptr, end);
1428
        if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
1429
          ptr += MINBPC(enc);
1430
          if (level == 0) {
1431
            *nextTokPtr = ptr;
1432
            return XML_TOK_IGNORE_SECT;
1433
          }
1434
          --level;
1435
        }
1436
      }
1437
      break;
1438
    default:
1439
      ptr += MINBPC(enc);
1440
      break;
1441
    }
1442
  }
1443
  return XML_TOK_PARTIAL;
1444
}
1445
1446
#  endif /* XML_DTD */
1447
1448
static int PTRCALL
1449
PREFIX(isPublicId)(const ENCODING *enc, const char *ptr, const char *end,
1450
3.37k
                   const char **badPtr) {
1451
3.37k
  ptr += MINBPC(enc);
1452
3.37k
  end -= MINBPC(enc);
1453
275k
  for (; HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
1454
275k
    switch (BYTE_TYPE(enc, ptr)) {
1455
112k
    case BT_DIGIT:
1456
173k
    case BT_HEX:
1457
173k
    case BT_MINUS:
1458
174k
    case BT_APOS:
1459
174k
    case BT_LPAR:
1460
194k
    case BT_RPAR:
1461
195k
    case BT_PLUS:
1462
196k
    case BT_COMMA:
1463
223k
    case BT_SOL:
1464
224k
    case BT_EQUALS:
1465
226k
    case BT_QUEST:
1466
227k
    case BT_CR:
1467
228k
    case BT_LF:
1468
229k
    case BT_SEMI:
1469
229k
    case BT_EXCL:
1470
230k
    case BT_AST:
1471
231k
    case BT_PERCNT:
1472
234k
    case BT_NUM:
1473
#  ifdef XML_NS
1474
    case BT_COLON:
1475
#  endif
1476
234k
      break;
1477
1.12k
    case BT_S:
1478
1.12k
      if (CHAR_MATCHES(enc, ptr, ASCII_TAB)) {
1479
2
        *badPtr = ptr;
1480
2
        return 0;
1481
2
      }
1482
1.12k
      break;
1483
1.68k
    case BT_NAME:
1484
38.0k
    case BT_NMSTRT:
1485
38.0k
      if (! (BYTE_TO_ASCII(enc, ptr) & ~0x7f))
1486
38.0k
        break;
1487
      /* fall through */
1488
1.74k
    default:
1489
1.74k
      switch (BYTE_TO_ASCII(enc, ptr)) {
1490
1.52k
      case 0x24: /* $ */
1491
1.72k
      case 0x40: /* @ */
1492
1.72k
        break;
1493
16
      default:
1494
16
        *badPtr = ptr;
1495
16
        return 0;
1496
1.74k
      }
1497
1.72k
      break;
1498
275k
    }
1499
275k
  }
1500
3.36k
  return 1;
1501
3.37k
}
xmltok.c:normal_isPublicId
Line
Count
Source
1450
3.37k
                   const char **badPtr) {
1451
3.37k
  ptr += MINBPC(enc);
1452
3.37k
  end -= MINBPC(enc);
1453
275k
  for (; HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
1454
275k
    switch (BYTE_TYPE(enc, ptr)) {
1455
112k
    case BT_DIGIT:
1456
173k
    case BT_HEX:
1457
173k
    case BT_MINUS:
1458
174k
    case BT_APOS:
1459
174k
    case BT_LPAR:
1460
194k
    case BT_RPAR:
1461
195k
    case BT_PLUS:
1462
196k
    case BT_COMMA:
1463
223k
    case BT_SOL:
1464
224k
    case BT_EQUALS:
1465
226k
    case BT_QUEST:
1466
227k
    case BT_CR:
1467
228k
    case BT_LF:
1468
229k
    case BT_SEMI:
1469
229k
    case BT_EXCL:
1470
230k
    case BT_AST:
1471
231k
    case BT_PERCNT:
1472
234k
    case BT_NUM:
1473
#  ifdef XML_NS
1474
    case BT_COLON:
1475
#  endif
1476
234k
      break;
1477
1.12k
    case BT_S:
1478
1.12k
      if (CHAR_MATCHES(enc, ptr, ASCII_TAB)) {
1479
2
        *badPtr = ptr;
1480
2
        return 0;
1481
2
      }
1482
1.12k
      break;
1483
1.68k
    case BT_NAME:
1484
38.0k
    case BT_NMSTRT:
1485
38.0k
      if (! (BYTE_TO_ASCII(enc, ptr) & ~0x7f))
1486
38.0k
        break;
1487
      /* fall through */
1488
1.74k
    default:
1489
1.74k
      switch (BYTE_TO_ASCII(enc, ptr)) {
1490
1.52k
      case 0x24: /* $ */
1491
1.72k
      case 0x40: /* @ */
1492
1.72k
        break;
1493
16
      default:
1494
16
        *badPtr = ptr;
1495
16
        return 0;
1496
1.74k
      }
1497
1.72k
      break;
1498
275k
    }
1499
275k
  }
1500
3.36k
  return 1;
1501
3.37k
}
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
987k
                ATTRIBUTE *atts) {
1511
987k
  enum { other, inName, inValue } state = inName;
1512
987k
  int nAtts = 0;
1513
987k
  int open = 0; /* defined when state == inValue;
1514
                   initialization just to shut up compilers */
1515
1516
42.8M
  for (ptr += MINBPC(enc);; ptr += MINBPC(enc)) {
1517
42.8M
    switch (BYTE_TYPE(enc, ptr)) {
1518
0
#  define START_NAME                                                           \
1519
26.3M
    if (state == other) {                                                      \
1520
2.85M
      if (nAtts < attsMax) {                                                   \
1521
1.49M
        atts[nAtts].name = ptr;                                                \
1522
1.49M
        atts[nAtts].normalized = 1;                                            \
1523
1.49M
      }                                                                        \
1524
2.85M
      state = inName;                                                          \
1525
2.85M
    }
1526
0
#  define LEAD_CASE(n)                                                         \
1527
186k
  case BT_LEAD##n: /* NOTE: The encoding has already been validated. */        \
1528
186k
    START_NAME ptr += (n - MINBPC(enc));                                       \
1529
186k
    break;
1530
102k
      LEAD_CASE(2)
1531
59.2k
      LEAD_CASE(3)
1532
24.6k
      LEAD_CASE(4)
1533
0
#  undef LEAD_CASE
1534
0
    case BT_NONASCII:
1535
23.6M
    case BT_NMSTRT:
1536
26.1M
    case BT_HEX:
1537
26.1M
      START_NAME
1538
26.1M
      break;
1539
0
#  undef START_NAME
1540
553k
    case BT_QUOT:
1541
553k
      if (state != inValue) {
1542
232k
        if (nAtts < attsMax)
1543
171k
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1544
232k
        state = inValue;
1545
232k
        open = BT_QUOT;
1546
321k
      } else if (open == BT_QUOT) {
1547
232k
        state = other;
1548
232k
        if (nAtts < attsMax)
1549
171k
          atts[nAtts].valueEnd = ptr;
1550
232k
        nAtts++;
1551
232k
      }
1552
553k
      break;
1553
5.26M
    case BT_APOS:
1554
5.26M
      if (state != inValue) {
1555
2.62M
        if (nAtts < attsMax)
1556
1.31M
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1557
2.62M
        state = inValue;
1558
2.62M
        open = BT_APOS;
1559
2.64M
      } else if (open == BT_APOS) {
1560
2.62M
        state = other;
1561
2.62M
        if (nAtts < attsMax)
1562
1.31M
          atts[nAtts].valueEnd = ptr;
1563
2.62M
        nAtts++;
1564
2.62M
      }
1565
5.26M
      break;
1566
19.6k
    case BT_AMP:
1567
19.6k
      if (nAtts < attsMax)
1568
19.2k
        atts[nAtts].normalized = 0;
1569
19.6k
      break;
1570
2.05M
    case BT_S:
1571
2.05M
      if (state == inName)
1572
68.3k
        state = other;
1573
1.99M
      else if (state == inValue && nAtts < attsMax && atts[nAtts].normalized
1574
70.7k
               && (ptr == atts[nAtts].valuePtr
1575
14.5k
                   || BYTE_TO_ASCII(enc, ptr) != ASCII_SPACE
1576
7.04k
                   || BYTE_TO_ASCII(enc, ptr + MINBPC(enc)) == ASCII_SPACE
1577
6.77k
                   || BYTE_TYPE(enc, ptr + MINBPC(enc)) == open))
1578
64.4k
        atts[nAtts].normalized = 0;
1579
2.05M
      break;
1580
1.95M
    case BT_CR:
1581
2.61M
    case BT_LF:
1582
      /* This case ensures that the first attribute name is counted
1583
         Apart from that we could just change state on the quote. */
1584
2.61M
      if (state == inName)
1585
31.2k
        state = other;
1586
2.58M
      else if (state == inValue && nAtts < attsMax)
1587
1.06M
        atts[nAtts].normalized = 0;
1588
2.61M
      break;
1589
902k
    case BT_GT:
1590
1.03M
    case BT_SOL:
1591
1.03M
      if (state != inValue)
1592
987k
        return nAtts;
1593
48.4k
      break;
1594
4.97M
    default:
1595
4.97M
      break;
1596
42.8M
    }
1597
42.8M
  }
1598
  /* not reached */
1599
987k
}
xmltok.c:normal_getAtts
Line
Count
Source
1510
987k
                ATTRIBUTE *atts) {
1511
987k
  enum { other, inName, inValue } state = inName;
1512
987k
  int nAtts = 0;
1513
987k
  int open = 0; /* defined when state == inValue;
1514
                   initialization just to shut up compilers */
1515
1516
42.8M
  for (ptr += MINBPC(enc);; ptr += MINBPC(enc)) {
1517
42.8M
    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
102k
      LEAD_CASE(2)
1531
59.2k
      LEAD_CASE(3)
1532
24.6k
      LEAD_CASE(4)
1533
0
#  undef LEAD_CASE
1534
0
    case BT_NONASCII:
1535
23.6M
    case BT_NMSTRT:
1536
26.1M
    case BT_HEX:
1537
26.1M
      START_NAME
1538
26.1M
      break;
1539
0
#  undef START_NAME
1540
553k
    case BT_QUOT:
1541
553k
      if (state != inValue) {
1542
232k
        if (nAtts < attsMax)
1543
171k
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1544
232k
        state = inValue;
1545
232k
        open = BT_QUOT;
1546
321k
      } else if (open == BT_QUOT) {
1547
232k
        state = other;
1548
232k
        if (nAtts < attsMax)
1549
171k
          atts[nAtts].valueEnd = ptr;
1550
232k
        nAtts++;
1551
232k
      }
1552
553k
      break;
1553
5.26M
    case BT_APOS:
1554
5.26M
      if (state != inValue) {
1555
2.62M
        if (nAtts < attsMax)
1556
1.31M
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1557
2.62M
        state = inValue;
1558
2.62M
        open = BT_APOS;
1559
2.64M
      } else if (open == BT_APOS) {
1560
2.62M
        state = other;
1561
2.62M
        if (nAtts < attsMax)
1562
1.31M
          atts[nAtts].valueEnd = ptr;
1563
2.62M
        nAtts++;
1564
2.62M
      }
1565
5.26M
      break;
1566
19.6k
    case BT_AMP:
1567
19.6k
      if (nAtts < attsMax)
1568
19.2k
        atts[nAtts].normalized = 0;
1569
19.6k
      break;
1570
2.05M
    case BT_S:
1571
2.05M
      if (state == inName)
1572
68.3k
        state = other;
1573
1.99M
      else if (state == inValue && nAtts < attsMax && atts[nAtts].normalized
1574
70.7k
               && (ptr == atts[nAtts].valuePtr
1575
14.5k
                   || BYTE_TO_ASCII(enc, ptr) != ASCII_SPACE
1576
7.04k
                   || BYTE_TO_ASCII(enc, ptr + MINBPC(enc)) == ASCII_SPACE
1577
6.77k
                   || BYTE_TYPE(enc, ptr + MINBPC(enc)) == open))
1578
64.4k
        atts[nAtts].normalized = 0;
1579
2.05M
      break;
1580
1.95M
    case BT_CR:
1581
2.61M
    case BT_LF:
1582
      /* This case ensures that the first attribute name is counted
1583
         Apart from that we could just change state on the quote. */
1584
2.61M
      if (state == inName)
1585
31.2k
        state = other;
1586
2.58M
      else if (state == inValue && nAtts < attsMax)
1587
1.06M
        atts[nAtts].normalized = 0;
1588
2.61M
      break;
1589
902k
    case BT_GT:
1590
1.03M
    case BT_SOL:
1591
1.03M
      if (state != inValue)
1592
987k
        return nAtts;
1593
48.4k
      break;
1594
4.97M
    default:
1595
4.97M
      break;
1596
42.8M
    }
1597
42.8M
  }
1598
  /* not reached */
1599
987k
}
Unexecuted instantiation: xmltok.c:little2_getAtts
Unexecuted instantiation: xmltok.c:big2_getAtts
1600
1601
static int PTRFASTCALL
1602
32.6k
PREFIX(charRefNumber)(const ENCODING *enc, const char *ptr) {
1603
32.6k
  int result = 0;
1604
  /* skip &# */
1605
32.6k
  UNUSED_P(enc);
1606
32.6k
  ptr += 2 * MINBPC(enc);
1607
32.6k
  if (CHAR_MATCHES(enc, ptr, ASCII_x)) {
1608
91.5k
    for (ptr += MINBPC(enc); ! CHAR_MATCHES(enc, ptr, ASCII_SEMI);
1609
68.6k
         ptr += MINBPC(enc)) {
1610
68.6k
      int c = BYTE_TO_ASCII(enc, ptr);
1611
68.6k
      switch (c) {
1612
7.35k
      case ASCII_0:
1613
10.7k
      case ASCII_1:
1614
12.8k
      case ASCII_2:
1615
19.2k
      case ASCII_3:
1616
20.1k
      case ASCII_4:
1617
23.2k
      case ASCII_5:
1618
27.3k
      case ASCII_6:
1619
33.3k
      case ASCII_7:
1620
35.4k
      case ASCII_8:
1621
38.7k
      case ASCII_9:
1622
38.7k
        result <<= 4;
1623
38.7k
        result |= (c - ASCII_0);
1624
38.7k
        break;
1625
936
      case ASCII_A:
1626
1.77k
      case ASCII_B:
1627
2.24k
      case ASCII_C:
1628
4.34k
      case ASCII_D:
1629
5.18k
      case ASCII_E:
1630
11.4k
      case ASCII_F:
1631
11.4k
        result <<= 4;
1632
11.4k
        result += 10 + (c - ASCII_A);
1633
11.4k
        break;
1634
5.25k
      case ASCII_a:
1635
6.44k
      case ASCII_b:
1636
12.8k
      case ASCII_c:
1637
16.1k
      case ASCII_d:
1638
16.5k
      case ASCII_e:
1639
18.4k
      case ASCII_f:
1640
18.4k
        result <<= 4;
1641
18.4k
        result += 10 + (c - ASCII_a);
1642
18.4k
        break;
1643
68.6k
      }
1644
68.6k
      if (result >= 0x110000)
1645
12
        return -1;
1646
68.6k
    }
1647
22.9k
  } else {
1648
45.8k
    for (; ! CHAR_MATCHES(enc, ptr, ASCII_SEMI); ptr += MINBPC(enc)) {
1649
36.1k
      int c = BYTE_TO_ASCII(enc, ptr);
1650
36.1k
      result *= 10;
1651
36.1k
      result += (c - ASCII_0);
1652
36.1k
      if (result >= 0x110000)
1653
4
        return -1;
1654
36.1k
    }
1655
9.69k
  }
1656
32.5k
  return checkCharRefNumber(result);
1657
32.6k
}
xmltok.c:normal_charRefNumber
Line
Count
Source
1602
32.6k
PREFIX(charRefNumber)(const ENCODING *enc, const char *ptr) {
1603
32.6k
  int result = 0;
1604
  /* skip &# */
1605
32.6k
  UNUSED_P(enc);
1606
32.6k
  ptr += 2 * MINBPC(enc);
1607
32.6k
  if (CHAR_MATCHES(enc, ptr, ASCII_x)) {
1608
91.5k
    for (ptr += MINBPC(enc); ! CHAR_MATCHES(enc, ptr, ASCII_SEMI);
1609
68.6k
         ptr += MINBPC(enc)) {
1610
68.6k
      int c = BYTE_TO_ASCII(enc, ptr);
1611
68.6k
      switch (c) {
1612
7.35k
      case ASCII_0:
1613
10.7k
      case ASCII_1:
1614
12.8k
      case ASCII_2:
1615
19.2k
      case ASCII_3:
1616
20.1k
      case ASCII_4:
1617
23.2k
      case ASCII_5:
1618
27.3k
      case ASCII_6:
1619
33.3k
      case ASCII_7:
1620
35.4k
      case ASCII_8:
1621
38.7k
      case ASCII_9:
1622
38.7k
        result <<= 4;
1623
38.7k
        result |= (c - ASCII_0);
1624
38.7k
        break;
1625
936
      case ASCII_A:
1626
1.77k
      case ASCII_B:
1627
2.24k
      case ASCII_C:
1628
4.34k
      case ASCII_D:
1629
5.18k
      case ASCII_E:
1630
11.4k
      case ASCII_F:
1631
11.4k
        result <<= 4;
1632
11.4k
        result += 10 + (c - ASCII_A);
1633
11.4k
        break;
1634
5.25k
      case ASCII_a:
1635
6.44k
      case ASCII_b:
1636
12.8k
      case ASCII_c:
1637
16.1k
      case ASCII_d:
1638
16.5k
      case ASCII_e:
1639
18.4k
      case ASCII_f:
1640
18.4k
        result <<= 4;
1641
18.4k
        result += 10 + (c - ASCII_a);
1642
18.4k
        break;
1643
68.6k
      }
1644
68.6k
      if (result >= 0x110000)
1645
12
        return -1;
1646
68.6k
    }
1647
22.9k
  } else {
1648
45.8k
    for (; ! CHAR_MATCHES(enc, ptr, ASCII_SEMI); ptr += MINBPC(enc)) {
1649
36.1k
      int c = BYTE_TO_ASCII(enc, ptr);
1650
36.1k
      result *= 10;
1651
36.1k
      result += (c - ASCII_0);
1652
36.1k
      if (result >= 0x110000)
1653
4
        return -1;
1654
36.1k
    }
1655
9.69k
  }
1656
32.5k
  return checkCharRefNumber(result);
1657
32.6k
}
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
77.7k
                             const char *end) {
1662
77.7k
  UNUSED_P(enc);
1663
77.7k
  switch ((end - ptr) / MINBPC(enc)) {
1664
6.00k
  case 2:
1665
6.00k
    if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_t)) {
1666
2.17k
      switch (BYTE_TO_ASCII(enc, ptr)) {
1667
1.40k
      case ASCII_l:
1668
1.40k
        return ASCII_LT;
1669
756
      case ASCII_g:
1670
756
        return ASCII_GT;
1671
2.17k
      }
1672
2.17k
    }
1673
3.84k
    break;
1674
24.0k
  case 3:
1675
24.0k
    if (CHAR_MATCHES(enc, ptr, ASCII_a)) {
1676
23.2k
      ptr += MINBPC(enc);
1677
23.2k
      if (CHAR_MATCHES(enc, ptr, ASCII_m)) {
1678
22.6k
        ptr += MINBPC(enc);
1679
22.6k
        if (CHAR_MATCHES(enc, ptr, ASCII_p))
1680
22.3k
          return ASCII_AMP;
1681
22.6k
      }
1682
23.2k
    }
1683
1.72k
    break;
1684
5.53k
  case 4:
1685
5.53k
    switch (BYTE_TO_ASCII(enc, ptr)) {
1686
2.57k
    case ASCII_q:
1687
2.57k
      ptr += MINBPC(enc);
1688
2.57k
      if (CHAR_MATCHES(enc, ptr, ASCII_u)) {
1689
2.19k
        ptr += MINBPC(enc);
1690
2.19k
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1691
1.70k
          ptr += MINBPC(enc);
1692
1.70k
          if (CHAR_MATCHES(enc, ptr, ASCII_t))
1693
1.49k
            return ASCII_QUOT;
1694
1.70k
        }
1695
2.19k
      }
1696
1.08k
      break;
1697
2.35k
    case ASCII_a:
1698
2.35k
      ptr += MINBPC(enc);
1699
2.35k
      if (CHAR_MATCHES(enc, ptr, ASCII_p)) {
1700
1.29k
        ptr += MINBPC(enc);
1701
1.29k
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1702
1.02k
          ptr += MINBPC(enc);
1703
1.02k
          if (CHAR_MATCHES(enc, ptr, ASCII_s))
1704
803
            return ASCII_APOS;
1705
1.02k
        }
1706
1.29k
      }
1707
1.55k
      break;
1708
5.53k
    }
1709
77.7k
  }
1710
50.9k
  return 0;
1711
77.7k
}
xmltok.c:normal_predefinedEntityName
Line
Count
Source
1661
77.7k
                             const char *end) {
1662
77.7k
  UNUSED_P(enc);
1663
77.7k
  switch ((end - ptr) / MINBPC(enc)) {
1664
6.00k
  case 2:
1665
6.00k
    if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_t)) {
1666
2.17k
      switch (BYTE_TO_ASCII(enc, ptr)) {
1667
1.40k
      case ASCII_l:
1668
1.40k
        return ASCII_LT;
1669
756
      case ASCII_g:
1670
756
        return ASCII_GT;
1671
2.17k
      }
1672
2.17k
    }
1673
3.84k
    break;
1674
24.0k
  case 3:
1675
24.0k
    if (CHAR_MATCHES(enc, ptr, ASCII_a)) {
1676
23.2k
      ptr += MINBPC(enc);
1677
23.2k
      if (CHAR_MATCHES(enc, ptr, ASCII_m)) {
1678
22.6k
        ptr += MINBPC(enc);
1679
22.6k
        if (CHAR_MATCHES(enc, ptr, ASCII_p))
1680
22.3k
          return ASCII_AMP;
1681
22.6k
      }
1682
23.2k
    }
1683
1.72k
    break;
1684
5.53k
  case 4:
1685
5.53k
    switch (BYTE_TO_ASCII(enc, ptr)) {
1686
2.57k
    case ASCII_q:
1687
2.57k
      ptr += MINBPC(enc);
1688
2.57k
      if (CHAR_MATCHES(enc, ptr, ASCII_u)) {
1689
2.19k
        ptr += MINBPC(enc);
1690
2.19k
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1691
1.70k
          ptr += MINBPC(enc);
1692
1.70k
          if (CHAR_MATCHES(enc, ptr, ASCII_t))
1693
1.49k
            return ASCII_QUOT;
1694
1.70k
        }
1695
2.19k
      }
1696
1.08k
      break;
1697
2.35k
    case ASCII_a:
1698
2.35k
      ptr += MINBPC(enc);
1699
2.35k
      if (CHAR_MATCHES(enc, ptr, ASCII_p)) {
1700
1.29k
        ptr += MINBPC(enc);
1701
1.29k
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1702
1.02k
          ptr += MINBPC(enc);
1703
1.02k
          if (CHAR_MATCHES(enc, ptr, ASCII_s))
1704
803
            return ASCII_APOS;
1705
1.02k
        }
1706
1.29k
      }
1707
1.55k
      break;
1708
5.53k
    }
1709
77.7k
  }
1710
50.9k
  return 0;
1711
77.7k
}
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
490k
                         const char *end1, const char *ptr2) {
1716
490k
  UNUSED_P(enc);
1717
2.83M
  for (; *ptr2; ptr1 += MINBPC(enc), ptr2++) {
1718
2.47M
    if (end1 - ptr1 < MINBPC(enc)) {
1719
      /* This line cannot be executed.  The incoming data has already
1720
       * been tokenized once, so incomplete characters like this have
1721
       * already been eliminated from the input.  Retaining the
1722
       * paranoia check is still valuable, however.
1723
       */
1724
45
      return 0; /* LCOV_EXCL_LINE */
1725
45
    }
1726
2.47M
    if (! CHAR_MATCHES(enc, ptr1, *ptr2))
1727
127k
      return 0;
1728
2.47M
  }
1729
362k
  return ptr1 == end1;
1730
490k
}
xmltok.c:normal_nameMatchesAscii
Line
Count
Source
1715
490k
                         const char *end1, const char *ptr2) {
1716
490k
  UNUSED_P(enc);
1717
2.83M
  for (; *ptr2; ptr1 += MINBPC(enc), ptr2++) {
1718
2.47M
    if (end1 - ptr1 < MINBPC(enc)) {
1719
      /* This line cannot be executed.  The incoming data has already
1720
       * been tokenized once, so incomplete characters like this have
1721
       * already been eliminated from the input.  Retaining the
1722
       * paranoia check is still valuable, however.
1723
       */
1724
45
      return 0; /* LCOV_EXCL_LINE */
1725
45
    }
1726
2.47M
    if (! CHAR_MATCHES(enc, ptr1, *ptr2))
1727
127k
      return 0;
1728
2.47M
  }
1729
362k
  return ptr1 == end1;
1730
490k
}
Unexecuted instantiation: xmltok.c:little2_nameMatchesAscii
Unexecuted instantiation: xmltok.c:big2_nameMatchesAscii
1731
1732
static int PTRFASTCALL
1733
1.27M
PREFIX(nameLength)(const ENCODING *enc, const char *ptr) {
1734
1.27M
  const char *start = ptr;
1735
12.5M
  for (;;) {
1736
12.5M
    switch (BYTE_TYPE(enc, ptr)) {
1737
0
#  define LEAD_CASE(n)                                                         \
1738
62.2k
  case BT_LEAD##n:                                                             \
1739
62.2k
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1740
62.2k
    break;
1741
35.5k
      LEAD_CASE(2)
1742
26.7k
      LEAD_CASE(3)
1743
0
      LEAD_CASE(4)
1744
0
#  undef LEAD_CASE
1745
0
    case BT_NONASCII:
1746
8.68M
    case BT_NMSTRT:
1747
#  ifdef XML_NS
1748
    case BT_COLON:
1749
#  endif
1750
10.4M
    case BT_HEX:
1751
10.5M
    case BT_DIGIT:
1752
10.5M
    case BT_NAME:
1753
11.2M
    case BT_MINUS:
1754
11.2M
      ptr += MINBPC(enc);
1755
11.2M
      break;
1756
1.27M
    default:
1757
1.27M
      return (int)(ptr - start);
1758
12.5M
    }
1759
12.5M
  }
1760
1.27M
}
xmltok.c:normal_nameLength
Line
Count
Source
1733
1.27M
PREFIX(nameLength)(const ENCODING *enc, const char *ptr) {
1734
1.27M
  const char *start = ptr;
1735
12.5M
  for (;;) {
1736
12.5M
    switch (BYTE_TYPE(enc, ptr)) {
1737
0
#  define LEAD_CASE(n)                                                         \
1738
0
  case BT_LEAD##n:                                                             \
1739
0
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1740
0
    break;
1741
35.5k
      LEAD_CASE(2)
1742
26.7k
      LEAD_CASE(3)
1743
0
      LEAD_CASE(4)
1744
0
#  undef LEAD_CASE
1745
0
    case BT_NONASCII:
1746
8.68M
    case BT_NMSTRT:
1747
#  ifdef XML_NS
1748
    case BT_COLON:
1749
#  endif
1750
10.4M
    case BT_HEX:
1751
10.5M
    case BT_DIGIT:
1752
10.5M
    case BT_NAME:
1753
11.2M
    case BT_MINUS:
1754
11.2M
      ptr += MINBPC(enc);
1755
11.2M
      break;
1756
1.27M
    default:
1757
1.27M
      return (int)(ptr - start);
1758
12.5M
    }
1759
12.5M
  }
1760
1.27M
}
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.5k
                       POSITION *pos) {
1780
122M
  while (HAS_CHAR(enc, ptr, end)) {
1781
122M
    switch (BYTE_TYPE(enc, ptr)) {
1782
0
#  define LEAD_CASE(n)                                                         \
1783
1.41M
  case BT_LEAD##n:                                                             \
1784
1.41M
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1785
1.41M
    pos->columnNumber++;                                                       \
1786
1.41M
    break;
1787
630k
      LEAD_CASE(2)
1788
575k
      LEAD_CASE(3)
1789
207k
      LEAD_CASE(4)
1790
0
#  undef LEAD_CASE
1791
3.59M
    case BT_LF:
1792
3.59M
      pos->columnNumber = 0;
1793
3.59M
      pos->lineNumber++;
1794
3.59M
      ptr += MINBPC(enc);
1795
3.59M
      break;
1796
5.07M
    case BT_CR:
1797
5.07M
      pos->lineNumber++;
1798
5.07M
      ptr += MINBPC(enc);
1799
5.07M
      if (HAS_CHAR(enc, ptr, end) && BYTE_TYPE(enc, ptr) == BT_LF)
1800
1.00M
        ptr += MINBPC(enc);
1801
5.07M
      pos->columnNumber = 0;
1802
5.07M
      break;
1803
112M
    default:
1804
112M
      ptr += MINBPC(enc);
1805
112M
      pos->columnNumber++;
1806
112M
      break;
1807
122M
    }
1808
122M
  }
1809
19.5k
}
xmltok.c:normal_updatePosition
Line
Count
Source
1779
19.0k
                       POSITION *pos) {
1780
122M
  while (HAS_CHAR(enc, ptr, end)) {
1781
122M
    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
630k
      LEAD_CASE(2)
1788
575k
      LEAD_CASE(3)
1789
207k
      LEAD_CASE(4)
1790
0
#  undef LEAD_CASE
1791
3.59M
    case BT_LF:
1792
3.59M
      pos->columnNumber = 0;
1793
3.59M
      pos->lineNumber++;
1794
3.59M
      ptr += MINBPC(enc);
1795
3.59M
      break;
1796
5.07M
    case BT_CR:
1797
5.07M
      pos->lineNumber++;
1798
5.07M
      ptr += MINBPC(enc);
1799
5.07M
      if (HAS_CHAR(enc, ptr, end) && BYTE_TYPE(enc, ptr) == BT_LF)
1800
1.00M
        ptr += MINBPC(enc);
1801
5.07M
      pos->columnNumber = 0;
1802
5.07M
      break;
1803
112M
    default:
1804
112M
      ptr += MINBPC(enc);
1805
112M
      pos->columnNumber++;
1806
112M
      break;
1807
122M
    }
1808
122M
  }
1809
19.0k
}
xmltok.c:little2_updatePosition
Line
Count
Source
1779
249
                       POSITION *pos) {
1780
729
  while (HAS_CHAR(enc, ptr, end)) {
1781
729
    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
729
    default:
1804
729
      ptr += MINBPC(enc);
1805
729
      pos->columnNumber++;
1806
729
      break;
1807
729
    }
1808
729
  }
1809
249
}
xmltok.c:big2_updatePosition
Line
Count
Source
1779
234
                       POSITION *pos) {
1780
7.42k
  while (HAS_CHAR(enc, ptr, end)) {
1781
7.42k
    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
7.42k
    default:
1804
7.42k
      ptr += MINBPC(enc);
1805
7.42k
      pos->columnNumber++;
1806
7.42k
      break;
1807
7.42k
    }
1808
7.42k
  }
1809
234
}
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 */