Coverage Report

Created: 2025-07-11 07:20

/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
40
#    define IS_INVALID_CHAR(enc, ptr, n) (0)
46
#  endif
47
48
#  define INVALID_LEAD_CASE(n, ptr, nextTokPtr)                                \
49
717k
  case BT_LEAD##n:                                                             \
50
717k
    if (end - ptr < n)                                                         \
51
717k
      return XML_TOK_PARTIAL_CHAR;                                             \
52
717k
    if (IS_INVALID_CHAR(enc, ptr, n)) {                                        \
53
75
      *(nextTokPtr) = (ptr);                                                   \
54
75
      return XML_TOK_INVALID;                                                  \
55
75
    }                                                                          \
56
717k
    ptr += n;                                                                  \
57
717k
    break;
58
59
#  define INVALID_CASES(ptr, nextTokPtr)                                       \
60
270k
    INVALID_LEAD_CASE(2, ptr, nextTokPtr)                                      \
61
287k
    INVALID_LEAD_CASE(3, ptr, nextTokPtr)                                      \
62
287k
    INVALID_LEAD_CASE(4, ptr, nextTokPtr)                                      \
63
160k
  case BT_NONXML:                                                              \
64
48
  case BT_MALFORM:                                                             \
65
91
  case BT_TRAIL:                                                               \
66
91
    *(nextTokPtr) = (ptr);                                                     \
67
91
    return XML_TOK_INVALID;
68
69
#  define CHECK_NAME_CASE(n, enc, ptr, end, nextTokPtr)                        \
70
485k
  case BT_LEAD##n:                                                             \
71
485k
    if (end - ptr < n)                                                         \
72
485k
      return XML_TOK_PARTIAL_CHAR;                                             \
73
485k
    if (IS_INVALID_CHAR(enc, ptr, n) || ! IS_NAME_CHAR(enc, ptr, n)) {         \
74
237
      *nextTokPtr = ptr;                                                       \
75
237
      return XML_TOK_INVALID;                                                  \
76
237
    }                                                                          \
77
485k
    ptr += n;                                                                  \
78
485k
    break;
79
80
#  define CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)                          \
81
31.2M
  case BT_NONASCII:                                                            \
82
31.2M
    if (! IS_NAME_CHAR_MINBPC(enc, ptr)) {                                     \
83
46
      *nextTokPtr = ptr;                                                       \
84
46
      return XML_TOK_INVALID;                                                  \
85
46
    }                                                                          \
86
31.2M
    /* fall through */                                                         \
87
31.2M
  case BT_NMSTRT:                                                              \
88
27.3M
  case BT_HEX:                                                                 \
89
30.7M
  case BT_DIGIT:                                                               \
90
30.9M
  case BT_NAME:                                                                \
91
31.2M
  case BT_MINUS:                                                               \
92
31.2M
    ptr += MINBPC(enc);                                                        \
93
31.2M
    break;                                                                     \
94
31.2M
    CHECK_NAME_CASE(2, enc, ptr, end, nextTokPtr)                              \
95
269k
    CHECK_NAME_CASE(3, enc, ptr, end, nextTokPtr)                              \
96
269k
    CHECK_NAME_CASE(4, enc, ptr, end, nextTokPtr)
97
98
#  define CHECK_NMSTRT_CASE(n, enc, ptr, end, nextTokPtr)                      \
99
117k
  case BT_LEAD##n:                                                             \
100
118k
    if ((end) - (ptr) < (n))                                                   \
101
117k
      return XML_TOK_PARTIAL_CHAR;                                             \
102
117k
    if (IS_INVALID_CHAR(enc, ptr, n) || ! IS_NMSTRT_CHAR(enc, ptr, n)) {       \
103
146
      *nextTokPtr = ptr;                                                       \
104
146
      return XML_TOK_INVALID;                                                  \
105
146
    }                                                                          \
106
117k
    ptr += n;                                                                  \
107
117k
    break;
108
109
#  define CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)                        \
110
3.82M
  case BT_NONASCII:                                                            \
111
3.82M
    if (! IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {                                   \
112
0
      *nextTokPtr = ptr;                                                       \
113
0
      return XML_TOK_INVALID;                                                  \
114
0
    }                                                                          \
115
3.82M
    /* fall through */                                                         \
116
3.82M
  case BT_NMSTRT:                                                              \
117
3.82M
  case BT_HEX:                                                                 \
118
3.82M
    ptr += MINBPC(enc);                                                        \
119
3.82M
    break;                                                                     \
120
3.82M
    CHECK_NMSTRT_CASE(2, enc, ptr, end, nextTokPtr)                            \
121
59.3k
    CHECK_NMSTRT_CASE(3, enc, ptr, end, nextTokPtr)                            \
122
58.4k
    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
308M
    ((end) - (ptr) >= ((count) * MINBPC(enc)))
130
131
10.9M
#  define HAS_CHAR(enc, ptr, end) HAS_CHARS(enc, ptr, end, 1)
132
133
#  define REQUIRE_CHARS(enc, ptr, end, count)                                  \
134
36.1M
    {                                                                          \
135
36.1M
      if (! HAS_CHARS(enc, ptr, end, count)) {                                 \
136
497
        return XML_TOK_PARTIAL;                                                \
137
497
      }                                                                        \
138
36.1M
    }
139
140
36.1M
#  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
35.0k
                    const char **nextTokPtr) {
147
35.0k
  if (HAS_CHAR(enc, ptr, end)) {
148
35.0k
    if (! CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
149
11
      *nextTokPtr = ptr;
150
11
      return XML_TOK_INVALID;
151
11
    }
152
34.9k
    ptr += MINBPC(enc);
153
4.78M
    while (HAS_CHAR(enc, ptr, end)) {
154
4.78M
      switch (BYTE_TYPE(enc, ptr)) {
155
199k
        INVALID_CASES(ptr, nextTokPtr)
156
47.5k
      case BT_MINUS:
157
47.5k
        ptr += MINBPC(enc);
158
47.5k
        REQUIRE_CHAR(enc, ptr, end);
159
47.5k
        if (CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
160
34.8k
          ptr += MINBPC(enc);
161
34.8k
          REQUIRE_CHAR(enc, ptr, end);
162
34.8k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
163
15
            *nextTokPtr = ptr;
164
15
            return XML_TOK_INVALID;
165
15
          }
166
34.8k
          *nextTokPtr = ptr + MINBPC(enc);
167
34.8k
          return XML_TOK_COMMENT;
168
34.8k
        }
169
12.6k
        break;
170
4.63M
      default:
171
4.63M
        ptr += MINBPC(enc);
172
4.63M
        break;
173
4.78M
      }
174
4.78M
    }
175
34.9k
  }
176
78
  return XML_TOK_PARTIAL;
177
35.0k
}
xmltok.c:normal_scanComment
Line
Count
Source
146
35.0k
                    const char **nextTokPtr) {
147
35.0k
  if (HAS_CHAR(enc, ptr, end)) {
148
35.0k
    if (! CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
149
11
      *nextTokPtr = ptr;
150
11
      return XML_TOK_INVALID;
151
11
    }
152
34.9k
    ptr += MINBPC(enc);
153
4.78M
    while (HAS_CHAR(enc, ptr, end)) {
154
4.78M
      switch (BYTE_TYPE(enc, ptr)) {
155
199k
        INVALID_CASES(ptr, nextTokPtr)
156
47.5k
      case BT_MINUS:
157
47.5k
        ptr += MINBPC(enc);
158
47.5k
        REQUIRE_CHAR(enc, ptr, end);
159
47.5k
        if (CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
160
34.8k
          ptr += MINBPC(enc);
161
34.8k
          REQUIRE_CHAR(enc, ptr, end);
162
34.8k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
163
15
            *nextTokPtr = ptr;
164
15
            return XML_TOK_INVALID;
165
15
          }
166
34.8k
          *nextTokPtr = ptr + MINBPC(enc);
167
34.8k
          return XML_TOK_COMMENT;
168
34.8k
        }
169
12.6k
        break;
170
4.63M
      default:
171
4.63M
        ptr += MINBPC(enc);
172
4.63M
        break;
173
4.78M
      }
174
4.78M
    }
175
34.9k
  }
176
78
  return XML_TOK_PARTIAL;
177
35.0k
}
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
53.5k
                 const char **nextTokPtr) {
184
53.5k
  REQUIRE_CHAR(enc, ptr, end);
185
53.5k
  switch (BYTE_TYPE(enc, ptr)) {
186
2.04k
  case BT_MINUS:
187
2.04k
    return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
188
3
  case BT_LSQB:
189
3
    *nextTokPtr = ptr + MINBPC(enc);
190
3
    return XML_TOK_COND_SECT_OPEN;
191
1.43k
  case BT_NMSTRT:
192
51.5k
  case BT_HEX:
193
51.5k
    ptr += MINBPC(enc);
194
51.5k
    break;
195
1
  default:
196
1
    *nextTokPtr = ptr;
197
1
    return XML_TOK_INVALID;
198
53.5k
  }
199
476k
  while (HAS_CHAR(enc, ptr, end)) {
200
476k
    switch (BYTE_TYPE(enc, ptr)) {
201
24
    case BT_PERCNT:
202
24
      REQUIRE_CHARS(enc, ptr, end, 2);
203
      /* don't allow <!ENTITY% foo "whatever"> */
204
22
      switch (BYTE_TYPE(enc, ptr + MINBPC(enc))) {
205
4
      case BT_S:
206
5
      case BT_CR:
207
7
      case BT_LF:
208
10
      case BT_PERCNT:
209
10
        *nextTokPtr = ptr;
210
10
        return XML_TOK_INVALID;
211
22
      }
212
      /* fall through */
213
18.2k
    case BT_S:
214
48.0k
    case BT_CR:
215
51.4k
    case BT_LF:
216
51.4k
      *nextTokPtr = ptr;
217
51.4k
      return XML_TOK_DECL_OPEN;
218
284k
    case BT_NMSTRT:
219
425k
    case BT_HEX:
220
425k
      ptr += MINBPC(enc);
221
425k
      break;
222
15
    default:
223
15
      *nextTokPtr = ptr;
224
15
      return XML_TOK_INVALID;
225
476k
    }
226
476k
  }
227
80
  return XML_TOK_PARTIAL;
228
51.5k
}
xmltok.c:normal_scanDecl
Line
Count
Source
183
53.5k
                 const char **nextTokPtr) {
184
53.5k
  REQUIRE_CHAR(enc, ptr, end);
185
53.5k
  switch (BYTE_TYPE(enc, ptr)) {
186
2.04k
  case BT_MINUS:
187
2.04k
    return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
188
3
  case BT_LSQB:
189
3
    *nextTokPtr = ptr + MINBPC(enc);
190
3
    return XML_TOK_COND_SECT_OPEN;
191
1.43k
  case BT_NMSTRT:
192
51.5k
  case BT_HEX:
193
51.5k
    ptr += MINBPC(enc);
194
51.5k
    break;
195
1
  default:
196
1
    *nextTokPtr = ptr;
197
1
    return XML_TOK_INVALID;
198
53.5k
  }
199
476k
  while (HAS_CHAR(enc, ptr, end)) {
200
476k
    switch (BYTE_TYPE(enc, ptr)) {
201
24
    case BT_PERCNT:
202
24
      REQUIRE_CHARS(enc, ptr, end, 2);
203
      /* don't allow <!ENTITY% foo "whatever"> */
204
22
      switch (BYTE_TYPE(enc, ptr + MINBPC(enc))) {
205
4
      case BT_S:
206
5
      case BT_CR:
207
7
      case BT_LF:
208
10
      case BT_PERCNT:
209
10
        *nextTokPtr = ptr;
210
10
        return XML_TOK_INVALID;
211
22
      }
212
      /* fall through */
213
18.2k
    case BT_S:
214
48.0k
    case BT_CR:
215
51.4k
    case BT_LF:
216
51.4k
      *nextTokPtr = ptr;
217
51.4k
      return XML_TOK_DECL_OPEN;
218
284k
    case BT_NMSTRT:
219
425k
    case BT_HEX:
220
425k
      ptr += MINBPC(enc);
221
425k
      break;
222
15
    default:
223
15
      *nextTokPtr = ptr;
224
15
      return XML_TOK_INVALID;
225
476k
    }
226
476k
  }
227
80
  return XML_TOK_PARTIAL;
228
51.5k
}
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
46.0k
                      int *tokPtr) {
233
46.0k
  int upper = 0;
234
46.0k
  UNUSED_P(enc);
235
46.0k
  *tokPtr = XML_TOK_PI;
236
46.0k
  if (end - ptr != MINBPC(enc) * 3)
237
31.5k
    return 1;
238
14.5k
  switch (BYTE_TO_ASCII(enc, ptr)) {
239
6.32k
  case ASCII_x:
240
6.32k
    break;
241
2.55k
  case ASCII_X:
242
2.55k
    upper = 1;
243
2.55k
    break;
244
5.62k
  default:
245
5.62k
    return 1;
246
14.5k
  }
247
8.88k
  ptr += MINBPC(enc);
248
8.88k
  switch (BYTE_TO_ASCII(enc, ptr)) {
249
5.84k
  case ASCII_m:
250
5.84k
    break;
251
659
  case ASCII_M:
252
659
    upper = 1;
253
659
    break;
254
2.38k
  default:
255
2.38k
    return 1;
256
8.88k
  }
257
6.50k
  ptr += MINBPC(enc);
258
6.50k
  switch (BYTE_TO_ASCII(enc, ptr)) {
259
1.14k
  case ASCII_l:
260
1.14k
    break;
261
3
  case ASCII_L:
262
3
    upper = 1;
263
3
    break;
264
5.36k
  default:
265
5.36k
    return 1;
266
6.50k
  }
267
1.14k
  if (upper)
268
6
    return 0;
269
1.13k
  *tokPtr = XML_TOK_XML_DECL;
270
1.13k
  return 1;
271
1.14k
}
xmltok.c:normal_checkPiTarget
Line
Count
Source
232
46.0k
                      int *tokPtr) {
233
46.0k
  int upper = 0;
234
46.0k
  UNUSED_P(enc);
235
46.0k
  *tokPtr = XML_TOK_PI;
236
46.0k
  if (end - ptr != MINBPC(enc) * 3)
237
31.5k
    return 1;
238
14.5k
  switch (BYTE_TO_ASCII(enc, ptr)) {
239
6.32k
  case ASCII_x:
240
6.32k
    break;
241
2.55k
  case ASCII_X:
242
2.55k
    upper = 1;
243
2.55k
    break;
244
5.62k
  default:
245
5.62k
    return 1;
246
14.5k
  }
247
8.88k
  ptr += MINBPC(enc);
248
8.88k
  switch (BYTE_TO_ASCII(enc, ptr)) {
249
5.84k
  case ASCII_m:
250
5.84k
    break;
251
659
  case ASCII_M:
252
659
    upper = 1;
253
659
    break;
254
2.38k
  default:
255
2.38k
    return 1;
256
8.88k
  }
257
6.50k
  ptr += MINBPC(enc);
258
6.50k
  switch (BYTE_TO_ASCII(enc, ptr)) {
259
1.14k
  case ASCII_l:
260
1.14k
    break;
261
3
  case ASCII_L:
262
3
    upper = 1;
263
3
    break;
264
5.36k
  default:
265
5.36k
    return 1;
266
6.50k
  }
267
1.14k
  if (upper)
268
6
    return 0;
269
1.13k
  *tokPtr = XML_TOK_XML_DECL;
270
1.13k
  return 1;
271
1.14k
}
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
46.2k
               const char **nextTokPtr) {
278
46.2k
  int tok;
279
46.2k
  const char *target = ptr;
280
46.2k
  REQUIRE_CHAR(enc, ptr, end);
281
46.1k
  switch (BYTE_TYPE(enc, ptr)) {
282
52.9k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
283
1
  default:
284
1
    *nextTokPtr = ptr;
285
1
    return XML_TOK_INVALID;
286
46.1k
  }
287
5.21M
  while (HAS_CHAR(enc, ptr, end)) {
288
5.21M
    switch (BYTE_TYPE(enc, ptr)) {
289
19.0M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
290
10.6k
    case BT_S:
291
14.8k
    case BT_CR:
292
21.1k
    case BT_LF:
293
21.1k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
294
3
        *nextTokPtr = ptr;
295
3
        return XML_TOK_INVALID;
296
3
      }
297
21.1k
      ptr += MINBPC(enc);
298
14.0M
      while (HAS_CHAR(enc, ptr, end)) {
299
14.0M
        switch (BYTE_TYPE(enc, ptr)) {
300
520k
          INVALID_CASES(ptr, nextTokPtr)
301
59.3k
        case BT_QUEST:
302
59.3k
          ptr += MINBPC(enc);
303
59.3k
          REQUIRE_CHAR(enc, ptr, end);
304
59.3k
          if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
305
20.9k
            *nextTokPtr = ptr + MINBPC(enc);
306
20.9k
            return tok;
307
20.9k
          }
308
38.3k
          break;
309
13.7M
        default:
310
13.7M
          ptr += MINBPC(enc);
311
13.7M
          break;
312
14.0M
        }
313
14.0M
      }
314
114
      return XML_TOK_PARTIAL;
315
24.8k
    case BT_QUEST:
316
24.8k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
317
3
        *nextTokPtr = ptr;
318
3
        return XML_TOK_INVALID;
319
3
      }
320
24.8k
      ptr += MINBPC(enc);
321
24.8k
      REQUIRE_CHAR(enc, ptr, end);
322
24.8k
      if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
323
24.7k
        *nextTokPtr = ptr + MINBPC(enc);
324
24.7k
        return tok;
325
24.7k
      }
326
      /* fall through */
327
27
    default:
328
27
      *nextTokPtr = ptr;
329
27
      return XML_TOK_INVALID;
330
5.21M
    }
331
5.21M
  }
332
92
  return XML_TOK_PARTIAL;
333
46.1k
}
xmltok.c:normal_scanPi
Line
Count
Source
277
46.2k
               const char **nextTokPtr) {
278
46.2k
  int tok;
279
46.2k
  const char *target = ptr;
280
46.2k
  REQUIRE_CHAR(enc, ptr, end);
281
46.1k
  switch (BYTE_TYPE(enc, ptr)) {
282
52.9k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
283
1
  default:
284
1
    *nextTokPtr = ptr;
285
1
    return XML_TOK_INVALID;
286
46.1k
  }
287
5.21M
  while (HAS_CHAR(enc, ptr, end)) {
288
5.21M
    switch (BYTE_TYPE(enc, ptr)) {
289
19.0M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
290
10.6k
    case BT_S:
291
14.8k
    case BT_CR:
292
21.1k
    case BT_LF:
293
21.1k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
294
3
        *nextTokPtr = ptr;
295
3
        return XML_TOK_INVALID;
296
3
      }
297
21.1k
      ptr += MINBPC(enc);
298
14.0M
      while (HAS_CHAR(enc, ptr, end)) {
299
14.0M
        switch (BYTE_TYPE(enc, ptr)) {
300
520k
          INVALID_CASES(ptr, nextTokPtr)
301
59.3k
        case BT_QUEST:
302
59.3k
          ptr += MINBPC(enc);
303
59.3k
          REQUIRE_CHAR(enc, ptr, end);
304
59.3k
          if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
305
20.9k
            *nextTokPtr = ptr + MINBPC(enc);
306
20.9k
            return tok;
307
20.9k
          }
308
38.3k
          break;
309
13.7M
        default:
310
13.7M
          ptr += MINBPC(enc);
311
13.7M
          break;
312
14.0M
        }
313
14.0M
      }
314
114
      return XML_TOK_PARTIAL;
315
24.8k
    case BT_QUEST:
316
24.8k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
317
3
        *nextTokPtr = ptr;
318
3
        return XML_TOK_INVALID;
319
3
      }
320
24.8k
      ptr += MINBPC(enc);
321
24.8k
      REQUIRE_CHAR(enc, ptr, end);
322
24.8k
      if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
323
24.7k
        *nextTokPtr = ptr + MINBPC(enc);
324
24.7k
        return tok;
325
24.7k
      }
326
      /* fall through */
327
27
    default:
328
27
      *nextTokPtr = ptr;
329
27
      return XML_TOK_INVALID;
330
5.21M
    }
331
5.21M
  }
332
92
  return XML_TOK_PARTIAL;
333
46.1k
}
Unexecuted instantiation: xmltok.c:little2_scanPi
Unexecuted instantiation: xmltok.c:big2_scanPi
334
335
static int PTRCALL
336
PREFIX(scanCdataSection)(const ENCODING *enc, const char *ptr, const char *end,
337
1.73k
                         const char **nextTokPtr) {
338
1.73k
  static const char CDATA_LSQB[]
339
1.73k
      = {ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, ASCII_LSQB};
340
1.73k
  int i;
341
1.73k
  UNUSED_P(enc);
342
  /* CDATA[ */
343
1.73k
  REQUIRE_CHARS(enc, ptr, end, 6);
344
11.8k
  for (i = 0; i < 6; i++, ptr += MINBPC(enc)) {
345
10.1k
    if (! CHAR_MATCHES(enc, ptr, CDATA_LSQB[i])) {
346
56
      *nextTokPtr = ptr;
347
56
      return XML_TOK_INVALID;
348
56
    }
349
10.1k
  }
350
1.66k
  *nextTokPtr = ptr;
351
1.66k
  return XML_TOK_CDATA_SECT_OPEN;
352
1.71k
}
xmltok.c:normal_scanCdataSection
Line
Count
Source
337
1.73k
                         const char **nextTokPtr) {
338
1.73k
  static const char CDATA_LSQB[]
339
1.73k
      = {ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, ASCII_LSQB};
340
1.73k
  int i;
341
1.73k
  UNUSED_P(enc);
342
  /* CDATA[ */
343
1.73k
  REQUIRE_CHARS(enc, ptr, end, 6);
344
11.8k
  for (i = 0; i < 6; i++, ptr += MINBPC(enc)) {
345
10.1k
    if (! CHAR_MATCHES(enc, ptr, CDATA_LSQB[i])) {
346
56
      *nextTokPtr = ptr;
347
56
      return XML_TOK_INVALID;
348
56
    }
349
10.1k
  }
350
1.66k
  *nextTokPtr = ptr;
351
1.66k
  return XML_TOK_CDATA_SECT_OPEN;
352
1.71k
}
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
3.01M
                        const char **nextTokPtr) {
357
3.01M
  if (ptr >= end)
358
178
    return XML_TOK_NONE;
359
3.01M
  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
3.01M
  switch (BYTE_TYPE(enc, ptr)) {
369
247k
  case BT_RSQB:
370
247k
    ptr += MINBPC(enc);
371
247k
    REQUIRE_CHAR(enc, ptr, end);
372
247k
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
373
125k
      break;
374
122k
    ptr += MINBPC(enc);
375
122k
    REQUIRE_CHAR(enc, ptr, end);
376
122k
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
377
121k
      ptr -= MINBPC(enc);
378
121k
      break;
379
121k
    }
380
1.52k
    *nextTokPtr = ptr + MINBPC(enc);
381
1.52k
    return XML_TOK_CDATA_SECT_CLOSE;
382
1.35M
  case BT_CR:
383
1.35M
    ptr += MINBPC(enc);
384
1.35M
    REQUIRE_CHAR(enc, ptr, end);
385
1.35M
    if (BYTE_TYPE(enc, ptr) == BT_LF)
386
214k
      ptr += MINBPC(enc);
387
1.35M
    *nextTokPtr = ptr;
388
1.35M
    return XML_TOK_DATA_NEWLINE;
389
807k
  case BT_LF:
390
807k
    *nextTokPtr = ptr + MINBPC(enc);
391
807k
    return XML_TOK_DATA_NEWLINE;
392
807k
    INVALID_CASES(ptr, nextTokPtr)
393
541k
  default:
394
541k
    ptr += MINBPC(enc);
395
541k
    break;
396
3.01M
  }
397
20.3M
  while (HAS_CHAR(enc, ptr, end)) {
398
20.3M
    switch (BYTE_TYPE(enc, ptr)) {
399
0
#  define LEAD_CASE(n)                                                         \
400
289k
  case BT_LEAD##n:                                                             \
401
289k
    if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) {                       \
402
21
      *nextTokPtr = ptr;                                                       \
403
21
      return XML_TOK_DATA_CHARS;                                               \
404
21
    }                                                                          \
405
289k
    ptr += n;                                                                  \
406
289k
    break;
407
150k
      LEAD_CASE(2)
408
104k
      LEAD_CASE(3)
409
34.2k
      LEAD_CASE(4)
410
0
#  undef LEAD_CASE
411
4
    case BT_NONXML:
412
5
    case BT_MALFORM:
413
9
    case BT_TRAIL:
414
427k
    case BT_CR:
415
653k
    case BT_LF:
416
852k
    case BT_RSQB:
417
852k
      *nextTokPtr = ptr;
418
852k
      return XML_TOK_DATA_CHARS;
419
19.2M
    default:
420
19.2M
      ptr += MINBPC(enc);
421
19.2M
      break;
422
20.3M
    }
423
20.3M
  }
424
64
  *nextTokPtr = ptr;
425
64
  return XML_TOK_DATA_CHARS;
426
852k
}
xmltok.c:normal_cdataSectionTok
Line
Count
Source
356
3.01M
                        const char **nextTokPtr) {
357
3.01M
  if (ptr >= end)
358
178
    return XML_TOK_NONE;
359
3.01M
  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
3.01M
  switch (BYTE_TYPE(enc, ptr)) {
369
247k
  case BT_RSQB:
370
247k
    ptr += MINBPC(enc);
371
247k
    REQUIRE_CHAR(enc, ptr, end);
372
247k
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
373
125k
      break;
374
122k
    ptr += MINBPC(enc);
375
122k
    REQUIRE_CHAR(enc, ptr, end);
376
122k
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
377
121k
      ptr -= MINBPC(enc);
378
121k
      break;
379
121k
    }
380
1.52k
    *nextTokPtr = ptr + MINBPC(enc);
381
1.52k
    return XML_TOK_CDATA_SECT_CLOSE;
382
1.35M
  case BT_CR:
383
1.35M
    ptr += MINBPC(enc);
384
1.35M
    REQUIRE_CHAR(enc, ptr, end);
385
1.35M
    if (BYTE_TYPE(enc, ptr) == BT_LF)
386
214k
      ptr += MINBPC(enc);
387
1.35M
    *nextTokPtr = ptr;
388
1.35M
    return XML_TOK_DATA_NEWLINE;
389
807k
  case BT_LF:
390
807k
    *nextTokPtr = ptr + MINBPC(enc);
391
807k
    return XML_TOK_DATA_NEWLINE;
392
807k
    INVALID_CASES(ptr, nextTokPtr)
393
541k
  default:
394
541k
    ptr += MINBPC(enc);
395
541k
    break;
396
3.01M
  }
397
20.3M
  while (HAS_CHAR(enc, ptr, end)) {
398
20.3M
    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
150k
      LEAD_CASE(2)
408
104k
      LEAD_CASE(3)
409
34.2k
      LEAD_CASE(4)
410
0
#  undef LEAD_CASE
411
4
    case BT_NONXML:
412
5
    case BT_MALFORM:
413
9
    case BT_TRAIL:
414
427k
    case BT_CR:
415
653k
    case BT_LF:
416
852k
    case BT_RSQB:
417
852k
      *nextTokPtr = ptr;
418
852k
      return XML_TOK_DATA_CHARS;
419
19.2M
    default:
420
19.2M
      ptr += MINBPC(enc);
421
19.2M
      break;
422
20.3M
    }
423
20.3M
  }
424
64
  *nextTokPtr = ptr;
425
64
  return XML_TOK_DATA_CHARS;
426
852k
}
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
64.7k
                   const char **nextTokPtr) {
433
64.7k
  REQUIRE_CHAR(enc, ptr, end);
434
64.7k
  switch (BYTE_TYPE(enc, ptr)) {
435
67.9k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
436
3
  default:
437
3
    *nextTokPtr = ptr;
438
3
    return XML_TOK_INVALID;
439
64.7k
  }
440
3.39M
  while (HAS_CHAR(enc, ptr, end)) {
441
3.39M
    switch (BYTE_TYPE(enc, ptr)) {
442
10.0M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
443
1.50k
    case BT_S:
444
2.13k
    case BT_CR:
445
2.45k
    case BT_LF:
446
10.2k
      for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
447
10.2k
        switch (BYTE_TYPE(enc, ptr)) {
448
3.28k
        case BT_S:
449
4.22k
        case BT_CR:
450
7.87k
        case BT_LF:
451
7.87k
          break;
452
2.40k
        case BT_GT:
453
2.40k
          *nextTokPtr = ptr + MINBPC(enc);
454
2.40k
          return XML_TOK_END_TAG;
455
4
        default:
456
4
          *nextTokPtr = ptr;
457
4
          return XML_TOK_INVALID;
458
10.2k
        }
459
10.2k
      }
460
46
      return XML_TOK_PARTIAL;
461
#  ifdef XML_NS
462
    case BT_COLON:
463
      /* no need to check qname syntax here,
464
         since end-tag must match exactly */
465
      ptr += MINBPC(enc);
466
      break;
467
#  endif
468
62.0k
    case BT_GT:
469
62.0k
      *nextTokPtr = ptr + MINBPC(enc);
470
62.0k
      return XML_TOK_END_TAG;
471
12
    default:
472
12
      *nextTokPtr = ptr;
473
12
      return XML_TOK_INVALID;
474
3.39M
    }
475
3.39M
  }
476
122
  return XML_TOK_PARTIAL;
477
64.6k
}
xmltok.c:normal_scanEndTag
Line
Count
Source
432
64.7k
                   const char **nextTokPtr) {
433
64.7k
  REQUIRE_CHAR(enc, ptr, end);
434
64.7k
  switch (BYTE_TYPE(enc, ptr)) {
435
67.9k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
436
3
  default:
437
3
    *nextTokPtr = ptr;
438
3
    return XML_TOK_INVALID;
439
64.7k
  }
440
3.39M
  while (HAS_CHAR(enc, ptr, end)) {
441
3.39M
    switch (BYTE_TYPE(enc, ptr)) {
442
10.0M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
443
1.50k
    case BT_S:
444
2.13k
    case BT_CR:
445
2.45k
    case BT_LF:
446
10.2k
      for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
447
10.2k
        switch (BYTE_TYPE(enc, ptr)) {
448
3.28k
        case BT_S:
449
4.22k
        case BT_CR:
450
7.87k
        case BT_LF:
451
7.87k
          break;
452
2.40k
        case BT_GT:
453
2.40k
          *nextTokPtr = ptr + MINBPC(enc);
454
2.40k
          return XML_TOK_END_TAG;
455
4
        default:
456
4
          *nextTokPtr = ptr;
457
4
          return XML_TOK_INVALID;
458
10.2k
        }
459
10.2k
      }
460
46
      return XML_TOK_PARTIAL;
461
#  ifdef XML_NS
462
    case BT_COLON:
463
      /* no need to check qname syntax here,
464
         since end-tag must match exactly */
465
      ptr += MINBPC(enc);
466
      break;
467
#  endif
468
62.0k
    case BT_GT:
469
62.0k
      *nextTokPtr = ptr + MINBPC(enc);
470
62.0k
      return XML_TOK_END_TAG;
471
12
    default:
472
12
      *nextTokPtr = ptr;
473
12
      return XML_TOK_INVALID;
474
3.39M
    }
475
3.39M
  }
476
122
  return XML_TOK_PARTIAL;
477
64.6k
}
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
276k
                       const char **nextTokPtr) {
484
276k
  if (HAS_CHAR(enc, ptr, end)) {
485
276k
    switch (BYTE_TYPE(enc, ptr)) {
486
125k
    case BT_DIGIT:
487
276k
    case BT_HEX:
488
276k
      break;
489
6
    default:
490
6
      *nextTokPtr = ptr;
491
6
      return XML_TOK_INVALID;
492
276k
    }
493
1.00M
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
494
1.00M
      switch (BYTE_TYPE(enc, ptr)) {
495
473k
      case BT_DIGIT:
496
726k
      case BT_HEX:
497
726k
        break;
498
276k
      case BT_SEMI:
499
276k
        *nextTokPtr = ptr + MINBPC(enc);
500
276k
        return XML_TOK_CHAR_REF;
501
2
      default:
502
2
        *nextTokPtr = ptr;
503
2
        return XML_TOK_INVALID;
504
1.00M
      }
505
1.00M
    }
506
276k
  }
507
28
  return XML_TOK_PARTIAL;
508
276k
}
xmltok.c:normal_scanHexCharRef
Line
Count
Source
483
276k
                       const char **nextTokPtr) {
484
276k
  if (HAS_CHAR(enc, ptr, end)) {
485
276k
    switch (BYTE_TYPE(enc, ptr)) {
486
125k
    case BT_DIGIT:
487
276k
    case BT_HEX:
488
276k
      break;
489
6
    default:
490
6
      *nextTokPtr = ptr;
491
6
      return XML_TOK_INVALID;
492
276k
    }
493
1.00M
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
494
1.00M
      switch (BYTE_TYPE(enc, ptr)) {
495
473k
      case BT_DIGIT:
496
726k
      case BT_HEX:
497
726k
        break;
498
276k
      case BT_SEMI:
499
276k
        *nextTokPtr = ptr + MINBPC(enc);
500
276k
        return XML_TOK_CHAR_REF;
501
2
      default:
502
2
        *nextTokPtr = ptr;
503
2
        return XML_TOK_INVALID;
504
1.00M
      }
505
1.00M
    }
506
276k
  }
507
28
  return XML_TOK_PARTIAL;
508
276k
}
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
292k
                    const char **nextTokPtr) {
515
292k
  if (HAS_CHAR(enc, ptr, end)) {
516
292k
    if (CHAR_MATCHES(enc, ptr, ASCII_x))
517
276k
      return PREFIX(scanHexCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
518
15.7k
    switch (BYTE_TYPE(enc, ptr)) {
519
15.7k
    case BT_DIGIT:
520
15.7k
      break;
521
14
    default:
522
14
      *nextTokPtr = ptr;
523
14
      return XML_TOK_INVALID;
524
15.7k
    }
525
51.2k
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
526
51.2k
      switch (BYTE_TYPE(enc, ptr)) {
527
35.5k
      case BT_DIGIT:
528
35.5k
        break;
529
15.7k
      case BT_SEMI:
530
15.7k
        *nextTokPtr = ptr + MINBPC(enc);
531
15.7k
        return XML_TOK_CHAR_REF;
532
1
      default:
533
1
        *nextTokPtr = ptr;
534
1
        return XML_TOK_INVALID;
535
51.2k
      }
536
51.2k
    }
537
15.7k
  }
538
26
  return XML_TOK_PARTIAL;
539
292k
}
xmltok.c:normal_scanCharRef
Line
Count
Source
514
292k
                    const char **nextTokPtr) {
515
292k
  if (HAS_CHAR(enc, ptr, end)) {
516
292k
    if (CHAR_MATCHES(enc, ptr, ASCII_x))
517
276k
      return PREFIX(scanHexCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
518
15.7k
    switch (BYTE_TYPE(enc, ptr)) {
519
15.7k
    case BT_DIGIT:
520
15.7k
      break;
521
14
    default:
522
14
      *nextTokPtr = ptr;
523
14
      return XML_TOK_INVALID;
524
15.7k
    }
525
51.2k
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
526
51.2k
      switch (BYTE_TYPE(enc, ptr)) {
527
35.5k
      case BT_DIGIT:
528
35.5k
        break;
529
15.7k
      case BT_SEMI:
530
15.7k
        *nextTokPtr = ptr + MINBPC(enc);
531
15.7k
        return XML_TOK_CHAR_REF;
532
1
      default:
533
1
        *nextTokPtr = ptr;
534
1
        return XML_TOK_INVALID;
535
51.2k
      }
536
51.2k
    }
537
15.7k
  }
538
26
  return XML_TOK_PARTIAL;
539
292k
}
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
542k
                const char **nextTokPtr) {
546
542k
  REQUIRE_CHAR(enc, ptr, end);
547
542k
  switch (BYTE_TYPE(enc, ptr)) {
548
83.3k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
549
292k
  case BT_NUM:
550
292k
    return PREFIX(scanCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
551
3
  default:
552
3
    *nextTokPtr = ptr;
553
3
    return XML_TOK_INVALID;
554
542k
  }
555
1.68M
  while (HAS_CHAR(enc, ptr, end)) {
556
1.68M
    switch (BYTE_TYPE(enc, ptr)) {
557
5.31M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
558
249k
    case BT_SEMI:
559
249k
      *nextTokPtr = ptr + MINBPC(enc);
560
249k
      return XML_TOK_ENTITY_REF;
561
17
    default:
562
17
      *nextTokPtr = ptr;
563
17
      return XML_TOK_INVALID;
564
1.68M
    }
565
1.68M
  }
566
99
  return XML_TOK_PARTIAL;
567
250k
}
xmltok.c:normal_scanRef
Line
Count
Source
545
542k
                const char **nextTokPtr) {
546
542k
  REQUIRE_CHAR(enc, ptr, end);
547
542k
  switch (BYTE_TYPE(enc, ptr)) {
548
83.3k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
549
292k
  case BT_NUM:
550
292k
    return PREFIX(scanCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
551
3
  default:
552
3
    *nextTokPtr = ptr;
553
3
    return XML_TOK_INVALID;
554
542k
  }
555
1.68M
  while (HAS_CHAR(enc, ptr, end)) {
556
1.68M
    switch (BYTE_TYPE(enc, ptr)) {
557
5.31M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
558
249k
    case BT_SEMI:
559
249k
      *nextTokPtr = ptr + MINBPC(enc);
560
249k
      return XML_TOK_ENTITY_REF;
561
17
    default:
562
17
      *nextTokPtr = ptr;
563
17
      return XML_TOK_INVALID;
564
1.68M
    }
565
1.68M
  }
566
99
  return XML_TOK_PARTIAL;
567
250k
}
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
127k
                 const char **nextTokPtr) {
574
#  ifdef XML_NS
575
  int hadColon = 0;
576
#  endif
577
3.99M
  while (HAS_CHAR(enc, ptr, end)) {
578
3.99M
    switch (BYTE_TYPE(enc, ptr)) {
579
2.74M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
580
#  ifdef XML_NS
581
    case BT_COLON:
582
      if (hadColon) {
583
        *nextTokPtr = ptr;
584
        return XML_TOK_INVALID;
585
      }
586
      hadColon = 1;
587
      ptr += MINBPC(enc);
588
      REQUIRE_CHAR(enc, ptr, end);
589
      switch (BYTE_TYPE(enc, ptr)) {
590
        CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
591
      default:
592
        *nextTokPtr = ptr;
593
        return XML_TOK_INVALID;
594
      }
595
      break;
596
#  endif
597
1.18k
    case BT_S:
598
23.3k
    case BT_CR:
599
24.4k
    case BT_LF:
600
52.9k
      for (;;) {
601
52.9k
        int t;
602
603
52.9k
        ptr += MINBPC(enc);
604
52.9k
        REQUIRE_CHAR(enc, ptr, end);
605
52.9k
        t = BYTE_TYPE(enc, ptr);
606
52.9k
        if (t == BT_EQUALS)
607
24.3k
          break;
608
28.5k
        switch (t) {
609
1.82k
        case BT_S:
610
2.83k
        case BT_LF:
611
28.5k
        case BT_CR:
612
28.5k
          break;
613
11
        default:
614
11
          *nextTokPtr = ptr;
615
11
          return XML_TOK_INVALID;
616
28.5k
        }
617
28.5k
      }
618
      /* fall through */
619
3.01M
    case BT_EQUALS: {
620
3.01M
      int open;
621
#  ifdef XML_NS
622
      hadColon = 0;
623
#  endif
624
3.09M
      for (;;) {
625
3.09M
        ptr += MINBPC(enc);
626
3.09M
        REQUIRE_CHAR(enc, ptr, end);
627
3.09M
        open = BYTE_TYPE(enc, ptr);
628
3.09M
        if (open == BT_QUOT || open == BT_APOS)
629
3.01M
          break;
630
80.2k
        switch (open) {
631
20.1k
        case BT_S:
632
34.3k
        case BT_LF:
633
80.2k
        case BT_CR:
634
80.2k
          break;
635
11
        default:
636
11
          *nextTokPtr = ptr;
637
11
          return XML_TOK_INVALID;
638
80.2k
        }
639
80.2k
      }
640
3.01M
      ptr += MINBPC(enc);
641
      /* in attribute value */
642
22.9M
      for (;;) {
643
22.9M
        int t;
644
22.9M
        REQUIRE_CHAR(enc, ptr, end);
645
22.9M
        t = BYTE_TYPE(enc, ptr);
646
22.9M
        if (t == open)
647
3.01M
          break;
648
19.9M
        switch (t) {
649
396k
          INVALID_CASES(ptr, nextTokPtr)
650
133k
        case BT_AMP: {
651
133k
          int tok = PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, &ptr);
652
133k
          if (tok <= 0) {
653
49
            if (tok == XML_TOK_INVALID)
654
19
              *nextTokPtr = ptr;
655
49
            return tok;
656
49
          }
657
133k
          break;
658
133k
        }
659
133k
        case BT_LT:
660
4
          *nextTokPtr = ptr;
661
4
          return XML_TOK_INVALID;
662
19.6M
        default:
663
19.6M
          ptr += MINBPC(enc);
664
19.6M
          break;
665
19.9M
        }
666
19.9M
      }
667
3.01M
      ptr += MINBPC(enc);
668
3.01M
      REQUIRE_CHAR(enc, ptr, end);
669
3.01M
      switch (BYTE_TYPE(enc, ptr)) {
670
1.52M
      case BT_S:
671
2.88M
      case BT_CR:
672
2.93M
      case BT_LF:
673
2.93M
        break;
674
75.7k
      case BT_SOL:
675
75.7k
        goto sol;
676
6.40k
      case BT_GT:
677
6.40k
        goto gt;
678
3
      default:
679
3
        *nextTokPtr = ptr;
680
3
        return XML_TOK_INVALID;
681
3.01M
      }
682
      /* ptr points to closing quote */
683
3.27M
      for (;;) {
684
3.27M
        ptr += MINBPC(enc);
685
3.27M
        REQUIRE_CHAR(enc, ptr, end);
686
3.27M
        switch (BYTE_TYPE(enc, ptr)) {
687
2.88M
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
688
256k
        case BT_S:
689
306k
        case BT_CR:
690
338k
        case BT_LF:
691
338k
          continue;
692
501
        case BT_GT:
693
6.90k
        gt:
694
6.90k
          *nextTokPtr = ptr + MINBPC(enc);
695
6.90k
          return XML_TOK_START_TAG_WITH_ATTS;
696
44.6k
        case BT_SOL:
697
120k
        sol:
698
120k
          ptr += MINBPC(enc);
699
120k
          REQUIRE_CHAR(enc, ptr, end);
700
120k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
701
11
            *nextTokPtr = ptr;
702
11
            return XML_TOK_INVALID;
703
11
          }
704
120k
          *nextTokPtr = ptr + MINBPC(enc);
705
120k
          return XML_TOK_EMPTY_ELEMENT_WITH_ATTS;
706
4
        default:
707
4
          *nextTokPtr = ptr;
708
4
          return XML_TOK_INVALID;
709
3.27M
        }
710
2.88M
        break;
711
3.27M
      }
712
2.88M
      break;
713
2.93M
    }
714
2.88M
    default:
715
16
      *nextTokPtr = ptr;
716
16
      return XML_TOK_INVALID;
717
3.99M
    }
718
3.99M
  }
719
118
  return XML_TOK_PARTIAL;
720
127k
}
xmltok.c:normal_scanAtts
Line
Count
Source
573
127k
                 const char **nextTokPtr) {
574
#  ifdef XML_NS
575
  int hadColon = 0;
576
#  endif
577
3.99M
  while (HAS_CHAR(enc, ptr, end)) {
578
3.99M
    switch (BYTE_TYPE(enc, ptr)) {
579
2.74M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
580
#  ifdef XML_NS
581
    case BT_COLON:
582
      if (hadColon) {
583
        *nextTokPtr = ptr;
584
        return XML_TOK_INVALID;
585
      }
586
      hadColon = 1;
587
      ptr += MINBPC(enc);
588
      REQUIRE_CHAR(enc, ptr, end);
589
      switch (BYTE_TYPE(enc, ptr)) {
590
        CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
591
      default:
592
        *nextTokPtr = ptr;
593
        return XML_TOK_INVALID;
594
      }
595
      break;
596
#  endif
597
1.18k
    case BT_S:
598
23.3k
    case BT_CR:
599
24.4k
    case BT_LF:
600
52.9k
      for (;;) {
601
52.9k
        int t;
602
603
52.9k
        ptr += MINBPC(enc);
604
52.9k
        REQUIRE_CHAR(enc, ptr, end);
605
52.9k
        t = BYTE_TYPE(enc, ptr);
606
52.9k
        if (t == BT_EQUALS)
607
24.3k
          break;
608
28.5k
        switch (t) {
609
1.82k
        case BT_S:
610
2.83k
        case BT_LF:
611
28.5k
        case BT_CR:
612
28.5k
          break;
613
11
        default:
614
11
          *nextTokPtr = ptr;
615
11
          return XML_TOK_INVALID;
616
28.5k
        }
617
28.5k
      }
618
      /* fall through */
619
3.01M
    case BT_EQUALS: {
620
3.01M
      int open;
621
#  ifdef XML_NS
622
      hadColon = 0;
623
#  endif
624
3.09M
      for (;;) {
625
3.09M
        ptr += MINBPC(enc);
626
3.09M
        REQUIRE_CHAR(enc, ptr, end);
627
3.09M
        open = BYTE_TYPE(enc, ptr);
628
3.09M
        if (open == BT_QUOT || open == BT_APOS)
629
3.01M
          break;
630
80.2k
        switch (open) {
631
20.1k
        case BT_S:
632
34.3k
        case BT_LF:
633
80.2k
        case BT_CR:
634
80.2k
          break;
635
11
        default:
636
11
          *nextTokPtr = ptr;
637
11
          return XML_TOK_INVALID;
638
80.2k
        }
639
80.2k
      }
640
3.01M
      ptr += MINBPC(enc);
641
      /* in attribute value */
642
22.9M
      for (;;) {
643
22.9M
        int t;
644
22.9M
        REQUIRE_CHAR(enc, ptr, end);
645
22.9M
        t = BYTE_TYPE(enc, ptr);
646
22.9M
        if (t == open)
647
3.01M
          break;
648
19.9M
        switch (t) {
649
396k
          INVALID_CASES(ptr, nextTokPtr)
650
133k
        case BT_AMP: {
651
133k
          int tok = PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, &ptr);
652
133k
          if (tok <= 0) {
653
49
            if (tok == XML_TOK_INVALID)
654
19
              *nextTokPtr = ptr;
655
49
            return tok;
656
49
          }
657
133k
          break;
658
133k
        }
659
133k
        case BT_LT:
660
4
          *nextTokPtr = ptr;
661
4
          return XML_TOK_INVALID;
662
19.6M
        default:
663
19.6M
          ptr += MINBPC(enc);
664
19.6M
          break;
665
19.9M
        }
666
19.9M
      }
667
3.01M
      ptr += MINBPC(enc);
668
3.01M
      REQUIRE_CHAR(enc, ptr, end);
669
3.01M
      switch (BYTE_TYPE(enc, ptr)) {
670
1.52M
      case BT_S:
671
2.88M
      case BT_CR:
672
2.93M
      case BT_LF:
673
2.93M
        break;
674
75.7k
      case BT_SOL:
675
75.7k
        goto sol;
676
6.40k
      case BT_GT:
677
6.40k
        goto gt;
678
3
      default:
679
3
        *nextTokPtr = ptr;
680
3
        return XML_TOK_INVALID;
681
3.01M
      }
682
      /* ptr points to closing quote */
683
3.27M
      for (;;) {
684
3.27M
        ptr += MINBPC(enc);
685
3.27M
        REQUIRE_CHAR(enc, ptr, end);
686
3.27M
        switch (BYTE_TYPE(enc, ptr)) {
687
2.88M
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
688
256k
        case BT_S:
689
306k
        case BT_CR:
690
338k
        case BT_LF:
691
338k
          continue;
692
501
        case BT_GT:
693
6.90k
        gt:
694
6.90k
          *nextTokPtr = ptr + MINBPC(enc);
695
6.90k
          return XML_TOK_START_TAG_WITH_ATTS;
696
44.6k
        case BT_SOL:
697
120k
        sol:
698
120k
          ptr += MINBPC(enc);
699
120k
          REQUIRE_CHAR(enc, ptr, end);
700
120k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
701
11
            *nextTokPtr = ptr;
702
11
            return XML_TOK_INVALID;
703
11
          }
704
120k
          *nextTokPtr = ptr + MINBPC(enc);
705
120k
          return XML_TOK_EMPTY_ELEMENT_WITH_ATTS;
706
4
        default:
707
4
          *nextTokPtr = ptr;
708
4
          return XML_TOK_INVALID;
709
3.27M
        }
710
2.88M
        break;
711
3.27M
      }
712
2.88M
      break;
713
2.93M
    }
714
2.88M
    default:
715
16
      *nextTokPtr = ptr;
716
16
      return XML_TOK_INVALID;
717
3.99M
    }
718
3.99M
  }
719
118
  return XML_TOK_PARTIAL;
720
127k
}
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
591k
               const char **nextTokPtr) {
727
#  ifdef XML_NS
728
  int hadColon;
729
#  endif
730
591k
  REQUIRE_CHAR(enc, ptr, end);
731
591k
  switch (BYTE_TYPE(enc, ptr)) {
732
217k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
733
34.7k
  case BT_EXCL:
734
34.7k
    ptr += MINBPC(enc);
735
34.7k
    REQUIRE_CHAR(enc, ptr, end);
736
34.7k
    switch (BYTE_TYPE(enc, ptr)) {
737
32.9k
    case BT_MINUS:
738
32.9k
      return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
739
1.73k
    case BT_LSQB:
740
1.73k
      return PREFIX(scanCdataSection)(enc, ptr + MINBPC(enc), end, nextTokPtr);
741
34.7k
    }
742
4
    *nextTokPtr = ptr;
743
4
    return XML_TOK_INVALID;
744
34.0k
  case BT_QUEST:
745
34.0k
    return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
746
64.7k
  case BT_SOL:
747
64.7k
    return PREFIX(scanEndTag)(enc, ptr + MINBPC(enc), end, nextTokPtr);
748
10
  default:
749
10
    *nextTokPtr = ptr;
750
10
    return XML_TOK_INVALID;
751
591k
  }
752
#  ifdef XML_NS
753
  hadColon = 0;
754
#  endif
755
  /* we have a start-tag */
756
7.40M
  while (HAS_CHAR(enc, ptr, end)) {
757
7.40M
    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
283k
    case BT_S:
777
303k
    case BT_CR:
778
310k
    case BT_LF: {
779
310k
      ptr += MINBPC(enc);
780
347k
      while (HAS_CHAR(enc, ptr, end)) {
781
347k
        switch (BYTE_TYPE(enc, ptr)) {
782
120k
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
783
859
        case BT_GT:
784
859
          goto gt;
785
181k
        case BT_SOL:
786
181k
          goto sol;
787
3.42k
        case BT_S:
788
35.9k
        case BT_CR:
789
37.2k
        case BT_LF:
790
37.2k
          ptr += MINBPC(enc);
791
37.2k
          continue;
792
9
        default:
793
9
          *nextTokPtr = ptr;
794
9
          return XML_TOK_INVALID;
795
347k
        }
796
127k
        return PREFIX(scanAtts)(enc, ptr, end, nextTokPtr);
797
347k
      }
798
56
      return XML_TOK_PARTIAL;
799
310k
    }
800
100k
    case BT_GT:
801
100k
    gt:
802
100k
      *nextTokPtr = ptr + MINBPC(enc);
803
100k
      return XML_TOK_START_TAG_NO_ATTS;
804
48.1k
    case BT_SOL:
805
229k
    sol:
806
229k
      ptr += MINBPC(enc);
807
229k
      REQUIRE_CHAR(enc, ptr, end);
808
229k
      if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
809
13
        *nextTokPtr = ptr;
810
13
        return XML_TOK_INVALID;
811
13
      }
812
229k
      *nextTokPtr = ptr + MINBPC(enc);
813
229k
      return XML_TOK_EMPTY_ELEMENT_NO_ATTS;
814
10
    default:
815
10
      *nextTokPtr = ptr;
816
10
      return XML_TOK_INVALID;
817
7.40M
    }
818
7.40M
  }
819
166
  return XML_TOK_PARTIAL;
820
458k
}
xmltok.c:normal_scanLt
Line
Count
Source
726
591k
               const char **nextTokPtr) {
727
#  ifdef XML_NS
728
  int hadColon;
729
#  endif
730
591k
  REQUIRE_CHAR(enc, ptr, end);
731
591k
  switch (BYTE_TYPE(enc, ptr)) {
732
217k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
733
34.7k
  case BT_EXCL:
734
34.7k
    ptr += MINBPC(enc);
735
34.7k
    REQUIRE_CHAR(enc, ptr, end);
736
34.7k
    switch (BYTE_TYPE(enc, ptr)) {
737
32.9k
    case BT_MINUS:
738
32.9k
      return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
739
1.73k
    case BT_LSQB:
740
1.73k
      return PREFIX(scanCdataSection)(enc, ptr + MINBPC(enc), end, nextTokPtr);
741
34.7k
    }
742
4
    *nextTokPtr = ptr;
743
4
    return XML_TOK_INVALID;
744
34.0k
  case BT_QUEST:
745
34.0k
    return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
746
64.7k
  case BT_SOL:
747
64.7k
    return PREFIX(scanEndTag)(enc, ptr + MINBPC(enc), end, nextTokPtr);
748
10
  default:
749
10
    *nextTokPtr = ptr;
750
10
    return XML_TOK_INVALID;
751
591k
  }
752
#  ifdef XML_NS
753
  hadColon = 0;
754
#  endif
755
  /* we have a start-tag */
756
7.40M
  while (HAS_CHAR(enc, ptr, end)) {
757
7.40M
    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
283k
    case BT_S:
777
303k
    case BT_CR:
778
310k
    case BT_LF: {
779
310k
      ptr += MINBPC(enc);
780
347k
      while (HAS_CHAR(enc, ptr, end)) {
781
347k
        switch (BYTE_TYPE(enc, ptr)) {
782
120k
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
783
859
        case BT_GT:
784
859
          goto gt;
785
181k
        case BT_SOL:
786
181k
          goto sol;
787
3.42k
        case BT_S:
788
35.9k
        case BT_CR:
789
37.2k
        case BT_LF:
790
37.2k
          ptr += MINBPC(enc);
791
37.2k
          continue;
792
9
        default:
793
9
          *nextTokPtr = ptr;
794
9
          return XML_TOK_INVALID;
795
347k
        }
796
127k
        return PREFIX(scanAtts)(enc, ptr, end, nextTokPtr);
797
347k
      }
798
56
      return XML_TOK_PARTIAL;
799
310k
    }
800
100k
    case BT_GT:
801
100k
    gt:
802
100k
      *nextTokPtr = ptr + MINBPC(enc);
803
100k
      return XML_TOK_START_TAG_NO_ATTS;
804
48.1k
    case BT_SOL:
805
229k
    sol:
806
229k
      ptr += MINBPC(enc);
807
229k
      REQUIRE_CHAR(enc, ptr, end);
808
229k
      if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
809
13
        *nextTokPtr = ptr;
810
13
        return XML_TOK_INVALID;
811
13
      }
812
229k
      *nextTokPtr = ptr + MINBPC(enc);
813
229k
      return XML_TOK_EMPTY_ELEMENT_NO_ATTS;
814
10
    default:
815
10
      *nextTokPtr = ptr;
816
10
      return XML_TOK_INVALID;
817
7.40M
    }
818
7.40M
  }
819
166
  return XML_TOK_PARTIAL;
820
458k
}
Unexecuted instantiation: xmltok.c:little2_scanLt
Unexecuted instantiation: xmltok.c:big2_scanLt
821
822
static int PTRCALL
823
PREFIX(contentTok)(const ENCODING *enc, const char *ptr, const char *end,
824
4.33M
                   const char **nextTokPtr) {
825
4.33M
  if (ptr >= end)
826
8.42k
    return XML_TOK_NONE;
827
4.33M
  if (MINBPC(enc) > 1) {
828
0
    size_t n = end - ptr;
829
0
    if (n & (MINBPC(enc) - 1)) {
830
0
      n &= ~(MINBPC(enc) - 1);
831
0
      if (n == 0)
832
0
        return XML_TOK_PARTIAL;
833
0
      end = ptr + n;
834
0
    }
835
0
  }
836
4.33M
  switch (BYTE_TYPE(enc, ptr)) {
837
591k
  case BT_LT:
838
591k
    return PREFIX(scanLt)(enc, ptr + MINBPC(enc), end, nextTokPtr);
839
89.2k
  case BT_AMP:
840
89.2k
    return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
841
1.73M
  case BT_CR:
842
1.73M
    ptr += MINBPC(enc);
843
1.73M
    if (! HAS_CHAR(enc, ptr, end))
844
26
      return XML_TOK_TRAILING_CR;
845
1.73M
    if (BYTE_TYPE(enc, ptr) == BT_LF)
846
326k
      ptr += MINBPC(enc);
847
1.73M
    *nextTokPtr = ptr;
848
1.73M
    return XML_TOK_DATA_NEWLINE;
849
1.12M
  case BT_LF:
850
1.12M
    *nextTokPtr = ptr + MINBPC(enc);
851
1.12M
    return XML_TOK_DATA_NEWLINE;
852
31.4k
  case BT_RSQB:
853
31.4k
    ptr += MINBPC(enc);
854
31.4k
    if (! HAS_CHAR(enc, ptr, end))
855
10
      return XML_TOK_TRAILING_RSQB;
856
31.4k
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
857
10.8k
      break;
858
20.6k
    ptr += MINBPC(enc);
859
20.6k
    if (! HAS_CHAR(enc, ptr, end))
860
4
      return XML_TOK_TRAILING_RSQB;
861
20.6k
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
862
20.6k
      ptr -= MINBPC(enc);
863
20.6k
      break;
864
20.6k
    }
865
1
    *nextTokPtr = ptr;
866
1
    return XML_TOK_INVALID;
867
72.0k
    INVALID_CASES(ptr, nextTokPtr)
868
722k
  default:
869
722k
    ptr += MINBPC(enc);
870
722k
    break;
871
4.33M
  }
872
20.9M
  while (HAS_CHAR(enc, ptr, end)) {
873
20.9M
    switch (BYTE_TYPE(enc, ptr)) {
874
0
#  define LEAD_CASE(n)                                                         \
875
222k
  case BT_LEAD##n:                                                             \
876
222k
    if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) {                       \
877
25
      *nextTokPtr = ptr;                                                       \
878
25
      return XML_TOK_DATA_CHARS;                                               \
879
25
    }                                                                          \
880
222k
    ptr += n;                                                                  \
881
222k
    break;
882
141k
      LEAD_CASE(2)
883
41.9k
      LEAD_CASE(3)
884
38.4k
      LEAD_CASE(4)
885
0
#  undef LEAD_CASE
886
448k
    case BT_RSQB:
887
448k
      if (HAS_CHARS(enc, ptr, end, 2)) {
888
448k
        if (! CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_RSQB)) {
889
147k
          ptr += MINBPC(enc);
890
147k
          break;
891
147k
        }
892
301k
        if (HAS_CHARS(enc, ptr, end, 3)) {
893
301k
          if (! CHAR_MATCHES(enc, ptr + 2 * MINBPC(enc), ASCII_GT)) {
894
301k
            ptr += MINBPC(enc);
895
301k
            break;
896
301k
          }
897
2
          *nextTokPtr = ptr + 2 * MINBPC(enc);
898
2
          return XML_TOK_INVALID;
899
301k
        }
900
301k
      }
901
      /* fall through */
902
53.8k
    case BT_AMP:
903
251k
    case BT_LT:
904
251k
    case BT_NONXML:
905
251k
    case BT_MALFORM:
906
251k
    case BT_TRAIL:
907
619k
    case BT_CR:
908
782k
    case BT_LF:
909
782k
      *nextTokPtr = ptr;
910
782k
      return XML_TOK_DATA_CHARS;
911
19.4M
    default:
912
19.4M
      ptr += MINBPC(enc);
913
19.4M
      break;
914
20.9M
    }
915
20.9M
  }
916
7.00k
  *nextTokPtr = ptr;
917
7.00k
  return XML_TOK_DATA_CHARS;
918
789k
}
xmltok.c:normal_contentTok
Line
Count
Source
824
4.33M
                   const char **nextTokPtr) {
825
4.33M
  if (ptr >= end)
826
8.42k
    return XML_TOK_NONE;
827
4.33M
  if (MINBPC(enc) > 1) {
828
0
    size_t n = end - ptr;
829
0
    if (n & (MINBPC(enc) - 1)) {
830
0
      n &= ~(MINBPC(enc) - 1);
831
0
      if (n == 0)
832
0
        return XML_TOK_PARTIAL;
833
0
      end = ptr + n;
834
0
    }
835
0
  }
836
4.33M
  switch (BYTE_TYPE(enc, ptr)) {
837
591k
  case BT_LT:
838
591k
    return PREFIX(scanLt)(enc, ptr + MINBPC(enc), end, nextTokPtr);
839
89.2k
  case BT_AMP:
840
89.2k
    return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
841
1.73M
  case BT_CR:
842
1.73M
    ptr += MINBPC(enc);
843
1.73M
    if (! HAS_CHAR(enc, ptr, end))
844
26
      return XML_TOK_TRAILING_CR;
845
1.73M
    if (BYTE_TYPE(enc, ptr) == BT_LF)
846
326k
      ptr += MINBPC(enc);
847
1.73M
    *nextTokPtr = ptr;
848
1.73M
    return XML_TOK_DATA_NEWLINE;
849
1.12M
  case BT_LF:
850
1.12M
    *nextTokPtr = ptr + MINBPC(enc);
851
1.12M
    return XML_TOK_DATA_NEWLINE;
852
31.4k
  case BT_RSQB:
853
31.4k
    ptr += MINBPC(enc);
854
31.4k
    if (! HAS_CHAR(enc, ptr, end))
855
10
      return XML_TOK_TRAILING_RSQB;
856
31.4k
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
857
10.8k
      break;
858
20.6k
    ptr += MINBPC(enc);
859
20.6k
    if (! HAS_CHAR(enc, ptr, end))
860
4
      return XML_TOK_TRAILING_RSQB;
861
20.6k
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
862
20.6k
      ptr -= MINBPC(enc);
863
20.6k
      break;
864
20.6k
    }
865
1
    *nextTokPtr = ptr;
866
1
    return XML_TOK_INVALID;
867
72.0k
    INVALID_CASES(ptr, nextTokPtr)
868
722k
  default:
869
722k
    ptr += MINBPC(enc);
870
722k
    break;
871
4.33M
  }
872
20.9M
  while (HAS_CHAR(enc, ptr, end)) {
873
20.9M
    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
141k
      LEAD_CASE(2)
883
41.9k
      LEAD_CASE(3)
884
38.4k
      LEAD_CASE(4)
885
0
#  undef LEAD_CASE
886
448k
    case BT_RSQB:
887
448k
      if (HAS_CHARS(enc, ptr, end, 2)) {
888
448k
        if (! CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_RSQB)) {
889
147k
          ptr += MINBPC(enc);
890
147k
          break;
891
147k
        }
892
301k
        if (HAS_CHARS(enc, ptr, end, 3)) {
893
301k
          if (! CHAR_MATCHES(enc, ptr + 2 * MINBPC(enc), ASCII_GT)) {
894
301k
            ptr += MINBPC(enc);
895
301k
            break;
896
301k
          }
897
2
          *nextTokPtr = ptr + 2 * MINBPC(enc);
898
2
          return XML_TOK_INVALID;
899
301k
        }
900
301k
      }
901
      /* fall through */
902
53.8k
    case BT_AMP:
903
251k
    case BT_LT:
904
251k
    case BT_NONXML:
905
251k
    case BT_MALFORM:
906
251k
    case BT_TRAIL:
907
619k
    case BT_CR:
908
782k
    case BT_LF:
909
782k
      *nextTokPtr = ptr;
910
782k
      return XML_TOK_DATA_CHARS;
911
19.4M
    default:
912
19.4M
      ptr += MINBPC(enc);
913
19.4M
      break;
914
20.9M
    }
915
20.9M
  }
916
7.00k
  *nextTokPtr = ptr;
917
7.00k
  return XML_TOK_DATA_CHARS;
918
789k
}
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
27.7k
                    const char **nextTokPtr) {
925
27.7k
  REQUIRE_CHAR(enc, ptr, end);
926
27.7k
  switch (BYTE_TYPE(enc, ptr)) {
927
41.6k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
928
907
  case BT_S:
929
1.13k
  case BT_LF:
930
1.56k
  case BT_CR:
931
1.56k
  case BT_PERCNT:
932
1.56k
    *nextTokPtr = ptr;
933
1.56k
    return XML_TOK_PERCENT;
934
5
  default:
935
5
    *nextTokPtr = ptr;
936
5
    return XML_TOK_INVALID;
937
27.7k
  }
938
577k
  while (HAS_CHAR(enc, ptr, end)) {
939
577k
    switch (BYTE_TYPE(enc, ptr)) {
940
1.78M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
941
25.9k
    case BT_SEMI:
942
25.9k
      *nextTokPtr = ptr + MINBPC(enc);
943
25.9k
      return XML_TOK_PARAM_ENTITY_REF;
944
16
    default:
945
16
      *nextTokPtr = ptr;
946
16
      return XML_TOK_INVALID;
947
577k
    }
948
577k
  }
949
116
  return XML_TOK_PARTIAL;
950
26.1k
}
xmltok.c:normal_scanPercent
Line
Count
Source
924
27.7k
                    const char **nextTokPtr) {
925
27.7k
  REQUIRE_CHAR(enc, ptr, end);
926
27.7k
  switch (BYTE_TYPE(enc, ptr)) {
927
41.6k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
928
907
  case BT_S:
929
1.13k
  case BT_LF:
930
1.56k
  case BT_CR:
931
1.56k
  case BT_PERCNT:
932
1.56k
    *nextTokPtr = ptr;
933
1.56k
    return XML_TOK_PERCENT;
934
5
  default:
935
5
    *nextTokPtr = ptr;
936
5
    return XML_TOK_INVALID;
937
27.7k
  }
938
577k
  while (HAS_CHAR(enc, ptr, end)) {
939
577k
    switch (BYTE_TYPE(enc, ptr)) {
940
1.78M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
941
25.9k
    case BT_SEMI:
942
25.9k
      *nextTokPtr = ptr + MINBPC(enc);
943
25.9k
      return XML_TOK_PARAM_ENTITY_REF;
944
16
    default:
945
16
      *nextTokPtr = ptr;
946
16
      return XML_TOK_INVALID;
947
577k
    }
948
577k
  }
949
116
  return XML_TOK_PARTIAL;
950
26.1k
}
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
78.6k
                      const char **nextTokPtr) {
955
78.6k
  REQUIRE_CHAR(enc, ptr, end);
956
78.6k
  switch (BYTE_TYPE(enc, ptr)) {
957
78.2k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
958
2
  default:
959
2
    *nextTokPtr = ptr;
960
2
    return XML_TOK_INVALID;
961
78.6k
  }
962
1.34M
  while (HAS_CHAR(enc, ptr, end)) {
963
1.34M
    switch (BYTE_TYPE(enc, ptr)) {
964
4.28M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
965
70.6k
    case BT_CR:
966
75.1k
    case BT_LF:
967
75.7k
    case BT_S:
968
75.9k
    case BT_RPAR:
969
77.9k
    case BT_GT:
970
77.9k
    case BT_PERCNT:
971
78.3k
    case BT_VERBAR:
972
78.3k
      *nextTokPtr = ptr;
973
78.3k
      return XML_TOK_POUND_NAME;
974
13
    default:
975
13
      *nextTokPtr = ptr;
976
13
      return XML_TOK_INVALID;
977
1.34M
    }
978
1.34M
  }
979
215
  return -XML_TOK_POUND_NAME;
980
78.6k
}
xmltok.c:normal_scanPoundName
Line
Count
Source
954
78.6k
                      const char **nextTokPtr) {
955
78.6k
  REQUIRE_CHAR(enc, ptr, end);
956
78.6k
  switch (BYTE_TYPE(enc, ptr)) {
957
78.2k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
958
2
  default:
959
2
    *nextTokPtr = ptr;
960
2
    return XML_TOK_INVALID;
961
78.6k
  }
962
1.34M
  while (HAS_CHAR(enc, ptr, end)) {
963
1.34M
    switch (BYTE_TYPE(enc, ptr)) {
964
4.28M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
965
70.6k
    case BT_CR:
966
75.1k
    case BT_LF:
967
75.7k
    case BT_S:
968
75.9k
    case BT_RPAR:
969
77.9k
    case BT_GT:
970
77.9k
    case BT_PERCNT:
971
78.3k
    case BT_VERBAR:
972
78.3k
      *nextTokPtr = ptr;
973
78.3k
      return XML_TOK_POUND_NAME;
974
13
    default:
975
13
      *nextTokPtr = ptr;
976
13
      return XML_TOK_INVALID;
977
1.34M
    }
978
1.34M
  }
979
215
  return -XML_TOK_POUND_NAME;
980
78.6k
}
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
33.4k
                const char **nextTokPtr) {
985
8.27M
  while (HAS_CHAR(enc, ptr, end)) {
986
8.27M
    int t = BYTE_TYPE(enc, ptr);
987
8.27M
    switch (t) {
988
117k
      INVALID_CASES(ptr, nextTokPtr)
989
13.0k
    case BT_QUOT:
990
112k
    case BT_APOS:
991
112k
      ptr += MINBPC(enc);
992
112k
      if (t != open)
993
78.9k
        break;
994
33.3k
      if (! HAS_CHAR(enc, ptr, end))
995
531
        return -XML_TOK_LITERAL;
996
32.7k
      *nextTokPtr = ptr;
997
32.7k
      switch (BYTE_TYPE(enc, ptr)) {
998
4.76k
      case BT_S:
999
6.34k
      case BT_CR:
1000
13.7k
      case BT_LF:
1001
32.4k
      case BT_GT:
1002
32.4k
      case BT_PERCNT:
1003
32.7k
      case BT_LSQB:
1004
32.7k
        return XML_TOK_LITERAL;
1005
15
      default:
1006
15
        return XML_TOK_INVALID;
1007
32.7k
      }
1008
8.10M
    default:
1009
8.10M
      ptr += MINBPC(enc);
1010
8.10M
      break;
1011
8.27M
    }
1012
8.27M
  }
1013
100
  return XML_TOK_PARTIAL;
1014
33.4k
}
xmltok.c:normal_scanLit
Line
Count
Source
984
33.4k
                const char **nextTokPtr) {
985
8.27M
  while (HAS_CHAR(enc, ptr, end)) {
986
8.27M
    int t = BYTE_TYPE(enc, ptr);
987
8.27M
    switch (t) {
988
117k
      INVALID_CASES(ptr, nextTokPtr)
989
13.0k
    case BT_QUOT:
990
112k
    case BT_APOS:
991
112k
      ptr += MINBPC(enc);
992
112k
      if (t != open)
993
78.9k
        break;
994
33.3k
      if (! HAS_CHAR(enc, ptr, end))
995
531
        return -XML_TOK_LITERAL;
996
32.7k
      *nextTokPtr = ptr;
997
32.7k
      switch (BYTE_TYPE(enc, ptr)) {
998
4.76k
      case BT_S:
999
6.34k
      case BT_CR:
1000
13.7k
      case BT_LF:
1001
32.4k
      case BT_GT:
1002
32.4k
      case BT_PERCNT:
1003
32.7k
      case BT_LSQB:
1004
32.7k
        return XML_TOK_LITERAL;
1005
15
      default:
1006
15
        return XML_TOK_INVALID;
1007
32.7k
      }
1008
8.10M
    default:
1009
8.10M
      ptr += MINBPC(enc);
1010
8.10M
      break;
1011
8.27M
    }
1012
8.27M
  }
1013
100
  return XML_TOK_PARTIAL;
1014
33.4k
}
Unexecuted instantiation: xmltok.c:little2_scanLit
Unexecuted instantiation: xmltok.c:big2_scanLit
1015
1016
static int PTRCALL
1017
PREFIX(prologTok)(const ENCODING *enc, const char *ptr, const char *end,
1018
3.91M
                  const char **nextTokPtr) {
1019
3.91M
  int tok;
1020
3.91M
  if (ptr >= end)
1021
7.42k
    return XML_TOK_NONE;
1022
3.90M
  if (MINBPC(enc) > 1) {
1023
224
    size_t n = end - ptr;
1024
224
    if (n & (MINBPC(enc) - 1)) {
1025
51
      n &= ~(MINBPC(enc) - 1);
1026
51
      if (n == 0)
1027
4
        return XML_TOK_PARTIAL;
1028
47
      end = ptr + n;
1029
47
    }
1030
224
  }
1031
3.90M
  switch (BYTE_TYPE(enc, ptr)) {
1032
6.42k
  case BT_QUOT:
1033
6.42k
    return PREFIX(scanLit)(BT_QUOT, enc, ptr + MINBPC(enc), end, nextTokPtr);
1034
27.0k
  case BT_APOS:
1035
27.0k
    return PREFIX(scanLit)(BT_APOS, enc, ptr + MINBPC(enc), end, nextTokPtr);
1036
71.1k
  case BT_LT: {
1037
71.1k
    ptr += MINBPC(enc);
1038
71.1k
    REQUIRE_CHAR(enc, ptr, end);
1039
71.1k
    switch (BYTE_TYPE(enc, ptr)) {
1040
53.5k
    case BT_EXCL:
1041
53.5k
      return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1042
12.1k
    case BT_QUEST:
1043
12.1k
      return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1044
4.13k
    case BT_NMSTRT:
1045
5.30k
    case BT_HEX:
1046
5.30k
    case BT_NONASCII:
1047
5.33k
    case BT_LEAD2:
1048
5.38k
    case BT_LEAD3:
1049
5.39k
    case BT_LEAD4:
1050
5.39k
      *nextTokPtr = ptr - MINBPC(enc);
1051
5.39k
      return XML_TOK_INSTANCE_START;
1052
71.1k
    }
1053
18
    *nextTokPtr = ptr;
1054
18
    return XML_TOK_INVALID;
1055
71.1k
  }
1056
208k
  case BT_CR:
1057
208k
    if (ptr + MINBPC(enc) == end) {
1058
375
      *nextTokPtr = end;
1059
      /* indicate that this might be part of a CR/LF pair */
1060
375
      return -XML_TOK_PROLOG_S;
1061
375
    }
1062
    /* fall through */
1063
345k
  case BT_S:
1064
392k
  case BT_LF:
1065
402k
    for (;;) {
1066
402k
      ptr += MINBPC(enc);
1067
402k
      if (! HAS_CHAR(enc, ptr, end))
1068
445
        break;
1069
402k
      switch (BYTE_TYPE(enc, ptr)) {
1070
1.44k
      case BT_S:
1071
4.32k
      case BT_LF:
1072
4.32k
        break;
1073
6.29k
      case BT_CR:
1074
        /* don't split CR/LF pair */
1075
6.29k
        if (ptr + MINBPC(enc) != end)
1076
6.13k
          break;
1077
        /* fall through */
1078
391k
      default:
1079
391k
        *nextTokPtr = ptr;
1080
391k
        return XML_TOK_PROLOG_S;
1081
402k
      }
1082
402k
    }
1083
445
    *nextTokPtr = ptr;
1084
445
    return XML_TOK_PROLOG_S;
1085
27.7k
  case BT_PERCNT:
1086
27.7k
    return PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1087
9.43k
  case BT_COMMA:
1088
9.43k
    *nextTokPtr = ptr + MINBPC(enc);
1089
9.43k
    return XML_TOK_COMMA;
1090
2.49k
  case BT_LSQB:
1091
2.49k
    *nextTokPtr = ptr + MINBPC(enc);
1092
2.49k
    return XML_TOK_OPEN_BRACKET;
1093
1.11k
  case BT_RSQB:
1094
1.11k
    ptr += MINBPC(enc);
1095
1.11k
    if (! HAS_CHAR(enc, ptr, end))
1096
5
      return -XML_TOK_CLOSE_BRACKET;
1097
1.10k
    if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) {
1098
29
      REQUIRE_CHARS(enc, ptr, end, 2);
1099
27
      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
27
    }
1104
1.10k
    *nextTokPtr = ptr;
1105
1.10k
    return XML_TOK_CLOSE_BRACKET;
1106
2.82M
  case BT_LPAR:
1107
2.82M
    *nextTokPtr = ptr + MINBPC(enc);
1108
2.82M
    return XML_TOK_OPEN_PAREN;
1109
120k
  case BT_RPAR:
1110
120k
    ptr += MINBPC(enc);
1111
120k
    if (! HAS_CHAR(enc, ptr, end))
1112
89
      return -XML_TOK_CLOSE_PAREN;
1113
120k
    switch (BYTE_TYPE(enc, ptr)) {
1114
6.32k
    case BT_AST:
1115
6.32k
      *nextTokPtr = ptr + MINBPC(enc);
1116
6.32k
      return XML_TOK_CLOSE_PAREN_ASTERISK;
1117
4.24k
    case BT_QUEST:
1118
4.24k
      *nextTokPtr = ptr + MINBPC(enc);
1119
4.24k
      return XML_TOK_CLOSE_PAREN_QUESTION;
1120
10.8k
    case BT_PLUS:
1121
10.8k
      *nextTokPtr = ptr + MINBPC(enc);
1122
10.8k
      return XML_TOK_CLOSE_PAREN_PLUS;
1123
1.03k
    case BT_CR:
1124
9.65k
    case BT_LF:
1125
80.5k
    case BT_S:
1126
81.6k
    case BT_GT:
1127
87.4k
    case BT_COMMA:
1128
95.6k
    case BT_VERBAR:
1129
99.0k
    case BT_RPAR:
1130
99.0k
      *nextTokPtr = ptr;
1131
99.0k
      return XML_TOK_CLOSE_PAREN;
1132
120k
    }
1133
9
    *nextTokPtr = ptr;
1134
9
    return XML_TOK_INVALID;
1135
16.9k
  case BT_VERBAR:
1136
16.9k
    *nextTokPtr = ptr + MINBPC(enc);
1137
16.9k
    return XML_TOK_OR;
1138
48.6k
  case BT_GT:
1139
48.6k
    *nextTokPtr = ptr + MINBPC(enc);
1140
48.6k
    return XML_TOK_DECL_CLOSE;
1141
78.6k
  case BT_NUM:
1142
78.6k
    return PREFIX(scanPoundName)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1143
0
#  define LEAD_CASE(n)                                                         \
1144
59
  case BT_LEAD##n:                                                             \
1145
4.29k
    if (end - ptr < n)                                                         \
1146
59
      return XML_TOK_PARTIAL_CHAR;                                             \
1147
4.23k
    if (IS_INVALID_CHAR(enc, ptr, n)) {                                        \
1148
84
      *nextTokPtr = ptr;                                                       \
1149
84
      return XML_TOK_INVALID;                                                  \
1150
84
    }                                                                          \
1151
4.23k
    if (IS_NMSTRT_CHAR(enc, ptr, n)) {                                         \
1152
3.63k
      ptr += n;                                                                \
1153
3.63k
      tok = XML_TOK_NAME;                                                      \
1154
3.63k
      break;                                                                   \
1155
3.63k
    }                                                                          \
1156
4.15k
    if (IS_NAME_CHAR(enc, ptr, n)) {                                           \
1157
462
      ptr += n;                                                                \
1158
462
      tok = XML_TOK_NMTOKEN;                                                   \
1159
462
      break;                                                                   \
1160
462
    }                                                                          \
1161
521
    *nextTokPtr = ptr;                                                         \
1162
59
    return XML_TOK_INVALID;
1163
2.66k
    LEAD_CASE(2)
1164
10.3k
    LEAD_CASE(3)
1165
230
    LEAD_CASE(4)
1166
0
#  undef LEAD_CASE
1167
157k
  case BT_NMSTRT:
1168
268k
  case BT_HEX:
1169
268k
    tok = XML_TOK_NAME;
1170
268k
    ptr += MINBPC(enc);
1171
268k
    break;
1172
493
  case BT_DIGIT:
1173
842
  case BT_NAME:
1174
1.48k
  case BT_MINUS:
1175
#  ifdef XML_NS
1176
  case BT_COLON:
1177
#  endif
1178
1.48k
    tok = XML_TOK_NMTOKEN;
1179
1.48k
    ptr += MINBPC(enc);
1180
1.48k
    break;
1181
170
  case BT_NONASCII:
1182
170
    if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {
1183
135
      ptr += MINBPC(enc);
1184
135
      tok = XML_TOK_NAME;
1185
135
      break;
1186
135
    }
1187
35
    if (IS_NAME_CHAR_MINBPC(enc, ptr)) {
1188
8
      ptr += MINBPC(enc);
1189
8
      tok = XML_TOK_NMTOKEN;
1190
8
      break;
1191
8
    }
1192
    /* fall through */
1193
89
  default:
1194
89
    *nextTokPtr = ptr;
1195
89
    return XML_TOK_INVALID;
1196
3.90M
  }
1197
12.3M
  while (HAS_CHAR(enc, ptr, end)) {
1198
12.3M
    switch (BYTE_TYPE(enc, ptr)) {
1199
34.7M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1200
22.5k
    case BT_GT:
1201
112k
    case BT_RPAR:
1202
112k
    case BT_COMMA:
1203
116k
    case BT_VERBAR:
1204
118k
    case BT_LSQB:
1205
118k
    case BT_PERCNT:
1206
152k
    case BT_S:
1207
252k
    case BT_CR:
1208
268k
    case BT_LF:
1209
268k
      *nextTokPtr = ptr;
1210
268k
      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
3.60k
    case BT_PLUS:
1232
3.60k
      if (tok == XML_TOK_NMTOKEN) {
1233
1
        *nextTokPtr = ptr;
1234
1
        return XML_TOK_INVALID;
1235
1
      }
1236
3.60k
      *nextTokPtr = ptr + MINBPC(enc);
1237
3.60k
      return XML_TOK_NAME_PLUS;
1238
627
    case BT_AST:
1239
627
      if (tok == XML_TOK_NMTOKEN) {
1240
1
        *nextTokPtr = ptr;
1241
1
        return XML_TOK_INVALID;
1242
1
      }
1243
626
      *nextTokPtr = ptr + MINBPC(enc);
1244
626
      return XML_TOK_NAME_ASTERISK;
1245
388
    case BT_QUEST:
1246
388
      if (tok == XML_TOK_NMTOKEN) {
1247
3
        *nextTokPtr = ptr;
1248
3
        return XML_TOK_INVALID;
1249
3
      }
1250
385
      *nextTokPtr = ptr + MINBPC(enc);
1251
385
      return XML_TOK_NAME_QUESTION;
1252
63
    default:
1253
63
      *nextTokPtr = ptr;
1254
63
      return XML_TOK_INVALID;
1255
12.3M
    }
1256
12.3M
  }
1257
721
  return -tok;
1258
274k
}
xmltok.c:normal_prologTok
Line
Count
Source
1018
3.90M
                  const char **nextTokPtr) {
1019
3.90M
  int tok;
1020
3.90M
  if (ptr >= end)
1021
7.42k
    return XML_TOK_NONE;
1022
3.90M
  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.90M
  switch (BYTE_TYPE(enc, ptr)) {
1032
6.42k
  case BT_QUOT:
1033
6.42k
    return PREFIX(scanLit)(BT_QUOT, enc, ptr + MINBPC(enc), end, nextTokPtr);
1034
27.0k
  case BT_APOS:
1035
27.0k
    return PREFIX(scanLit)(BT_APOS, enc, ptr + MINBPC(enc), end, nextTokPtr);
1036
71.1k
  case BT_LT: {
1037
71.1k
    ptr += MINBPC(enc);
1038
71.1k
    REQUIRE_CHAR(enc, ptr, end);
1039
71.1k
    switch (BYTE_TYPE(enc, ptr)) {
1040
53.5k
    case BT_EXCL:
1041
53.5k
      return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1042
12.1k
    case BT_QUEST:
1043
12.1k
      return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1044
4.13k
    case BT_NMSTRT:
1045
5.30k
    case BT_HEX:
1046
5.30k
    case BT_NONASCII:
1047
5.33k
    case BT_LEAD2:
1048
5.38k
    case BT_LEAD3:
1049
5.39k
    case BT_LEAD4:
1050
5.39k
      *nextTokPtr = ptr - MINBPC(enc);
1051
5.39k
      return XML_TOK_INSTANCE_START;
1052
71.1k
    }
1053
18
    *nextTokPtr = ptr;
1054
18
    return XML_TOK_INVALID;
1055
71.1k
  }
1056
208k
  case BT_CR:
1057
208k
    if (ptr + MINBPC(enc) == end) {
1058
375
      *nextTokPtr = end;
1059
      /* indicate that this might be part of a CR/LF pair */
1060
375
      return -XML_TOK_PROLOG_S;
1061
375
    }
1062
    /* fall through */
1063
345k
  case BT_S:
1064
392k
  case BT_LF:
1065
402k
    for (;;) {
1066
402k
      ptr += MINBPC(enc);
1067
402k
      if (! HAS_CHAR(enc, ptr, end))
1068
445
        break;
1069
402k
      switch (BYTE_TYPE(enc, ptr)) {
1070
1.44k
      case BT_S:
1071
4.32k
      case BT_LF:
1072
4.32k
        break;
1073
6.29k
      case BT_CR:
1074
        /* don't split CR/LF pair */
1075
6.29k
        if (ptr + MINBPC(enc) != end)
1076
6.13k
          break;
1077
        /* fall through */
1078
391k
      default:
1079
391k
        *nextTokPtr = ptr;
1080
391k
        return XML_TOK_PROLOG_S;
1081
402k
      }
1082
402k
    }
1083
445
    *nextTokPtr = ptr;
1084
445
    return XML_TOK_PROLOG_S;
1085
27.7k
  case BT_PERCNT:
1086
27.7k
    return PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1087
9.43k
  case BT_COMMA:
1088
9.43k
    *nextTokPtr = ptr + MINBPC(enc);
1089
9.43k
    return XML_TOK_COMMA;
1090
2.49k
  case BT_LSQB:
1091
2.49k
    *nextTokPtr = ptr + MINBPC(enc);
1092
2.49k
    return XML_TOK_OPEN_BRACKET;
1093
1.11k
  case BT_RSQB:
1094
1.11k
    ptr += MINBPC(enc);
1095
1.11k
    if (! HAS_CHAR(enc, ptr, end))
1096
5
      return -XML_TOK_CLOSE_BRACKET;
1097
1.10k
    if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) {
1098
29
      REQUIRE_CHARS(enc, ptr, end, 2);
1099
27
      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
27
    }
1104
1.10k
    *nextTokPtr = ptr;
1105
1.10k
    return XML_TOK_CLOSE_BRACKET;
1106
2.82M
  case BT_LPAR:
1107
2.82M
    *nextTokPtr = ptr + MINBPC(enc);
1108
2.82M
    return XML_TOK_OPEN_PAREN;
1109
120k
  case BT_RPAR:
1110
120k
    ptr += MINBPC(enc);
1111
120k
    if (! HAS_CHAR(enc, ptr, end))
1112
89
      return -XML_TOK_CLOSE_PAREN;
1113
120k
    switch (BYTE_TYPE(enc, ptr)) {
1114
6.32k
    case BT_AST:
1115
6.32k
      *nextTokPtr = ptr + MINBPC(enc);
1116
6.32k
      return XML_TOK_CLOSE_PAREN_ASTERISK;
1117
4.24k
    case BT_QUEST:
1118
4.24k
      *nextTokPtr = ptr + MINBPC(enc);
1119
4.24k
      return XML_TOK_CLOSE_PAREN_QUESTION;
1120
10.8k
    case BT_PLUS:
1121
10.8k
      *nextTokPtr = ptr + MINBPC(enc);
1122
10.8k
      return XML_TOK_CLOSE_PAREN_PLUS;
1123
1.03k
    case BT_CR:
1124
9.65k
    case BT_LF:
1125
80.5k
    case BT_S:
1126
81.6k
    case BT_GT:
1127
87.4k
    case BT_COMMA:
1128
95.6k
    case BT_VERBAR:
1129
99.0k
    case BT_RPAR:
1130
99.0k
      *nextTokPtr = ptr;
1131
99.0k
      return XML_TOK_CLOSE_PAREN;
1132
120k
    }
1133
9
    *nextTokPtr = ptr;
1134
9
    return XML_TOK_INVALID;
1135
16.9k
  case BT_VERBAR:
1136
16.9k
    *nextTokPtr = ptr + MINBPC(enc);
1137
16.9k
    return XML_TOK_OR;
1138
48.6k
  case BT_GT:
1139
48.6k
    *nextTokPtr = ptr + MINBPC(enc);
1140
48.6k
    return XML_TOK_DECL_CLOSE;
1141
78.6k
  case BT_NUM:
1142
78.6k
    return PREFIX(scanPoundName)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1143
0
#  define LEAD_CASE(n)                                                         \
1144
0
  case BT_LEAD##n:                                                             \
1145
0
    if (end - ptr < n)                                                         \
1146
0
      return XML_TOK_PARTIAL_CHAR;                                             \
1147
0
    if (IS_INVALID_CHAR(enc, ptr, n)) {                                        \
1148
0
      *nextTokPtr = ptr;                                                       \
1149
0
      return XML_TOK_INVALID;                                                  \
1150
0
    }                                                                          \
1151
0
    if (IS_NMSTRT_CHAR(enc, ptr, n)) {                                         \
1152
0
      ptr += n;                                                                \
1153
0
      tok = XML_TOK_NAME;                                                      \
1154
0
      break;                                                                   \
1155
0
    }                                                                          \
1156
0
    if (IS_NAME_CHAR(enc, ptr, n)) {                                           \
1157
0
      ptr += n;                                                                \
1158
0
      tok = XML_TOK_NMTOKEN;                                                   \
1159
0
      break;                                                                   \
1160
0
    }                                                                          \
1161
0
    *nextTokPtr = ptr;                                                         \
1162
0
    return XML_TOK_INVALID;
1163
2.66k
    LEAD_CASE(2)
1164
10.3k
    LEAD_CASE(3)
1165
132
    LEAD_CASE(4)
1166
0
#  undef LEAD_CASE
1167
157k
  case BT_NMSTRT:
1168
268k
  case BT_HEX:
1169
268k
    tok = XML_TOK_NAME;
1170
268k
    ptr += MINBPC(enc);
1171
268k
    break;
1172
493
  case BT_DIGIT:
1173
842
  case BT_NAME:
1174
1.48k
  case BT_MINUS:
1175
#  ifdef XML_NS
1176
  case BT_COLON:
1177
#  endif
1178
1.48k
    tok = XML_TOK_NMTOKEN;
1179
1.48k
    ptr += MINBPC(enc);
1180
1.48k
    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
50
  default:
1194
50
    *nextTokPtr = ptr;
1195
50
    return XML_TOK_INVALID;
1196
3.90M
  }
1197
12.3M
  while (HAS_CHAR(enc, ptr, end)) {
1198
12.3M
    switch (BYTE_TYPE(enc, ptr)) {
1199
34.7M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1200
22.5k
    case BT_GT:
1201
112k
    case BT_RPAR:
1202
112k
    case BT_COMMA:
1203
116k
    case BT_VERBAR:
1204
118k
    case BT_LSQB:
1205
118k
    case BT_PERCNT:
1206
152k
    case BT_S:
1207
252k
    case BT_CR:
1208
268k
    case BT_LF:
1209
268k
      *nextTokPtr = ptr;
1210
268k
      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
3.60k
    case BT_PLUS:
1232
3.60k
      if (tok == XML_TOK_NMTOKEN) {
1233
1
        *nextTokPtr = ptr;
1234
1
        return XML_TOK_INVALID;
1235
1
      }
1236
3.60k
      *nextTokPtr = ptr + MINBPC(enc);
1237
3.60k
      return XML_TOK_NAME_PLUS;
1238
627
    case BT_AST:
1239
627
      if (tok == XML_TOK_NMTOKEN) {
1240
1
        *nextTokPtr = ptr;
1241
1
        return XML_TOK_INVALID;
1242
1
      }
1243
626
      *nextTokPtr = ptr + MINBPC(enc);
1244
626
      return XML_TOK_NAME_ASTERISK;
1245
388
    case BT_QUEST:
1246
388
      if (tok == XML_TOK_NMTOKEN) {
1247
3
        *nextTokPtr = ptr;
1248
3
        return XML_TOK_INVALID;
1249
3
      }
1250
385
      *nextTokPtr = ptr + MINBPC(enc);
1251
385
      return XML_TOK_NAME_QUESTION;
1252
44
    default:
1253
44
      *nextTokPtr = ptr;
1254
44
      return XML_TOK_INVALID;
1255
12.3M
    }
1256
12.3M
  }
1257
671
  return -tok;
1258
274k
}
xmltok.c:little2_prologTok
Line
Count
Source
1018
119
                  const char **nextTokPtr) {
1019
119
  int tok;
1020
119
  if (ptr >= end)
1021
2
    return XML_TOK_NONE;
1022
117
  if (MINBPC(enc) > 1) {
1023
117
    size_t n = end - ptr;
1024
117
    if (n & (MINBPC(enc) - 1)) {
1025
29
      n &= ~(MINBPC(enc) - 1);
1026
29
      if (n == 0)
1027
2
        return XML_TOK_PARTIAL;
1028
27
      end = ptr + n;
1029
27
    }
1030
117
  }
1031
115
  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
38
    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
92
  case BT_NONASCII:
1182
92
    if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {
1183
74
      ptr += MINBPC(enc);
1184
74
      tok = XML_TOK_NAME;
1185
74
      break;
1186
74
    }
1187
18
    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
21
  default:
1194
21
    *nextTokPtr = ptr;
1195
21
    return XML_TOK_INVALID;
1196
115
  }
1197
10.7k
  while (HAS_CHAR(enc, ptr, end)) {
1198
10.7k
    switch (BYTE_TYPE(enc, ptr)) {
1199
53.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
10.7k
    }
1256
10.7k
  }
1257
26
  return -tok;
1258
77
}
xmltok.c:big2_prologTok
Line
Count
Source
1018
109
                  const char **nextTokPtr) {
1019
109
  int tok;
1020
109
  if (ptr >= end)
1021
2
    return XML_TOK_NONE;
1022
107
  if (MINBPC(enc) > 1) {
1023
107
    size_t n = end - ptr;
1024
107
    if (n & (MINBPC(enc) - 1)) {
1025
22
      n &= ~(MINBPC(enc) - 1);
1026
22
      if (n == 0)
1027
2
        return XML_TOK_PARTIAL;
1028
20
      end = ptr + n;
1029
20
    }
1030
107
  }
1031
105
  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
60
    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
78
  case BT_NONASCII:
1182
78
    if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {
1183
61
      ptr += MINBPC(enc);
1184
61
      tok = XML_TOK_NAME;
1185
61
      break;
1186
61
    }
1187
17
    if (IS_NAME_CHAR_MINBPC(enc, ptr)) {
1188
5
      ptr += MINBPC(enc);
1189
5
      tok = XML_TOK_NMTOKEN;
1190
5
      break;
1191
5
    }
1192
    /* fall through */
1193
18
  default:
1194
18
    *nextTokPtr = ptr;
1195
18
    return XML_TOK_INVALID;
1196
105
  }
1197
807
  while (HAS_CHAR(enc, ptr, end)) {
1198
807
    switch (BYTE_TYPE(enc, ptr)) {
1199
3.86k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1200
0
    case BT_GT:
1201
0
    case BT_RPAR:
1202
0
    case BT_COMMA:
1203
0
    case BT_VERBAR:
1204
0
    case BT_LSQB:
1205
0
    case BT_PERCNT:
1206
0
    case BT_S:
1207
0
    case BT_CR:
1208
0
    case BT_LF:
1209
0
      *nextTokPtr = ptr;
1210
0
      return tok;
1211
#  ifdef XML_NS
1212
    case BT_COLON:
1213
      ptr += MINBPC(enc);
1214
      switch (tok) {
1215
      case XML_TOK_NAME:
1216
        REQUIRE_CHAR(enc, ptr, end);
1217
        tok = XML_TOK_PREFIXED_NAME;
1218
        switch (BYTE_TYPE(enc, ptr)) {
1219
          CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1220
        default:
1221
          tok = XML_TOK_NMTOKEN;
1222
          break;
1223
        }
1224
        break;
1225
      case XML_TOK_PREFIXED_NAME:
1226
        tok = XML_TOK_NMTOKEN;
1227
        break;
1228
      }
1229
      break;
1230
#  endif
1231
0
    case BT_PLUS:
1232
0
      if (tok == XML_TOK_NMTOKEN) {
1233
0
        *nextTokPtr = ptr;
1234
0
        return XML_TOK_INVALID;
1235
0
      }
1236
0
      *nextTokPtr = ptr + MINBPC(enc);
1237
0
      return XML_TOK_NAME_PLUS;
1238
0
    case BT_AST:
1239
0
      if (tok == XML_TOK_NMTOKEN) {
1240
0
        *nextTokPtr = ptr;
1241
0
        return XML_TOK_INVALID;
1242
0
      }
1243
0
      *nextTokPtr = ptr + MINBPC(enc);
1244
0
      return XML_TOK_NAME_ASTERISK;
1245
0
    case BT_QUEST:
1246
0
      if (tok == XML_TOK_NMTOKEN) {
1247
0
        *nextTokPtr = ptr;
1248
0
        return XML_TOK_INVALID;
1249
0
      }
1250
0
      *nextTokPtr = ptr + MINBPC(enc);
1251
0
      return XML_TOK_NAME_QUESTION;
1252
11
    default:
1253
11
      *nextTokPtr = ptr;
1254
11
      return XML_TOK_INVALID;
1255
807
    }
1256
807
  }
1257
24
  return -tok;
1258
66
}
1259
1260
static int PTRCALL
1261
PREFIX(attributeValueTok)(const ENCODING *enc, const char *ptr, const char *end,
1262
2.83M
                          const char **nextTokPtr) {
1263
2.83M
  const char *start;
1264
2.83M
  if (ptr >= end)
1265
145k
    return XML_TOK_NONE;
1266
2.68M
  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.68M
  start = ptr;
1275
20.2M
  while (HAS_CHAR(enc, ptr, end)) {
1276
20.2M
    switch (BYTE_TYPE(enc, ptr)) {
1277
0
#  define LEAD_CASE(n)                                                         \
1278
233k
  case BT_LEAD##n:                                                             \
1279
233k
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1280
233k
    break;
1281
50.2k
      LEAD_CASE(2)
1282
91.2k
      LEAD_CASE(3)
1283
92.0k
      LEAD_CASE(4)
1284
0
#  undef LEAD_CASE
1285
488k
    case BT_AMP:
1286
488k
      if (ptr == start)
1287
320k
        return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1288
168k
      *nextTokPtr = ptr;
1289
168k
      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
718k
    case BT_LF:
1295
718k
      if (ptr == start) {
1296
554k
        *nextTokPtr = ptr + MINBPC(enc);
1297
554k
        return XML_TOK_DATA_NEWLINE;
1298
554k
      }
1299
163k
      *nextTokPtr = ptr;
1300
163k
      return XML_TOK_DATA_CHARS;
1301
956k
    case BT_CR:
1302
956k
      if (ptr == start) {
1303
648k
        ptr += MINBPC(enc);
1304
648k
        if (! HAS_CHAR(enc, ptr, end))
1305
3.04k
          return XML_TOK_TRAILING_CR;
1306
645k
        if (BYTE_TYPE(enc, ptr) == BT_LF)
1307
185k
          ptr += MINBPC(enc);
1308
645k
        *nextTokPtr = ptr;
1309
645k
        return XML_TOK_DATA_NEWLINE;
1310
648k
      }
1311
308k
      *nextTokPtr = ptr;
1312
308k
      return XML_TOK_DATA_CHARS;
1313
393k
    case BT_S:
1314
393k
      if (ptr == start) {
1315
282k
        *nextTokPtr = ptr + MINBPC(enc);
1316
282k
        return XML_TOK_ATTRIBUTE_VALUE_S;
1317
282k
      }
1318
111k
      *nextTokPtr = ptr;
1319
111k
      return XML_TOK_DATA_CHARS;
1320
17.4M
    default:
1321
17.4M
      ptr += MINBPC(enc);
1322
17.4M
      break;
1323
20.2M
    }
1324
20.2M
  }
1325
131k
  *nextTokPtr = ptr;
1326
131k
  return XML_TOK_DATA_CHARS;
1327
2.68M
}
xmltok.c:normal_attributeValueTok
Line
Count
Source
1262
2.83M
                          const char **nextTokPtr) {
1263
2.83M
  const char *start;
1264
2.83M
  if (ptr >= end)
1265
145k
    return XML_TOK_NONE;
1266
2.68M
  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.68M
  start = ptr;
1275
20.2M
  while (HAS_CHAR(enc, ptr, end)) {
1276
20.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
50.2k
      LEAD_CASE(2)
1282
91.2k
      LEAD_CASE(3)
1283
92.0k
      LEAD_CASE(4)
1284
0
#  undef LEAD_CASE
1285
488k
    case BT_AMP:
1286
488k
      if (ptr == start)
1287
320k
        return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1288
168k
      *nextTokPtr = ptr;
1289
168k
      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
718k
    case BT_LF:
1295
718k
      if (ptr == start) {
1296
554k
        *nextTokPtr = ptr + MINBPC(enc);
1297
554k
        return XML_TOK_DATA_NEWLINE;
1298
554k
      }
1299
163k
      *nextTokPtr = ptr;
1300
163k
      return XML_TOK_DATA_CHARS;
1301
956k
    case BT_CR:
1302
956k
      if (ptr == start) {
1303
648k
        ptr += MINBPC(enc);
1304
648k
        if (! HAS_CHAR(enc, ptr, end))
1305
3.04k
          return XML_TOK_TRAILING_CR;
1306
645k
        if (BYTE_TYPE(enc, ptr) == BT_LF)
1307
185k
          ptr += MINBPC(enc);
1308
645k
        *nextTokPtr = ptr;
1309
645k
        return XML_TOK_DATA_NEWLINE;
1310
648k
      }
1311
308k
      *nextTokPtr = ptr;
1312
308k
      return XML_TOK_DATA_CHARS;
1313
393k
    case BT_S:
1314
393k
      if (ptr == start) {
1315
282k
        *nextTokPtr = ptr + MINBPC(enc);
1316
282k
        return XML_TOK_ATTRIBUTE_VALUE_S;
1317
282k
      }
1318
111k
      *nextTokPtr = ptr;
1319
111k
      return XML_TOK_DATA_CHARS;
1320
17.4M
    default:
1321
17.4M
      ptr += MINBPC(enc);
1322
17.4M
      break;
1323
20.2M
    }
1324
20.2M
  }
1325
131k
  *nextTokPtr = ptr;
1326
131k
  return XML_TOK_DATA_CHARS;
1327
2.68M
}
Unexecuted instantiation: xmltok.c:little2_attributeValueTok
Unexecuted instantiation: xmltok.c:big2_attributeValueTok
1328
1329
static int PTRCALL
1330
PREFIX(entityValueTok)(const ENCODING *enc, const char *ptr, const char *end,
1331
0
                       const char **nextTokPtr) {
1332
0
  const char *start;
1333
0
  if (ptr >= end)
1334
0
    return XML_TOK_NONE;
1335
0
  else if (! HAS_CHAR(enc, ptr, end)) {
1336
    /* This line cannot be executed.  The incoming data has already
1337
     * been tokenized once, so incomplete characters like this have
1338
     * already been eliminated from the input.  Retaining the paranoia
1339
     * check is still valuable, however.
1340
     */
1341
0
    return XML_TOK_PARTIAL; /* LCOV_EXCL_LINE */
1342
0
  }
1343
0
  start = ptr;
1344
0
  while (HAS_CHAR(enc, ptr, end)) {
1345
0
    switch (BYTE_TYPE(enc, ptr)) {
1346
0
#  define LEAD_CASE(n)                                                         \
1347
0
  case BT_LEAD##n:                                                             \
1348
0
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1349
0
    break;
1350
0
      LEAD_CASE(2)
1351
0
      LEAD_CASE(3)
1352
0
      LEAD_CASE(4)
1353
0
#  undef LEAD_CASE
1354
0
    case BT_AMP:
1355
0
      if (ptr == start)
1356
0
        return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1357
0
      *nextTokPtr = ptr;
1358
0
      return XML_TOK_DATA_CHARS;
1359
0
    case BT_PERCNT:
1360
0
      if (ptr == start) {
1361
0
        int tok = PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1362
0
        return (tok == XML_TOK_PERCENT) ? XML_TOK_INVALID : tok;
1363
0
      }
1364
0
      *nextTokPtr = ptr;
1365
0
      return XML_TOK_DATA_CHARS;
1366
0
    case BT_LF:
1367
0
      if (ptr == start) {
1368
0
        *nextTokPtr = ptr + MINBPC(enc);
1369
0
        return XML_TOK_DATA_NEWLINE;
1370
0
      }
1371
0
      *nextTokPtr = ptr;
1372
0
      return XML_TOK_DATA_CHARS;
1373
0
    case BT_CR:
1374
0
      if (ptr == start) {
1375
0
        ptr += MINBPC(enc);
1376
0
        if (! HAS_CHAR(enc, ptr, end))
1377
0
          return XML_TOK_TRAILING_CR;
1378
0
        if (BYTE_TYPE(enc, ptr) == BT_LF)
1379
0
          ptr += MINBPC(enc);
1380
0
        *nextTokPtr = ptr;
1381
0
        return XML_TOK_DATA_NEWLINE;
1382
0
      }
1383
0
      *nextTokPtr = ptr;
1384
0
      return XML_TOK_DATA_CHARS;
1385
0
    default:
1386
0
      ptr += MINBPC(enc);
1387
0
      break;
1388
0
    }
1389
0
  }
1390
0
  *nextTokPtr = ptr;
1391
0
  return XML_TOK_DATA_CHARS;
1392
0
}
Unexecuted instantiation: xmltok.c:normal_entityValueTok
Unexecuted instantiation: xmltok.c:little2_entityValueTok
Unexecuted instantiation: xmltok.c:big2_entityValueTok
1393
1394
#  ifdef XML_DTD
1395
1396
static int PTRCALL
1397
PREFIX(ignoreSectionTok)(const ENCODING *enc, const char *ptr, const char *end,
1398
                         const char **nextTokPtr) {
1399
  int level = 0;
1400
  if (MINBPC(enc) > 1) {
1401
    size_t n = end - ptr;
1402
    if (n & (MINBPC(enc) - 1)) {
1403
      n &= ~(MINBPC(enc) - 1);
1404
      end = ptr + n;
1405
    }
1406
  }
1407
  while (HAS_CHAR(enc, ptr, end)) {
1408
    switch (BYTE_TYPE(enc, ptr)) {
1409
      INVALID_CASES(ptr, nextTokPtr)
1410
    case BT_LT:
1411
      ptr += MINBPC(enc);
1412
      REQUIRE_CHAR(enc, ptr, end);
1413
      if (CHAR_MATCHES(enc, ptr, ASCII_EXCL)) {
1414
        ptr += MINBPC(enc);
1415
        REQUIRE_CHAR(enc, ptr, end);
1416
        if (CHAR_MATCHES(enc, ptr, ASCII_LSQB)) {
1417
          ++level;
1418
          ptr += MINBPC(enc);
1419
        }
1420
      }
1421
      break;
1422
    case BT_RSQB:
1423
      ptr += MINBPC(enc);
1424
      REQUIRE_CHAR(enc, ptr, end);
1425
      if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) {
1426
        ptr += MINBPC(enc);
1427
        REQUIRE_CHAR(enc, ptr, end);
1428
        if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
1429
          ptr += MINBPC(enc);
1430
          if (level == 0) {
1431
            *nextTokPtr = ptr;
1432
            return XML_TOK_IGNORE_SECT;
1433
          }
1434
          --level;
1435
        }
1436
      }
1437
      break;
1438
    default:
1439
      ptr += MINBPC(enc);
1440
      break;
1441
    }
1442
  }
1443
  return XML_TOK_PARTIAL;
1444
}
1445
1446
#  endif /* XML_DTD */
1447
1448
static int PTRCALL
1449
PREFIX(isPublicId)(const ENCODING *enc, const char *ptr, const char *end,
1450
2.92k
                   const char **badPtr) {
1451
2.92k
  ptr += MINBPC(enc);
1452
2.92k
  end -= MINBPC(enc);
1453
1.71M
  for (; HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
1454
1.71M
    switch (BYTE_TYPE(enc, ptr)) {
1455
680k
    case BT_DIGIT:
1456
1.05M
    case BT_HEX:
1457
1.05M
    case BT_MINUS:
1458
1.12M
    case BT_APOS:
1459
1.13M
    case BT_LPAR:
1460
1.24M
    case BT_RPAR:
1461
1.25M
    case BT_PLUS:
1462
1.25M
    case BT_COMMA:
1463
1.42M
    case BT_SOL:
1464
1.42M
    case BT_EQUALS:
1465
1.43M
    case BT_QUEST:
1466
1.43M
    case BT_CR:
1467
1.44M
    case BT_LF:
1468
1.44M
    case BT_SEMI:
1469
1.44M
    case BT_EXCL:
1470
1.44M
    case BT_AST:
1471
1.45M
    case BT_PERCNT:
1472
1.47M
    case BT_NUM:
1473
#  ifdef XML_NS
1474
    case BT_COLON:
1475
#  endif
1476
1.47M
      break;
1477
6.58k
    case BT_S:
1478
6.58k
      if (CHAR_MATCHES(enc, ptr, ASCII_TAB)) {
1479
3
        *badPtr = ptr;
1480
3
        return 0;
1481
3
      }
1482
6.58k
      break;
1483
9.53k
    case BT_NAME:
1484
226k
    case BT_NMSTRT:
1485
226k
      if (! (BYTE_TO_ASCII(enc, ptr) & ~0x7f))
1486
226k
        break;
1487
      /* fall through */
1488
9.04k
    default:
1489
9.04k
      switch (BYTE_TO_ASCII(enc, ptr)) {
1490
6.83k
      case 0x24: /* $ */
1491
9.03k
      case 0x40: /* @ */
1492
9.03k
        break;
1493
10
      default:
1494
10
        *badPtr = ptr;
1495
10
        return 0;
1496
9.04k
      }
1497
9.03k
      break;
1498
1.71M
    }
1499
1.71M
  }
1500
2.91k
  return 1;
1501
2.92k
}
xmltok.c:normal_isPublicId
Line
Count
Source
1450
2.92k
                   const char **badPtr) {
1451
2.92k
  ptr += MINBPC(enc);
1452
2.92k
  end -= MINBPC(enc);
1453
1.71M
  for (; HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
1454
1.71M
    switch (BYTE_TYPE(enc, ptr)) {
1455
680k
    case BT_DIGIT:
1456
1.05M
    case BT_HEX:
1457
1.05M
    case BT_MINUS:
1458
1.12M
    case BT_APOS:
1459
1.13M
    case BT_LPAR:
1460
1.24M
    case BT_RPAR:
1461
1.25M
    case BT_PLUS:
1462
1.25M
    case BT_COMMA:
1463
1.42M
    case BT_SOL:
1464
1.42M
    case BT_EQUALS:
1465
1.43M
    case BT_QUEST:
1466
1.43M
    case BT_CR:
1467
1.44M
    case BT_LF:
1468
1.44M
    case BT_SEMI:
1469
1.44M
    case BT_EXCL:
1470
1.44M
    case BT_AST:
1471
1.45M
    case BT_PERCNT:
1472
1.47M
    case BT_NUM:
1473
#  ifdef XML_NS
1474
    case BT_COLON:
1475
#  endif
1476
1.47M
      break;
1477
6.58k
    case BT_S:
1478
6.58k
      if (CHAR_MATCHES(enc, ptr, ASCII_TAB)) {
1479
3
        *badPtr = ptr;
1480
3
        return 0;
1481
3
      }
1482
6.58k
      break;
1483
9.53k
    case BT_NAME:
1484
226k
    case BT_NMSTRT:
1485
226k
      if (! (BYTE_TO_ASCII(enc, ptr) & ~0x7f))
1486
226k
        break;
1487
      /* fall through */
1488
9.04k
    default:
1489
9.04k
      switch (BYTE_TO_ASCII(enc, ptr)) {
1490
6.83k
      case 0x24: /* $ */
1491
9.03k
      case 0x40: /* @ */
1492
9.03k
        break;
1493
10
      default:
1494
10
        *badPtr = ptr;
1495
10
        return 0;
1496
9.04k
      }
1497
9.03k
      break;
1498
1.71M
    }
1499
1.71M
  }
1500
2.91k
  return 1;
1501
2.92k
}
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
457k
                ATTRIBUTE *atts) {
1511
457k
  enum { other, inName, inValue } state = inName;
1512
457k
  int nAtts = 0;
1513
457k
  int open = 0; /* defined when state == inValue;
1514
                   initialization just to shut up compilers */
1515
1516
60.5M
  for (ptr += MINBPC(enc);; ptr += MINBPC(enc)) {
1517
60.5M
    switch (BYTE_TYPE(enc, ptr)) {
1518
0
#  define START_NAME                                                           \
1519
29.4M
    if (state == other) {                                                      \
1520
5.86M
      if (nAtts < attsMax) {                                                   \
1521
3.01M
        atts[nAtts].name = ptr;                                                \
1522
3.01M
        atts[nAtts].normalized = 1;                                            \
1523
3.01M
      }                                                                        \
1524
5.86M
      state = inName;                                                          \
1525
5.86M
    }
1526
0
#  define LEAD_CASE(n)                                                         \
1527
357k
  case BT_LEAD##n: /* NOTE: The encoding has already been validated. */        \
1528
357k
    START_NAME ptr += (n - MINBPC(enc));                                       \
1529
357k
    break;
1530
124k
      LEAD_CASE(2)
1531
163k
      LEAD_CASE(3)
1532
69.9k
      LEAD_CASE(4)
1533
0
#  undef LEAD_CASE
1534
0
    case BT_NONASCII:
1535
26.9M
    case BT_NMSTRT:
1536
29.1M
    case BT_HEX:
1537
29.1M
      START_NAME
1538
29.1M
      break;
1539
0
#  undef START_NAME
1540
907k
    case BT_QUOT:
1541
907k
      if (state != inValue) {
1542
372k
        if (nAtts < attsMax)
1543
258k
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1544
372k
        state = inValue;
1545
372k
        open = BT_QUOT;
1546
534k
      } else if (open == BT_QUOT) {
1547
372k
        state = other;
1548
372k
        if (nAtts < attsMax)
1549
258k
          atts[nAtts].valueEnd = ptr;
1550
372k
        nAtts++;
1551
372k
      }
1552
907k
      break;
1553
11.1M
    case BT_APOS:
1554
11.1M
      if (state != inValue) {
1555
5.49M
        if (nAtts < attsMax)
1556
2.75M
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1557
5.49M
        state = inValue;
1558
5.49M
        open = BT_APOS;
1559
5.63M
      } else if (open == BT_APOS) {
1560
5.49M
        state = other;
1561
5.49M
        if (nAtts < attsMax)
1562
2.75M
          atts[nAtts].valueEnd = ptr;
1563
5.49M
        nAtts++;
1564
5.49M
      }
1565
11.1M
      break;
1566
134k
    case BT_AMP:
1567
134k
      if (nAtts < attsMax)
1568
132k
        atts[nAtts].normalized = 0;
1569
134k
      break;
1570
4.25M
    case BT_S:
1571
4.25M
      if (state == inName)
1572
291k
        state = other;
1573
3.96M
      else if (state == inValue && nAtts < attsMax && atts[nAtts].normalized
1574
3.96M
               && (ptr == atts[nAtts].valuePtr
1575
190k
                   || BYTE_TO_ASCII(enc, ptr) != ASCII_SPACE
1576
190k
                   || BYTE_TO_ASCII(enc, ptr + MINBPC(enc)) == ASCII_SPACE
1577
190k
                   || BYTE_TYPE(enc, ptr + MINBPC(enc)) == open))
1578
183k
        atts[nAtts].normalized = 0;
1579
4.25M
      break;
1580
3.54M
    case BT_CR:
1581
4.42M
    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.42M
      if (state == inName)
1585
49.4k
        state = other;
1586
4.37M
      else if (state == inValue && nAtts < attsMax)
1587
1.29M
        atts[nAtts].normalized = 0;
1588
4.42M
      break;
1589
127k
    case BT_GT:
1590
510k
    case BT_SOL:
1591
510k
      if (state != inValue)
1592
457k
        return nAtts;
1593
52.6k
      break;
1594
9.70M
    default:
1595
9.70M
      break;
1596
60.5M
    }
1597
60.5M
  }
1598
  /* not reached */
1599
457k
}
xmltok.c:normal_getAtts
Line
Count
Source
1510
457k
                ATTRIBUTE *atts) {
1511
457k
  enum { other, inName, inValue } state = inName;
1512
457k
  int nAtts = 0;
1513
457k
  int open = 0; /* defined when state == inValue;
1514
                   initialization just to shut up compilers */
1515
1516
60.5M
  for (ptr += MINBPC(enc);; ptr += MINBPC(enc)) {
1517
60.5M
    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
124k
      LEAD_CASE(2)
1531
163k
      LEAD_CASE(3)
1532
69.9k
      LEAD_CASE(4)
1533
0
#  undef LEAD_CASE
1534
0
    case BT_NONASCII:
1535
26.9M
    case BT_NMSTRT:
1536
29.1M
    case BT_HEX:
1537
29.1M
      START_NAME
1538
29.1M
      break;
1539
0
#  undef START_NAME
1540
907k
    case BT_QUOT:
1541
907k
      if (state != inValue) {
1542
372k
        if (nAtts < attsMax)
1543
258k
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1544
372k
        state = inValue;
1545
372k
        open = BT_QUOT;
1546
534k
      } else if (open == BT_QUOT) {
1547
372k
        state = other;
1548
372k
        if (nAtts < attsMax)
1549
258k
          atts[nAtts].valueEnd = ptr;
1550
372k
        nAtts++;
1551
372k
      }
1552
907k
      break;
1553
11.1M
    case BT_APOS:
1554
11.1M
      if (state != inValue) {
1555
5.49M
        if (nAtts < attsMax)
1556
2.75M
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1557
5.49M
        state = inValue;
1558
5.49M
        open = BT_APOS;
1559
5.63M
      } else if (open == BT_APOS) {
1560
5.49M
        state = other;
1561
5.49M
        if (nAtts < attsMax)
1562
2.75M
          atts[nAtts].valueEnd = ptr;
1563
5.49M
        nAtts++;
1564
5.49M
      }
1565
11.1M
      break;
1566
134k
    case BT_AMP:
1567
134k
      if (nAtts < attsMax)
1568
132k
        atts[nAtts].normalized = 0;
1569
134k
      break;
1570
4.25M
    case BT_S:
1571
4.25M
      if (state == inName)
1572
291k
        state = other;
1573
3.96M
      else if (state == inValue && nAtts < attsMax && atts[nAtts].normalized
1574
3.96M
               && (ptr == atts[nAtts].valuePtr
1575
190k
                   || BYTE_TO_ASCII(enc, ptr) != ASCII_SPACE
1576
190k
                   || BYTE_TO_ASCII(enc, ptr + MINBPC(enc)) == ASCII_SPACE
1577
190k
                   || BYTE_TYPE(enc, ptr + MINBPC(enc)) == open))
1578
183k
        atts[nAtts].normalized = 0;
1579
4.25M
      break;
1580
3.54M
    case BT_CR:
1581
4.42M
    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.42M
      if (state == inName)
1585
49.4k
        state = other;
1586
4.37M
      else if (state == inValue && nAtts < attsMax)
1587
1.29M
        atts[nAtts].normalized = 0;
1588
4.42M
      break;
1589
127k
    case BT_GT:
1590
510k
    case BT_SOL:
1591
510k
      if (state != inValue)
1592
457k
        return nAtts;
1593
52.6k
      break;
1594
9.70M
    default:
1595
9.70M
      break;
1596
60.5M
    }
1597
60.5M
  }
1598
  /* not reached */
1599
457k
}
Unexecuted instantiation: xmltok.c:little2_getAtts
Unexecuted instantiation: xmltok.c:big2_getAtts
1600
1601
static int PTRFASTCALL
1602
169k
PREFIX(charRefNumber)(const ENCODING *enc, const char *ptr) {
1603
169k
  int result = 0;
1604
  /* skip &# */
1605
169k
  UNUSED_P(enc);
1606
169k
  ptr += 2 * MINBPC(enc);
1607
169k
  if (CHAR_MATCHES(enc, ptr, ASCII_x)) {
1608
724k
    for (ptr += MINBPC(enc); ! CHAR_MATCHES(enc, ptr, ASCII_SEMI);
1609
568k
         ptr += MINBPC(enc)) {
1610
568k
      int c = BYTE_TO_ASCII(enc, ptr);
1611
568k
      switch (c) {
1612
11.5k
      case ASCII_0:
1613
55.9k
      case ASCII_1:
1614
110k
      case ASCII_2:
1615
116k
      case ASCII_3:
1616
181k
      case ASCII_4:
1617
232k
      case ASCII_5:
1618
248k
      case ASCII_6:
1619
274k
      case ASCII_7:
1620
317k
      case ASCII_8:
1621
334k
      case ASCII_9:
1622
334k
        result <<= 4;
1623
334k
        result |= (c - ASCII_0);
1624
334k
        break;
1625
59.9k
      case ASCII_A:
1626
62.3k
      case ASCII_B:
1627
72.9k
      case ASCII_C:
1628
89.0k
      case ASCII_D:
1629
112k
      case ASCII_E:
1630
147k
      case ASCII_F:
1631
147k
        result <<= 4;
1632
147k
        result += 10 + (c - ASCII_A);
1633
147k
        break;
1634
595
      case ASCII_a:
1635
21.6k
      case ASCII_b:
1636
25.5k
      case ASCII_c:
1637
69.9k
      case ASCII_d:
1638
74.9k
      case ASCII_e:
1639
86.0k
      case ASCII_f:
1640
86.0k
        result <<= 4;
1641
86.0k
        result += 10 + (c - ASCII_a);
1642
86.0k
        break;
1643
568k
      }
1644
568k
      if (result >= 0x110000)
1645
21
        return -1;
1646
568k
    }
1647
155k
  } else {
1648
58.2k
    for (; ! CHAR_MATCHES(enc, ptr, ASCII_SEMI); ptr += MINBPC(enc)) {
1649
44.7k
      int c = BYTE_TO_ASCII(enc, ptr);
1650
44.7k
      result *= 10;
1651
44.7k
      result += (c - ASCII_0);
1652
44.7k
      if (result >= 0x110000)
1653
2
        return -1;
1654
44.7k
    }
1655
13.4k
  }
1656
169k
  return checkCharRefNumber(result);
1657
169k
}
xmltok.c:normal_charRefNumber
Line
Count
Source
1602
169k
PREFIX(charRefNumber)(const ENCODING *enc, const char *ptr) {
1603
169k
  int result = 0;
1604
  /* skip &# */
1605
169k
  UNUSED_P(enc);
1606
169k
  ptr += 2 * MINBPC(enc);
1607
169k
  if (CHAR_MATCHES(enc, ptr, ASCII_x)) {
1608
724k
    for (ptr += MINBPC(enc); ! CHAR_MATCHES(enc, ptr, ASCII_SEMI);
1609
568k
         ptr += MINBPC(enc)) {
1610
568k
      int c = BYTE_TO_ASCII(enc, ptr);
1611
568k
      switch (c) {
1612
11.5k
      case ASCII_0:
1613
55.9k
      case ASCII_1:
1614
110k
      case ASCII_2:
1615
116k
      case ASCII_3:
1616
181k
      case ASCII_4:
1617
232k
      case ASCII_5:
1618
248k
      case ASCII_6:
1619
274k
      case ASCII_7:
1620
317k
      case ASCII_8:
1621
334k
      case ASCII_9:
1622
334k
        result <<= 4;
1623
334k
        result |= (c - ASCII_0);
1624
334k
        break;
1625
59.9k
      case ASCII_A:
1626
62.3k
      case ASCII_B:
1627
72.9k
      case ASCII_C:
1628
89.0k
      case ASCII_D:
1629
112k
      case ASCII_E:
1630
147k
      case ASCII_F:
1631
147k
        result <<= 4;
1632
147k
        result += 10 + (c - ASCII_A);
1633
147k
        break;
1634
595
      case ASCII_a:
1635
21.6k
      case ASCII_b:
1636
25.5k
      case ASCII_c:
1637
69.9k
      case ASCII_d:
1638
74.9k
      case ASCII_e:
1639
86.0k
      case ASCII_f:
1640
86.0k
        result <<= 4;
1641
86.0k
        result += 10 + (c - ASCII_a);
1642
86.0k
        break;
1643
568k
      }
1644
568k
      if (result >= 0x110000)
1645
21
        return -1;
1646
568k
    }
1647
155k
  } else {
1648
58.2k
    for (; ! CHAR_MATCHES(enc, ptr, ASCII_SEMI); ptr += MINBPC(enc)) {
1649
44.7k
      int c = BYTE_TO_ASCII(enc, ptr);
1650
44.7k
      result *= 10;
1651
44.7k
      result += (c - ASCII_0);
1652
44.7k
      if (result >= 0x110000)
1653
2
        return -1;
1654
44.7k
    }
1655
13.4k
  }
1656
169k
  return checkCharRefNumber(result);
1657
169k
}
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
251k
                             const char *end) {
1662
251k
  UNUSED_P(enc);
1663
251k
  switch ((end - ptr) / MINBPC(enc)) {
1664
22.7k
  case 2:
1665
22.7k
    if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_t)) {
1666
1.08k
      switch (BYTE_TO_ASCII(enc, ptr)) {
1667
707
      case ASCII_l:
1668
707
        return ASCII_LT;
1669
187
      case ASCII_g:
1670
187
        return ASCII_GT;
1671
1.08k
      }
1672
1.08k
    }
1673
21.8k
    break;
1674
46.2k
  case 3:
1675
46.2k
    if (CHAR_MATCHES(enc, ptr, ASCII_a)) {
1676
38.2k
      ptr += MINBPC(enc);
1677
38.2k
      if (CHAR_MATCHES(enc, ptr, ASCII_m)) {
1678
34.2k
        ptr += MINBPC(enc);
1679
34.2k
        if (CHAR_MATCHES(enc, ptr, ASCII_p))
1680
33.4k
          return ASCII_AMP;
1681
34.2k
      }
1682
38.2k
    }
1683
12.8k
    break;
1684
16.3k
  case 4:
1685
16.3k
    switch (BYTE_TO_ASCII(enc, ptr)) {
1686
4.36k
    case ASCII_q:
1687
4.36k
      ptr += MINBPC(enc);
1688
4.36k
      if (CHAR_MATCHES(enc, ptr, ASCII_u)) {
1689
3.75k
        ptr += MINBPC(enc);
1690
3.75k
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1691
2.69k
          ptr += MINBPC(enc);
1692
2.69k
          if (CHAR_MATCHES(enc, ptr, ASCII_t))
1693
235
            return ASCII_QUOT;
1694
2.69k
        }
1695
3.75k
      }
1696
4.12k
      break;
1697
10.8k
    case ASCII_a:
1698
10.8k
      ptr += MINBPC(enc);
1699
10.8k
      if (CHAR_MATCHES(enc, ptr, ASCII_p)) {
1700
915
        ptr += MINBPC(enc);
1701
915
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1702
617
          ptr += MINBPC(enc);
1703
617
          if (CHAR_MATCHES(enc, ptr, ASCII_s))
1704
290
            return ASCII_APOS;
1705
617
        }
1706
915
      }
1707
10.5k
      break;
1708
16.3k
    }
1709
251k
  }
1710
216k
  return 0;
1711
251k
}
xmltok.c:normal_predefinedEntityName
Line
Count
Source
1661
251k
                             const char *end) {
1662
251k
  UNUSED_P(enc);
1663
251k
  switch ((end - ptr) / MINBPC(enc)) {
1664
22.7k
  case 2:
1665
22.7k
    if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_t)) {
1666
1.08k
      switch (BYTE_TO_ASCII(enc, ptr)) {
1667
707
      case ASCII_l:
1668
707
        return ASCII_LT;
1669
187
      case ASCII_g:
1670
187
        return ASCII_GT;
1671
1.08k
      }
1672
1.08k
    }
1673
21.8k
    break;
1674
46.2k
  case 3:
1675
46.2k
    if (CHAR_MATCHES(enc, ptr, ASCII_a)) {
1676
38.2k
      ptr += MINBPC(enc);
1677
38.2k
      if (CHAR_MATCHES(enc, ptr, ASCII_m)) {
1678
34.2k
        ptr += MINBPC(enc);
1679
34.2k
        if (CHAR_MATCHES(enc, ptr, ASCII_p))
1680
33.4k
          return ASCII_AMP;
1681
34.2k
      }
1682
38.2k
    }
1683
12.8k
    break;
1684
16.3k
  case 4:
1685
16.3k
    switch (BYTE_TO_ASCII(enc, ptr)) {
1686
4.36k
    case ASCII_q:
1687
4.36k
      ptr += MINBPC(enc);
1688
4.36k
      if (CHAR_MATCHES(enc, ptr, ASCII_u)) {
1689
3.75k
        ptr += MINBPC(enc);
1690
3.75k
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1691
2.69k
          ptr += MINBPC(enc);
1692
2.69k
          if (CHAR_MATCHES(enc, ptr, ASCII_t))
1693
235
            return ASCII_QUOT;
1694
2.69k
        }
1695
3.75k
      }
1696
4.12k
      break;
1697
10.8k
    case ASCII_a:
1698
10.8k
      ptr += MINBPC(enc);
1699
10.8k
      if (CHAR_MATCHES(enc, ptr, ASCII_p)) {
1700
915
        ptr += MINBPC(enc);
1701
915
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1702
617
          ptr += MINBPC(enc);
1703
617
          if (CHAR_MATCHES(enc, ptr, ASCII_s))
1704
290
            return ASCII_APOS;
1705
617
        }
1706
915
      }
1707
10.5k
      break;
1708
16.3k
    }
1709
251k
  }
1710
216k
  return 0;
1711
251k
}
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
236k
                         const char *end1, const char *ptr2) {
1716
236k
  UNUSED_P(enc);
1717
1.24M
  for (; *ptr2; ptr1 += MINBPC(enc), ptr2++) {
1718
1.08M
    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
50
      return 0; /* LCOV_EXCL_LINE */
1725
50
    }
1726
1.08M
    if (! CHAR_MATCHES(enc, ptr1, *ptr2))
1727
75.9k
      return 0;
1728
1.08M
  }
1729
160k
  return ptr1 == end1;
1730
236k
}
xmltok.c:normal_nameMatchesAscii
Line
Count
Source
1715
236k
                         const char *end1, const char *ptr2) {
1716
236k
  UNUSED_P(enc);
1717
1.24M
  for (; *ptr2; ptr1 += MINBPC(enc), ptr2++) {
1718
1.08M
    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
50
      return 0; /* LCOV_EXCL_LINE */
1725
50
    }
1726
1.08M
    if (! CHAR_MATCHES(enc, ptr1, *ptr2))
1727
75.9k
      return 0;
1728
1.08M
  }
1729
160k
  return ptr1 == end1;
1730
236k
}
Unexecuted instantiation: xmltok.c:little2_nameMatchesAscii
Unexecuted instantiation: xmltok.c:big2_nameMatchesAscii
1731
1732
static int PTRFASTCALL
1733
671k
PREFIX(nameLength)(const ENCODING *enc, const char *ptr) {
1734
671k
  const char *start = ptr;
1735
12.1M
  for (;;) {
1736
12.1M
    switch (BYTE_TYPE(enc, ptr)) {
1737
0
#  define LEAD_CASE(n)                                                         \
1738
164k
  case BT_LEAD##n:                                                             \
1739
164k
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1740
164k
    break;
1741
89.1k
      LEAD_CASE(2)
1742
75.5k
      LEAD_CASE(3)
1743
0
      LEAD_CASE(4)
1744
0
#  undef LEAD_CASE
1745
0
    case BT_NONASCII:
1746
6.77M
    case BT_NMSTRT:
1747
#  ifdef XML_NS
1748
    case BT_COLON:
1749
#  endif
1750
10.9M
    case BT_HEX:
1751
11.1M
    case BT_DIGIT:
1752
11.3M
    case BT_NAME:
1753
11.3M
    case BT_MINUS:
1754
11.3M
      ptr += MINBPC(enc);
1755
11.3M
      break;
1756
671k
    default:
1757
671k
      return (int)(ptr - start);
1758
12.1M
    }
1759
12.1M
  }
1760
671k
}
xmltok.c:normal_nameLength
Line
Count
Source
1733
671k
PREFIX(nameLength)(const ENCODING *enc, const char *ptr) {
1734
671k
  const char *start = ptr;
1735
12.1M
  for (;;) {
1736
12.1M
    switch (BYTE_TYPE(enc, ptr)) {
1737
0
#  define LEAD_CASE(n)                                                         \
1738
0
  case BT_LEAD##n:                                                             \
1739
0
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1740
0
    break;
1741
89.1k
      LEAD_CASE(2)
1742
75.5k
      LEAD_CASE(3)
1743
0
      LEAD_CASE(4)
1744
0
#  undef LEAD_CASE
1745
0
    case BT_NONASCII:
1746
6.77M
    case BT_NMSTRT:
1747
#  ifdef XML_NS
1748
    case BT_COLON:
1749
#  endif
1750
10.9M
    case BT_HEX:
1751
11.1M
    case BT_DIGIT:
1752
11.3M
    case BT_NAME:
1753
11.3M
    case BT_MINUS:
1754
11.3M
      ptr += MINBPC(enc);
1755
11.3M
      break;
1756
671k
    default:
1757
671k
      return (int)(ptr - start);
1758
12.1M
    }
1759
12.1M
  }
1760
671k
}
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
17.8k
                       POSITION *pos) {
1780
127M
  while (HAS_CHAR(enc, ptr, end)) {
1781
127M
    switch (BYTE_TYPE(enc, ptr)) {
1782
0
#  define LEAD_CASE(n)                                                         \
1783
1.74M
  case BT_LEAD##n:                                                             \
1784
1.74M
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1785
1.74M
    pos->columnNumber++;                                                       \
1786
1.74M
    break;
1787
788k
      LEAD_CASE(2)
1788
727k
      LEAD_CASE(3)
1789
226k
      LEAD_CASE(4)
1790
0
#  undef LEAD_CASE
1791
2.99M
    case BT_LF:
1792
2.99M
      pos->columnNumber = 0;
1793
2.99M
      pos->lineNumber++;
1794
2.99M
      ptr += MINBPC(enc);
1795
2.99M
      break;
1796
4.64M
    case BT_CR:
1797
4.64M
      pos->lineNumber++;
1798
4.64M
      ptr += MINBPC(enc);
1799
4.64M
      if (HAS_CHAR(enc, ptr, end) && BYTE_TYPE(enc, ptr) == BT_LF)
1800
897k
        ptr += MINBPC(enc);
1801
4.64M
      pos->columnNumber = 0;
1802
4.64M
      break;
1803
118M
    default:
1804
118M
      ptr += MINBPC(enc);
1805
118M
      pos->columnNumber++;
1806
118M
      break;
1807
127M
    }
1808
127M
  }
1809
17.8k
}
xmltok.c:normal_updatePosition
Line
Count
Source
1779
17.4k
                       POSITION *pos) {
1780
127M
  while (HAS_CHAR(enc, ptr, end)) {
1781
127M
    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
788k
      LEAD_CASE(2)
1788
727k
      LEAD_CASE(3)
1789
226k
      LEAD_CASE(4)
1790
0
#  undef LEAD_CASE
1791
2.99M
    case BT_LF:
1792
2.99M
      pos->columnNumber = 0;
1793
2.99M
      pos->lineNumber++;
1794
2.99M
      ptr += MINBPC(enc);
1795
2.99M
      break;
1796
4.64M
    case BT_CR:
1797
4.64M
      pos->lineNumber++;
1798
4.64M
      ptr += MINBPC(enc);
1799
4.64M
      if (HAS_CHAR(enc, ptr, end) && BYTE_TYPE(enc, ptr) == BT_LF)
1800
897k
        ptr += MINBPC(enc);
1801
4.64M
      pos->columnNumber = 0;
1802
4.64M
      break;
1803
118M
    default:
1804
118M
      ptr += MINBPC(enc);
1805
118M
      pos->columnNumber++;
1806
118M
      break;
1807
127M
    }
1808
127M
  }
1809
17.4k
}
xmltok.c:little2_updatePosition
Line
Count
Source
1779
214
                       POSITION *pos) {
1780
9.52k
  while (HAS_CHAR(enc, ptr, end)) {
1781
9.52k
    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
9.52k
    default:
1804
9.52k
      ptr += MINBPC(enc);
1805
9.52k
      pos->columnNumber++;
1806
9.52k
      break;
1807
9.52k
    }
1808
9.52k
  }
1809
214
}
xmltok.c:big2_updatePosition
Line
Count
Source
1779
195
                       POSITION *pos) {
1780
529
  while (HAS_CHAR(enc, ptr, end)) {
1781
529
    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
529
    default:
1804
529
      ptr += MINBPC(enc);
1805
529
      pos->columnNumber++;
1806
529
      break;
1807
529
    }
1808
529
  }
1809
195
}
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 */