Coverage Report

Created: 2026-04-29 07:01

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
106
#    define IS_INVALID_CHAR(enc, ptr, n) (0)
46
#  endif
47
48
#  define INVALID_LEAD_CASE(n, ptr, nextTokPtr)                                \
49
723k
  case BT_LEAD##n:                                                             \
50
723k
    if (end - ptr < n)                                                         \
51
723k
      return XML_TOK_PARTIAL_CHAR;                                             \
52
723k
    if (IS_INVALID_CHAR(enc, ptr, n)) {                                        \
53
104
      *(nextTokPtr) = (ptr);                                                   \
54
104
      return XML_TOK_INVALID;                                                  \
55
104
    }                                                                          \
56
723k
    ptr += n;                                                                  \
57
723k
    break;
58
59
#  define INVALID_CASES(ptr, nextTokPtr)                                       \
60
319k
    INVALID_LEAD_CASE(2, ptr, nextTokPtr)                                      \
61
319k
    INVALID_LEAD_CASE(3, ptr, nextTokPtr)                                      \
62
274k
    INVALID_LEAD_CASE(4, ptr, nextTokPtr)                                      \
63
129k
  case BT_NONXML:                                                              \
64
60
  case BT_MALFORM:                                                             \
65
120
  case BT_TRAIL:                                                               \
66
120
    *(nextTokPtr) = (ptr);                                                     \
67
120
    return XML_TOK_INVALID;
68
69
#  define CHECK_NAME_CASE(n, enc, ptr, end, nextTokPtr)                        \
70
216k
  case BT_LEAD##n:                                                             \
71
216k
    if (end - ptr < n)                                                         \
72
215k
      return XML_TOK_PARTIAL_CHAR;                                             \
73
215k
    if (IS_INVALID_CHAR(enc, ptr, n) || ! IS_NAME_CHAR(enc, ptr, n)) {         \
74
306
      *nextTokPtr = ptr;                                                       \
75
306
      return XML_TOK_INVALID;                                                  \
76
306
    }                                                                          \
77
215k
    ptr += n;                                                                  \
78
215k
    break;
79
80
#  define CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)                          \
81
23.6M
  case BT_NONASCII:                                                            \
82
23.6M
    if (! IS_NAME_CHAR_MINBPC(enc, ptr)) {                                     \
83
47
      *nextTokPtr = ptr;                                                       \
84
47
      return XML_TOK_INVALID;                                                  \
85
47
    }                                                                          \
86
23.6M
    /* fall through */                                                         \
87
23.6M
  case BT_NMSTRT:                                                              \
88
18.5M
  case BT_HEX:                                                                 \
89
23.4M
  case BT_DIGIT:                                                               \
90
23.5M
  case BT_NAME:                                                                \
91
23.6M
  case BT_MINUS:                                                               \
92
23.6M
    ptr += MINBPC(enc);                                                        \
93
23.6M
    break;                                                                     \
94
23.6M
    CHECK_NAME_CASE(2, enc, ptr, end, nextTokPtr)                              \
95
144k
    CHECK_NAME_CASE(3, enc, ptr, end, nextTokPtr)                              \
96
144k
    CHECK_NAME_CASE(4, enc, ptr, end, nextTokPtr)
97
98
#  define CHECK_NMSTRT_CASE(n, enc, ptr, end, nextTokPtr)                      \
99
105k
  case BT_LEAD##n:                                                             \
100
105k
    if ((end) - (ptr) < (n))                                                   \
101
104k
      return XML_TOK_PARTIAL_CHAR;                                             \
102
105k
    if (IS_INVALID_CHAR(enc, ptr, n) || ! IS_NMSTRT_CHAR(enc, ptr, n)) {       \
103
174
      *nextTokPtr = ptr;                                                       \
104
174
      return XML_TOK_INVALID;                                                  \
105
174
    }                                                                          \
106
105k
    ptr += n;                                                                  \
107
104k
    break;
108
109
#  define CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)                        \
110
4.41M
  case BT_NONASCII:                                                            \
111
4.41M
    if (! IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {                                   \
112
0
      *nextTokPtr = ptr;                                                       \
113
0
      return XML_TOK_INVALID;                                                  \
114
0
    }                                                                          \
115
4.41M
    /* fall through */                                                         \
116
4.41M
  case BT_NMSTRT:                                                              \
117
4.41M
  case BT_HEX:                                                                 \
118
4.41M
    ptr += MINBPC(enc);                                                        \
119
4.41M
    break;                                                                     \
120
4.41M
    CHECK_NMSTRT_CASE(2, enc, ptr, end, nextTokPtr)                            \
121
64.1k
    CHECK_NMSTRT_CASE(3, enc, ptr, end, nextTokPtr)                            \
122
40.7k
    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
311M
    ((end) - (ptr) >= ((count) * MINBPC(enc)))
130
131
11.1M
#  define HAS_CHAR(enc, ptr, end) HAS_CHARS(enc, ptr, end, 1)
132
133
#  define REQUIRE_CHARS(enc, ptr, end, count)                                  \
134
37.9M
    {                                                                          \
135
37.9M
      if (! HAS_CHARS(enc, ptr, end, count)) {                                 \
136
669
        return XML_TOK_PARTIAL;                                                \
137
669
      }                                                                        \
138
37.9M
    }
139
140
37.9M
#  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.4k
                    const char **nextTokPtr) {
147
16.4k
  if (HAS_CHAR(enc, ptr, end)) {
148
16.4k
    if (! CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
149
10
      *nextTokPtr = ptr;
150
10
      return XML_TOK_INVALID;
151
10
    }
152
16.4k
    ptr += MINBPC(enc);
153
5.79M
    while (HAS_CHAR(enc, ptr, end)) {
154
5.79M
      switch (BYTE_TYPE(enc, ptr)) {
155
199k
        INVALID_CASES(ptr, nextTokPtr)
156
31.7k
      case BT_MINUS:
157
31.7k
        ptr += MINBPC(enc);
158
31.7k
        REQUIRE_CHAR(enc, ptr, end);
159
31.7k
        if (CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
160
16.3k
          ptr += MINBPC(enc);
161
16.3k
          REQUIRE_CHAR(enc, ptr, end);
162
16.3k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
163
9
            *nextTokPtr = ptr;
164
9
            return XML_TOK_INVALID;
165
9
          }
166
16.3k
          *nextTokPtr = ptr + MINBPC(enc);
167
16.3k
          return XML_TOK_COMMENT;
168
16.3k
        }
169
15.3k
        break;
170
5.66M
      default:
171
5.66M
        ptr += MINBPC(enc);
172
5.66M
        break;
173
5.79M
      }
174
5.79M
    }
175
16.4k
  }
176
86
  return XML_TOK_PARTIAL;
177
16.4k
}
xmltok.c:normal_scanComment
Line
Count
Source
146
16.4k
                    const char **nextTokPtr) {
147
16.4k
  if (HAS_CHAR(enc, ptr, end)) {
148
16.4k
    if (! CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
149
10
      *nextTokPtr = ptr;
150
10
      return XML_TOK_INVALID;
151
10
    }
152
16.4k
    ptr += MINBPC(enc);
153
5.79M
    while (HAS_CHAR(enc, ptr, end)) {
154
5.79M
      switch (BYTE_TYPE(enc, ptr)) {
155
199k
        INVALID_CASES(ptr, nextTokPtr)
156
31.7k
      case BT_MINUS:
157
31.7k
        ptr += MINBPC(enc);
158
31.7k
        REQUIRE_CHAR(enc, ptr, end);
159
31.7k
        if (CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
160
16.3k
          ptr += MINBPC(enc);
161
16.3k
          REQUIRE_CHAR(enc, ptr, end);
162
16.3k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
163
9
            *nextTokPtr = ptr;
164
9
            return XML_TOK_INVALID;
165
9
          }
166
16.3k
          *nextTokPtr = ptr + MINBPC(enc);
167
16.3k
          return XML_TOK_COMMENT;
168
16.3k
        }
169
15.3k
        break;
170
5.66M
      default:
171
5.66M
        ptr += MINBPC(enc);
172
5.66M
        break;
173
5.79M
      }
174
5.79M
    }
175
16.4k
  }
176
86
  return XML_TOK_PARTIAL;
177
16.4k
}
Unexecuted instantiation: xmltok.c:little2_scanComment
Unexecuted instantiation: xmltok.c:big2_scanComment
178
179
/* ptr points to character following "<!" */
180
181
static int PTRCALL
182
PREFIX(scanDecl)(const ENCODING *enc, const char *ptr, const char *end,
183
56.7k
                 const char **nextTokPtr) {
184
56.7k
  REQUIRE_CHAR(enc, ptr, end);
185
56.7k
  switch (BYTE_TYPE(enc, ptr)) {
186
1.67k
  case BT_MINUS:
187
1.67k
    return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
188
2
  case BT_LSQB:
189
2
    *nextTokPtr = ptr + MINBPC(enc);
190
2
    return XML_TOK_COND_SECT_OPEN;
191
1.29k
  case BT_NMSTRT:
192
55.1k
  case BT_HEX:
193
55.1k
    ptr += MINBPC(enc);
194
55.1k
    break;
195
3
  default:
196
3
    *nextTokPtr = ptr;
197
3
    return XML_TOK_INVALID;
198
56.7k
  }
199
377k
  while (HAS_CHAR(enc, ptr, end)) {
200
377k
    switch (BYTE_TYPE(enc, ptr)) {
201
20
    case BT_PERCNT:
202
20
      REQUIRE_CHARS(enc, ptr, end, 2);
203
      /* don't allow <!ENTITY% foo "whatever"> */
204
18
      switch (BYTE_TYPE(enc, ptr + MINBPC(enc))) {
205
1
      case BT_S:
206
2
      case BT_CR:
207
3
      case BT_LF:
208
5
      case BT_PERCNT:
209
5
        *nextTokPtr = ptr;
210
5
        return XML_TOK_INVALID;
211
18
      }
212
      /* fall through */
213
23.5k
    case BT_S:
214
51.1k
    case BT_CR:
215
55.0k
    case BT_LF:
216
55.0k
      *nextTokPtr = ptr;
217
55.0k
      return XML_TOK_DECL_OPEN;
218
306k
    case BT_NMSTRT:
219
322k
    case BT_HEX:
220
322k
      ptr += MINBPC(enc);
221
322k
      break;
222
10
    default:
223
10
      *nextTokPtr = ptr;
224
10
      return XML_TOK_INVALID;
225
377k
    }
226
377k
  }
227
68
  return XML_TOK_PARTIAL;
228
55.1k
}
xmltok.c:normal_scanDecl
Line
Count
Source
183
56.7k
                 const char **nextTokPtr) {
184
56.7k
  REQUIRE_CHAR(enc, ptr, end);
185
56.7k
  switch (BYTE_TYPE(enc, ptr)) {
186
1.67k
  case BT_MINUS:
187
1.67k
    return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
188
2
  case BT_LSQB:
189
2
    *nextTokPtr = ptr + MINBPC(enc);
190
2
    return XML_TOK_COND_SECT_OPEN;
191
1.29k
  case BT_NMSTRT:
192
55.1k
  case BT_HEX:
193
55.1k
    ptr += MINBPC(enc);
194
55.1k
    break;
195
3
  default:
196
3
    *nextTokPtr = ptr;
197
3
    return XML_TOK_INVALID;
198
56.7k
  }
199
377k
  while (HAS_CHAR(enc, ptr, end)) {
200
377k
    switch (BYTE_TYPE(enc, ptr)) {
201
20
    case BT_PERCNT:
202
20
      REQUIRE_CHARS(enc, ptr, end, 2);
203
      /* don't allow <!ENTITY% foo "whatever"> */
204
18
      switch (BYTE_TYPE(enc, ptr + MINBPC(enc))) {
205
1
      case BT_S:
206
2
      case BT_CR:
207
3
      case BT_LF:
208
5
      case BT_PERCNT:
209
5
        *nextTokPtr = ptr;
210
5
        return XML_TOK_INVALID;
211
18
      }
212
      /* fall through */
213
23.5k
    case BT_S:
214
51.1k
    case BT_CR:
215
55.0k
    case BT_LF:
216
55.0k
      *nextTokPtr = ptr;
217
55.0k
      return XML_TOK_DECL_OPEN;
218
306k
    case BT_NMSTRT:
219
322k
    case BT_HEX:
220
322k
      ptr += MINBPC(enc);
221
322k
      break;
222
10
    default:
223
10
      *nextTokPtr = ptr;
224
10
      return XML_TOK_INVALID;
225
377k
    }
226
377k
  }
227
68
  return XML_TOK_PARTIAL;
228
55.1k
}
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
43.2k
                      int *tokPtr) {
233
43.2k
  int upper = 0;
234
43.2k
  UNUSED_P(enc);
235
43.2k
  *tokPtr = XML_TOK_PI;
236
43.2k
  if (end - ptr != MINBPC(enc) * 3)
237
32.9k
    return 1;
238
10.3k
  switch (BYTE_TO_ASCII(enc, ptr)) {
239
4.14k
  case ASCII_x:
240
4.14k
    break;
241
1.94k
  case ASCII_X:
242
1.94k
    upper = 1;
243
1.94k
    break;
244
4.22k
  default:
245
4.22k
    return 1;
246
10.3k
  }
247
6.08k
  ptr += MINBPC(enc);
248
6.08k
  switch (BYTE_TO_ASCII(enc, ptr)) {
249
1.57k
  case ASCII_m:
250
1.57k
    break;
251
829
  case ASCII_M:
252
829
    upper = 1;
253
829
    break;
254
3.68k
  default:
255
3.68k
    return 1;
256
6.08k
  }
257
2.40k
  ptr += MINBPC(enc);
258
2.40k
  switch (BYTE_TO_ASCII(enc, ptr)) {
259
1.12k
  case ASCII_l:
260
1.12k
    break;
261
2
  case ASCII_L:
262
2
    upper = 1;
263
2
    break;
264
1.27k
  default:
265
1.27k
    return 1;
266
2.40k
  }
267
1.13k
  if (upper)
268
4
    return 0;
269
1.12k
  *tokPtr = XML_TOK_XML_DECL;
270
1.12k
  return 1;
271
1.13k
}
xmltok.c:normal_checkPiTarget
Line
Count
Source
232
43.2k
                      int *tokPtr) {
233
43.2k
  int upper = 0;
234
43.2k
  UNUSED_P(enc);
235
43.2k
  *tokPtr = XML_TOK_PI;
236
43.2k
  if (end - ptr != MINBPC(enc) * 3)
237
32.9k
    return 1;
238
10.3k
  switch (BYTE_TO_ASCII(enc, ptr)) {
239
4.14k
  case ASCII_x:
240
4.14k
    break;
241
1.94k
  case ASCII_X:
242
1.94k
    upper = 1;
243
1.94k
    break;
244
4.22k
  default:
245
4.22k
    return 1;
246
10.3k
  }
247
6.08k
  ptr += MINBPC(enc);
248
6.08k
  switch (BYTE_TO_ASCII(enc, ptr)) {
249
1.57k
  case ASCII_m:
250
1.57k
    break;
251
829
  case ASCII_M:
252
829
    upper = 1;
253
829
    break;
254
3.68k
  default:
255
3.68k
    return 1;
256
6.08k
  }
257
2.40k
  ptr += MINBPC(enc);
258
2.40k
  switch (BYTE_TO_ASCII(enc, ptr)) {
259
1.12k
  case ASCII_l:
260
1.12k
    break;
261
2
  case ASCII_L:
262
2
    upper = 1;
263
2
    break;
264
1.27k
  default:
265
1.27k
    return 1;
266
2.40k
  }
267
1.13k
  if (upper)
268
4
    return 0;
269
1.12k
  *tokPtr = XML_TOK_XML_DECL;
270
1.12k
  return 1;
271
1.13k
}
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
43.4k
               const char **nextTokPtr) {
278
43.4k
  int tok;
279
43.4k
  const char *target = ptr;
280
43.4k
  REQUIRE_CHAR(enc, ptr, end);
281
43.4k
  switch (BYTE_TYPE(enc, ptr)) {
282
60.5k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
283
3
  default:
284
3
    *nextTokPtr = ptr;
285
3
    return XML_TOK_INVALID;
286
43.4k
  }
287
917k
  while (HAS_CHAR(enc, ptr, end)) {
288
917k
    switch (BYTE_TYPE(enc, ptr)) {
289
3.03M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
290
8.23k
    case BT_S:
291
9.96k
    case BT_CR:
292
14.1k
    case BT_LF:
293
14.1k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
294
2
        *nextTokPtr = ptr;
295
2
        return XML_TOK_INVALID;
296
2
      }
297
14.1k
      ptr += MINBPC(enc);
298
15.6M
      while (HAS_CHAR(enc, ptr, end)) {
299
15.6M
        switch (BYTE_TYPE(enc, ptr)) {
300
516k
          INVALID_CASES(ptr, nextTokPtr)
301
86.7k
        case BT_QUEST:
302
86.7k
          ptr += MINBPC(enc);
303
86.7k
          REQUIRE_CHAR(enc, ptr, end);
304
86.7k
          if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
305
13.9k
            *nextTokPtr = ptr + MINBPC(enc);
306
13.9k
            return tok;
307
13.9k
          }
308
72.7k
          break;
309
15.3M
        default:
310
15.3M
          ptr += MINBPC(enc);
311
15.3M
          break;
312
15.6M
        }
313
15.6M
      }
314
146
      return XML_TOK_PARTIAL;
315
29.1k
    case BT_QUEST:
316
29.1k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
317
2
        *nextTokPtr = ptr;
318
2
        return XML_TOK_INVALID;
319
2
      }
320
29.1k
      ptr += MINBPC(enc);
321
29.1k
      REQUIRE_CHAR(enc, ptr, end);
322
29.0k
      if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
323
29.0k
        *nextTokPtr = ptr + MINBPC(enc);
324
29.0k
        return tok;
325
29.0k
      }
326
      /* fall through */
327
32
    default:
328
32
      *nextTokPtr = ptr;
329
32
      return XML_TOK_INVALID;
330
917k
    }
331
917k
  }
332
84
  return XML_TOK_PARTIAL;
333
43.4k
}
xmltok.c:normal_scanPi
Line
Count
Source
277
43.4k
               const char **nextTokPtr) {
278
43.4k
  int tok;
279
43.4k
  const char *target = ptr;
280
43.4k
  REQUIRE_CHAR(enc, ptr, end);
281
43.4k
  switch (BYTE_TYPE(enc, ptr)) {
282
60.5k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
283
3
  default:
284
3
    *nextTokPtr = ptr;
285
3
    return XML_TOK_INVALID;
286
43.4k
  }
287
917k
  while (HAS_CHAR(enc, ptr, end)) {
288
917k
    switch (BYTE_TYPE(enc, ptr)) {
289
3.03M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
290
8.23k
    case BT_S:
291
9.96k
    case BT_CR:
292
14.1k
    case BT_LF:
293
14.1k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
294
2
        *nextTokPtr = ptr;
295
2
        return XML_TOK_INVALID;
296
2
      }
297
14.1k
      ptr += MINBPC(enc);
298
15.6M
      while (HAS_CHAR(enc, ptr, end)) {
299
15.6M
        switch (BYTE_TYPE(enc, ptr)) {
300
516k
          INVALID_CASES(ptr, nextTokPtr)
301
86.7k
        case BT_QUEST:
302
86.7k
          ptr += MINBPC(enc);
303
86.7k
          REQUIRE_CHAR(enc, ptr, end);
304
86.7k
          if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
305
13.9k
            *nextTokPtr = ptr + MINBPC(enc);
306
13.9k
            return tok;
307
13.9k
          }
308
72.7k
          break;
309
15.3M
        default:
310
15.3M
          ptr += MINBPC(enc);
311
15.3M
          break;
312
15.6M
        }
313
15.6M
      }
314
146
      return XML_TOK_PARTIAL;
315
29.1k
    case BT_QUEST:
316
29.1k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
317
2
        *nextTokPtr = ptr;
318
2
        return XML_TOK_INVALID;
319
2
      }
320
29.1k
      ptr += MINBPC(enc);
321
29.1k
      REQUIRE_CHAR(enc, ptr, end);
322
29.0k
      if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
323
29.0k
        *nextTokPtr = ptr + MINBPC(enc);
324
29.0k
        return tok;
325
29.0k
      }
326
      /* fall through */
327
32
    default:
328
32
      *nextTokPtr = ptr;
329
32
      return XML_TOK_INVALID;
330
917k
    }
331
917k
  }
332
84
  return XML_TOK_PARTIAL;
333
43.4k
}
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
3.29k
                         const char **nextTokPtr) {
338
3.29k
  static const char CDATA_LSQB[]
339
3.29k
      = {ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, ASCII_LSQB};
340
3.29k
  int i;
341
3.29k
  UNUSED_P(enc);
342
  /* CDATA[ */
343
3.29k
  REQUIRE_CHARS(enc, ptr, end, 6);
344
22.7k
  for (i = 0; i < 6; i++, ptr += MINBPC(enc)) {
345
19.5k
    if (! CHAR_MATCHES(enc, ptr, CDATA_LSQB[i])) {
346
60
      *nextTokPtr = ptr;
347
60
      return XML_TOK_INVALID;
348
60
    }
349
19.5k
  }
350
3.21k
  *nextTokPtr = ptr;
351
3.21k
  return XML_TOK_CDATA_SECT_OPEN;
352
3.27k
}
xmltok.c:normal_scanCdataSection
Line
Count
Source
337
3.29k
                         const char **nextTokPtr) {
338
3.29k
  static const char CDATA_LSQB[]
339
3.29k
      = {ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, ASCII_LSQB};
340
3.29k
  int i;
341
3.29k
  UNUSED_P(enc);
342
  /* CDATA[ */
343
3.29k
  REQUIRE_CHARS(enc, ptr, end, 6);
344
22.7k
  for (i = 0; i < 6; i++, ptr += MINBPC(enc)) {
345
19.5k
    if (! CHAR_MATCHES(enc, ptr, CDATA_LSQB[i])) {
346
60
      *nextTokPtr = ptr;
347
60
      return XML_TOK_INVALID;
348
60
    }
349
19.5k
  }
350
3.21k
  *nextTokPtr = ptr;
351
3.21k
  return XML_TOK_CDATA_SECT_OPEN;
352
3.27k
}
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
6.05M
                        const char **nextTokPtr) {
357
6.05M
  if (ptr >= end)
358
182
    return XML_TOK_NONE;
359
6.05M
  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
6.05M
  switch (BYTE_TYPE(enc, ptr)) {
369
1.01M
  case BT_RSQB:
370
1.01M
    ptr += MINBPC(enc);
371
1.01M
    REQUIRE_CHAR(enc, ptr, end);
372
1.01M
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
373
546k
      break;
374
466k
    ptr += MINBPC(enc);
375
466k
    REQUIRE_CHAR(enc, ptr, end);
376
466k
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
377
463k
      ptr -= MINBPC(enc);
378
463k
      break;
379
463k
    }
380
3.05k
    *nextTokPtr = ptr + MINBPC(enc);
381
3.05k
    return XML_TOK_CDATA_SECT_CLOSE;
382
1.94M
  case BT_CR:
383
1.94M
    ptr += MINBPC(enc);
384
1.94M
    REQUIRE_CHAR(enc, ptr, end);
385
1.94M
    if (BYTE_TYPE(enc, ptr) == BT_LF)
386
426k
      ptr += MINBPC(enc);
387
1.94M
    *nextTokPtr = ptr;
388
1.94M
    return XML_TOK_DATA_NEWLINE;
389
1.80M
  case BT_LF:
390
1.80M
    *nextTokPtr = ptr + MINBPC(enc);
391
1.80M
    return XML_TOK_DATA_NEWLINE;
392
1.80M
    INVALID_CASES(ptr, nextTokPtr)
393
1.10M
  default:
394
1.10M
    ptr += MINBPC(enc);
395
1.10M
    break;
396
6.05M
  }
397
31.9M
  while (HAS_CHAR(enc, ptr, end)) {
398
31.9M
    switch (BYTE_TYPE(enc, ptr)) {
399
0
#  define LEAD_CASE(n)                                                         \
400
454k
  case BT_LEAD##n:                                                             \
401
454k
    if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) {                       \
402
19
      *nextTokPtr = ptr;                                                       \
403
19
      return XML_TOK_DATA_CHARS;                                               \
404
19
    }                                                                          \
405
454k
    ptr += n;                                                                  \
406
454k
    break;
407
178k
      LEAD_CASE(2)
408
172k
      LEAD_CASE(3)
409
103k
      LEAD_CASE(4)
410
0
#  undef LEAD_CASE
411
6
    case BT_NONXML:
412
7
    case BT_MALFORM:
413
14
    case BT_TRAIL:
414
868k
    case BT_CR:
415
1.42M
    case BT_LF:
416
2.30M
    case BT_RSQB:
417
2.30M
      *nextTokPtr = ptr;
418
2.30M
      return XML_TOK_DATA_CHARS;
419
29.2M
    default:
420
29.2M
      ptr += MINBPC(enc);
421
29.2M
      break;
422
31.9M
    }
423
31.9M
  }
424
53
  *nextTokPtr = ptr;
425
53
  return XML_TOK_DATA_CHARS;
426
2.30M
}
xmltok.c:normal_cdataSectionTok
Line
Count
Source
356
6.05M
                        const char **nextTokPtr) {
357
6.05M
  if (ptr >= end)
358
182
    return XML_TOK_NONE;
359
6.05M
  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
6.05M
  switch (BYTE_TYPE(enc, ptr)) {
369
1.01M
  case BT_RSQB:
370
1.01M
    ptr += MINBPC(enc);
371
1.01M
    REQUIRE_CHAR(enc, ptr, end);
372
1.01M
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
373
546k
      break;
374
466k
    ptr += MINBPC(enc);
375
466k
    REQUIRE_CHAR(enc, ptr, end);
376
466k
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
377
463k
      ptr -= MINBPC(enc);
378
463k
      break;
379
463k
    }
380
3.05k
    *nextTokPtr = ptr + MINBPC(enc);
381
3.05k
    return XML_TOK_CDATA_SECT_CLOSE;
382
1.94M
  case BT_CR:
383
1.94M
    ptr += MINBPC(enc);
384
1.94M
    REQUIRE_CHAR(enc, ptr, end);
385
1.94M
    if (BYTE_TYPE(enc, ptr) == BT_LF)
386
426k
      ptr += MINBPC(enc);
387
1.94M
    *nextTokPtr = ptr;
388
1.94M
    return XML_TOK_DATA_NEWLINE;
389
1.80M
  case BT_LF:
390
1.80M
    *nextTokPtr = ptr + MINBPC(enc);
391
1.80M
    return XML_TOK_DATA_NEWLINE;
392
1.80M
    INVALID_CASES(ptr, nextTokPtr)
393
1.10M
  default:
394
1.10M
    ptr += MINBPC(enc);
395
1.10M
    break;
396
6.05M
  }
397
31.9M
  while (HAS_CHAR(enc, ptr, end)) {
398
31.9M
    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
178k
      LEAD_CASE(2)
408
172k
      LEAD_CASE(3)
409
103k
      LEAD_CASE(4)
410
0
#  undef LEAD_CASE
411
6
    case BT_NONXML:
412
7
    case BT_MALFORM:
413
14
    case BT_TRAIL:
414
868k
    case BT_CR:
415
1.42M
    case BT_LF:
416
2.30M
    case BT_RSQB:
417
2.30M
      *nextTokPtr = ptr;
418
2.30M
      return XML_TOK_DATA_CHARS;
419
29.2M
    default:
420
29.2M
      ptr += MINBPC(enc);
421
29.2M
      break;
422
31.9M
    }
423
31.9M
  }
424
53
  *nextTokPtr = ptr;
425
53
  return XML_TOK_DATA_CHARS;
426
2.30M
}
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
54.8k
                   const char **nextTokPtr) {
433
54.8k
  REQUIRE_CHAR(enc, ptr, end);
434
54.8k
  switch (BYTE_TYPE(enc, ptr)) {
435
49.6k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
436
12
  default:
437
12
    *nextTokPtr = ptr;
438
12
    return XML_TOK_INVALID;
439
54.8k
  }
440
1.23M
  while (HAS_CHAR(enc, ptr, end)) {
441
1.23M
    switch (BYTE_TYPE(enc, ptr)) {
442
3.60M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
443
248
    case BT_S:
444
1.88k
    case BT_CR:
445
3.64k
    case BT_LF:
446
9.79k
      for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
447
9.79k
        switch (BYTE_TYPE(enc, ptr)) {
448
307
        case BT_S:
449
2.40k
        case BT_CR:
450
6.19k
        case BT_LF:
451
6.19k
          break;
452
3.60k
        case BT_GT:
453
3.60k
          *nextTokPtr = ptr + MINBPC(enc);
454
3.60k
          return XML_TOK_END_TAG;
455
4
        default:
456
4
          *nextTokPtr = ptr;
457
4
          return XML_TOK_INVALID;
458
9.79k
        }
459
9.79k
      }
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
51.0k
    case BT_GT:
469
51.0k
      *nextTokPtr = ptr + MINBPC(enc);
470
51.0k
      return XML_TOK_END_TAG;
471
12
    default:
472
12
      *nextTokPtr = ptr;
473
12
      return XML_TOK_INVALID;
474
1.23M
    }
475
1.23M
  }
476
110
  return XML_TOK_PARTIAL;
477
54.8k
}
xmltok.c:normal_scanEndTag
Line
Count
Source
432
54.8k
                   const char **nextTokPtr) {
433
54.8k
  REQUIRE_CHAR(enc, ptr, end);
434
54.8k
  switch (BYTE_TYPE(enc, ptr)) {
435
49.6k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
436
12
  default:
437
12
    *nextTokPtr = ptr;
438
12
    return XML_TOK_INVALID;
439
54.8k
  }
440
1.23M
  while (HAS_CHAR(enc, ptr, end)) {
441
1.23M
    switch (BYTE_TYPE(enc, ptr)) {
442
3.60M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
443
248
    case BT_S:
444
1.88k
    case BT_CR:
445
3.64k
    case BT_LF:
446
9.79k
      for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
447
9.79k
        switch (BYTE_TYPE(enc, ptr)) {
448
307
        case BT_S:
449
2.40k
        case BT_CR:
450
6.19k
        case BT_LF:
451
6.19k
          break;
452
3.60k
        case BT_GT:
453
3.60k
          *nextTokPtr = ptr + MINBPC(enc);
454
3.60k
          return XML_TOK_END_TAG;
455
4
        default:
456
4
          *nextTokPtr = ptr;
457
4
          return XML_TOK_INVALID;
458
9.79k
        }
459
9.79k
      }
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
51.0k
    case BT_GT:
469
51.0k
      *nextTokPtr = ptr + MINBPC(enc);
470
51.0k
      return XML_TOK_END_TAG;
471
12
    default:
472
12
      *nextTokPtr = ptr;
473
12
      return XML_TOK_INVALID;
474
1.23M
    }
475
1.23M
  }
476
110
  return XML_TOK_PARTIAL;
477
54.8k
}
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
27.1k
                       const char **nextTokPtr) {
484
27.1k
  if (HAS_CHAR(enc, ptr, end)) {
485
27.1k
    switch (BYTE_TYPE(enc, ptr)) {
486
11.4k
    case BT_DIGIT:
487
27.1k
    case BT_HEX:
488
27.1k
      break;
489
7
    default:
490
7
      *nextTokPtr = ptr;
491
7
      return XML_TOK_INVALID;
492
27.1k
    }
493
98.1k
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
494
98.1k
      switch (BYTE_TYPE(enc, ptr)) {
495
46.5k
      case BT_DIGIT:
496
71.0k
      case BT_HEX:
497
71.0k
        break;
498
27.0k
      case BT_SEMI:
499
27.0k
        *nextTokPtr = ptr + MINBPC(enc);
500
27.0k
        return XML_TOK_CHAR_REF;
501
2
      default:
502
2
        *nextTokPtr = ptr;
503
2
        return XML_TOK_INVALID;
504
98.1k
      }
505
98.1k
    }
506
27.1k
  }
507
29
  return XML_TOK_PARTIAL;
508
27.1k
}
xmltok.c:normal_scanHexCharRef
Line
Count
Source
483
27.1k
                       const char **nextTokPtr) {
484
27.1k
  if (HAS_CHAR(enc, ptr, end)) {
485
27.1k
    switch (BYTE_TYPE(enc, ptr)) {
486
11.4k
    case BT_DIGIT:
487
27.1k
    case BT_HEX:
488
27.1k
      break;
489
7
    default:
490
7
      *nextTokPtr = ptr;
491
7
      return XML_TOK_INVALID;
492
27.1k
    }
493
98.1k
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
494
98.1k
      switch (BYTE_TYPE(enc, ptr)) {
495
46.5k
      case BT_DIGIT:
496
71.0k
      case BT_HEX:
497
71.0k
        break;
498
27.0k
      case BT_SEMI:
499
27.0k
        *nextTokPtr = ptr + MINBPC(enc);
500
27.0k
        return XML_TOK_CHAR_REF;
501
2
      default:
502
2
        *nextTokPtr = ptr;
503
2
        return XML_TOK_INVALID;
504
98.1k
      }
505
98.1k
    }
506
27.1k
  }
507
29
  return XML_TOK_PARTIAL;
508
27.1k
}
Unexecuted instantiation: xmltok.c:little2_scanHexCharRef
Unexecuted instantiation: xmltok.c:big2_scanHexCharRef
509
510
/* ptr points to character following "&#" */
511
512
static int PTRCALL
513
PREFIX(scanCharRef)(const ENCODING *enc, const char *ptr, const char *end,
514
38.4k
                    const char **nextTokPtr) {
515
38.4k
  if (HAS_CHAR(enc, ptr, end)) {
516
38.4k
    if (CHAR_MATCHES(enc, ptr, ASCII_x))
517
27.1k
      return PREFIX(scanHexCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
518
11.3k
    switch (BYTE_TYPE(enc, ptr)) {
519
11.3k
    case BT_DIGIT:
520
11.3k
      break;
521
14
    default:
522
14
      *nextTokPtr = ptr;
523
14
      return XML_TOK_INVALID;
524
11.3k
    }
525
45.8k
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
526
45.8k
      switch (BYTE_TYPE(enc, ptr)) {
527
34.5k
      case BT_DIGIT:
528
34.5k
        break;
529
11.2k
      case BT_SEMI:
530
11.2k
        *nextTokPtr = ptr + MINBPC(enc);
531
11.2k
        return XML_TOK_CHAR_REF;
532
3
      default:
533
3
        *nextTokPtr = ptr;
534
3
        return XML_TOK_INVALID;
535
45.8k
      }
536
45.8k
    }
537
11.3k
  }
538
20
  return XML_TOK_PARTIAL;
539
38.4k
}
xmltok.c:normal_scanCharRef
Line
Count
Source
514
38.4k
                    const char **nextTokPtr) {
515
38.4k
  if (HAS_CHAR(enc, ptr, end)) {
516
38.4k
    if (CHAR_MATCHES(enc, ptr, ASCII_x))
517
27.1k
      return PREFIX(scanHexCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
518
11.3k
    switch (BYTE_TYPE(enc, ptr)) {
519
11.3k
    case BT_DIGIT:
520
11.3k
      break;
521
14
    default:
522
14
      *nextTokPtr = ptr;
523
14
      return XML_TOK_INVALID;
524
11.3k
    }
525
45.8k
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
526
45.8k
      switch (BYTE_TYPE(enc, ptr)) {
527
34.5k
      case BT_DIGIT:
528
34.5k
        break;
529
11.2k
      case BT_SEMI:
530
11.2k
        *nextTokPtr = ptr + MINBPC(enc);
531
11.2k
        return XML_TOK_CHAR_REF;
532
3
      default:
533
3
        *nextTokPtr = ptr;
534
3
        return XML_TOK_INVALID;
535
45.8k
      }
536
45.8k
    }
537
11.3k
  }
538
20
  return XML_TOK_PARTIAL;
539
38.4k
}
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
154k
                const char **nextTokPtr) {
546
154k
  REQUIRE_CHAR(enc, ptr, end);
547
154k
  switch (BYTE_TYPE(enc, ptr)) {
548
69.3k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
549
38.4k
  case BT_NUM:
550
38.4k
    return PREFIX(scanCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
551
5
  default:
552
5
    *nextTokPtr = ptr;
553
5
    return XML_TOK_INVALID;
554
154k
  }
555
368k
  while (HAS_CHAR(enc, ptr, end)) {
556
368k
    switch (BYTE_TYPE(enc, ptr)) {
557
862k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
558
115k
    case BT_SEMI:
559
115k
      *nextTokPtr = ptr + MINBPC(enc);
560
115k
      return XML_TOK_ENTITY_REF;
561
13
    default:
562
13
      *nextTokPtr = ptr;
563
13
      return XML_TOK_INVALID;
564
368k
    }
565
368k
  }
566
90
  return XML_TOK_PARTIAL;
567
115k
}
xmltok.c:normal_scanRef
Line
Count
Source
545
154k
                const char **nextTokPtr) {
546
154k
  REQUIRE_CHAR(enc, ptr, end);
547
154k
  switch (BYTE_TYPE(enc, ptr)) {
548
69.3k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
549
38.4k
  case BT_NUM:
550
38.4k
    return PREFIX(scanCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
551
5
  default:
552
5
    *nextTokPtr = ptr;
553
5
    return XML_TOK_INVALID;
554
154k
  }
555
368k
  while (HAS_CHAR(enc, ptr, end)) {
556
368k
    switch (BYTE_TYPE(enc, ptr)) {
557
862k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
558
115k
    case BT_SEMI:
559
115k
      *nextTokPtr = ptr + MINBPC(enc);
560
115k
      return XML_TOK_ENTITY_REF;
561
13
    default:
562
13
      *nextTokPtr = ptr;
563
13
      return XML_TOK_INVALID;
564
368k
    }
565
368k
  }
566
90
  return XML_TOK_PARTIAL;
567
115k
}
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
73.6k
                 const char **nextTokPtr) {
574
#  ifdef XML_NS
575
  int hadColon = 0;
576
#  endif
577
3.60M
  while (HAS_CHAR(enc, ptr, end)) {
578
3.60M
    switch (BYTE_TYPE(enc, ptr)) {
579
2.52M
      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
3.20k
    case BT_S:
598
16.1k
    case BT_CR:
599
20.4k
    case BT_LF:
600
40.3k
      for (;;) {
601
40.3k
        int t;
602
603
40.3k
        ptr += MINBPC(enc);
604
40.3k
        REQUIRE_CHAR(enc, ptr, end);
605
40.2k
        t = BYTE_TYPE(enc, ptr);
606
40.2k
        if (t == BT_EQUALS)
607
20.3k
          break;
608
19.9k
        switch (t) {
609
3.98k
        case BT_S:
610
7.25k
        case BT_LF:
611
19.9k
        case BT_CR:
612
19.9k
          break;
613
9
        default:
614
9
          *nextTokPtr = ptr;
615
9
          return XML_TOK_INVALID;
616
19.9k
        }
617
19.9k
      }
618
      /* fall through */
619
2.88M
    case BT_EQUALS: {
620
2.88M
      int open;
621
#  ifdef XML_NS
622
      hadColon = 0;
623
#  endif
624
2.94M
      for (;;) {
625
2.94M
        ptr += MINBPC(enc);
626
2.94M
        REQUIRE_CHAR(enc, ptr, end);
627
2.94M
        open = BYTE_TYPE(enc, ptr);
628
2.94M
        if (open == BT_QUOT || open == BT_APOS)
629
2.88M
          break;
630
62.3k
        switch (open) {
631
10.4k
        case BT_S:
632
26.4k
        case BT_LF:
633
62.3k
        case BT_CR:
634
62.3k
          break;
635
15
        default:
636
15
          *nextTokPtr = ptr;
637
15
          return XML_TOK_INVALID;
638
62.3k
        }
639
62.3k
      }
640
2.88M
      ptr += MINBPC(enc);
641
      /* in attribute value */
642
23.3M
      for (;;) {
643
23.3M
        int t;
644
23.3M
        REQUIRE_CHAR(enc, ptr, end);
645
23.3M
        t = BYTE_TYPE(enc, ptr);
646
23.3M
        if (t == open)
647
2.88M
          break;
648
20.4M
        switch (t) {
649
174k
          INVALID_CASES(ptr, nextTokPtr)
650
27.1k
        case BT_AMP: {
651
27.1k
          int tok = PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, &ptr);
652
27.1k
          if (tok <= 0) {
653
58
            if (tok == XML_TOK_INVALID)
654
26
              *nextTokPtr = ptr;
655
58
            return tok;
656
58
          }
657
27.0k
          break;
658
27.1k
        }
659
27.0k
        case BT_LT:
660
4
          *nextTokPtr = ptr;
661
4
          return XML_TOK_INVALID;
662
20.3M
        default:
663
20.3M
          ptr += MINBPC(enc);
664
20.3M
          break;
665
20.4M
        }
666
20.4M
      }
667
2.88M
      ptr += MINBPC(enc);
668
2.88M
      REQUIRE_CHAR(enc, ptr, end);
669
2.88M
      switch (BYTE_TYPE(enc, ptr)) {
670
1.49M
      case BT_S:
671
2.79M
      case BT_CR:
672
2.84M
      case BT_LF:
673
2.84M
        break;
674
26.6k
      case BT_SOL:
675
26.6k
        goto sol;
676
12.3k
      case BT_GT:
677
12.3k
        goto gt;
678
7
      default:
679
7
        *nextTokPtr = ptr;
680
7
        return XML_TOK_INVALID;
681
2.88M
      }
682
      /* ptr points to closing quote */
683
3.10M
      for (;;) {
684
3.10M
        ptr += MINBPC(enc);
685
3.10M
        REQUIRE_CHAR(enc, ptr, end);
686
3.10M
        switch (BYTE_TYPE(enc, ptr)) {
687
2.81M
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
688
183k
        case BT_S:
689
231k
        case BT_CR:
690
266k
        case BT_LF:
691
266k
          continue;
692
539
        case BT_GT:
693
12.8k
        gt:
694
12.8k
          *nextTokPtr = ptr + MINBPC(enc);
695
12.8k
          return XML_TOK_START_TAG_WITH_ATTS;
696
33.4k
        case BT_SOL:
697
60.0k
        sol:
698
60.0k
          ptr += MINBPC(enc);
699
60.0k
          REQUIRE_CHAR(enc, ptr, end);
700
60.0k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
701
7
            *nextTokPtr = ptr;
702
7
            return XML_TOK_INVALID;
703
7
          }
704
60.0k
          *nextTokPtr = ptr + MINBPC(enc);
705
60.0k
          return XML_TOK_EMPTY_ELEMENT_WITH_ATTS;
706
6
        default:
707
6
          *nextTokPtr = ptr;
708
6
          return XML_TOK_INVALID;
709
3.10M
        }
710
2.80M
        break;
711
3.10M
      }
712
2.80M
      break;
713
2.84M
    }
714
2.80M
    default:
715
19
      *nextTokPtr = ptr;
716
19
      return XML_TOK_INVALID;
717
3.60M
    }
718
3.60M
  }
719
106
  return XML_TOK_PARTIAL;
720
73.6k
}
xmltok.c:normal_scanAtts
Line
Count
Source
573
73.6k
                 const char **nextTokPtr) {
574
#  ifdef XML_NS
575
  int hadColon = 0;
576
#  endif
577
3.60M
  while (HAS_CHAR(enc, ptr, end)) {
578
3.60M
    switch (BYTE_TYPE(enc, ptr)) {
579
2.52M
      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
3.20k
    case BT_S:
598
16.1k
    case BT_CR:
599
20.4k
    case BT_LF:
600
40.3k
      for (;;) {
601
40.3k
        int t;
602
603
40.3k
        ptr += MINBPC(enc);
604
40.3k
        REQUIRE_CHAR(enc, ptr, end);
605
40.2k
        t = BYTE_TYPE(enc, ptr);
606
40.2k
        if (t == BT_EQUALS)
607
20.3k
          break;
608
19.9k
        switch (t) {
609
3.98k
        case BT_S:
610
7.25k
        case BT_LF:
611
19.9k
        case BT_CR:
612
19.9k
          break;
613
9
        default:
614
9
          *nextTokPtr = ptr;
615
9
          return XML_TOK_INVALID;
616
19.9k
        }
617
19.9k
      }
618
      /* fall through */
619
2.88M
    case BT_EQUALS: {
620
2.88M
      int open;
621
#  ifdef XML_NS
622
      hadColon = 0;
623
#  endif
624
2.94M
      for (;;) {
625
2.94M
        ptr += MINBPC(enc);
626
2.94M
        REQUIRE_CHAR(enc, ptr, end);
627
2.94M
        open = BYTE_TYPE(enc, ptr);
628
2.94M
        if (open == BT_QUOT || open == BT_APOS)
629
2.88M
          break;
630
62.3k
        switch (open) {
631
10.4k
        case BT_S:
632
26.4k
        case BT_LF:
633
62.3k
        case BT_CR:
634
62.3k
          break;
635
15
        default:
636
15
          *nextTokPtr = ptr;
637
15
          return XML_TOK_INVALID;
638
62.3k
        }
639
62.3k
      }
640
2.88M
      ptr += MINBPC(enc);
641
      /* in attribute value */
642
23.3M
      for (;;) {
643
23.3M
        int t;
644
23.3M
        REQUIRE_CHAR(enc, ptr, end);
645
23.3M
        t = BYTE_TYPE(enc, ptr);
646
23.3M
        if (t == open)
647
2.88M
          break;
648
20.4M
        switch (t) {
649
174k
          INVALID_CASES(ptr, nextTokPtr)
650
27.1k
        case BT_AMP: {
651
27.1k
          int tok = PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, &ptr);
652
27.1k
          if (tok <= 0) {
653
58
            if (tok == XML_TOK_INVALID)
654
26
              *nextTokPtr = ptr;
655
58
            return tok;
656
58
          }
657
27.0k
          break;
658
27.1k
        }
659
27.0k
        case BT_LT:
660
4
          *nextTokPtr = ptr;
661
4
          return XML_TOK_INVALID;
662
20.3M
        default:
663
20.3M
          ptr += MINBPC(enc);
664
20.3M
          break;
665
20.4M
        }
666
20.4M
      }
667
2.88M
      ptr += MINBPC(enc);
668
2.88M
      REQUIRE_CHAR(enc, ptr, end);
669
2.88M
      switch (BYTE_TYPE(enc, ptr)) {
670
1.49M
      case BT_S:
671
2.79M
      case BT_CR:
672
2.84M
      case BT_LF:
673
2.84M
        break;
674
26.6k
      case BT_SOL:
675
26.6k
        goto sol;
676
12.3k
      case BT_GT:
677
12.3k
        goto gt;
678
7
      default:
679
7
        *nextTokPtr = ptr;
680
7
        return XML_TOK_INVALID;
681
2.88M
      }
682
      /* ptr points to closing quote */
683
3.10M
      for (;;) {
684
3.10M
        ptr += MINBPC(enc);
685
3.10M
        REQUIRE_CHAR(enc, ptr, end);
686
3.10M
        switch (BYTE_TYPE(enc, ptr)) {
687
2.81M
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
688
183k
        case BT_S:
689
231k
        case BT_CR:
690
266k
        case BT_LF:
691
266k
          continue;
692
539
        case BT_GT:
693
12.8k
        gt:
694
12.8k
          *nextTokPtr = ptr + MINBPC(enc);
695
12.8k
          return XML_TOK_START_TAG_WITH_ATTS;
696
33.4k
        case BT_SOL:
697
60.0k
        sol:
698
60.0k
          ptr += MINBPC(enc);
699
60.0k
          REQUIRE_CHAR(enc, ptr, end);
700
60.0k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
701
7
            *nextTokPtr = ptr;
702
7
            return XML_TOK_INVALID;
703
7
          }
704
60.0k
          *nextTokPtr = ptr + MINBPC(enc);
705
60.0k
          return XML_TOK_EMPTY_ELEMENT_WITH_ATTS;
706
6
        default:
707
6
          *nextTokPtr = ptr;
708
6
          return XML_TOK_INVALID;
709
3.10M
        }
710
2.80M
        break;
711
3.10M
      }
712
2.80M
      break;
713
2.84M
    }
714
2.80M
    default:
715
19
      *nextTokPtr = ptr;
716
19
      return XML_TOK_INVALID;
717
3.60M
    }
718
3.60M
  }
719
106
  return XML_TOK_PARTIAL;
720
73.6k
}
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
1.28M
               const char **nextTokPtr) {
727
#  ifdef XML_NS
728
  int hadColon;
729
#  endif
730
1.28M
  REQUIRE_CHAR(enc, ptr, end);
731
1.28M
  switch (BYTE_TYPE(enc, ptr)) {
732
1.15M
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
733
18.1k
  case BT_EXCL:
734
18.1k
    ptr += MINBPC(enc);
735
18.1k
    REQUIRE_CHAR(enc, ptr, end);
736
18.1k
    switch (BYTE_TYPE(enc, ptr)) {
737
14.8k
    case BT_MINUS:
738
14.8k
      return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
739
3.29k
    case BT_LSQB:
740
3.29k
      return PREFIX(scanCdataSection)(enc, ptr + MINBPC(enc), end, nextTokPtr);
741
18.1k
    }
742
1
    *nextTokPtr = ptr;
743
1
    return XML_TOK_INVALID;
744
35.0k
  case BT_QUEST:
745
35.0k
    return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
746
54.8k
  case BT_SOL:
747
54.8k
    return PREFIX(scanEndTag)(enc, ptr + MINBPC(enc), end, nextTokPtr);
748
19
  default:
749
19
    *nextTokPtr = ptr;
750
19
    return XML_TOK_INVALID;
751
1.28M
  }
752
#  ifdef XML_NS
753
  hadColon = 0;
754
#  endif
755
  /* we have a start-tag */
756
8.38M
  while (HAS_CHAR(enc, ptr, end)) {
757
8.38M
    switch (BYTE_TYPE(enc, ptr)) {
758
27.9M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
759
#  ifdef XML_NS
760
    case BT_COLON:
761
      if (hadColon) {
762
        *nextTokPtr = ptr;
763
        return XML_TOK_INVALID;
764
      }
765
      hadColon = 1;
766
      ptr += MINBPC(enc);
767
      REQUIRE_CHAR(enc, ptr, end);
768
      switch (BYTE_TYPE(enc, ptr)) {
769
        CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
770
      default:
771
        *nextTokPtr = ptr;
772
        return XML_TOK_INVALID;
773
      }
774
      break;
775
#  endif
776
68.1k
    case BT_S:
777
78.8k
    case BT_CR:
778
83.7k
    case BT_LF: {
779
83.7k
      ptr += MINBPC(enc);
780
114k
      while (HAS_CHAR(enc, ptr, end)) {
781
114k
        switch (BYTE_TYPE(enc, ptr)) {
782
54.8k
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
783
5.29k
        case BT_GT:
784
5.29k
          goto gt;
785
4.67k
        case BT_SOL:
786
4.67k
          goto sol;
787
2.91k
        case BT_S:
788
24.4k
        case BT_CR:
789
30.7k
        case BT_LF:
790
30.7k
          ptr += MINBPC(enc);
791
30.7k
          continue;
792
2
        default:
793
2
          *nextTokPtr = ptr;
794
2
          return XML_TOK_INVALID;
795
114k
        }
796
73.6k
        return PREFIX(scanAtts)(enc, ptr, end, nextTokPtr);
797
114k
      }
798
60
      return XML_TOK_PARTIAL;
799
83.7k
    }
800
1.06M
    case BT_GT:
801
1.06M
    gt:
802
1.06M
      *nextTokPtr = ptr + MINBPC(enc);
803
1.06M
      return XML_TOK_START_TAG_NO_ATTS;
804
28.3k
    case BT_SOL:
805
33.0k
    sol:
806
33.0k
      ptr += MINBPC(enc);
807
33.0k
      REQUIRE_CHAR(enc, ptr, end);
808
33.0k
      if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
809
10
        *nextTokPtr = ptr;
810
10
        return XML_TOK_INVALID;
811
10
      }
812
33.0k
      *nextTokPtr = ptr + MINBPC(enc);
813
33.0k
      return XML_TOK_EMPTY_ELEMENT_NO_ATTS;
814
23
    default:
815
23
      *nextTokPtr = ptr;
816
23
      return XML_TOK_INVALID;
817
8.38M
    }
818
8.38M
  }
819
200
  return XML_TOK_PARTIAL;
820
1.17M
}
xmltok.c:normal_scanLt
Line
Count
Source
726
1.28M
               const char **nextTokPtr) {
727
#  ifdef XML_NS
728
  int hadColon;
729
#  endif
730
1.28M
  REQUIRE_CHAR(enc, ptr, end);
731
1.28M
  switch (BYTE_TYPE(enc, ptr)) {
732
1.15M
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
733
18.1k
  case BT_EXCL:
734
18.1k
    ptr += MINBPC(enc);
735
18.1k
    REQUIRE_CHAR(enc, ptr, end);
736
18.1k
    switch (BYTE_TYPE(enc, ptr)) {
737
14.8k
    case BT_MINUS:
738
14.8k
      return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
739
3.29k
    case BT_LSQB:
740
3.29k
      return PREFIX(scanCdataSection)(enc, ptr + MINBPC(enc), end, nextTokPtr);
741
18.1k
    }
742
1
    *nextTokPtr = ptr;
743
1
    return XML_TOK_INVALID;
744
35.0k
  case BT_QUEST:
745
35.0k
    return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
746
54.8k
  case BT_SOL:
747
54.8k
    return PREFIX(scanEndTag)(enc, ptr + MINBPC(enc), end, nextTokPtr);
748
19
  default:
749
19
    *nextTokPtr = ptr;
750
19
    return XML_TOK_INVALID;
751
1.28M
  }
752
#  ifdef XML_NS
753
  hadColon = 0;
754
#  endif
755
  /* we have a start-tag */
756
8.38M
  while (HAS_CHAR(enc, ptr, end)) {
757
8.38M
    switch (BYTE_TYPE(enc, ptr)) {
758
27.9M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
759
#  ifdef XML_NS
760
    case BT_COLON:
761
      if (hadColon) {
762
        *nextTokPtr = ptr;
763
        return XML_TOK_INVALID;
764
      }
765
      hadColon = 1;
766
      ptr += MINBPC(enc);
767
      REQUIRE_CHAR(enc, ptr, end);
768
      switch (BYTE_TYPE(enc, ptr)) {
769
        CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
770
      default:
771
        *nextTokPtr = ptr;
772
        return XML_TOK_INVALID;
773
      }
774
      break;
775
#  endif
776
68.1k
    case BT_S:
777
78.8k
    case BT_CR:
778
83.7k
    case BT_LF: {
779
83.7k
      ptr += MINBPC(enc);
780
114k
      while (HAS_CHAR(enc, ptr, end)) {
781
114k
        switch (BYTE_TYPE(enc, ptr)) {
782
54.8k
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
783
5.29k
        case BT_GT:
784
5.29k
          goto gt;
785
4.67k
        case BT_SOL:
786
4.67k
          goto sol;
787
2.91k
        case BT_S:
788
24.4k
        case BT_CR:
789
30.7k
        case BT_LF:
790
30.7k
          ptr += MINBPC(enc);
791
30.7k
          continue;
792
2
        default:
793
2
          *nextTokPtr = ptr;
794
2
          return XML_TOK_INVALID;
795
114k
        }
796
73.6k
        return PREFIX(scanAtts)(enc, ptr, end, nextTokPtr);
797
114k
      }
798
60
      return XML_TOK_PARTIAL;
799
83.7k
    }
800
1.06M
    case BT_GT:
801
1.06M
    gt:
802
1.06M
      *nextTokPtr = ptr + MINBPC(enc);
803
1.06M
      return XML_TOK_START_TAG_NO_ATTS;
804
28.3k
    case BT_SOL:
805
33.0k
    sol:
806
33.0k
      ptr += MINBPC(enc);
807
33.0k
      REQUIRE_CHAR(enc, ptr, end);
808
33.0k
      if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
809
10
        *nextTokPtr = ptr;
810
10
        return XML_TOK_INVALID;
811
10
      }
812
33.0k
      *nextTokPtr = ptr + MINBPC(enc);
813
33.0k
      return XML_TOK_EMPTY_ELEMENT_NO_ATTS;
814
23
    default:
815
23
      *nextTokPtr = ptr;
816
23
      return XML_TOK_INVALID;
817
8.38M
    }
818
8.38M
  }
819
200
  return XML_TOK_PARTIAL;
820
1.17M
}
Unexecuted instantiation: xmltok.c:little2_scanLt
Unexecuted instantiation: xmltok.c:big2_scanLt
821
822
static int PTRCALL
823
PREFIX(contentTok)(const ENCODING *enc, const char *ptr, const char *end,
824
4.55M
                   const char **nextTokPtr) {
825
4.55M
  if (ptr >= end)
826
6.79k
    return XML_TOK_NONE;
827
4.54M
  if (MINBPC(enc) > 1) {
828
0
    size_t n = end - ptr;
829
0
    if (n & (MINBPC(enc) - 1)) {
830
0
      n &= ~(MINBPC(enc) - 1);
831
0
      if (n == 0)
832
0
        return XML_TOK_PARTIAL;
833
0
      end = ptr + n;
834
0
    }
835
0
  }
836
4.54M
  switch (BYTE_TYPE(enc, ptr)) {
837
1.28M
  case BT_LT:
838
1.28M
    return PREFIX(scanLt)(enc, ptr + MINBPC(enc), end, nextTokPtr);
839
53.8k
  case BT_AMP:
840
53.8k
    return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
841
1.39M
  case BT_CR:
842
1.39M
    ptr += MINBPC(enc);
843
1.39M
    if (! HAS_CHAR(enc, ptr, end))
844
18
      return XML_TOK_TRAILING_CR;
845
1.39M
    if (BYTE_TYPE(enc, ptr) == BT_LF)
846
223k
      ptr += MINBPC(enc);
847
1.39M
    *nextTokPtr = ptr;
848
1.39M
    return XML_TOK_DATA_NEWLINE;
849
821k
  case BT_LF:
850
821k
    *nextTokPtr = ptr + MINBPC(enc);
851
821k
    return XML_TOK_DATA_NEWLINE;
852
230k
  case BT_RSQB:
853
230k
    ptr += MINBPC(enc);
854
230k
    if (! HAS_CHAR(enc, ptr, end))
855
16
      return XML_TOK_TRAILING_RSQB;
856
230k
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
857
34.9k
      break;
858
195k
    ptr += MINBPC(enc);
859
195k
    if (! HAS_CHAR(enc, ptr, end))
860
10
      return XML_TOK_TRAILING_RSQB;
861
195k
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
862
195k
      ptr -= MINBPC(enc);
863
195k
      break;
864
195k
    }
865
1
    *nextTokPtr = ptr;
866
1
    return XML_TOK_INVALID;
867
96.6k
    INVALID_CASES(ptr, nextTokPtr)
868
718k
  default:
869
718k
    ptr += MINBPC(enc);
870
718k
    break;
871
4.54M
  }
872
15.4M
  while (HAS_CHAR(enc, ptr, end)) {
873
15.4M
    switch (BYTE_TYPE(enc, ptr)) {
874
0
#  define LEAD_CASE(n)                                                         \
875
124k
  case BT_LEAD##n:                                                             \
876
124k
    if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) {                       \
877
37
      *nextTokPtr = ptr;                                                       \
878
37
      return XML_TOK_DATA_CHARS;                                               \
879
37
    }                                                                          \
880
124k
    ptr += n;                                                                  \
881
124k
    break;
882
67.1k
      LEAD_CASE(2)
883
27.8k
      LEAD_CASE(3)
884
29.2k
      LEAD_CASE(4)
885
0
#  undef LEAD_CASE
886
637k
    case BT_RSQB:
887
637k
      if (HAS_CHARS(enc, ptr, end, 2)) {
888
637k
        if (! CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_RSQB)) {
889
313k
          ptr += MINBPC(enc);
890
313k
          break;
891
313k
        }
892
323k
        if (HAS_CHARS(enc, ptr, end, 3)) {
893
323k
          if (! CHAR_MATCHES(enc, ptr + 2 * MINBPC(enc), ASCII_GT)) {
894
323k
            ptr += MINBPC(enc);
895
323k
            break;
896
323k
          }
897
1
          *nextTokPtr = ptr + 2 * MINBPC(enc);
898
1
          return XML_TOK_INVALID;
899
323k
        }
900
323k
      }
901
      /* fall through */
902
28.0k
    case BT_AMP:
903
206k
    case BT_LT:
904
206k
    case BT_NONXML:
905
206k
    case BT_MALFORM:
906
206k
    case BT_TRAIL:
907
764k
    case BT_CR:
908
992k
    case BT_LF:
909
992k
      *nextTokPtr = ptr;
910
992k
      return XML_TOK_DATA_CHARS;
911
13.7M
    default:
912
13.7M
      ptr += MINBPC(enc);
913
13.7M
      break;
914
15.4M
    }
915
15.4M
  }
916
4.95k
  *nextTokPtr = ptr;
917
4.95k
  return XML_TOK_DATA_CHARS;
918
997k
}
xmltok.c:normal_contentTok
Line
Count
Source
824
4.55M
                   const char **nextTokPtr) {
825
4.55M
  if (ptr >= end)
826
6.79k
    return XML_TOK_NONE;
827
4.54M
  if (MINBPC(enc) > 1) {
828
0
    size_t n = end - ptr;
829
0
    if (n & (MINBPC(enc) - 1)) {
830
0
      n &= ~(MINBPC(enc) - 1);
831
0
      if (n == 0)
832
0
        return XML_TOK_PARTIAL;
833
0
      end = ptr + n;
834
0
    }
835
0
  }
836
4.54M
  switch (BYTE_TYPE(enc, ptr)) {
837
1.28M
  case BT_LT:
838
1.28M
    return PREFIX(scanLt)(enc, ptr + MINBPC(enc), end, nextTokPtr);
839
53.8k
  case BT_AMP:
840
53.8k
    return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
841
1.39M
  case BT_CR:
842
1.39M
    ptr += MINBPC(enc);
843
1.39M
    if (! HAS_CHAR(enc, ptr, end))
844
18
      return XML_TOK_TRAILING_CR;
845
1.39M
    if (BYTE_TYPE(enc, ptr) == BT_LF)
846
223k
      ptr += MINBPC(enc);
847
1.39M
    *nextTokPtr = ptr;
848
1.39M
    return XML_TOK_DATA_NEWLINE;
849
821k
  case BT_LF:
850
821k
    *nextTokPtr = ptr + MINBPC(enc);
851
821k
    return XML_TOK_DATA_NEWLINE;
852
230k
  case BT_RSQB:
853
230k
    ptr += MINBPC(enc);
854
230k
    if (! HAS_CHAR(enc, ptr, end))
855
16
      return XML_TOK_TRAILING_RSQB;
856
230k
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
857
34.9k
      break;
858
195k
    ptr += MINBPC(enc);
859
195k
    if (! HAS_CHAR(enc, ptr, end))
860
10
      return XML_TOK_TRAILING_RSQB;
861
195k
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
862
195k
      ptr -= MINBPC(enc);
863
195k
      break;
864
195k
    }
865
1
    *nextTokPtr = ptr;
866
1
    return XML_TOK_INVALID;
867
96.6k
    INVALID_CASES(ptr, nextTokPtr)
868
718k
  default:
869
718k
    ptr += MINBPC(enc);
870
718k
    break;
871
4.54M
  }
872
15.4M
  while (HAS_CHAR(enc, ptr, end)) {
873
15.4M
    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
67.1k
      LEAD_CASE(2)
883
27.8k
      LEAD_CASE(3)
884
29.2k
      LEAD_CASE(4)
885
0
#  undef LEAD_CASE
886
637k
    case BT_RSQB:
887
637k
      if (HAS_CHARS(enc, ptr, end, 2)) {
888
637k
        if (! CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_RSQB)) {
889
313k
          ptr += MINBPC(enc);
890
313k
          break;
891
313k
        }
892
323k
        if (HAS_CHARS(enc, ptr, end, 3)) {
893
323k
          if (! CHAR_MATCHES(enc, ptr + 2 * MINBPC(enc), ASCII_GT)) {
894
323k
            ptr += MINBPC(enc);
895
323k
            break;
896
323k
          }
897
1
          *nextTokPtr = ptr + 2 * MINBPC(enc);
898
1
          return XML_TOK_INVALID;
899
323k
        }
900
323k
      }
901
      /* fall through */
902
28.0k
    case BT_AMP:
903
206k
    case BT_LT:
904
206k
    case BT_NONXML:
905
206k
    case BT_MALFORM:
906
206k
    case BT_TRAIL:
907
764k
    case BT_CR:
908
992k
    case BT_LF:
909
992k
      *nextTokPtr = ptr;
910
992k
      return XML_TOK_DATA_CHARS;
911
13.7M
    default:
912
13.7M
      ptr += MINBPC(enc);
913
13.7M
      break;
914
15.4M
    }
915
15.4M
  }
916
4.95k
  *nextTokPtr = ptr;
917
4.95k
  return XML_TOK_DATA_CHARS;
918
997k
}
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
6.18k
                    const char **nextTokPtr) {
925
6.18k
  REQUIRE_CHAR(enc, ptr, end);
926
6.15k
  switch (BYTE_TYPE(enc, ptr)) {
927
5.38k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
928
788
  case BT_S:
929
1.27k
  case BT_LF:
930
1.77k
  case BT_CR:
931
1.77k
  case BT_PERCNT:
932
1.77k
    *nextTokPtr = ptr;
933
1.77k
    return XML_TOK_PERCENT;
934
2
  default:
935
2
    *nextTokPtr = ptr;
936
2
    return XML_TOK_INVALID;
937
6.15k
  }
938
31.1k
  while (HAS_CHAR(enc, ptr, end)) {
939
31.1k
    switch (BYTE_TYPE(enc, ptr)) {
940
78.4k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
941
4.15k
    case BT_SEMI:
942
4.15k
      *nextTokPtr = ptr + MINBPC(enc);
943
4.15k
      return XML_TOK_PARAM_ENTITY_REF;
944
23
    default:
945
23
      *nextTokPtr = ptr;
946
23
      return XML_TOK_INVALID;
947
31.1k
    }
948
31.1k
  }
949
90
  return XML_TOK_PARTIAL;
950
4.33k
}
xmltok.c:normal_scanPercent
Line
Count
Source
924
6.18k
                    const char **nextTokPtr) {
925
6.18k
  REQUIRE_CHAR(enc, ptr, end);
926
6.15k
  switch (BYTE_TYPE(enc, ptr)) {
927
5.38k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
928
788
  case BT_S:
929
1.27k
  case BT_LF:
930
1.77k
  case BT_CR:
931
1.77k
  case BT_PERCNT:
932
1.77k
    *nextTokPtr = ptr;
933
1.77k
    return XML_TOK_PERCENT;
934
2
  default:
935
2
    *nextTokPtr = ptr;
936
2
    return XML_TOK_INVALID;
937
6.15k
  }
938
31.1k
  while (HAS_CHAR(enc, ptr, end)) {
939
31.1k
    switch (BYTE_TYPE(enc, ptr)) {
940
78.4k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
941
4.15k
    case BT_SEMI:
942
4.15k
      *nextTokPtr = ptr + MINBPC(enc);
943
4.15k
      return XML_TOK_PARAM_ENTITY_REF;
944
23
    default:
945
23
      *nextTokPtr = ptr;
946
23
      return XML_TOK_INVALID;
947
31.1k
    }
948
31.1k
  }
949
90
  return XML_TOK_PARTIAL;
950
4.33k
}
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
250k
                      const char **nextTokPtr) {
955
250k
  REQUIRE_CHAR(enc, ptr, end);
956
250k
  switch (BYTE_TYPE(enc, ptr)) {
957
249k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
958
5
  default:
959
5
    *nextTokPtr = ptr;
960
5
    return XML_TOK_INVALID;
961
250k
  }
962
1.84M
  while (HAS_CHAR(enc, ptr, end)) {
963
1.84M
    switch (BYTE_TYPE(enc, ptr)) {
964
5.79M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
965
15.7k
    case BT_CR:
966
21.3k
    case BT_LF:
967
244k
    case BT_S:
968
245k
    case BT_RPAR:
969
249k
    case BT_GT:
970
249k
    case BT_PERCNT:
971
249k
    case BT_VERBAR:
972
249k
      *nextTokPtr = ptr;
973
249k
      return XML_TOK_POUND_NAME;
974
18
    default:
975
18
      *nextTokPtr = ptr;
976
18
      return XML_TOK_INVALID;
977
1.84M
    }
978
1.84M
  }
979
228
  return -XML_TOK_POUND_NAME;
980
250k
}
xmltok.c:normal_scanPoundName
Line
Count
Source
954
250k
                      const char **nextTokPtr) {
955
250k
  REQUIRE_CHAR(enc, ptr, end);
956
250k
  switch (BYTE_TYPE(enc, ptr)) {
957
249k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
958
5
  default:
959
5
    *nextTokPtr = ptr;
960
5
    return XML_TOK_INVALID;
961
250k
  }
962
1.84M
  while (HAS_CHAR(enc, ptr, end)) {
963
1.84M
    switch (BYTE_TYPE(enc, ptr)) {
964
5.79M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
965
15.7k
    case BT_CR:
966
21.3k
    case BT_LF:
967
244k
    case BT_S:
968
245k
    case BT_RPAR:
969
249k
    case BT_GT:
970
249k
    case BT_PERCNT:
971
249k
    case BT_VERBAR:
972
249k
      *nextTokPtr = ptr;
973
249k
      return XML_TOK_POUND_NAME;
974
18
    default:
975
18
      *nextTokPtr = ptr;
976
18
      return XML_TOK_INVALID;
977
1.84M
    }
978
1.84M
  }
979
228
  return -XML_TOK_POUND_NAME;
980
250k
}
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
54.1k
                const char **nextTokPtr) {
985
7.57M
  while (HAS_CHAR(enc, ptr, end)) {
986
7.57M
    int t = BYTE_TYPE(enc, ptr);
987
7.57M
    switch (t) {
988
79.2k
      INVALID_CASES(ptr, nextTokPtr)
989
11.2k
    case BT_QUOT:
990
59.4k
    case BT_APOS:
991
59.4k
      ptr += MINBPC(enc);
992
59.4k
      if (t != open)
993
5.46k
        break;
994
53.9k
      if (! HAS_CHAR(enc, ptr, end))
995
567
        return -XML_TOK_LITERAL;
996
53.3k
      *nextTokPtr = ptr;
997
53.3k
      switch (BYTE_TYPE(enc, ptr)) {
998
6.82k
      case BT_S:
999
10.7k
      case BT_CR:
1000
32.2k
      case BT_LF:
1001
53.1k
      case BT_GT:
1002
53.1k
      case BT_PERCNT:
1003
53.3k
      case BT_LSQB:
1004
53.3k
        return XML_TOK_LITERAL;
1005
20
      default:
1006
20
        return XML_TOK_INVALID;
1007
53.3k
      }
1008
7.47M
    default:
1009
7.47M
      ptr += MINBPC(enc);
1010
7.47M
      break;
1011
7.57M
    }
1012
7.57M
  }
1013
106
  return XML_TOK_PARTIAL;
1014
54.1k
}
xmltok.c:normal_scanLit
Line
Count
Source
984
54.1k
                const char **nextTokPtr) {
985
7.57M
  while (HAS_CHAR(enc, ptr, end)) {
986
7.57M
    int t = BYTE_TYPE(enc, ptr);
987
7.57M
    switch (t) {
988
79.2k
      INVALID_CASES(ptr, nextTokPtr)
989
11.2k
    case BT_QUOT:
990
59.4k
    case BT_APOS:
991
59.4k
      ptr += MINBPC(enc);
992
59.4k
      if (t != open)
993
5.46k
        break;
994
53.9k
      if (! HAS_CHAR(enc, ptr, end))
995
567
        return -XML_TOK_LITERAL;
996
53.3k
      *nextTokPtr = ptr;
997
53.3k
      switch (BYTE_TYPE(enc, ptr)) {
998
6.82k
      case BT_S:
999
10.7k
      case BT_CR:
1000
32.2k
      case BT_LF:
1001
53.1k
      case BT_GT:
1002
53.1k
      case BT_PERCNT:
1003
53.3k
      case BT_LSQB:
1004
53.3k
        return XML_TOK_LITERAL;
1005
20
      default:
1006
20
        return XML_TOK_INVALID;
1007
53.3k
      }
1008
7.47M
    default:
1009
7.47M
      ptr += MINBPC(enc);
1010
7.47M
      break;
1011
7.57M
    }
1012
7.57M
  }
1013
106
  return XML_TOK_PARTIAL;
1014
54.1k
}
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
5.99M
                  const char **nextTokPtr) {
1019
5.99M
  int tok;
1020
5.99M
  if (ptr >= end)
1021
7.31k
    return XML_TOK_NONE;
1022
5.98M
  if (MINBPC(enc) > 1) {
1023
258
    size_t n = end - ptr;
1024
258
    if (n & (MINBPC(enc) - 1)) {
1025
42
      n &= ~(MINBPC(enc) - 1);
1026
42
      if (n == 0)
1027
4
        return XML_TOK_PARTIAL;
1028
38
      end = ptr + n;
1029
38
    }
1030
258
  }
1031
5.98M
  switch (BYTE_TYPE(enc, ptr)) {
1032
6.75k
  case BT_QUOT:
1033
6.75k
    return PREFIX(scanLit)(BT_QUOT, enc, ptr + MINBPC(enc), end, nextTokPtr);
1034
47.3k
  case BT_APOS:
1035
47.3k
    return PREFIX(scanLit)(BT_APOS, enc, ptr + MINBPC(enc), end, nextTokPtr);
1036
70.9k
  case BT_LT: {
1037
70.9k
    ptr += MINBPC(enc);
1038
70.9k
    REQUIRE_CHAR(enc, ptr, end);
1039
70.9k
    switch (BYTE_TYPE(enc, ptr)) {
1040
56.7k
    case BT_EXCL:
1041
56.7k
      return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1042
8.46k
    case BT_QUEST:
1043
8.46k
      return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1044
4.31k
    case BT_NMSTRT:
1045
5.55k
    case BT_HEX:
1046
5.55k
    case BT_NONASCII:
1047
5.60k
    case BT_LEAD2:
1048
5.64k
    case BT_LEAD3:
1049
5.65k
    case BT_LEAD4:
1050
5.65k
      *nextTokPtr = ptr - MINBPC(enc);
1051
5.65k
      return XML_TOK_INSTANCE_START;
1052
70.9k
    }
1053
17
    *nextTokPtr = ptr;
1054
17
    return XML_TOK_INVALID;
1055
70.9k
  }
1056
354k
  case BT_CR:
1057
354k
    if (ptr + MINBPC(enc) == end) {
1058
445
      *nextTokPtr = end;
1059
      /* indicate that this might be part of a CR/LF pair */
1060
445
      return -XML_TOK_PROLOG_S;
1061
445
    }
1062
    /* fall through */
1063
918k
  case BT_S:
1064
999k
  case BT_LF:
1065
1.03M
    for (;;) {
1066
1.03M
      ptr += MINBPC(enc);
1067
1.03M
      if (! HAS_CHAR(enc, ptr, end))
1068
250
        break;
1069
1.03M
      switch (BYTE_TYPE(enc, ptr)) {
1070
8.67k
      case BT_S:
1071
30.0k
      case BT_LF:
1072
30.0k
        break;
1073
6.63k
      case BT_CR:
1074
        /* don't split CR/LF pair */
1075
6.63k
        if (ptr + MINBPC(enc) != end)
1076
6.42k
          break;
1077
        /* fall through */
1078
999k
      default:
1079
999k
        *nextTokPtr = ptr;
1080
999k
        return XML_TOK_PROLOG_S;
1081
1.03M
      }
1082
1.03M
    }
1083
250
    *nextTokPtr = ptr;
1084
250
    return XML_TOK_PROLOG_S;
1085
6.18k
  case BT_PERCNT:
1086
6.18k
    return PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1087
9.54k
  case BT_COMMA:
1088
9.54k
    *nextTokPtr = ptr + MINBPC(enc);
1089
9.54k
    return XML_TOK_COMMA;
1090
2.69k
  case BT_LSQB:
1091
2.69k
    *nextTokPtr = ptr + MINBPC(enc);
1092
2.69k
    return XML_TOK_OPEN_BRACKET;
1093
1.17k
  case BT_RSQB:
1094
1.17k
    ptr += MINBPC(enc);
1095
1.17k
    if (! HAS_CHAR(enc, ptr, end))
1096
17
      return -XML_TOK_CLOSE_BRACKET;
1097
1.15k
    if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) {
1098
34
      REQUIRE_CHARS(enc, ptr, end, 2);
1099
32
      if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_GT)) {
1100
5
        *nextTokPtr = ptr + 2 * MINBPC(enc);
1101
5
        return XML_TOK_COND_SECT_CLOSE;
1102
5
      }
1103
32
    }
1104
1.14k
    *nextTokPtr = ptr;
1105
1.14k
    return XML_TOK_CLOSE_BRACKET;
1106
3.48M
  case BT_LPAR:
1107
3.48M
    *nextTokPtr = ptr + MINBPC(enc);
1108
3.48M
    return XML_TOK_OPEN_PAREN;
1109
336k
  case BT_RPAR:
1110
336k
    ptr += MINBPC(enc);
1111
336k
    if (! HAS_CHAR(enc, ptr, end))
1112
99
      return -XML_TOK_CLOSE_PAREN;
1113
336k
    switch (BYTE_TYPE(enc, ptr)) {
1114
19.5k
    case BT_AST:
1115
19.5k
      *nextTokPtr = ptr + MINBPC(enc);
1116
19.5k
      return XML_TOK_CLOSE_PAREN_ASTERISK;
1117
8.93k
    case BT_QUEST:
1118
8.93k
      *nextTokPtr = ptr + MINBPC(enc);
1119
8.93k
      return XML_TOK_CLOSE_PAREN_QUESTION;
1120
9.43k
    case BT_PLUS:
1121
9.43k
      *nextTokPtr = ptr + MINBPC(enc);
1122
9.43k
      return XML_TOK_CLOSE_PAREN_PLUS;
1123
12.9k
    case BT_CR:
1124
13.4k
    case BT_LF:
1125
252k
    case BT_S:
1126
254k
    case BT_GT:
1127
254k
    case BT_COMMA:
1128
263k
    case BT_VERBAR:
1129
298k
    case BT_RPAR:
1130
298k
      *nextTokPtr = ptr;
1131
298k
      return XML_TOK_CLOSE_PAREN;
1132
336k
    }
1133
10
    *nextTokPtr = ptr;
1134
10
    return XML_TOK_INVALID;
1135
31.3k
  case BT_VERBAR:
1136
31.3k
    *nextTokPtr = ptr + MINBPC(enc);
1137
31.3k
    return XML_TOK_OR;
1138
51.8k
  case BT_GT:
1139
51.8k
    *nextTokPtr = ptr + MINBPC(enc);
1140
51.8k
    return XML_TOK_DECL_CLOSE;
1141
250k
  case BT_NUM:
1142
250k
    return PREFIX(scanPoundName)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1143
0
#  define LEAD_CASE(n)                                                         \
1144
4.87k
  case BT_LEAD##n:                                                             \
1145
4.87k
    if (end - ptr < n)                                                         \
1146
77
      return XML_TOK_PARTIAL_CHAR;                                             \
1147
4.80k
    if (IS_INVALID_CHAR(enc, ptr, n)) {                                        \
1148
89
      *nextTokPtr = ptr;                                                       \
1149
89
      return XML_TOK_INVALID;                                                  \
1150
89
    }                                                                          \
1151
4.80k
    if (IS_NMSTRT_CHAR(enc, ptr, n)) {                                         \
1152
4.06k
      ptr += n;                                                                \
1153
4.06k
      tok = XML_TOK_NAME;                                                      \
1154
4.06k
      break;                                                                   \
1155
4.06k
    }                                                                          \
1156
4.71k
    if (IS_NAME_CHAR(enc, ptr, n)) {                                           \
1157
575
      ptr += n;                                                                \
1158
575
      tok = XML_TOK_NMTOKEN;                                                   \
1159
575
      break;                                                                   \
1160
575
    }                                                                          \
1161
652
    *nextTokPtr = ptr;                                                         \
1162
77
    return XML_TOK_INVALID;
1163
3.15k
    LEAD_CASE(2)
1164
11.5k
    LEAD_CASE(3)
1165
308
    LEAD_CASE(4)
1166
0
#  undef LEAD_CASE
1167
380k
  case BT_NMSTRT:
1168
673k
  case BT_HEX:
1169
673k
    tok = XML_TOK_NAME;
1170
673k
    ptr += MINBPC(enc);
1171
673k
    break;
1172
525
  case BT_DIGIT:
1173
2.73k
  case BT_NAME:
1174
3.37k
  case BT_MINUS:
1175
#  ifdef XML_NS
1176
  case BT_COLON:
1177
#  endif
1178
3.37k
    tok = XML_TOK_NMTOKEN;
1179
3.37k
    ptr += MINBPC(enc);
1180
3.37k
    break;
1181
200
  case BT_NONASCII:
1182
200
    if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {
1183
157
      ptr += MINBPC(enc);
1184
157
      tok = XML_TOK_NAME;
1185
157
      break;
1186
157
    }
1187
43
    if (IS_NAME_CHAR_MINBPC(enc, ptr)) {
1188
18
      ptr += MINBPC(enc);
1189
18
      tok = XML_TOK_NMTOKEN;
1190
18
      break;
1191
18
    }
1192
    /* fall through */
1193
86
  default:
1194
86
    *nextTokPtr = ptr;
1195
86
    return XML_TOK_INVALID;
1196
5.98M
  }
1197
12.7M
  while (HAS_CHAR(enc, ptr, end)) {
1198
12.7M
    switch (BYTE_TYPE(enc, ptr)) {
1199
32.7M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1200
21.4k
    case BT_GT:
1201
284k
    case BT_RPAR:
1202
285k
    case BT_COMMA:
1203
297k
    case BT_VERBAR:
1204
299k
    case BT_LSQB:
1205
299k
    case BT_PERCNT:
1206
368k
    case BT_S:
1207
635k
    case BT_CR:
1208
671k
    case BT_LF:
1209
671k
      *nextTokPtr = ptr;
1210
671k
      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
299
    case BT_PLUS:
1232
299
      if (tok == XML_TOK_NMTOKEN) {
1233
2
        *nextTokPtr = ptr;
1234
2
        return XML_TOK_INVALID;
1235
2
      }
1236
297
      *nextTokPtr = ptr + MINBPC(enc);
1237
297
      return XML_TOK_NAME_PLUS;
1238
8.73k
    case BT_AST:
1239
8.73k
      if (tok == XML_TOK_NMTOKEN) {
1240
2
        *nextTokPtr = ptr;
1241
2
        return XML_TOK_INVALID;
1242
2
      }
1243
8.73k
      *nextTokPtr = ptr + MINBPC(enc);
1244
8.73k
      return XML_TOK_NAME_ASTERISK;
1245
212
    case BT_QUEST:
1246
212
      if (tok == XML_TOK_NMTOKEN) {
1247
2
        *nextTokPtr = ptr;
1248
2
        return XML_TOK_INVALID;
1249
2
      }
1250
210
      *nextTokPtr = ptr + MINBPC(enc);
1251
210
      return XML_TOK_NAME_QUESTION;
1252
55
    default:
1253
55
      *nextTokPtr = ptr;
1254
55
      return XML_TOK_INVALID;
1255
12.7M
    }
1256
12.7M
  }
1257
752
  return -tok;
1258
681k
}
xmltok.c:normal_prologTok
Line
Count
Source
1018
5.99M
                  const char **nextTokPtr) {
1019
5.99M
  int tok;
1020
5.99M
  if (ptr >= end)
1021
7.30k
    return XML_TOK_NONE;
1022
5.98M
  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
5.98M
  switch (BYTE_TYPE(enc, ptr)) {
1032
6.75k
  case BT_QUOT:
1033
6.75k
    return PREFIX(scanLit)(BT_QUOT, enc, ptr + MINBPC(enc), end, nextTokPtr);
1034
47.3k
  case BT_APOS:
1035
47.3k
    return PREFIX(scanLit)(BT_APOS, enc, ptr + MINBPC(enc), end, nextTokPtr);
1036
70.9k
  case BT_LT: {
1037
70.9k
    ptr += MINBPC(enc);
1038
70.9k
    REQUIRE_CHAR(enc, ptr, end);
1039
70.9k
    switch (BYTE_TYPE(enc, ptr)) {
1040
56.7k
    case BT_EXCL:
1041
56.7k
      return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1042
8.46k
    case BT_QUEST:
1043
8.46k
      return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1044
4.31k
    case BT_NMSTRT:
1045
5.55k
    case BT_HEX:
1046
5.55k
    case BT_NONASCII:
1047
5.60k
    case BT_LEAD2:
1048
5.64k
    case BT_LEAD3:
1049
5.65k
    case BT_LEAD4:
1050
5.65k
      *nextTokPtr = ptr - MINBPC(enc);
1051
5.65k
      return XML_TOK_INSTANCE_START;
1052
70.9k
    }
1053
17
    *nextTokPtr = ptr;
1054
17
    return XML_TOK_INVALID;
1055
70.9k
  }
1056
354k
  case BT_CR:
1057
354k
    if (ptr + MINBPC(enc) == end) {
1058
445
      *nextTokPtr = end;
1059
      /* indicate that this might be part of a CR/LF pair */
1060
445
      return -XML_TOK_PROLOG_S;
1061
445
    }
1062
    /* fall through */
1063
918k
  case BT_S:
1064
999k
  case BT_LF:
1065
1.03M
    for (;;) {
1066
1.03M
      ptr += MINBPC(enc);
1067
1.03M
      if (! HAS_CHAR(enc, ptr, end))
1068
250
        break;
1069
1.03M
      switch (BYTE_TYPE(enc, ptr)) {
1070
8.67k
      case BT_S:
1071
30.0k
      case BT_LF:
1072
30.0k
        break;
1073
6.63k
      case BT_CR:
1074
        /* don't split CR/LF pair */
1075
6.63k
        if (ptr + MINBPC(enc) != end)
1076
6.42k
          break;
1077
        /* fall through */
1078
999k
      default:
1079
999k
        *nextTokPtr = ptr;
1080
999k
        return XML_TOK_PROLOG_S;
1081
1.03M
      }
1082
1.03M
    }
1083
250
    *nextTokPtr = ptr;
1084
250
    return XML_TOK_PROLOG_S;
1085
6.18k
  case BT_PERCNT:
1086
6.18k
    return PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1087
9.54k
  case BT_COMMA:
1088
9.54k
    *nextTokPtr = ptr + MINBPC(enc);
1089
9.54k
    return XML_TOK_COMMA;
1090
2.69k
  case BT_LSQB:
1091
2.69k
    *nextTokPtr = ptr + MINBPC(enc);
1092
2.69k
    return XML_TOK_OPEN_BRACKET;
1093
1.17k
  case BT_RSQB:
1094
1.17k
    ptr += MINBPC(enc);
1095
1.17k
    if (! HAS_CHAR(enc, ptr, end))
1096
17
      return -XML_TOK_CLOSE_BRACKET;
1097
1.15k
    if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) {
1098
34
      REQUIRE_CHARS(enc, ptr, end, 2);
1099
32
      if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_GT)) {
1100
5
        *nextTokPtr = ptr + 2 * MINBPC(enc);
1101
5
        return XML_TOK_COND_SECT_CLOSE;
1102
5
      }
1103
32
    }
1104
1.14k
    *nextTokPtr = ptr;
1105
1.14k
    return XML_TOK_CLOSE_BRACKET;
1106
3.48M
  case BT_LPAR:
1107
3.48M
    *nextTokPtr = ptr + MINBPC(enc);
1108
3.48M
    return XML_TOK_OPEN_PAREN;
1109
336k
  case BT_RPAR:
1110
336k
    ptr += MINBPC(enc);
1111
336k
    if (! HAS_CHAR(enc, ptr, end))
1112
99
      return -XML_TOK_CLOSE_PAREN;
1113
336k
    switch (BYTE_TYPE(enc, ptr)) {
1114
19.5k
    case BT_AST:
1115
19.5k
      *nextTokPtr = ptr + MINBPC(enc);
1116
19.5k
      return XML_TOK_CLOSE_PAREN_ASTERISK;
1117
8.93k
    case BT_QUEST:
1118
8.93k
      *nextTokPtr = ptr + MINBPC(enc);
1119
8.93k
      return XML_TOK_CLOSE_PAREN_QUESTION;
1120
9.43k
    case BT_PLUS:
1121
9.43k
      *nextTokPtr = ptr + MINBPC(enc);
1122
9.43k
      return XML_TOK_CLOSE_PAREN_PLUS;
1123
12.9k
    case BT_CR:
1124
13.4k
    case BT_LF:
1125
252k
    case BT_S:
1126
254k
    case BT_GT:
1127
254k
    case BT_COMMA:
1128
263k
    case BT_VERBAR:
1129
298k
    case BT_RPAR:
1130
298k
      *nextTokPtr = ptr;
1131
298k
      return XML_TOK_CLOSE_PAREN;
1132
336k
    }
1133
10
    *nextTokPtr = ptr;
1134
10
    return XML_TOK_INVALID;
1135
31.3k
  case BT_VERBAR:
1136
31.3k
    *nextTokPtr = ptr + MINBPC(enc);
1137
31.3k
    return XML_TOK_OR;
1138
51.8k
  case BT_GT:
1139
51.8k
    *nextTokPtr = ptr + MINBPC(enc);
1140
51.8k
    return XML_TOK_DECL_CLOSE;
1141
250k
  case BT_NUM:
1142
250k
    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
3.15k
    LEAD_CASE(2)
1164
11.5k
    LEAD_CASE(3)
1165
188
    LEAD_CASE(4)
1166
0
#  undef LEAD_CASE
1167
380k
  case BT_NMSTRT:
1168
673k
  case BT_HEX:
1169
673k
    tok = XML_TOK_NAME;
1170
673k
    ptr += MINBPC(enc);
1171
673k
    break;
1172
525
  case BT_DIGIT:
1173
2.73k
  case BT_NAME:
1174
3.37k
  case BT_MINUS:
1175
#  ifdef XML_NS
1176
  case BT_COLON:
1177
#  endif
1178
3.37k
    tok = XML_TOK_NMTOKEN;
1179
3.37k
    ptr += MINBPC(enc);
1180
3.37k
    break;
1181
0
  case BT_NONASCII:
1182
0
    if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {
1183
0
      ptr += MINBPC(enc);
1184
0
      tok = XML_TOK_NAME;
1185
0
      break;
1186
0
    }
1187
0
    if (IS_NAME_CHAR_MINBPC(enc, ptr)) {
1188
0
      ptr += MINBPC(enc);
1189
0
      tok = XML_TOK_NMTOKEN;
1190
0
      break;
1191
0
    }
1192
    /* fall through */
1193
49
  default:
1194
49
    *nextTokPtr = ptr;
1195
49
    return XML_TOK_INVALID;
1196
5.98M
  }
1197
12.7M
  while (HAS_CHAR(enc, ptr, end)) {
1198
12.7M
    switch (BYTE_TYPE(enc, ptr)) {
1199
32.7M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1200
21.4k
    case BT_GT:
1201
284k
    case BT_RPAR:
1202
285k
    case BT_COMMA:
1203
297k
    case BT_VERBAR:
1204
299k
    case BT_LSQB:
1205
299k
    case BT_PERCNT:
1206
368k
    case BT_S:
1207
635k
    case BT_CR:
1208
671k
    case BT_LF:
1209
671k
      *nextTokPtr = ptr;
1210
671k
      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
299
    case BT_PLUS:
1232
299
      if (tok == XML_TOK_NMTOKEN) {
1233
2
        *nextTokPtr = ptr;
1234
2
        return XML_TOK_INVALID;
1235
2
      }
1236
297
      *nextTokPtr = ptr + MINBPC(enc);
1237
297
      return XML_TOK_NAME_PLUS;
1238
8.73k
    case BT_AST:
1239
8.73k
      if (tok == XML_TOK_NMTOKEN) {
1240
2
        *nextTokPtr = ptr;
1241
2
        return XML_TOK_INVALID;
1242
2
      }
1243
8.73k
      *nextTokPtr = ptr + MINBPC(enc);
1244
8.73k
      return XML_TOK_NAME_ASTERISK;
1245
212
    case BT_QUEST:
1246
212
      if (tok == XML_TOK_NMTOKEN) {
1247
2
        *nextTokPtr = ptr;
1248
2
        return XML_TOK_INVALID;
1249
2
      }
1250
210
      *nextTokPtr = ptr + MINBPC(enc);
1251
210
      return XML_TOK_NAME_QUESTION;
1252
37
    default:
1253
37
      *nextTokPtr = ptr;
1254
37
      return XML_TOK_INVALID;
1255
12.7M
    }
1256
12.7M
  }
1257
714
  return -tok;
1258
681k
}
xmltok.c:little2_prologTok
Line
Count
Source
1018
130
                  const char **nextTokPtr) {
1019
130
  int tok;
1020
130
  if (ptr >= end)
1021
2
    return XML_TOK_NONE;
1022
128
  if (MINBPC(enc) > 1) {
1023
128
    size_t n = end - ptr;
1024
128
    if (n & (MINBPC(enc) - 1)) {
1025
22
      n &= ~(MINBPC(enc) - 1);
1026
22
      if (n == 0)
1027
2
        return XML_TOK_PARTIAL;
1028
20
      end = ptr + n;
1029
20
    }
1030
128
  }
1031
126
  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
68
    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
97
  case BT_NONASCII:
1182
97
    if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {
1183
73
      ptr += MINBPC(enc);
1184
73
      tok = XML_TOK_NAME;
1185
73
      break;
1186
73
    }
1187
24
    if (IS_NAME_CHAR_MINBPC(enc, ptr)) {
1188
11
      ptr += MINBPC(enc);
1189
11
      tok = XML_TOK_NMTOKEN;
1190
11
      break;
1191
11
    }
1192
    /* fall through */
1193
19
  default:
1194
19
    *nextTokPtr = ptr;
1195
19
    return XML_TOK_INVALID;
1196
126
  }
1197
758
  while (HAS_CHAR(enc, ptr, end)) {
1198
758
    switch (BYTE_TYPE(enc, ptr)) {
1199
3.53k
      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
758
    }
1256
758
  }
1257
18
  return -tok;
1258
84
}
xmltok.c:big2_prologTok
Line
Count
Source
1018
132
                  const char **nextTokPtr) {
1019
132
  int tok;
1020
132
  if (ptr >= end)
1021
2
    return XML_TOK_NONE;
1022
130
  if (MINBPC(enc) > 1) {
1023
130
    size_t n = end - ptr;
1024
130
    if (n & (MINBPC(enc) - 1)) {
1025
20
      n &= ~(MINBPC(enc) - 1);
1026
20
      if (n == 0)
1027
2
        return XML_TOK_PARTIAL;
1028
18
      end = ptr + n;
1029
18
    }
1030
130
  }
1031
128
  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
103
  case BT_NONASCII:
1182
103
    if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {
1183
84
      ptr += MINBPC(enc);
1184
84
      tok = XML_TOK_NAME;
1185
84
      break;
1186
84
    }
1187
19
    if (IS_NAME_CHAR_MINBPC(enc, ptr)) {
1188
7
      ptr += MINBPC(enc);
1189
7
      tok = XML_TOK_NMTOKEN;
1190
7
      break;
1191
7
    }
1192
    /* fall through */
1193
18
  default:
1194
18
    *nextTokPtr = ptr;
1195
18
    return XML_TOK_INVALID;
1196
128
  }
1197
14.1k
  while (HAS_CHAR(enc, ptr, end)) {
1198
14.1k
    switch (BYTE_TYPE(enc, ptr)) {
1199
70.2k
      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
14.1k
    }
1256
14.1k
  }
1257
20
  return -tok;
1258
91
}
1259
1260
static int PTRCALL
1261
PREFIX(attributeValueTok)(const ENCODING *enc, const char *ptr, const char *end,
1262
1.75M
                          const char **nextTokPtr) {
1263
1.75M
  const char *start;
1264
1.75M
  if (ptr >= end)
1265
91.0k
    return XML_TOK_NONE;
1266
1.66M
  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.66M
  start = ptr;
1275
19.5M
  while (HAS_CHAR(enc, ptr, end)) {
1276
19.5M
    switch (BYTE_TYPE(enc, ptr)) {
1277
0
#  define LEAD_CASE(n)                                                         \
1278
114k
  case BT_LEAD##n:                                                             \
1279
114k
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1280
114k
    break;
1281
41.3k
      LEAD_CASE(2)
1282
26.8k
      LEAD_CASE(3)
1283
46.4k
      LEAD_CASE(4)
1284
0
#  undef LEAD_CASE
1285
89.7k
    case BT_AMP:
1286
89.7k
      if (ptr == start)
1287
73.4k
        return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1288
16.2k
      *nextTokPtr = ptr;
1289
16.2k
      return XML_TOK_DATA_CHARS;
1290
2
    case BT_LT:
1291
      /* this is for inside entity references */
1292
2
      *nextTokPtr = ptr;
1293
2
      return XML_TOK_INVALID;
1294
521k
    case BT_LF:
1295
521k
      if (ptr == start) {
1296
461k
        *nextTokPtr = ptr + MINBPC(enc);
1297
461k
        return XML_TOK_DATA_NEWLINE;
1298
461k
      }
1299
59.0k
      *nextTokPtr = ptr;
1300
59.0k
      return XML_TOK_DATA_CHARS;
1301
734k
    case BT_CR:
1302
734k
      if (ptr == start) {
1303
626k
        ptr += MINBPC(enc);
1304
626k
        if (! HAS_CHAR(enc, ptr, end))
1305
2.27k
          return XML_TOK_TRAILING_CR;
1306
624k
        if (BYTE_TYPE(enc, ptr) == BT_LF)
1307
244k
          ptr += MINBPC(enc);
1308
624k
        *nextTokPtr = ptr;
1309
624k
        return XML_TOK_DATA_NEWLINE;
1310
626k
      }
1311
107k
      *nextTokPtr = ptr;
1312
107k
      return XML_TOK_DATA_CHARS;
1313
251k
    case BT_S:
1314
251k
      if (ptr == start) {
1315
151k
        *nextTokPtr = ptr + MINBPC(enc);
1316
151k
        return XML_TOK_ATTRIBUTE_VALUE_S;
1317
151k
      }
1318
100k
      *nextTokPtr = ptr;
1319
100k
      return XML_TOK_DATA_CHARS;
1320
17.7M
    default:
1321
17.7M
      ptr += MINBPC(enc);
1322
17.7M
      break;
1323
19.5M
    }
1324
19.5M
  }
1325
66.8k
  *nextTokPtr = ptr;
1326
66.8k
  return XML_TOK_DATA_CHARS;
1327
1.66M
}
xmltok.c:normal_attributeValueTok
Line
Count
Source
1262
1.75M
                          const char **nextTokPtr) {
1263
1.75M
  const char *start;
1264
1.75M
  if (ptr >= end)
1265
91.0k
    return XML_TOK_NONE;
1266
1.66M
  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.66M
  start = ptr;
1275
19.5M
  while (HAS_CHAR(enc, ptr, end)) {
1276
19.5M
    switch (BYTE_TYPE(enc, ptr)) {
1277
0
#  define LEAD_CASE(n)                                                         \
1278
0
  case BT_LEAD##n:                                                             \
1279
0
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1280
0
    break;
1281
41.3k
      LEAD_CASE(2)
1282
26.8k
      LEAD_CASE(3)
1283
46.4k
      LEAD_CASE(4)
1284
0
#  undef LEAD_CASE
1285
89.7k
    case BT_AMP:
1286
89.7k
      if (ptr == start)
1287
73.4k
        return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1288
16.2k
      *nextTokPtr = ptr;
1289
16.2k
      return XML_TOK_DATA_CHARS;
1290
2
    case BT_LT:
1291
      /* this is for inside entity references */
1292
2
      *nextTokPtr = ptr;
1293
2
      return XML_TOK_INVALID;
1294
521k
    case BT_LF:
1295
521k
      if (ptr == start) {
1296
461k
        *nextTokPtr = ptr + MINBPC(enc);
1297
461k
        return XML_TOK_DATA_NEWLINE;
1298
461k
      }
1299
59.0k
      *nextTokPtr = ptr;
1300
59.0k
      return XML_TOK_DATA_CHARS;
1301
734k
    case BT_CR:
1302
734k
      if (ptr == start) {
1303
626k
        ptr += MINBPC(enc);
1304
626k
        if (! HAS_CHAR(enc, ptr, end))
1305
2.27k
          return XML_TOK_TRAILING_CR;
1306
624k
        if (BYTE_TYPE(enc, ptr) == BT_LF)
1307
244k
          ptr += MINBPC(enc);
1308
624k
        *nextTokPtr = ptr;
1309
624k
        return XML_TOK_DATA_NEWLINE;
1310
626k
      }
1311
107k
      *nextTokPtr = ptr;
1312
107k
      return XML_TOK_DATA_CHARS;
1313
251k
    case BT_S:
1314
251k
      if (ptr == start) {
1315
151k
        *nextTokPtr = ptr + MINBPC(enc);
1316
151k
        return XML_TOK_ATTRIBUTE_VALUE_S;
1317
151k
      }
1318
100k
      *nextTokPtr = ptr;
1319
100k
      return XML_TOK_DATA_CHARS;
1320
17.7M
    default:
1321
17.7M
      ptr += MINBPC(enc);
1322
17.7M
      break;
1323
19.5M
    }
1324
19.5M
  }
1325
66.8k
  *nextTokPtr = ptr;
1326
66.8k
  return XML_TOK_DATA_CHARS;
1327
1.66M
}
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.81k
                   const char **badPtr) {
1451
2.81k
  ptr += MINBPC(enc);
1452
2.81k
  end -= MINBPC(enc);
1453
815k
  for (; HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
1454
815k
    switch (BYTE_TYPE(enc, ptr)) {
1455
345k
    case BT_DIGIT:
1456
531k
    case BT_HEX:
1457
532k
    case BT_MINUS:
1458
533k
    case BT_APOS:
1459
533k
    case BT_LPAR:
1460
590k
    case BT_RPAR:
1461
592k
    case BT_PLUS:
1462
593k
    case BT_COMMA:
1463
677k
    case BT_SOL:
1464
678k
    case BT_EQUALS:
1465
684k
    case BT_QUEST:
1466
687k
    case BT_CR:
1467
688k
    case BT_LF:
1468
689k
    case BT_SEMI:
1469
689k
    case BT_EXCL:
1470
691k
    case BT_AST:
1471
694k
    case BT_PERCNT:
1472
704k
    case BT_NUM:
1473
#  ifdef XML_NS
1474
    case BT_COLON:
1475
#  endif
1476
704k
      break;
1477
2.25k
    case BT_S:
1478
2.25k
      if (CHAR_MATCHES(enc, ptr, ASCII_TAB)) {
1479
1
        *badPtr = ptr;
1480
1
        return 0;
1481
1
      }
1482
2.25k
      break;
1483
4.61k
    case BT_NAME:
1484
106k
    case BT_NMSTRT:
1485
106k
      if (! (BYTE_TO_ASCII(enc, ptr) & ~0x7f))
1486
106k
        break;
1487
      /* fall through */
1488
1.91k
    default:
1489
1.91k
      switch (BYTE_TO_ASCII(enc, ptr)) {
1490
1.67k
      case 0x24: /* $ */
1491
1.90k
      case 0x40: /* @ */
1492
1.90k
        break;
1493
14
      default:
1494
14
        *badPtr = ptr;
1495
14
        return 0;
1496
1.91k
      }
1497
1.90k
      break;
1498
815k
    }
1499
815k
  }
1500
2.80k
  return 1;
1501
2.81k
}
xmltok.c:normal_isPublicId
Line
Count
Source
1450
2.81k
                   const char **badPtr) {
1451
2.81k
  ptr += MINBPC(enc);
1452
2.81k
  end -= MINBPC(enc);
1453
815k
  for (; HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
1454
815k
    switch (BYTE_TYPE(enc, ptr)) {
1455
345k
    case BT_DIGIT:
1456
531k
    case BT_HEX:
1457
532k
    case BT_MINUS:
1458
533k
    case BT_APOS:
1459
533k
    case BT_LPAR:
1460
590k
    case BT_RPAR:
1461
592k
    case BT_PLUS:
1462
593k
    case BT_COMMA:
1463
677k
    case BT_SOL:
1464
678k
    case BT_EQUALS:
1465
684k
    case BT_QUEST:
1466
687k
    case BT_CR:
1467
688k
    case BT_LF:
1468
689k
    case BT_SEMI:
1469
689k
    case BT_EXCL:
1470
691k
    case BT_AST:
1471
694k
    case BT_PERCNT:
1472
704k
    case BT_NUM:
1473
#  ifdef XML_NS
1474
    case BT_COLON:
1475
#  endif
1476
704k
      break;
1477
2.25k
    case BT_S:
1478
2.25k
      if (CHAR_MATCHES(enc, ptr, ASCII_TAB)) {
1479
1
        *badPtr = ptr;
1480
1
        return 0;
1481
1
      }
1482
2.25k
      break;
1483
4.61k
    case BT_NAME:
1484
106k
    case BT_NMSTRT:
1485
106k
      if (! (BYTE_TO_ASCII(enc, ptr) & ~0x7f))
1486
106k
        break;
1487
      /* fall through */
1488
1.91k
    default:
1489
1.91k
      switch (BYTE_TO_ASCII(enc, ptr)) {
1490
1.67k
      case 0x24: /* $ */
1491
1.90k
      case 0x40: /* @ */
1492
1.90k
        break;
1493
14
      default:
1494
14
        *badPtr = ptr;
1495
14
        return 0;
1496
1.91k
      }
1497
1.90k
      break;
1498
815k
    }
1499
815k
  }
1500
2.80k
  return 1;
1501
2.81k
}
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
1.17M
                ATTRIBUTE *atts) {
1511
1.17M
  enum { other, inName, inValue } state = inName;
1512
1.17M
  int nAtts = 0;
1513
1.17M
  int open = 0; /* defined when state == inValue;
1514
                   initialization just to shut up compilers */
1515
1516
57.9M
  for (ptr += MINBPC(enc);; ptr += MINBPC(enc)) {
1517
57.9M
    switch (BYTE_TYPE(enc, ptr)) {
1518
0
#  define START_NAME                                                           \
1519
30.2M
    if (state == other) {                                                      \
1520
5.63M
      if (nAtts < attsMax) {                                                   \
1521
2.88M
        atts[nAtts].name = ptr;                                                \
1522
2.88M
        atts[nAtts].normalized = 1;                                            \
1523
2.88M
      }                                                                        \
1524
5.63M
      state = inName;                                                          \
1525
5.63M
    }
1526
0
#  define LEAD_CASE(n)                                                         \
1527
207k
  case BT_LEAD##n: /* NOTE: The encoding has already been validated. */        \
1528
207k
    START_NAME ptr += (n - MINBPC(enc));                                       \
1529
207k
    break;
1530
106k
      LEAD_CASE(2)
1531
70.7k
      LEAD_CASE(3)
1532
29.9k
      LEAD_CASE(4)
1533
0
#  undef LEAD_CASE
1534
0
    case BT_NONASCII:
1535
28.0M
    case BT_NMSTRT:
1536
30.0M
    case BT_HEX:
1537
30.0M
      START_NAME
1538
30.0M
      break;
1539
0
#  undef START_NAME
1540
771k
    case BT_QUOT:
1541
771k
      if (state != inValue) {
1542
297k
        if (nAtts < attsMax)
1543
204k
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1544
297k
        state = inValue;
1545
297k
        open = BT_QUOT;
1546
473k
      } else if (open == BT_QUOT) {
1547
297k
        state = other;
1548
297k
        if (nAtts < attsMax)
1549
204k
          atts[nAtts].valueEnd = ptr;
1550
297k
        nAtts++;
1551
297k
      }
1552
771k
      break;
1553
10.6M
    case BT_APOS:
1554
10.6M
      if (state != inValue) {
1555
5.33M
        if (nAtts < attsMax)
1556
2.67M
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1557
5.33M
        state = inValue;
1558
5.33M
        open = BT_APOS;
1559
5.35M
      } else if (open == BT_APOS) {
1560
5.33M
        state = other;
1561
5.33M
        if (nAtts < attsMax)
1562
2.67M
          atts[nAtts].valueEnd = ptr;
1563
5.33M
        nAtts++;
1564
5.33M
      }
1565
10.6M
      break;
1566
26.9k
    case BT_AMP:
1567
26.9k
      if (nAtts < attsMax)
1568
26.1k
        atts[nAtts].normalized = 0;
1569
26.9k
      break;
1570
3.69M
    case BT_S:
1571
3.69M
      if (state == inName)
1572
74.1k
        state = other;
1573
3.62M
      else if (state == inValue && nAtts < attsMax && atts[nAtts].normalized
1574
125k
               && (ptr == atts[nAtts].valuePtr
1575
16.2k
                   || BYTE_TO_ASCII(enc, ptr) != ASCII_SPACE
1576
8.36k
                   || BYTE_TO_ASCII(enc, ptr + MINBPC(enc)) == ASCII_SPACE
1577
7.87k
                   || BYTE_TYPE(enc, ptr + MINBPC(enc)) == open))
1578
118k
        atts[nAtts].normalized = 0;
1579
3.69M
      break;
1580
3.33M
    case BT_CR:
1581
4.21M
    case BT_LF:
1582
      /* This case ensures that the first attribute name is counted
1583
         Apart from that we could just change state on the quote. */
1584
4.21M
      if (state == inName)
1585
32.0k
        state = other;
1586
4.18M
      else if (state == inValue && nAtts < attsMax)
1587
1.23M
        atts[nAtts].normalized = 0;
1588
4.21M
      break;
1589
1.09M
    case BT_GT:
1590
1.19M
    case BT_SOL:
1591
1.19M
      if (state != inValue)
1592
1.17M
        return nAtts;
1593
25.1k
      break;
1594
7.12M
    default:
1595
7.12M
      break;
1596
57.9M
    }
1597
57.9M
  }
1598
  /* not reached */
1599
1.17M
}
xmltok.c:normal_getAtts
Line
Count
Source
1510
1.17M
                ATTRIBUTE *atts) {
1511
1.17M
  enum { other, inName, inValue } state = inName;
1512
1.17M
  int nAtts = 0;
1513
1.17M
  int open = 0; /* defined when state == inValue;
1514
                   initialization just to shut up compilers */
1515
1516
57.9M
  for (ptr += MINBPC(enc);; ptr += MINBPC(enc)) {
1517
57.9M
    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
106k
      LEAD_CASE(2)
1531
70.7k
      LEAD_CASE(3)
1532
29.9k
      LEAD_CASE(4)
1533
0
#  undef LEAD_CASE
1534
0
    case BT_NONASCII:
1535
28.0M
    case BT_NMSTRT:
1536
30.0M
    case BT_HEX:
1537
30.0M
      START_NAME
1538
30.0M
      break;
1539
0
#  undef START_NAME
1540
771k
    case BT_QUOT:
1541
771k
      if (state != inValue) {
1542
297k
        if (nAtts < attsMax)
1543
204k
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1544
297k
        state = inValue;
1545
297k
        open = BT_QUOT;
1546
473k
      } else if (open == BT_QUOT) {
1547
297k
        state = other;
1548
297k
        if (nAtts < attsMax)
1549
204k
          atts[nAtts].valueEnd = ptr;
1550
297k
        nAtts++;
1551
297k
      }
1552
771k
      break;
1553
10.6M
    case BT_APOS:
1554
10.6M
      if (state != inValue) {
1555
5.33M
        if (nAtts < attsMax)
1556
2.67M
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1557
5.33M
        state = inValue;
1558
5.33M
        open = BT_APOS;
1559
5.35M
      } else if (open == BT_APOS) {
1560
5.33M
        state = other;
1561
5.33M
        if (nAtts < attsMax)
1562
2.67M
          atts[nAtts].valueEnd = ptr;
1563
5.33M
        nAtts++;
1564
5.33M
      }
1565
10.6M
      break;
1566
26.9k
    case BT_AMP:
1567
26.9k
      if (nAtts < attsMax)
1568
26.1k
        atts[nAtts].normalized = 0;
1569
26.9k
      break;
1570
3.69M
    case BT_S:
1571
3.69M
      if (state == inName)
1572
74.1k
        state = other;
1573
3.62M
      else if (state == inValue && nAtts < attsMax && atts[nAtts].normalized
1574
125k
               && (ptr == atts[nAtts].valuePtr
1575
16.2k
                   || BYTE_TO_ASCII(enc, ptr) != ASCII_SPACE
1576
8.36k
                   || BYTE_TO_ASCII(enc, ptr + MINBPC(enc)) == ASCII_SPACE
1577
7.87k
                   || BYTE_TYPE(enc, ptr + MINBPC(enc)) == open))
1578
118k
        atts[nAtts].normalized = 0;
1579
3.69M
      break;
1580
3.33M
    case BT_CR:
1581
4.21M
    case BT_LF:
1582
      /* This case ensures that the first attribute name is counted
1583
         Apart from that we could just change state on the quote. */
1584
4.21M
      if (state == inName)
1585
32.0k
        state = other;
1586
4.18M
      else if (state == inValue && nAtts < attsMax)
1587
1.23M
        atts[nAtts].normalized = 0;
1588
4.21M
      break;
1589
1.09M
    case BT_GT:
1590
1.19M
    case BT_SOL:
1591
1.19M
      if (state != inValue)
1592
1.17M
        return nAtts;
1593
25.1k
      break;
1594
7.12M
    default:
1595
7.12M
      break;
1596
57.9M
    }
1597
57.9M
  }
1598
  /* not reached */
1599
1.17M
}
Unexecuted instantiation: xmltok.c:little2_getAtts
Unexecuted instantiation: xmltok.c:big2_getAtts
1600
1601
static int PTRFASTCALL
1602
28.4k
PREFIX(charRefNumber)(const ENCODING *enc, const char *ptr) {
1603
28.4k
  int result = 0;
1604
  /* skip &# */
1605
28.4k
  UNUSED_P(enc);
1606
28.4k
  ptr += 2 * MINBPC(enc);
1607
28.4k
  if (CHAR_MATCHES(enc, ptr, ASCII_x)) {
1608
85.0k
    for (ptr += MINBPC(enc); ! CHAR_MATCHES(enc, ptr, ASCII_SEMI);
1609
66.6k
         ptr += MINBPC(enc)) {
1610
66.6k
      int c = BYTE_TO_ASCII(enc, ptr);
1611
66.6k
      switch (c) {
1612
8.96k
      case ASCII_0:
1613
13.0k
      case ASCII_1:
1614
17.0k
      case ASCII_2:
1615
19.4k
      case ASCII_3:
1616
23.4k
      case ASCII_4:
1617
27.6k
      case ASCII_5:
1618
29.0k
      case ASCII_6:
1619
33.3k
      case ASCII_7:
1620
37.5k
      case ASCII_8:
1621
38.7k
      case ASCII_9:
1622
38.7k
        result <<= 4;
1623
38.7k
        result |= (c - ASCII_0);
1624
38.7k
        break;
1625
3.14k
      case ASCII_A:
1626
3.72k
      case ASCII_B:
1627
4.27k
      case ASCII_C:
1628
6.27k
      case ASCII_D:
1629
6.79k
      case ASCII_E:
1630
17.5k
      case ASCII_F:
1631
17.5k
        result <<= 4;
1632
17.5k
        result += 10 + (c - ASCII_A);
1633
17.5k
        break;
1634
785
      case ASCII_a:
1635
2.30k
      case ASCII_b:
1636
3.19k
      case ASCII_c:
1637
6.33k
      case ASCII_d:
1638
6.67k
      case ASCII_e:
1639
10.4k
      case ASCII_f:
1640
10.4k
        result <<= 4;
1641
10.4k
        result += 10 + (c - ASCII_a);
1642
10.4k
        break;
1643
66.6k
      }
1644
66.6k
      if (result >= 0x110000)
1645
16
        return -1;
1646
66.6k
    }
1647
18.3k
  } else {
1648
52.1k
    for (; ! CHAR_MATCHES(enc, ptr, ASCII_SEMI); ptr += MINBPC(enc)) {
1649
42.1k
      int c = BYTE_TO_ASCII(enc, ptr);
1650
42.1k
      result *= 10;
1651
42.1k
      result += (c - ASCII_0);
1652
42.1k
      if (result >= 0x110000)
1653
2
        return -1;
1654
42.1k
    }
1655
10.0k
  }
1656
28.4k
  return checkCharRefNumber(result);
1657
28.4k
}
xmltok.c:normal_charRefNumber
Line
Count
Source
1602
28.4k
PREFIX(charRefNumber)(const ENCODING *enc, const char *ptr) {
1603
28.4k
  int result = 0;
1604
  /* skip &# */
1605
28.4k
  UNUSED_P(enc);
1606
28.4k
  ptr += 2 * MINBPC(enc);
1607
28.4k
  if (CHAR_MATCHES(enc, ptr, ASCII_x)) {
1608
85.0k
    for (ptr += MINBPC(enc); ! CHAR_MATCHES(enc, ptr, ASCII_SEMI);
1609
66.6k
         ptr += MINBPC(enc)) {
1610
66.6k
      int c = BYTE_TO_ASCII(enc, ptr);
1611
66.6k
      switch (c) {
1612
8.96k
      case ASCII_0:
1613
13.0k
      case ASCII_1:
1614
17.0k
      case ASCII_2:
1615
19.4k
      case ASCII_3:
1616
23.4k
      case ASCII_4:
1617
27.6k
      case ASCII_5:
1618
29.0k
      case ASCII_6:
1619
33.3k
      case ASCII_7:
1620
37.5k
      case ASCII_8:
1621
38.7k
      case ASCII_9:
1622
38.7k
        result <<= 4;
1623
38.7k
        result |= (c - ASCII_0);
1624
38.7k
        break;
1625
3.14k
      case ASCII_A:
1626
3.72k
      case ASCII_B:
1627
4.27k
      case ASCII_C:
1628
6.27k
      case ASCII_D:
1629
6.79k
      case ASCII_E:
1630
17.5k
      case ASCII_F:
1631
17.5k
        result <<= 4;
1632
17.5k
        result += 10 + (c - ASCII_A);
1633
17.5k
        break;
1634
785
      case ASCII_a:
1635
2.30k
      case ASCII_b:
1636
3.19k
      case ASCII_c:
1637
6.33k
      case ASCII_d:
1638
6.67k
      case ASCII_e:
1639
10.4k
      case ASCII_f:
1640
10.4k
        result <<= 4;
1641
10.4k
        result += 10 + (c - ASCII_a);
1642
10.4k
        break;
1643
66.6k
      }
1644
66.6k
      if (result >= 0x110000)
1645
16
        return -1;
1646
66.6k
    }
1647
18.3k
  } else {
1648
52.1k
    for (; ! CHAR_MATCHES(enc, ptr, ASCII_SEMI); ptr += MINBPC(enc)) {
1649
42.1k
      int c = BYTE_TO_ASCII(enc, ptr);
1650
42.1k
      result *= 10;
1651
42.1k
      result += (c - ASCII_0);
1652
42.1k
      if (result >= 0x110000)
1653
2
        return -1;
1654
42.1k
    }
1655
10.0k
  }
1656
28.4k
  return checkCharRefNumber(result);
1657
28.4k
}
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
106k
                             const char *end) {
1662
106k
  UNUSED_P(enc);
1663
106k
  switch ((end - ptr) / MINBPC(enc)) {
1664
11.6k
  case 2:
1665
11.6k
    if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_t)) {
1666
3.29k
      switch (BYTE_TO_ASCII(enc, ptr)) {
1667
3.09k
      case ASCII_l:
1668
3.09k
        return ASCII_LT;
1669
185
      case ASCII_g:
1670
185
        return ASCII_GT;
1671
3.29k
      }
1672
3.29k
    }
1673
8.37k
    break;
1674
28.0k
  case 3:
1675
28.0k
    if (CHAR_MATCHES(enc, ptr, ASCII_a)) {
1676
27.3k
      ptr += MINBPC(enc);
1677
27.3k
      if (CHAR_MATCHES(enc, ptr, ASCII_m)) {
1678
25.9k
        ptr += MINBPC(enc);
1679
25.9k
        if (CHAR_MATCHES(enc, ptr, ASCII_p))
1680
25.7k
          return ASCII_AMP;
1681
25.9k
      }
1682
27.3k
    }
1683
2.30k
    break;
1684
4.86k
  case 4:
1685
4.86k
    switch (BYTE_TO_ASCII(enc, ptr)) {
1686
1.21k
    case ASCII_q:
1687
1.21k
      ptr += MINBPC(enc);
1688
1.21k
      if (CHAR_MATCHES(enc, ptr, ASCII_u)) {
1689
892
        ptr += MINBPC(enc);
1690
892
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1691
674
          ptr += MINBPC(enc);
1692
674
          if (CHAR_MATCHES(enc, ptr, ASCII_t))
1693
472
            return ASCII_QUOT;
1694
674
        }
1695
892
      }
1696
740
      break;
1697
2.67k
    case ASCII_a:
1698
2.67k
      ptr += MINBPC(enc);
1699
2.67k
      if (CHAR_MATCHES(enc, ptr, ASCII_p)) {
1700
945
        ptr += MINBPC(enc);
1701
945
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1702
673
          ptr += MINBPC(enc);
1703
673
          if (CHAR_MATCHES(enc, ptr, ASCII_s))
1704
451
            return ASCII_APOS;
1705
673
        }
1706
945
      }
1707
2.22k
      break;
1708
4.86k
    }
1709
106k
  }
1710
76.6k
  return 0;
1711
106k
}
xmltok.c:normal_predefinedEntityName
Line
Count
Source
1661
106k
                             const char *end) {
1662
106k
  UNUSED_P(enc);
1663
106k
  switch ((end - ptr) / MINBPC(enc)) {
1664
11.6k
  case 2:
1665
11.6k
    if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_t)) {
1666
3.29k
      switch (BYTE_TO_ASCII(enc, ptr)) {
1667
3.09k
      case ASCII_l:
1668
3.09k
        return ASCII_LT;
1669
185
      case ASCII_g:
1670
185
        return ASCII_GT;
1671
3.29k
      }
1672
3.29k
    }
1673
8.37k
    break;
1674
28.0k
  case 3:
1675
28.0k
    if (CHAR_MATCHES(enc, ptr, ASCII_a)) {
1676
27.3k
      ptr += MINBPC(enc);
1677
27.3k
      if (CHAR_MATCHES(enc, ptr, ASCII_m)) {
1678
25.9k
        ptr += MINBPC(enc);
1679
25.9k
        if (CHAR_MATCHES(enc, ptr, ASCII_p))
1680
25.7k
          return ASCII_AMP;
1681
25.9k
      }
1682
27.3k
    }
1683
2.30k
    break;
1684
4.86k
  case 4:
1685
4.86k
    switch (BYTE_TO_ASCII(enc, ptr)) {
1686
1.21k
    case ASCII_q:
1687
1.21k
      ptr += MINBPC(enc);
1688
1.21k
      if (CHAR_MATCHES(enc, ptr, ASCII_u)) {
1689
892
        ptr += MINBPC(enc);
1690
892
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1691
674
          ptr += MINBPC(enc);
1692
674
          if (CHAR_MATCHES(enc, ptr, ASCII_t))
1693
472
            return ASCII_QUOT;
1694
674
        }
1695
892
      }
1696
740
      break;
1697
2.67k
    case ASCII_a:
1698
2.67k
      ptr += MINBPC(enc);
1699
2.67k
      if (CHAR_MATCHES(enc, ptr, ASCII_p)) {
1700
945
        ptr += MINBPC(enc);
1701
945
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1702
673
          ptr += MINBPC(enc);
1703
673
          if (CHAR_MATCHES(enc, ptr, ASCII_s))
1704
451
            return ASCII_APOS;
1705
673
        }
1706
945
      }
1707
2.22k
      break;
1708
4.86k
    }
1709
106k
  }
1710
76.6k
  return 0;
1711
106k
}
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
493k
                         const char *end1, const char *ptr2) {
1716
493k
  UNUSED_P(enc);
1717
2.85M
  for (; *ptr2; ptr1 += MINBPC(enc), ptr2++) {
1718
2.49M
    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
48
      return 0; /* LCOV_EXCL_LINE */
1725
48
    }
1726
2.49M
    if (! CHAR_MATCHES(enc, ptr1, *ptr2))
1727
134k
      return 0;
1728
2.49M
  }
1729
358k
  return ptr1 == end1;
1730
493k
}
xmltok.c:normal_nameMatchesAscii
Line
Count
Source
1715
493k
                         const char *end1, const char *ptr2) {
1716
493k
  UNUSED_P(enc);
1717
2.85M
  for (; *ptr2; ptr1 += MINBPC(enc), ptr2++) {
1718
2.49M
    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
48
      return 0; /* LCOV_EXCL_LINE */
1725
48
    }
1726
2.49M
    if (! CHAR_MATCHES(enc, ptr1, *ptr2))
1727
134k
      return 0;
1728
2.49M
  }
1729
358k
  return ptr1 == end1;
1730
493k
}
Unexecuted instantiation: xmltok.c:little2_nameMatchesAscii
Unexecuted instantiation: xmltok.c:big2_nameMatchesAscii
1731
1732
static int PTRFASTCALL
1733
1.35M
PREFIX(nameLength)(const ENCODING *enc, const char *ptr) {
1734
1.35M
  const char *start = ptr;
1735
11.4M
  for (;;) {
1736
11.4M
    switch (BYTE_TYPE(enc, ptr)) {
1737
0
#  define LEAD_CASE(n)                                                         \
1738
64.6k
  case BT_LEAD##n:                                                             \
1739
64.6k
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1740
64.6k
    break;
1741
33.0k
      LEAD_CASE(2)
1742
31.5k
      LEAD_CASE(3)
1743
0
      LEAD_CASE(4)
1744
0
#  undef LEAD_CASE
1745
0
    case BT_NONASCII:
1746
7.87M
    case BT_NMSTRT:
1747
#  ifdef XML_NS
1748
    case BT_COLON:
1749
#  endif
1750
9.87M
    case BT_HEX:
1751
9.92M
    case BT_DIGIT:
1752
9.94M
    case BT_NAME:
1753
9.99M
    case BT_MINUS:
1754
9.99M
      ptr += MINBPC(enc);
1755
9.99M
      break;
1756
1.35M
    default:
1757
1.35M
      return (int)(ptr - start);
1758
11.4M
    }
1759
11.4M
  }
1760
1.35M
}
xmltok.c:normal_nameLength
Line
Count
Source
1733
1.35M
PREFIX(nameLength)(const ENCODING *enc, const char *ptr) {
1734
1.35M
  const char *start = ptr;
1735
11.4M
  for (;;) {
1736
11.4M
    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
33.0k
      LEAD_CASE(2)
1742
31.5k
      LEAD_CASE(3)
1743
0
      LEAD_CASE(4)
1744
0
#  undef LEAD_CASE
1745
0
    case BT_NONASCII:
1746
7.87M
    case BT_NMSTRT:
1747
#  ifdef XML_NS
1748
    case BT_COLON:
1749
#  endif
1750
9.87M
    case BT_HEX:
1751
9.92M
    case BT_DIGIT:
1752
9.94M
    case BT_NAME:
1753
9.99M
    case BT_MINUS:
1754
9.99M
      ptr += MINBPC(enc);
1755
9.99M
      break;
1756
1.35M
    default:
1757
1.35M
      return (int)(ptr - start);
1758
11.4M
    }
1759
11.4M
  }
1760
1.35M
}
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
19.7k
                       POSITION *pos) {
1780
129M
  while (HAS_CHAR(enc, ptr, end)) {
1781
129M
    switch (BYTE_TYPE(enc, ptr)) {
1782
0
#  define LEAD_CASE(n)                                                         \
1783
1.56M
  case BT_LEAD##n:                                                             \
1784
1.56M
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1785
1.56M
    pos->columnNumber++;                                                       \
1786
1.56M
    break;
1787
660k
      LEAD_CASE(2)
1788
643k
      LEAD_CASE(3)
1789
258k
      LEAD_CASE(4)
1790
0
#  undef LEAD_CASE
1791
4.13M
    case BT_LF:
1792
4.13M
      pos->columnNumber = 0;
1793
4.13M
      pos->lineNumber++;
1794
4.13M
      ptr += MINBPC(enc);
1795
4.13M
      break;
1796
5.54M
    case BT_CR:
1797
5.54M
      pos->lineNumber++;
1798
5.54M
      ptr += MINBPC(enc);
1799
5.54M
      if (HAS_CHAR(enc, ptr, end) && BYTE_TYPE(enc, ptr) == BT_LF)
1800
1.21M
        ptr += MINBPC(enc);
1801
5.54M
      pos->columnNumber = 0;
1802
5.54M
      break;
1803
117M
    default:
1804
117M
      ptr += MINBPC(enc);
1805
117M
      pos->columnNumber++;
1806
117M
      break;
1807
129M
    }
1808
129M
  }
1809
19.7k
}
xmltok.c:normal_updatePosition
Line
Count
Source
1779
19.2k
                       POSITION *pos) {
1780
128M
  while (HAS_CHAR(enc, ptr, end)) {
1781
128M
    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
660k
      LEAD_CASE(2)
1788
643k
      LEAD_CASE(3)
1789
258k
      LEAD_CASE(4)
1790
0
#  undef LEAD_CASE
1791
4.13M
    case BT_LF:
1792
4.13M
      pos->columnNumber = 0;
1793
4.13M
      pos->lineNumber++;
1794
4.13M
      ptr += MINBPC(enc);
1795
4.13M
      break;
1796
5.54M
    case BT_CR:
1797
5.54M
      pos->lineNumber++;
1798
5.54M
      ptr += MINBPC(enc);
1799
5.54M
      if (HAS_CHAR(enc, ptr, end) && BYTE_TYPE(enc, ptr) == BT_LF)
1800
1.21M
        ptr += MINBPC(enc);
1801
5.54M
      pos->columnNumber = 0;
1802
5.54M
      break;
1803
117M
    default:
1804
117M
      ptr += MINBPC(enc);
1805
117M
      pos->columnNumber++;
1806
117M
      break;
1807
128M
    }
1808
128M
  }
1809
19.2k
}
xmltok.c:little2_updatePosition
Line
Count
Source
1779
237
                       POSITION *pos) {
1780
597
  while (HAS_CHAR(enc, ptr, end)) {
1781
597
    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
597
    default:
1804
597
      ptr += MINBPC(enc);
1805
597
      pos->columnNumber++;
1806
597
      break;
1807
597
    }
1808
597
  }
1809
237
}
xmltok.c:big2_updatePosition
Line
Count
Source
1779
240
                       POSITION *pos) {
1780
13.9k
  while (HAS_CHAR(enc, ptr, end)) {
1781
13.9k
    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
13.9k
    default:
1804
13.9k
      ptr += MINBPC(enc);
1805
13.9k
      pos->columnNumber++;
1806
13.9k
      break;
1807
13.9k
    }
1808
13.9k
  }
1809
240
}
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 */