Coverage Report

Created: 2025-11-24 06:25

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/CMake/Utilities/cmexpat/lib/xmltok_impl.c
Line
Count
Source
1
/* This file is included (from xmltok.c, 1-3 times depending on XML_MIN_SIZE)!
2
                            __  __            _
3
                         ___\ \/ /_ __   __ _| |_
4
                        / _ \\  /| '_ \ / _` | __|
5
                       |  __//  \| |_) | (_| | |_
6
                        \___/_/\_\ .__/ \__,_|\__|
7
                                 |_| XML parser
8
9
   Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
10
   Copyright (c) 2000      Clark Cooper <coopercc@users.sourceforge.net>
11
   Copyright (c) 2002      Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
12
   Copyright (c) 2002-2016 Karl Waclawek <karl@waclawek.net>
13
   Copyright (c) 2016-2022 Sebastian Pipping <sebastian@pipping.org>
14
   Copyright (c) 2017      Rhodri James <rhodri@wildebeest.org.uk>
15
   Copyright (c) 2018      Benjamin Peterson <benjamin@python.org>
16
   Copyright (c) 2018      Anton Maklakov <antmak.pub@gmail.com>
17
   Copyright (c) 2019      David Loffredo <loffredo@steptools.com>
18
   Copyright (c) 2020      Boris Kolpackov <boris@codesynthesis.com>
19
   Copyright (c) 2022      Martin Ettl <ettl.martin78@googlemail.com>
20
   Licensed under the MIT license:
21
22
   Permission is  hereby granted,  free of charge,  to any  person obtaining
23
   a  copy  of  this  software   and  associated  documentation  files  (the
24
   "Software"),  to  deal in  the  Software  without restriction,  including
25
   without  limitation the  rights  to use,  copy,  modify, merge,  publish,
26
   distribute, sublicense, and/or sell copies of the Software, and to permit
27
   persons  to whom  the Software  is  furnished to  do so,  subject to  the
28
   following conditions:
29
30
   The above copyright  notice and this permission notice  shall be included
31
   in all copies or substantial portions of the Software.
32
33
   THE  SOFTWARE  IS  PROVIDED  "AS  IS",  WITHOUT  WARRANTY  OF  ANY  KIND,
34
   EXPRESS  OR IMPLIED,  INCLUDING  BUT  NOT LIMITED  TO  THE WARRANTIES  OF
35
   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
36
   NO EVENT SHALL THE AUTHORS OR  COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
37
   DAMAGES OR  OTHER LIABILITY, WHETHER  IN AN  ACTION OF CONTRACT,  TORT OR
38
   OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
39
   USE OR OTHER DEALINGS IN THE SOFTWARE.
40
*/
41
42
#ifdef XML_TOK_IMPL_C
43
44
#  ifndef IS_INVALID_CHAR // i.e. for UTF-16 and XML_MIN_SIZE not defined
45
19
#    define IS_INVALID_CHAR(enc, ptr, n) (0)
46
#  endif
47
48
#  define INVALID_LEAD_CASE(n, ptr, nextTokPtr)                                \
49
258k
  case BT_LEAD##n:                                                             \
50
258k
    if (end - ptr < n)                                                         \
51
258k
      return XML_TOK_PARTIAL_CHAR;                                             \
52
258k
    if (IS_INVALID_CHAR(enc, ptr, n)) {                                        \
53
45
      *(nextTokPtr) = (ptr);                                                   \
54
45
      return XML_TOK_INVALID;                                                  \
55
45
    }                                                                          \
56
258k
    ptr += n;                                                                  \
57
258k
    break;
58
59
#  define INVALID_CASES(ptr, nextTokPtr)                                       \
60
86.6k
    INVALID_LEAD_CASE(2, ptr, nextTokPtr)                                      \
61
94.3k
    INVALID_LEAD_CASE(3, ptr, nextTokPtr)                                      \
62
94.3k
    INVALID_LEAD_CASE(4, ptr, nextTokPtr)                                      \
63
77.4k
  case BT_NONXML:                                                              \
64
34
  case BT_MALFORM:                                                             \
65
53
  case BT_TRAIL:                                                               \
66
53
    *(nextTokPtr) = (ptr);                                                     \
67
53
    return XML_TOK_INVALID;
68
69
#  define CHECK_NAME_CASE(n, enc, ptr, end, nextTokPtr)                        \
70
198k
  case BT_LEAD##n:                                                             \
71
198k
    if (end - ptr < n)                                                         \
72
198k
      return XML_TOK_PARTIAL_CHAR;                                             \
73
198k
    if (IS_INVALID_CHAR(enc, ptr, n) || ! IS_NAME_CHAR(enc, ptr, n)) {         \
74
94
      *nextTokPtr = ptr;                                                       \
75
94
      return XML_TOK_INVALID;                                                  \
76
94
    }                                                                          \
77
198k
    ptr += n;                                                                  \
78
198k
    break;
79
80
#  define CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)                          \
81
20.6M
  case BT_NONASCII:                                                            \
82
20.6M
    if (! IS_NAME_CHAR_MINBPC(enc, ptr)) {                                     \
83
22
      *nextTokPtr = ptr;                                                       \
84
22
      return XML_TOK_INVALID;                                                  \
85
22
    }                                                                          \
86
20.6M
    /* fall through */                                                         \
87
20.6M
  case BT_NMSTRT:                                                              \
88
17.2M
  case BT_HEX:                                                                 \
89
20.4M
  case BT_DIGIT:                                                               \
90
20.5M
  case BT_NAME:                                                                \
91
20.6M
  case BT_MINUS:                                                               \
92
20.6M
    ptr += MINBPC(enc);                                                        \
93
20.6M
    break;                                                                     \
94
20.6M
    CHECK_NAME_CASE(2, enc, ptr, end, nextTokPtr)                              \
95
152k
    CHECK_NAME_CASE(3, enc, ptr, end, nextTokPtr)                              \
96
152k
    CHECK_NAME_CASE(4, enc, ptr, end, nextTokPtr)
97
98
#  define CHECK_NMSTRT_CASE(n, enc, ptr, end, nextTokPtr)                      \
99
30.4k
  case BT_LEAD##n:                                                             \
100
30.4k
    if ((end) - (ptr) < (n))                                                   \
101
30.3k
      return XML_TOK_PARTIAL_CHAR;                                             \
102
30.4k
    if (IS_INVALID_CHAR(enc, ptr, n) || ! IS_NMSTRT_CHAR(enc, ptr, n)) {       \
103
72
      *nextTokPtr = ptr;                                                       \
104
72
      return XML_TOK_INVALID;                                                  \
105
72
    }                                                                          \
106
30.4k
    ptr += n;                                                                  \
107
30.3k
    break;
108
109
#  define CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)                        \
110
1.41M
  case BT_NONASCII:                                                            \
111
1.41M
    if (! IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {                                   \
112
0
      *nextTokPtr = ptr;                                                       \
113
0
      return XML_TOK_INVALID;                                                  \
114
0
    }                                                                          \
115
1.41M
    /* fall through */                                                         \
116
1.41M
  case BT_NMSTRT:                                                              \
117
1.41M
  case BT_HEX:                                                                 \
118
1.41M
    ptr += MINBPC(enc);                                                        \
119
1.41M
    break;                                                                     \
120
1.41M
    CHECK_NMSTRT_CASE(2, enc, ptr, end, nextTokPtr)                            \
121
17.3k
    CHECK_NMSTRT_CASE(3, enc, ptr, end, nextTokPtr)                            \
122
17.2k
    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
132M
    ((end) - (ptr) >= ((count) * MINBPC(enc)))
130
131
3.96M
#  define HAS_CHAR(enc, ptr, end) HAS_CHARS(enc, ptr, end, 1)
132
133
#  define REQUIRE_CHARS(enc, ptr, end, count)                                  \
134
13.4M
    {                                                                          \
135
13.4M
      if (! HAS_CHARS(enc, ptr, end, count)) {                                 \
136
299
        return XML_TOK_PARTIAL;                                                \
137
299
      }                                                                        \
138
13.4M
    }
139
140
13.4M
#  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
5.87k
                    const char **nextTokPtr) {
147
5.87k
  if (HAS_CHAR(enc, ptr, end)) {
148
5.86k
    if (! CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
149
6
      *nextTokPtr = ptr;
150
6
      return XML_TOK_INVALID;
151
6
    }
152
5.85k
    ptr += MINBPC(enc);
153
1.29M
    while (HAS_CHAR(enc, ptr, end)) {
154
1.29M
      switch (BYTE_TYPE(enc, ptr)) {
155
78.0k
        INVALID_CASES(ptr, nextTokPtr)
156
10.4k
      case BT_MINUS:
157
10.4k
        ptr += MINBPC(enc);
158
10.4k
        REQUIRE_CHAR(enc, ptr, end);
159
10.4k
        if (CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
160
5.80k
          ptr += MINBPC(enc);
161
5.80k
          REQUIRE_CHAR(enc, ptr, end);
162
5.80k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
163
5
            *nextTokPtr = ptr;
164
5
            return XML_TOK_INVALID;
165
5
          }
166
5.80k
          *nextTokPtr = ptr + MINBPC(enc);
167
5.80k
          return XML_TOK_COMMENT;
168
5.80k
        }
169
4.60k
        break;
170
1.24M
      default:
171
1.24M
        ptr += MINBPC(enc);
172
1.24M
        break;
173
1.29M
      }
174
1.29M
    }
175
5.85k
  }
176
40
  return XML_TOK_PARTIAL;
177
5.87k
}
xmltok.c:normal_scanComment
Line
Count
Source
146
5.87k
                    const char **nextTokPtr) {
147
5.87k
  if (HAS_CHAR(enc, ptr, end)) {
148
5.86k
    if (! CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
149
6
      *nextTokPtr = ptr;
150
6
      return XML_TOK_INVALID;
151
6
    }
152
5.85k
    ptr += MINBPC(enc);
153
1.29M
    while (HAS_CHAR(enc, ptr, end)) {
154
1.29M
      switch (BYTE_TYPE(enc, ptr)) {
155
78.0k
        INVALID_CASES(ptr, nextTokPtr)
156
10.4k
      case BT_MINUS:
157
10.4k
        ptr += MINBPC(enc);
158
10.4k
        REQUIRE_CHAR(enc, ptr, end);
159
10.4k
        if (CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
160
5.80k
          ptr += MINBPC(enc);
161
5.80k
          REQUIRE_CHAR(enc, ptr, end);
162
5.80k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
163
5
            *nextTokPtr = ptr;
164
5
            return XML_TOK_INVALID;
165
5
          }
166
5.80k
          *nextTokPtr = ptr + MINBPC(enc);
167
5.80k
          return XML_TOK_COMMENT;
168
5.80k
        }
169
4.60k
        break;
170
1.24M
      default:
171
1.24M
        ptr += MINBPC(enc);
172
1.24M
        break;
173
1.29M
      }
174
1.29M
    }
175
5.85k
  }
176
40
  return XML_TOK_PARTIAL;
177
5.87k
}
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
62.9k
                 const char **nextTokPtr) {
184
62.9k
  REQUIRE_CHAR(enc, ptr, end);
185
62.8k
  switch (BYTE_TYPE(enc, ptr)) {
186
1.45k
  case BT_MINUS:
187
1.45k
    return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
188
7
  case BT_LSQB:
189
7
    *nextTokPtr = ptr + MINBPC(enc);
190
7
    return XML_TOK_COND_SECT_OPEN;
191
634
  case BT_NMSTRT:
192
61.4k
  case BT_HEX:
193
61.4k
    ptr += MINBPC(enc);
194
61.4k
    break;
195
3
  default:
196
3
    *nextTokPtr = ptr;
197
3
    return XML_TOK_INVALID;
198
62.8k
  }
199
416k
  while (HAS_CHAR(enc, ptr, end)) {
200
416k
    switch (BYTE_TYPE(enc, ptr)) {
201
9
    case BT_PERCNT:
202
9
      REQUIRE_CHARS(enc, ptr, end, 2);
203
      /* don't allow <!ENTITY% foo "whatever"> */
204
9
      switch (BYTE_TYPE(enc, ptr + MINBPC(enc))) {
205
2
      case BT_S:
206
3
      case BT_CR:
207
4
      case BT_LF:
208
5
      case BT_PERCNT:
209
5
        *nextTokPtr = ptr;
210
5
        return XML_TOK_INVALID;
211
9
      }
212
      /* fall through */
213
28.2k
    case BT_S:
214
58.4k
    case BT_CR:
215
61.3k
    case BT_LF:
216
61.3k
      *nextTokPtr = ptr;
217
61.3k
      return XML_TOK_DECL_OPEN;
218
345k
    case BT_NMSTRT:
219
354k
    case BT_HEX:
220
354k
      ptr += MINBPC(enc);
221
354k
      break;
222
6
    default:
223
6
      *nextTokPtr = ptr;
224
6
      return XML_TOK_INVALID;
225
416k
    }
226
416k
  }
227
30
  return XML_TOK_PARTIAL;
228
61.4k
}
xmltok.c:normal_scanDecl
Line
Count
Source
183
62.9k
                 const char **nextTokPtr) {
184
62.9k
  REQUIRE_CHAR(enc, ptr, end);
185
62.8k
  switch (BYTE_TYPE(enc, ptr)) {
186
1.45k
  case BT_MINUS:
187
1.45k
    return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
188
7
  case BT_LSQB:
189
7
    *nextTokPtr = ptr + MINBPC(enc);
190
7
    return XML_TOK_COND_SECT_OPEN;
191
634
  case BT_NMSTRT:
192
61.4k
  case BT_HEX:
193
61.4k
    ptr += MINBPC(enc);
194
61.4k
    break;
195
3
  default:
196
3
    *nextTokPtr = ptr;
197
3
    return XML_TOK_INVALID;
198
62.8k
  }
199
416k
  while (HAS_CHAR(enc, ptr, end)) {
200
416k
    switch (BYTE_TYPE(enc, ptr)) {
201
9
    case BT_PERCNT:
202
9
      REQUIRE_CHARS(enc, ptr, end, 2);
203
      /* don't allow <!ENTITY% foo "whatever"> */
204
9
      switch (BYTE_TYPE(enc, ptr + MINBPC(enc))) {
205
2
      case BT_S:
206
3
      case BT_CR:
207
4
      case BT_LF:
208
5
      case BT_PERCNT:
209
5
        *nextTokPtr = ptr;
210
5
        return XML_TOK_INVALID;
211
9
      }
212
      /* fall through */
213
28.2k
    case BT_S:
214
58.4k
    case BT_CR:
215
61.3k
    case BT_LF:
216
61.3k
      *nextTokPtr = ptr;
217
61.3k
      return XML_TOK_DECL_OPEN;
218
345k
    case BT_NMSTRT:
219
354k
    case BT_HEX:
220
354k
      ptr += MINBPC(enc);
221
354k
      break;
222
6
    default:
223
6
      *nextTokPtr = ptr;
224
6
      return XML_TOK_INVALID;
225
416k
    }
226
416k
  }
227
30
  return XML_TOK_PARTIAL;
228
61.4k
}
Unexecuted instantiation: xmltok.c:little2_scanDecl
Unexecuted instantiation: xmltok.c:big2_scanDecl
229
230
static int PTRCALL
231
PREFIX(checkPiTarget)(const ENCODING *enc, const char *ptr, const char *end,
232
12.9k
                      int *tokPtr) {
233
12.9k
  int upper = 0;
234
12.9k
  UNUSED_P(enc);
235
12.9k
  *tokPtr = XML_TOK_PI;
236
12.9k
  if (end - ptr != MINBPC(enc) * 3)
237
8.47k
    return 1;
238
4.51k
  switch (BYTE_TO_ASCII(enc, ptr)) {
239
2.91k
  case ASCII_x:
240
2.91k
    break;
241
866
  case ASCII_X:
242
866
    upper = 1;
243
866
    break;
244
741
  default:
245
741
    return 1;
246
4.51k
  }
247
3.77k
  ptr += MINBPC(enc);
248
3.77k
  switch (BYTE_TO_ASCII(enc, ptr)) {
249
1.44k
  case ASCII_m:
250
1.44k
    break;
251
501
  case ASCII_M:
252
501
    upper = 1;
253
501
    break;
254
1.83k
  default:
255
1.83k
    return 1;
256
3.77k
  }
257
1.94k
  ptr += MINBPC(enc);
258
1.94k
  switch (BYTE_TO_ASCII(enc, ptr)) {
259
672
  case ASCII_l:
260
672
    break;
261
2
  case ASCII_L:
262
2
    upper = 1;
263
2
    break;
264
1.26k
  default:
265
1.26k
    return 1;
266
1.94k
  }
267
674
  if (upper)
268
4
    return 0;
269
670
  *tokPtr = XML_TOK_XML_DECL;
270
670
  return 1;
271
674
}
xmltok.c:normal_checkPiTarget
Line
Count
Source
232
12.9k
                      int *tokPtr) {
233
12.9k
  int upper = 0;
234
12.9k
  UNUSED_P(enc);
235
12.9k
  *tokPtr = XML_TOK_PI;
236
12.9k
  if (end - ptr != MINBPC(enc) * 3)
237
8.47k
    return 1;
238
4.51k
  switch (BYTE_TO_ASCII(enc, ptr)) {
239
2.91k
  case ASCII_x:
240
2.91k
    break;
241
866
  case ASCII_X:
242
866
    upper = 1;
243
866
    break;
244
741
  default:
245
741
    return 1;
246
4.51k
  }
247
3.77k
  ptr += MINBPC(enc);
248
3.77k
  switch (BYTE_TO_ASCII(enc, ptr)) {
249
1.44k
  case ASCII_m:
250
1.44k
    break;
251
501
  case ASCII_M:
252
501
    upper = 1;
253
501
    break;
254
1.83k
  default:
255
1.83k
    return 1;
256
3.77k
  }
257
1.94k
  ptr += MINBPC(enc);
258
1.94k
  switch (BYTE_TO_ASCII(enc, ptr)) {
259
672
  case ASCII_l:
260
672
    break;
261
2
  case ASCII_L:
262
2
    upper = 1;
263
2
    break;
264
1.26k
  default:
265
1.26k
    return 1;
266
1.94k
  }
267
674
  if (upper)
268
4
    return 0;
269
670
  *tokPtr = XML_TOK_XML_DECL;
270
670
  return 1;
271
674
}
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
13.0k
               const char **nextTokPtr) {
278
13.0k
  int tok;
279
13.0k
  const char *target = ptr;
280
13.0k
  REQUIRE_CHAR(enc, ptr, end);
281
13.0k
  switch (BYTE_TYPE(enc, ptr)) {
282
15.5k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
283
2
  default:
284
2
    *nextTokPtr = ptr;
285
2
    return XML_TOK_INVALID;
286
13.0k
  }
287
146k
  while (HAS_CHAR(enc, ptr, end)) {
288
146k
    switch (BYTE_TYPE(enc, ptr)) {
289
412k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
290
3.46k
    case BT_S:
291
4.45k
    case BT_CR:
292
5.33k
    case BT_LF:
293
5.33k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
294
2
        *nextTokPtr = ptr;
295
2
        return XML_TOK_INVALID;
296
2
      }
297
5.32k
      ptr += MINBPC(enc);
298
3.58M
      while (HAS_CHAR(enc, ptr, end)) {
299
3.58M
        switch (BYTE_TYPE(enc, ptr)) {
300
93.4k
          INVALID_CASES(ptr, nextTokPtr)
301
26.1k
        case BT_QUEST:
302
26.1k
          ptr += MINBPC(enc);
303
26.1k
          REQUIRE_CHAR(enc, ptr, end);
304
26.1k
          if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
305
5.26k
            *nextTokPtr = ptr + MINBPC(enc);
306
5.26k
            return tok;
307
5.26k
          }
308
20.9k
          break;
309
3.51M
        default:
310
3.51M
          ptr += MINBPC(enc);
311
3.51M
          break;
312
3.58M
        }
313
3.58M
      }
314
44
      return XML_TOK_PARTIAL;
315
7.66k
    case BT_QUEST:
316
7.66k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
317
2
        *nextTokPtr = ptr;
318
2
        return XML_TOK_INVALID;
319
2
      }
320
7.66k
      ptr += MINBPC(enc);
321
7.66k
      REQUIRE_CHAR(enc, ptr, end);
322
7.64k
      if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
323
7.63k
        *nextTokPtr = ptr + MINBPC(enc);
324
7.63k
        return tok;
325
7.63k
      }
326
      /* fall through */
327
7
    default:
328
7
      *nextTokPtr = ptr;
329
7
      return XML_TOK_INVALID;
330
146k
    }
331
146k
  }
332
38
  return XML_TOK_PARTIAL;
333
13.0k
}
xmltok.c:normal_scanPi
Line
Count
Source
277
13.0k
               const char **nextTokPtr) {
278
13.0k
  int tok;
279
13.0k
  const char *target = ptr;
280
13.0k
  REQUIRE_CHAR(enc, ptr, end);
281
13.0k
  switch (BYTE_TYPE(enc, ptr)) {
282
15.5k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
283
2
  default:
284
2
    *nextTokPtr = ptr;
285
2
    return XML_TOK_INVALID;
286
13.0k
  }
287
146k
  while (HAS_CHAR(enc, ptr, end)) {
288
146k
    switch (BYTE_TYPE(enc, ptr)) {
289
412k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
290
3.46k
    case BT_S:
291
4.45k
    case BT_CR:
292
5.33k
    case BT_LF:
293
5.33k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
294
2
        *nextTokPtr = ptr;
295
2
        return XML_TOK_INVALID;
296
2
      }
297
5.32k
      ptr += MINBPC(enc);
298
3.58M
      while (HAS_CHAR(enc, ptr, end)) {
299
3.58M
        switch (BYTE_TYPE(enc, ptr)) {
300
93.4k
          INVALID_CASES(ptr, nextTokPtr)
301
26.1k
        case BT_QUEST:
302
26.1k
          ptr += MINBPC(enc);
303
26.1k
          REQUIRE_CHAR(enc, ptr, end);
304
26.1k
          if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
305
5.26k
            *nextTokPtr = ptr + MINBPC(enc);
306
5.26k
            return tok;
307
5.26k
          }
308
20.9k
          break;
309
3.51M
        default:
310
3.51M
          ptr += MINBPC(enc);
311
3.51M
          break;
312
3.58M
        }
313
3.58M
      }
314
44
      return XML_TOK_PARTIAL;
315
7.66k
    case BT_QUEST:
316
7.66k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
317
2
        *nextTokPtr = ptr;
318
2
        return XML_TOK_INVALID;
319
2
      }
320
7.66k
      ptr += MINBPC(enc);
321
7.66k
      REQUIRE_CHAR(enc, ptr, end);
322
7.64k
      if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
323
7.63k
        *nextTokPtr = ptr + MINBPC(enc);
324
7.63k
        return tok;
325
7.63k
      }
326
      /* fall through */
327
7
    default:
328
7
      *nextTokPtr = ptr;
329
7
      return XML_TOK_INVALID;
330
146k
    }
331
146k
  }
332
38
  return XML_TOK_PARTIAL;
333
13.0k
}
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.12k
                         const char **nextTokPtr) {
338
1.12k
  static const char CDATA_LSQB[]
339
1.12k
      = {ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, ASCII_LSQB};
340
1.12k
  int i;
341
1.12k
  UNUSED_P(enc);
342
  /* CDATA[ */
343
1.12k
  REQUIRE_CHARS(enc, ptr, end, 6);
344
7.68k
  for (i = 0; i < 6; i++, ptr += MINBPC(enc)) {
345
6.59k
    if (! CHAR_MATCHES(enc, ptr, CDATA_LSQB[i])) {
346
20
      *nextTokPtr = ptr;
347
20
      return XML_TOK_INVALID;
348
20
    }
349
6.59k
  }
350
1.08k
  *nextTokPtr = ptr;
351
1.08k
  return XML_TOK_CDATA_SECT_OPEN;
352
1.10k
}
xmltok.c:normal_scanCdataSection
Line
Count
Source
337
1.12k
                         const char **nextTokPtr) {
338
1.12k
  static const char CDATA_LSQB[]
339
1.12k
      = {ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, ASCII_LSQB};
340
1.12k
  int i;
341
1.12k
  UNUSED_P(enc);
342
  /* CDATA[ */
343
1.12k
  REQUIRE_CHARS(enc, ptr, end, 6);
344
7.68k
  for (i = 0; i < 6; i++, ptr += MINBPC(enc)) {
345
6.59k
    if (! CHAR_MATCHES(enc, ptr, CDATA_LSQB[i])) {
346
20
      *nextTokPtr = ptr;
347
20
      return XML_TOK_INVALID;
348
20
    }
349
6.59k
  }
350
1.08k
  *nextTokPtr = ptr;
351
1.08k
  return XML_TOK_CDATA_SECT_OPEN;
352
1.10k
}
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
1.14M
                        const char **nextTokPtr) {
357
1.14M
  if (ptr >= end)
358
114
    return XML_TOK_NONE;
359
1.14M
  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
1.14M
  switch (BYTE_TYPE(enc, ptr)) {
369
172k
  case BT_RSQB:
370
172k
    ptr += MINBPC(enc);
371
172k
    REQUIRE_CHAR(enc, ptr, end);
372
172k
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
373
92.2k
      break;
374
80.5k
    ptr += MINBPC(enc);
375
80.5k
    REQUIRE_CHAR(enc, ptr, end);
376
80.4k
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
377
79.5k
      ptr -= MINBPC(enc);
378
79.5k
      break;
379
79.5k
    }
380
994
    *nextTokPtr = ptr + MINBPC(enc);
381
994
    return XML_TOK_CDATA_SECT_CLOSE;
382
390k
  case BT_CR:
383
390k
    ptr += MINBPC(enc);
384
390k
    REQUIRE_CHAR(enc, ptr, end);
385
390k
    if (BYTE_TYPE(enc, ptr) == BT_LF)
386
114k
      ptr += MINBPC(enc);
387
390k
    *nextTokPtr = ptr;
388
390k
    return XML_TOK_DATA_NEWLINE;
389
334k
  case BT_LF:
390
334k
    *nextTokPtr = ptr + MINBPC(enc);
391
334k
    return XML_TOK_DATA_NEWLINE;
392
334k
    INVALID_CASES(ptr, nextTokPtr)
393
228k
  default:
394
228k
    ptr += MINBPC(enc);
395
228k
    break;
396
1.14M
  }
397
6.52M
  while (HAS_CHAR(enc, ptr, end)) {
398
6.52M
    switch (BYTE_TYPE(enc, ptr)) {
399
0
#  define LEAD_CASE(n)                                                         \
400
108k
  case BT_LEAD##n:                                                             \
401
108k
    if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) {                       \
402
11
      *nextTokPtr = ptr;                                                       \
403
11
      return XML_TOK_DATA_CHARS;                                               \
404
11
    }                                                                          \
405
108k
    ptr += n;                                                                  \
406
108k
    break;
407
43.8k
      LEAD_CASE(2)
408
47.2k
      LEAD_CASE(3)
409
17.5k
      LEAD_CASE(4)
410
0
#  undef LEAD_CASE
411
4
    case BT_NONXML:
412
6
    case BT_MALFORM:
413
10
    case BT_TRAIL:
414
152k
    case BT_CR:
415
264k
    case BT_LF:
416
418k
    case BT_RSQB:
417
418k
      *nextTokPtr = ptr;
418
418k
      return XML_TOK_DATA_CHARS;
419
5.99M
    default:
420
5.99M
      ptr += MINBPC(enc);
421
5.99M
      break;
422
6.52M
    }
423
6.52M
  }
424
36
  *nextTokPtr = ptr;
425
36
  return XML_TOK_DATA_CHARS;
426
418k
}
xmltok.c:normal_cdataSectionTok
Line
Count
Source
356
1.14M
                        const char **nextTokPtr) {
357
1.14M
  if (ptr >= end)
358
114
    return XML_TOK_NONE;
359
1.14M
  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
1.14M
  switch (BYTE_TYPE(enc, ptr)) {
369
172k
  case BT_RSQB:
370
172k
    ptr += MINBPC(enc);
371
172k
    REQUIRE_CHAR(enc, ptr, end);
372
172k
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
373
92.2k
      break;
374
80.5k
    ptr += MINBPC(enc);
375
80.5k
    REQUIRE_CHAR(enc, ptr, end);
376
80.4k
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
377
79.5k
      ptr -= MINBPC(enc);
378
79.5k
      break;
379
79.5k
    }
380
994
    *nextTokPtr = ptr + MINBPC(enc);
381
994
    return XML_TOK_CDATA_SECT_CLOSE;
382
390k
  case BT_CR:
383
390k
    ptr += MINBPC(enc);
384
390k
    REQUIRE_CHAR(enc, ptr, end);
385
390k
    if (BYTE_TYPE(enc, ptr) == BT_LF)
386
114k
      ptr += MINBPC(enc);
387
390k
    *nextTokPtr = ptr;
388
390k
    return XML_TOK_DATA_NEWLINE;
389
334k
  case BT_LF:
390
334k
    *nextTokPtr = ptr + MINBPC(enc);
391
334k
    return XML_TOK_DATA_NEWLINE;
392
334k
    INVALID_CASES(ptr, nextTokPtr)
393
228k
  default:
394
228k
    ptr += MINBPC(enc);
395
228k
    break;
396
1.14M
  }
397
6.52M
  while (HAS_CHAR(enc, ptr, end)) {
398
6.52M
    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
43.8k
      LEAD_CASE(2)
408
47.2k
      LEAD_CASE(3)
409
17.5k
      LEAD_CASE(4)
410
0
#  undef LEAD_CASE
411
4
    case BT_NONXML:
412
6
    case BT_MALFORM:
413
10
    case BT_TRAIL:
414
152k
    case BT_CR:
415
264k
    case BT_LF:
416
418k
    case BT_RSQB:
417
418k
      *nextTokPtr = ptr;
418
418k
      return XML_TOK_DATA_CHARS;
419
5.99M
    default:
420
5.99M
      ptr += MINBPC(enc);
421
5.99M
      break;
422
6.52M
    }
423
6.52M
  }
424
36
  *nextTokPtr = ptr;
425
36
  return XML_TOK_DATA_CHARS;
426
418k
}
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
16.1k
                   const char **nextTokPtr) {
433
16.1k
  REQUIRE_CHAR(enc, ptr, end);
434
16.1k
  switch (BYTE_TYPE(enc, ptr)) {
435
16.1k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
436
5
  default:
437
5
    *nextTokPtr = ptr;
438
5
    return XML_TOK_INVALID;
439
16.1k
  }
440
153k
  while (HAS_CHAR(enc, ptr, end)) {
441
153k
    switch (BYTE_TYPE(enc, ptr)) {
442
447k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
443
398
    case BT_S:
444
749
    case BT_CR:
445
2.56k
    case BT_LF:
446
5.93k
      for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
447
5.93k
        switch (BYTE_TYPE(enc, ptr)) {
448
328
        case BT_S:
449
1.25k
        case BT_CR:
450
3.40k
        case BT_LF:
451
3.40k
          break;
452
2.53k
        case BT_GT:
453
2.53k
          *nextTokPtr = ptr + MINBPC(enc);
454
2.53k
          return XML_TOK_END_TAG;
455
2
        default:
456
2
          *nextTokPtr = ptr;
457
2
          return XML_TOK_INVALID;
458
5.93k
        }
459
5.93k
      }
460
26
      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
13.5k
    case BT_GT:
469
13.5k
      *nextTokPtr = ptr + MINBPC(enc);
470
13.5k
      return XML_TOK_END_TAG;
471
5
    default:
472
5
      *nextTokPtr = ptr;
473
5
      return XML_TOK_INVALID;
474
153k
    }
475
153k
  }
476
60
  return XML_TOK_PARTIAL;
477
16.1k
}
xmltok.c:normal_scanEndTag
Line
Count
Source
432
16.1k
                   const char **nextTokPtr) {
433
16.1k
  REQUIRE_CHAR(enc, ptr, end);
434
16.1k
  switch (BYTE_TYPE(enc, ptr)) {
435
16.1k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
436
5
  default:
437
5
    *nextTokPtr = ptr;
438
5
    return XML_TOK_INVALID;
439
16.1k
  }
440
153k
  while (HAS_CHAR(enc, ptr, end)) {
441
153k
    switch (BYTE_TYPE(enc, ptr)) {
442
447k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
443
398
    case BT_S:
444
749
    case BT_CR:
445
2.56k
    case BT_LF:
446
5.93k
      for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
447
5.93k
        switch (BYTE_TYPE(enc, ptr)) {
448
328
        case BT_S:
449
1.25k
        case BT_CR:
450
3.40k
        case BT_LF:
451
3.40k
          break;
452
2.53k
        case BT_GT:
453
2.53k
          *nextTokPtr = ptr + MINBPC(enc);
454
2.53k
          return XML_TOK_END_TAG;
455
2
        default:
456
2
          *nextTokPtr = ptr;
457
2
          return XML_TOK_INVALID;
458
5.93k
        }
459
5.93k
      }
460
26
      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
13.5k
    case BT_GT:
469
13.5k
      *nextTokPtr = ptr + MINBPC(enc);
470
13.5k
      return XML_TOK_END_TAG;
471
5
    default:
472
5
      *nextTokPtr = ptr;
473
5
      return XML_TOK_INVALID;
474
153k
    }
475
153k
  }
476
60
  return XML_TOK_PARTIAL;
477
16.1k
}
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
83.1k
                       const char **nextTokPtr) {
484
83.1k
  if (HAS_CHAR(enc, ptr, end)) {
485
83.1k
    switch (BYTE_TYPE(enc, ptr)) {
486
31.6k
    case BT_DIGIT:
487
83.1k
    case BT_HEX:
488
83.1k
      break;
489
6
    default:
490
6
      *nextTokPtr = ptr;
491
6
      return XML_TOK_INVALID;
492
83.1k
    }
493
302k
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
494
302k
      switch (BYTE_TYPE(enc, ptr)) {
495
148k
      case BT_DIGIT:
496
219k
      case BT_HEX:
497
219k
        break;
498
83.1k
      case BT_SEMI:
499
83.1k
        *nextTokPtr = ptr + MINBPC(enc);
500
83.1k
        return XML_TOK_CHAR_REF;
501
0
      default:
502
0
        *nextTokPtr = ptr;
503
0
        return XML_TOK_INVALID;
504
302k
      }
505
302k
    }
506
83.1k
  }
507
15
  return XML_TOK_PARTIAL;
508
83.1k
}
xmltok.c:normal_scanHexCharRef
Line
Count
Source
483
83.1k
                       const char **nextTokPtr) {
484
83.1k
  if (HAS_CHAR(enc, ptr, end)) {
485
83.1k
    switch (BYTE_TYPE(enc, ptr)) {
486
31.6k
    case BT_DIGIT:
487
83.1k
    case BT_HEX:
488
83.1k
      break;
489
6
    default:
490
6
      *nextTokPtr = ptr;
491
6
      return XML_TOK_INVALID;
492
83.1k
    }
493
302k
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
494
302k
      switch (BYTE_TYPE(enc, ptr)) {
495
148k
      case BT_DIGIT:
496
219k
      case BT_HEX:
497
219k
        break;
498
83.1k
      case BT_SEMI:
499
83.1k
        *nextTokPtr = ptr + MINBPC(enc);
500
83.1k
        return XML_TOK_CHAR_REF;
501
0
      default:
502
0
        *nextTokPtr = ptr;
503
0
        return XML_TOK_INVALID;
504
302k
      }
505
302k
    }
506
83.1k
  }
507
15
  return XML_TOK_PARTIAL;
508
83.1k
}
Unexecuted instantiation: xmltok.c:little2_scanHexCharRef
Unexecuted instantiation: xmltok.c:big2_scanHexCharRef
509
510
/* ptr points to character following "&#" */
511
512
static int PTRCALL
513
PREFIX(scanCharRef)(const ENCODING *enc, const char *ptr, const char *end,
514
85.6k
                    const char **nextTokPtr) {
515
85.6k
  if (HAS_CHAR(enc, ptr, end)) {
516
85.6k
    if (CHAR_MATCHES(enc, ptr, ASCII_x))
517
83.1k
      return PREFIX(scanHexCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
518
2.49k
    switch (BYTE_TYPE(enc, ptr)) {
519
2.49k
    case BT_DIGIT:
520
2.49k
      break;
521
5
    default:
522
5
      *nextTokPtr = ptr;
523
5
      return XML_TOK_INVALID;
524
2.49k
    }
525
8.42k
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
526
8.42k
      switch (BYTE_TYPE(enc, ptr)) {
527
5.94k
      case BT_DIGIT:
528
5.94k
        break;
529
2.48k
      case BT_SEMI:
530
2.48k
        *nextTokPtr = ptr + MINBPC(enc);
531
2.48k
        return XML_TOK_CHAR_REF;
532
1
      default:
533
1
        *nextTokPtr = ptr;
534
1
        return XML_TOK_INVALID;
535
8.42k
      }
536
8.42k
    }
537
2.49k
  }
538
9
  return XML_TOK_PARTIAL;
539
85.6k
}
xmltok.c:normal_scanCharRef
Line
Count
Source
514
85.6k
                    const char **nextTokPtr) {
515
85.6k
  if (HAS_CHAR(enc, ptr, end)) {
516
85.6k
    if (CHAR_MATCHES(enc, ptr, ASCII_x))
517
83.1k
      return PREFIX(scanHexCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
518
2.49k
    switch (BYTE_TYPE(enc, ptr)) {
519
2.49k
    case BT_DIGIT:
520
2.49k
      break;
521
5
    default:
522
5
      *nextTokPtr = ptr;
523
5
      return XML_TOK_INVALID;
524
2.49k
    }
525
8.42k
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
526
8.42k
      switch (BYTE_TYPE(enc, ptr)) {
527
5.94k
      case BT_DIGIT:
528
5.94k
        break;
529
2.48k
      case BT_SEMI:
530
2.48k
        *nextTokPtr = ptr + MINBPC(enc);
531
2.48k
        return XML_TOK_CHAR_REF;
532
1
      default:
533
1
        *nextTokPtr = ptr;
534
1
        return XML_TOK_INVALID;
535
8.42k
      }
536
8.42k
    }
537
2.49k
  }
538
9
  return XML_TOK_PARTIAL;
539
85.6k
}
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
277k
                const char **nextTokPtr) {
546
277k
  REQUIRE_CHAR(enc, ptr, end);
547
277k
  switch (BYTE_TYPE(enc, ptr)) {
548
98.9k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
549
85.6k
  case BT_NUM:
550
85.6k
    return PREFIX(scanCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
551
2
  default:
552
2
    *nextTokPtr = ptr;
553
2
    return XML_TOK_INVALID;
554
277k
  }
555
938k
  while (HAS_CHAR(enc, ptr, end)) {
556
938k
    switch (BYTE_TYPE(enc, ptr)) {
557
2.59M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
558
192k
    case BT_SEMI:
559
192k
      *nextTokPtr = ptr + MINBPC(enc);
560
192k
      return XML_TOK_ENTITY_REF;
561
6
    default:
562
6
      *nextTokPtr = ptr;
563
6
      return XML_TOK_INVALID;
564
938k
    }
565
938k
  }
566
33
  return XML_TOK_PARTIAL;
567
192k
}
xmltok.c:normal_scanRef
Line
Count
Source
545
277k
                const char **nextTokPtr) {
546
277k
  REQUIRE_CHAR(enc, ptr, end);
547
277k
  switch (BYTE_TYPE(enc, ptr)) {
548
98.9k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
549
85.6k
  case BT_NUM:
550
85.6k
    return PREFIX(scanCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
551
2
  default:
552
2
    *nextTokPtr = ptr;
553
2
    return XML_TOK_INVALID;
554
277k
  }
555
938k
  while (HAS_CHAR(enc, ptr, end)) {
556
938k
    switch (BYTE_TYPE(enc, ptr)) {
557
2.59M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
558
192k
    case BT_SEMI:
559
192k
      *nextTokPtr = ptr + MINBPC(enc);
560
192k
      return XML_TOK_ENTITY_REF;
561
6
    default:
562
6
      *nextTokPtr = ptr;
563
6
      return XML_TOK_INVALID;
564
938k
    }
565
938k
  }
566
33
  return XML_TOK_PARTIAL;
567
192k
}
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
19.3k
                 const char **nextTokPtr) {
574
#  ifdef XML_NS
575
  int hadColon = 0;
576
#  endif
577
1.16M
  while (HAS_CHAR(enc, ptr, end)) {
578
1.16M
    switch (BYTE_TYPE(enc, ptr)) {
579
703k
      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
999
    case BT_S:
598
5.91k
    case BT_CR:
599
6.67k
    case BT_LF:
600
13.2k
      for (;;) {
601
13.2k
        int t;
602
603
13.2k
        ptr += MINBPC(enc);
604
13.2k
        REQUIRE_CHAR(enc, ptr, end);
605
13.2k
        t = BYTE_TYPE(enc, ptr);
606
13.2k
        if (t == BT_EQUALS)
607
6.65k
          break;
608
6.58k
        switch (t) {
609
1.38k
        case BT_S:
610
1.75k
        case BT_LF:
611
6.58k
        case BT_CR:
612
6.58k
          break;
613
3
        default:
614
3
          *nextTokPtr = ptr;
615
3
          return XML_TOK_INVALID;
616
6.58k
        }
617
6.58k
      }
618
      /* fall through */
619
966k
    case BT_EQUALS: {
620
966k
      int open;
621
#  ifdef XML_NS
622
      hadColon = 0;
623
#  endif
624
988k
      for (;;) {
625
988k
        ptr += MINBPC(enc);
626
988k
        REQUIRE_CHAR(enc, ptr, end);
627
988k
        open = BYTE_TYPE(enc, ptr);
628
988k
        if (open == BT_QUOT || open == BT_APOS)
629
966k
          break;
630
21.6k
        switch (open) {
631
4.09k
        case BT_S:
632
8.60k
        case BT_LF:
633
21.6k
        case BT_CR:
634
21.6k
          break;
635
4
        default:
636
4
          *nextTokPtr = ptr;
637
4
          return XML_TOK_INVALID;
638
21.6k
        }
639
21.6k
      }
640
966k
      ptr += MINBPC(enc);
641
      /* in attribute value */
642
8.97M
      for (;;) {
643
8.97M
        int t;
644
8.97M
        REQUIRE_CHAR(enc, ptr, end);
645
8.97M
        t = BYTE_TYPE(enc, ptr);
646
8.97M
        if (t == open)
647
966k
          break;
648
8.01M
        switch (t) {
649
132k
          INVALID_CASES(ptr, nextTokPtr)
650
74.0k
        case BT_AMP: {
651
74.0k
          int tok = PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, &ptr);
652
74.0k
          if (tok <= 0) {
653
16
            if (tok == XML_TOK_INVALID)
654
6
              *nextTokPtr = ptr;
655
16
            return tok;
656
16
          }
657
74.0k
          break;
658
74.0k
        }
659
74.0k
        case BT_LT:
660
2
          *nextTokPtr = ptr;
661
2
          return XML_TOK_INVALID;
662
7.87M
        default:
663
7.87M
          ptr += MINBPC(enc);
664
7.87M
          break;
665
8.01M
        }
666
8.01M
      }
667
966k
      ptr += MINBPC(enc);
668
966k
      REQUIRE_CHAR(enc, ptr, end);
669
966k
      switch (BYTE_TYPE(enc, ptr)) {
670
493k
      case BT_S:
671
933k
      case BT_CR:
672
953k
      case BT_LF:
673
953k
        break;
674
10.3k
      case BT_SOL:
675
10.3k
        goto sol;
676
2.94k
      case BT_GT:
677
2.94k
        goto gt;
678
1
      default:
679
1
        *nextTokPtr = ptr;
680
1
        return XML_TOK_INVALID;
681
966k
      }
682
      /* ptr points to closing quote */
683
1.04M
      for (;;) {
684
1.04M
        ptr += MINBPC(enc);
685
1.04M
        REQUIRE_CHAR(enc, ptr, end);
686
1.04M
        switch (BYTE_TYPE(enc, ptr)) {
687
944k
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
688
64.8k
        case BT_S:
689
82.4k
        case BT_CR:
690
93.7k
        case BT_LF:
691
93.7k
          continue;
692
273
        case BT_GT:
693
3.21k
        gt:
694
3.21k
          *nextTokPtr = ptr + MINBPC(enc);
695
3.21k
          return XML_TOK_START_TAG_WITH_ATTS;
696
5.59k
        case BT_SOL:
697
15.9k
        sol:
698
15.9k
          ptr += MINBPC(enc);
699
15.9k
          REQUIRE_CHAR(enc, ptr, end);
700
15.9k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
701
1
            *nextTokPtr = ptr;
702
1
            return XML_TOK_INVALID;
703
1
          }
704
15.9k
          *nextTokPtr = ptr + MINBPC(enc);
705
15.9k
          return XML_TOK_EMPTY_ELEMENT_WITH_ATTS;
706
2
        default:
707
2
          *nextTokPtr = ptr;
708
2
          return XML_TOK_INVALID;
709
1.04M
        }
710
947k
        break;
711
1.04M
      }
712
947k
      break;
713
953k
    }
714
947k
    default:
715
4
      *nextTokPtr = ptr;
716
4
      return XML_TOK_INVALID;
717
1.16M
    }
718
1.16M
  }
719
24
  return XML_TOK_PARTIAL;
720
19.3k
}
xmltok.c:normal_scanAtts
Line
Count
Source
573
19.3k
                 const char **nextTokPtr) {
574
#  ifdef XML_NS
575
  int hadColon = 0;
576
#  endif
577
1.16M
  while (HAS_CHAR(enc, ptr, end)) {
578
1.16M
    switch (BYTE_TYPE(enc, ptr)) {
579
703k
      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
999
    case BT_S:
598
5.91k
    case BT_CR:
599
6.67k
    case BT_LF:
600
13.2k
      for (;;) {
601
13.2k
        int t;
602
603
13.2k
        ptr += MINBPC(enc);
604
13.2k
        REQUIRE_CHAR(enc, ptr, end);
605
13.2k
        t = BYTE_TYPE(enc, ptr);
606
13.2k
        if (t == BT_EQUALS)
607
6.65k
          break;
608
6.58k
        switch (t) {
609
1.38k
        case BT_S:
610
1.75k
        case BT_LF:
611
6.58k
        case BT_CR:
612
6.58k
          break;
613
3
        default:
614
3
          *nextTokPtr = ptr;
615
3
          return XML_TOK_INVALID;
616
6.58k
        }
617
6.58k
      }
618
      /* fall through */
619
966k
    case BT_EQUALS: {
620
966k
      int open;
621
#  ifdef XML_NS
622
      hadColon = 0;
623
#  endif
624
988k
      for (;;) {
625
988k
        ptr += MINBPC(enc);
626
988k
        REQUIRE_CHAR(enc, ptr, end);
627
988k
        open = BYTE_TYPE(enc, ptr);
628
988k
        if (open == BT_QUOT || open == BT_APOS)
629
966k
          break;
630
21.6k
        switch (open) {
631
4.09k
        case BT_S:
632
8.60k
        case BT_LF:
633
21.6k
        case BT_CR:
634
21.6k
          break;
635
4
        default:
636
4
          *nextTokPtr = ptr;
637
4
          return XML_TOK_INVALID;
638
21.6k
        }
639
21.6k
      }
640
966k
      ptr += MINBPC(enc);
641
      /* in attribute value */
642
8.97M
      for (;;) {
643
8.97M
        int t;
644
8.97M
        REQUIRE_CHAR(enc, ptr, end);
645
8.97M
        t = BYTE_TYPE(enc, ptr);
646
8.97M
        if (t == open)
647
966k
          break;
648
8.01M
        switch (t) {
649
132k
          INVALID_CASES(ptr, nextTokPtr)
650
74.0k
        case BT_AMP: {
651
74.0k
          int tok = PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, &ptr);
652
74.0k
          if (tok <= 0) {
653
16
            if (tok == XML_TOK_INVALID)
654
6
              *nextTokPtr = ptr;
655
16
            return tok;
656
16
          }
657
74.0k
          break;
658
74.0k
        }
659
74.0k
        case BT_LT:
660
2
          *nextTokPtr = ptr;
661
2
          return XML_TOK_INVALID;
662
7.87M
        default:
663
7.87M
          ptr += MINBPC(enc);
664
7.87M
          break;
665
8.01M
        }
666
8.01M
      }
667
966k
      ptr += MINBPC(enc);
668
966k
      REQUIRE_CHAR(enc, ptr, end);
669
966k
      switch (BYTE_TYPE(enc, ptr)) {
670
493k
      case BT_S:
671
933k
      case BT_CR:
672
953k
      case BT_LF:
673
953k
        break;
674
10.3k
      case BT_SOL:
675
10.3k
        goto sol;
676
2.94k
      case BT_GT:
677
2.94k
        goto gt;
678
1
      default:
679
1
        *nextTokPtr = ptr;
680
1
        return XML_TOK_INVALID;
681
966k
      }
682
      /* ptr points to closing quote */
683
1.04M
      for (;;) {
684
1.04M
        ptr += MINBPC(enc);
685
1.04M
        REQUIRE_CHAR(enc, ptr, end);
686
1.04M
        switch (BYTE_TYPE(enc, ptr)) {
687
944k
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
688
64.8k
        case BT_S:
689
82.4k
        case BT_CR:
690
93.7k
        case BT_LF:
691
93.7k
          continue;
692
273
        case BT_GT:
693
3.21k
        gt:
694
3.21k
          *nextTokPtr = ptr + MINBPC(enc);
695
3.21k
          return XML_TOK_START_TAG_WITH_ATTS;
696
5.59k
        case BT_SOL:
697
15.9k
        sol:
698
15.9k
          ptr += MINBPC(enc);
699
15.9k
          REQUIRE_CHAR(enc, ptr, end);
700
15.9k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
701
1
            *nextTokPtr = ptr;
702
1
            return XML_TOK_INVALID;
703
1
          }
704
15.9k
          *nextTokPtr = ptr + MINBPC(enc);
705
15.9k
          return XML_TOK_EMPTY_ELEMENT_WITH_ATTS;
706
2
        default:
707
2
          *nextTokPtr = ptr;
708
2
          return XML_TOK_INVALID;
709
1.04M
        }
710
947k
        break;
711
1.04M
      }
712
947k
      break;
713
953k
    }
714
947k
    default:
715
4
      *nextTokPtr = ptr;
716
4
      return XML_TOK_INVALID;
717
1.16M
    }
718
1.16M
  }
719
24
  return XML_TOK_PARTIAL;
720
19.3k
}
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
238k
               const char **nextTokPtr) {
727
#  ifdef XML_NS
728
  int hadColon;
729
#  endif
730
238k
  REQUIRE_CHAR(enc, ptr, end);
731
238k
  switch (BYTE_TYPE(enc, ptr)) {
732
187k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
733
5.55k
  case BT_EXCL:
734
5.55k
    ptr += MINBPC(enc);
735
5.55k
    REQUIRE_CHAR(enc, ptr, end);
736
5.54k
    switch (BYTE_TYPE(enc, ptr)) {
737
4.42k
    case BT_MINUS:
738
4.42k
      return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
739
1.12k
    case BT_LSQB:
740
1.12k
      return PREFIX(scanCdataSection)(enc, ptr + MINBPC(enc), end, nextTokPtr);
741
5.54k
    }
742
1
    *nextTokPtr = ptr;
743
1
    return XML_TOK_INVALID;
744
8.48k
  case BT_QUEST:
745
8.48k
    return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
746
16.1k
  case BT_SOL:
747
16.1k
    return PREFIX(scanEndTag)(enc, ptr + MINBPC(enc), end, nextTokPtr);
748
3
  default:
749
3
    *nextTokPtr = ptr;
750
3
    return XML_TOK_INVALID;
751
238k
  }
752
#  ifdef XML_NS
753
  hadColon = 0;
754
#  endif
755
  /* we have a start-tag */
756
5.57M
  while (HAS_CHAR(enc, ptr, end)) {
757
5.57M
    switch (BYTE_TYPE(enc, ptr)) {
758
21.3M
      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
16.3k
    case BT_S:
777
20.5k
    case BT_CR:
778
25.1k
    case BT_LF: {
779
25.1k
      ptr += MINBPC(enc);
780
35.0k
      while (HAS_CHAR(enc, ptr, end)) {
781
35.0k
        switch (BYTE_TYPE(enc, ptr)) {
782
13.3k
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
783
570
        case BT_GT:
784
570
          goto gt;
785
5.18k
        case BT_SOL:
786
5.18k
          goto sol;
787
1.16k
        case BT_S:
788
9.41k
        case BT_CR:
789
9.91k
        case BT_LF:
790
9.91k
          ptr += MINBPC(enc);
791
9.91k
          continue;
792
6
        default:
793
6
          *nextTokPtr = ptr;
794
6
          return XML_TOK_INVALID;
795
35.0k
        }
796
19.3k
        return PREFIX(scanAtts)(enc, ptr, end, nextTokPtr);
797
35.0k
      }
798
22
      return XML_TOK_PARTIAL;
799
25.1k
    }
800
165k
    case BT_GT:
801
166k
    gt:
802
166k
      *nextTokPtr = ptr + MINBPC(enc);
803
166k
      return XML_TOK_START_TAG_NO_ATTS;
804
17.2k
    case BT_SOL:
805
22.4k
    sol:
806
22.4k
      ptr += MINBPC(enc);
807
22.4k
      REQUIRE_CHAR(enc, ptr, end);
808
22.4k
      if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
809
8
        *nextTokPtr = ptr;
810
8
        return XML_TOK_INVALID;
811
8
      }
812
22.4k
      *nextTokPtr = ptr + MINBPC(enc);
813
22.4k
      return XML_TOK_EMPTY_ELEMENT_NO_ATTS;
814
3
    default:
815
3
      *nextTokPtr = ptr;
816
3
      return XML_TOK_INVALID;
817
5.57M
    }
818
5.57M
  }
819
56
  return XML_TOK_PARTIAL;
820
208k
}
xmltok.c:normal_scanLt
Line
Count
Source
726
238k
               const char **nextTokPtr) {
727
#  ifdef XML_NS
728
  int hadColon;
729
#  endif
730
238k
  REQUIRE_CHAR(enc, ptr, end);
731
238k
  switch (BYTE_TYPE(enc, ptr)) {
732
187k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
733
5.55k
  case BT_EXCL:
734
5.55k
    ptr += MINBPC(enc);
735
5.55k
    REQUIRE_CHAR(enc, ptr, end);
736
5.54k
    switch (BYTE_TYPE(enc, ptr)) {
737
4.42k
    case BT_MINUS:
738
4.42k
      return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
739
1.12k
    case BT_LSQB:
740
1.12k
      return PREFIX(scanCdataSection)(enc, ptr + MINBPC(enc), end, nextTokPtr);
741
5.54k
    }
742
1
    *nextTokPtr = ptr;
743
1
    return XML_TOK_INVALID;
744
8.48k
  case BT_QUEST:
745
8.48k
    return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
746
16.1k
  case BT_SOL:
747
16.1k
    return PREFIX(scanEndTag)(enc, ptr + MINBPC(enc), end, nextTokPtr);
748
3
  default:
749
3
    *nextTokPtr = ptr;
750
3
    return XML_TOK_INVALID;
751
238k
  }
752
#  ifdef XML_NS
753
  hadColon = 0;
754
#  endif
755
  /* we have a start-tag */
756
5.57M
  while (HAS_CHAR(enc, ptr, end)) {
757
5.57M
    switch (BYTE_TYPE(enc, ptr)) {
758
21.3M
      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
16.3k
    case BT_S:
777
20.5k
    case BT_CR:
778
25.1k
    case BT_LF: {
779
25.1k
      ptr += MINBPC(enc);
780
35.0k
      while (HAS_CHAR(enc, ptr, end)) {
781
35.0k
        switch (BYTE_TYPE(enc, ptr)) {
782
13.3k
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
783
570
        case BT_GT:
784
570
          goto gt;
785
5.18k
        case BT_SOL:
786
5.18k
          goto sol;
787
1.16k
        case BT_S:
788
9.41k
        case BT_CR:
789
9.91k
        case BT_LF:
790
9.91k
          ptr += MINBPC(enc);
791
9.91k
          continue;
792
6
        default:
793
6
          *nextTokPtr = ptr;
794
6
          return XML_TOK_INVALID;
795
35.0k
        }
796
19.3k
        return PREFIX(scanAtts)(enc, ptr, end, nextTokPtr);
797
35.0k
      }
798
22
      return XML_TOK_PARTIAL;
799
25.1k
    }
800
165k
    case BT_GT:
801
166k
    gt:
802
166k
      *nextTokPtr = ptr + MINBPC(enc);
803
166k
      return XML_TOK_START_TAG_NO_ATTS;
804
17.2k
    case BT_SOL:
805
22.4k
    sol:
806
22.4k
      ptr += MINBPC(enc);
807
22.4k
      REQUIRE_CHAR(enc, ptr, end);
808
22.4k
      if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
809
8
        *nextTokPtr = ptr;
810
8
        return XML_TOK_INVALID;
811
8
      }
812
22.4k
      *nextTokPtr = ptr + MINBPC(enc);
813
22.4k
      return XML_TOK_EMPTY_ELEMENT_NO_ATTS;
814
3
    default:
815
3
      *nextTokPtr = ptr;
816
3
      return XML_TOK_INVALID;
817
5.57M
    }
818
5.57M
  }
819
56
  return XML_TOK_PARTIAL;
820
208k
}
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
1.15M
                   const char **nextTokPtr) {
825
1.15M
  if (ptr >= end)
826
1.63k
    return XML_TOK_NONE;
827
1.15M
  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
1.15M
  switch (BYTE_TYPE(enc, ptr)) {
837
238k
  case BT_LT:
838
238k
    return PREFIX(scanLt)(enc, ptr + MINBPC(enc), end, nextTokPtr);
839
18.1k
  case BT_AMP:
840
18.1k
    return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
841
394k
  case BT_CR:
842
394k
    ptr += MINBPC(enc);
843
394k
    if (! HAS_CHAR(enc, ptr, end))
844
14
      return XML_TOK_TRAILING_CR;
845
394k
    if (BYTE_TYPE(enc, ptr) == BT_LF)
846
71.0k
      ptr += MINBPC(enc);
847
394k
    *nextTokPtr = ptr;
848
394k
    return XML_TOK_DATA_NEWLINE;
849
253k
  case BT_LF:
850
253k
    *nextTokPtr = ptr + MINBPC(enc);
851
253k
    return XML_TOK_DATA_NEWLINE;
852
25.6k
  case BT_RSQB:
853
25.6k
    ptr += MINBPC(enc);
854
25.6k
    if (! HAS_CHAR(enc, ptr, end))
855
6
      return XML_TOK_TRAILING_RSQB;
856
25.6k
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
857
10.0k
      break;
858
15.5k
    ptr += MINBPC(enc);
859
15.5k
    if (! HAS_CHAR(enc, ptr, end))
860
2
      return XML_TOK_TRAILING_RSQB;
861
15.5k
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
862
15.5k
      ptr -= MINBPC(enc);
863
15.5k
      break;
864
15.5k
    }
865
2
    *nextTokPtr = ptr;
866
2
    return XML_TOK_INVALID;
867
48.9k
    INVALID_CASES(ptr, nextTokPtr)
868
199k
  default:
869
199k
    ptr += MINBPC(enc);
870
199k
    break;
871
1.15M
  }
872
5.03M
  while (HAS_CHAR(enc, ptr, end)) {
873
5.03M
    switch (BYTE_TYPE(enc, ptr)) {
874
0
#  define LEAD_CASE(n)                                                         \
875
44.8k
  case BT_LEAD##n:                                                             \
876
44.8k
    if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) {                       \
877
16
      *nextTokPtr = ptr;                                                       \
878
16
      return XML_TOK_DATA_CHARS;                                               \
879
16
    }                                                                          \
880
44.7k
    ptr += n;                                                                  \
881
44.7k
    break;
882
26.5k
      LEAD_CASE(2)
883
8.66k
      LEAD_CASE(3)
884
9.54k
      LEAD_CASE(4)
885
0
#  undef LEAD_CASE
886
151k
    case BT_RSQB:
887
151k
      if (HAS_CHARS(enc, ptr, end, 2)) {
888
151k
        if (! CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_RSQB)) {
889
49.0k
          ptr += MINBPC(enc);
890
49.0k
          break;
891
49.0k
        }
892
102k
        if (HAS_CHARS(enc, ptr, end, 3)) {
893
102k
          if (! CHAR_MATCHES(enc, ptr + 2 * MINBPC(enc), ASCII_GT)) {
894
102k
            ptr += MINBPC(enc);
895
102k
            break;
896
102k
          }
897
3
          *nextTokPtr = ptr + 2 * MINBPC(enc);
898
3
          return XML_TOK_INVALID;
899
102k
        }
900
102k
      }
901
      /* fall through */
902
9.43k
    case BT_AMP:
903
56.8k
    case BT_LT:
904
56.8k
    case BT_NONXML:
905
56.8k
    case BT_MALFORM:
906
56.8k
    case BT_TRAIL:
907
180k
    case BT_CR:
908
249k
    case BT_LF:
909
249k
      *nextTokPtr = ptr;
910
249k
      return XML_TOK_DATA_CHARS;
911
4.59M
    default:
912
4.59M
      ptr += MINBPC(enc);
913
4.59M
      break;
914
5.03M
    }
915
5.03M
  }
916
705
  *nextTokPtr = ptr;
917
705
  return XML_TOK_DATA_CHARS;
918
249k
}
xmltok.c:normal_contentTok
Line
Count
Source
824
1.15M
                   const char **nextTokPtr) {
825
1.15M
  if (ptr >= end)
826
1.63k
    return XML_TOK_NONE;
827
1.15M
  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
1.15M
  switch (BYTE_TYPE(enc, ptr)) {
837
238k
  case BT_LT:
838
238k
    return PREFIX(scanLt)(enc, ptr + MINBPC(enc), end, nextTokPtr);
839
18.1k
  case BT_AMP:
840
18.1k
    return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
841
394k
  case BT_CR:
842
394k
    ptr += MINBPC(enc);
843
394k
    if (! HAS_CHAR(enc, ptr, end))
844
14
      return XML_TOK_TRAILING_CR;
845
394k
    if (BYTE_TYPE(enc, ptr) == BT_LF)
846
71.0k
      ptr += MINBPC(enc);
847
394k
    *nextTokPtr = ptr;
848
394k
    return XML_TOK_DATA_NEWLINE;
849
253k
  case BT_LF:
850
253k
    *nextTokPtr = ptr + MINBPC(enc);
851
253k
    return XML_TOK_DATA_NEWLINE;
852
25.6k
  case BT_RSQB:
853
25.6k
    ptr += MINBPC(enc);
854
25.6k
    if (! HAS_CHAR(enc, ptr, end))
855
6
      return XML_TOK_TRAILING_RSQB;
856
25.6k
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
857
10.0k
      break;
858
15.5k
    ptr += MINBPC(enc);
859
15.5k
    if (! HAS_CHAR(enc, ptr, end))
860
2
      return XML_TOK_TRAILING_RSQB;
861
15.5k
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
862
15.5k
      ptr -= MINBPC(enc);
863
15.5k
      break;
864
15.5k
    }
865
2
    *nextTokPtr = ptr;
866
2
    return XML_TOK_INVALID;
867
48.9k
    INVALID_CASES(ptr, nextTokPtr)
868
199k
  default:
869
199k
    ptr += MINBPC(enc);
870
199k
    break;
871
1.15M
  }
872
5.03M
  while (HAS_CHAR(enc, ptr, end)) {
873
5.03M
    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
26.5k
      LEAD_CASE(2)
883
8.66k
      LEAD_CASE(3)
884
9.54k
      LEAD_CASE(4)
885
0
#  undef LEAD_CASE
886
151k
    case BT_RSQB:
887
151k
      if (HAS_CHARS(enc, ptr, end, 2)) {
888
151k
        if (! CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_RSQB)) {
889
49.0k
          ptr += MINBPC(enc);
890
49.0k
          break;
891
49.0k
        }
892
102k
        if (HAS_CHARS(enc, ptr, end, 3)) {
893
102k
          if (! CHAR_MATCHES(enc, ptr + 2 * MINBPC(enc), ASCII_GT)) {
894
102k
            ptr += MINBPC(enc);
895
102k
            break;
896
102k
          }
897
3
          *nextTokPtr = ptr + 2 * MINBPC(enc);
898
3
          return XML_TOK_INVALID;
899
102k
        }
900
102k
      }
901
      /* fall through */
902
9.43k
    case BT_AMP:
903
56.8k
    case BT_LT:
904
56.8k
    case BT_NONXML:
905
56.8k
    case BT_MALFORM:
906
56.8k
    case BT_TRAIL:
907
180k
    case BT_CR:
908
249k
    case BT_LF:
909
249k
      *nextTokPtr = ptr;
910
249k
      return XML_TOK_DATA_CHARS;
911
4.59M
    default:
912
4.59M
      ptr += MINBPC(enc);
913
4.59M
      break;
914
5.03M
    }
915
5.03M
  }
916
705
  *nextTokPtr = ptr;
917
705
  return XML_TOK_DATA_CHARS;
918
249k
}
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
4.08k
                    const char **nextTokPtr) {
925
4.08k
  REQUIRE_CHAR(enc, ptr, end);
926
4.06k
  switch (BYTE_TYPE(enc, ptr)) {
927
3.37k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
928
621
  case BT_S:
929
906
  case BT_LF:
930
1.31k
  case BT_CR:
931
1.31k
  case BT_PERCNT:
932
1.31k
    *nextTokPtr = ptr;
933
1.31k
    return XML_TOK_PERCENT;
934
1
  default:
935
1
    *nextTokPtr = ptr;
936
1
    return XML_TOK_INVALID;
937
4.06k
  }
938
27.6k
  while (HAS_CHAR(enc, ptr, end)) {
939
27.6k
    switch (BYTE_TYPE(enc, ptr)) {
940
74.8k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
941
2.67k
    case BT_SEMI:
942
2.67k
      *nextTokPtr = ptr + MINBPC(enc);
943
2.67k
      return XML_TOK_PARAM_ENTITY_REF;
944
8
    default:
945
8
      *nextTokPtr = ptr;
946
8
      return XML_TOK_INVALID;
947
27.6k
    }
948
27.6k
  }
949
32
  return XML_TOK_PARTIAL;
950
2.73k
}
xmltok.c:normal_scanPercent
Line
Count
Source
924
4.08k
                    const char **nextTokPtr) {
925
4.08k
  REQUIRE_CHAR(enc, ptr, end);
926
4.06k
  switch (BYTE_TYPE(enc, ptr)) {
927
3.37k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
928
621
  case BT_S:
929
906
  case BT_LF:
930
1.31k
  case BT_CR:
931
1.31k
  case BT_PERCNT:
932
1.31k
    *nextTokPtr = ptr;
933
1.31k
    return XML_TOK_PERCENT;
934
1
  default:
935
1
    *nextTokPtr = ptr;
936
1
    return XML_TOK_INVALID;
937
4.06k
  }
938
27.6k
  while (HAS_CHAR(enc, ptr, end)) {
939
27.6k
    switch (BYTE_TYPE(enc, ptr)) {
940
74.8k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
941
2.67k
    case BT_SEMI:
942
2.67k
      *nextTokPtr = ptr + MINBPC(enc);
943
2.67k
      return XML_TOK_PARAM_ENTITY_REF;
944
8
    default:
945
8
      *nextTokPtr = ptr;
946
8
      return XML_TOK_INVALID;
947
27.6k
    }
948
27.6k
  }
949
32
  return XML_TOK_PARTIAL;
950
2.73k
}
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
47.8k
                      const char **nextTokPtr) {
955
47.8k
  REQUIRE_CHAR(enc, ptr, end);
956
47.8k
  switch (BYTE_TYPE(enc, ptr)) {
957
47.5k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
958
2
  default:
959
2
    *nextTokPtr = ptr;
960
2
    return XML_TOK_INVALID;
961
47.8k
  }
962
395k
  while (HAS_CHAR(enc, ptr, end)) {
963
395k
    switch (BYTE_TYPE(enc, ptr)) {
964
1.24M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
965
32.8k
    case BT_CR:
966
44.1k
    case BT_LF:
967
44.4k
    case BT_S:
968
44.6k
    case BT_RPAR:
969
47.4k
    case BT_GT:
970
47.4k
    case BT_PERCNT:
971
47.6k
    case BT_VERBAR:
972
47.6k
      *nextTokPtr = ptr;
973
47.6k
      return XML_TOK_POUND_NAME;
974
8
    default:
975
8
      *nextTokPtr = ptr;
976
8
      return XML_TOK_INVALID;
977
395k
    }
978
395k
  }
979
136
  return -XML_TOK_POUND_NAME;
980
47.8k
}
xmltok.c:normal_scanPoundName
Line
Count
Source
954
47.8k
                      const char **nextTokPtr) {
955
47.8k
  REQUIRE_CHAR(enc, ptr, end);
956
47.8k
  switch (BYTE_TYPE(enc, ptr)) {
957
47.5k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
958
2
  default:
959
2
    *nextTokPtr = ptr;
960
2
    return XML_TOK_INVALID;
961
47.8k
  }
962
395k
  while (HAS_CHAR(enc, ptr, end)) {
963
395k
    switch (BYTE_TYPE(enc, ptr)) {
964
1.24M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
965
32.8k
    case BT_CR:
966
44.1k
    case BT_LF:
967
44.4k
    case BT_S:
968
44.6k
    case BT_RPAR:
969
47.4k
    case BT_GT:
970
47.4k
    case BT_PERCNT:
971
47.6k
    case BT_VERBAR:
972
47.6k
      *nextTokPtr = ptr;
973
47.6k
      return XML_TOK_POUND_NAME;
974
8
    default:
975
8
      *nextTokPtr = ptr;
976
8
      return XML_TOK_INVALID;
977
395k
    }
978
395k
  }
979
136
  return -XML_TOK_POUND_NAME;
980
47.8k
}
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
47.8k
                const char **nextTokPtr) {
985
5.98M
  while (HAS_CHAR(enc, ptr, end)) {
986
5.98M
    int t = BYTE_TYPE(enc, ptr);
987
5.98M
    switch (t) {
988
128k
      INVALID_CASES(ptr, nextTokPtr)
989
6.11k
    case BT_QUOT:
990
50.6k
    case BT_APOS:
991
50.6k
      ptr += MINBPC(enc);
992
50.6k
      if (t != open)
993
2.95k
        break;
994
47.6k
      if (! HAS_CHAR(enc, ptr, end))
995
327
        return -XML_TOK_LITERAL;
996
47.3k
      *nextTokPtr = ptr;
997
47.3k
      switch (BYTE_TYPE(enc, ptr)) {
998
4.48k
      case BT_S:
999
7.85k
      case BT_CR:
1000
18.0k
      case BT_LF:
1001
47.1k
      case BT_GT:
1002
47.1k
      case BT_PERCNT:
1003
47.3k
      case BT_LSQB:
1004
47.3k
        return XML_TOK_LITERAL;
1005
6
      default:
1006
6
        return XML_TOK_INVALID;
1007
47.3k
      }
1008
5.86M
    default:
1009
5.86M
      ptr += MINBPC(enc);
1010
5.86M
      break;
1011
5.98M
    }
1012
5.98M
  }
1013
86
  return XML_TOK_PARTIAL;
1014
47.8k
}
xmltok.c:normal_scanLit
Line
Count
Source
984
47.8k
                const char **nextTokPtr) {
985
5.98M
  while (HAS_CHAR(enc, ptr, end)) {
986
5.98M
    int t = BYTE_TYPE(enc, ptr);
987
5.98M
    switch (t) {
988
128k
      INVALID_CASES(ptr, nextTokPtr)
989
6.11k
    case BT_QUOT:
990
50.6k
    case BT_APOS:
991
50.6k
      ptr += MINBPC(enc);
992
50.6k
      if (t != open)
993
2.95k
        break;
994
47.6k
      if (! HAS_CHAR(enc, ptr, end))
995
327
        return -XML_TOK_LITERAL;
996
47.3k
      *nextTokPtr = ptr;
997
47.3k
      switch (BYTE_TYPE(enc, ptr)) {
998
4.48k
      case BT_S:
999
7.85k
      case BT_CR:
1000
18.0k
      case BT_LF:
1001
47.1k
      case BT_GT:
1002
47.1k
      case BT_PERCNT:
1003
47.3k
      case BT_LSQB:
1004
47.3k
        return XML_TOK_LITERAL;
1005
6
      default:
1006
6
        return XML_TOK_INVALID;
1007
47.3k
      }
1008
5.86M
    default:
1009
5.86M
      ptr += MINBPC(enc);
1010
5.86M
      break;
1011
5.98M
    }
1012
5.98M
  }
1013
86
  return XML_TOK_PARTIAL;
1014
47.8k
}
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
2.93M
                  const char **nextTokPtr) {
1019
2.93M
  int tok;
1020
2.93M
  if (ptr >= end)
1021
3.82k
    return XML_TOK_NONE;
1022
2.93M
  if (MINBPC(enc) > 1) {
1023
128
    size_t n = end - ptr;
1024
128
    if (n & (MINBPC(enc) - 1)) {
1025
18
      n &= ~(MINBPC(enc) - 1);
1026
18
      if (n == 0)
1027
4
        return XML_TOK_PARTIAL;
1028
14
      end = ptr + n;
1029
14
    }
1030
128
  }
1031
2.93M
  switch (BYTE_TYPE(enc, ptr)) {
1032
4.05k
  case BT_QUOT:
1033
4.05k
    return PREFIX(scanLit)(BT_QUOT, enc, ptr + MINBPC(enc), end, nextTokPtr);
1034
43.7k
  case BT_APOS:
1035
43.7k
    return PREFIX(scanLit)(BT_APOS, enc, ptr + MINBPC(enc), end, nextTokPtr);
1036
70.2k
  case BT_LT: {
1037
70.2k
    ptr += MINBPC(enc);
1038
70.2k
    REQUIRE_CHAR(enc, ptr, end);
1039
70.1k
    switch (BYTE_TYPE(enc, ptr)) {
1040
62.9k
    case BT_EXCL:
1041
62.9k
      return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1042
4.59k
    case BT_QUEST:
1043
4.59k
      return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1044
2.10k
    case BT_NMSTRT:
1045
2.65k
    case BT_HEX:
1046
2.65k
    case BT_NONASCII:
1047
2.66k
    case BT_LEAD2:
1048
2.68k
    case BT_LEAD3:
1049
2.68k
    case BT_LEAD4:
1050
2.68k
      *nextTokPtr = ptr - MINBPC(enc);
1051
2.68k
      return XML_TOK_INSTANCE_START;
1052
70.1k
    }
1053
8
    *nextTokPtr = ptr;
1054
8
    return XML_TOK_INVALID;
1055
70.1k
  }
1056
158k
  case BT_CR:
1057
158k
    if (ptr + MINBPC(enc) == end) {
1058
247
      *nextTokPtr = end;
1059
      /* indicate that this might be part of a CR/LF pair */
1060
247
      return -XML_TOK_PROLOG_S;
1061
247
    }
1062
    /* fall through */
1063
291k
  case BT_S:
1064
348k
  case BT_LF:
1065
367k
    for (;;) {
1066
367k
      ptr += MINBPC(enc);
1067
367k
      if (! HAS_CHAR(enc, ptr, end))
1068
126
        break;
1069
366k
      switch (BYTE_TYPE(enc, ptr)) {
1070
7.55k
      case BT_S:
1071
15.1k
      case BT_LF:
1072
15.1k
        break;
1073
4.07k
      case BT_CR:
1074
        /* don't split CR/LF pair */
1075
4.07k
        if (ptr + MINBPC(enc) != end)
1076
3.96k
          break;
1077
        /* fall through */
1078
347k
      default:
1079
347k
        *nextTokPtr = ptr;
1080
347k
        return XML_TOK_PROLOG_S;
1081
366k
      }
1082
366k
    }
1083
126
    *nextTokPtr = ptr;
1084
126
    return XML_TOK_PROLOG_S;
1085
4.08k
  case BT_PERCNT:
1086
4.08k
    return PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1087
613
  case BT_COMMA:
1088
613
    *nextTokPtr = ptr + MINBPC(enc);
1089
613
    return XML_TOK_COMMA;
1090
1.59k
  case BT_LSQB:
1091
1.59k
    *nextTokPtr = ptr + MINBPC(enc);
1092
1.59k
    return XML_TOK_OPEN_BRACKET;
1093
704
  case BT_RSQB:
1094
704
    ptr += MINBPC(enc);
1095
704
    if (! HAS_CHAR(enc, ptr, end))
1096
3
      return -XML_TOK_CLOSE_BRACKET;
1097
701
    if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) {
1098
16
      REQUIRE_CHARS(enc, ptr, end, 2);
1099
12
      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
12
    }
1104
696
    *nextTokPtr = ptr;
1105
696
    return XML_TOK_CLOSE_BRACKET;
1106
2.07M
  case BT_LPAR:
1107
2.07M
    *nextTokPtr = ptr + MINBPC(enc);
1108
2.07M
    return XML_TOK_OPEN_PAREN;
1109
48.8k
  case BT_RPAR:
1110
48.8k
    ptr += MINBPC(enc);
1111
48.8k
    if (! HAS_CHAR(enc, ptr, end))
1112
69
      return -XML_TOK_CLOSE_PAREN;
1113
48.7k
    switch (BYTE_TYPE(enc, ptr)) {
1114
1.33k
    case BT_AST:
1115
1.33k
      *nextTokPtr = ptr + MINBPC(enc);
1116
1.33k
      return XML_TOK_CLOSE_PAREN_ASTERISK;
1117
532
    case BT_QUEST:
1118
532
      *nextTokPtr = ptr + MINBPC(enc);
1119
532
      return XML_TOK_CLOSE_PAREN_QUESTION;
1120
682
    case BT_PLUS:
1121
682
      *nextTokPtr = ptr + MINBPC(enc);
1122
682
      return XML_TOK_CLOSE_PAREN_PLUS;
1123
10.1k
    case BT_CR:
1124
10.6k
    case BT_LF:
1125
43.1k
    case BT_S:
1126
44.1k
    case BT_GT:
1127
44.2k
    case BT_COMMA:
1128
45.0k
    case BT_VERBAR:
1129
46.2k
    case BT_RPAR:
1130
46.2k
      *nextTokPtr = ptr;
1131
46.2k
      return XML_TOK_CLOSE_PAREN;
1132
48.7k
    }
1133
1
    *nextTokPtr = ptr;
1134
1
    return XML_TOK_INVALID;
1135
4.81k
  case BT_VERBAR:
1136
4.81k
    *nextTokPtr = ptr + MINBPC(enc);
1137
4.81k
    return XML_TOK_OR;
1138
59.5k
  case BT_GT:
1139
59.5k
    *nextTokPtr = ptr + MINBPC(enc);
1140
59.5k
    return XML_TOK_DECL_CLOSE;
1141
47.8k
  case BT_NUM:
1142
47.8k
    return PREFIX(scanPoundName)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1143
0
#  define LEAD_CASE(n)                                                         \
1144
5.30k
  case BT_LEAD##n:                                                             \
1145
5.30k
    if (end - ptr < n)                                                         \
1146
38
      return XML_TOK_PARTIAL_CHAR;                                             \
1147
5.27k
    if (IS_INVALID_CHAR(enc, ptr, n)) {                                        \
1148
28
      *nextTokPtr = ptr;                                                       \
1149
28
      return XML_TOK_INVALID;                                                  \
1150
28
    }                                                                          \
1151
5.27k
    if (IS_NMSTRT_CHAR(enc, ptr, n)) {                                         \
1152
4.43k
      ptr += n;                                                                \
1153
4.43k
      tok = XML_TOK_NAME;                                                      \
1154
4.43k
      break;                                                                   \
1155
4.43k
    }                                                                          \
1156
5.24k
    if (IS_NAME_CHAR(enc, ptr, n)) {                                           \
1157
780
      ptr += n;                                                                \
1158
780
      tok = XML_TOK_NMTOKEN;                                                   \
1159
780
      break;                                                                   \
1160
780
    }                                                                          \
1161
807
    *nextTokPtr = ptr;                                                         \
1162
27
    return XML_TOK_INVALID;
1163
5.21k
    LEAD_CASE(2)
1164
11.3k
    LEAD_CASE(3)
1165
102
    LEAD_CASE(4)
1166
0
#  undef LEAD_CASE
1167
125k
  case BT_NMSTRT:
1168
220k
  case BT_HEX:
1169
220k
    tok = XML_TOK_NAME;
1170
220k
    ptr += MINBPC(enc);
1171
220k
    break;
1172
901
  case BT_DIGIT:
1173
976
  case BT_NAME:
1174
1.40k
  case BT_MINUS:
1175
#  ifdef XML_NS
1176
  case BT_COLON:
1177
#  endif
1178
1.40k
    tok = XML_TOK_NMTOKEN;
1179
1.40k
    ptr += MINBPC(enc);
1180
1.40k
    break;
1181
95
  case BT_NONASCII:
1182
95
    if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {
1183
65
      ptr += MINBPC(enc);
1184
65
      tok = XML_TOK_NAME;
1185
65
      break;
1186
65
    }
1187
30
    if (IS_NAME_CHAR_MINBPC(enc, ptr)) {
1188
14
      ptr += MINBPC(enc);
1189
14
      tok = XML_TOK_NMTOKEN;
1190
14
      break;
1191
14
    }
1192
    /* fall through */
1193
39
  default:
1194
39
    *nextTokPtr = ptr;
1195
39
    return XML_TOK_INVALID;
1196
2.93M
  }
1197
14.1M
  while (HAS_CHAR(enc, ptr, end)) {
1198
14.1M
    switch (BYTE_TYPE(enc, ptr)) {
1199
40.3M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1200
22.4k
    case BT_GT:
1201
66.7k
    case BT_RPAR:
1202
66.9k
    case BT_COMMA:
1203
69.1k
    case BT_VERBAR:
1204
70.5k
    case BT_LSQB:
1205
70.5k
    case BT_PERCNT:
1206
136k
    case BT_S:
1207
203k
    case BT_CR:
1208
226k
    case BT_LF:
1209
226k
      *nextTokPtr = ptr;
1210
226k
      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
238
    case BT_PLUS:
1232
238
      if (tok == XML_TOK_NMTOKEN) {
1233
1
        *nextTokPtr = ptr;
1234
1
        return XML_TOK_INVALID;
1235
1
      }
1236
237
      *nextTokPtr = ptr + MINBPC(enc);
1237
237
      return XML_TOK_NAME_PLUS;
1238
324
    case BT_AST:
1239
324
      if (tok == XML_TOK_NMTOKEN) {
1240
1
        *nextTokPtr = ptr;
1241
1
        return XML_TOK_INVALID;
1242
1
      }
1243
323
      *nextTokPtr = ptr + MINBPC(enc);
1244
323
      return XML_TOK_NAME_ASTERISK;
1245
155
    case BT_QUEST:
1246
155
      if (tok == XML_TOK_NMTOKEN) {
1247
1
        *nextTokPtr = ptr;
1248
1
        return XML_TOK_INVALID;
1249
1
      }
1250
154
      *nextTokPtr = ptr + MINBPC(enc);
1251
154
      return XML_TOK_NAME_QUESTION;
1252
29
    default:
1253
29
      *nextTokPtr = ptr;
1254
29
      return XML_TOK_INVALID;
1255
14.1M
    }
1256
14.1M
  }
1257
404
  return -tok;
1258
227k
}
xmltok.c:normal_prologTok
Line
Count
Source
1018
2.93M
                  const char **nextTokPtr) {
1019
2.93M
  int tok;
1020
2.93M
  if (ptr >= end)
1021
3.81k
    return XML_TOK_NONE;
1022
2.93M
  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
2.93M
  switch (BYTE_TYPE(enc, ptr)) {
1032
4.05k
  case BT_QUOT:
1033
4.05k
    return PREFIX(scanLit)(BT_QUOT, enc, ptr + MINBPC(enc), end, nextTokPtr);
1034
43.7k
  case BT_APOS:
1035
43.7k
    return PREFIX(scanLit)(BT_APOS, enc, ptr + MINBPC(enc), end, nextTokPtr);
1036
70.2k
  case BT_LT: {
1037
70.2k
    ptr += MINBPC(enc);
1038
70.2k
    REQUIRE_CHAR(enc, ptr, end);
1039
70.1k
    switch (BYTE_TYPE(enc, ptr)) {
1040
62.9k
    case BT_EXCL:
1041
62.9k
      return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1042
4.59k
    case BT_QUEST:
1043
4.59k
      return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1044
2.10k
    case BT_NMSTRT:
1045
2.65k
    case BT_HEX:
1046
2.65k
    case BT_NONASCII:
1047
2.66k
    case BT_LEAD2:
1048
2.68k
    case BT_LEAD3:
1049
2.68k
    case BT_LEAD4:
1050
2.68k
      *nextTokPtr = ptr - MINBPC(enc);
1051
2.68k
      return XML_TOK_INSTANCE_START;
1052
70.1k
    }
1053
8
    *nextTokPtr = ptr;
1054
8
    return XML_TOK_INVALID;
1055
70.1k
  }
1056
158k
  case BT_CR:
1057
158k
    if (ptr + MINBPC(enc) == end) {
1058
247
      *nextTokPtr = end;
1059
      /* indicate that this might be part of a CR/LF pair */
1060
247
      return -XML_TOK_PROLOG_S;
1061
247
    }
1062
    /* fall through */
1063
291k
  case BT_S:
1064
348k
  case BT_LF:
1065
367k
    for (;;) {
1066
367k
      ptr += MINBPC(enc);
1067
367k
      if (! HAS_CHAR(enc, ptr, end))
1068
126
        break;
1069
366k
      switch (BYTE_TYPE(enc, ptr)) {
1070
7.55k
      case BT_S:
1071
15.1k
      case BT_LF:
1072
15.1k
        break;
1073
4.07k
      case BT_CR:
1074
        /* don't split CR/LF pair */
1075
4.07k
        if (ptr + MINBPC(enc) != end)
1076
3.96k
          break;
1077
        /* fall through */
1078
347k
      default:
1079
347k
        *nextTokPtr = ptr;
1080
347k
        return XML_TOK_PROLOG_S;
1081
366k
      }
1082
366k
    }
1083
126
    *nextTokPtr = ptr;
1084
126
    return XML_TOK_PROLOG_S;
1085
4.08k
  case BT_PERCNT:
1086
4.08k
    return PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1087
613
  case BT_COMMA:
1088
613
    *nextTokPtr = ptr + MINBPC(enc);
1089
613
    return XML_TOK_COMMA;
1090
1.59k
  case BT_LSQB:
1091
1.59k
    *nextTokPtr = ptr + MINBPC(enc);
1092
1.59k
    return XML_TOK_OPEN_BRACKET;
1093
704
  case BT_RSQB:
1094
704
    ptr += MINBPC(enc);
1095
704
    if (! HAS_CHAR(enc, ptr, end))
1096
3
      return -XML_TOK_CLOSE_BRACKET;
1097
701
    if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) {
1098
16
      REQUIRE_CHARS(enc, ptr, end, 2);
1099
12
      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
12
    }
1104
696
    *nextTokPtr = ptr;
1105
696
    return XML_TOK_CLOSE_BRACKET;
1106
2.07M
  case BT_LPAR:
1107
2.07M
    *nextTokPtr = ptr + MINBPC(enc);
1108
2.07M
    return XML_TOK_OPEN_PAREN;
1109
48.8k
  case BT_RPAR:
1110
48.8k
    ptr += MINBPC(enc);
1111
48.8k
    if (! HAS_CHAR(enc, ptr, end))
1112
69
      return -XML_TOK_CLOSE_PAREN;
1113
48.7k
    switch (BYTE_TYPE(enc, ptr)) {
1114
1.33k
    case BT_AST:
1115
1.33k
      *nextTokPtr = ptr + MINBPC(enc);
1116
1.33k
      return XML_TOK_CLOSE_PAREN_ASTERISK;
1117
532
    case BT_QUEST:
1118
532
      *nextTokPtr = ptr + MINBPC(enc);
1119
532
      return XML_TOK_CLOSE_PAREN_QUESTION;
1120
682
    case BT_PLUS:
1121
682
      *nextTokPtr = ptr + MINBPC(enc);
1122
682
      return XML_TOK_CLOSE_PAREN_PLUS;
1123
10.1k
    case BT_CR:
1124
10.6k
    case BT_LF:
1125
43.1k
    case BT_S:
1126
44.1k
    case BT_GT:
1127
44.2k
    case BT_COMMA:
1128
45.0k
    case BT_VERBAR:
1129
46.2k
    case BT_RPAR:
1130
46.2k
      *nextTokPtr = ptr;
1131
46.2k
      return XML_TOK_CLOSE_PAREN;
1132
48.7k
    }
1133
1
    *nextTokPtr = ptr;
1134
1
    return XML_TOK_INVALID;
1135
4.81k
  case BT_VERBAR:
1136
4.81k
    *nextTokPtr = ptr + MINBPC(enc);
1137
4.81k
    return XML_TOK_OR;
1138
59.5k
  case BT_GT:
1139
59.5k
    *nextTokPtr = ptr + MINBPC(enc);
1140
59.5k
    return XML_TOK_DECL_CLOSE;
1141
47.8k
  case BT_NUM:
1142
47.8k
    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
5.21k
    LEAD_CASE(2)
1164
11.3k
    LEAD_CASE(3)
1165
62
    LEAD_CASE(4)
1166
0
#  undef LEAD_CASE
1167
125k
  case BT_NMSTRT:
1168
220k
  case BT_HEX:
1169
220k
    tok = XML_TOK_NAME;
1170
220k
    ptr += MINBPC(enc);
1171
220k
    break;
1172
901
  case BT_DIGIT:
1173
976
  case BT_NAME:
1174
1.40k
  case BT_MINUS:
1175
#  ifdef XML_NS
1176
  case BT_COLON:
1177
#  endif
1178
1.40k
    tok = XML_TOK_NMTOKEN;
1179
1.40k
    ptr += MINBPC(enc);
1180
1.40k
    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
13
  default:
1194
13
    *nextTokPtr = ptr;
1195
13
    return XML_TOK_INVALID;
1196
2.93M
  }
1197
14.1M
  while (HAS_CHAR(enc, ptr, end)) {
1198
14.1M
    switch (BYTE_TYPE(enc, ptr)) {
1199
40.3M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1200
22.4k
    case BT_GT:
1201
66.7k
    case BT_RPAR:
1202
66.9k
    case BT_COMMA:
1203
69.1k
    case BT_VERBAR:
1204
70.5k
    case BT_LSQB:
1205
70.5k
    case BT_PERCNT:
1206
136k
    case BT_S:
1207
203k
    case BT_CR:
1208
226k
    case BT_LF:
1209
226k
      *nextTokPtr = ptr;
1210
226k
      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
238
    case BT_PLUS:
1232
238
      if (tok == XML_TOK_NMTOKEN) {
1233
1
        *nextTokPtr = ptr;
1234
1
        return XML_TOK_INVALID;
1235
1
      }
1236
237
      *nextTokPtr = ptr + MINBPC(enc);
1237
237
      return XML_TOK_NAME_PLUS;
1238
324
    case BT_AST:
1239
324
      if (tok == XML_TOK_NMTOKEN) {
1240
1
        *nextTokPtr = ptr;
1241
1
        return XML_TOK_INVALID;
1242
1
      }
1243
323
      *nextTokPtr = ptr + MINBPC(enc);
1244
323
      return XML_TOK_NAME_ASTERISK;
1245
155
    case BT_QUEST:
1246
155
      if (tok == XML_TOK_NMTOKEN) {
1247
1
        *nextTokPtr = ptr;
1248
1
        return XML_TOK_INVALID;
1249
1
      }
1250
154
      *nextTokPtr = ptr + MINBPC(enc);
1251
154
      return XML_TOK_NAME_QUESTION;
1252
16
    default:
1253
16
      *nextTokPtr = ptr;
1254
16
      return XML_TOK_INVALID;
1255
14.1M
    }
1256
14.1M
  }
1257
386
  return -tok;
1258
227k
}
xmltok.c:little2_prologTok
Line
Count
Source
1018
61
                  const char **nextTokPtr) {
1019
61
  int tok;
1020
61
  if (ptr >= end)
1021
2
    return XML_TOK_NONE;
1022
59
  if (MINBPC(enc) > 1) {
1023
59
    size_t n = end - ptr;
1024
59
    if (n & (MINBPC(enc) - 1)) {
1025
8
      n &= ~(MINBPC(enc) - 1);
1026
8
      if (n == 0)
1027
2
        return XML_TOK_PARTIAL;
1028
6
      end = ptr + n;
1029
6
    }
1030
59
  }
1031
57
  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
14
    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
44
  case BT_NONASCII:
1182
44
    if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {
1183
30
      ptr += MINBPC(enc);
1184
30
      tok = XML_TOK_NAME;
1185
30
      break;
1186
30
    }
1187
14
    if (IS_NAME_CHAR_MINBPC(enc, ptr)) {
1188
6
      ptr += MINBPC(enc);
1189
6
      tok = XML_TOK_NMTOKEN;
1190
6
      break;
1191
6
    }
1192
    /* fall through */
1193
13
  default:
1194
13
    *nextTokPtr = ptr;
1195
13
    return XML_TOK_INVALID;
1196
57
  }
1197
1.56k
  while (HAS_CHAR(enc, ptr, end)) {
1198
1.56k
    switch (BYTE_TYPE(enc, ptr)) {
1199
7.70k
      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
6
    default:
1253
6
      *nextTokPtr = ptr;
1254
6
      return XML_TOK_INVALID;
1255
1.56k
    }
1256
1.56k
  }
1257
10
  return -tok;
1258
36
}
xmltok.c:big2_prologTok
Line
Count
Source
1018
71
                  const char **nextTokPtr) {
1019
71
  int tok;
1020
71
  if (ptr >= end)
1021
2
    return XML_TOK_NONE;
1022
69
  if (MINBPC(enc) > 1) {
1023
69
    size_t n = end - ptr;
1024
69
    if (n & (MINBPC(enc) - 1)) {
1025
10
      n &= ~(MINBPC(enc) - 1);
1026
10
      if (n == 0)
1027
2
        return XML_TOK_PARTIAL;
1028
8
      end = ptr + n;
1029
8
    }
1030
69
  }
1031
67
  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
26
    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
51
  case BT_NONASCII:
1182
51
    if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {
1183
35
      ptr += MINBPC(enc);
1184
35
      tok = XML_TOK_NAME;
1185
35
      break;
1186
35
    }
1187
16
    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
13
  default:
1194
13
    *nextTokPtr = ptr;
1195
13
    return XML_TOK_INVALID;
1196
67
  }
1197
241
  while (HAS_CHAR(enc, ptr, end)) {
1198
241
    switch (BYTE_TYPE(enc, ptr)) {
1199
1.06k
      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
7
    default:
1253
7
      *nextTokPtr = ptr;
1254
7
      return XML_TOK_INVALID;
1255
241
    }
1256
241
  }
1257
8
  return -tok;
1258
43
}
1259
1260
static int PTRCALL
1261
PREFIX(attributeValueTok)(const ENCODING *enc, const char *ptr, const char *end,
1262
1.22M
                          const char **nextTokPtr) {
1263
1.22M
  const char *start;
1264
1.22M
  if (ptr >= end)
1265
68.2k
    return XML_TOK_NONE;
1266
1.15M
  else if (! HAS_CHAR(enc, ptr, end)) {
1267
    /* This line cannot be executed.  The incoming data has already
1268
     * been tokenized once, so incomplete characters like this have
1269
     * already been eliminated from the input.  Retaining the paranoia
1270
     * check is still valuable, however.
1271
     */
1272
0
    return XML_TOK_PARTIAL; /* LCOV_EXCL_LINE */
1273
0
  }
1274
1.15M
  start = ptr;
1275
10.5M
  while (HAS_CHAR(enc, ptr, end)) {
1276
10.5M
    switch (BYTE_TYPE(enc, ptr)) {
1277
0
#  define LEAD_CASE(n)                                                         \
1278
118k
  case BT_LEAD##n:                                                             \
1279
118k
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1280
118k
    break;
1281
28.7k
      LEAD_CASE(2)
1282
36.1k
      LEAD_CASE(3)
1283
54.0k
      LEAD_CASE(4)
1284
0
#  undef LEAD_CASE
1285
240k
    case BT_AMP:
1286
240k
      if (ptr == start)
1287
185k
        return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1288
54.9k
      *nextTokPtr = ptr;
1289
54.9k
      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
229k
    case BT_LF:
1295
229k
      if (ptr == start) {
1296
168k
        *nextTokPtr = ptr + MINBPC(enc);
1297
168k
        return XML_TOK_DATA_NEWLINE;
1298
168k
      }
1299
61.1k
      *nextTokPtr = ptr;
1300
61.1k
      return XML_TOK_DATA_CHARS;
1301
400k
    case BT_CR:
1302
400k
      if (ptr == start) {
1303
282k
        ptr += MINBPC(enc);
1304
282k
        if (! HAS_CHAR(enc, ptr, end))
1305
1.51k
          return XML_TOK_TRAILING_CR;
1306
281k
        if (BYTE_TYPE(enc, ptr) == BT_LF)
1307
62.3k
          ptr += MINBPC(enc);
1308
281k
        *nextTokPtr = ptr;
1309
281k
        return XML_TOK_DATA_NEWLINE;
1310
282k
      }
1311
117k
      *nextTokPtr = ptr;
1312
117k
      return XML_TOK_DATA_CHARS;
1313
229k
    case BT_S:
1314
229k
      if (ptr == start) {
1315
138k
        *nextTokPtr = ptr + MINBPC(enc);
1316
138k
        return XML_TOK_ATTRIBUTE_VALUE_S;
1317
138k
      }
1318
90.8k
      *nextTokPtr = ptr;
1319
90.8k
      return XML_TOK_DATA_CHARS;
1320
9.32M
    default:
1321
9.32M
      ptr += MINBPC(enc);
1322
9.32M
      break;
1323
10.5M
    }
1324
10.5M
  }
1325
57.1k
  *nextTokPtr = ptr;
1326
57.1k
  return XML_TOK_DATA_CHARS;
1327
1.15M
}
xmltok.c:normal_attributeValueTok
Line
Count
Source
1262
1.22M
                          const char **nextTokPtr) {
1263
1.22M
  const char *start;
1264
1.22M
  if (ptr >= end)
1265
68.2k
    return XML_TOK_NONE;
1266
1.15M
  else if (! HAS_CHAR(enc, ptr, end)) {
1267
    /* This line cannot be executed.  The incoming data has already
1268
     * been tokenized once, so incomplete characters like this have
1269
     * already been eliminated from the input.  Retaining the paranoia
1270
     * check is still valuable, however.
1271
     */
1272
0
    return XML_TOK_PARTIAL; /* LCOV_EXCL_LINE */
1273
0
  }
1274
1.15M
  start = ptr;
1275
10.5M
  while (HAS_CHAR(enc, ptr, end)) {
1276
10.5M
    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
28.7k
      LEAD_CASE(2)
1282
36.1k
      LEAD_CASE(3)
1283
54.0k
      LEAD_CASE(4)
1284
0
#  undef LEAD_CASE
1285
240k
    case BT_AMP:
1286
240k
      if (ptr == start)
1287
185k
        return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1288
54.9k
      *nextTokPtr = ptr;
1289
54.9k
      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
229k
    case BT_LF:
1295
229k
      if (ptr == start) {
1296
168k
        *nextTokPtr = ptr + MINBPC(enc);
1297
168k
        return XML_TOK_DATA_NEWLINE;
1298
168k
      }
1299
61.1k
      *nextTokPtr = ptr;
1300
61.1k
      return XML_TOK_DATA_CHARS;
1301
400k
    case BT_CR:
1302
400k
      if (ptr == start) {
1303
282k
        ptr += MINBPC(enc);
1304
282k
        if (! HAS_CHAR(enc, ptr, end))
1305
1.51k
          return XML_TOK_TRAILING_CR;
1306
281k
        if (BYTE_TYPE(enc, ptr) == BT_LF)
1307
62.3k
          ptr += MINBPC(enc);
1308
281k
        *nextTokPtr = ptr;
1309
281k
        return XML_TOK_DATA_NEWLINE;
1310
282k
      }
1311
117k
      *nextTokPtr = ptr;
1312
117k
      return XML_TOK_DATA_CHARS;
1313
229k
    case BT_S:
1314
229k
      if (ptr == start) {
1315
138k
        *nextTokPtr = ptr + MINBPC(enc);
1316
138k
        return XML_TOK_ATTRIBUTE_VALUE_S;
1317
138k
      }
1318
90.8k
      *nextTokPtr = ptr;
1319
90.8k
      return XML_TOK_DATA_CHARS;
1320
9.32M
    default:
1321
9.32M
      ptr += MINBPC(enc);
1322
9.32M
      break;
1323
10.5M
    }
1324
10.5M
  }
1325
57.1k
  *nextTokPtr = ptr;
1326
57.1k
  return XML_TOK_DATA_CHARS;
1327
1.15M
}
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
1.73k
                   const char **badPtr) {
1451
1.73k
  ptr += MINBPC(enc);
1452
1.73k
  end -= MINBPC(enc);
1453
1.15M
  for (; HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
1454
1.15M
    switch (BYTE_TYPE(enc, ptr)) {
1455
461k
    case BT_DIGIT:
1456
711k
    case BT_HEX:
1457
712k
    case BT_MINUS:
1458
713k
    case BT_APOS:
1459
715k
    case BT_LPAR:
1460
791k
    case BT_RPAR:
1461
792k
    case BT_PLUS:
1462
793k
    case BT_COMMA:
1463
906k
    case BT_SOL:
1464
913k
    case BT_EQUALS:
1465
921k
    case BT_QUEST:
1466
926k
    case BT_CR:
1467
928k
    case BT_LF:
1468
929k
    case BT_SEMI:
1469
929k
    case BT_EXCL:
1470
959k
    case BT_AST:
1471
964k
    case BT_PERCNT:
1472
977k
    case BT_NUM:
1473
#  ifdef XML_NS
1474
    case BT_COLON:
1475
#  endif
1476
977k
      break;
1477
4.14k
    case BT_S:
1478
4.14k
      if (CHAR_MATCHES(enc, ptr, ASCII_TAB)) {
1479
1
        *badPtr = ptr;
1480
1
        return 0;
1481
1
      }
1482
4.14k
      break;
1483
7.05k
    case BT_NAME:
1484
170k
    case BT_NMSTRT:
1485
170k
      if (! (BYTE_TO_ASCII(enc, ptr) & ~0x7f))
1486
170k
        break;
1487
      /* fall through */
1488
5.80k
    default:
1489
5.80k
      switch (BYTE_TO_ASCII(enc, ptr)) {
1490
1.82k
      case 0x24: /* $ */
1491
5.80k
      case 0x40: /* @ */
1492
5.80k
        break;
1493
5
      default:
1494
5
        *badPtr = ptr;
1495
5
        return 0;
1496
5.80k
      }
1497
5.80k
      break;
1498
1.15M
    }
1499
1.15M
  }
1500
1.72k
  return 1;
1501
1.73k
}
xmltok.c:normal_isPublicId
Line
Count
Source
1450
1.73k
                   const char **badPtr) {
1451
1.73k
  ptr += MINBPC(enc);
1452
1.73k
  end -= MINBPC(enc);
1453
1.15M
  for (; HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
1454
1.15M
    switch (BYTE_TYPE(enc, ptr)) {
1455
461k
    case BT_DIGIT:
1456
711k
    case BT_HEX:
1457
712k
    case BT_MINUS:
1458
713k
    case BT_APOS:
1459
715k
    case BT_LPAR:
1460
791k
    case BT_RPAR:
1461
792k
    case BT_PLUS:
1462
793k
    case BT_COMMA:
1463
906k
    case BT_SOL:
1464
913k
    case BT_EQUALS:
1465
921k
    case BT_QUEST:
1466
926k
    case BT_CR:
1467
928k
    case BT_LF:
1468
929k
    case BT_SEMI:
1469
929k
    case BT_EXCL:
1470
959k
    case BT_AST:
1471
964k
    case BT_PERCNT:
1472
977k
    case BT_NUM:
1473
#  ifdef XML_NS
1474
    case BT_COLON:
1475
#  endif
1476
977k
      break;
1477
4.14k
    case BT_S:
1478
4.14k
      if (CHAR_MATCHES(enc, ptr, ASCII_TAB)) {
1479
1
        *badPtr = ptr;
1480
1
        return 0;
1481
1
      }
1482
4.14k
      break;
1483
7.05k
    case BT_NAME:
1484
170k
    case BT_NMSTRT:
1485
170k
      if (! (BYTE_TO_ASCII(enc, ptr) & ~0x7f))
1486
170k
        break;
1487
      /* fall through */
1488
5.80k
    default:
1489
5.80k
      switch (BYTE_TO_ASCII(enc, ptr)) {
1490
1.82k
      case 0x24: /* $ */
1491
5.80k
      case 0x40: /* @ */
1492
5.80k
        break;
1493
5
      default:
1494
5
        *badPtr = ptr;
1495
5
        return 0;
1496
5.80k
      }
1497
5.80k
      break;
1498
1.15M
    }
1499
1.15M
  }
1500
1.72k
  return 1;
1501
1.73k
}
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
208k
                ATTRIBUTE *atts) {
1511
208k
  enum { other, inName, inValue } state = inName;
1512
208k
  int nAtts = 0;
1513
208k
  int open = 0; /* defined when state == inValue;
1514
                   initialization just to shut up compilers */
1515
1516
24.3M
  for (ptr += MINBPC(enc);; ptr += MINBPC(enc)) {
1517
24.3M
    switch (BYTE_TYPE(enc, ptr)) {
1518
0
#  define START_NAME                                                           \
1519
14.3M
    if (state == other) {                                                      \
1520
1.90M
      if (nAtts < attsMax) {                                                   \
1521
967k
        atts[nAtts].name = ptr;                                                \
1522
967k
        atts[nAtts].normalized = 1;                                            \
1523
967k
      }                                                                        \
1524
1.90M
      state = inName;                                                          \
1525
1.90M
    }
1526
0
#  define LEAD_CASE(n)                                                         \
1527
110k
  case BT_LEAD##n: /* NOTE: The encoding has already been validated. */        \
1528
110k
    START_NAME ptr += (n - MINBPC(enc));                                       \
1529
110k
    break;
1530
36.8k
      LEAD_CASE(2)
1531
54.5k
      LEAD_CASE(3)
1532
19.2k
      LEAD_CASE(4)
1533
0
#  undef LEAD_CASE
1534
0
    case BT_NONASCII:
1535
13.5M
    case BT_NMSTRT:
1536
14.2M
    case BT_HEX:
1537
14.2M
      START_NAME
1538
14.2M
      break;
1539
0
#  undef START_NAME
1540
267k
    case BT_QUOT:
1541
267k
      if (state != inValue) {
1542
104k
        if (nAtts < attsMax)
1543
66.8k
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1544
104k
        state = inValue;
1545
104k
        open = BT_QUOT;
1546
163k
      } else if (open == BT_QUOT) {
1547
104k
        state = other;
1548
104k
        if (nAtts < attsMax)
1549
66.8k
          atts[nAtts].valueEnd = ptr;
1550
104k
        nAtts++;
1551
104k
      }
1552
267k
      break;
1553
3.64M
    case BT_APOS:
1554
3.64M
      if (state != inValue) {
1555
1.79M
        if (nAtts < attsMax)
1556
900k
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1557
1.79M
        state = inValue;
1558
1.79M
        open = BT_APOS;
1559
1.84M
      } else if (open == BT_APOS) {
1560
1.79M
        state = other;
1561
1.79M
        if (nAtts < attsMax)
1562
900k
          atts[nAtts].valueEnd = ptr;
1563
1.79M
        nAtts++;
1564
1.79M
      }
1565
3.64M
      break;
1566
73.9k
    case BT_AMP:
1567
73.9k
      if (nAtts < attsMax)
1568
73.7k
        atts[nAtts].normalized = 0;
1569
73.9k
      break;
1570
1.29M
    case BT_S:
1571
1.29M
      if (state == inName)
1572
17.6k
        state = other;
1573
1.28M
      else if (state == inValue && nAtts < attsMax && atts[nAtts].normalized
1574
43.2k
               && (ptr == atts[nAtts].valuePtr
1575
6.95k
                   || BYTE_TO_ASCII(enc, ptr) != ASCII_SPACE
1576
4.34k
                   || BYTE_TO_ASCII(enc, ptr + MINBPC(enc)) == ASCII_SPACE
1577
3.94k
                   || BYTE_TYPE(enc, ptr + MINBPC(enc)) == open))
1578
40.0k
        atts[nAtts].normalized = 0;
1579
1.29M
      break;
1580
1.09M
    case BT_CR:
1581
1.35M
    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
1.35M
      if (state == inName)
1585
14.7k
        state = other;
1586
1.33M
      else if (state == inValue && nAtts < attsMax)
1587
336k
        atts[nAtts].normalized = 0;
1588
1.35M
      break;
1589
175k
    case BT_GT:
1590
218k
    case BT_SOL:
1591
218k
      if (state != inValue)
1592
208k
        return nAtts;
1593
10.0k
      break;
1594
3.12M
    default:
1595
3.12M
      break;
1596
24.3M
    }
1597
24.3M
  }
1598
  /* not reached */
1599
208k
}
xmltok.c:normal_getAtts
Line
Count
Source
1510
208k
                ATTRIBUTE *atts) {
1511
208k
  enum { other, inName, inValue } state = inName;
1512
208k
  int nAtts = 0;
1513
208k
  int open = 0; /* defined when state == inValue;
1514
                   initialization just to shut up compilers */
1515
1516
24.3M
  for (ptr += MINBPC(enc);; ptr += MINBPC(enc)) {
1517
24.3M
    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
36.8k
      LEAD_CASE(2)
1531
54.5k
      LEAD_CASE(3)
1532
19.2k
      LEAD_CASE(4)
1533
0
#  undef LEAD_CASE
1534
0
    case BT_NONASCII:
1535
13.5M
    case BT_NMSTRT:
1536
14.2M
    case BT_HEX:
1537
14.2M
      START_NAME
1538
14.2M
      break;
1539
0
#  undef START_NAME
1540
267k
    case BT_QUOT:
1541
267k
      if (state != inValue) {
1542
104k
        if (nAtts < attsMax)
1543
66.8k
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1544
104k
        state = inValue;
1545
104k
        open = BT_QUOT;
1546
163k
      } else if (open == BT_QUOT) {
1547
104k
        state = other;
1548
104k
        if (nAtts < attsMax)
1549
66.8k
          atts[nAtts].valueEnd = ptr;
1550
104k
        nAtts++;
1551
104k
      }
1552
267k
      break;
1553
3.64M
    case BT_APOS:
1554
3.64M
      if (state != inValue) {
1555
1.79M
        if (nAtts < attsMax)
1556
900k
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1557
1.79M
        state = inValue;
1558
1.79M
        open = BT_APOS;
1559
1.84M
      } else if (open == BT_APOS) {
1560
1.79M
        state = other;
1561
1.79M
        if (nAtts < attsMax)
1562
900k
          atts[nAtts].valueEnd = ptr;
1563
1.79M
        nAtts++;
1564
1.79M
      }
1565
3.64M
      break;
1566
73.9k
    case BT_AMP:
1567
73.9k
      if (nAtts < attsMax)
1568
73.7k
        atts[nAtts].normalized = 0;
1569
73.9k
      break;
1570
1.29M
    case BT_S:
1571
1.29M
      if (state == inName)
1572
17.6k
        state = other;
1573
1.28M
      else if (state == inValue && nAtts < attsMax && atts[nAtts].normalized
1574
43.2k
               && (ptr == atts[nAtts].valuePtr
1575
6.95k
                   || BYTE_TO_ASCII(enc, ptr) != ASCII_SPACE
1576
4.34k
                   || BYTE_TO_ASCII(enc, ptr + MINBPC(enc)) == ASCII_SPACE
1577
3.94k
                   || BYTE_TYPE(enc, ptr + MINBPC(enc)) == open))
1578
40.0k
        atts[nAtts].normalized = 0;
1579
1.29M
      break;
1580
1.09M
    case BT_CR:
1581
1.35M
    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
1.35M
      if (state == inName)
1585
14.7k
        state = other;
1586
1.33M
      else if (state == inValue && nAtts < attsMax)
1587
336k
        atts[nAtts].normalized = 0;
1588
1.35M
      break;
1589
175k
    case BT_GT:
1590
218k
    case BT_SOL:
1591
218k
      if (state != inValue)
1592
208k
        return nAtts;
1593
10.0k
      break;
1594
3.12M
    default:
1595
3.12M
      break;
1596
24.3M
    }
1597
24.3M
  }
1598
  /* not reached */
1599
208k
}
Unexecuted instantiation: xmltok.c:little2_getAtts
Unexecuted instantiation: xmltok.c:big2_getAtts
1600
1601
static int PTRFASTCALL
1602
47.0k
PREFIX(charRefNumber)(const ENCODING *enc, const char *ptr) {
1603
47.0k
  int result = 0;
1604
  /* skip &# */
1605
47.0k
  UNUSED_P(enc);
1606
47.0k
  ptr += 2 * MINBPC(enc);
1607
47.0k
  if (CHAR_MATCHES(enc, ptr, ASCII_x)) {
1608
210k
    for (ptr += MINBPC(enc); ! CHAR_MATCHES(enc, ptr, ASCII_SEMI);
1609
165k
         ptr += MINBPC(enc)) {
1610
165k
      int c = BYTE_TO_ASCII(enc, ptr);
1611
165k
      switch (c) {
1612
1.88k
      case ASCII_0:
1613
13.4k
      case ASCII_1:
1614
30.5k
      case ASCII_2:
1615
40.5k
      case ASCII_3:
1616
60.6k
      case ASCII_4:
1617
74.4k
      case ASCII_5:
1618
75.7k
      case ASCII_6:
1619
83.9k
      case ASCII_7:
1620
95.4k
      case ASCII_8:
1621
99.1k
      case ASCII_9:
1622
99.1k
        result <<= 4;
1623
99.1k
        result |= (c - ASCII_0);
1624
99.1k
        break;
1625
16.7k
      case ASCII_A:
1626
18.8k
      case ASCII_B:
1627
19.7k
      case ASCII_C:
1628
22.5k
      case ASCII_D:
1629
25.1k
      case ASCII_E:
1630
34.9k
      case ASCII_F:
1631
34.9k
        result <<= 4;
1632
34.9k
        result += 10 + (c - ASCII_A);
1633
34.9k
        break;
1634
826
      case ASCII_a:
1635
8.18k
      case ASCII_b:
1636
9.27k
      case ASCII_c:
1637
24.1k
      case ASCII_d:
1638
25.4k
      case ASCII_e:
1639
31.0k
      case ASCII_f:
1640
31.0k
        result <<= 4;
1641
31.0k
        result += 10 + (c - ASCII_a);
1642
31.0k
        break;
1643
165k
      }
1644
165k
      if (result >= 0x110000)
1645
10
        return -1;
1646
165k
    }
1647
45.2k
  } else {
1648
7.27k
    for (; ! CHAR_MATCHES(enc, ptr, ASCII_SEMI); ptr += MINBPC(enc)) {
1649
5.48k
      int c = BYTE_TO_ASCII(enc, ptr);
1650
5.48k
      result *= 10;
1651
5.48k
      result += (c - ASCII_0);
1652
5.48k
      if (result >= 0x110000)
1653
2
        return -1;
1654
5.48k
    }
1655
1.79k
  }
1656
47.0k
  return checkCharRefNumber(result);
1657
47.0k
}
xmltok.c:normal_charRefNumber
Line
Count
Source
1602
47.0k
PREFIX(charRefNumber)(const ENCODING *enc, const char *ptr) {
1603
47.0k
  int result = 0;
1604
  /* skip &# */
1605
47.0k
  UNUSED_P(enc);
1606
47.0k
  ptr += 2 * MINBPC(enc);
1607
47.0k
  if (CHAR_MATCHES(enc, ptr, ASCII_x)) {
1608
210k
    for (ptr += MINBPC(enc); ! CHAR_MATCHES(enc, ptr, ASCII_SEMI);
1609
165k
         ptr += MINBPC(enc)) {
1610
165k
      int c = BYTE_TO_ASCII(enc, ptr);
1611
165k
      switch (c) {
1612
1.88k
      case ASCII_0:
1613
13.4k
      case ASCII_1:
1614
30.5k
      case ASCII_2:
1615
40.5k
      case ASCII_3:
1616
60.6k
      case ASCII_4:
1617
74.4k
      case ASCII_5:
1618
75.7k
      case ASCII_6:
1619
83.9k
      case ASCII_7:
1620
95.4k
      case ASCII_8:
1621
99.1k
      case ASCII_9:
1622
99.1k
        result <<= 4;
1623
99.1k
        result |= (c - ASCII_0);
1624
99.1k
        break;
1625
16.7k
      case ASCII_A:
1626
18.8k
      case ASCII_B:
1627
19.7k
      case ASCII_C:
1628
22.5k
      case ASCII_D:
1629
25.1k
      case ASCII_E:
1630
34.9k
      case ASCII_F:
1631
34.9k
        result <<= 4;
1632
34.9k
        result += 10 + (c - ASCII_A);
1633
34.9k
        break;
1634
826
      case ASCII_a:
1635
8.18k
      case ASCII_b:
1636
9.27k
      case ASCII_c:
1637
24.1k
      case ASCII_d:
1638
25.4k
      case ASCII_e:
1639
31.0k
      case ASCII_f:
1640
31.0k
        result <<= 4;
1641
31.0k
        result += 10 + (c - ASCII_a);
1642
31.0k
        break;
1643
165k
      }
1644
165k
      if (result >= 0x110000)
1645
10
        return -1;
1646
165k
    }
1647
45.2k
  } else {
1648
7.27k
    for (; ! CHAR_MATCHES(enc, ptr, ASCII_SEMI); ptr += MINBPC(enc)) {
1649
5.48k
      int c = BYTE_TO_ASCII(enc, ptr);
1650
5.48k
      result *= 10;
1651
5.48k
      result += (c - ASCII_0);
1652
5.48k
      if (result >= 0x110000)
1653
2
        return -1;
1654
5.48k
    }
1655
1.79k
  }
1656
47.0k
  return checkCharRefNumber(result);
1657
47.0k
}
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
169k
                             const char *end) {
1662
169k
  UNUSED_P(enc);
1663
169k
  switch ((end - ptr) / MINBPC(enc)) {
1664
10.3k
  case 2:
1665
10.3k
    if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_t)) {
1666
2.68k
      switch (BYTE_TO_ASCII(enc, ptr)) {
1667
471
      case ASCII_l:
1668
471
        return ASCII_LT;
1669
88
      case ASCII_g:
1670
88
        return ASCII_GT;
1671
2.68k
      }
1672
2.68k
    }
1673
9.82k
    break;
1674
35.8k
  case 3:
1675
35.8k
    if (CHAR_MATCHES(enc, ptr, ASCII_a)) {
1676
26.8k
      ptr += MINBPC(enc);
1677
26.8k
      if (CHAR_MATCHES(enc, ptr, ASCII_m)) {
1678
26.0k
        ptr += MINBPC(enc);
1679
26.0k
        if (CHAR_MATCHES(enc, ptr, ASCII_p))
1680
26.0k
          return ASCII_AMP;
1681
26.0k
      }
1682
26.8k
    }
1683
9.81k
    break;
1684
19.3k
  case 4:
1685
19.3k
    switch (BYTE_TO_ASCII(enc, ptr)) {
1686
9.19k
    case ASCII_q:
1687
9.19k
      ptr += MINBPC(enc);
1688
9.19k
      if (CHAR_MATCHES(enc, ptr, ASCII_u)) {
1689
8.19k
        ptr += MINBPC(enc);
1690
8.19k
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1691
8.08k
          ptr += MINBPC(enc);
1692
8.08k
          if (CHAR_MATCHES(enc, ptr, ASCII_t))
1693
7.77k
            return ASCII_QUOT;
1694
8.08k
        }
1695
8.19k
      }
1696
1.41k
      break;
1697
4.19k
    case ASCII_a:
1698
4.19k
      ptr += MINBPC(enc);
1699
4.19k
      if (CHAR_MATCHES(enc, ptr, ASCII_p)) {
1700
1.04k
        ptr += MINBPC(enc);
1701
1.04k
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1702
843
          ptr += MINBPC(enc);
1703
843
          if (CHAR_MATCHES(enc, ptr, ASCII_s))
1704
465
            return ASCII_APOS;
1705
843
        }
1706
1.04k
      }
1707
3.73k
      break;
1708
19.3k
    }
1709
169k
  }
1710
134k
  return 0;
1711
169k
}
xmltok.c:normal_predefinedEntityName
Line
Count
Source
1661
169k
                             const char *end) {
1662
169k
  UNUSED_P(enc);
1663
169k
  switch ((end - ptr) / MINBPC(enc)) {
1664
10.3k
  case 2:
1665
10.3k
    if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_t)) {
1666
2.68k
      switch (BYTE_TO_ASCII(enc, ptr)) {
1667
471
      case ASCII_l:
1668
471
        return ASCII_LT;
1669
88
      case ASCII_g:
1670
88
        return ASCII_GT;
1671
2.68k
      }
1672
2.68k
    }
1673
9.82k
    break;
1674
35.8k
  case 3:
1675
35.8k
    if (CHAR_MATCHES(enc, ptr, ASCII_a)) {
1676
26.8k
      ptr += MINBPC(enc);
1677
26.8k
      if (CHAR_MATCHES(enc, ptr, ASCII_m)) {
1678
26.0k
        ptr += MINBPC(enc);
1679
26.0k
        if (CHAR_MATCHES(enc, ptr, ASCII_p))
1680
26.0k
          return ASCII_AMP;
1681
26.0k
      }
1682
26.8k
    }
1683
9.81k
    break;
1684
19.3k
  case 4:
1685
19.3k
    switch (BYTE_TO_ASCII(enc, ptr)) {
1686
9.19k
    case ASCII_q:
1687
9.19k
      ptr += MINBPC(enc);
1688
9.19k
      if (CHAR_MATCHES(enc, ptr, ASCII_u)) {
1689
8.19k
        ptr += MINBPC(enc);
1690
8.19k
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1691
8.08k
          ptr += MINBPC(enc);
1692
8.08k
          if (CHAR_MATCHES(enc, ptr, ASCII_t))
1693
7.77k
            return ASCII_QUOT;
1694
8.08k
        }
1695
8.19k
      }
1696
1.41k
      break;
1697
4.19k
    case ASCII_a:
1698
4.19k
      ptr += MINBPC(enc);
1699
4.19k
      if (CHAR_MATCHES(enc, ptr, ASCII_p)) {
1700
1.04k
        ptr += MINBPC(enc);
1701
1.04k
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1702
843
          ptr += MINBPC(enc);
1703
843
          if (CHAR_MATCHES(enc, ptr, ASCII_s))
1704
465
            return ASCII_APOS;
1705
843
        }
1706
1.04k
      }
1707
3.73k
      break;
1708
19.3k
    }
1709
169k
  }
1710
134k
  return 0;
1711
169k
}
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
291k
                         const char *end1, const char *ptr2) {
1716
291k
  UNUSED_P(enc);
1717
1.29M
  for (; *ptr2; ptr1 += MINBPC(enc), ptr2++) {
1718
1.14M
    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
19
      return 0; /* LCOV_EXCL_LINE */
1725
19
    }
1726
1.14M
    if (! CHAR_MATCHES(enc, ptr1, *ptr2))
1727
141k
      return 0;
1728
1.14M
  }
1729
150k
  return ptr1 == end1;
1730
291k
}
xmltok.c:normal_nameMatchesAscii
Line
Count
Source
1715
291k
                         const char *end1, const char *ptr2) {
1716
291k
  UNUSED_P(enc);
1717
1.29M
  for (; *ptr2; ptr1 += MINBPC(enc), ptr2++) {
1718
1.14M
    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
19
      return 0; /* LCOV_EXCL_LINE */
1725
19
    }
1726
1.14M
    if (! CHAR_MATCHES(enc, ptr1, *ptr2))
1727
141k
      return 0;
1728
1.14M
  }
1729
150k
  return ptr1 == end1;
1730
291k
}
Unexecuted instantiation: xmltok.c:little2_nameMatchesAscii
Unexecuted instantiation: xmltok.c:big2_nameMatchesAscii
1731
1732
static int PTRFASTCALL
1733
256k
PREFIX(nameLength)(const ENCODING *enc, const char *ptr) {
1734
256k
  const char *start = ptr;
1735
6.06M
  for (;;) {
1736
6.06M
    switch (BYTE_TYPE(enc, ptr)) {
1737
0
#  define LEAD_CASE(n)                                                         \
1738
29.4k
  case BT_LEAD##n:                                                             \
1739
29.4k
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1740
29.4k
    break;
1741
16.2k
      LEAD_CASE(2)
1742
13.2k
      LEAD_CASE(3)
1743
0
      LEAD_CASE(4)
1744
0
#  undef LEAD_CASE
1745
0
    case BT_NONASCII:
1746
5.42M
    case BT_NMSTRT:
1747
#  ifdef XML_NS
1748
    case BT_COLON:
1749
#  endif
1750
5.72M
    case BT_HEX:
1751
5.76M
    case BT_DIGIT:
1752
5.77M
    case BT_NAME:
1753
5.78M
    case BT_MINUS:
1754
5.78M
      ptr += MINBPC(enc);
1755
5.78M
      break;
1756
256k
    default:
1757
256k
      return (int)(ptr - start);
1758
6.06M
    }
1759
6.06M
  }
1760
256k
}
xmltok.c:normal_nameLength
Line
Count
Source
1733
256k
PREFIX(nameLength)(const ENCODING *enc, const char *ptr) {
1734
256k
  const char *start = ptr;
1735
6.06M
  for (;;) {
1736
6.06M
    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
16.2k
      LEAD_CASE(2)
1742
13.2k
      LEAD_CASE(3)
1743
0
      LEAD_CASE(4)
1744
0
#  undef LEAD_CASE
1745
0
    case BT_NONASCII:
1746
5.42M
    case BT_NMSTRT:
1747
#  ifdef XML_NS
1748
    case BT_COLON:
1749
#  endif
1750
5.72M
    case BT_HEX:
1751
5.76M
    case BT_DIGIT:
1752
5.77M
    case BT_NAME:
1753
5.78M
    case BT_MINUS:
1754
5.78M
      ptr += MINBPC(enc);
1755
5.78M
      break;
1756
256k
    default:
1757
256k
      return (int)(ptr - start);
1758
6.06M
    }
1759
6.06M
  }
1760
256k
}
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
9.68k
                       POSITION *pos) {
1780
56.1M
  while (HAS_CHAR(enc, ptr, end)) {
1781
56.1M
    switch (BYTE_TYPE(enc, ptr)) {
1782
0
#  define LEAD_CASE(n)                                                         \
1783
607k
  case BT_LEAD##n:                                                             \
1784
607k
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1785
607k
    pos->columnNumber++;                                                       \
1786
607k
    break;
1787
205k
      LEAD_CASE(2)
1788
300k
      LEAD_CASE(3)
1789
101k
      LEAD_CASE(4)
1790
0
#  undef LEAD_CASE
1791
986k
    case BT_LF:
1792
986k
      pos->columnNumber = 0;
1793
986k
      pos->lineNumber++;
1794
986k
      ptr += MINBPC(enc);
1795
986k
      break;
1796
1.45M
    case BT_CR:
1797
1.45M
      pos->lineNumber++;
1798
1.45M
      ptr += MINBPC(enc);
1799
1.45M
      if (HAS_CHAR(enc, ptr, end) && BYTE_TYPE(enc, ptr) == BT_LF)
1800
287k
        ptr += MINBPC(enc);
1801
1.45M
      pos->columnNumber = 0;
1802
1.45M
      break;
1803
53.1M
    default:
1804
53.1M
      ptr += MINBPC(enc);
1805
53.1M
      pos->columnNumber++;
1806
53.1M
      break;
1807
56.1M
    }
1808
56.1M
  }
1809
9.68k
}
xmltok.c:normal_updatePosition
Line
Count
Source
1779
9.44k
                       POSITION *pos) {
1780
56.1M
  while (HAS_CHAR(enc, ptr, end)) {
1781
56.1M
    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
205k
      LEAD_CASE(2)
1788
300k
      LEAD_CASE(3)
1789
101k
      LEAD_CASE(4)
1790
0
#  undef LEAD_CASE
1791
986k
    case BT_LF:
1792
986k
      pos->columnNumber = 0;
1793
986k
      pos->lineNumber++;
1794
986k
      ptr += MINBPC(enc);
1795
986k
      break;
1796
1.45M
    case BT_CR:
1797
1.45M
      pos->lineNumber++;
1798
1.45M
      ptr += MINBPC(enc);
1799
1.45M
      if (HAS_CHAR(enc, ptr, end) && BYTE_TYPE(enc, ptr) == BT_LF)
1800
287k
        ptr += MINBPC(enc);
1801
1.45M
      pos->columnNumber = 0;
1802
1.45M
      break;
1803
53.1M
    default:
1804
53.1M
      ptr += MINBPC(enc);
1805
53.1M
      pos->columnNumber++;
1806
53.1M
      break;
1807
56.1M
    }
1808
56.1M
  }
1809
9.44k
}
xmltok.c:little2_updatePosition
Line
Count
Source
1779
108
                       POSITION *pos) {
1780
1.28k
  while (HAS_CHAR(enc, ptr, end)) {
1781
1.28k
    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
1.28k
    default:
1804
1.28k
      ptr += MINBPC(enc);
1805
1.28k
      pos->columnNumber++;
1806
1.28k
      break;
1807
1.28k
    }
1808
1.28k
  }
1809
108
}
xmltok.c:big2_updatePosition
Line
Count
Source
1779
127
                       POSITION *pos) {
1780
265
  while (HAS_CHAR(enc, ptr, end)) {
1781
265
    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
265
    default:
1804
265
      ptr += MINBPC(enc);
1805
265
      pos->columnNumber++;
1806
265
      break;
1807
265
    }
1808
265
  }
1809
127
}
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 */