Coverage Report

Created: 2026-01-09 07:09

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/CMake/Utilities/cmexpat/lib/xmltok_impl.c
Line
Count
Source
1
/* This file is included (from xmltok.c, 1-3 times depending on XML_MIN_SIZE)!
2
                            __  __            _
3
                         ___\ \/ /_ __   __ _| |_
4
                        / _ \\  /| '_ \ / _` | __|
5
                       |  __//  \| |_) | (_| | |_
6
                        \___/_/\_\ .__/ \__,_|\__|
7
                                 |_| XML parser
8
9
   Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
10
   Copyright (c) 2000      Clark Cooper <coopercc@users.sourceforge.net>
11
   Copyright (c) 2002      Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
12
   Copyright (c) 2002-2016 Karl Waclawek <karl@waclawek.net>
13
   Copyright (c) 2016-2022 Sebastian Pipping <sebastian@pipping.org>
14
   Copyright (c) 2017      Rhodri James <rhodri@wildebeest.org.uk>
15
   Copyright (c) 2018      Benjamin Peterson <benjamin@python.org>
16
   Copyright (c) 2018      Anton Maklakov <antmak.pub@gmail.com>
17
   Copyright (c) 2019      David Loffredo <loffredo@steptools.com>
18
   Copyright (c) 2020      Boris Kolpackov <boris@codesynthesis.com>
19
   Copyright (c) 2022      Martin Ettl <ettl.martin78@googlemail.com>
20
   Licensed under the MIT license:
21
22
   Permission is  hereby granted,  free of charge,  to any  person obtaining
23
   a  copy  of  this  software   and  associated  documentation  files  (the
24
   "Software"),  to  deal in  the  Software  without restriction,  including
25
   without  limitation the  rights  to use,  copy,  modify, merge,  publish,
26
   distribute, sublicense, and/or sell copies of the Software, and to permit
27
   persons  to whom  the Software  is  furnished to  do so,  subject to  the
28
   following conditions:
29
30
   The above copyright  notice and this permission notice  shall be included
31
   in all copies or substantial portions of the Software.
32
33
   THE  SOFTWARE  IS  PROVIDED  "AS  IS",  WITHOUT  WARRANTY  OF  ANY  KIND,
34
   EXPRESS  OR IMPLIED,  INCLUDING  BUT  NOT LIMITED  TO  THE WARRANTIES  OF
35
   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
36
   NO EVENT SHALL THE AUTHORS OR  COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
37
   DAMAGES OR  OTHER LIABILITY, WHETHER  IN AN  ACTION OF CONTRACT,  TORT OR
38
   OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
39
   USE OR OTHER DEALINGS IN THE SOFTWARE.
40
*/
41
42
#ifdef XML_TOK_IMPL_C
43
44
#  ifndef IS_INVALID_CHAR // i.e. for UTF-16 and XML_MIN_SIZE not defined
45
65
#    define IS_INVALID_CHAR(enc, ptr, n) (0)
46
#  endif
47
48
#  define INVALID_LEAD_CASE(n, ptr, nextTokPtr)                                \
49
926k
  case BT_LEAD##n:                                                             \
50
926k
    if (end - ptr < n)                                                         \
51
926k
      return XML_TOK_PARTIAL_CHAR;                                             \
52
926k
    if (IS_INVALID_CHAR(enc, ptr, n)) {                                        \
53
85
      *(nextTokPtr) = (ptr);                                                   \
54
85
      return XML_TOK_INVALID;                                                  \
55
85
    }                                                                          \
56
926k
    ptr += n;                                                                  \
57
926k
    break;
58
59
#  define INVALID_CASES(ptr, nextTokPtr)                                       \
60
441k
    INVALID_LEAD_CASE(2, ptr, nextTokPtr)                                      \
61
441k
    INVALID_LEAD_CASE(3, ptr, nextTokPtr)                                      \
62
332k
    INVALID_LEAD_CASE(4, ptr, nextTokPtr)                                      \
63
152k
  case BT_NONXML:                                                              \
64
49
  case BT_MALFORM:                                                             \
65
85
  case BT_TRAIL:                                                               \
66
85
    *(nextTokPtr) = (ptr);                                                     \
67
85
    return XML_TOK_INVALID;
68
69
#  define CHECK_NAME_CASE(n, enc, ptr, end, nextTokPtr)                        \
70
326k
  case BT_LEAD##n:                                                             \
71
326k
    if (end - ptr < n)                                                         \
72
325k
      return XML_TOK_PARTIAL_CHAR;                                             \
73
326k
    if (IS_INVALID_CHAR(enc, ptr, n) || ! IS_NAME_CHAR(enc, ptr, n)) {         \
74
258
      *nextTokPtr = ptr;                                                       \
75
258
      return XML_TOK_INVALID;                                                  \
76
258
    }                                                                          \
77
326k
    ptr += n;                                                                  \
78
325k
    break;
79
80
#  define CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)                          \
81
31.8M
  case BT_NONASCII:                                                            \
82
31.8M
    if (! IS_NAME_CHAR_MINBPC(enc, ptr)) {                                     \
83
48
      *nextTokPtr = ptr;                                                       \
84
48
      return XML_TOK_INVALID;                                                  \
85
48
    }                                                                          \
86
31.8M
    /* fall through */                                                         \
87
31.8M
  case BT_NMSTRT:                                                              \
88
28.4M
  case BT_HEX:                                                                 \
89
31.5M
  case BT_DIGIT:                                                               \
90
31.6M
  case BT_NAME:                                                                \
91
31.8M
  case BT_MINUS:                                                               \
92
31.8M
    ptr += MINBPC(enc);                                                        \
93
31.8M
    break;                                                                     \
94
31.8M
    CHECK_NAME_CASE(2, enc, ptr, end, nextTokPtr)                              \
95
166k
    CHECK_NAME_CASE(3, enc, ptr, end, nextTokPtr)                              \
96
166k
    CHECK_NAME_CASE(4, enc, ptr, end, nextTokPtr)
97
98
#  define CHECK_NMSTRT_CASE(n, enc, ptr, end, nextTokPtr)                      \
99
101k
  case BT_LEAD##n:                                                             \
100
101k
    if ((end) - (ptr) < (n))                                                   \
101
101k
      return XML_TOK_PARTIAL_CHAR;                                             \
102
101k
    if (IS_INVALID_CHAR(enc, ptr, n) || ! IS_NMSTRT_CHAR(enc, ptr, n)) {       \
103
149
      *nextTokPtr = ptr;                                                       \
104
149
      return XML_TOK_INVALID;                                                  \
105
149
    }                                                                          \
106
101k
    ptr += n;                                                                  \
107
101k
    break;
108
109
#  define CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)                        \
110
2.98M
  case BT_NONASCII:                                                            \
111
2.98M
    if (! IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {                                   \
112
0
      *nextTokPtr = ptr;                                                       \
113
0
      return XML_TOK_INVALID;                                                  \
114
0
    }                                                                          \
115
2.98M
    /* fall through */                                                         \
116
2.98M
  case BT_NMSTRT:                                                              \
117
2.98M
  case BT_HEX:                                                                 \
118
2.98M
    ptr += MINBPC(enc);                                                        \
119
2.98M
    break;                                                                     \
120
2.98M
    CHECK_NMSTRT_CASE(2, enc, ptr, end, nextTokPtr)                            \
121
53.9k
    CHECK_NMSTRT_CASE(3, enc, ptr, end, nextTokPtr)                            \
122
53.9k
    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
307M
    ((end) - (ptr) >= ((count) * MINBPC(enc)))
130
131
10.0M
#  define HAS_CHAR(enc, ptr, end) HAS_CHARS(enc, ptr, end, 1)
132
133
#  define REQUIRE_CHARS(enc, ptr, end, count)                                  \
134
33.1M
    {                                                                          \
135
33.1M
      if (! HAS_CHARS(enc, ptr, end, count)) {                                 \
136
545
        return XML_TOK_PARTIAL;                                                \
137
545
      }                                                                        \
138
33.1M
    }
139
140
33.1M
#  define REQUIRE_CHAR(enc, ptr, end) REQUIRE_CHARS(enc, ptr, end, 1)
141
142
/* ptr points to character following "<!-" */
143
144
static int PTRCALL
145
PREFIX(scanComment)(const ENCODING *enc, const char *ptr, const char *end,
146
16.9k
                    const char **nextTokPtr) {
147
16.9k
  if (HAS_CHAR(enc, ptr, end)) {
148
16.8k
    if (! CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
149
10
      *nextTokPtr = ptr;
150
10
      return XML_TOK_INVALID;
151
10
    }
152
16.8k
    ptr += MINBPC(enc);
153
3.86M
    while (HAS_CHAR(enc, ptr, end)) {
154
3.86M
      switch (BYTE_TYPE(enc, ptr)) {
155
193k
        INVALID_CASES(ptr, nextTokPtr)
156
30.1k
      case BT_MINUS:
157
30.1k
        ptr += MINBPC(enc);
158
30.1k
        REQUIRE_CHAR(enc, ptr, end);
159
30.1k
        if (CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
160
16.7k
          ptr += MINBPC(enc);
161
16.7k
          REQUIRE_CHAR(enc, ptr, end);
162
16.7k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
163
8
            *nextTokPtr = ptr;
164
8
            return XML_TOK_INVALID;
165
8
          }
166
16.7k
          *nextTokPtr = ptr + MINBPC(enc);
167
16.7k
          return XML_TOK_COMMENT;
168
16.7k
        }
169
13.3k
        break;
170
3.73M
      default:
171
3.73M
        ptr += MINBPC(enc);
172
3.73M
        break;
173
3.86M
      }
174
3.86M
    }
175
16.8k
  }
176
88
  return XML_TOK_PARTIAL;
177
16.9k
}
xmltok.c:normal_scanComment
Line
Count
Source
146
16.9k
                    const char **nextTokPtr) {
147
16.9k
  if (HAS_CHAR(enc, ptr, end)) {
148
16.8k
    if (! CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
149
10
      *nextTokPtr = ptr;
150
10
      return XML_TOK_INVALID;
151
10
    }
152
16.8k
    ptr += MINBPC(enc);
153
3.86M
    while (HAS_CHAR(enc, ptr, end)) {
154
3.86M
      switch (BYTE_TYPE(enc, ptr)) {
155
193k
        INVALID_CASES(ptr, nextTokPtr)
156
30.1k
      case BT_MINUS:
157
30.1k
        ptr += MINBPC(enc);
158
30.1k
        REQUIRE_CHAR(enc, ptr, end);
159
30.1k
        if (CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
160
16.7k
          ptr += MINBPC(enc);
161
16.7k
          REQUIRE_CHAR(enc, ptr, end);
162
16.7k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
163
8
            *nextTokPtr = ptr;
164
8
            return XML_TOK_INVALID;
165
8
          }
166
16.7k
          *nextTokPtr = ptr + MINBPC(enc);
167
16.7k
          return XML_TOK_COMMENT;
168
16.7k
        }
169
13.3k
        break;
170
3.73M
      default:
171
3.73M
        ptr += MINBPC(enc);
172
3.73M
        break;
173
3.86M
      }
174
3.86M
    }
175
16.8k
  }
176
88
  return XML_TOK_PARTIAL;
177
16.9k
}
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
58.1k
                 const char **nextTokPtr) {
184
58.1k
  REQUIRE_CHAR(enc, ptr, end);
185
58.1k
  switch (BYTE_TYPE(enc, ptr)) {
186
2.34k
  case BT_MINUS:
187
2.34k
    return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
188
3
  case BT_LSQB:
189
3
    *nextTokPtr = ptr + MINBPC(enc);
190
3
    return XML_TOK_COND_SECT_OPEN;
191
1.09k
  case BT_NMSTRT:
192
55.7k
  case BT_HEX:
193
55.7k
    ptr += MINBPC(enc);
194
55.7k
    break;
195
3
  default:
196
3
    *nextTokPtr = ptr;
197
3
    return XML_TOK_INVALID;
198
58.1k
  }
199
407k
  while (HAS_CHAR(enc, ptr, end)) {
200
407k
    switch (BYTE_TYPE(enc, ptr)) {
201
19
    case BT_PERCNT:
202
19
      REQUIRE_CHARS(enc, ptr, end, 2);
203
      /* don't allow <!ENTITY% foo "whatever"> */
204
17
      switch (BYTE_TYPE(enc, ptr + MINBPC(enc))) {
205
1
      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
17
      }
212
      /* fall through */
213
20.5k
    case BT_S:
214
51.4k
    case BT_CR:
215
55.6k
    case BT_LF:
216
55.6k
      *nextTokPtr = ptr;
217
55.6k
      return XML_TOK_DECL_OPEN;
218
307k
    case BT_NMSTRT:
219
351k
    case BT_HEX:
220
351k
      ptr += MINBPC(enc);
221
351k
      break;
222
10
    default:
223
10
      *nextTokPtr = ptr;
224
10
      return XML_TOK_INVALID;
225
407k
    }
226
407k
  }
227
70
  return XML_TOK_PARTIAL;
228
55.7k
}
xmltok.c:normal_scanDecl
Line
Count
Source
183
58.1k
                 const char **nextTokPtr) {
184
58.1k
  REQUIRE_CHAR(enc, ptr, end);
185
58.1k
  switch (BYTE_TYPE(enc, ptr)) {
186
2.34k
  case BT_MINUS:
187
2.34k
    return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
188
3
  case BT_LSQB:
189
3
    *nextTokPtr = ptr + MINBPC(enc);
190
3
    return XML_TOK_COND_SECT_OPEN;
191
1.09k
  case BT_NMSTRT:
192
55.7k
  case BT_HEX:
193
55.7k
    ptr += MINBPC(enc);
194
55.7k
    break;
195
3
  default:
196
3
    *nextTokPtr = ptr;
197
3
    return XML_TOK_INVALID;
198
58.1k
  }
199
407k
  while (HAS_CHAR(enc, ptr, end)) {
200
407k
    switch (BYTE_TYPE(enc, ptr)) {
201
19
    case BT_PERCNT:
202
19
      REQUIRE_CHARS(enc, ptr, end, 2);
203
      /* don't allow <!ENTITY% foo "whatever"> */
204
17
      switch (BYTE_TYPE(enc, ptr + MINBPC(enc))) {
205
1
      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
17
      }
212
      /* fall through */
213
20.5k
    case BT_S:
214
51.4k
    case BT_CR:
215
55.6k
    case BT_LF:
216
55.6k
      *nextTokPtr = ptr;
217
55.6k
      return XML_TOK_DECL_OPEN;
218
307k
    case BT_NMSTRT:
219
351k
    case BT_HEX:
220
351k
      ptr += MINBPC(enc);
221
351k
      break;
222
10
    default:
223
10
      *nextTokPtr = ptr;
224
10
      return XML_TOK_INVALID;
225
407k
    }
226
407k
  }
227
70
  return XML_TOK_PARTIAL;
228
55.7k
}
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
40.4k
                      int *tokPtr) {
233
40.4k
  int upper = 0;
234
40.4k
  UNUSED_P(enc);
235
40.4k
  *tokPtr = XML_TOK_PI;
236
40.4k
  if (end - ptr != MINBPC(enc) * 3)
237
23.4k
    return 1;
238
16.9k
  switch (BYTE_TO_ASCII(enc, ptr)) {
239
5.94k
  case ASCII_x:
240
5.94k
    break;
241
3.22k
  case ASCII_X:
242
3.22k
    upper = 1;
243
3.22k
    break;
244
7.78k
  default:
245
7.78k
    return 1;
246
16.9k
  }
247
9.17k
  ptr += MINBPC(enc);
248
9.17k
  switch (BYTE_TO_ASCII(enc, ptr)) {
249
2.70k
  case ASCII_m:
250
2.70k
    break;
251
1.44k
  case ASCII_M:
252
1.44k
    upper = 1;
253
1.44k
    break;
254
5.02k
  default:
255
5.02k
    return 1;
256
9.17k
  }
257
4.15k
  ptr += MINBPC(enc);
258
4.15k
  switch (BYTE_TO_ASCII(enc, ptr)) {
259
1.17k
  case ASCII_l:
260
1.17k
    break;
261
2
  case ASCII_L:
262
2
    upper = 1;
263
2
    break;
264
2.97k
  default:
265
2.97k
    return 1;
266
4.15k
  }
267
1.17k
  if (upper)
268
4
    return 0;
269
1.17k
  *tokPtr = XML_TOK_XML_DECL;
270
1.17k
  return 1;
271
1.17k
}
xmltok.c:normal_checkPiTarget
Line
Count
Source
232
40.4k
                      int *tokPtr) {
233
40.4k
  int upper = 0;
234
40.4k
  UNUSED_P(enc);
235
40.4k
  *tokPtr = XML_TOK_PI;
236
40.4k
  if (end - ptr != MINBPC(enc) * 3)
237
23.4k
    return 1;
238
16.9k
  switch (BYTE_TO_ASCII(enc, ptr)) {
239
5.94k
  case ASCII_x:
240
5.94k
    break;
241
3.22k
  case ASCII_X:
242
3.22k
    upper = 1;
243
3.22k
    break;
244
7.78k
  default:
245
7.78k
    return 1;
246
16.9k
  }
247
9.17k
  ptr += MINBPC(enc);
248
9.17k
  switch (BYTE_TO_ASCII(enc, ptr)) {
249
2.70k
  case ASCII_m:
250
2.70k
    break;
251
1.44k
  case ASCII_M:
252
1.44k
    upper = 1;
253
1.44k
    break;
254
5.02k
  default:
255
5.02k
    return 1;
256
9.17k
  }
257
4.15k
  ptr += MINBPC(enc);
258
4.15k
  switch (BYTE_TO_ASCII(enc, ptr)) {
259
1.17k
  case ASCII_l:
260
1.17k
    break;
261
2
  case ASCII_L:
262
2
    upper = 1;
263
2
    break;
264
2.97k
  default:
265
2.97k
    return 1;
266
4.15k
  }
267
1.17k
  if (upper)
268
4
    return 0;
269
1.17k
  *tokPtr = XML_TOK_XML_DECL;
270
1.17k
  return 1;
271
1.17k
}
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
40.5k
               const char **nextTokPtr) {
278
40.5k
  int tok;
279
40.5k
  const char *target = ptr;
280
40.5k
  REQUIRE_CHAR(enc, ptr, end);
281
40.5k
  switch (BYTE_TYPE(enc, ptr)) {
282
53.1k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
283
2
  default:
284
2
    *nextTokPtr = ptr;
285
2
    return XML_TOK_INVALID;
286
40.5k
  }
287
5.41M
  while (HAS_CHAR(enc, ptr, end)) {
288
5.41M
    switch (BYTE_TYPE(enc, ptr)) {
289
20.8M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
290
16.0k
    case BT_S:
291
18.2k
    case BT_CR:
292
21.6k
    case BT_LF:
293
21.6k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
294
2
        *nextTokPtr = ptr;
295
2
        return XML_TOK_INVALID;
296
2
      }
297
21.6k
      ptr += MINBPC(enc);
298
12.1M
      while (HAS_CHAR(enc, ptr, end)) {
299
12.1M
        switch (BYTE_TYPE(enc, ptr)) {
300
505k
          INVALID_CASES(ptr, nextTokPtr)
301
93.4k
        case BT_QUEST:
302
93.4k
          ptr += MINBPC(enc);
303
93.4k
          REQUIRE_CHAR(enc, ptr, end);
304
93.4k
          if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
305
21.4k
            *nextTokPtr = ptr + MINBPC(enc);
306
21.4k
            return tok;
307
21.4k
          }
308
71.9k
          break;
309
11.8M
        default:
310
11.8M
          ptr += MINBPC(enc);
311
11.8M
          break;
312
12.1M
        }
313
12.1M
      }
314
102
      return XML_TOK_PARTIAL;
315
18.7k
    case BT_QUEST:
316
18.7k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
317
2
        *nextTokPtr = ptr;
318
2
        return XML_TOK_INVALID;
319
2
      }
320
18.7k
      ptr += MINBPC(enc);
321
18.7k
      REQUIRE_CHAR(enc, ptr, end);
322
18.7k
      if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
323
18.7k
        *nextTokPtr = ptr + MINBPC(enc);
324
18.7k
        return tok;
325
18.7k
      }
326
      /* fall through */
327
27
    default:
328
27
      *nextTokPtr = ptr;
329
27
      return XML_TOK_INVALID;
330
5.41M
    }
331
5.41M
  }
332
70
  return XML_TOK_PARTIAL;
333
40.5k
}
xmltok.c:normal_scanPi
Line
Count
Source
277
40.5k
               const char **nextTokPtr) {
278
40.5k
  int tok;
279
40.5k
  const char *target = ptr;
280
40.5k
  REQUIRE_CHAR(enc, ptr, end);
281
40.5k
  switch (BYTE_TYPE(enc, ptr)) {
282
53.1k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
283
2
  default:
284
2
    *nextTokPtr = ptr;
285
2
    return XML_TOK_INVALID;
286
40.5k
  }
287
5.41M
  while (HAS_CHAR(enc, ptr, end)) {
288
5.41M
    switch (BYTE_TYPE(enc, ptr)) {
289
20.8M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
290
16.0k
    case BT_S:
291
18.2k
    case BT_CR:
292
21.6k
    case BT_LF:
293
21.6k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
294
2
        *nextTokPtr = ptr;
295
2
        return XML_TOK_INVALID;
296
2
      }
297
21.6k
      ptr += MINBPC(enc);
298
12.1M
      while (HAS_CHAR(enc, ptr, end)) {
299
12.1M
        switch (BYTE_TYPE(enc, ptr)) {
300
505k
          INVALID_CASES(ptr, nextTokPtr)
301
93.4k
        case BT_QUEST:
302
93.4k
          ptr += MINBPC(enc);
303
93.4k
          REQUIRE_CHAR(enc, ptr, end);
304
93.4k
          if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
305
21.4k
            *nextTokPtr = ptr + MINBPC(enc);
306
21.4k
            return tok;
307
21.4k
          }
308
71.9k
          break;
309
11.8M
        default:
310
11.8M
          ptr += MINBPC(enc);
311
11.8M
          break;
312
12.1M
        }
313
12.1M
      }
314
102
      return XML_TOK_PARTIAL;
315
18.7k
    case BT_QUEST:
316
18.7k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
317
2
        *nextTokPtr = ptr;
318
2
        return XML_TOK_INVALID;
319
2
      }
320
18.7k
      ptr += MINBPC(enc);
321
18.7k
      REQUIRE_CHAR(enc, ptr, end);
322
18.7k
      if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
323
18.7k
        *nextTokPtr = ptr + MINBPC(enc);
324
18.7k
        return tok;
325
18.7k
      }
326
      /* fall through */
327
27
    default:
328
27
      *nextTokPtr = ptr;
329
27
      return XML_TOK_INVALID;
330
5.41M
    }
331
5.41M
  }
332
70
  return XML_TOK_PARTIAL;
333
40.5k
}
Unexecuted instantiation: xmltok.c:little2_scanPi
Unexecuted instantiation: xmltok.c:big2_scanPi
334
335
static int PTRCALL
336
PREFIX(scanCdataSection)(const ENCODING *enc, const char *ptr, const char *end,
337
2.26k
                         const char **nextTokPtr) {
338
2.26k
  static const char CDATA_LSQB[]
339
2.26k
      = {ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, ASCII_LSQB};
340
2.26k
  int i;
341
2.26k
  UNUSED_P(enc);
342
  /* CDATA[ */
343
2.26k
  REQUIRE_CHARS(enc, ptr, end, 6);
344
15.5k
  for (i = 0; i < 6; i++, ptr += MINBPC(enc)) {
345
13.3k
    if (! CHAR_MATCHES(enc, ptr, CDATA_LSQB[i])) {
346
50
      *nextTokPtr = ptr;
347
50
      return XML_TOK_INVALID;
348
50
    }
349
13.3k
  }
350
2.19k
  *nextTokPtr = ptr;
351
2.19k
  return XML_TOK_CDATA_SECT_OPEN;
352
2.24k
}
xmltok.c:normal_scanCdataSection
Line
Count
Source
337
2.26k
                         const char **nextTokPtr) {
338
2.26k
  static const char CDATA_LSQB[]
339
2.26k
      = {ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, ASCII_LSQB};
340
2.26k
  int i;
341
2.26k
  UNUSED_P(enc);
342
  /* CDATA[ */
343
2.26k
  REQUIRE_CHARS(enc, ptr, end, 6);
344
15.5k
  for (i = 0; i < 6; i++, ptr += MINBPC(enc)) {
345
13.3k
    if (! CHAR_MATCHES(enc, ptr, CDATA_LSQB[i])) {
346
50
      *nextTokPtr = ptr;
347
50
      return XML_TOK_INVALID;
348
50
    }
349
13.3k
  }
350
2.19k
  *nextTokPtr = ptr;
351
2.19k
  return XML_TOK_CDATA_SECT_OPEN;
352
2.24k
}
Unexecuted instantiation: xmltok.c:little2_scanCdataSection
Unexecuted instantiation: xmltok.c:big2_scanCdataSection
353
354
static int PTRCALL
355
PREFIX(cdataSectionTok)(const ENCODING *enc, const char *ptr, const char *end,
356
5.51M
                        const char **nextTokPtr) {
357
5.51M
  if (ptr >= end)
358
140
    return XML_TOK_NONE;
359
5.51M
  if (MINBPC(enc) > 1) {
360
0
    size_t n = end - ptr;
361
0
    if (n & (MINBPC(enc) - 1)) {
362
0
      n &= ~(MINBPC(enc) - 1);
363
0
      if (n == 0)
364
0
        return XML_TOK_PARTIAL;
365
0
      end = ptr + n;
366
0
    }
367
0
  }
368
5.51M
  switch (BYTE_TYPE(enc, ptr)) {
369
1.14M
  case BT_RSQB:
370
1.14M
    ptr += MINBPC(enc);
371
1.14M
    REQUIRE_CHAR(enc, ptr, end);
372
1.14M
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
373
600k
      break;
374
545k
    ptr += MINBPC(enc);
375
545k
    REQUIRE_CHAR(enc, ptr, end);
376
545k
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
377
543k
      ptr -= MINBPC(enc);
378
543k
      break;
379
543k
    }
380
2.08k
    *nextTokPtr = ptr + MINBPC(enc);
381
2.08k
    return XML_TOK_CDATA_SECT_CLOSE;
382
1.87M
  case BT_CR:
383
1.87M
    ptr += MINBPC(enc);
384
1.87M
    REQUIRE_CHAR(enc, ptr, end);
385
1.87M
    if (BYTE_TYPE(enc, ptr) == BT_LF)
386
323k
      ptr += MINBPC(enc);
387
1.87M
    *nextTokPtr = ptr;
388
1.87M
    return XML_TOK_DATA_NEWLINE;
389
1.36M
  case BT_LF:
390
1.36M
    *nextTokPtr = ptr + MINBPC(enc);
391
1.36M
    return XML_TOK_DATA_NEWLINE;
392
1.36M
    INVALID_CASES(ptr, nextTokPtr)
393
942k
  default:
394
942k
    ptr += MINBPC(enc);
395
942k
    break;
396
5.51M
  }
397
30.4M
  while (HAS_CHAR(enc, ptr, end)) {
398
30.4M
    switch (BYTE_TYPE(enc, ptr)) {
399
0
#  define LEAD_CASE(n)                                                         \
400
412k
  case BT_LEAD##n:                                                             \
401
412k
    if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) {                       \
402
17
      *nextTokPtr = ptr;                                                       \
403
17
      return XML_TOK_DATA_CHARS;                                               \
404
17
    }                                                                          \
405
412k
    ptr += n;                                                                  \
406
412k
    break;
407
172k
      LEAD_CASE(2)
408
152k
      LEAD_CASE(3)
409
87.6k
      LEAD_CASE(4)
410
0
#  undef LEAD_CASE
411
2
    case BT_NONXML:
412
7
    case BT_MALFORM:
413
11
    case BT_TRAIL:
414
874k
    case BT_CR:
415
1.35M
    case BT_LF:
416
2.27M
    case BT_RSQB:
417
2.27M
      *nextTokPtr = ptr;
418
2.27M
      return XML_TOK_DATA_CHARS;
419
27.7M
    default:
420
27.7M
      ptr += MINBPC(enc);
421
27.7M
      break;
422
30.4M
    }
423
30.4M
  }
424
43
  *nextTokPtr = ptr;
425
43
  return XML_TOK_DATA_CHARS;
426
2.27M
}
xmltok.c:normal_cdataSectionTok
Line
Count
Source
356
5.51M
                        const char **nextTokPtr) {
357
5.51M
  if (ptr >= end)
358
140
    return XML_TOK_NONE;
359
5.51M
  if (MINBPC(enc) > 1) {
360
0
    size_t n = end - ptr;
361
0
    if (n & (MINBPC(enc) - 1)) {
362
0
      n &= ~(MINBPC(enc) - 1);
363
0
      if (n == 0)
364
0
        return XML_TOK_PARTIAL;
365
0
      end = ptr + n;
366
0
    }
367
0
  }
368
5.51M
  switch (BYTE_TYPE(enc, ptr)) {
369
1.14M
  case BT_RSQB:
370
1.14M
    ptr += MINBPC(enc);
371
1.14M
    REQUIRE_CHAR(enc, ptr, end);
372
1.14M
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
373
600k
      break;
374
545k
    ptr += MINBPC(enc);
375
545k
    REQUIRE_CHAR(enc, ptr, end);
376
545k
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
377
543k
      ptr -= MINBPC(enc);
378
543k
      break;
379
543k
    }
380
2.08k
    *nextTokPtr = ptr + MINBPC(enc);
381
2.08k
    return XML_TOK_CDATA_SECT_CLOSE;
382
1.87M
  case BT_CR:
383
1.87M
    ptr += MINBPC(enc);
384
1.87M
    REQUIRE_CHAR(enc, ptr, end);
385
1.87M
    if (BYTE_TYPE(enc, ptr) == BT_LF)
386
323k
      ptr += MINBPC(enc);
387
1.87M
    *nextTokPtr = ptr;
388
1.87M
    return XML_TOK_DATA_NEWLINE;
389
1.36M
  case BT_LF:
390
1.36M
    *nextTokPtr = ptr + MINBPC(enc);
391
1.36M
    return XML_TOK_DATA_NEWLINE;
392
1.36M
    INVALID_CASES(ptr, nextTokPtr)
393
942k
  default:
394
942k
    ptr += MINBPC(enc);
395
942k
    break;
396
5.51M
  }
397
30.4M
  while (HAS_CHAR(enc, ptr, end)) {
398
30.4M
    switch (BYTE_TYPE(enc, ptr)) {
399
0
#  define LEAD_CASE(n)                                                         \
400
0
  case BT_LEAD##n:                                                             \
401
0
    if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) {                       \
402
0
      *nextTokPtr = ptr;                                                       \
403
0
      return XML_TOK_DATA_CHARS;                                               \
404
0
    }                                                                          \
405
0
    ptr += n;                                                                  \
406
0
    break;
407
172k
      LEAD_CASE(2)
408
152k
      LEAD_CASE(3)
409
87.6k
      LEAD_CASE(4)
410
0
#  undef LEAD_CASE
411
2
    case BT_NONXML:
412
7
    case BT_MALFORM:
413
11
    case BT_TRAIL:
414
874k
    case BT_CR:
415
1.35M
    case BT_LF:
416
2.27M
    case BT_RSQB:
417
2.27M
      *nextTokPtr = ptr;
418
2.27M
      return XML_TOK_DATA_CHARS;
419
27.7M
    default:
420
27.7M
      ptr += MINBPC(enc);
421
27.7M
      break;
422
30.4M
    }
423
30.4M
  }
424
43
  *nextTokPtr = ptr;
425
43
  return XML_TOK_DATA_CHARS;
426
2.27M
}
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
50.3k
                   const char **nextTokPtr) {
433
50.3k
  REQUIRE_CHAR(enc, ptr, end);
434
50.3k
  switch (BYTE_TYPE(enc, ptr)) {
435
47.2k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
436
8
  default:
437
8
    *nextTokPtr = ptr;
438
8
    return XML_TOK_INVALID;
439
50.3k
  }
440
515k
  while (HAS_CHAR(enc, ptr, end)) {
441
515k
    switch (BYTE_TYPE(enc, ptr)) {
442
1.48M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
443
502
    case BT_S:
444
1.41k
    case BT_CR:
445
3.68k
    case BT_LF:
446
14.4k
      for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
447
14.4k
        switch (BYTE_TYPE(enc, ptr)) {
448
3.89k
        case BT_S:
449
7.77k
        case BT_CR:
450
10.8k
        case BT_LF:
451
10.8k
          break;
452
3.64k
        case BT_GT:
453
3.64k
          *nextTokPtr = ptr + MINBPC(enc);
454
3.64k
          return XML_TOK_END_TAG;
455
2
        default:
456
2
          *nextTokPtr = ptr;
457
2
          return XML_TOK_INVALID;
458
14.4k
        }
459
14.4k
      }
460
40
      return XML_TOK_PARTIAL;
461
#  ifdef XML_NS
462
    case BT_COLON:
463
      /* no need to check qname syntax here,
464
         since end-tag must match exactly */
465
      ptr += MINBPC(enc);
466
      break;
467
#  endif
468
46.4k
    case BT_GT:
469
46.4k
      *nextTokPtr = ptr + MINBPC(enc);
470
46.4k
      return XML_TOK_END_TAG;
471
10
    default:
472
10
      *nextTokPtr = ptr;
473
10
      return XML_TOK_INVALID;
474
515k
    }
475
515k
  }
476
80
  return XML_TOK_PARTIAL;
477
50.2k
}
xmltok.c:normal_scanEndTag
Line
Count
Source
432
50.3k
                   const char **nextTokPtr) {
433
50.3k
  REQUIRE_CHAR(enc, ptr, end);
434
50.3k
  switch (BYTE_TYPE(enc, ptr)) {
435
47.2k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
436
8
  default:
437
8
    *nextTokPtr = ptr;
438
8
    return XML_TOK_INVALID;
439
50.3k
  }
440
515k
  while (HAS_CHAR(enc, ptr, end)) {
441
515k
    switch (BYTE_TYPE(enc, ptr)) {
442
1.48M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
443
502
    case BT_S:
444
1.41k
    case BT_CR:
445
3.68k
    case BT_LF:
446
14.4k
      for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
447
14.4k
        switch (BYTE_TYPE(enc, ptr)) {
448
3.89k
        case BT_S:
449
7.77k
        case BT_CR:
450
10.8k
        case BT_LF:
451
10.8k
          break;
452
3.64k
        case BT_GT:
453
3.64k
          *nextTokPtr = ptr + MINBPC(enc);
454
3.64k
          return XML_TOK_END_TAG;
455
2
        default:
456
2
          *nextTokPtr = ptr;
457
2
          return XML_TOK_INVALID;
458
14.4k
        }
459
14.4k
      }
460
40
      return XML_TOK_PARTIAL;
461
#  ifdef XML_NS
462
    case BT_COLON:
463
      /* no need to check qname syntax here,
464
         since end-tag must match exactly */
465
      ptr += MINBPC(enc);
466
      break;
467
#  endif
468
46.4k
    case BT_GT:
469
46.4k
      *nextTokPtr = ptr + MINBPC(enc);
470
46.4k
      return XML_TOK_END_TAG;
471
10
    default:
472
10
      *nextTokPtr = ptr;
473
10
      return XML_TOK_INVALID;
474
515k
    }
475
515k
  }
476
80
  return XML_TOK_PARTIAL;
477
50.2k
}
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
244k
                       const char **nextTokPtr) {
484
244k
  if (HAS_CHAR(enc, ptr, end)) {
485
244k
    switch (BYTE_TYPE(enc, ptr)) {
486
80.3k
    case BT_DIGIT:
487
244k
    case BT_HEX:
488
244k
      break;
489
4
    default:
490
4
      *nextTokPtr = ptr;
491
4
      return XML_TOK_INVALID;
492
244k
    }
493
876k
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
494
876k
      switch (BYTE_TYPE(enc, ptr)) {
495
398k
      case BT_DIGIT:
496
632k
      case BT_HEX:
497
632k
        break;
498
244k
      case BT_SEMI:
499
244k
        *nextTokPtr = ptr + MINBPC(enc);
500
244k
        return XML_TOK_CHAR_REF;
501
2
      default:
502
2
        *nextTokPtr = ptr;
503
2
        return XML_TOK_INVALID;
504
876k
      }
505
876k
    }
506
244k
  }
507
21
  return XML_TOK_PARTIAL;
508
244k
}
xmltok.c:normal_scanHexCharRef
Line
Count
Source
483
244k
                       const char **nextTokPtr) {
484
244k
  if (HAS_CHAR(enc, ptr, end)) {
485
244k
    switch (BYTE_TYPE(enc, ptr)) {
486
80.3k
    case BT_DIGIT:
487
244k
    case BT_HEX:
488
244k
      break;
489
4
    default:
490
4
      *nextTokPtr = ptr;
491
4
      return XML_TOK_INVALID;
492
244k
    }
493
876k
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
494
876k
      switch (BYTE_TYPE(enc, ptr)) {
495
398k
      case BT_DIGIT:
496
632k
      case BT_HEX:
497
632k
        break;
498
244k
      case BT_SEMI:
499
244k
        *nextTokPtr = ptr + MINBPC(enc);
500
244k
        return XML_TOK_CHAR_REF;
501
2
      default:
502
2
        *nextTokPtr = ptr;
503
2
        return XML_TOK_INVALID;
504
876k
      }
505
876k
    }
506
244k
  }
507
21
  return XML_TOK_PARTIAL;
508
244k
}
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
251k
                    const char **nextTokPtr) {
515
251k
  if (HAS_CHAR(enc, ptr, end)) {
516
251k
    if (CHAR_MATCHES(enc, ptr, ASCII_x))
517
244k
      return PREFIX(scanHexCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
518
6.97k
    switch (BYTE_TYPE(enc, ptr)) {
519
6.96k
    case BT_DIGIT:
520
6.96k
      break;
521
12
    default:
522
12
      *nextTokPtr = ptr;
523
12
      return XML_TOK_INVALID;
524
6.97k
    }
525
26.0k
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
526
26.0k
      switch (BYTE_TYPE(enc, ptr)) {
527
19.1k
      case BT_DIGIT:
528
19.1k
        break;
529
6.94k
      case BT_SEMI:
530
6.94k
        *nextTokPtr = ptr + MINBPC(enc);
531
6.94k
        return XML_TOK_CHAR_REF;
532
2
      default:
533
2
        *nextTokPtr = ptr;
534
2
        return XML_TOK_INVALID;
535
26.0k
      }
536
26.0k
    }
537
6.96k
  }
538
20
  return XML_TOK_PARTIAL;
539
251k
}
xmltok.c:normal_scanCharRef
Line
Count
Source
514
251k
                    const char **nextTokPtr) {
515
251k
  if (HAS_CHAR(enc, ptr, end)) {
516
251k
    if (CHAR_MATCHES(enc, ptr, ASCII_x))
517
244k
      return PREFIX(scanHexCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
518
6.97k
    switch (BYTE_TYPE(enc, ptr)) {
519
6.96k
    case BT_DIGIT:
520
6.96k
      break;
521
12
    default:
522
12
      *nextTokPtr = ptr;
523
12
      return XML_TOK_INVALID;
524
6.97k
    }
525
26.0k
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
526
26.0k
      switch (BYTE_TYPE(enc, ptr)) {
527
19.1k
      case BT_DIGIT:
528
19.1k
        break;
529
6.94k
      case BT_SEMI:
530
6.94k
        *nextTokPtr = ptr + MINBPC(enc);
531
6.94k
        return XML_TOK_CHAR_REF;
532
2
      default:
533
2
        *nextTokPtr = ptr;
534
2
        return XML_TOK_INVALID;
535
26.0k
      }
536
26.0k
    }
537
6.96k
  }
538
20
  return XML_TOK_PARTIAL;
539
251k
}
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
395k
                const char **nextTokPtr) {
546
395k
  REQUIRE_CHAR(enc, ptr, end);
547
395k
  switch (BYTE_TYPE(enc, ptr)) {
548
74.6k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
549
251k
  case BT_NUM:
550
251k
    return PREFIX(scanCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
551
5
  default:
552
5
    *nextTokPtr = ptr;
553
5
    return XML_TOK_INVALID;
554
395k
  }
555
751k
  while (HAS_CHAR(enc, ptr, end)) {
556
751k
    switch (BYTE_TYPE(enc, ptr)) {
557
2.23M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
558
143k
    case BT_SEMI:
559
143k
      *nextTokPtr = ptr + MINBPC(enc);
560
143k
      return XML_TOK_ENTITY_REF;
561
10
    default:
562
10
      *nextTokPtr = ptr;
563
10
      return XML_TOK_INVALID;
564
751k
    }
565
751k
  }
566
60
  return XML_TOK_PARTIAL;
567
143k
}
xmltok.c:normal_scanRef
Line
Count
Source
545
395k
                const char **nextTokPtr) {
546
395k
  REQUIRE_CHAR(enc, ptr, end);
547
395k
  switch (BYTE_TYPE(enc, ptr)) {
548
74.6k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
549
251k
  case BT_NUM:
550
251k
    return PREFIX(scanCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
551
5
  default:
552
5
    *nextTokPtr = ptr;
553
5
    return XML_TOK_INVALID;
554
395k
  }
555
751k
  while (HAS_CHAR(enc, ptr, end)) {
556
751k
    switch (BYTE_TYPE(enc, ptr)) {
557
2.23M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
558
143k
    case BT_SEMI:
559
143k
      *nextTokPtr = ptr + MINBPC(enc);
560
143k
      return XML_TOK_ENTITY_REF;
561
10
    default:
562
10
      *nextTokPtr = ptr;
563
10
      return XML_TOK_INVALID;
564
751k
    }
565
751k
  }
566
60
  return XML_TOK_PARTIAL;
567
143k
}
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
51.3k
                 const char **nextTokPtr) {
574
#  ifdef XML_NS
575
  int hadColon = 0;
576
#  endif
577
2.96M
  while (HAS_CHAR(enc, ptr, end)) {
578
2.96M
    switch (BYTE_TYPE(enc, ptr)) {
579
2.12M
      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
2.47k
    case BT_S:
598
16.4k
    case BT_CR:
599
17.8k
    case BT_LF:
600
50.8k
      for (;;) {
601
50.8k
        int t;
602
603
50.8k
        ptr += MINBPC(enc);
604
50.8k
        REQUIRE_CHAR(enc, ptr, end);
605
50.8k
        t = BYTE_TYPE(enc, ptr);
606
50.8k
        if (t == BT_EQUALS)
607
17.8k
          break;
608
32.9k
        switch (t) {
609
5.34k
        case BT_S:
610
8.77k
        case BT_LF:
611
32.9k
        case BT_CR:
612
32.9k
          break;
613
13
        default:
614
13
          *nextTokPtr = ptr;
615
13
          return XML_TOK_INVALID;
616
32.9k
        }
617
32.9k
      }
618
      /* fall through */
619
2.32M
    case BT_EQUALS: {
620
2.32M
      int open;
621
#  ifdef XML_NS
622
      hadColon = 0;
623
#  endif
624
2.36M
      for (;;) {
625
2.36M
        ptr += MINBPC(enc);
626
2.36M
        REQUIRE_CHAR(enc, ptr, end);
627
2.36M
        open = BYTE_TYPE(enc, ptr);
628
2.36M
        if (open == BT_QUOT || open == BT_APOS)
629
2.32M
          break;
630
49.0k
        switch (open) {
631
9.09k
        case BT_S:
632
18.8k
        case BT_LF:
633
49.0k
        case BT_CR:
634
49.0k
          break;
635
14
        default:
636
14
          *nextTokPtr = ptr;
637
14
          return XML_TOK_INVALID;
638
49.0k
        }
639
49.0k
      }
640
2.32M
      ptr += MINBPC(enc);
641
      /* in attribute value */
642
20.7M
      for (;;) {
643
20.7M
        int t;
644
20.7M
        REQUIRE_CHAR(enc, ptr, end);
645
20.7M
        t = BYTE_TYPE(enc, ptr);
646
20.7M
        if (t == open)
647
2.32M
          break;
648
18.4M
        switch (t) {
649
526k
          INVALID_CASES(ptr, nextTokPtr)
650
140k
        case BT_AMP: {
651
140k
          int tok = PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, &ptr);
652
140k
          if (tok <= 0) {
653
49
            if (tok == XML_TOK_INVALID)
654
31
              *nextTokPtr = ptr;
655
49
            return tok;
656
49
          }
657
140k
          break;
658
140k
        }
659
140k
        case BT_LT:
660
6
          *nextTokPtr = ptr;
661
6
          return XML_TOK_INVALID;
662
18.0M
        default:
663
18.0M
          ptr += MINBPC(enc);
664
18.0M
          break;
665
18.4M
        }
666
18.4M
      }
667
2.32M
      ptr += MINBPC(enc);
668
2.32M
      REQUIRE_CHAR(enc, ptr, end);
669
2.32M
      switch (BYTE_TYPE(enc, ptr)) {
670
1.18M
      case BT_S:
671
2.25M
      case BT_CR:
672
2.28M
      case BT_LF:
673
2.28M
        break;
674
25.6k
      case BT_SOL:
675
25.6k
        goto sol;
676
8.95k
      case BT_GT:
677
8.95k
        goto gt;
678
6
      default:
679
6
        *nextTokPtr = ptr;
680
6
        return XML_TOK_INVALID;
681
2.32M
      }
682
      /* ptr points to closing quote */
683
2.54M
      for (;;) {
684
2.54M
        ptr += MINBPC(enc);
685
2.54M
        REQUIRE_CHAR(enc, ptr, end);
686
2.54M
        switch (BYTE_TYPE(enc, ptr)) {
687
2.26M
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
688
159k
        case BT_S:
689
201k
        case BT_CR:
690
258k
        case BT_LF:
691
258k
          continue;
692
954
        case BT_GT:
693
9.90k
        gt:
694
9.90k
          *nextTokPtr = ptr + MINBPC(enc);
695
9.90k
          return XML_TOK_START_TAG_WITH_ATTS;
696
15.2k
        case BT_SOL:
697
40.8k
        sol:
698
40.8k
          ptr += MINBPC(enc);
699
40.8k
          REQUIRE_CHAR(enc, ptr, end);
700
40.8k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
701
8
            *nextTokPtr = ptr;
702
8
            return XML_TOK_INVALID;
703
8
          }
704
40.8k
          *nextTokPtr = ptr + MINBPC(enc);
705
40.8k
          return XML_TOK_EMPTY_ELEMENT_WITH_ATTS;
706
1
        default:
707
1
          *nextTokPtr = ptr;
708
1
          return XML_TOK_INVALID;
709
2.54M
        }
710
2.26M
        break;
711
2.54M
      }
712
2.26M
      break;
713
2.28M
    }
714
2.26M
    default:
715
18
      *nextTokPtr = ptr;
716
18
      return XML_TOK_INVALID;
717
2.96M
    }
718
2.96M
  }
719
98
  return XML_TOK_PARTIAL;
720
51.3k
}
xmltok.c:normal_scanAtts
Line
Count
Source
573
51.3k
                 const char **nextTokPtr) {
574
#  ifdef XML_NS
575
  int hadColon = 0;
576
#  endif
577
2.96M
  while (HAS_CHAR(enc, ptr, end)) {
578
2.96M
    switch (BYTE_TYPE(enc, ptr)) {
579
2.12M
      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
2.47k
    case BT_S:
598
16.4k
    case BT_CR:
599
17.8k
    case BT_LF:
600
50.8k
      for (;;) {
601
50.8k
        int t;
602
603
50.8k
        ptr += MINBPC(enc);
604
50.8k
        REQUIRE_CHAR(enc, ptr, end);
605
50.8k
        t = BYTE_TYPE(enc, ptr);
606
50.8k
        if (t == BT_EQUALS)
607
17.8k
          break;
608
32.9k
        switch (t) {
609
5.34k
        case BT_S:
610
8.77k
        case BT_LF:
611
32.9k
        case BT_CR:
612
32.9k
          break;
613
13
        default:
614
13
          *nextTokPtr = ptr;
615
13
          return XML_TOK_INVALID;
616
32.9k
        }
617
32.9k
      }
618
      /* fall through */
619
2.32M
    case BT_EQUALS: {
620
2.32M
      int open;
621
#  ifdef XML_NS
622
      hadColon = 0;
623
#  endif
624
2.36M
      for (;;) {
625
2.36M
        ptr += MINBPC(enc);
626
2.36M
        REQUIRE_CHAR(enc, ptr, end);
627
2.36M
        open = BYTE_TYPE(enc, ptr);
628
2.36M
        if (open == BT_QUOT || open == BT_APOS)
629
2.32M
          break;
630
49.0k
        switch (open) {
631
9.09k
        case BT_S:
632
18.8k
        case BT_LF:
633
49.0k
        case BT_CR:
634
49.0k
          break;
635
14
        default:
636
14
          *nextTokPtr = ptr;
637
14
          return XML_TOK_INVALID;
638
49.0k
        }
639
49.0k
      }
640
2.32M
      ptr += MINBPC(enc);
641
      /* in attribute value */
642
20.7M
      for (;;) {
643
20.7M
        int t;
644
20.7M
        REQUIRE_CHAR(enc, ptr, end);
645
20.7M
        t = BYTE_TYPE(enc, ptr);
646
20.7M
        if (t == open)
647
2.32M
          break;
648
18.4M
        switch (t) {
649
526k
          INVALID_CASES(ptr, nextTokPtr)
650
140k
        case BT_AMP: {
651
140k
          int tok = PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, &ptr);
652
140k
          if (tok <= 0) {
653
49
            if (tok == XML_TOK_INVALID)
654
31
              *nextTokPtr = ptr;
655
49
            return tok;
656
49
          }
657
140k
          break;
658
140k
        }
659
140k
        case BT_LT:
660
6
          *nextTokPtr = ptr;
661
6
          return XML_TOK_INVALID;
662
18.0M
        default:
663
18.0M
          ptr += MINBPC(enc);
664
18.0M
          break;
665
18.4M
        }
666
18.4M
      }
667
2.32M
      ptr += MINBPC(enc);
668
2.32M
      REQUIRE_CHAR(enc, ptr, end);
669
2.32M
      switch (BYTE_TYPE(enc, ptr)) {
670
1.18M
      case BT_S:
671
2.25M
      case BT_CR:
672
2.28M
      case BT_LF:
673
2.28M
        break;
674
25.6k
      case BT_SOL:
675
25.6k
        goto sol;
676
8.95k
      case BT_GT:
677
8.95k
        goto gt;
678
6
      default:
679
6
        *nextTokPtr = ptr;
680
6
        return XML_TOK_INVALID;
681
2.32M
      }
682
      /* ptr points to closing quote */
683
2.54M
      for (;;) {
684
2.54M
        ptr += MINBPC(enc);
685
2.54M
        REQUIRE_CHAR(enc, ptr, end);
686
2.54M
        switch (BYTE_TYPE(enc, ptr)) {
687
2.26M
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
688
159k
        case BT_S:
689
201k
        case BT_CR:
690
258k
        case BT_LF:
691
258k
          continue;
692
954
        case BT_GT:
693
9.90k
        gt:
694
9.90k
          *nextTokPtr = ptr + MINBPC(enc);
695
9.90k
          return XML_TOK_START_TAG_WITH_ATTS;
696
15.2k
        case BT_SOL:
697
40.8k
        sol:
698
40.8k
          ptr += MINBPC(enc);
699
40.8k
          REQUIRE_CHAR(enc, ptr, end);
700
40.8k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
701
8
            *nextTokPtr = ptr;
702
8
            return XML_TOK_INVALID;
703
8
          }
704
40.8k
          *nextTokPtr = ptr + MINBPC(enc);
705
40.8k
          return XML_TOK_EMPTY_ELEMENT_WITH_ATTS;
706
1
        default:
707
1
          *nextTokPtr = ptr;
708
1
          return XML_TOK_INVALID;
709
2.54M
        }
710
2.26M
        break;
711
2.54M
      }
712
2.26M
      break;
713
2.28M
    }
714
2.26M
    default:
715
18
      *nextTokPtr = ptr;
716
18
      return XML_TOK_INVALID;
717
2.96M
    }
718
2.96M
  }
719
98
  return XML_TOK_PARTIAL;
720
51.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
429k
               const char **nextTokPtr) {
727
#  ifdef XML_NS
728
  int hadColon;
729
#  endif
730
429k
  REQUIRE_CHAR(enc, ptr, end);
731
429k
  switch (BYTE_TYPE(enc, ptr)) {
732
300k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
733
16.8k
  case BT_EXCL:
734
16.8k
    ptr += MINBPC(enc);
735
16.8k
    REQUIRE_CHAR(enc, ptr, end);
736
16.8k
    switch (BYTE_TYPE(enc, ptr)) {
737
14.5k
    case BT_MINUS:
738
14.5k
      return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
739
2.26k
    case BT_LSQB:
740
2.26k
      return PREFIX(scanCdataSection)(enc, ptr + MINBPC(enc), end, nextTokPtr);
741
16.8k
    }
742
2
    *nextTokPtr = ptr;
743
2
    return XML_TOK_INVALID;
744
31.8k
  case BT_QUEST:
745
31.8k
    return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
746
50.3k
  case BT_SOL:
747
50.3k
    return PREFIX(scanEndTag)(enc, ptr + MINBPC(enc), end, nextTokPtr);
748
9
  default:
749
9
    *nextTokPtr = ptr;
750
9
    return XML_TOK_INVALID;
751
429k
  }
752
#  ifdef XML_NS
753
  hadColon = 0;
754
#  endif
755
  /* we have a start-tag */
756
10.8M
  while (HAS_CHAR(enc, ptr, end)) {
757
10.8M
    switch (BYTE_TYPE(enc, ptr)) {
758
41.6M
      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
47.6k
    case BT_S:
777
55.5k
    case BT_CR:
778
61.0k
    case BT_LF: {
779
61.0k
      ptr += MINBPC(enc);
780
83.9k
      while (HAS_CHAR(enc, ptr, end)) {
781
83.9k
        switch (BYTE_TYPE(enc, ptr)) {
782
31.4k
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
783
1.02k
        case BT_GT:
784
1.02k
          goto gt;
785
8.61k
        case BT_SOL:
786
8.61k
          goto sol;
787
2.61k
        case BT_S:
788
21.2k
        case BT_CR:
789
22.9k
        case BT_LF:
790
22.9k
          ptr += MINBPC(enc);
791
22.9k
          continue;
792
7
        default:
793
7
          *nextTokPtr = ptr;
794
7
          return XML_TOK_INVALID;
795
83.9k
        }
796
51.3k
        return PREFIX(scanAtts)(enc, ptr, end, nextTokPtr);
797
83.9k
      }
798
58
      return XML_TOK_PARTIAL;
799
61.0k
    }
800
211k
    case BT_GT:
801
212k
    gt:
802
212k
      *nextTokPtr = ptr + MINBPC(enc);
803
212k
      return XML_TOK_START_TAG_NO_ATTS;
804
56.9k
    case BT_SOL:
805
65.5k
    sol:
806
65.5k
      ptr += MINBPC(enc);
807
65.5k
      REQUIRE_CHAR(enc, ptr, end);
808
65.5k
      if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
809
11
        *nextTokPtr = ptr;
810
11
        return XML_TOK_INVALID;
811
11
      }
812
65.5k
      *nextTokPtr = ptr + MINBPC(enc);
813
65.5k
      return XML_TOK_EMPTY_ELEMENT_NO_ATTS;
814
22
    default:
815
22
      *nextTokPtr = ptr;
816
22
      return XML_TOK_INVALID;
817
10.8M
    }
818
10.8M
  }
819
168
  return XML_TOK_PARTIAL;
820
329k
}
xmltok.c:normal_scanLt
Line
Count
Source
726
429k
               const char **nextTokPtr) {
727
#  ifdef XML_NS
728
  int hadColon;
729
#  endif
730
429k
  REQUIRE_CHAR(enc, ptr, end);
731
429k
  switch (BYTE_TYPE(enc, ptr)) {
732
300k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
733
16.8k
  case BT_EXCL:
734
16.8k
    ptr += MINBPC(enc);
735
16.8k
    REQUIRE_CHAR(enc, ptr, end);
736
16.8k
    switch (BYTE_TYPE(enc, ptr)) {
737
14.5k
    case BT_MINUS:
738
14.5k
      return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
739
2.26k
    case BT_LSQB:
740
2.26k
      return PREFIX(scanCdataSection)(enc, ptr + MINBPC(enc), end, nextTokPtr);
741
16.8k
    }
742
2
    *nextTokPtr = ptr;
743
2
    return XML_TOK_INVALID;
744
31.8k
  case BT_QUEST:
745
31.8k
    return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
746
50.3k
  case BT_SOL:
747
50.3k
    return PREFIX(scanEndTag)(enc, ptr + MINBPC(enc), end, nextTokPtr);
748
9
  default:
749
9
    *nextTokPtr = ptr;
750
9
    return XML_TOK_INVALID;
751
429k
  }
752
#  ifdef XML_NS
753
  hadColon = 0;
754
#  endif
755
  /* we have a start-tag */
756
10.8M
  while (HAS_CHAR(enc, ptr, end)) {
757
10.8M
    switch (BYTE_TYPE(enc, ptr)) {
758
41.6M
      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
47.6k
    case BT_S:
777
55.5k
    case BT_CR:
778
61.0k
    case BT_LF: {
779
61.0k
      ptr += MINBPC(enc);
780
83.9k
      while (HAS_CHAR(enc, ptr, end)) {
781
83.9k
        switch (BYTE_TYPE(enc, ptr)) {
782
31.4k
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
783
1.02k
        case BT_GT:
784
1.02k
          goto gt;
785
8.61k
        case BT_SOL:
786
8.61k
          goto sol;
787
2.61k
        case BT_S:
788
21.2k
        case BT_CR:
789
22.9k
        case BT_LF:
790
22.9k
          ptr += MINBPC(enc);
791
22.9k
          continue;
792
7
        default:
793
7
          *nextTokPtr = ptr;
794
7
          return XML_TOK_INVALID;
795
83.9k
        }
796
51.3k
        return PREFIX(scanAtts)(enc, ptr, end, nextTokPtr);
797
83.9k
      }
798
58
      return XML_TOK_PARTIAL;
799
61.0k
    }
800
211k
    case BT_GT:
801
212k
    gt:
802
212k
      *nextTokPtr = ptr + MINBPC(enc);
803
212k
      return XML_TOK_START_TAG_NO_ATTS;
804
56.9k
    case BT_SOL:
805
65.5k
    sol:
806
65.5k
      ptr += MINBPC(enc);
807
65.5k
      REQUIRE_CHAR(enc, ptr, end);
808
65.5k
      if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
809
11
        *nextTokPtr = ptr;
810
11
        return XML_TOK_INVALID;
811
11
      }
812
65.5k
      *nextTokPtr = ptr + MINBPC(enc);
813
65.5k
      return XML_TOK_EMPTY_ELEMENT_NO_ATTS;
814
22
    default:
815
22
      *nextTokPtr = ptr;
816
22
      return XML_TOK_INVALID;
817
10.8M
    }
818
10.8M
  }
819
168
  return XML_TOK_PARTIAL;
820
329k
}
Unexecuted instantiation: xmltok.c:little2_scanLt
Unexecuted instantiation: xmltok.c:big2_scanLt
821
822
static int PTRCALL
823
PREFIX(contentTok)(const ENCODING *enc, const char *ptr, const char *end,
824
3.77M
                   const char **nextTokPtr) {
825
3.77M
  if (ptr >= end)
826
5.45k
    return XML_TOK_NONE;
827
3.76M
  if (MINBPC(enc) > 1) {
828
0
    size_t n = end - ptr;
829
0
    if (n & (MINBPC(enc) - 1)) {
830
0
      n &= ~(MINBPC(enc) - 1);
831
0
      if (n == 0)
832
0
        return XML_TOK_PARTIAL;
833
0
      end = ptr + n;
834
0
    }
835
0
  }
836
3.76M
  switch (BYTE_TYPE(enc, ptr)) {
837
429k
  case BT_LT:
838
429k
    return PREFIX(scanLt)(enc, ptr + MINBPC(enc), end, nextTokPtr);
839
44.3k
  case BT_AMP:
840
44.3k
    return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
841
1.34M
  case BT_CR:
842
1.34M
    ptr += MINBPC(enc);
843
1.34M
    if (! HAS_CHAR(enc, ptr, end))
844
16
      return XML_TOK_TRAILING_CR;
845
1.34M
    if (BYTE_TYPE(enc, ptr) == BT_LF)
846
300k
      ptr += MINBPC(enc);
847
1.34M
    *nextTokPtr = ptr;
848
1.34M
    return XML_TOK_DATA_NEWLINE;
849
1.16M
  case BT_LF:
850
1.16M
    *nextTokPtr = ptr + MINBPC(enc);
851
1.16M
    return XML_TOK_DATA_NEWLINE;
852
79.8k
  case BT_RSQB:
853
79.8k
    ptr += MINBPC(enc);
854
79.8k
    if (! HAS_CHAR(enc, ptr, end))
855
8
      return XML_TOK_TRAILING_RSQB;
856
79.8k
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
857
27.9k
      break;
858
51.9k
    ptr += MINBPC(enc);
859
51.9k
    if (! HAS_CHAR(enc, ptr, end))
860
4
      return XML_TOK_TRAILING_RSQB;
861
51.9k
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
862
51.9k
      ptr -= MINBPC(enc);
863
51.9k
      break;
864
51.9k
    }
865
1
    *nextTokPtr = ptr;
866
1
    return XML_TOK_INVALID;
867
126k
    INVALID_CASES(ptr, nextTokPtr)
868
643k
  default:
869
643k
    ptr += MINBPC(enc);
870
643k
    break;
871
3.76M
  }
872
16.6M
  while (HAS_CHAR(enc, ptr, end)) {
873
16.6M
    switch (BYTE_TYPE(enc, ptr)) {
874
0
#  define LEAD_CASE(n)                                                         \
875
145k
  case BT_LEAD##n:                                                             \
876
145k
    if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) {                       \
877
26
      *nextTokPtr = ptr;                                                       \
878
26
      return XML_TOK_DATA_CHARS;                                               \
879
26
    }                                                                          \
880
145k
    ptr += n;                                                                  \
881
145k
    break;
882
72.8k
      LEAD_CASE(2)
883
33.8k
      LEAD_CASE(3)
884
38.3k
      LEAD_CASE(4)
885
0
#  undef LEAD_CASE
886
400k
    case BT_RSQB:
887
400k
      if (HAS_CHARS(enc, ptr, end, 2)) {
888
400k
        if (! CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_RSQB)) {
889
149k
          ptr += MINBPC(enc);
890
149k
          break;
891
149k
        }
892
250k
        if (HAS_CHARS(enc, ptr, end, 3)) {
893
250k
          if (! CHAR_MATCHES(enc, ptr + 2 * MINBPC(enc), ASCII_GT)) {
894
250k
            ptr += MINBPC(enc);
895
250k
            break;
896
250k
          }
897
2
          *nextTokPtr = ptr + 2 * MINBPC(enc);
898
2
          return XML_TOK_INVALID;
899
250k
        }
900
250k
      }
901
      /* fall through */
902
22.8k
    case BT_AMP:
903
150k
    case BT_LT:
904
150k
    case BT_NONXML:
905
150k
    case BT_MALFORM:
906
150k
    case BT_TRAIL:
907
534k
    case BT_CR:
908
782k
    case BT_LF:
909
782k
      *nextTokPtr = ptr;
910
782k
      return XML_TOK_DATA_CHARS;
911
15.3M
    default:
912
15.3M
      ptr += MINBPC(enc);
913
15.3M
      break;
914
16.6M
    }
915
16.6M
  }
916
4.00k
  *nextTokPtr = ptr;
917
4.00k
  return XML_TOK_DATA_CHARS;
918
786k
}
xmltok.c:normal_contentTok
Line
Count
Source
824
3.77M
                   const char **nextTokPtr) {
825
3.77M
  if (ptr >= end)
826
5.45k
    return XML_TOK_NONE;
827
3.76M
  if (MINBPC(enc) > 1) {
828
0
    size_t n = end - ptr;
829
0
    if (n & (MINBPC(enc) - 1)) {
830
0
      n &= ~(MINBPC(enc) - 1);
831
0
      if (n == 0)
832
0
        return XML_TOK_PARTIAL;
833
0
      end = ptr + n;
834
0
    }
835
0
  }
836
3.76M
  switch (BYTE_TYPE(enc, ptr)) {
837
429k
  case BT_LT:
838
429k
    return PREFIX(scanLt)(enc, ptr + MINBPC(enc), end, nextTokPtr);
839
44.3k
  case BT_AMP:
840
44.3k
    return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
841
1.34M
  case BT_CR:
842
1.34M
    ptr += MINBPC(enc);
843
1.34M
    if (! HAS_CHAR(enc, ptr, end))
844
16
      return XML_TOK_TRAILING_CR;
845
1.34M
    if (BYTE_TYPE(enc, ptr) == BT_LF)
846
300k
      ptr += MINBPC(enc);
847
1.34M
    *nextTokPtr = ptr;
848
1.34M
    return XML_TOK_DATA_NEWLINE;
849
1.16M
  case BT_LF:
850
1.16M
    *nextTokPtr = ptr + MINBPC(enc);
851
1.16M
    return XML_TOK_DATA_NEWLINE;
852
79.8k
  case BT_RSQB:
853
79.8k
    ptr += MINBPC(enc);
854
79.8k
    if (! HAS_CHAR(enc, ptr, end))
855
8
      return XML_TOK_TRAILING_RSQB;
856
79.8k
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
857
27.9k
      break;
858
51.9k
    ptr += MINBPC(enc);
859
51.9k
    if (! HAS_CHAR(enc, ptr, end))
860
4
      return XML_TOK_TRAILING_RSQB;
861
51.9k
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
862
51.9k
      ptr -= MINBPC(enc);
863
51.9k
      break;
864
51.9k
    }
865
1
    *nextTokPtr = ptr;
866
1
    return XML_TOK_INVALID;
867
126k
    INVALID_CASES(ptr, nextTokPtr)
868
643k
  default:
869
643k
    ptr += MINBPC(enc);
870
643k
    break;
871
3.76M
  }
872
16.6M
  while (HAS_CHAR(enc, ptr, end)) {
873
16.6M
    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
72.8k
      LEAD_CASE(2)
883
33.8k
      LEAD_CASE(3)
884
38.3k
      LEAD_CASE(4)
885
0
#  undef LEAD_CASE
886
400k
    case BT_RSQB:
887
400k
      if (HAS_CHARS(enc, ptr, end, 2)) {
888
400k
        if (! CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_RSQB)) {
889
149k
          ptr += MINBPC(enc);
890
149k
          break;
891
149k
        }
892
250k
        if (HAS_CHARS(enc, ptr, end, 3)) {
893
250k
          if (! CHAR_MATCHES(enc, ptr + 2 * MINBPC(enc), ASCII_GT)) {
894
250k
            ptr += MINBPC(enc);
895
250k
            break;
896
250k
          }
897
2
          *nextTokPtr = ptr + 2 * MINBPC(enc);
898
2
          return XML_TOK_INVALID;
899
250k
        }
900
250k
      }
901
      /* fall through */
902
22.8k
    case BT_AMP:
903
150k
    case BT_LT:
904
150k
    case BT_NONXML:
905
150k
    case BT_MALFORM:
906
150k
    case BT_TRAIL:
907
534k
    case BT_CR:
908
782k
    case BT_LF:
909
782k
      *nextTokPtr = ptr;
910
782k
      return XML_TOK_DATA_CHARS;
911
15.3M
    default:
912
15.3M
      ptr += MINBPC(enc);
913
15.3M
      break;
914
16.6M
    }
915
16.6M
  }
916
4.00k
  *nextTokPtr = ptr;
917
4.00k
  return XML_TOK_DATA_CHARS;
918
786k
}
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
62.8k
                    const char **nextTokPtr) {
925
62.8k
  REQUIRE_CHAR(enc, ptr, end);
926
62.8k
  switch (BYTE_TYPE(enc, ptr)) {
927
81.6k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
928
534
  case BT_S:
929
1.11k
  case BT_LF:
930
1.63k
  case BT_CR:
931
1.63k
  case BT_PERCNT:
932
1.63k
    *nextTokPtr = ptr;
933
1.63k
    return XML_TOK_PERCENT;
934
3
  default:
935
3
    *nextTokPtr = ptr;
936
3
    return XML_TOK_INVALID;
937
62.8k
  }
938
1.71M
  while (HAS_CHAR(enc, ptr, end)) {
939
1.71M
    switch (BYTE_TYPE(enc, ptr)) {
940
5.05M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
941
60.9k
    case BT_SEMI:
942
60.9k
      *nextTokPtr = ptr + MINBPC(enc);
943
60.9k
      return XML_TOK_PARAM_ENTITY_REF;
944
20
    default:
945
20
      *nextTokPtr = ptr;
946
20
      return XML_TOK_INVALID;
947
1.71M
    }
948
1.71M
  }
949
72
  return XML_TOK_PARTIAL;
950
61.1k
}
xmltok.c:normal_scanPercent
Line
Count
Source
924
62.8k
                    const char **nextTokPtr) {
925
62.8k
  REQUIRE_CHAR(enc, ptr, end);
926
62.8k
  switch (BYTE_TYPE(enc, ptr)) {
927
81.6k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
928
534
  case BT_S:
929
1.11k
  case BT_LF:
930
1.63k
  case BT_CR:
931
1.63k
  case BT_PERCNT:
932
1.63k
    *nextTokPtr = ptr;
933
1.63k
    return XML_TOK_PERCENT;
934
3
  default:
935
3
    *nextTokPtr = ptr;
936
3
    return XML_TOK_INVALID;
937
62.8k
  }
938
1.71M
  while (HAS_CHAR(enc, ptr, end)) {
939
1.71M
    switch (BYTE_TYPE(enc, ptr)) {
940
5.05M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
941
60.9k
    case BT_SEMI:
942
60.9k
      *nextTokPtr = ptr + MINBPC(enc);
943
60.9k
      return XML_TOK_PARAM_ENTITY_REF;
944
20
    default:
945
20
      *nextTokPtr = ptr;
946
20
      return XML_TOK_INVALID;
947
1.71M
    }
948
1.71M
  }
949
72
  return XML_TOK_PARTIAL;
950
61.1k
}
Unexecuted instantiation: xmltok.c:little2_scanPercent
Unexecuted instantiation: xmltok.c:big2_scanPercent
951
952
static int PTRCALL
953
PREFIX(scanPoundName)(const ENCODING *enc, const char *ptr, const char *end,
954
141k
                      const char **nextTokPtr) {
955
141k
  REQUIRE_CHAR(enc, ptr, end);
956
141k
  switch (BYTE_TYPE(enc, ptr)) {
957
140k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
958
2
  default:
959
2
    *nextTokPtr = ptr;
960
2
    return XML_TOK_INVALID;
961
141k
  }
962
1.04M
  while (HAS_CHAR(enc, ptr, end)) {
963
1.04M
    switch (BYTE_TYPE(enc, ptr)) {
964
3.29M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
965
72.0k
    case BT_CR:
966
78.5k
    case BT_LF:
967
136k
    case BT_S:
968
137k
    case BT_RPAR:
969
140k
    case BT_GT:
970
140k
    case BT_PERCNT:
971
140k
    case BT_VERBAR:
972
140k
      *nextTokPtr = ptr;
973
140k
      return XML_TOK_POUND_NAME;
974
17
    default:
975
17
      *nextTokPtr = ptr;
976
17
      return XML_TOK_INVALID;
977
1.04M
    }
978
1.04M
  }
979
220
  return -XML_TOK_POUND_NAME;
980
141k
}
xmltok.c:normal_scanPoundName
Line
Count
Source
954
141k
                      const char **nextTokPtr) {
955
141k
  REQUIRE_CHAR(enc, ptr, end);
956
141k
  switch (BYTE_TYPE(enc, ptr)) {
957
140k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
958
2
  default:
959
2
    *nextTokPtr = ptr;
960
2
    return XML_TOK_INVALID;
961
141k
  }
962
1.04M
  while (HAS_CHAR(enc, ptr, end)) {
963
1.04M
    switch (BYTE_TYPE(enc, ptr)) {
964
3.29M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
965
72.0k
    case BT_CR:
966
78.5k
    case BT_LF:
967
136k
    case BT_S:
968
137k
    case BT_RPAR:
969
140k
    case BT_GT:
970
140k
    case BT_PERCNT:
971
140k
    case BT_VERBAR:
972
140k
      *nextTokPtr = ptr;
973
140k
      return XML_TOK_POUND_NAME;
974
17
    default:
975
17
      *nextTokPtr = ptr;
976
17
      return XML_TOK_INVALID;
977
1.04M
    }
978
1.04M
  }
979
220
  return -XML_TOK_POUND_NAME;
980
141k
}
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
56.6k
                const char **nextTokPtr) {
985
6.59M
  while (HAS_CHAR(enc, ptr, end)) {
986
6.59M
    int t = BYTE_TYPE(enc, ptr);
987
6.59M
    switch (t) {
988
131k
      INVALID_CASES(ptr, nextTokPtr)
989
8.35k
    case BT_QUOT:
990
59.5k
    case BT_APOS:
991
59.5k
      ptr += MINBPC(enc);
992
59.5k
      if (t != open)
993
3.00k
        break;
994
56.5k
      if (! HAS_CHAR(enc, ptr, end))
995
463
        return -XML_TOK_LITERAL;
996
56.0k
      *nextTokPtr = ptr;
997
56.0k
      switch (BYTE_TYPE(enc, ptr)) {
998
5.28k
      case BT_S:
999
8.38k
      case BT_CR:
1000
30.5k
      case BT_LF:
1001
55.7k
      case BT_GT:
1002
55.7k
      case BT_PERCNT:
1003
56.0k
      case BT_LSQB:
1004
56.0k
        return XML_TOK_LITERAL;
1005
9
      default:
1006
9
        return XML_TOK_INVALID;
1007
56.0k
      }
1008
6.47M
    default:
1009
6.47M
      ptr += MINBPC(enc);
1010
6.47M
      break;
1011
6.59M
    }
1012
6.59M
  }
1013
86
  return XML_TOK_PARTIAL;
1014
56.6k
}
xmltok.c:normal_scanLit
Line
Count
Source
984
56.6k
                const char **nextTokPtr) {
985
6.59M
  while (HAS_CHAR(enc, ptr, end)) {
986
6.59M
    int t = BYTE_TYPE(enc, ptr);
987
6.59M
    switch (t) {
988
131k
      INVALID_CASES(ptr, nextTokPtr)
989
8.35k
    case BT_QUOT:
990
59.5k
    case BT_APOS:
991
59.5k
      ptr += MINBPC(enc);
992
59.5k
      if (t != open)
993
3.00k
        break;
994
56.5k
      if (! HAS_CHAR(enc, ptr, end))
995
463
        return -XML_TOK_LITERAL;
996
56.0k
      *nextTokPtr = ptr;
997
56.0k
      switch (BYTE_TYPE(enc, ptr)) {
998
5.28k
      case BT_S:
999
8.38k
      case BT_CR:
1000
30.5k
      case BT_LF:
1001
55.7k
      case BT_GT:
1002
55.7k
      case BT_PERCNT:
1003
56.0k
      case BT_LSQB:
1004
56.0k
        return XML_TOK_LITERAL;
1005
9
      default:
1006
9
        return XML_TOK_INVALID;
1007
56.0k
      }
1008
6.47M
    default:
1009
6.47M
      ptr += MINBPC(enc);
1010
6.47M
      break;
1011
6.59M
    }
1012
6.59M
  }
1013
86
  return XML_TOK_PARTIAL;
1014
56.6k
}
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
4.87M
                  const char **nextTokPtr) {
1019
4.87M
  int tok;
1020
4.87M
  if (ptr >= end)
1021
8.39k
    return XML_TOK_NONE;
1022
4.86M
  if (MINBPC(enc) > 1) {
1023
232
    size_t n = end - ptr;
1024
232
    if (n & (MINBPC(enc) - 1)) {
1025
46
      n &= ~(MINBPC(enc) - 1);
1026
46
      if (n == 0)
1027
4
        return XML_TOK_PARTIAL;
1028
42
      end = ptr + n;
1029
42
    }
1030
232
  }
1031
4.86M
  switch (BYTE_TYPE(enc, ptr)) {
1032
6.28k
  case BT_QUOT:
1033
6.28k
    return PREFIX(scanLit)(BT_QUOT, enc, ptr + MINBPC(enc), end, nextTokPtr);
1034
50.3k
  case BT_APOS:
1035
50.3k
    return PREFIX(scanLit)(BT_APOS, enc, ptr + MINBPC(enc), end, nextTokPtr);
1036
72.7k
  case BT_LT: {
1037
72.7k
    ptr += MINBPC(enc);
1038
72.7k
    REQUIRE_CHAR(enc, ptr, end);
1039
72.7k
    switch (BYTE_TYPE(enc, ptr)) {
1040
58.1k
    case BT_EXCL:
1041
58.1k
      return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1042
8.69k
    case BT_QUEST:
1043
8.69k
      return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1044
4.49k
    case BT_NMSTRT:
1045
5.77k
    case BT_HEX:
1046
5.77k
    case BT_NONASCII:
1047
5.82k
    case BT_LEAD2:
1048
5.85k
    case BT_LEAD3:
1049
5.86k
    case BT_LEAD4:
1050
5.86k
      *nextTokPtr = ptr - MINBPC(enc);
1051
5.86k
      return XML_TOK_INSTANCE_START;
1052
72.7k
    }
1053
23
    *nextTokPtr = ptr;
1054
23
    return XML_TOK_INVALID;
1055
72.7k
  }
1056
308k
  case BT_CR:
1057
308k
    if (ptr + MINBPC(enc) == end) {
1058
326
      *nextTokPtr = end;
1059
      /* indicate that this might be part of a CR/LF pair */
1060
326
      return -XML_TOK_PROLOG_S;
1061
326
    }
1062
    /* fall through */
1063
572k
  case BT_S:
1064
651k
  case BT_LF:
1065
668k
    for (;;) {
1066
668k
      ptr += MINBPC(enc);
1067
668k
      if (! HAS_CHAR(enc, ptr, end))
1068
193
        break;
1069
668k
      switch (BYTE_TYPE(enc, ptr)) {
1070
4.53k
      case BT_S:
1071
12.1k
      case BT_LF:
1072
12.1k
        break;
1073
5.18k
      case BT_CR:
1074
        /* don't split CR/LF pair */
1075
5.18k
        if (ptr + MINBPC(enc) != end)
1076
5.04k
          break;
1077
        /* fall through */
1078
650k
      default:
1079
650k
        *nextTokPtr = ptr;
1080
650k
        return XML_TOK_PROLOG_S;
1081
668k
      }
1082
668k
    }
1083
193
    *nextTokPtr = ptr;
1084
193
    return XML_TOK_PROLOG_S;
1085
62.8k
  case BT_PERCNT:
1086
62.8k
    return PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1087
1.42k
  case BT_COMMA:
1088
1.42k
    *nextTokPtr = ptr + MINBPC(enc);
1089
1.42k
    return XML_TOK_COMMA;
1090
2.63k
  case BT_LSQB:
1091
2.63k
    *nextTokPtr = ptr + MINBPC(enc);
1092
2.63k
    return XML_TOK_OPEN_BRACKET;
1093
1.38k
  case BT_RSQB:
1094
1.38k
    ptr += MINBPC(enc);
1095
1.38k
    if (! HAS_CHAR(enc, ptr, end))
1096
3
      return -XML_TOK_CLOSE_BRACKET;
1097
1.38k
    if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) {
1098
22
      REQUIRE_CHARS(enc, ptr, end, 2);
1099
20
      if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_GT)) {
1100
2
        *nextTokPtr = ptr + 2 * MINBPC(enc);
1101
2
        return XML_TOK_COND_SECT_CLOSE;
1102
2
      }
1103
20
    }
1104
1.37k
    *nextTokPtr = ptr;
1105
1.37k
    return XML_TOK_CLOSE_BRACKET;
1106
3.16M
  case BT_LPAR:
1107
3.16M
    *nextTokPtr = ptr + MINBPC(enc);
1108
3.16M
    return XML_TOK_OPEN_PAREN;
1109
154k
  case BT_RPAR:
1110
154k
    ptr += MINBPC(enc);
1111
154k
    if (! HAS_CHAR(enc, ptr, end))
1112
85
      return -XML_TOK_CLOSE_PAREN;
1113
154k
    switch (BYTE_TYPE(enc, ptr)) {
1114
2.40k
    case BT_AST:
1115
2.40k
      *nextTokPtr = ptr + MINBPC(enc);
1116
2.40k
      return XML_TOK_CLOSE_PAREN_ASTERISK;
1117
692
    case BT_QUEST:
1118
692
      *nextTokPtr = ptr + MINBPC(enc);
1119
692
      return XML_TOK_CLOSE_PAREN_QUESTION;
1120
2.23k
    case BT_PLUS:
1121
2.23k
      *nextTokPtr = ptr + MINBPC(enc);
1122
2.23k
      return XML_TOK_CLOSE_PAREN_PLUS;
1123
30.3k
    case BT_CR:
1124
31.0k
    case BT_LF:
1125
134k
    case BT_S:
1126
135k
    case BT_GT:
1127
136k
    case BT_COMMA:
1128
146k
    case BT_VERBAR:
1129
148k
    case BT_RPAR:
1130
148k
      *nextTokPtr = ptr;
1131
148k
      return XML_TOK_CLOSE_PAREN;
1132
154k
    }
1133
7
    *nextTokPtr = ptr;
1134
7
    return XML_TOK_INVALID;
1135
40.3k
  case BT_VERBAR:
1136
40.3k
    *nextTokPtr = ptr + MINBPC(enc);
1137
40.3k
    return XML_TOK_OR;
1138
53.1k
  case BT_GT:
1139
53.1k
    *nextTokPtr = ptr + MINBPC(enc);
1140
53.1k
    return XML_TOK_DECL_CLOSE;
1141
141k
  case BT_NUM:
1142
141k
    return PREFIX(scanPoundName)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1143
0
#  define LEAD_CASE(n)                                                         \
1144
21.5k
  case BT_LEAD##n:                                                             \
1145
21.5k
    if (end - ptr < n)                                                         \
1146
79
      return XML_TOK_PARTIAL_CHAR;                                             \
1147
21.5k
    if (IS_INVALID_CHAR(enc, ptr, n)) {                                        \
1148
73
      *nextTokPtr = ptr;                                                       \
1149
73
      return XML_TOK_INVALID;                                                  \
1150
73
    }                                                                          \
1151
21.5k
    if (IS_NMSTRT_CHAR(enc, ptr, n)) {                                         \
1152
4.77k
      ptr += n;                                                                \
1153
4.77k
      tok = XML_TOK_NAME;                                                      \
1154
4.77k
      break;                                                                   \
1155
4.77k
    }                                                                          \
1156
21.4k
    if (IS_NAME_CHAR(enc, ptr, n)) {                                           \
1157
16.5k
      ptr += n;                                                                \
1158
16.5k
      tok = XML_TOK_NMTOKEN;                                                   \
1159
16.5k
      break;                                                                   \
1160
16.5k
    }                                                                          \
1161
16.6k
    *nextTokPtr = ptr;                                                         \
1162
79
    return XML_TOK_INVALID;
1163
69.7k
    LEAD_CASE(2)
1164
11.2k
    LEAD_CASE(3)
1165
250
    LEAD_CASE(4)
1166
0
#  undef LEAD_CASE
1167
250k
  case BT_NMSTRT:
1168
435k
  case BT_HEX:
1169
435k
    tok = XML_TOK_NAME;
1170
435k
    ptr += MINBPC(enc);
1171
435k
    break;
1172
826
  case BT_DIGIT:
1173
1.32k
  case BT_NAME:
1174
1.88k
  case BT_MINUS:
1175
#  ifdef XML_NS
1176
  case BT_COLON:
1177
#  endif
1178
1.88k
    tok = XML_TOK_NMTOKEN;
1179
1.88k
    ptr += MINBPC(enc);
1180
1.88k
    break;
1181
182
  case BT_NONASCII:
1182
182
    if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {
1183
146
      ptr += MINBPC(enc);
1184
146
      tok = XML_TOK_NAME;
1185
146
      break;
1186
146
    }
1187
36
    if (IS_NAME_CHAR_MINBPC(enc, ptr)) {
1188
15
      ptr += MINBPC(enc);
1189
15
      tok = XML_TOK_NMTOKEN;
1190
15
      break;
1191
15
    }
1192
    /* fall through */
1193
87
  default:
1194
87
    *nextTokPtr = ptr;
1195
87
    return XML_TOK_INVALID;
1196
4.86M
  }
1197
12.4M
  while (HAS_CHAR(enc, ptr, end)) {
1198
12.4M
    switch (BYTE_TYPE(enc, ptr)) {
1199
34.6M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1200
18.6k
    case BT_GT:
1201
161k
    case BT_RPAR:
1202
161k
    case BT_COMMA:
1203
186k
    case BT_VERBAR:
1204
188k
    case BT_LSQB:
1205
188k
    case BT_PERCNT:
1206
258k
    case BT_S:
1207
420k
    case BT_CR:
1208
453k
    case BT_LF:
1209
453k
      *nextTokPtr = ptr;
1210
453k
      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
497
    case BT_PLUS:
1232
497
      if (tok == XML_TOK_NMTOKEN) {
1233
1
        *nextTokPtr = ptr;
1234
1
        return XML_TOK_INVALID;
1235
1
      }
1236
496
      *nextTokPtr = ptr + MINBPC(enc);
1237
496
      return XML_TOK_NAME_PLUS;
1238
2.04k
    case BT_AST:
1239
2.04k
      if (tok == XML_TOK_NMTOKEN) {
1240
2
        *nextTokPtr = ptr;
1241
2
        return XML_TOK_INVALID;
1242
2
      }
1243
2.04k
      *nextTokPtr = ptr + MINBPC(enc);
1244
2.04k
      return XML_TOK_NAME_ASTERISK;
1245
1.68k
    case BT_QUEST:
1246
1.68k
      if (tok == XML_TOK_NMTOKEN) {
1247
1
        *nextTokPtr = ptr;
1248
1
        return XML_TOK_INVALID;
1249
1
      }
1250
1.68k
      *nextTokPtr = ptr + MINBPC(enc);
1251
1.68k
      return XML_TOK_NAME_QUESTION;
1252
67
    default:
1253
67
      *nextTokPtr = ptr;
1254
67
      return XML_TOK_INVALID;
1255
12.4M
    }
1256
12.4M
  }
1257
633
  return -tok;
1258
459k
}
xmltok.c:normal_prologTok
Line
Count
Source
1018
4.87M
                  const char **nextTokPtr) {
1019
4.87M
  int tok;
1020
4.87M
  if (ptr >= end)
1021
8.39k
    return XML_TOK_NONE;
1022
4.86M
  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
4.86M
  switch (BYTE_TYPE(enc, ptr)) {
1032
6.28k
  case BT_QUOT:
1033
6.28k
    return PREFIX(scanLit)(BT_QUOT, enc, ptr + MINBPC(enc), end, nextTokPtr);
1034
50.3k
  case BT_APOS:
1035
50.3k
    return PREFIX(scanLit)(BT_APOS, enc, ptr + MINBPC(enc), end, nextTokPtr);
1036
72.7k
  case BT_LT: {
1037
72.7k
    ptr += MINBPC(enc);
1038
72.7k
    REQUIRE_CHAR(enc, ptr, end);
1039
72.7k
    switch (BYTE_TYPE(enc, ptr)) {
1040
58.1k
    case BT_EXCL:
1041
58.1k
      return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1042
8.69k
    case BT_QUEST:
1043
8.69k
      return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1044
4.49k
    case BT_NMSTRT:
1045
5.77k
    case BT_HEX:
1046
5.77k
    case BT_NONASCII:
1047
5.82k
    case BT_LEAD2:
1048
5.85k
    case BT_LEAD3:
1049
5.86k
    case BT_LEAD4:
1050
5.86k
      *nextTokPtr = ptr - MINBPC(enc);
1051
5.86k
      return XML_TOK_INSTANCE_START;
1052
72.7k
    }
1053
23
    *nextTokPtr = ptr;
1054
23
    return XML_TOK_INVALID;
1055
72.7k
  }
1056
308k
  case BT_CR:
1057
308k
    if (ptr + MINBPC(enc) == end) {
1058
326
      *nextTokPtr = end;
1059
      /* indicate that this might be part of a CR/LF pair */
1060
326
      return -XML_TOK_PROLOG_S;
1061
326
    }
1062
    /* fall through */
1063
572k
  case BT_S:
1064
651k
  case BT_LF:
1065
668k
    for (;;) {
1066
668k
      ptr += MINBPC(enc);
1067
668k
      if (! HAS_CHAR(enc, ptr, end))
1068
193
        break;
1069
668k
      switch (BYTE_TYPE(enc, ptr)) {
1070
4.53k
      case BT_S:
1071
12.1k
      case BT_LF:
1072
12.1k
        break;
1073
5.18k
      case BT_CR:
1074
        /* don't split CR/LF pair */
1075
5.18k
        if (ptr + MINBPC(enc) != end)
1076
5.04k
          break;
1077
        /* fall through */
1078
650k
      default:
1079
650k
        *nextTokPtr = ptr;
1080
650k
        return XML_TOK_PROLOG_S;
1081
668k
      }
1082
668k
    }
1083
193
    *nextTokPtr = ptr;
1084
193
    return XML_TOK_PROLOG_S;
1085
62.8k
  case BT_PERCNT:
1086
62.8k
    return PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1087
1.42k
  case BT_COMMA:
1088
1.42k
    *nextTokPtr = ptr + MINBPC(enc);
1089
1.42k
    return XML_TOK_COMMA;
1090
2.63k
  case BT_LSQB:
1091
2.63k
    *nextTokPtr = ptr + MINBPC(enc);
1092
2.63k
    return XML_TOK_OPEN_BRACKET;
1093
1.38k
  case BT_RSQB:
1094
1.38k
    ptr += MINBPC(enc);
1095
1.38k
    if (! HAS_CHAR(enc, ptr, end))
1096
3
      return -XML_TOK_CLOSE_BRACKET;
1097
1.38k
    if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) {
1098
22
      REQUIRE_CHARS(enc, ptr, end, 2);
1099
20
      if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_GT)) {
1100
2
        *nextTokPtr = ptr + 2 * MINBPC(enc);
1101
2
        return XML_TOK_COND_SECT_CLOSE;
1102
2
      }
1103
20
    }
1104
1.37k
    *nextTokPtr = ptr;
1105
1.37k
    return XML_TOK_CLOSE_BRACKET;
1106
3.16M
  case BT_LPAR:
1107
3.16M
    *nextTokPtr = ptr + MINBPC(enc);
1108
3.16M
    return XML_TOK_OPEN_PAREN;
1109
154k
  case BT_RPAR:
1110
154k
    ptr += MINBPC(enc);
1111
154k
    if (! HAS_CHAR(enc, ptr, end))
1112
85
      return -XML_TOK_CLOSE_PAREN;
1113
154k
    switch (BYTE_TYPE(enc, ptr)) {
1114
2.40k
    case BT_AST:
1115
2.40k
      *nextTokPtr = ptr + MINBPC(enc);
1116
2.40k
      return XML_TOK_CLOSE_PAREN_ASTERISK;
1117
692
    case BT_QUEST:
1118
692
      *nextTokPtr = ptr + MINBPC(enc);
1119
692
      return XML_TOK_CLOSE_PAREN_QUESTION;
1120
2.23k
    case BT_PLUS:
1121
2.23k
      *nextTokPtr = ptr + MINBPC(enc);
1122
2.23k
      return XML_TOK_CLOSE_PAREN_PLUS;
1123
30.3k
    case BT_CR:
1124
31.0k
    case BT_LF:
1125
134k
    case BT_S:
1126
135k
    case BT_GT:
1127
136k
    case BT_COMMA:
1128
146k
    case BT_VERBAR:
1129
148k
    case BT_RPAR:
1130
148k
      *nextTokPtr = ptr;
1131
148k
      return XML_TOK_CLOSE_PAREN;
1132
154k
    }
1133
7
    *nextTokPtr = ptr;
1134
7
    return XML_TOK_INVALID;
1135
40.3k
  case BT_VERBAR:
1136
40.3k
    *nextTokPtr = ptr + MINBPC(enc);
1137
40.3k
    return XML_TOK_OR;
1138
53.1k
  case BT_GT:
1139
53.1k
    *nextTokPtr = ptr + MINBPC(enc);
1140
53.1k
    return XML_TOK_DECL_CLOSE;
1141
141k
  case BT_NUM:
1142
141k
    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
69.7k
    LEAD_CASE(2)
1164
11.2k
    LEAD_CASE(3)
1165
158
    LEAD_CASE(4)
1166
0
#  undef LEAD_CASE
1167
250k
  case BT_NMSTRT:
1168
435k
  case BT_HEX:
1169
435k
    tok = XML_TOK_NAME;
1170
435k
    ptr += MINBPC(enc);
1171
435k
    break;
1172
826
  case BT_DIGIT:
1173
1.32k
  case BT_NAME:
1174
1.88k
  case BT_MINUS:
1175
#  ifdef XML_NS
1176
  case BT_COLON:
1177
#  endif
1178
1.88k
    tok = XML_TOK_NMTOKEN;
1179
1.88k
    ptr += MINBPC(enc);
1180
1.88k
    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
55
  default:
1194
55
    *nextTokPtr = ptr;
1195
55
    return XML_TOK_INVALID;
1196
4.86M
  }
1197
12.4M
  while (HAS_CHAR(enc, ptr, end)) {
1198
12.4M
    switch (BYTE_TYPE(enc, ptr)) {
1199
34.5M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1200
18.6k
    case BT_GT:
1201
161k
    case BT_RPAR:
1202
161k
    case BT_COMMA:
1203
186k
    case BT_VERBAR:
1204
188k
    case BT_LSQB:
1205
188k
    case BT_PERCNT:
1206
258k
    case BT_S:
1207
420k
    case BT_CR:
1208
453k
    case BT_LF:
1209
453k
      *nextTokPtr = ptr;
1210
453k
      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
497
    case BT_PLUS:
1232
497
      if (tok == XML_TOK_NMTOKEN) {
1233
1
        *nextTokPtr = ptr;
1234
1
        return XML_TOK_INVALID;
1235
1
      }
1236
496
      *nextTokPtr = ptr + MINBPC(enc);
1237
496
      return XML_TOK_NAME_PLUS;
1238
2.04k
    case BT_AST:
1239
2.04k
      if (tok == XML_TOK_NMTOKEN) {
1240
2
        *nextTokPtr = ptr;
1241
2
        return XML_TOK_INVALID;
1242
2
      }
1243
2.04k
      *nextTokPtr = ptr + MINBPC(enc);
1244
2.04k
      return XML_TOK_NAME_ASTERISK;
1245
1.68k
    case BT_QUEST:
1246
1.68k
      if (tok == XML_TOK_NMTOKEN) {
1247
1
        *nextTokPtr = ptr;
1248
1
        return XML_TOK_INVALID;
1249
1
      }
1250
1.68k
      *nextTokPtr = ptr + MINBPC(enc);
1251
1.68k
      return XML_TOK_NAME_QUESTION;
1252
51
    default:
1253
51
      *nextTokPtr = ptr;
1254
51
      return XML_TOK_INVALID;
1255
12.4M
    }
1256
12.4M
  }
1257
587
  return -tok;
1258
458k
}
xmltok.c:little2_prologTok
Line
Count
Source
1018
127
                  const char **nextTokPtr) {
1019
127
  int tok;
1020
127
  if (ptr >= end)
1021
2
    return XML_TOK_NONE;
1022
125
  if (MINBPC(enc) > 1) {
1023
125
    size_t n = end - ptr;
1024
125
    if (n & (MINBPC(enc) - 1)) {
1025
30
      n &= ~(MINBPC(enc) - 1);
1026
30
      if (n == 0)
1027
2
        return XML_TOK_PARTIAL;
1028
28
      end = ptr + n;
1029
28
    }
1030
125
  }
1031
123
  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
40
    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
102
  case BT_NONASCII:
1182
102
    if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {
1183
88
      ptr += MINBPC(enc);
1184
88
      tok = XML_TOK_NAME;
1185
88
      break;
1186
88
    }
1187
14
    if (IS_NAME_CHAR_MINBPC(enc, ptr)) {
1188
3
      ptr += MINBPC(enc);
1189
3
      tok = XML_TOK_NMTOKEN;
1190
3
      break;
1191
3
    }
1192
    /* fall through */
1193
16
  default:
1194
16
    *nextTokPtr = ptr;
1195
16
    return XML_TOK_INVALID;
1196
123
  }
1197
26.3k
  while (HAS_CHAR(enc, ptr, end)) {
1198
26.3k
    switch (BYTE_TYPE(enc, ptr)) {
1199
131k
      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
9
    default:
1253
9
      *nextTokPtr = ptr;
1254
9
      return XML_TOK_INVALID;
1255
26.3k
    }
1256
26.3k
  }
1257
26
  return -tok;
1258
91
}
xmltok.c:big2_prologTok
Line
Count
Source
1018
109
                  const char **nextTokPtr) {
1019
109
  int tok;
1020
109
  if (ptr >= end)
1021
2
    return XML_TOK_NONE;
1022
107
  if (MINBPC(enc) > 1) {
1023
107
    size_t n = end - ptr;
1024
107
    if (n & (MINBPC(enc) - 1)) {
1025
16
      n &= ~(MINBPC(enc) - 1);
1026
16
      if (n == 0)
1027
2
        return XML_TOK_PARTIAL;
1028
14
      end = ptr + n;
1029
14
    }
1030
107
  }
1031
105
  switch (BYTE_TYPE(enc, ptr)) {
1032
0
  case BT_QUOT:
1033
0
    return PREFIX(scanLit)(BT_QUOT, enc, ptr + MINBPC(enc), end, nextTokPtr);
1034
0
  case BT_APOS:
1035
0
    return PREFIX(scanLit)(BT_APOS, enc, ptr + MINBPC(enc), end, nextTokPtr);
1036
0
  case BT_LT: {
1037
0
    ptr += MINBPC(enc);
1038
0
    REQUIRE_CHAR(enc, ptr, end);
1039
0
    switch (BYTE_TYPE(enc, ptr)) {
1040
0
    case BT_EXCL:
1041
0
      return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1042
0
    case BT_QUEST:
1043
0
      return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1044
0
    case BT_NMSTRT:
1045
0
    case BT_HEX:
1046
0
    case BT_NONASCII:
1047
0
    case BT_LEAD2:
1048
0
    case BT_LEAD3:
1049
0
    case BT_LEAD4:
1050
0
      *nextTokPtr = ptr - MINBPC(enc);
1051
0
      return XML_TOK_INSTANCE_START;
1052
0
    }
1053
0
    *nextTokPtr = ptr;
1054
0
    return XML_TOK_INVALID;
1055
0
  }
1056
0
  case BT_CR:
1057
0
    if (ptr + MINBPC(enc) == end) {
1058
0
      *nextTokPtr = end;
1059
      /* indicate that this might be part of a CR/LF pair */
1060
0
      return -XML_TOK_PROLOG_S;
1061
0
    }
1062
    /* fall through */
1063
0
  case BT_S:
1064
0
  case BT_LF:
1065
0
    for (;;) {
1066
0
      ptr += MINBPC(enc);
1067
0
      if (! HAS_CHAR(enc, ptr, end))
1068
0
        break;
1069
0
      switch (BYTE_TYPE(enc, ptr)) {
1070
0
      case BT_S:
1071
0
      case BT_LF:
1072
0
        break;
1073
0
      case BT_CR:
1074
        /* don't split CR/LF pair */
1075
0
        if (ptr + MINBPC(enc) != end)
1076
0
          break;
1077
        /* fall through */
1078
0
      default:
1079
0
        *nextTokPtr = ptr;
1080
0
        return XML_TOK_PROLOG_S;
1081
0
      }
1082
0
    }
1083
0
    *nextTokPtr = ptr;
1084
0
    return XML_TOK_PROLOG_S;
1085
0
  case BT_PERCNT:
1086
0
    return PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1087
0
  case BT_COMMA:
1088
0
    *nextTokPtr = ptr + MINBPC(enc);
1089
0
    return XML_TOK_COMMA;
1090
0
  case BT_LSQB:
1091
0
    *nextTokPtr = ptr + MINBPC(enc);
1092
0
    return XML_TOK_OPEN_BRACKET;
1093
0
  case BT_RSQB:
1094
0
    ptr += MINBPC(enc);
1095
0
    if (! HAS_CHAR(enc, ptr, end))
1096
0
      return -XML_TOK_CLOSE_BRACKET;
1097
0
    if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) {
1098
0
      REQUIRE_CHARS(enc, ptr, end, 2);
1099
0
      if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_GT)) {
1100
0
        *nextTokPtr = ptr + 2 * MINBPC(enc);
1101
0
        return XML_TOK_COND_SECT_CLOSE;
1102
0
      }
1103
0
    }
1104
0
    *nextTokPtr = ptr;
1105
0
    return XML_TOK_CLOSE_BRACKET;
1106
0
  case BT_LPAR:
1107
0
    *nextTokPtr = ptr + MINBPC(enc);
1108
0
    return XML_TOK_OPEN_PAREN;
1109
0
  case BT_RPAR:
1110
0
    ptr += MINBPC(enc);
1111
0
    if (! HAS_CHAR(enc, ptr, end))
1112
0
      return -XML_TOK_CLOSE_PAREN;
1113
0
    switch (BYTE_TYPE(enc, ptr)) {
1114
0
    case BT_AST:
1115
0
      *nextTokPtr = ptr + MINBPC(enc);
1116
0
      return XML_TOK_CLOSE_PAREN_ASTERISK;
1117
0
    case BT_QUEST:
1118
0
      *nextTokPtr = ptr + MINBPC(enc);
1119
0
      return XML_TOK_CLOSE_PAREN_QUESTION;
1120
0
    case BT_PLUS:
1121
0
      *nextTokPtr = ptr + MINBPC(enc);
1122
0
      return XML_TOK_CLOSE_PAREN_PLUS;
1123
0
    case BT_CR:
1124
0
    case BT_LF:
1125
0
    case BT_S:
1126
0
    case BT_GT:
1127
0
    case BT_COMMA:
1128
0
    case BT_VERBAR:
1129
0
    case BT_RPAR:
1130
0
      *nextTokPtr = ptr;
1131
0
      return XML_TOK_CLOSE_PAREN;
1132
0
    }
1133
0
    *nextTokPtr = ptr;
1134
0
    return XML_TOK_INVALID;
1135
0
  case BT_VERBAR:
1136
0
    *nextTokPtr = ptr + MINBPC(enc);
1137
0
    return XML_TOK_OR;
1138
0
  case BT_GT:
1139
0
    *nextTokPtr = ptr + MINBPC(enc);
1140
0
    return XML_TOK_DECL_CLOSE;
1141
0
  case BT_NUM:
1142
0
    return PREFIX(scanPoundName)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1143
0
#  define LEAD_CASE(n)                                                         \
1144
0
  case BT_LEAD##n:                                                             \
1145
0
    if (end - ptr < n)                                                         \
1146
0
      return XML_TOK_PARTIAL_CHAR;                                             \
1147
0
    if (IS_INVALID_CHAR(enc, ptr, n)) {                                        \
1148
0
      *nextTokPtr = ptr;                                                       \
1149
0
      return XML_TOK_INVALID;                                                  \
1150
0
    }                                                                          \
1151
0
    if (IS_NMSTRT_CHAR(enc, ptr, n)) {                                         \
1152
0
      ptr += n;                                                                \
1153
0
      tok = XML_TOK_NAME;                                                      \
1154
0
      break;                                                                   \
1155
0
    }                                                                          \
1156
0
    if (IS_NAME_CHAR(enc, ptr, n)) {                                           \
1157
0
      ptr += n;                                                                \
1158
0
      tok = XML_TOK_NMTOKEN;                                                   \
1159
0
      break;                                                                   \
1160
0
    }                                                                          \
1161
0
    *nextTokPtr = ptr;                                                         \
1162
0
    return XML_TOK_INVALID;
1163
0
    LEAD_CASE(2)
1164
0
    LEAD_CASE(3)
1165
52
    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
80
  case BT_NONASCII:
1182
80
    if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {
1183
58
      ptr += MINBPC(enc);
1184
58
      tok = XML_TOK_NAME;
1185
58
      break;
1186
58
    }
1187
22
    if (IS_NAME_CHAR_MINBPC(enc, ptr)) {
1188
12
      ptr += MINBPC(enc);
1189
12
      tok = XML_TOK_NMTOKEN;
1190
12
      break;
1191
12
    }
1192
    /* fall through */
1193
16
  default:
1194
16
    *nextTokPtr = ptr;
1195
16
    return XML_TOK_INVALID;
1196
105
  }
1197
11.9k
  while (HAS_CHAR(enc, ptr, end)) {
1198
11.9k
    switch (BYTE_TYPE(enc, ptr)) {
1199
59.4k
      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
11.9k
    }
1256
11.9k
  }
1257
20
  return -tok;
1258
70
}
1259
1260
static int PTRCALL
1261
PREFIX(attributeValueTok)(const ENCODING *enc, const char *ptr, const char *end,
1262
1.96M
                          const char **nextTokPtr) {
1263
1.96M
  const char *start;
1264
1.96M
  if (ptr >= end)
1265
98.4k
    return XML_TOK_NONE;
1266
1.86M
  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.86M
  start = ptr;
1275
19.7M
  while (HAS_CHAR(enc, ptr, end)) {
1276
19.7M
    switch (BYTE_TYPE(enc, ptr)) {
1277
0
#  define LEAD_CASE(n)                                                         \
1278
291k
  case BT_LEAD##n:                                                             \
1279
291k
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1280
291k
    break;
1281
106k
      LEAD_CASE(2)
1282
108k
      LEAD_CASE(3)
1283
76.5k
      LEAD_CASE(4)
1284
0
#  undef LEAD_CASE
1285
287k
    case BT_AMP:
1286
287k
      if (ptr == start)
1287
210k
        return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1288
76.8k
      *nextTokPtr = ptr;
1289
76.8k
      return XML_TOK_DATA_CHARS;
1290
3
    case BT_LT:
1291
      /* this is for inside entity references */
1292
3
      *nextTokPtr = ptr;
1293
3
      return XML_TOK_INVALID;
1294
539k
    case BT_LF:
1295
539k
      if (ptr == start) {
1296
399k
        *nextTokPtr = ptr + MINBPC(enc);
1297
399k
        return XML_TOK_DATA_NEWLINE;
1298
399k
      }
1299
139k
      *nextTokPtr = ptr;
1300
139k
      return XML_TOK_DATA_CHARS;
1301
733k
    case BT_CR:
1302
733k
      if (ptr == start) {
1303
476k
        ptr += MINBPC(enc);
1304
476k
        if (! HAS_CHAR(enc, ptr, end))
1305
2.44k
          return XML_TOK_TRAILING_CR;
1306
473k
        if (BYTE_TYPE(enc, ptr) == BT_LF)
1307
106k
          ptr += MINBPC(enc);
1308
473k
        *nextTokPtr = ptr;
1309
473k
        return XML_TOK_DATA_NEWLINE;
1310
476k
      }
1311
257k
      *nextTokPtr = ptr;
1312
257k
      return XML_TOK_DATA_CHARS;
1313
220k
    case BT_S:
1314
220k
      if (ptr == start) {
1315
128k
        *nextTokPtr = ptr + MINBPC(enc);
1316
128k
        return XML_TOK_ATTRIBUTE_VALUE_S;
1317
128k
      }
1318
91.9k
      *nextTokPtr = ptr;
1319
91.9k
      return XML_TOK_DATA_CHARS;
1320
17.6M
    default:
1321
17.6M
      ptr += MINBPC(enc);
1322
17.6M
      break;
1323
19.7M
    }
1324
19.7M
  }
1325
84.0k
  *nextTokPtr = ptr;
1326
84.0k
  return XML_TOK_DATA_CHARS;
1327
1.86M
}
xmltok.c:normal_attributeValueTok
Line
Count
Source
1262
1.96M
                          const char **nextTokPtr) {
1263
1.96M
  const char *start;
1264
1.96M
  if (ptr >= end)
1265
98.4k
    return XML_TOK_NONE;
1266
1.86M
  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.86M
  start = ptr;
1275
19.7M
  while (HAS_CHAR(enc, ptr, end)) {
1276
19.7M
    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
106k
      LEAD_CASE(2)
1282
108k
      LEAD_CASE(3)
1283
76.5k
      LEAD_CASE(4)
1284
0
#  undef LEAD_CASE
1285
287k
    case BT_AMP:
1286
287k
      if (ptr == start)
1287
210k
        return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1288
76.8k
      *nextTokPtr = ptr;
1289
76.8k
      return XML_TOK_DATA_CHARS;
1290
3
    case BT_LT:
1291
      /* this is for inside entity references */
1292
3
      *nextTokPtr = ptr;
1293
3
      return XML_TOK_INVALID;
1294
539k
    case BT_LF:
1295
539k
      if (ptr == start) {
1296
399k
        *nextTokPtr = ptr + MINBPC(enc);
1297
399k
        return XML_TOK_DATA_NEWLINE;
1298
399k
      }
1299
139k
      *nextTokPtr = ptr;
1300
139k
      return XML_TOK_DATA_CHARS;
1301
733k
    case BT_CR:
1302
733k
      if (ptr == start) {
1303
476k
        ptr += MINBPC(enc);
1304
476k
        if (! HAS_CHAR(enc, ptr, end))
1305
2.44k
          return XML_TOK_TRAILING_CR;
1306
473k
        if (BYTE_TYPE(enc, ptr) == BT_LF)
1307
106k
          ptr += MINBPC(enc);
1308
473k
        *nextTokPtr = ptr;
1309
473k
        return XML_TOK_DATA_NEWLINE;
1310
476k
      }
1311
257k
      *nextTokPtr = ptr;
1312
257k
      return XML_TOK_DATA_CHARS;
1313
220k
    case BT_S:
1314
220k
      if (ptr == start) {
1315
128k
        *nextTokPtr = ptr + MINBPC(enc);
1316
128k
        return XML_TOK_ATTRIBUTE_VALUE_S;
1317
128k
      }
1318
91.9k
      *nextTokPtr = ptr;
1319
91.9k
      return XML_TOK_DATA_CHARS;
1320
17.6M
    default:
1321
17.6M
      ptr += MINBPC(enc);
1322
17.6M
      break;
1323
19.7M
    }
1324
19.7M
  }
1325
84.0k
  *nextTokPtr = ptr;
1326
84.0k
  return XML_TOK_DATA_CHARS;
1327
1.86M
}
Unexecuted instantiation: xmltok.c:little2_attributeValueTok
Unexecuted instantiation: xmltok.c:big2_attributeValueTok
1328
1329
static int PTRCALL
1330
PREFIX(entityValueTok)(const ENCODING *enc, const char *ptr, const char *end,
1331
0
                       const char **nextTokPtr) {
1332
0
  const char *start;
1333
0
  if (ptr >= end)
1334
0
    return XML_TOK_NONE;
1335
0
  else if (! HAS_CHAR(enc, ptr, end)) {
1336
    /* This line cannot be executed.  The incoming data has already
1337
     * been tokenized once, so incomplete characters like this have
1338
     * already been eliminated from the input.  Retaining the paranoia
1339
     * check is still valuable, however.
1340
     */
1341
0
    return XML_TOK_PARTIAL; /* LCOV_EXCL_LINE */
1342
0
  }
1343
0
  start = ptr;
1344
0
  while (HAS_CHAR(enc, ptr, end)) {
1345
0
    switch (BYTE_TYPE(enc, ptr)) {
1346
0
#  define LEAD_CASE(n)                                                         \
1347
0
  case BT_LEAD##n:                                                             \
1348
0
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1349
0
    break;
1350
0
      LEAD_CASE(2)
1351
0
      LEAD_CASE(3)
1352
0
      LEAD_CASE(4)
1353
0
#  undef LEAD_CASE
1354
0
    case BT_AMP:
1355
0
      if (ptr == start)
1356
0
        return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1357
0
      *nextTokPtr = ptr;
1358
0
      return XML_TOK_DATA_CHARS;
1359
0
    case BT_PERCNT:
1360
0
      if (ptr == start) {
1361
0
        int tok = PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1362
0
        return (tok == XML_TOK_PERCENT) ? XML_TOK_INVALID : tok;
1363
0
      }
1364
0
      *nextTokPtr = ptr;
1365
0
      return XML_TOK_DATA_CHARS;
1366
0
    case BT_LF:
1367
0
      if (ptr == start) {
1368
0
        *nextTokPtr = ptr + MINBPC(enc);
1369
0
        return XML_TOK_DATA_NEWLINE;
1370
0
      }
1371
0
      *nextTokPtr = ptr;
1372
0
      return XML_TOK_DATA_CHARS;
1373
0
    case BT_CR:
1374
0
      if (ptr == start) {
1375
0
        ptr += MINBPC(enc);
1376
0
        if (! HAS_CHAR(enc, ptr, end))
1377
0
          return XML_TOK_TRAILING_CR;
1378
0
        if (BYTE_TYPE(enc, ptr) == BT_LF)
1379
0
          ptr += MINBPC(enc);
1380
0
        *nextTokPtr = ptr;
1381
0
        return XML_TOK_DATA_NEWLINE;
1382
0
      }
1383
0
      *nextTokPtr = ptr;
1384
0
      return XML_TOK_DATA_CHARS;
1385
0
    default:
1386
0
      ptr += MINBPC(enc);
1387
0
      break;
1388
0
    }
1389
0
  }
1390
0
  *nextTokPtr = ptr;
1391
0
  return XML_TOK_DATA_CHARS;
1392
0
}
Unexecuted instantiation: xmltok.c:normal_entityValueTok
Unexecuted instantiation: xmltok.c:little2_entityValueTok
Unexecuted instantiation: xmltok.c:big2_entityValueTok
1393
1394
#  ifdef XML_DTD
1395
1396
static int PTRCALL
1397
PREFIX(ignoreSectionTok)(const ENCODING *enc, const char *ptr, const char *end,
1398
                         const char **nextTokPtr) {
1399
  int level = 0;
1400
  if (MINBPC(enc) > 1) {
1401
    size_t n = end - ptr;
1402
    if (n & (MINBPC(enc) - 1)) {
1403
      n &= ~(MINBPC(enc) - 1);
1404
      end = ptr + n;
1405
    }
1406
  }
1407
  while (HAS_CHAR(enc, ptr, end)) {
1408
    switch (BYTE_TYPE(enc, ptr)) {
1409
      INVALID_CASES(ptr, nextTokPtr)
1410
    case BT_LT:
1411
      ptr += MINBPC(enc);
1412
      REQUIRE_CHAR(enc, ptr, end);
1413
      if (CHAR_MATCHES(enc, ptr, ASCII_EXCL)) {
1414
        ptr += MINBPC(enc);
1415
        REQUIRE_CHAR(enc, ptr, end);
1416
        if (CHAR_MATCHES(enc, ptr, ASCII_LSQB)) {
1417
          ++level;
1418
          ptr += MINBPC(enc);
1419
        }
1420
      }
1421
      break;
1422
    case BT_RSQB:
1423
      ptr += MINBPC(enc);
1424
      REQUIRE_CHAR(enc, ptr, end);
1425
      if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) {
1426
        ptr += MINBPC(enc);
1427
        REQUIRE_CHAR(enc, ptr, end);
1428
        if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
1429
          ptr += MINBPC(enc);
1430
          if (level == 0) {
1431
            *nextTokPtr = ptr;
1432
            return XML_TOK_IGNORE_SECT;
1433
          }
1434
          --level;
1435
        }
1436
      }
1437
      break;
1438
    default:
1439
      ptr += MINBPC(enc);
1440
      break;
1441
    }
1442
  }
1443
  return XML_TOK_PARTIAL;
1444
}
1445
1446
#  endif /* XML_DTD */
1447
1448
static int PTRCALL
1449
PREFIX(isPublicId)(const ENCODING *enc, const char *ptr, const char *end,
1450
2.78k
                   const char **badPtr) {
1451
2.78k
  ptr += MINBPC(enc);
1452
2.78k
  end -= MINBPC(enc);
1453
549k
  for (; HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
1454
549k
    switch (BYTE_TYPE(enc, ptr)) {
1455
229k
    case BT_DIGIT:
1456
353k
    case BT_HEX:
1457
353k
    case BT_MINUS:
1458
354k
    case BT_APOS:
1459
354k
    case BT_LPAR:
1460
391k
    case BT_RPAR:
1461
392k
    case BT_PLUS:
1462
393k
    case BT_COMMA:
1463
449k
    case BT_SOL:
1464
450k
    case BT_EQUALS:
1465
454k
    case BT_QUEST:
1466
457k
    case BT_CR:
1467
458k
    case BT_LF:
1468
459k
    case BT_SEMI:
1469
460k
    case BT_EXCL:
1470
464k
    case BT_AST:
1471
467k
    case BT_PERCNT:
1472
474k
    case BT_NUM:
1473
#  ifdef XML_NS
1474
    case BT_COLON:
1475
#  endif
1476
474k
      break;
1477
2.02k
    case BT_S:
1478
2.02k
      if (CHAR_MATCHES(enc, ptr, ASCII_TAB)) {
1479
1
        *badPtr = ptr;
1480
1
        return 0;
1481
1
      }
1482
2.02k
      break;
1483
3.17k
    case BT_NAME:
1484
71.5k
    case BT_NMSTRT:
1485
71.5k
      if (! (BYTE_TO_ASCII(enc, ptr) & ~0x7f))
1486
71.5k
        break;
1487
      /* fall through */
1488
1.75k
    default:
1489
1.75k
      switch (BYTE_TO_ASCII(enc, ptr)) {
1490
1.36k
      case 0x24: /* $ */
1491
1.74k
      case 0x40: /* @ */
1492
1.74k
        break;
1493
13
      default:
1494
13
        *badPtr = ptr;
1495
13
        return 0;
1496
1.75k
      }
1497
1.74k
      break;
1498
549k
    }
1499
549k
  }
1500
2.76k
  return 1;
1501
2.78k
}
xmltok.c:normal_isPublicId
Line
Count
Source
1450
2.78k
                   const char **badPtr) {
1451
2.78k
  ptr += MINBPC(enc);
1452
2.78k
  end -= MINBPC(enc);
1453
549k
  for (; HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
1454
549k
    switch (BYTE_TYPE(enc, ptr)) {
1455
229k
    case BT_DIGIT:
1456
353k
    case BT_HEX:
1457
353k
    case BT_MINUS:
1458
354k
    case BT_APOS:
1459
354k
    case BT_LPAR:
1460
391k
    case BT_RPAR:
1461
392k
    case BT_PLUS:
1462
393k
    case BT_COMMA:
1463
449k
    case BT_SOL:
1464
450k
    case BT_EQUALS:
1465
454k
    case BT_QUEST:
1466
457k
    case BT_CR:
1467
458k
    case BT_LF:
1468
459k
    case BT_SEMI:
1469
460k
    case BT_EXCL:
1470
464k
    case BT_AST:
1471
467k
    case BT_PERCNT:
1472
474k
    case BT_NUM:
1473
#  ifdef XML_NS
1474
    case BT_COLON:
1475
#  endif
1476
474k
      break;
1477
2.02k
    case BT_S:
1478
2.02k
      if (CHAR_MATCHES(enc, ptr, ASCII_TAB)) {
1479
1
        *badPtr = ptr;
1480
1
        return 0;
1481
1
      }
1482
2.02k
      break;
1483
3.17k
    case BT_NAME:
1484
71.5k
    case BT_NMSTRT:
1485
71.5k
      if (! (BYTE_TO_ASCII(enc, ptr) & ~0x7f))
1486
71.5k
        break;
1487
      /* fall through */
1488
1.75k
    default:
1489
1.75k
      switch (BYTE_TO_ASCII(enc, ptr)) {
1490
1.36k
      case 0x24: /* $ */
1491
1.74k
      case 0x40: /* @ */
1492
1.74k
        break;
1493
13
      default:
1494
13
        *badPtr = ptr;
1495
13
        return 0;
1496
1.75k
      }
1497
1.74k
      break;
1498
549k
    }
1499
549k
  }
1500
2.76k
  return 1;
1501
2.78k
}
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
329k
                ATTRIBUTE *atts) {
1511
329k
  enum { other, inName, inValue } state = inName;
1512
329k
  int nAtts = 0;
1513
329k
  int open = 0; /* defined when state == inValue;
1514
                   initialization just to shut up compilers */
1515
1516
54.3M
  for (ptr += MINBPC(enc);; ptr += MINBPC(enc)) {
1517
54.3M
    switch (BYTE_TYPE(enc, ptr)) {
1518
0
#  define START_NAME                                                           \
1519
30.7M
    if (state == other) {                                                      \
1520
4.46M
      if (nAtts < attsMax) {                                                   \
1521
2.27M
        atts[nAtts].name = ptr;                                                \
1522
2.27M
        atts[nAtts].normalized = 1;                                            \
1523
2.27M
      }                                                                        \
1524
4.46M
      state = inName;                                                          \
1525
4.46M
    }
1526
0
#  define LEAD_CASE(n)                                                         \
1527
388k
  case BT_LEAD##n: /* NOTE: The encoding has already been validated. */        \
1528
388k
    START_NAME ptr += (n - MINBPC(enc));                                       \
1529
388k
    break;
1530
178k
      LEAD_CASE(2)
1531
153k
      LEAD_CASE(3)
1532
55.9k
      LEAD_CASE(4)
1533
0
#  undef LEAD_CASE
1534
0
    case BT_NONASCII:
1535
28.5M
    case BT_NMSTRT:
1536
30.3M
    case BT_HEX:
1537
30.3M
      START_NAME
1538
30.3M
      break;
1539
0
#  undef START_NAME
1540
535k
    case BT_QUOT:
1541
535k
      if (state != inValue) {
1542
196k
        if (nAtts < attsMax)
1543
130k
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1544
196k
        state = inValue;
1545
196k
        open = BT_QUOT;
1546
338k
      } else if (open == BT_QUOT) {
1547
196k
        state = other;
1548
196k
        if (nAtts < attsMax)
1549
130k
          atts[nAtts].valueEnd = ptr;
1550
196k
        nAtts++;
1551
196k
      }
1552
535k
      break;
1553
8.57M
    case BT_APOS:
1554
8.57M
      if (state != inValue) {
1555
4.26M
        if (nAtts < attsMax)
1556
2.14M
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1557
4.26M
        state = inValue;
1558
4.26M
        open = BT_APOS;
1559
4.30M
      } else if (open == BT_APOS) {
1560
4.26M
        state = other;
1561
4.26M
        if (nAtts < attsMax)
1562
2.14M
          atts[nAtts].valueEnd = ptr;
1563
4.26M
        nAtts++;
1564
4.26M
      }
1565
8.57M
      break;
1566
138k
    case BT_AMP:
1567
138k
      if (nAtts < attsMax)
1568
137k
        atts[nAtts].normalized = 0;
1569
138k
      break;
1570
2.95M
    case BT_S:
1571
2.95M
      if (state == inName)
1572
51.4k
        state = other;
1573
2.90M
      else if (state == inValue && nAtts < attsMax && atts[nAtts].normalized
1574
106k
               && (ptr == atts[nAtts].valuePtr
1575
20.5k
                   || BYTE_TO_ASCII(enc, ptr) != ASCII_SPACE
1576
10.9k
                   || BYTE_TO_ASCII(enc, ptr + MINBPC(enc)) == ASCII_SPACE
1577
10.3k
                   || BYTE_TYPE(enc, ptr + MINBPC(enc)) == open))
1578
96.7k
        atts[nAtts].normalized = 0;
1579
2.95M
      break;
1580
2.66M
    case BT_CR:
1581
3.28M
    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
3.28M
      if (state == inName)
1585
28.7k
        state = other;
1586
3.25M
      else if (state == inValue && nAtts < attsMax)
1587
874k
        atts[nAtts].normalized = 0;
1588
3.28M
      break;
1589
297k
    case BT_GT:
1590
422k
    case BT_SOL:
1591
422k
      if (state != inValue)
1592
329k
        return nAtts;
1593
93.3k
      break;
1594
7.76M
    default:
1595
7.76M
      break;
1596
54.3M
    }
1597
54.3M
  }
1598
  /* not reached */
1599
329k
}
xmltok.c:normal_getAtts
Line
Count
Source
1510
329k
                ATTRIBUTE *atts) {
1511
329k
  enum { other, inName, inValue } state = inName;
1512
329k
  int nAtts = 0;
1513
329k
  int open = 0; /* defined when state == inValue;
1514
                   initialization just to shut up compilers */
1515
1516
54.3M
  for (ptr += MINBPC(enc);; ptr += MINBPC(enc)) {
1517
54.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
178k
      LEAD_CASE(2)
1531
153k
      LEAD_CASE(3)
1532
55.9k
      LEAD_CASE(4)
1533
0
#  undef LEAD_CASE
1534
0
    case BT_NONASCII:
1535
28.5M
    case BT_NMSTRT:
1536
30.3M
    case BT_HEX:
1537
30.3M
      START_NAME
1538
30.3M
      break;
1539
0
#  undef START_NAME
1540
535k
    case BT_QUOT:
1541
535k
      if (state != inValue) {
1542
196k
        if (nAtts < attsMax)
1543
130k
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1544
196k
        state = inValue;
1545
196k
        open = BT_QUOT;
1546
338k
      } else if (open == BT_QUOT) {
1547
196k
        state = other;
1548
196k
        if (nAtts < attsMax)
1549
130k
          atts[nAtts].valueEnd = ptr;
1550
196k
        nAtts++;
1551
196k
      }
1552
535k
      break;
1553
8.57M
    case BT_APOS:
1554
8.57M
      if (state != inValue) {
1555
4.26M
        if (nAtts < attsMax)
1556
2.14M
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1557
4.26M
        state = inValue;
1558
4.26M
        open = BT_APOS;
1559
4.30M
      } else if (open == BT_APOS) {
1560
4.26M
        state = other;
1561
4.26M
        if (nAtts < attsMax)
1562
2.14M
          atts[nAtts].valueEnd = ptr;
1563
4.26M
        nAtts++;
1564
4.26M
      }
1565
8.57M
      break;
1566
138k
    case BT_AMP:
1567
138k
      if (nAtts < attsMax)
1568
137k
        atts[nAtts].normalized = 0;
1569
138k
      break;
1570
2.95M
    case BT_S:
1571
2.95M
      if (state == inName)
1572
51.4k
        state = other;
1573
2.90M
      else if (state == inValue && nAtts < attsMax && atts[nAtts].normalized
1574
106k
               && (ptr == atts[nAtts].valuePtr
1575
20.5k
                   || BYTE_TO_ASCII(enc, ptr) != ASCII_SPACE
1576
10.9k
                   || BYTE_TO_ASCII(enc, ptr + MINBPC(enc)) == ASCII_SPACE
1577
10.3k
                   || BYTE_TYPE(enc, ptr + MINBPC(enc)) == open))
1578
96.7k
        atts[nAtts].normalized = 0;
1579
2.95M
      break;
1580
2.66M
    case BT_CR:
1581
3.28M
    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
3.28M
      if (state == inName)
1585
28.7k
        state = other;
1586
3.25M
      else if (state == inValue && nAtts < attsMax)
1587
874k
        atts[nAtts].normalized = 0;
1588
3.28M
      break;
1589
297k
    case BT_GT:
1590
422k
    case BT_SOL:
1591
422k
      if (state != inValue)
1592
329k
        return nAtts;
1593
93.3k
      break;
1594
7.76M
    default:
1595
7.76M
      break;
1596
54.3M
    }
1597
54.3M
  }
1598
  /* not reached */
1599
329k
}
Unexecuted instantiation: xmltok.c:little2_getAtts
Unexecuted instantiation: xmltok.c:big2_getAtts
1600
1601
static int PTRFASTCALL
1602
136k
PREFIX(charRefNumber)(const ENCODING *enc, const char *ptr) {
1603
136k
  int result = 0;
1604
  /* skip &# */
1605
136k
  UNUSED_P(enc);
1606
136k
  ptr += 2 * MINBPC(enc);
1607
136k
  if (CHAR_MATCHES(enc, ptr, ASCII_x)) {
1608
603k
    for (ptr += MINBPC(enc); ! CHAR_MATCHES(enc, ptr, ASCII_SEMI);
1609
471k
         ptr += MINBPC(enc)) {
1610
471k
      int c = BYTE_TO_ASCII(enc, ptr);
1611
471k
      switch (c) {
1612
6.46k
      case ASCII_0:
1613
38.6k
      case ASCII_1:
1614
87.5k
      case ASCII_2:
1615
94.4k
      case ASCII_3:
1616
151k
      case ASCII_4:
1617
191k
      case ASCII_5:
1618
195k
      case ASCII_6:
1619
218k
      case ASCII_7:
1620
251k
      case ASCII_8:
1621
261k
      case ASCII_9:
1622
261k
        result <<= 4;
1623
261k
        result |= (c - ASCII_0);
1624
261k
        break;
1625
40.6k
      case ASCII_A:
1626
56.5k
      case ASCII_B:
1627
57.0k
      case ASCII_C:
1628
72.5k
      case ASCII_D:
1629
74.4k
      case ASCII_E:
1630
102k
      case ASCII_F:
1631
102k
        result <<= 4;
1632
102k
        result += 10 + (c - ASCII_A);
1633
102k
        break;
1634
1.39k
      case ASCII_a:
1635
21.1k
      case ASCII_b:
1636
21.7k
      case ASCII_c:
1637
61.4k
      case ASCII_d:
1638
62.6k
      case ASCII_e:
1639
107k
      case ASCII_f:
1640
107k
        result <<= 4;
1641
107k
        result += 10 + (c - ASCII_a);
1642
107k
        break;
1643
471k
      }
1644
471k
      if (result >= 0x110000)
1645
12
        return -1;
1646
471k
    }
1647
131k
  } else {
1648
26.4k
    for (; ! CHAR_MATCHES(enc, ptr, ASCII_SEMI); ptr += MINBPC(enc)) {
1649
20.9k
      int c = BYTE_TO_ASCII(enc, ptr);
1650
20.9k
      result *= 10;
1651
20.9k
      result += (c - ASCII_0);
1652
20.9k
      if (result >= 0x110000)
1653
3
        return -1;
1654
20.9k
    }
1655
5.56k
  }
1656
136k
  return checkCharRefNumber(result);
1657
136k
}
xmltok.c:normal_charRefNumber
Line
Count
Source
1602
136k
PREFIX(charRefNumber)(const ENCODING *enc, const char *ptr) {
1603
136k
  int result = 0;
1604
  /* skip &# */
1605
136k
  UNUSED_P(enc);
1606
136k
  ptr += 2 * MINBPC(enc);
1607
136k
  if (CHAR_MATCHES(enc, ptr, ASCII_x)) {
1608
603k
    for (ptr += MINBPC(enc); ! CHAR_MATCHES(enc, ptr, ASCII_SEMI);
1609
471k
         ptr += MINBPC(enc)) {
1610
471k
      int c = BYTE_TO_ASCII(enc, ptr);
1611
471k
      switch (c) {
1612
6.46k
      case ASCII_0:
1613
38.6k
      case ASCII_1:
1614
87.5k
      case ASCII_2:
1615
94.4k
      case ASCII_3:
1616
151k
      case ASCII_4:
1617
191k
      case ASCII_5:
1618
195k
      case ASCII_6:
1619
218k
      case ASCII_7:
1620
251k
      case ASCII_8:
1621
261k
      case ASCII_9:
1622
261k
        result <<= 4;
1623
261k
        result |= (c - ASCII_0);
1624
261k
        break;
1625
40.6k
      case ASCII_A:
1626
56.5k
      case ASCII_B:
1627
57.0k
      case ASCII_C:
1628
72.5k
      case ASCII_D:
1629
74.4k
      case ASCII_E:
1630
102k
      case ASCII_F:
1631
102k
        result <<= 4;
1632
102k
        result += 10 + (c - ASCII_A);
1633
102k
        break;
1634
1.39k
      case ASCII_a:
1635
21.1k
      case ASCII_b:
1636
21.7k
      case ASCII_c:
1637
61.4k
      case ASCII_d:
1638
62.6k
      case ASCII_e:
1639
107k
      case ASCII_f:
1640
107k
        result <<= 4;
1641
107k
        result += 10 + (c - ASCII_a);
1642
107k
        break;
1643
471k
      }
1644
471k
      if (result >= 0x110000)
1645
12
        return -1;
1646
471k
    }
1647
131k
  } else {
1648
26.4k
    for (; ! CHAR_MATCHES(enc, ptr, ASCII_SEMI); ptr += MINBPC(enc)) {
1649
20.9k
      int c = BYTE_TO_ASCII(enc, ptr);
1650
20.9k
      result *= 10;
1651
20.9k
      result += (c - ASCII_0);
1652
20.9k
      if (result >= 0x110000)
1653
3
        return -1;
1654
20.9k
    }
1655
5.56k
  }
1656
136k
  return checkCharRefNumber(result);
1657
136k
}
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
130k
                             const char *end) {
1662
130k
  UNUSED_P(enc);
1663
130k
  switch ((end - ptr) / MINBPC(enc)) {
1664
7.68k
  case 2:
1665
7.68k
    if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_t)) {
1666
2.50k
      switch (BYTE_TO_ASCII(enc, ptr)) {
1667
689
      case ASCII_l:
1668
689
        return ASCII_LT;
1669
280
      case ASCII_g:
1670
280
        return ASCII_GT;
1671
2.50k
      }
1672
2.50k
    }
1673
6.72k
    break;
1674
42.1k
  case 3:
1675
42.1k
    if (CHAR_MATCHES(enc, ptr, ASCII_a)) {
1676
36.3k
      ptr += MINBPC(enc);
1677
36.3k
      if (CHAR_MATCHES(enc, ptr, ASCII_m)) {
1678
31.5k
        ptr += MINBPC(enc);
1679
31.5k
        if (CHAR_MATCHES(enc, ptr, ASCII_p))
1680
31.3k
          return ASCII_AMP;
1681
31.5k
      }
1682
36.3k
    }
1683
10.7k
    break;
1684
15.9k
  case 4:
1685
15.9k
    switch (BYTE_TO_ASCII(enc, ptr)) {
1686
7.45k
    case ASCII_q:
1687
7.45k
      ptr += MINBPC(enc);
1688
7.45k
      if (CHAR_MATCHES(enc, ptr, ASCII_u)) {
1689
6.72k
        ptr += MINBPC(enc);
1690
6.72k
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1691
6.19k
          ptr += MINBPC(enc);
1692
6.19k
          if (CHAR_MATCHES(enc, ptr, ASCII_t))
1693
5.85k
            return ASCII_QUOT;
1694
6.19k
        }
1695
6.72k
      }
1696
1.59k
      break;
1697
3.99k
    case ASCII_a:
1698
3.99k
      ptr += MINBPC(enc);
1699
3.99k
      if (CHAR_MATCHES(enc, ptr, ASCII_p)) {
1700
2.73k
        ptr += MINBPC(enc);
1701
2.73k
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1702
1.43k
          ptr += MINBPC(enc);
1703
1.43k
          if (CHAR_MATCHES(enc, ptr, ASCII_s))
1704
653
            return ASCII_APOS;
1705
1.43k
        }
1706
2.73k
      }
1707
3.33k
      break;
1708
15.9k
    }
1709
130k
  }
1710
91.7k
  return 0;
1711
130k
}
xmltok.c:normal_predefinedEntityName
Line
Count
Source
1661
130k
                             const char *end) {
1662
130k
  UNUSED_P(enc);
1663
130k
  switch ((end - ptr) / MINBPC(enc)) {
1664
7.68k
  case 2:
1665
7.68k
    if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_t)) {
1666
2.50k
      switch (BYTE_TO_ASCII(enc, ptr)) {
1667
689
      case ASCII_l:
1668
689
        return ASCII_LT;
1669
280
      case ASCII_g:
1670
280
        return ASCII_GT;
1671
2.50k
      }
1672
2.50k
    }
1673
6.72k
    break;
1674
42.1k
  case 3:
1675
42.1k
    if (CHAR_MATCHES(enc, ptr, ASCII_a)) {
1676
36.3k
      ptr += MINBPC(enc);
1677
36.3k
      if (CHAR_MATCHES(enc, ptr, ASCII_m)) {
1678
31.5k
        ptr += MINBPC(enc);
1679
31.5k
        if (CHAR_MATCHES(enc, ptr, ASCII_p))
1680
31.3k
          return ASCII_AMP;
1681
31.5k
      }
1682
36.3k
    }
1683
10.7k
    break;
1684
15.9k
  case 4:
1685
15.9k
    switch (BYTE_TO_ASCII(enc, ptr)) {
1686
7.45k
    case ASCII_q:
1687
7.45k
      ptr += MINBPC(enc);
1688
7.45k
      if (CHAR_MATCHES(enc, ptr, ASCII_u)) {
1689
6.72k
        ptr += MINBPC(enc);
1690
6.72k
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1691
6.19k
          ptr += MINBPC(enc);
1692
6.19k
          if (CHAR_MATCHES(enc, ptr, ASCII_t))
1693
5.85k
            return ASCII_QUOT;
1694
6.19k
        }
1695
6.72k
      }
1696
1.59k
      break;
1697
3.99k
    case ASCII_a:
1698
3.99k
      ptr += MINBPC(enc);
1699
3.99k
      if (CHAR_MATCHES(enc, ptr, ASCII_p)) {
1700
2.73k
        ptr += MINBPC(enc);
1701
2.73k
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1702
1.43k
          ptr += MINBPC(enc);
1703
1.43k
          if (CHAR_MATCHES(enc, ptr, ASCII_s))
1704
653
            return ASCII_APOS;
1705
1.43k
        }
1706
2.73k
      }
1707
3.33k
      break;
1708
15.9k
    }
1709
130k
  }
1710
91.7k
  return 0;
1711
130k
}
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
370k
                         const char *end1, const char *ptr2) {
1716
370k
  UNUSED_P(enc);
1717
1.95M
  for (; *ptr2; ptr1 += MINBPC(enc), ptr2++) {
1718
1.70M
    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
55
      return 0; /* LCOV_EXCL_LINE */
1725
55
    }
1726
1.70M
    if (! CHAR_MATCHES(enc, ptr1, *ptr2))
1727
122k
      return 0;
1728
1.70M
  }
1729
247k
  return ptr1 == end1;
1730
370k
}
xmltok.c:normal_nameMatchesAscii
Line
Count
Source
1715
370k
                         const char *end1, const char *ptr2) {
1716
370k
  UNUSED_P(enc);
1717
1.95M
  for (; *ptr2; ptr1 += MINBPC(enc), ptr2++) {
1718
1.70M
    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
55
      return 0; /* LCOV_EXCL_LINE */
1725
55
    }
1726
1.70M
    if (! CHAR_MATCHES(enc, ptr1, *ptr2))
1727
122k
      return 0;
1728
1.70M
  }
1729
247k
  return ptr1 == end1;
1730
370k
}
Unexecuted instantiation: xmltok.c:little2_nameMatchesAscii
Unexecuted instantiation: xmltok.c:big2_nameMatchesAscii
1731
1732
static int PTRFASTCALL
1733
454k
PREFIX(nameLength)(const ENCODING *enc, const char *ptr) {
1734
454k
  const char *start = ptr;
1735
12.2M
  for (;;) {
1736
12.2M
    switch (BYTE_TYPE(enc, ptr)) {
1737
0
#  define LEAD_CASE(n)                                                         \
1738
95.3k
  case BT_LEAD##n:                                                             \
1739
95.3k
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1740
95.3k
    break;
1741
54.8k
      LEAD_CASE(2)
1742
40.5k
      LEAD_CASE(3)
1743
0
      LEAD_CASE(4)
1744
0
#  undef LEAD_CASE
1745
0
    case BT_NONASCII:
1746
10.6M
    case BT_NMSTRT:
1747
#  ifdef XML_NS
1748
    case BT_COLON:
1749
#  endif
1750
11.4M
    case BT_HEX:
1751
11.6M
    case BT_DIGIT:
1752
11.6M
    case BT_NAME:
1753
11.6M
    case BT_MINUS:
1754
11.6M
      ptr += MINBPC(enc);
1755
11.6M
      break;
1756
454k
    default:
1757
454k
      return (int)(ptr - start);
1758
12.2M
    }
1759
12.2M
  }
1760
454k
}
xmltok.c:normal_nameLength
Line
Count
Source
1733
454k
PREFIX(nameLength)(const ENCODING *enc, const char *ptr) {
1734
454k
  const char *start = ptr;
1735
12.2M
  for (;;) {
1736
12.2M
    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
54.8k
      LEAD_CASE(2)
1742
40.5k
      LEAD_CASE(3)
1743
0
      LEAD_CASE(4)
1744
0
#  undef LEAD_CASE
1745
0
    case BT_NONASCII:
1746
10.6M
    case BT_NMSTRT:
1747
#  ifdef XML_NS
1748
    case BT_COLON:
1749
#  endif
1750
11.4M
    case BT_HEX:
1751
11.6M
    case BT_DIGIT:
1752
11.6M
    case BT_NAME:
1753
11.6M
    case BT_MINUS:
1754
11.6M
      ptr += MINBPC(enc);
1755
11.6M
      break;
1756
454k
    default:
1757
454k
      return (int)(ptr - start);
1758
12.2M
    }
1759
12.2M
  }
1760
454k
}
Unexecuted instantiation: xmltok.c:little2_nameLength
Unexecuted instantiation: xmltok.c:big2_nameLength
1761
1762
static const char *PTRFASTCALL
1763
0
PREFIX(skipS)(const ENCODING *enc, const char *ptr) {
1764
0
  for (;;) {
1765
0
    switch (BYTE_TYPE(enc, ptr)) {
1766
0
    case BT_LF:
1767
0
    case BT_CR:
1768
0
    case BT_S:
1769
0
      ptr += MINBPC(enc);
1770
0
      break;
1771
0
    default:
1772
0
      return ptr;
1773
0
    }
1774
0
  }
1775
0
}
Unexecuted instantiation: xmltok.c:normal_skipS
Unexecuted instantiation: xmltok.c:little2_skipS
Unexecuted instantiation: xmltok.c:big2_skipS
1776
1777
static void PTRCALL
1778
PREFIX(updatePosition)(const ENCODING *enc, const char *ptr, const char *end,
1779
17.5k
                       POSITION *pos) {
1780
131M
  while (HAS_CHAR(enc, ptr, end)) {
1781
131M
    switch (BYTE_TYPE(enc, ptr)) {
1782
0
#  define LEAD_CASE(n)                                                         \
1783
1.85M
  case BT_LEAD##n:                                                             \
1784
1.85M
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1785
1.85M
    pos->columnNumber++;                                                       \
1786
1.85M
    break;
1787
883k
      LEAD_CASE(2)
1788
702k
      LEAD_CASE(3)
1789
269k
      LEAD_CASE(4)
1790
0
#  undef LEAD_CASE
1791
3.72M
    case BT_LF:
1792
3.72M
      pos->columnNumber = 0;
1793
3.72M
      pos->lineNumber++;
1794
3.72M
      ptr += MINBPC(enc);
1795
3.72M
      break;
1796
4.85M
    case BT_CR:
1797
4.85M
      pos->lineNumber++;
1798
4.85M
      ptr += MINBPC(enc);
1799
4.85M
      if (HAS_CHAR(enc, ptr, end) && BYTE_TYPE(enc, ptr) == BT_LF)
1800
904k
        ptr += MINBPC(enc);
1801
4.85M
      pos->columnNumber = 0;
1802
4.85M
      break;
1803
120M
    default:
1804
120M
      ptr += MINBPC(enc);
1805
120M
      pos->columnNumber++;
1806
120M
      break;
1807
131M
    }
1808
131M
  }
1809
17.5k
}
xmltok.c:normal_updatePosition
Line
Count
Source
1779
17.1k
                       POSITION *pos) {
1780
131M
  while (HAS_CHAR(enc, ptr, end)) {
1781
131M
    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
883k
      LEAD_CASE(2)
1788
702k
      LEAD_CASE(3)
1789
269k
      LEAD_CASE(4)
1790
0
#  undef LEAD_CASE
1791
3.72M
    case BT_LF:
1792
3.72M
      pos->columnNumber = 0;
1793
3.72M
      pos->lineNumber++;
1794
3.72M
      ptr += MINBPC(enc);
1795
3.72M
      break;
1796
4.85M
    case BT_CR:
1797
4.85M
      pos->lineNumber++;
1798
4.85M
      ptr += MINBPC(enc);
1799
4.85M
      if (HAS_CHAR(enc, ptr, end) && BYTE_TYPE(enc, ptr) == BT_LF)
1800
904k
        ptr += MINBPC(enc);
1801
4.85M
      pos->columnNumber = 0;
1802
4.85M
      break;
1803
120M
    default:
1804
120M
      ptr += MINBPC(enc);
1805
120M
      pos->columnNumber++;
1806
120M
      break;
1807
131M
    }
1808
131M
  }
1809
17.1k
}
xmltok.c:little2_updatePosition
Line
Count
Source
1779
227
                       POSITION *pos) {
1780
6.20k
  while (HAS_CHAR(enc, ptr, end)) {
1781
6.20k
    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
6.20k
    default:
1804
6.20k
      ptr += MINBPC(enc);
1805
6.20k
      pos->columnNumber++;
1806
6.20k
      break;
1807
6.20k
    }
1808
6.20k
  }
1809
227
}
xmltok.c:big2_updatePosition
Line
Count
Source
1779
196
                       POSITION *pos) {
1780
11.7k
  while (HAS_CHAR(enc, ptr, end)) {
1781
11.7k
    switch (BYTE_TYPE(enc, ptr)) {
1782
0
#  define LEAD_CASE(n)                                                         \
1783
0
  case BT_LEAD##n:                                                             \
1784
0
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1785
0
    pos->columnNumber++;                                                       \
1786
0
    break;
1787
0
      LEAD_CASE(2)
1788
0
      LEAD_CASE(3)
1789
0
      LEAD_CASE(4)
1790
0
#  undef LEAD_CASE
1791
0
    case BT_LF:
1792
0
      pos->columnNumber = 0;
1793
0
      pos->lineNumber++;
1794
0
      ptr += MINBPC(enc);
1795
0
      break;
1796
0
    case BT_CR:
1797
0
      pos->lineNumber++;
1798
0
      ptr += MINBPC(enc);
1799
0
      if (HAS_CHAR(enc, ptr, end) && BYTE_TYPE(enc, ptr) == BT_LF)
1800
0
        ptr += MINBPC(enc);
1801
0
      pos->columnNumber = 0;
1802
0
      break;
1803
11.7k
    default:
1804
11.7k
      ptr += MINBPC(enc);
1805
11.7k
      pos->columnNumber++;
1806
11.7k
      break;
1807
11.7k
    }
1808
11.7k
  }
1809
196
}
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 */