Coverage Report

Created: 2025-07-18 07:06

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