Coverage Report

Created: 2024-07-27 06:44

/src/CMake/Utilities/cmexpat/lib/xmltok_impl.c
Line
Count
Source (jump to first uncovered line)
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
   Licensed under the MIT license:
20
21
   Permission is  hereby granted,  free of charge,  to any  person obtaining
22
   a  copy  of  this  software   and  associated  documentation  files  (the
23
   "Software"),  to  deal in  the  Software  without restriction,  including
24
   without  limitation the  rights  to use,  copy,  modify, merge,  publish,
25
   distribute, sublicense, and/or sell copies of the Software, and to permit
26
   persons  to whom  the Software  is  furnished to  do so,  subject to  the
27
   following conditions:
28
29
   The above copyright  notice and this permission notice  shall be included
30
   in all copies or substantial portions of the Software.
31
32
   THE  SOFTWARE  IS  PROVIDED  "AS  IS",  WITHOUT  WARRANTY  OF  ANY  KIND,
33
   EXPRESS  OR IMPLIED,  INCLUDING  BUT  NOT LIMITED  TO  THE WARRANTIES  OF
34
   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
35
   NO EVENT SHALL THE AUTHORS OR  COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
36
   DAMAGES OR  OTHER LIABILITY, WHETHER  IN AN  ACTION OF CONTRACT,  TORT OR
37
   OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
38
   USE OR OTHER DEALINGS IN THE SOFTWARE.
39
*/
40
41
#ifdef XML_TOK_IMPL_C
42
43
#  ifndef IS_INVALID_CHAR // i.e. for UTF-16 and XML_MIN_SIZE not defined
44
57
#    define IS_INVALID_CHAR(enc, ptr, n) (0)
45
#  endif
46
47
#  define INVALID_LEAD_CASE(n, ptr, nextTokPtr)                                \
48
72.0M
  case BT_LEAD##n:                                                             \
49
72.0M
    if (end - ptr < n)                                                         \
50
72.0M
      return XML_TOK_PARTIAL_CHAR;                                             \
51
72.0M
    if (IS_INVALID_CHAR(enc, ptr, n)) {                                        \
52
80
      *(nextTokPtr) = (ptr);                                                   \
53
80
      return XML_TOK_INVALID;                                                  \
54
80
    }                                                                          \
55
72.0M
    ptr += n;                                                                  \
56
72.0M
    break;
57
58
#  define INVALID_CASES(ptr, nextTokPtr)                                       \
59
71.9M
    INVALID_LEAD_CASE(2, ptr, nextTokPtr)                                      \
60
71.9M
    INVALID_LEAD_CASE(3, ptr, nextTokPtr)                                      \
61
78.1k
    INVALID_LEAD_CASE(4, ptr, nextTokPtr)                                      \
62
17.9k
  case BT_NONXML:                                                              \
63
49
  case BT_MALFORM:                                                             \
64
107
  case BT_TRAIL:                                                               \
65
107
    *(nextTokPtr) = (ptr);                                                     \
66
107
    return XML_TOK_INVALID;
67
68
#  define CHECK_NAME_CASE(n, enc, ptr, end, nextTokPtr)                        \
69
13.5M
  case BT_LEAD##n:                                                             \
70
13.5M
    if (end - ptr < n)                                                         \
71
13.5M
      return XML_TOK_PARTIAL_CHAR;                                             \
72
13.5M
    if (IS_INVALID_CHAR(enc, ptr, n) || ! IS_NAME_CHAR(enc, ptr, n)) {         \
73
315
      *nextTokPtr = ptr;                                                       \
74
315
      return XML_TOK_INVALID;                                                  \
75
315
    }                                                                          \
76
13.5M
    ptr += n;                                                                  \
77
13.5M
    break;
78
79
#  define CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)                          \
80
156M
  case BT_NONASCII:                                                            \
81
156M
    if (! IS_NAME_CHAR_MINBPC(enc, ptr)) {                                     \
82
78
      *nextTokPtr = ptr;                                                       \
83
78
      return XML_TOK_INVALID;                                                  \
84
78
    }                                                                          \
85
156M
    /* fall through */                                                         \
86
156M
  case BT_NMSTRT:                                                              \
87
125M
  case BT_HEX:                                                                 \
88
156M
  case BT_DIGIT:                                                               \
89
156M
  case BT_NAME:                                                                \
90
156M
  case BT_MINUS:                                                               \
91
156M
    ptr += MINBPC(enc);                                                        \
92
156M
    break;                                                                     \
93
156M
    CHECK_NAME_CASE(2, enc, ptr, end, nextTokPtr)                              \
94
13.4M
    CHECK_NAME_CASE(3, enc, ptr, end, nextTokPtr)                              \
95
99.6k
    CHECK_NAME_CASE(4, enc, ptr, end, nextTokPtr)
96
97
#  define CHECK_NMSTRT_CASE(n, enc, ptr, end, nextTokPtr)                      \
98
61.7k
  case BT_LEAD##n:                                                             \
99
61.9k
    if (end - ptr < n)                                                         \
100
61.7k
      return XML_TOK_PARTIAL_CHAR;                                             \
101
61.8k
    if (IS_INVALID_CHAR(enc, ptr, n) || ! IS_NMSTRT_CHAR(enc, ptr, n)) {       \
102
175
      *nextTokPtr = ptr;                                                       \
103
175
      return XML_TOK_INVALID;                                                  \
104
175
    }                                                                          \
105
61.8k
    ptr += n;                                                                  \
106
61.7k
    break;
107
108
#  define CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)                        \
109
34.1M
  case BT_NONASCII:                                                            \
110
34.1M
    if (! IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {                                   \
111
0
      *nextTokPtr = ptr;                                                       \
112
0
      return XML_TOK_INVALID;                                                  \
113
0
    }                                                                          \
114
34.1M
    /* fall through */                                                         \
115
34.1M
  case BT_NMSTRT:                                                              \
116
34.1M
  case BT_HEX:                                                                 \
117
34.1M
    ptr += MINBPC(enc);                                                        \
118
34.1M
    break;                                                                     \
119
34.1M
    CHECK_NMSTRT_CASE(2, enc, ptr, end, nextTokPtr)                            \
120
48.5k
    CHECK_NMSTRT_CASE(3, enc, ptr, end, nextTokPtr)                            \
121
13.1k
    CHECK_NMSTRT_CASE(4, enc, ptr, end, nextTokPtr)
122
123
#  ifndef PREFIX
124
#    define PREFIX(ident) ident
125
#  endif
126
127
10.5G
#  define HAS_CHARS(enc, ptr, end, count) (end - ptr >= count * MINBPC(enc))
128
129
136M
#  define HAS_CHAR(enc, ptr, end) HAS_CHARS(enc, ptr, end, 1)
130
131
#  define REQUIRE_CHARS(enc, ptr, end, count)                                  \
132
134M
    {                                                                          \
133
134M
      if (! HAS_CHARS(enc, ptr, end, count)) {                                 \
134
710
        return XML_TOK_PARTIAL;                                                \
135
710
      }                                                                        \
136
134M
    }
137
138
134M
#  define REQUIRE_CHAR(enc, ptr, end) REQUIRE_CHARS(enc, ptr, end, 1)
139
140
/* ptr points to character following "<!-" */
141
142
static int PTRCALL
143
PREFIX(scanComment)(const ENCODING *enc, const char *ptr, const char *end,
144
7.90k
                    const char **nextTokPtr) {
145
7.90k
  if (HAS_CHAR(enc, ptr, end)) {
146
7.89k
    if (! CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
147
12
      *nextTokPtr = ptr;
148
12
      return XML_TOK_INVALID;
149
12
    }
150
7.88k
    ptr += MINBPC(enc);
151
1.17M
    while (HAS_CHAR(enc, ptr, end)) {
152
1.17M
      switch (BYTE_TYPE(enc, ptr)) {
153
2.26M
        INVALID_CASES(ptr, nextTokPtr)
154
9.23k
      case BT_MINUS:
155
9.23k
        ptr += MINBPC(enc);
156
9.23k
        REQUIRE_CHAR(enc, ptr, end);
157
9.22k
        if (CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
158
7.76k
          ptr += MINBPC(enc);
159
7.76k
          REQUIRE_CHAR(enc, ptr, end);
160
7.75k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
161
9
            *nextTokPtr = ptr;
162
9
            return XML_TOK_INVALID;
163
9
          }
164
7.74k
          *nextTokPtr = ptr + MINBPC(enc);
165
7.74k
          return XML_TOK_COMMENT;
166
7.75k
        }
167
1.46k
        break;
168
30.6k
      default:
169
30.6k
        ptr += MINBPC(enc);
170
30.6k
        break;
171
1.17M
      }
172
1.17M
    }
173
7.88k
  }
174
86
  return XML_TOK_PARTIAL;
175
7.90k
}
xmltok.c:normal_scanComment
Line
Count
Source
144
7.90k
                    const char **nextTokPtr) {
145
7.90k
  if (HAS_CHAR(enc, ptr, end)) {
146
7.89k
    if (! CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
147
12
      *nextTokPtr = ptr;
148
12
      return XML_TOK_INVALID;
149
12
    }
150
7.88k
    ptr += MINBPC(enc);
151
1.17M
    while (HAS_CHAR(enc, ptr, end)) {
152
1.17M
      switch (BYTE_TYPE(enc, ptr)) {
153
2.26M
        INVALID_CASES(ptr, nextTokPtr)
154
9.23k
      case BT_MINUS:
155
9.23k
        ptr += MINBPC(enc);
156
9.23k
        REQUIRE_CHAR(enc, ptr, end);
157
9.22k
        if (CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
158
7.76k
          ptr += MINBPC(enc);
159
7.76k
          REQUIRE_CHAR(enc, ptr, end);
160
7.75k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
161
9
            *nextTokPtr = ptr;
162
9
            return XML_TOK_INVALID;
163
9
          }
164
7.74k
          *nextTokPtr = ptr + MINBPC(enc);
165
7.74k
          return XML_TOK_COMMENT;
166
7.75k
        }
167
1.46k
        break;
168
30.6k
      default:
169
30.6k
        ptr += MINBPC(enc);
170
30.6k
        break;
171
1.17M
      }
172
1.17M
    }
173
7.88k
  }
174
86
  return XML_TOK_PARTIAL;
175
7.90k
}
Unexecuted instantiation: xmltok.c:little2_scanComment
Unexecuted instantiation: xmltok.c:big2_scanComment
176
177
/* ptr points to character following "<!" */
178
179
static int PTRCALL
180
PREFIX(scanDecl)(const ENCODING *enc, const char *ptr, const char *end,
181
48.8k
                 const char **nextTokPtr) {
182
48.8k
  REQUIRE_CHAR(enc, ptr, end);
183
48.8k
  switch (BYTE_TYPE(enc, ptr)) {
184
1.13k
  case BT_MINUS:
185
1.13k
    return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
186
1
  case BT_LSQB:
187
1
    *nextTokPtr = ptr + MINBPC(enc);
188
1
    return XML_TOK_COND_SECT_OPEN;
189
1.47k
  case BT_NMSTRT:
190
47.6k
  case BT_HEX:
191
47.6k
    ptr += MINBPC(enc);
192
47.6k
    break;
193
2
  default:
194
2
    *nextTokPtr = ptr;
195
2
    return XML_TOK_INVALID;
196
48.8k
  }
197
415k
  while (HAS_CHAR(enc, ptr, end)) {
198
415k
    switch (BYTE_TYPE(enc, ptr)) {
199
17
    case BT_PERCNT:
200
17
      REQUIRE_CHARS(enc, ptr, end, 2);
201
      /* don't allow <!ENTITY% foo "whatever"> */
202
15
      switch (BYTE_TYPE(enc, ptr + MINBPC(enc))) {
203
1
      case BT_S:
204
2
      case BT_CR:
205
5
      case BT_LF:
206
6
      case BT_PERCNT:
207
6
        *nextTokPtr = ptr;
208
6
        return XML_TOK_INVALID;
209
15
      }
210
      /* fall through */
211
14.9k
    case BT_S:
212
41.4k
    case BT_CR:
213
47.5k
    case BT_LF:
214
47.5k
      *nextTokPtr = ptr;
215
47.5k
      return XML_TOK_DECL_OPEN;
216
254k
    case BT_NMSTRT:
217
368k
    case BT_HEX:
218
368k
      ptr += MINBPC(enc);
219
368k
      break;
220
17
    default:
221
17
      *nextTokPtr = ptr;
222
17
      return XML_TOK_INVALID;
223
415k
    }
224
415k
  }
225
110
  return XML_TOK_PARTIAL;
226
47.6k
}
xmltok.c:normal_scanDecl
Line
Count
Source
181
48.8k
                 const char **nextTokPtr) {
182
48.8k
  REQUIRE_CHAR(enc, ptr, end);
183
48.8k
  switch (BYTE_TYPE(enc, ptr)) {
184
1.13k
  case BT_MINUS:
185
1.13k
    return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
186
1
  case BT_LSQB:
187
1
    *nextTokPtr = ptr + MINBPC(enc);
188
1
    return XML_TOK_COND_SECT_OPEN;
189
1.47k
  case BT_NMSTRT:
190
47.6k
  case BT_HEX:
191
47.6k
    ptr += MINBPC(enc);
192
47.6k
    break;
193
2
  default:
194
2
    *nextTokPtr = ptr;
195
2
    return XML_TOK_INVALID;
196
48.8k
  }
197
415k
  while (HAS_CHAR(enc, ptr, end)) {
198
415k
    switch (BYTE_TYPE(enc, ptr)) {
199
17
    case BT_PERCNT:
200
17
      REQUIRE_CHARS(enc, ptr, end, 2);
201
      /* don't allow <!ENTITY% foo "whatever"> */
202
15
      switch (BYTE_TYPE(enc, ptr + MINBPC(enc))) {
203
1
      case BT_S:
204
2
      case BT_CR:
205
5
      case BT_LF:
206
6
      case BT_PERCNT:
207
6
        *nextTokPtr = ptr;
208
6
        return XML_TOK_INVALID;
209
15
      }
210
      /* fall through */
211
14.9k
    case BT_S:
212
41.4k
    case BT_CR:
213
47.5k
    case BT_LF:
214
47.5k
      *nextTokPtr = ptr;
215
47.5k
      return XML_TOK_DECL_OPEN;
216
254k
    case BT_NMSTRT:
217
368k
    case BT_HEX:
218
368k
      ptr += MINBPC(enc);
219
368k
      break;
220
17
    default:
221
17
      *nextTokPtr = ptr;
222
17
      return XML_TOK_INVALID;
223
415k
    }
224
415k
  }
225
110
  return XML_TOK_PARTIAL;
226
47.6k
}
Unexecuted instantiation: xmltok.c:little2_scanDecl
Unexecuted instantiation: xmltok.c:big2_scanDecl
227
228
static int PTRCALL
229
PREFIX(checkPiTarget)(const ENCODING *enc, const char *ptr, const char *end,
230
16.1k
                      int *tokPtr) {
231
16.1k
  int upper = 0;
232
16.1k
  UNUSED_P(enc);
233
16.1k
  *tokPtr = XML_TOK_PI;
234
16.1k
  if (end - ptr != MINBPC(enc) * 3)
235
11.6k
    return 1;
236
4.51k
  switch (BYTE_TO_ASCII(enc, ptr)) {
237
2.48k
  case ASCII_x:
238
2.48k
    break;
239
1.43k
  case ASCII_X:
240
1.43k
    upper = 1;
241
1.43k
    break;
242
598
  default:
243
598
    return 1;
244
4.51k
  }
245
3.91k
  ptr += MINBPC(enc);
246
3.91k
  switch (BYTE_TO_ASCII(enc, ptr)) {
247
2.24k
  case ASCII_m:
248
2.24k
    break;
249
445
  case ASCII_M:
250
445
    upper = 1;
251
445
    break;
252
1.22k
  default:
253
1.22k
    return 1;
254
3.91k
  }
255
2.68k
  ptr += MINBPC(enc);
256
2.68k
  switch (BYTE_TO_ASCII(enc, ptr)) {
257
1.80k
  case ASCII_l:
258
1.80k
    break;
259
2
  case ASCII_L:
260
2
    upper = 1;
261
2
    break;
262
882
  default:
263
882
    return 1;
264
2.68k
  }
265
1.80k
  if (upper)
266
5
    return 0;
267
1.79k
  *tokPtr = XML_TOK_XML_DECL;
268
1.79k
  return 1;
269
1.80k
}
xmltok.c:normal_checkPiTarget
Line
Count
Source
230
16.1k
                      int *tokPtr) {
231
16.1k
  int upper = 0;
232
16.1k
  UNUSED_P(enc);
233
16.1k
  *tokPtr = XML_TOK_PI;
234
16.1k
  if (end - ptr != MINBPC(enc) * 3)
235
11.6k
    return 1;
236
4.51k
  switch (BYTE_TO_ASCII(enc, ptr)) {
237
2.48k
  case ASCII_x:
238
2.48k
    break;
239
1.43k
  case ASCII_X:
240
1.43k
    upper = 1;
241
1.43k
    break;
242
598
  default:
243
598
    return 1;
244
4.51k
  }
245
3.91k
  ptr += MINBPC(enc);
246
3.91k
  switch (BYTE_TO_ASCII(enc, ptr)) {
247
2.24k
  case ASCII_m:
248
2.24k
    break;
249
445
  case ASCII_M:
250
445
    upper = 1;
251
445
    break;
252
1.22k
  default:
253
1.22k
    return 1;
254
3.91k
  }
255
2.68k
  ptr += MINBPC(enc);
256
2.68k
  switch (BYTE_TO_ASCII(enc, ptr)) {
257
1.80k
  case ASCII_l:
258
1.80k
    break;
259
2
  case ASCII_L:
260
2
    upper = 1;
261
2
    break;
262
882
  default:
263
882
    return 1;
264
2.68k
  }
265
1.80k
  if (upper)
266
5
    return 0;
267
1.79k
  *tokPtr = XML_TOK_XML_DECL;
268
1.79k
  return 1;
269
1.80k
}
Unexecuted instantiation: xmltok.c:little2_checkPiTarget
Unexecuted instantiation: xmltok.c:big2_checkPiTarget
270
271
/* ptr points to character following "<?" */
272
273
static int PTRCALL
274
PREFIX(scanPi)(const ENCODING *enc, const char *ptr, const char *end,
275
16.4k
               const char **nextTokPtr) {
276
16.4k
  int tok;
277
16.4k
  const char *target = ptr;
278
16.4k
  REQUIRE_CHAR(enc, ptr, end);
279
16.3k
  switch (BYTE_TYPE(enc, ptr)) {
280
19.5k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
281
2
  default:
282
2
    *nextTokPtr = ptr;
283
2
    return XML_TOK_INVALID;
284
16.3k
  }
285
10.3M
  while (HAS_CHAR(enc, ptr, end)) {
286
10.3M
    switch (BYTE_TYPE(enc, ptr)) {
287
20.6M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
288
3.24k
    case BT_S:
289
3.83k
    case BT_CR:
290
7.81k
    case BT_LF:
291
7.81k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
292
3
        *nextTokPtr = ptr;
293
3
        return XML_TOK_INVALID;
294
3
      }
295
7.80k
      ptr += MINBPC(enc);
296
4.18M
      while (HAS_CHAR(enc, ptr, end)) {
297
4.18M
        switch (BYTE_TYPE(enc, ptr)) {
298
6.12M
          INVALID_CASES(ptr, nextTokPtr)
299
12.4k
        case BT_QUEST:
300
12.4k
          ptr += MINBPC(enc);
301
12.4k
          REQUIRE_CHAR(enc, ptr, end);
302
12.4k
          if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
303
7.61k
            *nextTokPtr = ptr + MINBPC(enc);
304
7.61k
            return tok;
305
7.61k
          }
306
4.82k
          break;
307
1.11M
        default:
308
1.11M
          ptr += MINBPC(enc);
309
1.11M
          break;
310
4.18M
        }
311
4.18M
      }
312
150
      return XML_TOK_PARTIAL;
313
8.34k
    case BT_QUEST:
314
8.34k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
315
2
        *nextTokPtr = ptr;
316
2
        return XML_TOK_INVALID;
317
2
      }
318
8.33k
      ptr += MINBPC(enc);
319
8.33k
      REQUIRE_CHAR(enc, ptr, end);
320
8.29k
      if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
321
8.28k
        *nextTokPtr = ptr + MINBPC(enc);
322
8.28k
        return tok;
323
8.28k
      }
324
      /* fall through */
325
35
    default:
326
35
      *nextTokPtr = ptr;
327
35
      return XML_TOK_INVALID;
328
10.3M
    }
329
10.3M
  }
330
108
  return XML_TOK_PARTIAL;
331
16.3k
}
xmltok.c:normal_scanPi
Line
Count
Source
275
16.4k
               const char **nextTokPtr) {
276
16.4k
  int tok;
277
16.4k
  const char *target = ptr;
278
16.4k
  REQUIRE_CHAR(enc, ptr, end);
279
16.3k
  switch (BYTE_TYPE(enc, ptr)) {
280
19.5k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
281
2
  default:
282
2
    *nextTokPtr = ptr;
283
2
    return XML_TOK_INVALID;
284
16.3k
  }
285
10.3M
  while (HAS_CHAR(enc, ptr, end)) {
286
10.3M
    switch (BYTE_TYPE(enc, ptr)) {
287
20.6M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
288
3.24k
    case BT_S:
289
3.83k
    case BT_CR:
290
7.81k
    case BT_LF:
291
7.81k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
292
3
        *nextTokPtr = ptr;
293
3
        return XML_TOK_INVALID;
294
3
      }
295
7.80k
      ptr += MINBPC(enc);
296
4.18M
      while (HAS_CHAR(enc, ptr, end)) {
297
4.18M
        switch (BYTE_TYPE(enc, ptr)) {
298
6.12M
          INVALID_CASES(ptr, nextTokPtr)
299
12.4k
        case BT_QUEST:
300
12.4k
          ptr += MINBPC(enc);
301
12.4k
          REQUIRE_CHAR(enc, ptr, end);
302
12.4k
          if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
303
7.61k
            *nextTokPtr = ptr + MINBPC(enc);
304
7.61k
            return tok;
305
7.61k
          }
306
4.82k
          break;
307
1.11M
        default:
308
1.11M
          ptr += MINBPC(enc);
309
1.11M
          break;
310
4.18M
        }
311
4.18M
      }
312
150
      return XML_TOK_PARTIAL;
313
8.34k
    case BT_QUEST:
314
8.34k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
315
2
        *nextTokPtr = ptr;
316
2
        return XML_TOK_INVALID;
317
2
      }
318
8.33k
      ptr += MINBPC(enc);
319
8.33k
      REQUIRE_CHAR(enc, ptr, end);
320
8.29k
      if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
321
8.28k
        *nextTokPtr = ptr + MINBPC(enc);
322
8.28k
        return tok;
323
8.28k
      }
324
      /* fall through */
325
35
    default:
326
35
      *nextTokPtr = ptr;
327
35
      return XML_TOK_INVALID;
328
10.3M
    }
329
10.3M
  }
330
108
  return XML_TOK_PARTIAL;
331
16.3k
}
Unexecuted instantiation: xmltok.c:little2_scanPi
Unexecuted instantiation: xmltok.c:big2_scanPi
332
333
static int PTRCALL
334
PREFIX(scanCdataSection)(const ENCODING *enc, const char *ptr, const char *end,
335
1.78k
                         const char **nextTokPtr) {
336
1.78k
  static const char CDATA_LSQB[]
337
1.78k
      = {ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, ASCII_LSQB};
338
1.78k
  int i;
339
1.78k
  UNUSED_P(enc);
340
  /* CDATA[ */
341
1.78k
  REQUIRE_CHARS(enc, ptr, end, 6);
342
12.2k
  for (i = 0; i < 6; i++, ptr += MINBPC(enc)) {
343
10.5k
    if (! CHAR_MATCHES(enc, ptr, CDATA_LSQB[i])) {
344
44
      *nextTokPtr = ptr;
345
44
      return XML_TOK_INVALID;
346
44
    }
347
10.5k
  }
348
1.73k
  *nextTokPtr = ptr;
349
1.73k
  return XML_TOK_CDATA_SECT_OPEN;
350
1.77k
}
xmltok.c:normal_scanCdataSection
Line
Count
Source
335
1.78k
                         const char **nextTokPtr) {
336
1.78k
  static const char CDATA_LSQB[]
337
1.78k
      = {ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, ASCII_LSQB};
338
1.78k
  int i;
339
1.78k
  UNUSED_P(enc);
340
  /* CDATA[ */
341
1.78k
  REQUIRE_CHARS(enc, ptr, end, 6);
342
12.2k
  for (i = 0; i < 6; i++, ptr += MINBPC(enc)) {
343
10.5k
    if (! CHAR_MATCHES(enc, ptr, CDATA_LSQB[i])) {
344
44
      *nextTokPtr = ptr;
345
44
      return XML_TOK_INVALID;
346
44
    }
347
10.5k
  }
348
1.73k
  *nextTokPtr = ptr;
349
1.73k
  return XML_TOK_CDATA_SECT_OPEN;
350
1.77k
}
Unexecuted instantiation: xmltok.c:little2_scanCdataSection
Unexecuted instantiation: xmltok.c:big2_scanCdataSection
351
352
static int PTRCALL
353
PREFIX(cdataSectionTok)(const ENCODING *enc, const char *ptr, const char *end,
354
1.95M
                        const char **nextTokPtr) {
355
1.95M
  if (ptr >= end)
356
216
    return XML_TOK_NONE;
357
1.95M
  if (MINBPC(enc) > 1) {
358
0
    size_t n = end - ptr;
359
0
    if (n & (MINBPC(enc) - 1)) {
360
0
      n &= ~(MINBPC(enc) - 1);
361
0
      if (n == 0)
362
0
        return XML_TOK_PARTIAL;
363
0
      end = ptr + n;
364
0
    }
365
0
  }
366
1.95M
  switch (BYTE_TYPE(enc, ptr)) {
367
15.5k
  case BT_RSQB:
368
15.5k
    ptr += MINBPC(enc);
369
15.5k
    REQUIRE_CHAR(enc, ptr, end);
370
15.5k
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
371
8.02k
      break;
372
7.49k
    ptr += MINBPC(enc);
373
7.49k
    REQUIRE_CHAR(enc, ptr, end);
374
7.48k
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
375
5.92k
      ptr -= MINBPC(enc);
376
5.92k
      break;
377
5.92k
    }
378
1.56k
    *nextTokPtr = ptr + MINBPC(enc);
379
1.56k
    return XML_TOK_CDATA_SECT_CLOSE;
380
157k
  case BT_CR:
381
157k
    ptr += MINBPC(enc);
382
157k
    REQUIRE_CHAR(enc, ptr, end);
383
157k
    if (BYTE_TYPE(enc, ptr) == BT_LF)
384
50.1k
      ptr += MINBPC(enc);
385
157k
    *nextTokPtr = ptr;
386
157k
    return XML_TOK_DATA_NEWLINE;
387
1.48M
  case BT_LF:
388
1.48M
    *nextTokPtr = ptr + MINBPC(enc);
389
1.48M
    return XML_TOK_DATA_NEWLINE;
390
1.48M
    INVALID_CASES(ptr, nextTokPtr)
391
283k
  default:
392
283k
    ptr += MINBPC(enc);
393
283k
    break;
394
1.95M
  }
395
13.4M
  while (HAS_CHAR(enc, ptr, end)) {
396
13.4M
    switch (BYTE_TYPE(enc, ptr)) {
397
0
#  define LEAD_CASE(n)                                                         \
398
2.07M
  case BT_LEAD##n:                                                             \
399
2.07M
    if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) {                       \
400
16
      *nextTokPtr = ptr;                                                       \
401
16
      return XML_TOK_DATA_CHARS;                                               \
402
16
    }                                                                          \
403
2.07M
    ptr += n;                                                                  \
404
2.07M
    break;
405
2.01M
      LEAD_CASE(2)
406
56.1k
      LEAD_CASE(3)
407
5.10k
      LEAD_CASE(4)
408
0
#  undef LEAD_CASE
409
1
    case BT_NONXML:
410
2
    case BT_MALFORM:
411
4
    case BT_TRAIL:
412
55.5k
    case BT_CR:
413
286k
    case BT_LF:
414
300k
    case BT_RSQB:
415
300k
      *nextTokPtr = ptr;
416
300k
      return XML_TOK_DATA_CHARS;
417
11.0M
    default:
418
11.0M
      ptr += MINBPC(enc);
419
11.0M
      break;
420
13.4M
    }
421
13.4M
  }
422
80
  *nextTokPtr = ptr;
423
80
  return XML_TOK_DATA_CHARS;
424
300k
}
xmltok.c:normal_cdataSectionTok
Line
Count
Source
354
1.95M
                        const char **nextTokPtr) {
355
1.95M
  if (ptr >= end)
356
216
    return XML_TOK_NONE;
357
1.95M
  if (MINBPC(enc) > 1) {
358
0
    size_t n = end - ptr;
359
0
    if (n & (MINBPC(enc) - 1)) {
360
0
      n &= ~(MINBPC(enc) - 1);
361
0
      if (n == 0)
362
0
        return XML_TOK_PARTIAL;
363
0
      end = ptr + n;
364
0
    }
365
0
  }
366
1.95M
  switch (BYTE_TYPE(enc, ptr)) {
367
15.5k
  case BT_RSQB:
368
15.5k
    ptr += MINBPC(enc);
369
15.5k
    REQUIRE_CHAR(enc, ptr, end);
370
15.5k
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
371
8.02k
      break;
372
7.49k
    ptr += MINBPC(enc);
373
7.49k
    REQUIRE_CHAR(enc, ptr, end);
374
7.48k
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
375
5.92k
      ptr -= MINBPC(enc);
376
5.92k
      break;
377
5.92k
    }
378
1.56k
    *nextTokPtr = ptr + MINBPC(enc);
379
1.56k
    return XML_TOK_CDATA_SECT_CLOSE;
380
157k
  case BT_CR:
381
157k
    ptr += MINBPC(enc);
382
157k
    REQUIRE_CHAR(enc, ptr, end);
383
157k
    if (BYTE_TYPE(enc, ptr) == BT_LF)
384
50.1k
      ptr += MINBPC(enc);
385
157k
    *nextTokPtr = ptr;
386
157k
    return XML_TOK_DATA_NEWLINE;
387
1.48M
  case BT_LF:
388
1.48M
    *nextTokPtr = ptr + MINBPC(enc);
389
1.48M
    return XML_TOK_DATA_NEWLINE;
390
1.48M
    INVALID_CASES(ptr, nextTokPtr)
391
283k
  default:
392
283k
    ptr += MINBPC(enc);
393
283k
    break;
394
1.95M
  }
395
13.4M
  while (HAS_CHAR(enc, ptr, end)) {
396
13.4M
    switch (BYTE_TYPE(enc, ptr)) {
397
0
#  define LEAD_CASE(n)                                                         \
398
0
  case BT_LEAD##n:                                                             \
399
0
    if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) {                       \
400
0
      *nextTokPtr = ptr;                                                       \
401
0
      return XML_TOK_DATA_CHARS;                                               \
402
0
    }                                                                          \
403
0
    ptr += n;                                                                  \
404
0
    break;
405
2.01M
      LEAD_CASE(2)
406
56.1k
      LEAD_CASE(3)
407
5.10k
      LEAD_CASE(4)
408
0
#  undef LEAD_CASE
409
1
    case BT_NONXML:
410
2
    case BT_MALFORM:
411
4
    case BT_TRAIL:
412
55.5k
    case BT_CR:
413
286k
    case BT_LF:
414
300k
    case BT_RSQB:
415
300k
      *nextTokPtr = ptr;
416
300k
      return XML_TOK_DATA_CHARS;
417
11.0M
    default:
418
11.0M
      ptr += MINBPC(enc);
419
11.0M
      break;
420
13.4M
    }
421
13.4M
  }
422
80
  *nextTokPtr = ptr;
423
80
  return XML_TOK_DATA_CHARS;
424
300k
}
Unexecuted instantiation: xmltok.c:little2_cdataSectionTok
Unexecuted instantiation: xmltok.c:big2_cdataSectionTok
425
426
/* ptr points to character following "</" */
427
428
static int PTRCALL
429
PREFIX(scanEndTag)(const ENCODING *enc, const char *ptr, const char *end,
430
86.0k
                   const char **nextTokPtr) {
431
86.0k
  REQUIRE_CHAR(enc, ptr, end);
432
86.0k
  switch (BYTE_TYPE(enc, ptr)) {
433
63.8k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
434
5
  default:
435
5
    *nextTokPtr = ptr;
436
5
    return XML_TOK_INVALID;
437
86.0k
  }
438
1.44M
  while (HAS_CHAR(enc, ptr, end)) {
439
1.44M
    switch (BYTE_TYPE(enc, ptr)) {
440
3.08M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
441
634
    case BT_S:
442
7.29k
    case BT_CR:
443
7.87k
    case BT_LF:
444
22.9k
      for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
445
22.9k
        switch (BYTE_TYPE(enc, ptr)) {
446
970
        case BT_S:
447
14.5k
        case BT_CR:
448
15.1k
        case BT_LF:
449
15.1k
          break;
450
7.80k
        case BT_GT:
451
7.80k
          *nextTokPtr = ptr + MINBPC(enc);
452
7.80k
          return XML_TOK_END_TAG;
453
3
        default:
454
3
          *nextTokPtr = ptr;
455
3
          return XML_TOK_INVALID;
456
22.9k
        }
457
22.9k
      }
458
64
      return XML_TOK_PARTIAL;
459
#  ifdef XML_NS
460
    case BT_COLON:
461
      /* no need to check qname syntax here,
462
         since end-tag must match exactly */
463
      ptr += MINBPC(enc);
464
      break;
465
#  endif
466
77.9k
    case BT_GT:
467
77.9k
      *nextTokPtr = ptr + MINBPC(enc);
468
77.9k
      return XML_TOK_END_TAG;
469
26
    default:
470
26
      *nextTokPtr = ptr;
471
26
      return XML_TOK_INVALID;
472
1.44M
    }
473
1.44M
  }
474
128
  return XML_TOK_PARTIAL;
475
85.9k
}
xmltok.c:normal_scanEndTag
Line
Count
Source
430
86.0k
                   const char **nextTokPtr) {
431
86.0k
  REQUIRE_CHAR(enc, ptr, end);
432
86.0k
  switch (BYTE_TYPE(enc, ptr)) {
433
63.8k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
434
5
  default:
435
5
    *nextTokPtr = ptr;
436
5
    return XML_TOK_INVALID;
437
86.0k
  }
438
1.44M
  while (HAS_CHAR(enc, ptr, end)) {
439
1.44M
    switch (BYTE_TYPE(enc, ptr)) {
440
3.08M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
441
634
    case BT_S:
442
7.29k
    case BT_CR:
443
7.87k
    case BT_LF:
444
22.9k
      for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
445
22.9k
        switch (BYTE_TYPE(enc, ptr)) {
446
970
        case BT_S:
447
14.5k
        case BT_CR:
448
15.1k
        case BT_LF:
449
15.1k
          break;
450
7.80k
        case BT_GT:
451
7.80k
          *nextTokPtr = ptr + MINBPC(enc);
452
7.80k
          return XML_TOK_END_TAG;
453
3
        default:
454
3
          *nextTokPtr = ptr;
455
3
          return XML_TOK_INVALID;
456
22.9k
        }
457
22.9k
      }
458
64
      return XML_TOK_PARTIAL;
459
#  ifdef XML_NS
460
    case BT_COLON:
461
      /* no need to check qname syntax here,
462
         since end-tag must match exactly */
463
      ptr += MINBPC(enc);
464
      break;
465
#  endif
466
77.9k
    case BT_GT:
467
77.9k
      *nextTokPtr = ptr + MINBPC(enc);
468
77.9k
      return XML_TOK_END_TAG;
469
26
    default:
470
26
      *nextTokPtr = ptr;
471
26
      return XML_TOK_INVALID;
472
1.44M
    }
473
1.44M
  }
474
128
  return XML_TOK_PARTIAL;
475
85.9k
}
Unexecuted instantiation: xmltok.c:little2_scanEndTag
Unexecuted instantiation: xmltok.c:big2_scanEndTag
476
477
/* ptr points to character following "&#X" */
478
479
static int PTRCALL
480
PREFIX(scanHexCharRef)(const ENCODING *enc, const char *ptr, const char *end,
481
61.8k
                       const char **nextTokPtr) {
482
61.8k
  if (HAS_CHAR(enc, ptr, end)) {
483
61.8k
    switch (BYTE_TYPE(enc, ptr)) {
484
46.9k
    case BT_DIGIT:
485
61.8k
    case BT_HEX:
486
61.8k
      break;
487
5
    default:
488
5
      *nextTokPtr = ptr;
489
5
      return XML_TOK_INVALID;
490
61.8k
    }
491
242k
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
492
242k
      switch (BYTE_TYPE(enc, ptr)) {
493
107k
      case BT_DIGIT:
494
180k
      case BT_HEX:
495
180k
        break;
496
61.7k
      case BT_SEMI:
497
61.7k
        *nextTokPtr = ptr + MINBPC(enc);
498
61.7k
        return XML_TOK_CHAR_REF;
499
3
      default:
500
3
        *nextTokPtr = ptr;
501
3
        return XML_TOK_INVALID;
502
242k
      }
503
242k
    }
504
61.8k
  }
505
35
  return XML_TOK_PARTIAL;
506
61.8k
}
xmltok.c:normal_scanHexCharRef
Line
Count
Source
481
61.8k
                       const char **nextTokPtr) {
482
61.8k
  if (HAS_CHAR(enc, ptr, end)) {
483
61.8k
    switch (BYTE_TYPE(enc, ptr)) {
484
46.9k
    case BT_DIGIT:
485
61.8k
    case BT_HEX:
486
61.8k
      break;
487
5
    default:
488
5
      *nextTokPtr = ptr;
489
5
      return XML_TOK_INVALID;
490
61.8k
    }
491
242k
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
492
242k
      switch (BYTE_TYPE(enc, ptr)) {
493
107k
      case BT_DIGIT:
494
180k
      case BT_HEX:
495
180k
        break;
496
61.7k
      case BT_SEMI:
497
61.7k
        *nextTokPtr = ptr + MINBPC(enc);
498
61.7k
        return XML_TOK_CHAR_REF;
499
3
      default:
500
3
        *nextTokPtr = ptr;
501
3
        return XML_TOK_INVALID;
502
242k
      }
503
242k
    }
504
61.8k
  }
505
35
  return XML_TOK_PARTIAL;
506
61.8k
}
Unexecuted instantiation: xmltok.c:little2_scanHexCharRef
Unexecuted instantiation: xmltok.c:big2_scanHexCharRef
507
508
/* ptr points to character following "&#" */
509
510
static int PTRCALL
511
PREFIX(scanCharRef)(const ENCODING *enc, const char *ptr, const char *end,
512
67.9k
                    const char **nextTokPtr) {
513
67.9k
  if (HAS_CHAR(enc, ptr, end)) {
514
67.9k
    if (CHAR_MATCHES(enc, ptr, ASCII_x))
515
61.8k
      return PREFIX(scanHexCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
516
6.12k
    switch (BYTE_TYPE(enc, ptr)) {
517
6.11k
    case BT_DIGIT:
518
6.11k
      break;
519
11
    default:
520
11
      *nextTokPtr = ptr;
521
11
      return XML_TOK_INVALID;
522
6.12k
    }
523
21.0k
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
524
21.0k
      switch (BYTE_TYPE(enc, ptr)) {
525
14.9k
      case BT_DIGIT:
526
14.9k
        break;
527
6.09k
      case BT_SEMI:
528
6.09k
        *nextTokPtr = ptr + MINBPC(enc);
529
6.09k
        return XML_TOK_CHAR_REF;
530
1
      default:
531
1
        *nextTokPtr = ptr;
532
1
        return XML_TOK_INVALID;
533
21.0k
      }
534
21.0k
    }
535
6.11k
  }
536
24
  return XML_TOK_PARTIAL;
537
67.9k
}
xmltok.c:normal_scanCharRef
Line
Count
Source
512
67.9k
                    const char **nextTokPtr) {
513
67.9k
  if (HAS_CHAR(enc, ptr, end)) {
514
67.9k
    if (CHAR_MATCHES(enc, ptr, ASCII_x))
515
61.8k
      return PREFIX(scanHexCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
516
6.12k
    switch (BYTE_TYPE(enc, ptr)) {
517
6.11k
    case BT_DIGIT:
518
6.11k
      break;
519
11
    default:
520
11
      *nextTokPtr = ptr;
521
11
      return XML_TOK_INVALID;
522
6.12k
    }
523
21.0k
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
524
21.0k
      switch (BYTE_TYPE(enc, ptr)) {
525
14.9k
      case BT_DIGIT:
526
14.9k
        break;
527
6.09k
      case BT_SEMI:
528
6.09k
        *nextTokPtr = ptr + MINBPC(enc);
529
6.09k
        return XML_TOK_CHAR_REF;
530
1
      default:
531
1
        *nextTokPtr = ptr;
532
1
        return XML_TOK_INVALID;
533
21.0k
      }
534
21.0k
    }
535
6.11k
  }
536
24
  return XML_TOK_PARTIAL;
537
67.9k
}
Unexecuted instantiation: xmltok.c:little2_scanCharRef
Unexecuted instantiation: xmltok.c:big2_scanCharRef
538
539
/* ptr points to character following "&" */
540
541
static int PTRCALL
542
PREFIX(scanRef)(const ENCODING *enc, const char *ptr, const char *end,
543
28.5M
                const char **nextTokPtr) {
544
28.5M
  REQUIRE_CHAR(enc, ptr, end);
545
28.5M
  switch (BYTE_TYPE(enc, ptr)) {
546
28.1M
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
547
67.9k
  case BT_NUM:
548
67.9k
    return PREFIX(scanCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
549
6
  default:
550
6
    *nextTokPtr = ptr;
551
6
    return XML_TOK_INVALID;
552
28.5M
  }
553
170M
  while (HAS_CHAR(enc, ptr, end)) {
554
170M
    switch (BYTE_TYPE(enc, ptr)) {
555
482M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
556
28.4M
    case BT_SEMI:
557
28.4M
      *nextTokPtr = ptr + MINBPC(enc);
558
28.4M
      return XML_TOK_ENTITY_REF;
559
14
    default:
560
14
      *nextTokPtr = ptr;
561
14
      return XML_TOK_INVALID;
562
170M
    }
563
170M
  }
564
137
  return XML_TOK_PARTIAL;
565
28.4M
}
xmltok.c:normal_scanRef
Line
Count
Source
543
28.5M
                const char **nextTokPtr) {
544
28.5M
  REQUIRE_CHAR(enc, ptr, end);
545
28.5M
  switch (BYTE_TYPE(enc, ptr)) {
546
28.1M
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
547
67.9k
  case BT_NUM:
548
67.9k
    return PREFIX(scanCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
549
6
  default:
550
6
    *nextTokPtr = ptr;
551
6
    return XML_TOK_INVALID;
552
28.5M
  }
553
170M
  while (HAS_CHAR(enc, ptr, end)) {
554
170M
    switch (BYTE_TYPE(enc, ptr)) {
555
482M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
556
28.4M
    case BT_SEMI:
557
28.4M
      *nextTokPtr = ptr + MINBPC(enc);
558
28.4M
      return XML_TOK_ENTITY_REF;
559
14
    default:
560
14
      *nextTokPtr = ptr;
561
14
      return XML_TOK_INVALID;
562
170M
    }
563
170M
  }
564
137
  return XML_TOK_PARTIAL;
565
28.4M
}
Unexecuted instantiation: xmltok.c:little2_scanRef
Unexecuted instantiation: xmltok.c:big2_scanRef
566
567
/* ptr points to character following first character of attribute name */
568
569
static int PTRCALL
570
PREFIX(scanAtts)(const ENCODING *enc, const char *ptr, const char *end,
571
51.0k
                 const char **nextTokPtr) {
572
#  ifdef XML_NS
573
  int hadColon = 0;
574
#  endif
575
4.00M
  while (HAS_CHAR(enc, ptr, end)) {
576
4.00M
    switch (BYTE_TYPE(enc, ptr)) {
577
2.23M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
578
#  ifdef XML_NS
579
    case BT_COLON:
580
      if (hadColon) {
581
        *nextTokPtr = ptr;
582
        return XML_TOK_INVALID;
583
      }
584
      hadColon = 1;
585
      ptr += MINBPC(enc);
586
      REQUIRE_CHAR(enc, ptr, end);
587
      switch (BYTE_TYPE(enc, ptr)) {
588
        CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
589
      default:
590
        *nextTokPtr = ptr;
591
        return XML_TOK_INVALID;
592
      }
593
      break;
594
#  endif
595
572
    case BT_S:
596
5.96k
    case BT_CR:
597
9.32k
    case BT_LF:
598
59.5k
      for (;;) {
599
59.5k
        int t;
600
601
59.5k
        ptr += MINBPC(enc);
602
59.5k
        REQUIRE_CHAR(enc, ptr, end);
603
59.4k
        t = BYTE_TYPE(enc, ptr);
604
59.4k
        if (t == BT_EQUALS)
605
9.23k
          break;
606
50.2k
        switch (t) {
607
689
        case BT_S:
608
36.9k
        case BT_LF:
609
50.2k
        case BT_CR:
610
50.2k
          break;
611
11
        default:
612
11
          *nextTokPtr = ptr;
613
11
          return XML_TOK_INVALID;
614
50.2k
        }
615
50.2k
      }
616
      /* fall through */
617
3.25M
    case BT_EQUALS: {
618
3.25M
      int open;
619
#  ifdef XML_NS
620
      hadColon = 0;
621
#  endif
622
3.25M
      for (;;) {
623
3.25M
        ptr += MINBPC(enc);
624
3.25M
        REQUIRE_CHAR(enc, ptr, end);
625
3.25M
        open = BYTE_TYPE(enc, ptr);
626
3.25M
        if (open == BT_QUOT || open == BT_APOS)
627
3.25M
          break;
628
4.48k
        switch (open) {
629
1.18k
        case BT_S:
630
3.95k
        case BT_LF:
631
4.47k
        case BT_CR:
632
4.47k
          break;
633
12
        default:
634
12
          *nextTokPtr = ptr;
635
12
          return XML_TOK_INVALID;
636
4.48k
        }
637
4.48k
      }
638
3.25M
      ptr += MINBPC(enc);
639
      /* in attribute value */
640
92.2M
      for (;;) {
641
92.2M
        int t;
642
92.2M
        REQUIRE_CHAR(enc, ptr, end);
643
92.2M
        t = BYTE_TYPE(enc, ptr);
644
92.2M
        if (t == open)
645
3.25M
          break;
646
89.0M
        switch (t) {
647
135M
          INVALID_CASES(ptr, nextTokPtr)
648
19.9k
        case BT_AMP: {
649
19.9k
          int tok = PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, &ptr);
650
19.9k
          if (tok <= 0) {
651
47
            if (tok == XML_TOK_INVALID)
652
4
              *nextTokPtr = ptr;
653
47
            return tok;
654
47
          }
655
19.9k
          break;
656
19.9k
        }
657
19.9k
        case BT_LT:
658
5
          *nextTokPtr = ptr;
659
5
          return XML_TOK_INVALID;
660
21.2M
        default:
661
21.2M
          ptr += MINBPC(enc);
662
21.2M
          break;
663
89.0M
        }
664
89.0M
      }
665
3.25M
      ptr += MINBPC(enc);
666
3.25M
      REQUIRE_CHAR(enc, ptr, end);
667
3.25M
      switch (BYTE_TYPE(enc, ptr)) {
668
1.68M
      case BT_S:
669
3.17M
      case BT_CR:
670
3.23M
      case BT_LF:
671
3.23M
        break;
672
10.0k
      case BT_SOL:
673
10.0k
        goto sol;
674
5.42k
      case BT_GT:
675
5.42k
        goto gt;
676
3
      default:
677
3
        *nextTokPtr = ptr;
678
3
        return XML_TOK_INVALID;
679
3.25M
      }
680
      /* ptr points to closing quote */
681
3.61M
      for (;;) {
682
3.61M
        ptr += MINBPC(enc);
683
3.61M
        REQUIRE_CHAR(enc, ptr, end);
684
3.61M
        switch (BYTE_TYPE(enc, ptr)) {
685
3.20M
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
686
293k
        case BT_S:
687
344k
        case BT_CR:
688
376k
        case BT_LF:
689
376k
          continue;
690
1.41k
        case BT_GT:
691
6.83k
        gt:
692
6.83k
          *nextTokPtr = ptr + MINBPC(enc);
693
6.83k
          return XML_TOK_START_TAG_WITH_ATTS;
694
33.4k
        case BT_SOL:
695
43.5k
        sol:
696
43.5k
          ptr += MINBPC(enc);
697
43.5k
          REQUIRE_CHAR(enc, ptr, end);
698
43.5k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
699
13
            *nextTokPtr = ptr;
700
13
            return XML_TOK_INVALID;
701
13
          }
702
43.4k
          *nextTokPtr = ptr + MINBPC(enc);
703
43.4k
          return XML_TOK_EMPTY_ELEMENT_WITH_ATTS;
704
5
        default:
705
5
          *nextTokPtr = ptr;
706
5
          return XML_TOK_INVALID;
707
3.61M
        }
708
3.20M
        break;
709
3.61M
      }
710
3.20M
      break;
711
3.23M
    }
712
3.20M
    default:
713
23
      *nextTokPtr = ptr;
714
23
      return XML_TOK_INVALID;
715
4.00M
    }
716
4.00M
  }
717
146
  return XML_TOK_PARTIAL;
718
51.0k
}
xmltok.c:normal_scanAtts
Line
Count
Source
571
51.0k
                 const char **nextTokPtr) {
572
#  ifdef XML_NS
573
  int hadColon = 0;
574
#  endif
575
4.00M
  while (HAS_CHAR(enc, ptr, end)) {
576
4.00M
    switch (BYTE_TYPE(enc, ptr)) {
577
2.23M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
578
#  ifdef XML_NS
579
    case BT_COLON:
580
      if (hadColon) {
581
        *nextTokPtr = ptr;
582
        return XML_TOK_INVALID;
583
      }
584
      hadColon = 1;
585
      ptr += MINBPC(enc);
586
      REQUIRE_CHAR(enc, ptr, end);
587
      switch (BYTE_TYPE(enc, ptr)) {
588
        CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
589
      default:
590
        *nextTokPtr = ptr;
591
        return XML_TOK_INVALID;
592
      }
593
      break;
594
#  endif
595
572
    case BT_S:
596
5.96k
    case BT_CR:
597
9.32k
    case BT_LF:
598
59.5k
      for (;;) {
599
59.5k
        int t;
600
601
59.5k
        ptr += MINBPC(enc);
602
59.5k
        REQUIRE_CHAR(enc, ptr, end);
603
59.4k
        t = BYTE_TYPE(enc, ptr);
604
59.4k
        if (t == BT_EQUALS)
605
9.23k
          break;
606
50.2k
        switch (t) {
607
689
        case BT_S:
608
36.9k
        case BT_LF:
609
50.2k
        case BT_CR:
610
50.2k
          break;
611
11
        default:
612
11
          *nextTokPtr = ptr;
613
11
          return XML_TOK_INVALID;
614
50.2k
        }
615
50.2k
      }
616
      /* fall through */
617
3.25M
    case BT_EQUALS: {
618
3.25M
      int open;
619
#  ifdef XML_NS
620
      hadColon = 0;
621
#  endif
622
3.25M
      for (;;) {
623
3.25M
        ptr += MINBPC(enc);
624
3.25M
        REQUIRE_CHAR(enc, ptr, end);
625
3.25M
        open = BYTE_TYPE(enc, ptr);
626
3.25M
        if (open == BT_QUOT || open == BT_APOS)
627
3.25M
          break;
628
4.48k
        switch (open) {
629
1.18k
        case BT_S:
630
3.95k
        case BT_LF:
631
4.47k
        case BT_CR:
632
4.47k
          break;
633
12
        default:
634
12
          *nextTokPtr = ptr;
635
12
          return XML_TOK_INVALID;
636
4.48k
        }
637
4.48k
      }
638
3.25M
      ptr += MINBPC(enc);
639
      /* in attribute value */
640
92.2M
      for (;;) {
641
92.2M
        int t;
642
92.2M
        REQUIRE_CHAR(enc, ptr, end);
643
92.2M
        t = BYTE_TYPE(enc, ptr);
644
92.2M
        if (t == open)
645
3.25M
          break;
646
89.0M
        switch (t) {
647
135M
          INVALID_CASES(ptr, nextTokPtr)
648
19.9k
        case BT_AMP: {
649
19.9k
          int tok = PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, &ptr);
650
19.9k
          if (tok <= 0) {
651
47
            if (tok == XML_TOK_INVALID)
652
4
              *nextTokPtr = ptr;
653
47
            return tok;
654
47
          }
655
19.9k
          break;
656
19.9k
        }
657
19.9k
        case BT_LT:
658
5
          *nextTokPtr = ptr;
659
5
          return XML_TOK_INVALID;
660
21.2M
        default:
661
21.2M
          ptr += MINBPC(enc);
662
21.2M
          break;
663
89.0M
        }
664
89.0M
      }
665
3.25M
      ptr += MINBPC(enc);
666
3.25M
      REQUIRE_CHAR(enc, ptr, end);
667
3.25M
      switch (BYTE_TYPE(enc, ptr)) {
668
1.68M
      case BT_S:
669
3.17M
      case BT_CR:
670
3.23M
      case BT_LF:
671
3.23M
        break;
672
10.0k
      case BT_SOL:
673
10.0k
        goto sol;
674
5.42k
      case BT_GT:
675
5.42k
        goto gt;
676
3
      default:
677
3
        *nextTokPtr = ptr;
678
3
        return XML_TOK_INVALID;
679
3.25M
      }
680
      /* ptr points to closing quote */
681
3.61M
      for (;;) {
682
3.61M
        ptr += MINBPC(enc);
683
3.61M
        REQUIRE_CHAR(enc, ptr, end);
684
3.61M
        switch (BYTE_TYPE(enc, ptr)) {
685
3.20M
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
686
293k
        case BT_S:
687
344k
        case BT_CR:
688
376k
        case BT_LF:
689
376k
          continue;
690
1.41k
        case BT_GT:
691
6.83k
        gt:
692
6.83k
          *nextTokPtr = ptr + MINBPC(enc);
693
6.83k
          return XML_TOK_START_TAG_WITH_ATTS;
694
33.4k
        case BT_SOL:
695
43.5k
        sol:
696
43.5k
          ptr += MINBPC(enc);
697
43.5k
          REQUIRE_CHAR(enc, ptr, end);
698
43.5k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
699
13
            *nextTokPtr = ptr;
700
13
            return XML_TOK_INVALID;
701
13
          }
702
43.4k
          *nextTokPtr = ptr + MINBPC(enc);
703
43.4k
          return XML_TOK_EMPTY_ELEMENT_WITH_ATTS;
704
5
        default:
705
5
          *nextTokPtr = ptr;
706
5
          return XML_TOK_INVALID;
707
3.61M
        }
708
3.20M
        break;
709
3.61M
      }
710
3.20M
      break;
711
3.23M
    }
712
3.20M
    default:
713
23
      *nextTokPtr = ptr;
714
23
      return XML_TOK_INVALID;
715
4.00M
    }
716
4.00M
  }
717
146
  return XML_TOK_PARTIAL;
718
51.0k
}
Unexecuted instantiation: xmltok.c:little2_scanAtts
Unexecuted instantiation: xmltok.c:big2_scanAtts
719
720
/* ptr points to character following "<" */
721
722
static int PTRCALL
723
PREFIX(scanLt)(const ENCODING *enc, const char *ptr, const char *end,
724
2.48M
               const char **nextTokPtr) {
725
#  ifdef XML_NS
726
  int hadColon;
727
#  endif
728
2.48M
  REQUIRE_CHAR(enc, ptr, end);
729
2.48M
  switch (BYTE_TYPE(enc, ptr)) {
730
2.30M
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
731
8.56k
  case BT_EXCL:
732
8.56k
    ptr += MINBPC(enc);
733
8.56k
    REQUIRE_CHAR(enc, ptr, end);
734
8.56k
    switch (BYTE_TYPE(enc, ptr)) {
735
6.77k
    case BT_MINUS:
736
6.77k
      return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
737
1.78k
    case BT_LSQB:
738
1.78k
      return PREFIX(scanCdataSection)(enc, ptr + MINBPC(enc), end, nextTokPtr);
739
8.56k
    }
740
5
    *nextTokPtr = ptr;
741
5
    return XML_TOK_INVALID;
742
11.8k
  case BT_QUEST:
743
11.8k
    return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
744
86.0k
  case BT_SOL:
745
86.0k
    return PREFIX(scanEndTag)(enc, ptr + MINBPC(enc), end, nextTokPtr);
746
11
  default:
747
11
    *nextTokPtr = ptr;
748
11
    return XML_TOK_INVALID;
749
2.48M
  }
750
#  ifdef XML_NS
751
  hadColon = 0;
752
#  endif
753
  /* we have a start-tag */
754
7.52M
  while (HAS_CHAR(enc, ptr, end)) {
755
7.52M
    switch (BYTE_TYPE(enc, ptr)) {
756
18.7M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
757
#  ifdef XML_NS
758
    case BT_COLON:
759
      if (hadColon) {
760
        *nextTokPtr = ptr;
761
        return XML_TOK_INVALID;
762
      }
763
      hadColon = 1;
764
      ptr += MINBPC(enc);
765
      REQUIRE_CHAR(enc, ptr, end);
766
      switch (BYTE_TYPE(enc, ptr)) {
767
        CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
768
      default:
769
        *nextTokPtr = ptr;
770
        return XML_TOK_INVALID;
771
      }
772
      break;
773
#  endif
774
54.6k
    case BT_S:
775
59.8k
    case BT_CR:
776
69.9k
    case BT_LF: {
777
69.9k
      ptr += MINBPC(enc);
778
79.9k
      while (HAS_CHAR(enc, ptr, end)) {
779
79.9k
        switch (BYTE_TYPE(enc, ptr)) {
780
55.4k
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
781
874
        case BT_GT:
782
874
          goto gt;
783
17.9k
        case BT_SOL:
784
17.9k
          goto sol;
785
911
        case BT_S:
786
7.25k
        case BT_CR:
787
9.99k
        case BT_LF:
788
9.99k
          ptr += MINBPC(enc);
789
9.99k
          continue;
790
13
        default:
791
13
          *nextTokPtr = ptr;
792
13
          return XML_TOK_INVALID;
793
79.9k
        }
794
51.0k
        return PREFIX(scanAtts)(enc, ptr, end, nextTokPtr);
795
79.9k
      }
796
76
      return XML_TOK_PARTIAL;
797
69.9k
    }
798
2.27M
    case BT_GT:
799
2.27M
    gt:
800
2.27M
      *nextTokPtr = ptr + MINBPC(enc);
801
2.27M
      return XML_TOK_START_TAG_NO_ATTS;
802
32.1k
    case BT_SOL:
803
50.0k
    sol:
804
50.0k
      ptr += MINBPC(enc);
805
50.0k
      REQUIRE_CHAR(enc, ptr, end);
806
50.0k
      if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
807
7
        *nextTokPtr = ptr;
808
7
        return XML_TOK_INVALID;
809
7
      }
810
50.0k
      *nextTokPtr = ptr + MINBPC(enc);
811
50.0k
      return XML_TOK_EMPTY_ELEMENT_NO_ATTS;
812
15
    default:
813
15
      *nextTokPtr = ptr;
814
15
      return XML_TOK_INVALID;
815
7.52M
    }
816
7.52M
  }
817
170
  return XML_TOK_PARTIAL;
818
2.37M
}
xmltok.c:normal_scanLt
Line
Count
Source
724
2.48M
               const char **nextTokPtr) {
725
#  ifdef XML_NS
726
  int hadColon;
727
#  endif
728
2.48M
  REQUIRE_CHAR(enc, ptr, end);
729
2.48M
  switch (BYTE_TYPE(enc, ptr)) {
730
2.30M
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
731
8.56k
  case BT_EXCL:
732
8.56k
    ptr += MINBPC(enc);
733
8.56k
    REQUIRE_CHAR(enc, ptr, end);
734
8.56k
    switch (BYTE_TYPE(enc, ptr)) {
735
6.77k
    case BT_MINUS:
736
6.77k
      return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
737
1.78k
    case BT_LSQB:
738
1.78k
      return PREFIX(scanCdataSection)(enc, ptr + MINBPC(enc), end, nextTokPtr);
739
8.56k
    }
740
5
    *nextTokPtr = ptr;
741
5
    return XML_TOK_INVALID;
742
11.8k
  case BT_QUEST:
743
11.8k
    return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
744
86.0k
  case BT_SOL:
745
86.0k
    return PREFIX(scanEndTag)(enc, ptr + MINBPC(enc), end, nextTokPtr);
746
11
  default:
747
11
    *nextTokPtr = ptr;
748
11
    return XML_TOK_INVALID;
749
2.48M
  }
750
#  ifdef XML_NS
751
  hadColon = 0;
752
#  endif
753
  /* we have a start-tag */
754
7.52M
  while (HAS_CHAR(enc, ptr, end)) {
755
7.52M
    switch (BYTE_TYPE(enc, ptr)) {
756
18.7M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
757
#  ifdef XML_NS
758
    case BT_COLON:
759
      if (hadColon) {
760
        *nextTokPtr = ptr;
761
        return XML_TOK_INVALID;
762
      }
763
      hadColon = 1;
764
      ptr += MINBPC(enc);
765
      REQUIRE_CHAR(enc, ptr, end);
766
      switch (BYTE_TYPE(enc, ptr)) {
767
        CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
768
      default:
769
        *nextTokPtr = ptr;
770
        return XML_TOK_INVALID;
771
      }
772
      break;
773
#  endif
774
54.6k
    case BT_S:
775
59.8k
    case BT_CR:
776
69.9k
    case BT_LF: {
777
69.9k
      ptr += MINBPC(enc);
778
79.9k
      while (HAS_CHAR(enc, ptr, end)) {
779
79.9k
        switch (BYTE_TYPE(enc, ptr)) {
780
55.4k
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
781
874
        case BT_GT:
782
874
          goto gt;
783
17.9k
        case BT_SOL:
784
17.9k
          goto sol;
785
911
        case BT_S:
786
7.25k
        case BT_CR:
787
9.99k
        case BT_LF:
788
9.99k
          ptr += MINBPC(enc);
789
9.99k
          continue;
790
13
        default:
791
13
          *nextTokPtr = ptr;
792
13
          return XML_TOK_INVALID;
793
79.9k
        }
794
51.0k
        return PREFIX(scanAtts)(enc, ptr, end, nextTokPtr);
795
79.9k
      }
796
76
      return XML_TOK_PARTIAL;
797
69.9k
    }
798
2.27M
    case BT_GT:
799
2.27M
    gt:
800
2.27M
      *nextTokPtr = ptr + MINBPC(enc);
801
2.27M
      return XML_TOK_START_TAG_NO_ATTS;
802
32.1k
    case BT_SOL:
803
50.0k
    sol:
804
50.0k
      ptr += MINBPC(enc);
805
50.0k
      REQUIRE_CHAR(enc, ptr, end);
806
50.0k
      if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
807
7
        *nextTokPtr = ptr;
808
7
        return XML_TOK_INVALID;
809
7
      }
810
50.0k
      *nextTokPtr = ptr + MINBPC(enc);
811
50.0k
      return XML_TOK_EMPTY_ELEMENT_NO_ATTS;
812
15
    default:
813
15
      *nextTokPtr = ptr;
814
15
      return XML_TOK_INVALID;
815
7.52M
    }
816
7.52M
  }
817
170
  return XML_TOK_PARTIAL;
818
2.37M
}
Unexecuted instantiation: xmltok.c:little2_scanLt
Unexecuted instantiation: xmltok.c:big2_scanLt
819
820
static int PTRCALL
821
PREFIX(contentTok)(const ENCODING *enc, const char *ptr, const char *end,
822
7.15M
                   const char **nextTokPtr) {
823
7.15M
  if (ptr >= end)
824
30.7k
    return XML_TOK_NONE;
825
7.12M
  if (MINBPC(enc) > 1) {
826
0
    size_t n = end - ptr;
827
0
    if (n & (MINBPC(enc) - 1)) {
828
0
      n &= ~(MINBPC(enc) - 1);
829
0
      if (n == 0)
830
0
        return XML_TOK_PARTIAL;
831
0
      end = ptr + n;
832
0
    }
833
0
  }
834
7.12M
  switch (BYTE_TYPE(enc, ptr)) {
835
2.48M
  case BT_LT:
836
2.48M
    return PREFIX(scanLt)(enc, ptr + MINBPC(enc), end, nextTokPtr);
837
52.0k
  case BT_AMP:
838
52.0k
    return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
839
432k
  case BT_CR:
840
432k
    ptr += MINBPC(enc);
841
432k
    if (! HAS_CHAR(enc, ptr, end))
842
26
      return XML_TOK_TRAILING_CR;
843
432k
    if (BYTE_TYPE(enc, ptr) == BT_LF)
844
95.3k
      ptr += MINBPC(enc);
845
432k
    *nextTokPtr = ptr;
846
432k
    return XML_TOK_DATA_NEWLINE;
847
3.67M
  case BT_LF:
848
3.67M
    *nextTokPtr = ptr + MINBPC(enc);
849
3.67M
    return XML_TOK_DATA_NEWLINE;
850
10.2k
  case BT_RSQB:
851
10.2k
    ptr += MINBPC(enc);
852
10.2k
    if (! HAS_CHAR(enc, ptr, end))
853
707
      return XML_TOK_TRAILING_RSQB;
854
9.51k
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
855
2.50k
      break;
856
7.01k
    ptr += MINBPC(enc);
857
7.01k
    if (! HAS_CHAR(enc, ptr, end))
858
773
      return XML_TOK_TRAILING_RSQB;
859
6.24k
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
860
6.24k
      ptr -= MINBPC(enc);
861
6.24k
      break;
862
6.24k
    }
863
1
    *nextTokPtr = ptr;
864
1
    return XML_TOK_INVALID;
865
39.3k
    INVALID_CASES(ptr, nextTokPtr)
866
451k
  default:
867
451k
    ptr += MINBPC(enc);
868
451k
    break;
869
7.12M
  }
870
103M
  while (HAS_CHAR(enc, ptr, end)) {
871
103M
    switch (BYTE_TYPE(enc, ptr)) {
872
0
#  define LEAD_CASE(n)                                                         \
873
45.8M
  case BT_LEAD##n:                                                             \
874
45.8M
    if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) {                       \
875
31
      *nextTokPtr = ptr;                                                       \
876
31
      return XML_TOK_DATA_CHARS;                                               \
877
31
    }                                                                          \
878
45.8M
    ptr += n;                                                                  \
879
45.8M
    break;
880
45.6M
      LEAD_CASE(2)
881
142k
      LEAD_CASE(3)
882
64.5k
      LEAD_CASE(4)
883
0
#  undef LEAD_CASE
884
66.0k
    case BT_RSQB:
885
66.0k
      if (HAS_CHARS(enc, ptr, end, 2)) {
886
65.4k
        if (! CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_RSQB)) {
887
15.2k
          ptr += MINBPC(enc);
888
15.2k
          break;
889
15.2k
        }
890
50.2k
        if (HAS_CHARS(enc, ptr, end, 3)) {
891
49.6k
          if (! CHAR_MATCHES(enc, ptr + 2 * MINBPC(enc), ASCII_GT)) {
892
49.6k
            ptr += MINBPC(enc);
893
49.6k
            break;
894
49.6k
          }
895
1
          *nextTokPtr = ptr + 2 * MINBPC(enc);
896
1
          return XML_TOK_INVALID;
897
49.6k
        }
898
50.2k
      }
899
      /* fall through */
900
16.8k
    case BT_AMP:
901
199k
    case BT_LT:
902
199k
    case BT_NONXML:
903
199k
    case BT_MALFORM:
904
199k
    case BT_TRAIL:
905
243k
    case BT_CR:
906
467k
    case BT_LF:
907
467k
      *nextTokPtr = ptr;
908
467k
      return XML_TOK_DATA_CHARS;
909
57.5M
    default:
910
57.5M
      ptr += MINBPC(enc);
911
57.5M
      break;
912
103M
    }
913
103M
  }
914
12.0k
  *nextTokPtr = ptr;
915
12.0k
  return XML_TOK_DATA_CHARS;
916
479k
}
xmltok.c:normal_contentTok
Line
Count
Source
822
7.15M
                   const char **nextTokPtr) {
823
7.15M
  if (ptr >= end)
824
30.7k
    return XML_TOK_NONE;
825
7.12M
  if (MINBPC(enc) > 1) {
826
0
    size_t n = end - ptr;
827
0
    if (n & (MINBPC(enc) - 1)) {
828
0
      n &= ~(MINBPC(enc) - 1);
829
0
      if (n == 0)
830
0
        return XML_TOK_PARTIAL;
831
0
      end = ptr + n;
832
0
    }
833
0
  }
834
7.12M
  switch (BYTE_TYPE(enc, ptr)) {
835
2.48M
  case BT_LT:
836
2.48M
    return PREFIX(scanLt)(enc, ptr + MINBPC(enc), end, nextTokPtr);
837
52.0k
  case BT_AMP:
838
52.0k
    return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
839
432k
  case BT_CR:
840
432k
    ptr += MINBPC(enc);
841
432k
    if (! HAS_CHAR(enc, ptr, end))
842
26
      return XML_TOK_TRAILING_CR;
843
432k
    if (BYTE_TYPE(enc, ptr) == BT_LF)
844
95.3k
      ptr += MINBPC(enc);
845
432k
    *nextTokPtr = ptr;
846
432k
    return XML_TOK_DATA_NEWLINE;
847
3.67M
  case BT_LF:
848
3.67M
    *nextTokPtr = ptr + MINBPC(enc);
849
3.67M
    return XML_TOK_DATA_NEWLINE;
850
10.2k
  case BT_RSQB:
851
10.2k
    ptr += MINBPC(enc);
852
10.2k
    if (! HAS_CHAR(enc, ptr, end))
853
707
      return XML_TOK_TRAILING_RSQB;
854
9.51k
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
855
2.50k
      break;
856
7.01k
    ptr += MINBPC(enc);
857
7.01k
    if (! HAS_CHAR(enc, ptr, end))
858
773
      return XML_TOK_TRAILING_RSQB;
859
6.24k
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
860
6.24k
      ptr -= MINBPC(enc);
861
6.24k
      break;
862
6.24k
    }
863
1
    *nextTokPtr = ptr;
864
1
    return XML_TOK_INVALID;
865
39.3k
    INVALID_CASES(ptr, nextTokPtr)
866
451k
  default:
867
451k
    ptr += MINBPC(enc);
868
451k
    break;
869
7.12M
  }
870
103M
  while (HAS_CHAR(enc, ptr, end)) {
871
103M
    switch (BYTE_TYPE(enc, ptr)) {
872
0
#  define LEAD_CASE(n)                                                         \
873
0
  case BT_LEAD##n:                                                             \
874
0
    if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) {                       \
875
0
      *nextTokPtr = ptr;                                                       \
876
0
      return XML_TOK_DATA_CHARS;                                               \
877
0
    }                                                                          \
878
0
    ptr += n;                                                                  \
879
0
    break;
880
45.6M
      LEAD_CASE(2)
881
142k
      LEAD_CASE(3)
882
64.5k
      LEAD_CASE(4)
883
0
#  undef LEAD_CASE
884
66.0k
    case BT_RSQB:
885
66.0k
      if (HAS_CHARS(enc, ptr, end, 2)) {
886
65.4k
        if (! CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_RSQB)) {
887
15.2k
          ptr += MINBPC(enc);
888
15.2k
          break;
889
15.2k
        }
890
50.2k
        if (HAS_CHARS(enc, ptr, end, 3)) {
891
49.6k
          if (! CHAR_MATCHES(enc, ptr + 2 * MINBPC(enc), ASCII_GT)) {
892
49.6k
            ptr += MINBPC(enc);
893
49.6k
            break;
894
49.6k
          }
895
1
          *nextTokPtr = ptr + 2 * MINBPC(enc);
896
1
          return XML_TOK_INVALID;
897
49.6k
        }
898
50.2k
      }
899
      /* fall through */
900
16.8k
    case BT_AMP:
901
199k
    case BT_LT:
902
199k
    case BT_NONXML:
903
199k
    case BT_MALFORM:
904
199k
    case BT_TRAIL:
905
243k
    case BT_CR:
906
467k
    case BT_LF:
907
467k
      *nextTokPtr = ptr;
908
467k
      return XML_TOK_DATA_CHARS;
909
57.5M
    default:
910
57.5M
      ptr += MINBPC(enc);
911
57.5M
      break;
912
103M
    }
913
103M
  }
914
12.0k
  *nextTokPtr = ptr;
915
12.0k
  return XML_TOK_DATA_CHARS;
916
479k
}
Unexecuted instantiation: xmltok.c:little2_contentTok
Unexecuted instantiation: xmltok.c:big2_contentTok
917
918
/* ptr points to character following "%" */
919
920
static int PTRCALL
921
PREFIX(scanPercent)(const ENCODING *enc, const char *ptr, const char *end,
922
3.46k
                    const char **nextTokPtr) {
923
3.46k
  REQUIRE_CHAR(enc, ptr, end);
924
3.44k
  switch (BYTE_TYPE(enc, ptr)) {
925
1.86k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
926
1.16k
  case BT_S:
927
1.38k
  case BT_LF:
928
1.87k
  case BT_CR:
929
1.88k
  case BT_PERCNT:
930
1.88k
    *nextTokPtr = ptr;
931
1.88k
    return XML_TOK_PERCENT;
932
5
  default:
933
5
    *nextTokPtr = ptr;
934
5
    return XML_TOK_INVALID;
935
3.44k
  }
936
45.5k
  while (HAS_CHAR(enc, ptr, end)) {
937
45.5k
    switch (BYTE_TYPE(enc, ptr)) {
938
151k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
939
1.32k
    case BT_SEMI:
940
1.32k
      *nextTokPtr = ptr + MINBPC(enc);
941
1.32k
      return XML_TOK_PARAM_ENTITY_REF;
942
30
    default:
943
30
      *nextTokPtr = ptr;
944
30
      return XML_TOK_INVALID;
945
45.5k
    }
946
45.5k
  }
947
124
  return XML_TOK_PARTIAL;
948
1.52k
}
xmltok.c:normal_scanPercent
Line
Count
Source
922
3.46k
                    const char **nextTokPtr) {
923
3.46k
  REQUIRE_CHAR(enc, ptr, end);
924
3.44k
  switch (BYTE_TYPE(enc, ptr)) {
925
1.86k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
926
1.16k
  case BT_S:
927
1.38k
  case BT_LF:
928
1.87k
  case BT_CR:
929
1.88k
  case BT_PERCNT:
930
1.88k
    *nextTokPtr = ptr;
931
1.88k
    return XML_TOK_PERCENT;
932
5
  default:
933
5
    *nextTokPtr = ptr;
934
5
    return XML_TOK_INVALID;
935
3.44k
  }
936
45.5k
  while (HAS_CHAR(enc, ptr, end)) {
937
45.5k
    switch (BYTE_TYPE(enc, ptr)) {
938
151k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
939
1.32k
    case BT_SEMI:
940
1.32k
      *nextTokPtr = ptr + MINBPC(enc);
941
1.32k
      return XML_TOK_PARAM_ENTITY_REF;
942
30
    default:
943
30
      *nextTokPtr = ptr;
944
30
      return XML_TOK_INVALID;
945
45.5k
    }
946
45.5k
  }
947
124
  return XML_TOK_PARTIAL;
948
1.52k
}
Unexecuted instantiation: xmltok.c:little2_scanPercent
Unexecuted instantiation: xmltok.c:big2_scanPercent
949
950
static int PTRCALL
951
PREFIX(scanPoundName)(const ENCODING *enc, const char *ptr, const char *end,
952
74.0k
                      const char **nextTokPtr) {
953
74.0k
  REQUIRE_CHAR(enc, ptr, end);
954
74.0k
  switch (BYTE_TYPE(enc, ptr)) {
955
73.2k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
956
3
  default:
957
3
    *nextTokPtr = ptr;
958
3
    return XML_TOK_INVALID;
959
74.0k
  }
960
649k
  while (HAS_CHAR(enc, ptr, end)) {
961
649k
    switch (BYTE_TYPE(enc, ptr)) {
962
2.04M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
963
47.8k
    case BT_CR:
964
49.3k
    case BT_LF:
965
71.3k
    case BT_S:
966
71.6k
    case BT_RPAR:
967
73.1k
    case BT_GT:
968
73.1k
    case BT_PERCNT:
969
73.5k
    case BT_VERBAR:
970
73.5k
      *nextTokPtr = ptr;
971
73.5k
      return XML_TOK_POUND_NAME;
972
23
    default:
973
23
      *nextTokPtr = ptr;
974
23
      return XML_TOK_INVALID;
975
649k
    }
976
649k
  }
977
262
  return -XML_TOK_POUND_NAME;
978
73.9k
}
xmltok.c:normal_scanPoundName
Line
Count
Source
952
74.0k
                      const char **nextTokPtr) {
953
74.0k
  REQUIRE_CHAR(enc, ptr, end);
954
74.0k
  switch (BYTE_TYPE(enc, ptr)) {
955
73.2k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
956
3
  default:
957
3
    *nextTokPtr = ptr;
958
3
    return XML_TOK_INVALID;
959
74.0k
  }
960
649k
  while (HAS_CHAR(enc, ptr, end)) {
961
649k
    switch (BYTE_TYPE(enc, ptr)) {
962
2.04M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
963
47.8k
    case BT_CR:
964
49.3k
    case BT_LF:
965
71.3k
    case BT_S:
966
71.6k
    case BT_RPAR:
967
73.1k
    case BT_GT:
968
73.1k
    case BT_PERCNT:
969
73.5k
    case BT_VERBAR:
970
73.5k
      *nextTokPtr = ptr;
971
73.5k
      return XML_TOK_POUND_NAME;
972
23
    default:
973
23
      *nextTokPtr = ptr;
974
23
      return XML_TOK_INVALID;
975
649k
    }
976
649k
  }
977
262
  return -XML_TOK_POUND_NAME;
978
73.9k
}
Unexecuted instantiation: xmltok.c:little2_scanPoundName
Unexecuted instantiation: xmltok.c:big2_scanPoundName
979
980
static int PTRCALL
981
PREFIX(scanLit)(int open, const ENCODING *enc, const char *ptr, const char *end,
982
37.1k
                const char **nextTokPtr) {
983
100M
  while (HAS_CHAR(enc, ptr, end)) {
984
100M
    int t = BYTE_TYPE(enc, ptr);
985
100M
    switch (t) {
986
165k
      INVALID_CASES(ptr, nextTokPtr)
987
58.6k
    case BT_QUOT:
988
89.6k
    case BT_APOS:
989
89.6k
      ptr += MINBPC(enc);
990
89.6k
      if (t != open)
991
52.8k
        break;
992
36.8k
      if (! HAS_CHAR(enc, ptr, end))
993
1.10k
        return -XML_TOK_LITERAL;
994
35.7k
      *nextTokPtr = ptr;
995
35.7k
      switch (BYTE_TYPE(enc, ptr)) {
996
8.71k
      case BT_S:
997
9.34k
      case BT_CR:
998
18.6k
      case BT_LF:
999
35.4k
      case BT_GT:
1000
35.4k
      case BT_PERCNT:
1001
35.7k
      case BT_LSQB:
1002
35.7k
        return XML_TOK_LITERAL;
1003
7
      default:
1004
7
        return XML_TOK_INVALID;
1005
35.7k
      }
1006
100M
    default:
1007
100M
      ptr += MINBPC(enc);
1008
100M
      break;
1009
100M
    }
1010
100M
  }
1011
172
  return XML_TOK_PARTIAL;
1012
37.1k
}
xmltok.c:normal_scanLit
Line
Count
Source
982
37.1k
                const char **nextTokPtr) {
983
100M
  while (HAS_CHAR(enc, ptr, end)) {
984
100M
    int t = BYTE_TYPE(enc, ptr);
985
100M
    switch (t) {
986
165k
      INVALID_CASES(ptr, nextTokPtr)
987
58.6k
    case BT_QUOT:
988
89.6k
    case BT_APOS:
989
89.6k
      ptr += MINBPC(enc);
990
89.6k
      if (t != open)
991
52.8k
        break;
992
36.8k
      if (! HAS_CHAR(enc, ptr, end))
993
1.10k
        return -XML_TOK_LITERAL;
994
35.7k
      *nextTokPtr = ptr;
995
35.7k
      switch (BYTE_TYPE(enc, ptr)) {
996
8.71k
      case BT_S:
997
9.34k
      case BT_CR:
998
18.6k
      case BT_LF:
999
35.4k
      case BT_GT:
1000
35.4k
      case BT_PERCNT:
1001
35.7k
      case BT_LSQB:
1002
35.7k
        return XML_TOK_LITERAL;
1003
7
      default:
1004
7
        return XML_TOK_INVALID;
1005
35.7k
      }
1006
100M
    default:
1007
100M
      ptr += MINBPC(enc);
1008
100M
      break;
1009
100M
    }
1010
100M
  }
1011
172
  return XML_TOK_PARTIAL;
1012
37.1k
}
Unexecuted instantiation: xmltok.c:little2_scanLit
Unexecuted instantiation: xmltok.c:big2_scanLit
1013
1014
static int PTRCALL
1015
PREFIX(prologTok)(const ENCODING *enc, const char *ptr, const char *end,
1016
7.07M
                  const char **nextTokPtr) {
1017
7.07M
  int tok;
1018
7.07M
  if (ptr >= end)
1019
6.73k
    return XML_TOK_NONE;
1020
7.06M
  if (MINBPC(enc) > 1) {
1021
265
    size_t n = end - ptr;
1022
265
    if (n & (MINBPC(enc) - 1)) {
1023
44
      n &= ~(MINBPC(enc) - 1);
1024
44
      if (n == 0)
1025
4
        return XML_TOK_PARTIAL;
1026
40
      end = ptr + n;
1027
40
    }
1028
265
  }
1029
7.06M
  switch (BYTE_TYPE(enc, ptr)) {
1030
8.11k
  case BT_QUOT:
1031
8.11k
    return PREFIX(scanLit)(BT_QUOT, enc, ptr + MINBPC(enc), end, nextTokPtr);
1032
28.9k
  case BT_APOS:
1033
28.9k
    return PREFIX(scanLit)(BT_APOS, enc, ptr + MINBPC(enc), end, nextTokPtr);
1034
59.2k
  case BT_LT: {
1035
59.2k
    ptr += MINBPC(enc);
1036
59.2k
    REQUIRE_CHAR(enc, ptr, end);
1037
59.1k
    switch (BYTE_TYPE(enc, ptr)) {
1038
48.8k
    case BT_EXCL:
1039
48.8k
      return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1040
4.59k
    case BT_QUEST:
1041
4.59k
      return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1042
4.72k
    case BT_NMSTRT:
1043
5.66k
    case BT_HEX:
1044
5.66k
    case BT_NONASCII:
1045
5.69k
    case BT_LEAD2:
1046
5.73k
    case BT_LEAD3:
1047
5.74k
    case BT_LEAD4:
1048
5.74k
      *nextTokPtr = ptr - MINBPC(enc);
1049
5.74k
      return XML_TOK_INSTANCE_START;
1050
59.1k
    }
1051
9
    *nextTokPtr = ptr;
1052
9
    return XML_TOK_INVALID;
1053
59.1k
  }
1054
182k
  case BT_CR:
1055
182k
    if (ptr + MINBPC(enc) == end) {
1056
489
      *nextTokPtr = end;
1057
      /* indicate that this might be part of a CR/LF pair */
1058
489
      return -XML_TOK_PROLOG_S;
1059
489
    }
1060
    /* fall through */
1061
367k
  case BT_S:
1062
420k
  case BT_LF:
1063
449k
    for (;;) {
1064
449k
      ptr += MINBPC(enc);
1065
449k
      if (! HAS_CHAR(enc, ptr, end))
1066
315
        break;
1067
449k
      switch (BYTE_TYPE(enc, ptr)) {
1068
503
      case BT_S:
1069
18.1k
      case BT_LF:
1070
18.1k
        break;
1071
11.3k
      case BT_CR:
1072
        /* don't split CR/LF pair */
1073
11.3k
        if (ptr + MINBPC(enc) != end)
1074
11.1k
          break;
1075
        /* fall through */
1076
419k
      default:
1077
419k
        *nextTokPtr = ptr;
1078
419k
        return XML_TOK_PROLOG_S;
1079
449k
      }
1080
449k
    }
1081
315
    *nextTokPtr = ptr;
1082
315
    return XML_TOK_PROLOG_S;
1083
3.45k
  case BT_PERCNT:
1084
3.45k
    return PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1085
46.0k
  case BT_COMMA:
1086
46.0k
    *nextTokPtr = ptr + MINBPC(enc);
1087
46.0k
    return XML_TOK_COMMA;
1088
4.57k
  case BT_LSQB:
1089
4.57k
    *nextTokPtr = ptr + MINBPC(enc);
1090
4.57k
    return XML_TOK_OPEN_BRACKET;
1091
2.54k
  case BT_RSQB:
1092
2.54k
    ptr += MINBPC(enc);
1093
2.54k
    if (! HAS_CHAR(enc, ptr, end))
1094
11
      return -XML_TOK_CLOSE_BRACKET;
1095
2.53k
    if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) {
1096
32
      REQUIRE_CHARS(enc, ptr, end, 2);
1097
30
      if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_GT)) {
1098
3
        *nextTokPtr = ptr + 2 * MINBPC(enc);
1099
3
        return XML_TOK_COND_SECT_CLOSE;
1100
3
      }
1101
30
    }
1102
2.52k
    *nextTokPtr = ptr;
1103
2.52k
    return XML_TOK_CLOSE_BRACKET;
1104
5.77M
  case BT_LPAR:
1105
5.77M
    *nextTokPtr = ptr + MINBPC(enc);
1106
5.77M
    return XML_TOK_OPEN_PAREN;
1107
197k
  case BT_RPAR:
1108
197k
    ptr += MINBPC(enc);
1109
197k
    if (! HAS_CHAR(enc, ptr, end))
1110
103
      return -XML_TOK_CLOSE_PAREN;
1111
197k
    switch (BYTE_TYPE(enc, ptr)) {
1112
9.19k
    case BT_AST:
1113
9.19k
      *nextTokPtr = ptr + MINBPC(enc);
1114
9.19k
      return XML_TOK_CLOSE_PAREN_ASTERISK;
1115
34.8k
    case BT_QUEST:
1116
34.8k
      *nextTokPtr = ptr + MINBPC(enc);
1117
34.8k
      return XML_TOK_CLOSE_PAREN_QUESTION;
1118
31.0k
    case BT_PLUS:
1119
31.0k
      *nextTokPtr = ptr + MINBPC(enc);
1120
31.0k
      return XML_TOK_CLOSE_PAREN_PLUS;
1121
4.43k
    case BT_CR:
1122
13.7k
    case BT_LF:
1123
61.9k
    case BT_S:
1124
64.0k
    case BT_GT:
1125
90.8k
    case BT_COMMA:
1126
106k
    case BT_VERBAR:
1127
122k
    case BT_RPAR:
1128
122k
      *nextTokPtr = ptr;
1129
122k
      return XML_TOK_CLOSE_PAREN;
1130
197k
    }
1131
15
    *nextTokPtr = ptr;
1132
15
    return XML_TOK_INVALID;
1133
56.7k
  case BT_VERBAR:
1134
56.7k
    *nextTokPtr = ptr + MINBPC(enc);
1135
56.7k
    return XML_TOK_OR;
1136
43.4k
  case BT_GT:
1137
43.4k
    *nextTokPtr = ptr + MINBPC(enc);
1138
43.4k
    return XML_TOK_DECL_CLOSE;
1139
74.0k
  case BT_NUM:
1140
74.0k
    return PREFIX(scanPoundName)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1141
0
#  define LEAD_CASE(n)                                                         \
1142
63
  case BT_LEAD##n:                                                             \
1143
3.72k
    if (end - ptr < n)                                                         \
1144
74
      return XML_TOK_PARTIAL_CHAR;                                             \
1145
3.65k
    if (IS_INVALID_CHAR(enc, ptr, n)) {                                        \
1146
97
      *nextTokPtr = ptr;                                                       \
1147
97
      return XML_TOK_INVALID;                                                  \
1148
97
    }                                                                          \
1149
3.65k
    if (IS_NMSTRT_CHAR(enc, ptr, n)) {                                         \
1150
2.84k
      ptr += n;                                                                \
1151
2.84k
      tok = XML_TOK_NAME;                                                      \
1152
2.84k
      break;                                                                   \
1153
2.84k
    }                                                                          \
1154
3.55k
    if (IS_NAME_CHAR(enc, ptr, n)) {                                           \
1155
652
      ptr += n;                                                                \
1156
652
      tok = XML_TOK_NMTOKEN;                                                   \
1157
652
      break;                                                                   \
1158
652
    }                                                                          \
1159
715
    *nextTokPtr = ptr;                                                         \
1160
63
    return XML_TOK_INVALID;
1161
3.50k
    LEAD_CASE(2)
1162
7.87k
    LEAD_CASE(3)
1163
274
    LEAD_CASE(4)
1164
0
#  undef LEAD_CASE
1165
217k
  case BT_NMSTRT:
1166
335k
  case BT_HEX:
1167
335k
    tok = XML_TOK_NAME;
1168
335k
    ptr += MINBPC(enc);
1169
335k
    break;
1170
3.12k
  case BT_DIGIT:
1171
3.37k
  case BT_NAME:
1172
3.74k
  case BT_MINUS:
1173
#  ifdef XML_NS
1174
  case BT_COLON:
1175
#  endif
1176
3.74k
    tok = XML_TOK_NMTOKEN;
1177
3.74k
    ptr += MINBPC(enc);
1178
3.74k
    break;
1179
213
  case BT_NONASCII:
1180
213
    if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {
1181
175
      ptr += MINBPC(enc);
1182
175
      tok = XML_TOK_NAME;
1183
175
      break;
1184
175
    }
1185
38
    if (IS_NAME_CHAR_MINBPC(enc, ptr)) {
1186
14
      ptr += MINBPC(enc);
1187
14
      tok = XML_TOK_NMTOKEN;
1188
14
      break;
1189
14
    }
1190
    /* fall through */
1191
96
  default:
1192
96
    *nextTokPtr = ptr;
1193
96
    return XML_TOK_INVALID;
1194
7.06M
  }
1195
10.0M
  while (HAS_CHAR(enc, ptr, end)) {
1196
10.0M
    switch (BYTE_TYPE(enc, ptr)) {
1197
28.2M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1198
17.5k
    case BT_GT:
1199
140k
    case BT_RPAR:
1200
141k
    case BT_COMMA:
1201
158k
    case BT_VERBAR:
1202
163k
    case BT_LSQB:
1203
163k
    case BT_PERCNT:
1204
231k
    case BT_S:
1205
305k
    case BT_CR:
1206
321k
    case BT_LF:
1207
321k
      *nextTokPtr = ptr;
1208
321k
      return tok;
1209
#  ifdef XML_NS
1210
    case BT_COLON:
1211
      ptr += MINBPC(enc);
1212
      switch (tok) {
1213
      case XML_TOK_NAME:
1214
        REQUIRE_CHAR(enc, ptr, end);
1215
        tok = XML_TOK_PREFIXED_NAME;
1216
        switch (BYTE_TYPE(enc, ptr)) {
1217
          CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1218
        default:
1219
          tok = XML_TOK_NMTOKEN;
1220
          break;
1221
        }
1222
        break;
1223
      case XML_TOK_PREFIXED_NAME:
1224
        tok = XML_TOK_NMTOKEN;
1225
        break;
1226
      }
1227
      break;
1228
#  endif
1229
16.3k
    case BT_PLUS:
1230
16.3k
      if (tok == XML_TOK_NMTOKEN) {
1231
2
        *nextTokPtr = ptr;
1232
2
        return XML_TOK_INVALID;
1233
2
      }
1234
16.3k
      *nextTokPtr = ptr + MINBPC(enc);
1235
16.3k
      return XML_TOK_NAME_PLUS;
1236
3.27k
    case BT_AST:
1237
3.27k
      if (tok == XML_TOK_NMTOKEN) {
1238
2
        *nextTokPtr = ptr;
1239
2
        return XML_TOK_INVALID;
1240
2
      }
1241
3.27k
      *nextTokPtr = ptr + MINBPC(enc);
1242
3.27k
      return XML_TOK_NAME_ASTERISK;
1243
495
    case BT_QUEST:
1244
495
      if (tok == XML_TOK_NMTOKEN) {
1245
1
        *nextTokPtr = ptr;
1246
1
        return XML_TOK_INVALID;
1247
1
      }
1248
494
      *nextTokPtr = ptr + MINBPC(enc);
1249
494
      return XML_TOK_NAME_QUESTION;
1250
59
    default:
1251
59
      *nextTokPtr = ptr;
1252
59
      return XML_TOK_INVALID;
1253
10.0M
    }
1254
10.0M
  }
1255
931
  return -tok;
1256
342k
}
xmltok.c:normal_prologTok
Line
Count
Source
1016
7.07M
                  const char **nextTokPtr) {
1017
7.07M
  int tok;
1018
7.07M
  if (ptr >= end)
1019
6.72k
    return XML_TOK_NONE;
1020
7.06M
  if (MINBPC(enc) > 1) {
1021
0
    size_t n = end - ptr;
1022
0
    if (n & (MINBPC(enc) - 1)) {
1023
0
      n &= ~(MINBPC(enc) - 1);
1024
0
      if (n == 0)
1025
0
        return XML_TOK_PARTIAL;
1026
0
      end = ptr + n;
1027
0
    }
1028
0
  }
1029
7.06M
  switch (BYTE_TYPE(enc, ptr)) {
1030
8.11k
  case BT_QUOT:
1031
8.11k
    return PREFIX(scanLit)(BT_QUOT, enc, ptr + MINBPC(enc), end, nextTokPtr);
1032
28.9k
  case BT_APOS:
1033
28.9k
    return PREFIX(scanLit)(BT_APOS, enc, ptr + MINBPC(enc), end, nextTokPtr);
1034
59.2k
  case BT_LT: {
1035
59.2k
    ptr += MINBPC(enc);
1036
59.2k
    REQUIRE_CHAR(enc, ptr, end);
1037
59.1k
    switch (BYTE_TYPE(enc, ptr)) {
1038
48.8k
    case BT_EXCL:
1039
48.8k
      return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1040
4.59k
    case BT_QUEST:
1041
4.59k
      return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1042
4.72k
    case BT_NMSTRT:
1043
5.66k
    case BT_HEX:
1044
5.66k
    case BT_NONASCII:
1045
5.69k
    case BT_LEAD2:
1046
5.73k
    case BT_LEAD3:
1047
5.74k
    case BT_LEAD4:
1048
5.74k
      *nextTokPtr = ptr - MINBPC(enc);
1049
5.74k
      return XML_TOK_INSTANCE_START;
1050
59.1k
    }
1051
9
    *nextTokPtr = ptr;
1052
9
    return XML_TOK_INVALID;
1053
59.1k
  }
1054
182k
  case BT_CR:
1055
182k
    if (ptr + MINBPC(enc) == end) {
1056
489
      *nextTokPtr = end;
1057
      /* indicate that this might be part of a CR/LF pair */
1058
489
      return -XML_TOK_PROLOG_S;
1059
489
    }
1060
    /* fall through */
1061
367k
  case BT_S:
1062
420k
  case BT_LF:
1063
449k
    for (;;) {
1064
449k
      ptr += MINBPC(enc);
1065
449k
      if (! HAS_CHAR(enc, ptr, end))
1066
315
        break;
1067
449k
      switch (BYTE_TYPE(enc, ptr)) {
1068
503
      case BT_S:
1069
18.1k
      case BT_LF:
1070
18.1k
        break;
1071
11.3k
      case BT_CR:
1072
        /* don't split CR/LF pair */
1073
11.3k
        if (ptr + MINBPC(enc) != end)
1074
11.1k
          break;
1075
        /* fall through */
1076
419k
      default:
1077
419k
        *nextTokPtr = ptr;
1078
419k
        return XML_TOK_PROLOG_S;
1079
449k
      }
1080
449k
    }
1081
315
    *nextTokPtr = ptr;
1082
315
    return XML_TOK_PROLOG_S;
1083
3.45k
  case BT_PERCNT:
1084
3.45k
    return PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1085
46.0k
  case BT_COMMA:
1086
46.0k
    *nextTokPtr = ptr + MINBPC(enc);
1087
46.0k
    return XML_TOK_COMMA;
1088
4.57k
  case BT_LSQB:
1089
4.57k
    *nextTokPtr = ptr + MINBPC(enc);
1090
4.57k
    return XML_TOK_OPEN_BRACKET;
1091
2.54k
  case BT_RSQB:
1092
2.54k
    ptr += MINBPC(enc);
1093
2.54k
    if (! HAS_CHAR(enc, ptr, end))
1094
11
      return -XML_TOK_CLOSE_BRACKET;
1095
2.53k
    if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) {
1096
32
      REQUIRE_CHARS(enc, ptr, end, 2);
1097
30
      if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_GT)) {
1098
3
        *nextTokPtr = ptr + 2 * MINBPC(enc);
1099
3
        return XML_TOK_COND_SECT_CLOSE;
1100
3
      }
1101
30
    }
1102
2.52k
    *nextTokPtr = ptr;
1103
2.52k
    return XML_TOK_CLOSE_BRACKET;
1104
5.77M
  case BT_LPAR:
1105
5.77M
    *nextTokPtr = ptr + MINBPC(enc);
1106
5.77M
    return XML_TOK_OPEN_PAREN;
1107
197k
  case BT_RPAR:
1108
197k
    ptr += MINBPC(enc);
1109
197k
    if (! HAS_CHAR(enc, ptr, end))
1110
103
      return -XML_TOK_CLOSE_PAREN;
1111
197k
    switch (BYTE_TYPE(enc, ptr)) {
1112
9.19k
    case BT_AST:
1113
9.19k
      *nextTokPtr = ptr + MINBPC(enc);
1114
9.19k
      return XML_TOK_CLOSE_PAREN_ASTERISK;
1115
34.8k
    case BT_QUEST:
1116
34.8k
      *nextTokPtr = ptr + MINBPC(enc);
1117
34.8k
      return XML_TOK_CLOSE_PAREN_QUESTION;
1118
31.0k
    case BT_PLUS:
1119
31.0k
      *nextTokPtr = ptr + MINBPC(enc);
1120
31.0k
      return XML_TOK_CLOSE_PAREN_PLUS;
1121
4.43k
    case BT_CR:
1122
13.7k
    case BT_LF:
1123
61.9k
    case BT_S:
1124
64.0k
    case BT_GT:
1125
90.8k
    case BT_COMMA:
1126
106k
    case BT_VERBAR:
1127
122k
    case BT_RPAR:
1128
122k
      *nextTokPtr = ptr;
1129
122k
      return XML_TOK_CLOSE_PAREN;
1130
197k
    }
1131
15
    *nextTokPtr = ptr;
1132
15
    return XML_TOK_INVALID;
1133
56.7k
  case BT_VERBAR:
1134
56.7k
    *nextTokPtr = ptr + MINBPC(enc);
1135
56.7k
    return XML_TOK_OR;
1136
43.4k
  case BT_GT:
1137
43.4k
    *nextTokPtr = ptr + MINBPC(enc);
1138
43.4k
    return XML_TOK_DECL_CLOSE;
1139
74.0k
  case BT_NUM:
1140
74.0k
    return PREFIX(scanPoundName)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1141
0
#  define LEAD_CASE(n)                                                         \
1142
0
  case BT_LEAD##n:                                                             \
1143
0
    if (end - ptr < n)                                                         \
1144
0
      return XML_TOK_PARTIAL_CHAR;                                             \
1145
0
    if (IS_INVALID_CHAR(enc, ptr, n)) {                                        \
1146
0
      *nextTokPtr = ptr;                                                       \
1147
0
      return XML_TOK_INVALID;                                                  \
1148
0
    }                                                                          \
1149
0
    if (IS_NMSTRT_CHAR(enc, ptr, n)) {                                         \
1150
0
      ptr += n;                                                                \
1151
0
      tok = XML_TOK_NAME;                                                      \
1152
0
      break;                                                                   \
1153
0
    }                                                                          \
1154
0
    if (IS_NAME_CHAR(enc, ptr, n)) {                                           \
1155
0
      ptr += n;                                                                \
1156
0
      tok = XML_TOK_NMTOKEN;                                                   \
1157
0
      break;                                                                   \
1158
0
    }                                                                          \
1159
0
    *nextTokPtr = ptr;                                                         \
1160
0
    return XML_TOK_INVALID;
1161
3.50k
    LEAD_CASE(2)
1162
7.87k
    LEAD_CASE(3)
1163
174
    LEAD_CASE(4)
1164
0
#  undef LEAD_CASE
1165
217k
  case BT_NMSTRT:
1166
335k
  case BT_HEX:
1167
335k
    tok = XML_TOK_NAME;
1168
335k
    ptr += MINBPC(enc);
1169
335k
    break;
1170
3.12k
  case BT_DIGIT:
1171
3.37k
  case BT_NAME:
1172
3.74k
  case BT_MINUS:
1173
#  ifdef XML_NS
1174
  case BT_COLON:
1175
#  endif
1176
3.74k
    tok = XML_TOK_NMTOKEN;
1177
3.74k
    ptr += MINBPC(enc);
1178
3.74k
    break;
1179
0
  case BT_NONASCII:
1180
0
    if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {
1181
0
      ptr += MINBPC(enc);
1182
0
      tok = XML_TOK_NAME;
1183
0
      break;
1184
0
    }
1185
0
    if (IS_NAME_CHAR_MINBPC(enc, ptr)) {
1186
0
      ptr += MINBPC(enc);
1187
0
      tok = XML_TOK_NMTOKEN;
1188
0
      break;
1189
0
    }
1190
    /* fall through */
1191
61
  default:
1192
61
    *nextTokPtr = ptr;
1193
61
    return XML_TOK_INVALID;
1194
7.06M
  }
1195
9.79M
  while (HAS_CHAR(enc, ptr, end)) {
1196
9.79M
    switch (BYTE_TYPE(enc, ptr)) {
1197
26.8M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1198
17.5k
    case BT_GT:
1199
140k
    case BT_RPAR:
1200
141k
    case BT_COMMA:
1201
158k
    case BT_VERBAR:
1202
163k
    case BT_LSQB:
1203
163k
    case BT_PERCNT:
1204
231k
    case BT_S:
1205
305k
    case BT_CR:
1206
321k
    case BT_LF:
1207
321k
      *nextTokPtr = ptr;
1208
321k
      return tok;
1209
#  ifdef XML_NS
1210
    case BT_COLON:
1211
      ptr += MINBPC(enc);
1212
      switch (tok) {
1213
      case XML_TOK_NAME:
1214
        REQUIRE_CHAR(enc, ptr, end);
1215
        tok = XML_TOK_PREFIXED_NAME;
1216
        switch (BYTE_TYPE(enc, ptr)) {
1217
          CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1218
        default:
1219
          tok = XML_TOK_NMTOKEN;
1220
          break;
1221
        }
1222
        break;
1223
      case XML_TOK_PREFIXED_NAME:
1224
        tok = XML_TOK_NMTOKEN;
1225
        break;
1226
      }
1227
      break;
1228
#  endif
1229
16.3k
    case BT_PLUS:
1230
16.3k
      if (tok == XML_TOK_NMTOKEN) {
1231
2
        *nextTokPtr = ptr;
1232
2
        return XML_TOK_INVALID;
1233
2
      }
1234
16.3k
      *nextTokPtr = ptr + MINBPC(enc);
1235
16.3k
      return XML_TOK_NAME_PLUS;
1236
3.27k
    case BT_AST:
1237
3.27k
      if (tok == XML_TOK_NMTOKEN) {
1238
2
        *nextTokPtr = ptr;
1239
2
        return XML_TOK_INVALID;
1240
2
      }
1241
3.27k
      *nextTokPtr = ptr + MINBPC(enc);
1242
3.27k
      return XML_TOK_NAME_ASTERISK;
1243
495
    case BT_QUEST:
1244
495
      if (tok == XML_TOK_NMTOKEN) {
1245
1
        *nextTokPtr = ptr;
1246
1
        return XML_TOK_INVALID;
1247
1
      }
1248
494
      *nextTokPtr = ptr + MINBPC(enc);
1249
494
      return XML_TOK_NAME_QUESTION;
1250
44
    default:
1251
44
      *nextTokPtr = ptr;
1252
44
      return XML_TOK_INVALID;
1253
9.79M
    }
1254
9.79M
  }
1255
873
  return -tok;
1256
342k
}
xmltok.c:little2_prologTok
Line
Count
Source
1016
143
                  const char **nextTokPtr) {
1017
143
  int tok;
1018
143
  if (ptr >= end)
1019
2
    return XML_TOK_NONE;
1020
141
  if (MINBPC(enc) > 1) {
1021
141
    size_t n = end - ptr;
1022
141
    if (n & (MINBPC(enc) - 1)) {
1023
26
      n &= ~(MINBPC(enc) - 1);
1024
26
      if (n == 0)
1025
2
        return XML_TOK_PARTIAL;
1026
24
      end = ptr + n;
1027
24
    }
1028
141
  }
1029
139
  switch (BYTE_TYPE(enc, ptr)) {
1030
0
  case BT_QUOT:
1031
0
    return PREFIX(scanLit)(BT_QUOT, enc, ptr + MINBPC(enc), end, nextTokPtr);
1032
0
  case BT_APOS:
1033
0
    return PREFIX(scanLit)(BT_APOS, enc, ptr + MINBPC(enc), end, nextTokPtr);
1034
0
  case BT_LT: {
1035
0
    ptr += MINBPC(enc);
1036
0
    REQUIRE_CHAR(enc, ptr, end);
1037
0
    switch (BYTE_TYPE(enc, ptr)) {
1038
0
    case BT_EXCL:
1039
0
      return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1040
0
    case BT_QUEST:
1041
0
      return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1042
0
    case BT_NMSTRT:
1043
0
    case BT_HEX:
1044
0
    case BT_NONASCII:
1045
0
    case BT_LEAD2:
1046
0
    case BT_LEAD3:
1047
0
    case BT_LEAD4:
1048
0
      *nextTokPtr = ptr - MINBPC(enc);
1049
0
      return XML_TOK_INSTANCE_START;
1050
0
    }
1051
0
    *nextTokPtr = ptr;
1052
0
    return XML_TOK_INVALID;
1053
0
  }
1054
0
  case BT_CR:
1055
0
    if (ptr + MINBPC(enc) == end) {
1056
0
      *nextTokPtr = end;
1057
      /* indicate that this might be part of a CR/LF pair */
1058
0
      return -XML_TOK_PROLOG_S;
1059
0
    }
1060
    /* fall through */
1061
0
  case BT_S:
1062
0
  case BT_LF:
1063
0
    for (;;) {
1064
0
      ptr += MINBPC(enc);
1065
0
      if (! HAS_CHAR(enc, ptr, end))
1066
0
        break;
1067
0
      switch (BYTE_TYPE(enc, ptr)) {
1068
0
      case BT_S:
1069
0
      case BT_LF:
1070
0
        break;
1071
0
      case BT_CR:
1072
        /* don't split CR/LF pair */
1073
0
        if (ptr + MINBPC(enc) != end)
1074
0
          break;
1075
        /* fall through */
1076
0
      default:
1077
0
        *nextTokPtr = ptr;
1078
0
        return XML_TOK_PROLOG_S;
1079
0
      }
1080
0
    }
1081
0
    *nextTokPtr = ptr;
1082
0
    return XML_TOK_PROLOG_S;
1083
0
  case BT_PERCNT:
1084
0
    return PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1085
0
  case BT_COMMA:
1086
0
    *nextTokPtr = ptr + MINBPC(enc);
1087
0
    return XML_TOK_COMMA;
1088
0
  case BT_LSQB:
1089
0
    *nextTokPtr = ptr + MINBPC(enc);
1090
0
    return XML_TOK_OPEN_BRACKET;
1091
0
  case BT_RSQB:
1092
0
    ptr += MINBPC(enc);
1093
0
    if (! HAS_CHAR(enc, ptr, end))
1094
0
      return -XML_TOK_CLOSE_BRACKET;
1095
0
    if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) {
1096
0
      REQUIRE_CHARS(enc, ptr, end, 2);
1097
0
      if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_GT)) {
1098
0
        *nextTokPtr = ptr + 2 * MINBPC(enc);
1099
0
        return XML_TOK_COND_SECT_CLOSE;
1100
0
      }
1101
0
    }
1102
0
    *nextTokPtr = ptr;
1103
0
    return XML_TOK_CLOSE_BRACKET;
1104
0
  case BT_LPAR:
1105
0
    *nextTokPtr = ptr + MINBPC(enc);
1106
0
    return XML_TOK_OPEN_PAREN;
1107
0
  case BT_RPAR:
1108
0
    ptr += MINBPC(enc);
1109
0
    if (! HAS_CHAR(enc, ptr, end))
1110
0
      return -XML_TOK_CLOSE_PAREN;
1111
0
    switch (BYTE_TYPE(enc, ptr)) {
1112
0
    case BT_AST:
1113
0
      *nextTokPtr = ptr + MINBPC(enc);
1114
0
      return XML_TOK_CLOSE_PAREN_ASTERISK;
1115
0
    case BT_QUEST:
1116
0
      *nextTokPtr = ptr + MINBPC(enc);
1117
0
      return XML_TOK_CLOSE_PAREN_QUESTION;
1118
0
    case BT_PLUS:
1119
0
      *nextTokPtr = ptr + MINBPC(enc);
1120
0
      return XML_TOK_CLOSE_PAREN_PLUS;
1121
0
    case BT_CR:
1122
0
    case BT_LF:
1123
0
    case BT_S:
1124
0
    case BT_GT:
1125
0
    case BT_COMMA:
1126
0
    case BT_VERBAR:
1127
0
    case BT_RPAR:
1128
0
      *nextTokPtr = ptr;
1129
0
      return XML_TOK_CLOSE_PAREN;
1130
0
    }
1131
0
    *nextTokPtr = ptr;
1132
0
    return XML_TOK_INVALID;
1133
0
  case BT_VERBAR:
1134
0
    *nextTokPtr = ptr + MINBPC(enc);
1135
0
    return XML_TOK_OR;
1136
0
  case BT_GT:
1137
0
    *nextTokPtr = ptr + MINBPC(enc);
1138
0
    return XML_TOK_DECL_CLOSE;
1139
0
  case BT_NUM:
1140
0
    return PREFIX(scanPoundName)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1141
0
#  define LEAD_CASE(n)                                                         \
1142
0
  case BT_LEAD##n:                                                             \
1143
0
    if (end - ptr < n)                                                         \
1144
0
      return XML_TOK_PARTIAL_CHAR;                                             \
1145
0
    if (IS_INVALID_CHAR(enc, ptr, n)) {                                        \
1146
0
      *nextTokPtr = ptr;                                                       \
1147
0
      return XML_TOK_INVALID;                                                  \
1148
0
    }                                                                          \
1149
0
    if (IS_NMSTRT_CHAR(enc, ptr, n)) {                                         \
1150
0
      ptr += n;                                                                \
1151
0
      tok = XML_TOK_NAME;                                                      \
1152
0
      break;                                                                   \
1153
0
    }                                                                          \
1154
0
    if (IS_NAME_CHAR(enc, ptr, n)) {                                           \
1155
0
      ptr += n;                                                                \
1156
0
      tok = XML_TOK_NMTOKEN;                                                   \
1157
0
      break;                                                                   \
1158
0
    }                                                                          \
1159
0
    *nextTokPtr = ptr;                                                         \
1160
0
    return XML_TOK_INVALID;
1161
0
    LEAD_CASE(2)
1162
0
    LEAD_CASE(3)
1163
28
    LEAD_CASE(4)
1164
0
#  undef LEAD_CASE
1165
0
  case BT_NMSTRT:
1166
0
  case BT_HEX:
1167
0
    tok = XML_TOK_NAME;
1168
0
    ptr += MINBPC(enc);
1169
0
    break;
1170
0
  case BT_DIGIT:
1171
0
  case BT_NAME:
1172
0
  case BT_MINUS:
1173
#  ifdef XML_NS
1174
  case BT_COLON:
1175
#  endif
1176
0
    tok = XML_TOK_NMTOKEN;
1177
0
    ptr += MINBPC(enc);
1178
0
    break;
1179
121
  case BT_NONASCII:
1180
121
    if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {
1181
103
      ptr += MINBPC(enc);
1182
103
      tok = XML_TOK_NAME;
1183
103
      break;
1184
103
    }
1185
18
    if (IS_NAME_CHAR_MINBPC(enc, ptr)) {
1186
5
      ptr += MINBPC(enc);
1187
5
      tok = XML_TOK_NMTOKEN;
1188
5
      break;
1189
5
    }
1190
    /* fall through */
1191
18
  default:
1192
18
    *nextTokPtr = ptr;
1193
18
    return XML_TOK_INVALID;
1194
139
  }
1195
189k
  while (HAS_CHAR(enc, ptr, end)) {
1196
189k
    switch (BYTE_TYPE(enc, ptr)) {
1197
949k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1198
0
    case BT_GT:
1199
0
    case BT_RPAR:
1200
0
    case BT_COMMA:
1201
0
    case BT_VERBAR:
1202
0
    case BT_LSQB:
1203
0
    case BT_PERCNT:
1204
0
    case BT_S:
1205
0
    case BT_CR:
1206
0
    case BT_LF:
1207
0
      *nextTokPtr = ptr;
1208
0
      return tok;
1209
#  ifdef XML_NS
1210
    case BT_COLON:
1211
      ptr += MINBPC(enc);
1212
      switch (tok) {
1213
      case XML_TOK_NAME:
1214
        REQUIRE_CHAR(enc, ptr, end);
1215
        tok = XML_TOK_PREFIXED_NAME;
1216
        switch (BYTE_TYPE(enc, ptr)) {
1217
          CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1218
        default:
1219
          tok = XML_TOK_NMTOKEN;
1220
          break;
1221
        }
1222
        break;
1223
      case XML_TOK_PREFIXED_NAME:
1224
        tok = XML_TOK_NMTOKEN;
1225
        break;
1226
      }
1227
      break;
1228
#  endif
1229
0
    case BT_PLUS:
1230
0
      if (tok == XML_TOK_NMTOKEN) {
1231
0
        *nextTokPtr = ptr;
1232
0
        return XML_TOK_INVALID;
1233
0
      }
1234
0
      *nextTokPtr = ptr + MINBPC(enc);
1235
0
      return XML_TOK_NAME_PLUS;
1236
0
    case BT_AST:
1237
0
      if (tok == XML_TOK_NMTOKEN) {
1238
0
        *nextTokPtr = ptr;
1239
0
        return XML_TOK_INVALID;
1240
0
      }
1241
0
      *nextTokPtr = ptr + MINBPC(enc);
1242
0
      return XML_TOK_NAME_ASTERISK;
1243
0
    case BT_QUEST:
1244
0
      if (tok == XML_TOK_NMTOKEN) {
1245
0
        *nextTokPtr = ptr;
1246
0
        return XML_TOK_INVALID;
1247
0
      }
1248
0
      *nextTokPtr = ptr + MINBPC(enc);
1249
0
      return XML_TOK_NAME_QUESTION;
1250
9
    default:
1251
9
      *nextTokPtr = ptr;
1252
9
      return XML_TOK_INVALID;
1253
189k
    }
1254
189k
  }
1255
32
  return -tok;
1256
108
}
xmltok.c:big2_prologTok
Line
Count
Source
1016
126
                  const char **nextTokPtr) {
1017
126
  int tok;
1018
126
  if (ptr >= end)
1019
2
    return XML_TOK_NONE;
1020
124
  if (MINBPC(enc) > 1) {
1021
124
    size_t n = end - ptr;
1022
124
    if (n & (MINBPC(enc) - 1)) {
1023
18
      n &= ~(MINBPC(enc) - 1);
1024
18
      if (n == 0)
1025
2
        return XML_TOK_PARTIAL;
1026
16
      end = ptr + n;
1027
16
    }
1028
124
  }
1029
122
  switch (BYTE_TYPE(enc, ptr)) {
1030
0
  case BT_QUOT:
1031
0
    return PREFIX(scanLit)(BT_QUOT, enc, ptr + MINBPC(enc), end, nextTokPtr);
1032
0
  case BT_APOS:
1033
0
    return PREFIX(scanLit)(BT_APOS, enc, ptr + MINBPC(enc), end, nextTokPtr);
1034
0
  case BT_LT: {
1035
0
    ptr += MINBPC(enc);
1036
0
    REQUIRE_CHAR(enc, ptr, end);
1037
0
    switch (BYTE_TYPE(enc, ptr)) {
1038
0
    case BT_EXCL:
1039
0
      return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1040
0
    case BT_QUEST:
1041
0
      return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1042
0
    case BT_NMSTRT:
1043
0
    case BT_HEX:
1044
0
    case BT_NONASCII:
1045
0
    case BT_LEAD2:
1046
0
    case BT_LEAD3:
1047
0
    case BT_LEAD4:
1048
0
      *nextTokPtr = ptr - MINBPC(enc);
1049
0
      return XML_TOK_INSTANCE_START;
1050
0
    }
1051
0
    *nextTokPtr = ptr;
1052
0
    return XML_TOK_INVALID;
1053
0
  }
1054
0
  case BT_CR:
1055
0
    if (ptr + MINBPC(enc) == end) {
1056
0
      *nextTokPtr = end;
1057
      /* indicate that this might be part of a CR/LF pair */
1058
0
      return -XML_TOK_PROLOG_S;
1059
0
    }
1060
    /* fall through */
1061
0
  case BT_S:
1062
0
  case BT_LF:
1063
0
    for (;;) {
1064
0
      ptr += MINBPC(enc);
1065
0
      if (! HAS_CHAR(enc, ptr, end))
1066
0
        break;
1067
0
      switch (BYTE_TYPE(enc, ptr)) {
1068
0
      case BT_S:
1069
0
      case BT_LF:
1070
0
        break;
1071
0
      case BT_CR:
1072
        /* don't split CR/LF pair */
1073
0
        if (ptr + MINBPC(enc) != end)
1074
0
          break;
1075
        /* fall through */
1076
0
      default:
1077
0
        *nextTokPtr = ptr;
1078
0
        return XML_TOK_PROLOG_S;
1079
0
      }
1080
0
    }
1081
0
    *nextTokPtr = ptr;
1082
0
    return XML_TOK_PROLOG_S;
1083
0
  case BT_PERCNT:
1084
0
    return PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1085
0
  case BT_COMMA:
1086
0
    *nextTokPtr = ptr + MINBPC(enc);
1087
0
    return XML_TOK_COMMA;
1088
0
  case BT_LSQB:
1089
0
    *nextTokPtr = ptr + MINBPC(enc);
1090
0
    return XML_TOK_OPEN_BRACKET;
1091
0
  case BT_RSQB:
1092
0
    ptr += MINBPC(enc);
1093
0
    if (! HAS_CHAR(enc, ptr, end))
1094
0
      return -XML_TOK_CLOSE_BRACKET;
1095
0
    if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) {
1096
0
      REQUIRE_CHARS(enc, ptr, end, 2);
1097
0
      if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_GT)) {
1098
0
        *nextTokPtr = ptr + 2 * MINBPC(enc);
1099
0
        return XML_TOK_COND_SECT_CLOSE;
1100
0
      }
1101
0
    }
1102
0
    *nextTokPtr = ptr;
1103
0
    return XML_TOK_CLOSE_BRACKET;
1104
0
  case BT_LPAR:
1105
0
    *nextTokPtr = ptr + MINBPC(enc);
1106
0
    return XML_TOK_OPEN_PAREN;
1107
0
  case BT_RPAR:
1108
0
    ptr += MINBPC(enc);
1109
0
    if (! HAS_CHAR(enc, ptr, end))
1110
0
      return -XML_TOK_CLOSE_PAREN;
1111
0
    switch (BYTE_TYPE(enc, ptr)) {
1112
0
    case BT_AST:
1113
0
      *nextTokPtr = ptr + MINBPC(enc);
1114
0
      return XML_TOK_CLOSE_PAREN_ASTERISK;
1115
0
    case BT_QUEST:
1116
0
      *nextTokPtr = ptr + MINBPC(enc);
1117
0
      return XML_TOK_CLOSE_PAREN_QUESTION;
1118
0
    case BT_PLUS:
1119
0
      *nextTokPtr = ptr + MINBPC(enc);
1120
0
      return XML_TOK_CLOSE_PAREN_PLUS;
1121
0
    case BT_CR:
1122
0
    case BT_LF:
1123
0
    case BT_S:
1124
0
    case BT_GT:
1125
0
    case BT_COMMA:
1126
0
    case BT_VERBAR:
1127
0
    case BT_RPAR:
1128
0
      *nextTokPtr = ptr;
1129
0
      return XML_TOK_CLOSE_PAREN;
1130
0
    }
1131
0
    *nextTokPtr = ptr;
1132
0
    return XML_TOK_INVALID;
1133
0
  case BT_VERBAR:
1134
0
    *nextTokPtr = ptr + MINBPC(enc);
1135
0
    return XML_TOK_OR;
1136
0
  case BT_GT:
1137
0
    *nextTokPtr = ptr + MINBPC(enc);
1138
0
    return XML_TOK_DECL_CLOSE;
1139
0
  case BT_NUM:
1140
0
    return PREFIX(scanPoundName)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1141
0
#  define LEAD_CASE(n)                                                         \
1142
0
  case BT_LEAD##n:                                                             \
1143
0
    if (end - ptr < n)                                                         \
1144
0
      return XML_TOK_PARTIAL_CHAR;                                             \
1145
0
    if (IS_INVALID_CHAR(enc, ptr, n)) {                                        \
1146
0
      *nextTokPtr = ptr;                                                       \
1147
0
      return XML_TOK_INVALID;                                                  \
1148
0
    }                                                                          \
1149
0
    if (IS_NMSTRT_CHAR(enc, ptr, n)) {                                         \
1150
0
      ptr += n;                                                                \
1151
0
      tok = XML_TOK_NAME;                                                      \
1152
0
      break;                                                                   \
1153
0
    }                                                                          \
1154
0
    if (IS_NAME_CHAR(enc, ptr, n)) {                                           \
1155
0
      ptr += n;                                                                \
1156
0
      tok = XML_TOK_NMTOKEN;                                                   \
1157
0
      break;                                                                   \
1158
0
    }                                                                          \
1159
0
    *nextTokPtr = ptr;                                                         \
1160
0
    return XML_TOK_INVALID;
1161
0
    LEAD_CASE(2)
1162
0
    LEAD_CASE(3)
1163
72
    LEAD_CASE(4)
1164
0
#  undef LEAD_CASE
1165
0
  case BT_NMSTRT:
1166
0
  case BT_HEX:
1167
0
    tok = XML_TOK_NAME;
1168
0
    ptr += MINBPC(enc);
1169
0
    break;
1170
0
  case BT_DIGIT:
1171
0
  case BT_NAME:
1172
0
  case BT_MINUS:
1173
#  ifdef XML_NS
1174
  case BT_COLON:
1175
#  endif
1176
0
    tok = XML_TOK_NMTOKEN;
1177
0
    ptr += MINBPC(enc);
1178
0
    break;
1179
92
  case BT_NONASCII:
1180
92
    if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {
1181
72
      ptr += MINBPC(enc);
1182
72
      tok = XML_TOK_NAME;
1183
72
      break;
1184
72
    }
1185
20
    if (IS_NAME_CHAR_MINBPC(enc, ptr)) {
1186
9
      ptr += MINBPC(enc);
1187
9
      tok = XML_TOK_NMTOKEN;
1188
9
      break;
1189
9
    }
1190
    /* fall through */
1191
17
  default:
1192
17
    *nextTokPtr = ptr;
1193
17
    return XML_TOK_INVALID;
1194
122
  }
1195
79.3k
  while (HAS_CHAR(enc, ptr, end)) {
1196
79.3k
    switch (BYTE_TYPE(enc, ptr)) {
1197
396k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1198
0
    case BT_GT:
1199
0
    case BT_RPAR:
1200
0
    case BT_COMMA:
1201
0
    case BT_VERBAR:
1202
0
    case BT_LSQB:
1203
0
    case BT_PERCNT:
1204
0
    case BT_S:
1205
0
    case BT_CR:
1206
0
    case BT_LF:
1207
0
      *nextTokPtr = ptr;
1208
0
      return tok;
1209
#  ifdef XML_NS
1210
    case BT_COLON:
1211
      ptr += MINBPC(enc);
1212
      switch (tok) {
1213
      case XML_TOK_NAME:
1214
        REQUIRE_CHAR(enc, ptr, end);
1215
        tok = XML_TOK_PREFIXED_NAME;
1216
        switch (BYTE_TYPE(enc, ptr)) {
1217
          CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1218
        default:
1219
          tok = XML_TOK_NMTOKEN;
1220
          break;
1221
        }
1222
        break;
1223
      case XML_TOK_PREFIXED_NAME:
1224
        tok = XML_TOK_NMTOKEN;
1225
        break;
1226
      }
1227
      break;
1228
#  endif
1229
0
    case BT_PLUS:
1230
0
      if (tok == XML_TOK_NMTOKEN) {
1231
0
        *nextTokPtr = ptr;
1232
0
        return XML_TOK_INVALID;
1233
0
      }
1234
0
      *nextTokPtr = ptr + MINBPC(enc);
1235
0
      return XML_TOK_NAME_PLUS;
1236
0
    case BT_AST:
1237
0
      if (tok == XML_TOK_NMTOKEN) {
1238
0
        *nextTokPtr = ptr;
1239
0
        return XML_TOK_INVALID;
1240
0
      }
1241
0
      *nextTokPtr = ptr + MINBPC(enc);
1242
0
      return XML_TOK_NAME_ASTERISK;
1243
0
    case BT_QUEST:
1244
0
      if (tok == XML_TOK_NMTOKEN) {
1245
0
        *nextTokPtr = ptr;
1246
0
        return XML_TOK_INVALID;
1247
0
      }
1248
0
      *nextTokPtr = ptr + MINBPC(enc);
1249
0
      return XML_TOK_NAME_QUESTION;
1250
6
    default:
1251
6
      *nextTokPtr = ptr;
1252
6
      return XML_TOK_INVALID;
1253
79.3k
    }
1254
79.3k
  }
1255
26
  return -tok;
1256
81
}
1257
1258
static int PTRCALL
1259
PREFIX(attributeValueTok)(const ENCODING *enc, const char *ptr, const char *end,
1260
159M
                          const char **nextTokPtr) {
1261
159M
  const char *start;
1262
159M
  if (ptr >= end)
1263
28.1M
    return XML_TOK_NONE;
1264
131M
  else if (! HAS_CHAR(enc, ptr, end)) {
1265
    /* This line cannot be executed.  The incoming data has already
1266
     * been tokenized once, so incomplete characters like this have
1267
     * already been eliminated from the input.  Retaining the paranoia
1268
     * check is still valuable, however.
1269
     */
1270
0
    return XML_TOK_PARTIAL; /* LCOV_EXCL_LINE */
1271
0
  }
1272
131M
  start = ptr;
1273
9.56G
  while (HAS_CHAR(enc, ptr, end)) {
1274
9.56G
    switch (BYTE_TYPE(enc, ptr)) {
1275
0
#  define LEAD_CASE(n)                                                         \
1276
7.49G
  case BT_LEAD##n:                                                             \
1277
7.49G
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1278
7.49G
    break;
1279
7.49G
      LEAD_CASE(2)
1280
4.72M
      LEAD_CASE(3)
1281
201k
      LEAD_CASE(4)
1282
0
#  undef LEAD_CASE
1283
29.4M
    case BT_AMP:
1284
29.4M
      if (ptr == start)
1285
28.3M
        return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1286
1.07M
      *nextTokPtr = ptr;
1287
1.07M
      return XML_TOK_DATA_CHARS;
1288
3
    case BT_LT:
1289
      /* this is for inside entity references */
1290
3
      *nextTokPtr = ptr;
1291
3
      return XML_TOK_INVALID;
1292
78.4M
    case BT_LF:
1293
78.4M
      if (ptr == start) {
1294
74.6M
        *nextTokPtr = ptr + MINBPC(enc);
1295
74.6M
        return XML_TOK_DATA_NEWLINE;
1296
74.6M
      }
1297
3.87M
      *nextTokPtr = ptr;
1298
3.87M
      return XML_TOK_DATA_CHARS;
1299
450k
    case BT_CR:
1300
450k
      if (ptr == start) {
1301
445k
        ptr += MINBPC(enc);
1302
445k
        if (! HAS_CHAR(enc, ptr, end))
1303
695
          return XML_TOK_TRAILING_CR;
1304
444k
        if (BYTE_TYPE(enc, ptr) == BT_LF)
1305
113k
          ptr += MINBPC(enc);
1306
444k
        *nextTokPtr = ptr;
1307
444k
        return XML_TOK_DATA_NEWLINE;
1308
445k
      }
1309
5.11k
      *nextTokPtr = ptr;
1310
5.11k
      return XML_TOK_DATA_CHARS;
1311
7.62M
    case BT_S:
1312
7.62M
      if (ptr == start) {
1313
6.24M
        *nextTokPtr = ptr + MINBPC(enc);
1314
6.24M
        return XML_TOK_ATTRIBUTE_VALUE_S;
1315
6.24M
      }
1316
1.37M
      *nextTokPtr = ptr;
1317
1.37M
      return XML_TOK_DATA_CHARS;
1318
1.95G
    default:
1319
1.95G
      ptr += MINBPC(enc);
1320
1.95G
      break;
1321
9.56G
    }
1322
9.56G
  }
1323
15.4M
  *nextTokPtr = ptr;
1324
15.4M
  return XML_TOK_DATA_CHARS;
1325
131M
}
xmltok.c:normal_attributeValueTok
Line
Count
Source
1260
159M
                          const char **nextTokPtr) {
1261
159M
  const char *start;
1262
159M
  if (ptr >= end)
1263
28.1M
    return XML_TOK_NONE;
1264
131M
  else if (! HAS_CHAR(enc, ptr, end)) {
1265
    /* This line cannot be executed.  The incoming data has already
1266
     * been tokenized once, so incomplete characters like this have
1267
     * already been eliminated from the input.  Retaining the paranoia
1268
     * check is still valuable, however.
1269
     */
1270
0
    return XML_TOK_PARTIAL; /* LCOV_EXCL_LINE */
1271
0
  }
1272
131M
  start = ptr;
1273
9.56G
  while (HAS_CHAR(enc, ptr, end)) {
1274
9.56G
    switch (BYTE_TYPE(enc, ptr)) {
1275
0
#  define LEAD_CASE(n)                                                         \
1276
0
  case BT_LEAD##n:                                                             \
1277
0
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1278
0
    break;
1279
7.49G
      LEAD_CASE(2)
1280
4.72M
      LEAD_CASE(3)
1281
201k
      LEAD_CASE(4)
1282
0
#  undef LEAD_CASE
1283
29.4M
    case BT_AMP:
1284
29.4M
      if (ptr == start)
1285
28.3M
        return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1286
1.07M
      *nextTokPtr = ptr;
1287
1.07M
      return XML_TOK_DATA_CHARS;
1288
3
    case BT_LT:
1289
      /* this is for inside entity references */
1290
3
      *nextTokPtr = ptr;
1291
3
      return XML_TOK_INVALID;
1292
78.4M
    case BT_LF:
1293
78.4M
      if (ptr == start) {
1294
74.6M
        *nextTokPtr = ptr + MINBPC(enc);
1295
74.6M
        return XML_TOK_DATA_NEWLINE;
1296
74.6M
      }
1297
3.87M
      *nextTokPtr = ptr;
1298
3.87M
      return XML_TOK_DATA_CHARS;
1299
450k
    case BT_CR:
1300
450k
      if (ptr == start) {
1301
445k
        ptr += MINBPC(enc);
1302
445k
        if (! HAS_CHAR(enc, ptr, end))
1303
695
          return XML_TOK_TRAILING_CR;
1304
444k
        if (BYTE_TYPE(enc, ptr) == BT_LF)
1305
113k
          ptr += MINBPC(enc);
1306
444k
        *nextTokPtr = ptr;
1307
444k
        return XML_TOK_DATA_NEWLINE;
1308
445k
      }
1309
5.11k
      *nextTokPtr = ptr;
1310
5.11k
      return XML_TOK_DATA_CHARS;
1311
7.62M
    case BT_S:
1312
7.62M
      if (ptr == start) {
1313
6.24M
        *nextTokPtr = ptr + MINBPC(enc);
1314
6.24M
        return XML_TOK_ATTRIBUTE_VALUE_S;
1315
6.24M
      }
1316
1.37M
      *nextTokPtr = ptr;
1317
1.37M
      return XML_TOK_DATA_CHARS;
1318
1.95G
    default:
1319
1.95G
      ptr += MINBPC(enc);
1320
1.95G
      break;
1321
9.56G
    }
1322
9.56G
  }
1323
15.4M
  *nextTokPtr = ptr;
1324
15.4M
  return XML_TOK_DATA_CHARS;
1325
131M
}
Unexecuted instantiation: xmltok.c:little2_attributeValueTok
Unexecuted instantiation: xmltok.c:big2_attributeValueTok
1326
1327
static int PTRCALL
1328
PREFIX(entityValueTok)(const ENCODING *enc, const char *ptr, const char *end,
1329
1.32M
                       const char **nextTokPtr) {
1330
1.32M
  const char *start;
1331
1.32M
  if (ptr >= end)
1332
10.0k
    return XML_TOK_NONE;
1333
1.31M
  else if (! HAS_CHAR(enc, ptr, end)) {
1334
    /* This line cannot be executed.  The incoming data has already
1335
     * been tokenized once, so incomplete characters like this have
1336
     * already been eliminated from the input.  Retaining the paranoia
1337
     * check is still valuable, however.
1338
     */
1339
0
    return XML_TOK_PARTIAL; /* LCOV_EXCL_LINE */
1340
0
  }
1341
1.31M
  start = ptr;
1342
97.8M
  while (HAS_CHAR(enc, ptr, end)) {
1343
97.8M
    switch (BYTE_TYPE(enc, ptr)) {
1344
0
#  define LEAD_CASE(n)                                                         \
1345
69.3k
  case BT_LEAD##n:                                                             \
1346
69.3k
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1347
69.3k
    break;
1348
20.1k
      LEAD_CASE(2)
1349
42.7k
      LEAD_CASE(3)
1350
6.45k
      LEAD_CASE(4)
1351
0
#  undef LEAD_CASE
1352
90.5k
    case BT_AMP:
1353
90.5k
      if (ptr == start)
1354
51.2k
        return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1355
39.2k
      *nextTokPtr = ptr;
1356
39.2k
      return XML_TOK_DATA_CHARS;
1357
6
    case BT_PERCNT:
1358
6
      if (ptr == start) {
1359
5
        int tok = PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1360
5
        return (tok == XML_TOK_PERCENT) ? XML_TOK_INVALID : tok;
1361
5
      }
1362
1
      *nextTokPtr = ptr;
1363
1
      return XML_TOK_DATA_CHARS;
1364
511k
    case BT_LF:
1365
511k
      if (ptr == start) {
1366
416k
        *nextTokPtr = ptr + MINBPC(enc);
1367
416k
        return XML_TOK_DATA_NEWLINE;
1368
416k
      }
1369
95.1k
      *nextTokPtr = ptr;
1370
95.1k
      return XML_TOK_DATA_CHARS;
1371
703k
    case BT_CR:
1372
703k
      if (ptr == start) {
1373
573k
        ptr += MINBPC(enc);
1374
573k
        if (! HAS_CHAR(enc, ptr, end))
1375
306
          return XML_TOK_TRAILING_CR;
1376
573k
        if (BYTE_TYPE(enc, ptr) == BT_LF)
1377
174k
          ptr += MINBPC(enc);
1378
573k
        *nextTokPtr = ptr;
1379
573k
        return XML_TOK_DATA_NEWLINE;
1380
573k
      }
1381
130k
      *nextTokPtr = ptr;
1382
130k
      return XML_TOK_DATA_CHARS;
1383
96.5M
    default:
1384
96.5M
      ptr += MINBPC(enc);
1385
96.5M
      break;
1386
97.8M
    }
1387
97.8M
  }
1388
3.85k
  *nextTokPtr = ptr;
1389
3.85k
  return XML_TOK_DATA_CHARS;
1390
1.31M
}
xmltok.c:normal_entityValueTok
Line
Count
Source
1329
1.32M
                       const char **nextTokPtr) {
1330
1.32M
  const char *start;
1331
1.32M
  if (ptr >= end)
1332
10.0k
    return XML_TOK_NONE;
1333
1.31M
  else if (! HAS_CHAR(enc, ptr, end)) {
1334
    /* This line cannot be executed.  The incoming data has already
1335
     * been tokenized once, so incomplete characters like this have
1336
     * already been eliminated from the input.  Retaining the paranoia
1337
     * check is still valuable, however.
1338
     */
1339
0
    return XML_TOK_PARTIAL; /* LCOV_EXCL_LINE */
1340
0
  }
1341
1.31M
  start = ptr;
1342
97.8M
  while (HAS_CHAR(enc, ptr, end)) {
1343
97.8M
    switch (BYTE_TYPE(enc, ptr)) {
1344
0
#  define LEAD_CASE(n)                                                         \
1345
0
  case BT_LEAD##n:                                                             \
1346
0
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1347
0
    break;
1348
20.1k
      LEAD_CASE(2)
1349
42.7k
      LEAD_CASE(3)
1350
6.45k
      LEAD_CASE(4)
1351
0
#  undef LEAD_CASE
1352
90.5k
    case BT_AMP:
1353
90.5k
      if (ptr == start)
1354
51.2k
        return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1355
39.2k
      *nextTokPtr = ptr;
1356
39.2k
      return XML_TOK_DATA_CHARS;
1357
6
    case BT_PERCNT:
1358
6
      if (ptr == start) {
1359
5
        int tok = PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1360
5
        return (tok == XML_TOK_PERCENT) ? XML_TOK_INVALID : tok;
1361
5
      }
1362
1
      *nextTokPtr = ptr;
1363
1
      return XML_TOK_DATA_CHARS;
1364
511k
    case BT_LF:
1365
511k
      if (ptr == start) {
1366
416k
        *nextTokPtr = ptr + MINBPC(enc);
1367
416k
        return XML_TOK_DATA_NEWLINE;
1368
416k
      }
1369
95.1k
      *nextTokPtr = ptr;
1370
95.1k
      return XML_TOK_DATA_CHARS;
1371
703k
    case BT_CR:
1372
703k
      if (ptr == start) {
1373
573k
        ptr += MINBPC(enc);
1374
573k
        if (! HAS_CHAR(enc, ptr, end))
1375
306
          return XML_TOK_TRAILING_CR;
1376
573k
        if (BYTE_TYPE(enc, ptr) == BT_LF)
1377
174k
          ptr += MINBPC(enc);
1378
573k
        *nextTokPtr = ptr;
1379
573k
        return XML_TOK_DATA_NEWLINE;
1380
573k
      }
1381
130k
      *nextTokPtr = ptr;
1382
130k
      return XML_TOK_DATA_CHARS;
1383
96.5M
    default:
1384
96.5M
      ptr += MINBPC(enc);
1385
96.5M
      break;
1386
97.8M
    }
1387
97.8M
  }
1388
3.85k
  *nextTokPtr = ptr;
1389
3.85k
  return XML_TOK_DATA_CHARS;
1390
1.31M
}
Unexecuted instantiation: xmltok.c:little2_entityValueTok
Unexecuted instantiation: xmltok.c:big2_entityValueTok
1391
1392
#  ifdef XML_DTD
1393
1394
static int PTRCALL
1395
PREFIX(ignoreSectionTok)(const ENCODING *enc, const char *ptr, const char *end,
1396
                         const char **nextTokPtr) {
1397
  int level = 0;
1398
  if (MINBPC(enc) > 1) {
1399
    size_t n = end - ptr;
1400
    if (n & (MINBPC(enc) - 1)) {
1401
      n &= ~(MINBPC(enc) - 1);
1402
      end = ptr + n;
1403
    }
1404
  }
1405
  while (HAS_CHAR(enc, ptr, end)) {
1406
    switch (BYTE_TYPE(enc, ptr)) {
1407
      INVALID_CASES(ptr, nextTokPtr)
1408
    case BT_LT:
1409
      ptr += MINBPC(enc);
1410
      REQUIRE_CHAR(enc, ptr, end);
1411
      if (CHAR_MATCHES(enc, ptr, ASCII_EXCL)) {
1412
        ptr += MINBPC(enc);
1413
        REQUIRE_CHAR(enc, ptr, end);
1414
        if (CHAR_MATCHES(enc, ptr, ASCII_LSQB)) {
1415
          ++level;
1416
          ptr += MINBPC(enc);
1417
        }
1418
      }
1419
      break;
1420
    case BT_RSQB:
1421
      ptr += MINBPC(enc);
1422
      REQUIRE_CHAR(enc, ptr, end);
1423
      if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) {
1424
        ptr += MINBPC(enc);
1425
        REQUIRE_CHAR(enc, ptr, end);
1426
        if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
1427
          ptr += MINBPC(enc);
1428
          if (level == 0) {
1429
            *nextTokPtr = ptr;
1430
            return XML_TOK_IGNORE_SECT;
1431
          }
1432
          --level;
1433
        }
1434
      }
1435
      break;
1436
    default:
1437
      ptr += MINBPC(enc);
1438
      break;
1439
    }
1440
  }
1441
  return XML_TOK_PARTIAL;
1442
}
1443
1444
#  endif /* XML_DTD */
1445
1446
static int PTRCALL
1447
PREFIX(isPublicId)(const ENCODING *enc, const char *ptr, const char *end,
1448
2.70k
                   const char **badPtr) {
1449
2.70k
  ptr += MINBPC(enc);
1450
2.70k
  end -= MINBPC(enc);
1451
183k
  for (; HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
1452
183k
    switch (BYTE_TYPE(enc, ptr)) {
1453
9.48k
    case BT_DIGIT:
1454
80.9k
    case BT_HEX:
1455
86.7k
    case BT_MINUS:
1456
88.6k
    case BT_APOS:
1457
110k
    case BT_LPAR:
1458
111k
    case BT_RPAR:
1459
112k
    case BT_PLUS:
1460
113k
    case BT_COMMA:
1461
125k
    case BT_SOL:
1462
126k
    case BT_EQUALS:
1463
127k
    case BT_QUEST:
1464
129k
    case BT_CR:
1465
134k
    case BT_LF:
1466
140k
    case BT_SEMI:
1467
142k
    case BT_EXCL:
1468
143k
    case BT_AST:
1469
146k
    case BT_PERCNT:
1470
146k
    case BT_NUM:
1471
#  ifdef XML_NS
1472
    case BT_COLON:
1473
#  endif
1474
146k
      break;
1475
1.15k
    case BT_S:
1476
1.15k
      if (CHAR_MATCHES(enc, ptr, ASCII_TAB)) {
1477
1
        *badPtr = ptr;
1478
1
        return 0;
1479
1
      }
1480
1.15k
      break;
1481
1.34k
    case BT_NAME:
1482
30.6k
    case BT_NMSTRT:
1483
30.6k
      if (! (BYTE_TO_ASCII(enc, ptr) & ~0x7f))
1484
30.6k
        break;
1485
      /* fall through */
1486
4.67k
    default:
1487
4.67k
      switch (BYTE_TO_ASCII(enc, ptr)) {
1488
4.06k
      case 0x24: /* $ */
1489
4.66k
      case 0x40: /* @ */
1490
4.66k
        break;
1491
14
      default:
1492
14
        *badPtr = ptr;
1493
14
        return 0;
1494
4.67k
      }
1495
4.66k
      break;
1496
183k
    }
1497
183k
  }
1498
2.69k
  return 1;
1499
2.70k
}
xmltok.c:normal_isPublicId
Line
Count
Source
1448
2.70k
                   const char **badPtr) {
1449
2.70k
  ptr += MINBPC(enc);
1450
2.70k
  end -= MINBPC(enc);
1451
183k
  for (; HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
1452
183k
    switch (BYTE_TYPE(enc, ptr)) {
1453
9.48k
    case BT_DIGIT:
1454
80.9k
    case BT_HEX:
1455
86.7k
    case BT_MINUS:
1456
88.6k
    case BT_APOS:
1457
110k
    case BT_LPAR:
1458
111k
    case BT_RPAR:
1459
112k
    case BT_PLUS:
1460
113k
    case BT_COMMA:
1461
125k
    case BT_SOL:
1462
126k
    case BT_EQUALS:
1463
127k
    case BT_QUEST:
1464
129k
    case BT_CR:
1465
134k
    case BT_LF:
1466
140k
    case BT_SEMI:
1467
142k
    case BT_EXCL:
1468
143k
    case BT_AST:
1469
146k
    case BT_PERCNT:
1470
146k
    case BT_NUM:
1471
#  ifdef XML_NS
1472
    case BT_COLON:
1473
#  endif
1474
146k
      break;
1475
1.15k
    case BT_S:
1476
1.15k
      if (CHAR_MATCHES(enc, ptr, ASCII_TAB)) {
1477
1
        *badPtr = ptr;
1478
1
        return 0;
1479
1
      }
1480
1.15k
      break;
1481
1.34k
    case BT_NAME:
1482
30.6k
    case BT_NMSTRT:
1483
30.6k
      if (! (BYTE_TO_ASCII(enc, ptr) & ~0x7f))
1484
30.6k
        break;
1485
      /* fall through */
1486
4.67k
    default:
1487
4.67k
      switch (BYTE_TO_ASCII(enc, ptr)) {
1488
4.06k
      case 0x24: /* $ */
1489
4.66k
      case 0x40: /* @ */
1490
4.66k
        break;
1491
14
      default:
1492
14
        *badPtr = ptr;
1493
14
        return 0;
1494
4.67k
      }
1495
4.66k
      break;
1496
183k
    }
1497
183k
  }
1498
2.69k
  return 1;
1499
2.70k
}
Unexecuted instantiation: xmltok.c:little2_isPublicId
Unexecuted instantiation: xmltok.c:big2_isPublicId
1500
1501
/* This must only be called for a well-formed start-tag or empty
1502
   element tag.  Returns the number of attributes.  Pointers to the
1503
   first attsMax attributes are stored in atts.
1504
*/
1505
1506
static int PTRCALL
1507
PREFIX(getAtts)(const ENCODING *enc, const char *ptr, int attsMax,
1508
2.37M
                ATTRIBUTE *atts) {
1509
2.37M
  enum { other, inName, inValue } state = inName;
1510
2.37M
  int nAtts = 0;
1511
2.37M
  int open = 0; /* defined when state == inValue;
1512
                   initialization just to shut up compilers */
1513
1514
133M
  for (ptr += MINBPC(enc);; ptr += MINBPC(enc)) {
1515
133M
    switch (BYTE_TYPE(enc, ptr)) {
1516
0
#  define START_NAME                                                           \
1517
84.8M
    if (state == other) {                                                      \
1518
6.40M
      if (nAtts < attsMax) {                                                   \
1519
3.25M
        atts[nAtts].name = ptr;                                                \
1520
3.25M
        atts[nAtts].normalized = 1;                                            \
1521
3.25M
      }                                                                        \
1522
6.40M
      state = inName;                                                          \
1523
6.40M
    }
1524
0
#  define LEAD_CASE(n)                                                         \
1525
68.5M
  case BT_LEAD##n: /* NOTE: The encoding has already been validated. */        \
1526
68.5M
    START_NAME ptr += (n - MINBPC(enc));                                       \
1527
68.5M
    break;
1528
68.5M
      LEAD_CASE(2)
1529
30.3k
      LEAD_CASE(3)
1530
5.22k
      LEAD_CASE(4)
1531
0
#  undef LEAD_CASE
1532
0
    case BT_NONASCII:
1533
14.5M
    case BT_NMSTRT:
1534
16.2M
    case BT_HEX:
1535
16.2M
      START_NAME
1536
16.2M
      break;
1537
0
#  undef START_NAME
1538
949k
    case BT_QUOT:
1539
949k
      if (state != inValue) {
1540
391k
        if (nAtts < attsMax)
1541
244k
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1542
391k
        state = inValue;
1543
391k
        open = BT_QUOT;
1544
557k
      } else if (open == BT_QUOT) {
1545
391k
        state = other;
1546
391k
        if (nAtts < attsMax)
1547
244k
          atts[nAtts].valueEnd = ptr;
1548
391k
        nAtts++;
1549
391k
      }
1550
949k
      break;
1551
12.0M
    case BT_APOS:
1552
12.0M
      if (state != inValue) {
1553
6.01M
        if (nAtts < attsMax)
1554
3.00M
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1555
6.01M
        state = inValue;
1556
6.01M
        open = BT_APOS;
1557
6.01M
      } else if (open == BT_APOS) {
1558
6.01M
        state = other;
1559
6.01M
        if (nAtts < attsMax)
1560
3.00M
          atts[nAtts].valueEnd = ptr;
1561
6.01M
        nAtts++;
1562
6.01M
      }
1563
12.0M
      break;
1564
21.8k
    case BT_AMP:
1565
21.8k
      if (nAtts < attsMax)
1566
19.7k
        atts[nAtts].normalized = 0;
1567
21.8k
      break;
1568
4.21M
    case BT_S:
1569
4.21M
      if (state == inName)
1570
55.2k
        state = other;
1571
4.15M
      else if (state == inValue && nAtts < attsMax && atts[nAtts].normalized
1572
4.15M
               && (ptr == atts[nAtts].valuePtr
1573
110k
                   || BYTE_TO_ASCII(enc, ptr) != ASCII_SPACE
1574
110k
                   || BYTE_TO_ASCII(enc, ptr + MINBPC(enc)) == ASCII_SPACE
1575
110k
                   || BYTE_TYPE(enc, ptr + MINBPC(enc)) == open))
1576
109k
        atts[nAtts].normalized = 0;
1577
4.21M
      break;
1578
3.54M
    case BT_CR:
1579
21.6M
    case BT_LF:
1580
      /* This case ensures that the first attribute name is counted
1581
         Apart from that we could just change state on the quote. */
1582
21.6M
      if (state == inName)
1583
25.5k
        state = other;
1584
21.6M
      else if (state == inValue && nAtts < attsMax)
1585
18.3M
        atts[nAtts].normalized = 0;
1586
21.6M
      break;
1587
2.28M
    case BT_GT:
1588
2.38M
    case BT_SOL:
1589
2.38M
      if (state != inValue)
1590
2.37M
        return nAtts;
1591
11.5k
      break;
1592
7.23M
    default:
1593
7.23M
      break;
1594
133M
    }
1595
133M
  }
1596
  /* not reached */
1597
2.37M
}
xmltok.c:normal_getAtts
Line
Count
Source
1508
2.37M
                ATTRIBUTE *atts) {
1509
2.37M
  enum { other, inName, inValue } state = inName;
1510
2.37M
  int nAtts = 0;
1511
2.37M
  int open = 0; /* defined when state == inValue;
1512
                   initialization just to shut up compilers */
1513
1514
133M
  for (ptr += MINBPC(enc);; ptr += MINBPC(enc)) {
1515
133M
    switch (BYTE_TYPE(enc, ptr)) {
1516
0
#  define START_NAME                                                           \
1517
0
    if (state == other) {                                                      \
1518
0
      if (nAtts < attsMax) {                                                   \
1519
0
        atts[nAtts].name = ptr;                                                \
1520
0
        atts[nAtts].normalized = 1;                                            \
1521
0
      }                                                                        \
1522
0
      state = inName;                                                          \
1523
0
    }
1524
0
#  define LEAD_CASE(n)                                                         \
1525
0
  case BT_LEAD##n: /* NOTE: The encoding has already been validated. */        \
1526
0
    START_NAME ptr += (n - MINBPC(enc));                                       \
1527
0
    break;
1528
68.5M
      LEAD_CASE(2)
1529
30.3k
      LEAD_CASE(3)
1530
5.22k
      LEAD_CASE(4)
1531
0
#  undef LEAD_CASE
1532
0
    case BT_NONASCII:
1533
14.5M
    case BT_NMSTRT:
1534
16.2M
    case BT_HEX:
1535
16.2M
      START_NAME
1536
16.2M
      break;
1537
0
#  undef START_NAME
1538
949k
    case BT_QUOT:
1539
949k
      if (state != inValue) {
1540
391k
        if (nAtts < attsMax)
1541
244k
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1542
391k
        state = inValue;
1543
391k
        open = BT_QUOT;
1544
557k
      } else if (open == BT_QUOT) {
1545
391k
        state = other;
1546
391k
        if (nAtts < attsMax)
1547
244k
          atts[nAtts].valueEnd = ptr;
1548
391k
        nAtts++;
1549
391k
      }
1550
949k
      break;
1551
12.0M
    case BT_APOS:
1552
12.0M
      if (state != inValue) {
1553
6.01M
        if (nAtts < attsMax)
1554
3.00M
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1555
6.01M
        state = inValue;
1556
6.01M
        open = BT_APOS;
1557
6.01M
      } else if (open == BT_APOS) {
1558
6.01M
        state = other;
1559
6.01M
        if (nAtts < attsMax)
1560
3.00M
          atts[nAtts].valueEnd = ptr;
1561
6.01M
        nAtts++;
1562
6.01M
      }
1563
12.0M
      break;
1564
21.8k
    case BT_AMP:
1565
21.8k
      if (nAtts < attsMax)
1566
19.7k
        atts[nAtts].normalized = 0;
1567
21.8k
      break;
1568
4.21M
    case BT_S:
1569
4.21M
      if (state == inName)
1570
55.2k
        state = other;
1571
4.15M
      else if (state == inValue && nAtts < attsMax && atts[nAtts].normalized
1572
4.15M
               && (ptr == atts[nAtts].valuePtr
1573
110k
                   || BYTE_TO_ASCII(enc, ptr) != ASCII_SPACE
1574
110k
                   || BYTE_TO_ASCII(enc, ptr + MINBPC(enc)) == ASCII_SPACE
1575
110k
                   || BYTE_TYPE(enc, ptr + MINBPC(enc)) == open))
1576
109k
        atts[nAtts].normalized = 0;
1577
4.21M
      break;
1578
3.54M
    case BT_CR:
1579
21.6M
    case BT_LF:
1580
      /* This case ensures that the first attribute name is counted
1581
         Apart from that we could just change state on the quote. */
1582
21.6M
      if (state == inName)
1583
25.5k
        state = other;
1584
21.6M
      else if (state == inValue && nAtts < attsMax)
1585
18.3M
        atts[nAtts].normalized = 0;
1586
21.6M
      break;
1587
2.28M
    case BT_GT:
1588
2.38M
    case BT_SOL:
1589
2.38M
      if (state != inValue)
1590
2.37M
        return nAtts;
1591
11.5k
      break;
1592
7.23M
    default:
1593
7.23M
      break;
1594
133M
    }
1595
133M
  }
1596
  /* not reached */
1597
2.37M
}
Unexecuted instantiation: xmltok.c:little2_getAtts
Unexecuted instantiation: xmltok.c:big2_getAtts
1598
1599
static int PTRFASTCALL
1600
64.6k
PREFIX(charRefNumber)(const ENCODING *enc, const char *ptr) {
1601
64.6k
  int result = 0;
1602
  /* skip &# */
1603
64.6k
  UNUSED_P(enc);
1604
64.6k
  ptr += 2 * MINBPC(enc);
1605
64.6k
  if (CHAR_MATCHES(enc, ptr, ASCII_x)) {
1606
294k
    for (ptr += MINBPC(enc); ! CHAR_MATCHES(enc, ptr, ASCII_SEMI);
1607
235k
         ptr += MINBPC(enc)) {
1608
235k
      int c = BYTE_TO_ASCII(enc, ptr);
1609
235k
      switch (c) {
1610
10.0k
      case ASCII_0:
1611
40.3k
      case ASCII_1:
1612
69.8k
      case ASCII_2:
1613
97.5k
      case ASCII_3:
1614
99.2k
      case ASCII_4:
1615
102k
      case ASCII_5:
1616
107k
      case ASCII_6:
1617
112k
      case ASCII_7:
1618
149k
      case ASCII_8:
1619
152k
      case ASCII_9:
1620
152k
        result <<= 4;
1621
152k
        result |= (c - ASCII_0);
1622
152k
        break;
1623
28.7k
      case ASCII_A:
1624
30.3k
      case ASCII_B:
1625
33.4k
      case ASCII_C:
1626
35.6k
      case ASCII_D:
1627
38.8k
      case ASCII_E:
1628
45.4k
      case ASCII_F:
1629
45.4k
        result <<= 4;
1630
45.4k
        result += 10 + (c - ASCII_A);
1631
45.4k
        break;
1632
1.33k
      case ASCII_a:
1633
12.8k
      case ASCII_b:
1634
16.2k
      case ASCII_c:
1635
21.8k
      case ASCII_d:
1636
33.9k
      case ASCII_e:
1637
38.3k
      case ASCII_f:
1638
38.3k
        result <<= 4;
1639
38.3k
        result += 10 + (c - ASCII_a);
1640
38.3k
        break;
1641
235k
      }
1642
235k
      if (result >= 0x110000)
1643
18
        return -1;
1644
235k
    }
1645
58.9k
  } else {
1646
24.8k
    for (; ! CHAR_MATCHES(enc, ptr, ASCII_SEMI); ptr += MINBPC(enc)) {
1647
19.2k
      int c = BYTE_TO_ASCII(enc, ptr);
1648
19.2k
      result *= 10;
1649
19.2k
      result += (c - ASCII_0);
1650
19.2k
      if (result >= 0x110000)
1651
6
        return -1;
1652
19.2k
    }
1653
5.66k
  }
1654
64.6k
  return checkCharRefNumber(result);
1655
64.6k
}
xmltok.c:normal_charRefNumber
Line
Count
Source
1600
64.6k
PREFIX(charRefNumber)(const ENCODING *enc, const char *ptr) {
1601
64.6k
  int result = 0;
1602
  /* skip &# */
1603
64.6k
  UNUSED_P(enc);
1604
64.6k
  ptr += 2 * MINBPC(enc);
1605
64.6k
  if (CHAR_MATCHES(enc, ptr, ASCII_x)) {
1606
294k
    for (ptr += MINBPC(enc); ! CHAR_MATCHES(enc, ptr, ASCII_SEMI);
1607
235k
         ptr += MINBPC(enc)) {
1608
235k
      int c = BYTE_TO_ASCII(enc, ptr);
1609
235k
      switch (c) {
1610
10.0k
      case ASCII_0:
1611
40.3k
      case ASCII_1:
1612
69.8k
      case ASCII_2:
1613
97.5k
      case ASCII_3:
1614
99.2k
      case ASCII_4:
1615
102k
      case ASCII_5:
1616
107k
      case ASCII_6:
1617
112k
      case ASCII_7:
1618
149k
      case ASCII_8:
1619
152k
      case ASCII_9:
1620
152k
        result <<= 4;
1621
152k
        result |= (c - ASCII_0);
1622
152k
        break;
1623
28.7k
      case ASCII_A:
1624
30.3k
      case ASCII_B:
1625
33.4k
      case ASCII_C:
1626
35.6k
      case ASCII_D:
1627
38.8k
      case ASCII_E:
1628
45.4k
      case ASCII_F:
1629
45.4k
        result <<= 4;
1630
45.4k
        result += 10 + (c - ASCII_A);
1631
45.4k
        break;
1632
1.33k
      case ASCII_a:
1633
12.8k
      case ASCII_b:
1634
16.2k
      case ASCII_c:
1635
21.8k
      case ASCII_d:
1636
33.9k
      case ASCII_e:
1637
38.3k
      case ASCII_f:
1638
38.3k
        result <<= 4;
1639
38.3k
        result += 10 + (c - ASCII_a);
1640
38.3k
        break;
1641
235k
      }
1642
235k
      if (result >= 0x110000)
1643
18
        return -1;
1644
235k
    }
1645
58.9k
  } else {
1646
24.8k
    for (; ! CHAR_MATCHES(enc, ptr, ASCII_SEMI); ptr += MINBPC(enc)) {
1647
19.2k
      int c = BYTE_TO_ASCII(enc, ptr);
1648
19.2k
      result *= 10;
1649
19.2k
      result += (c - ASCII_0);
1650
19.2k
      if (result >= 0x110000)
1651
6
        return -1;
1652
19.2k
    }
1653
5.66k
  }
1654
64.6k
  return checkCharRefNumber(result);
1655
64.6k
}
Unexecuted instantiation: xmltok.c:little2_charRefNumber
Unexecuted instantiation: xmltok.c:big2_charRefNumber
1656
1657
static int PTRCALL
1658
PREFIX(predefinedEntityName)(const ENCODING *enc, const char *ptr,
1659
28.4M
                             const char *end) {
1660
28.4M
  UNUSED_P(enc);
1661
28.4M
  switch ((end - ptr) / MINBPC(enc)) {
1662
209k
  case 2:
1663
209k
    if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_t)) {
1664
2.49k
      switch (BYTE_TO_ASCII(enc, ptr)) {
1665
2.10k
      case ASCII_l:
1666
2.10k
        return ASCII_LT;
1667
201
      case ASCII_g:
1668
201
        return ASCII_GT;
1669
2.49k
      }
1670
2.49k
    }
1671
207k
    break;
1672
207k
  case 3:
1673
11.1k
    if (CHAR_MATCHES(enc, ptr, ASCII_a)) {
1674
9.81k
      ptr += MINBPC(enc);
1675
9.81k
      if (CHAR_MATCHES(enc, ptr, ASCII_m)) {
1676
2.15k
        ptr += MINBPC(enc);
1677
2.15k
        if (CHAR_MATCHES(enc, ptr, ASCII_p))
1678
915
          return ASCII_AMP;
1679
2.15k
      }
1680
9.81k
    }
1681
10.1k
    break;
1682
10.1k
  case 4:
1683
5.31k
    switch (BYTE_TO_ASCII(enc, ptr)) {
1684
1.59k
    case ASCII_q:
1685
1.59k
      ptr += MINBPC(enc);
1686
1.59k
      if (CHAR_MATCHES(enc, ptr, ASCII_u)) {
1687
961
        ptr += MINBPC(enc);
1688
961
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1689
698
          ptr += MINBPC(enc);
1690
698
          if (CHAR_MATCHES(enc, ptr, ASCII_t))
1691
488
            return ASCII_QUOT;
1692
698
        }
1693
961
      }
1694
1.11k
      break;
1695
2.50k
    case ASCII_a:
1696
2.50k
      ptr += MINBPC(enc);
1697
2.50k
      if (CHAR_MATCHES(enc, ptr, ASCII_p)) {
1698
845
        ptr += MINBPC(enc);
1699
845
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1700
590
          ptr += MINBPC(enc);
1701
590
          if (CHAR_MATCHES(enc, ptr, ASCII_s))
1702
310
            return ASCII_APOS;
1703
590
        }
1704
845
      }
1705
2.19k
      break;
1706
5.31k
    }
1707
28.4M
  }
1708
28.4M
  return 0;
1709
28.4M
}
xmltok.c:normal_predefinedEntityName
Line
Count
Source
1659
28.4M
                             const char *end) {
1660
28.4M
  UNUSED_P(enc);
1661
28.4M
  switch ((end - ptr) / MINBPC(enc)) {
1662
209k
  case 2:
1663
209k
    if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_t)) {
1664
2.49k
      switch (BYTE_TO_ASCII(enc, ptr)) {
1665
2.10k
      case ASCII_l:
1666
2.10k
        return ASCII_LT;
1667
201
      case ASCII_g:
1668
201
        return ASCII_GT;
1669
2.49k
      }
1670
2.49k
    }
1671
207k
    break;
1672
207k
  case 3:
1673
11.1k
    if (CHAR_MATCHES(enc, ptr, ASCII_a)) {
1674
9.81k
      ptr += MINBPC(enc);
1675
9.81k
      if (CHAR_MATCHES(enc, ptr, ASCII_m)) {
1676
2.15k
        ptr += MINBPC(enc);
1677
2.15k
        if (CHAR_MATCHES(enc, ptr, ASCII_p))
1678
915
          return ASCII_AMP;
1679
2.15k
      }
1680
9.81k
    }
1681
10.1k
    break;
1682
10.1k
  case 4:
1683
5.31k
    switch (BYTE_TO_ASCII(enc, ptr)) {
1684
1.59k
    case ASCII_q:
1685
1.59k
      ptr += MINBPC(enc);
1686
1.59k
      if (CHAR_MATCHES(enc, ptr, ASCII_u)) {
1687
961
        ptr += MINBPC(enc);
1688
961
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1689
698
          ptr += MINBPC(enc);
1690
698
          if (CHAR_MATCHES(enc, ptr, ASCII_t))
1691
488
            return ASCII_QUOT;
1692
698
        }
1693
961
      }
1694
1.11k
      break;
1695
2.50k
    case ASCII_a:
1696
2.50k
      ptr += MINBPC(enc);
1697
2.50k
      if (CHAR_MATCHES(enc, ptr, ASCII_p)) {
1698
845
        ptr += MINBPC(enc);
1699
845
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1700
590
          ptr += MINBPC(enc);
1701
590
          if (CHAR_MATCHES(enc, ptr, ASCII_s))
1702
310
            return ASCII_APOS;
1703
590
        }
1704
845
      }
1705
2.19k
      break;
1706
5.31k
    }
1707
28.4M
  }
1708
28.4M
  return 0;
1709
28.4M
}
Unexecuted instantiation: xmltok.c:little2_predefinedEntityName
Unexecuted instantiation: xmltok.c:big2_predefinedEntityName
1710
1711
static int PTRCALL
1712
PREFIX(nameMatchesAscii)(const ENCODING *enc, const char *ptr1,
1713
245k
                         const char *end1, const char *ptr2) {
1714
245k
  UNUSED_P(enc);
1715
1.30M
  for (; *ptr2; ptr1 += MINBPC(enc), ptr2++) {
1716
1.14M
    if (end1 - ptr1 < MINBPC(enc)) {
1717
      /* This line cannot be executed.  The incoming data has already
1718
       * been tokenized once, so incomplete characters like this have
1719
       * already been eliminated from the input.  Retaining the
1720
       * paranoia check is still valuable, however.
1721
       */
1722
53
      return 0; /* LCOV_EXCL_LINE */
1723
53
    }
1724
1.14M
    if (! CHAR_MATCHES(enc, ptr1, *ptr2))
1725
80.6k
      return 0;
1726
1.14M
  }
1727
164k
  return ptr1 == end1;
1728
245k
}
xmltok.c:normal_nameMatchesAscii
Line
Count
Source
1713
245k
                         const char *end1, const char *ptr2) {
1714
245k
  UNUSED_P(enc);
1715
1.30M
  for (; *ptr2; ptr1 += MINBPC(enc), ptr2++) {
1716
1.14M
    if (end1 - ptr1 < MINBPC(enc)) {
1717
      /* This line cannot be executed.  The incoming data has already
1718
       * been tokenized once, so incomplete characters like this have
1719
       * already been eliminated from the input.  Retaining the
1720
       * paranoia check is still valuable, however.
1721
       */
1722
53
      return 0; /* LCOV_EXCL_LINE */
1723
53
    }
1724
1.14M
    if (! CHAR_MATCHES(enc, ptr1, *ptr2))
1725
80.6k
      return 0;
1726
1.14M
  }
1727
164k
  return ptr1 == end1;
1728
245k
}
Unexecuted instantiation: xmltok.c:little2_nameMatchesAscii
Unexecuted instantiation: xmltok.c:big2_nameMatchesAscii
1729
1730
static int PTRFASTCALL
1731
2.55M
PREFIX(nameLength)(const ENCODING *enc, const char *ptr) {
1732
2.55M
  const char *start = ptr;
1733
11.9M
  for (;;) {
1734
11.9M
    switch (BYTE_TYPE(enc, ptr)) {
1735
0
#  define LEAD_CASE(n)                                                         \
1736
1.80M
  case BT_LEAD##n:                                                             \
1737
1.80M
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1738
1.80M
    break;
1739
1.79M
      LEAD_CASE(2)
1740
14.6k
      LEAD_CASE(3)
1741
0
      LEAD_CASE(4)
1742
0
#  undef LEAD_CASE
1743
0
    case BT_NONASCII:
1744
6.87M
    case BT_NMSTRT:
1745
#  ifdef XML_NS
1746
    case BT_COLON:
1747
#  endif
1748
7.41M
    case BT_HEX:
1749
7.50M
    case BT_DIGIT:
1750
7.53M
    case BT_NAME:
1751
7.58M
    case BT_MINUS:
1752
7.58M
      ptr += MINBPC(enc);
1753
7.58M
      break;
1754
2.55M
    default:
1755
2.55M
      return (int)(ptr - start);
1756
11.9M
    }
1757
11.9M
  }
1758
2.55M
}
xmltok.c:normal_nameLength
Line
Count
Source
1731
2.55M
PREFIX(nameLength)(const ENCODING *enc, const char *ptr) {
1732
2.55M
  const char *start = ptr;
1733
11.9M
  for (;;) {
1734
11.9M
    switch (BYTE_TYPE(enc, ptr)) {
1735
0
#  define LEAD_CASE(n)                                                         \
1736
0
  case BT_LEAD##n:                                                             \
1737
0
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1738
0
    break;
1739
1.79M
      LEAD_CASE(2)
1740
14.6k
      LEAD_CASE(3)
1741
0
      LEAD_CASE(4)
1742
0
#  undef LEAD_CASE
1743
0
    case BT_NONASCII:
1744
6.87M
    case BT_NMSTRT:
1745
#  ifdef XML_NS
1746
    case BT_COLON:
1747
#  endif
1748
7.41M
    case BT_HEX:
1749
7.50M
    case BT_DIGIT:
1750
7.53M
    case BT_NAME:
1751
7.58M
    case BT_MINUS:
1752
7.58M
      ptr += MINBPC(enc);
1753
7.58M
      break;
1754
2.55M
    default:
1755
2.55M
      return (int)(ptr - start);
1756
11.9M
    }
1757
11.9M
  }
1758
2.55M
}
Unexecuted instantiation: xmltok.c:little2_nameLength
Unexecuted instantiation: xmltok.c:big2_nameLength
1759
1760
static const char *PTRFASTCALL
1761
0
PREFIX(skipS)(const ENCODING *enc, const char *ptr) {
1762
0
  for (;;) {
1763
0
    switch (BYTE_TYPE(enc, ptr)) {
1764
0
    case BT_LF:
1765
0
    case BT_CR:
1766
0
    case BT_S:
1767
0
      ptr += MINBPC(enc);
1768
0
      break;
1769
0
    default:
1770
0
      return ptr;
1771
0
    }
1772
0
  }
1773
0
}
Unexecuted instantiation: xmltok.c:normal_skipS
Unexecuted instantiation: xmltok.c:little2_skipS
Unexecuted instantiation: xmltok.c:big2_skipS
1774
1775
static void PTRCALL
1776
PREFIX(updatePosition)(const ENCODING *enc, const char *ptr, const char *end,
1777
22.8k
                       POSITION *pos) {
1778
139M
  while (HAS_CHAR(enc, ptr, end)) {
1779
139M
    switch (BYTE_TYPE(enc, ptr)) {
1780
0
#  define LEAD_CASE(n)                                                         \
1781
357k
  case BT_LEAD##n:                                                             \
1782
357k
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1783
357k
    pos->columnNumber++;                                                       \
1784
357k
    break;
1785
101k
      LEAD_CASE(2)
1786
228k
      LEAD_CASE(3)
1787
27.4k
      LEAD_CASE(4)
1788
0
#  undef LEAD_CASE
1789
1.12M
    case BT_LF:
1790
1.12M
      pos->columnNumber = 0;
1791
1.12M
      pos->lineNumber++;
1792
1.12M
      ptr += MINBPC(enc);
1793
1.12M
      break;
1794
1.90M
    case BT_CR:
1795
1.90M
      pos->lineNumber++;
1796
1.90M
      ptr += MINBPC(enc);
1797
1.90M
      if (HAS_CHAR(enc, ptr, end) && BYTE_TYPE(enc, ptr) == BT_LF)
1798
446k
        ptr += MINBPC(enc);
1799
1.90M
      pos->columnNumber = 0;
1800
1.90M
      break;
1801
135M
    default:
1802
135M
      ptr += MINBPC(enc);
1803
135M
      pos->columnNumber++;
1804
135M
      break;
1805
139M
    }
1806
139M
  }
1807
22.8k
}
xmltok.c:normal_updatePosition
Line
Count
Source
1777
22.3k
                       POSITION *pos) {
1778
138M
  while (HAS_CHAR(enc, ptr, end)) {
1779
138M
    switch (BYTE_TYPE(enc, ptr)) {
1780
0
#  define LEAD_CASE(n)                                                         \
1781
0
  case BT_LEAD##n:                                                             \
1782
0
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1783
0
    pos->columnNumber++;                                                       \
1784
0
    break;
1785
101k
      LEAD_CASE(2)
1786
228k
      LEAD_CASE(3)
1787
27.4k
      LEAD_CASE(4)
1788
0
#  undef LEAD_CASE
1789
1.12M
    case BT_LF:
1790
1.12M
      pos->columnNumber = 0;
1791
1.12M
      pos->lineNumber++;
1792
1.12M
      ptr += MINBPC(enc);
1793
1.12M
      break;
1794
1.90M
    case BT_CR:
1795
1.90M
      pos->lineNumber++;
1796
1.90M
      ptr += MINBPC(enc);
1797
1.90M
      if (HAS_CHAR(enc, ptr, end) && BYTE_TYPE(enc, ptr) == BT_LF)
1798
446k
        ptr += MINBPC(enc);
1799
1.90M
      pos->columnNumber = 0;
1800
1.90M
      break;
1801
135M
    default:
1802
135M
      ptr += MINBPC(enc);
1803
135M
      pos->columnNumber++;
1804
135M
      break;
1805
138M
    }
1806
138M
  }
1807
22.3k
}
xmltok.c:little2_updatePosition
Line
Count
Source
1777
258
                       POSITION *pos) {
1778
189k
  while (HAS_CHAR(enc, ptr, end)) {
1779
189k
    switch (BYTE_TYPE(enc, ptr)) {
1780
0
#  define LEAD_CASE(n)                                                         \
1781
0
  case BT_LEAD##n:                                                             \
1782
0
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1783
0
    pos->columnNumber++;                                                       \
1784
0
    break;
1785
0
      LEAD_CASE(2)
1786
0
      LEAD_CASE(3)
1787
0
      LEAD_CASE(4)
1788
0
#  undef LEAD_CASE
1789
0
    case BT_LF:
1790
0
      pos->columnNumber = 0;
1791
0
      pos->lineNumber++;
1792
0
      ptr += MINBPC(enc);
1793
0
      break;
1794
0
    case BT_CR:
1795
0
      pos->lineNumber++;
1796
0
      ptr += MINBPC(enc);
1797
0
      if (HAS_CHAR(enc, ptr, end) && BYTE_TYPE(enc, ptr) == BT_LF)
1798
0
        ptr += MINBPC(enc);
1799
0
      pos->columnNumber = 0;
1800
0
      break;
1801
189k
    default:
1802
189k
      ptr += MINBPC(enc);
1803
189k
      pos->columnNumber++;
1804
189k
      break;
1805
189k
    }
1806
189k
  }
1807
258
}
xmltok.c:big2_updatePosition
Line
Count
Source
1777
229
                       POSITION *pos) {
1778
79.1k
  while (HAS_CHAR(enc, ptr, end)) {
1779
79.1k
    switch (BYTE_TYPE(enc, ptr)) {
1780
0
#  define LEAD_CASE(n)                                                         \
1781
0
  case BT_LEAD##n:                                                             \
1782
0
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1783
0
    pos->columnNumber++;                                                       \
1784
0
    break;
1785
0
      LEAD_CASE(2)
1786
0
      LEAD_CASE(3)
1787
0
      LEAD_CASE(4)
1788
0
#  undef LEAD_CASE
1789
0
    case BT_LF:
1790
0
      pos->columnNumber = 0;
1791
0
      pos->lineNumber++;
1792
0
      ptr += MINBPC(enc);
1793
0
      break;
1794
0
    case BT_CR:
1795
0
      pos->lineNumber++;
1796
0
      ptr += MINBPC(enc);
1797
0
      if (HAS_CHAR(enc, ptr, end) && BYTE_TYPE(enc, ptr) == BT_LF)
1798
0
        ptr += MINBPC(enc);
1799
0
      pos->columnNumber = 0;
1800
0
      break;
1801
79.1k
    default:
1802
79.1k
      ptr += MINBPC(enc);
1803
79.1k
      pos->columnNumber++;
1804
79.1k
      break;
1805
79.1k
    }
1806
79.1k
  }
1807
229
}
1808
1809
#  undef DO_LEAD_CASE
1810
#  undef MULTIBYTE_CASES
1811
#  undef INVALID_CASES
1812
#  undef CHECK_NAME_CASE
1813
#  undef CHECK_NAME_CASES
1814
#  undef CHECK_NMSTRT_CASE
1815
#  undef CHECK_NMSTRT_CASES
1816
1817
#endif /* XML_TOK_IMPL_C */