Coverage Report

Created: 2026-09-14 06:43

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
111
#    define IS_INVALID_CHAR(enc, ptr, n) (0)
46
#  endif
47
48
#  define INVALID_LEAD_CASE(n, ptr, nextTokPtr)                                \
49
641k
  case BT_LEAD##n:                                                             \
50
641k
    if (end - ptr < n)                                                         \
51
641k
      return XML_TOK_PARTIAL_CHAR;                                             \
52
641k
    if (IS_INVALID_CHAR(enc, ptr, n)) {                                        \
53
141
      *(nextTokPtr) = (ptr);                                                   \
54
141
      return XML_TOK_INVALID;                                                  \
55
141
    }                                                                          \
56
641k
    ptr += n;                                                                  \
57
641k
    break;
58
59
#  define INVALID_CASES(ptr, nextTokPtr)                                       \
60
268k
    INVALID_LEAD_CASE(2, ptr, nextTokPtr)                                      \
61
267k
    INVALID_LEAD_CASE(3, ptr, nextTokPtr)                                      \
62
223k
    INVALID_LEAD_CASE(4, ptr, nextTokPtr)                                      \
63
149k
  case BT_NONXML:                                                              \
64
73
  case BT_MALFORM:                                                             \
65
144
  case BT_TRAIL:                                                               \
66
144
    *(nextTokPtr) = (ptr);                                                     \
67
144
    return XML_TOK_INVALID;
68
69
#  define CHECK_NAME_CASE(n, enc, ptr, end, nextTokPtr)                        \
70
135k
  case BT_LEAD##n:                                                             \
71
135k
    if (end - ptr < n)                                                         \
72
135k
      return XML_TOK_PARTIAL_CHAR;                                             \
73
135k
    if (IS_INVALID_CHAR(enc, ptr, n) || ! IS_NAME_CHAR(enc, ptr, n)) {         \
74
319
      *nextTokPtr = ptr;                                                       \
75
319
      return XML_TOK_INVALID;                                                  \
76
319
    }                                                                          \
77
135k
    ptr += n;                                                                  \
78
135k
    break;
79
80
#  define CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)                          \
81
24.6M
  case BT_NONASCII:                                                            \
82
24.6M
    if (! IS_NAME_CHAR_MINBPC(enc, ptr)) {                                     \
83
50
      *nextTokPtr = ptr;                                                       \
84
50
      return XML_TOK_INVALID;                                                  \
85
50
    }                                                                          \
86
24.6M
    /* fall through */                                                         \
87
24.6M
  case BT_NMSTRT:                                                              \
88
18.2M
  case BT_HEX:                                                                 \
89
23.8M
  case BT_DIGIT:                                                               \
90
23.8M
  case BT_NAME:                                                                \
91
24.6M
  case BT_MINUS:                                                               \
92
24.6M
    ptr += MINBPC(enc);                                                        \
93
24.6M
    break;                                                                     \
94
24.6M
    CHECK_NAME_CASE(2, enc, ptr, end, nextTokPtr)                              \
95
68.6k
    CHECK_NAME_CASE(3, enc, ptr, end, nextTokPtr)                              \
96
68.5k
    CHECK_NAME_CASE(4, enc, ptr, end, nextTokPtr)
97
98
#  define CHECK_NMSTRT_CASE(n, enc, ptr, end, nextTokPtr)                      \
99
83.2k
  case BT_LEAD##n:                                                             \
100
83.2k
    if ((end) - (ptr) < (n))                                                   \
101
82.9k
      return XML_TOK_PARTIAL_CHAR;                                             \
102
83.1k
    if (IS_INVALID_CHAR(enc, ptr, n) || ! IS_NMSTRT_CHAR(enc, ptr, n)) {       \
103
183
      *nextTokPtr = ptr;                                                       \
104
183
      return XML_TOK_INVALID;                                                  \
105
183
    }                                                                          \
106
83.1k
    ptr += n;                                                                  \
107
82.9k
    break;
108
109
#  define CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)                        \
110
4.28M
  case BT_NONASCII:                                                            \
111
4.28M
    if (! IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {                                   \
112
0
      *nextTokPtr = ptr;                                                       \
113
0
      return XML_TOK_INVALID;                                                  \
114
0
    }                                                                          \
115
4.28M
    /* fall through */                                                         \
116
4.28M
  case BT_NMSTRT:                                                              \
117
4.28M
  case BT_HEX:                                                                 \
118
4.28M
    ptr += MINBPC(enc);                                                        \
119
4.28M
    break;                                                                     \
120
4.28M
    CHECK_NMSTRT_CASE(2, enc, ptr, end, nextTokPtr)                            \
121
51.4k
    CHECK_NMSTRT_CASE(3, enc, ptr, end, nextTokPtr)                            \
122
31.5k
    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
291M
    ((end) - (ptr) >= ((count) * MINBPC(enc)))
130
131
10.2M
#  define HAS_CHAR(enc, ptr, end) HAS_CHARS(enc, ptr, end, 1)
132
133
#  define REQUIRE_CHARS(enc, ptr, end, count)                                  \
134
33.0M
    {                                                                          \
135
33.0M
      if (! HAS_CHARS(enc, ptr, end, count)) {                                 \
136
712
        return XML_TOK_PARTIAL;                                                \
137
712
      }                                                                        \
138
33.0M
    }
139
140
33.0M
#  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
14.3k
                    const char **nextTokPtr) {
147
14.3k
  if (HAS_CHAR(enc, ptr, end)) {
148
14.3k
    if (! CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
149
10
      *nextTokPtr = ptr;
150
10
      return XML_TOK_INVALID;
151
10
    }
152
14.3k
    ptr += MINBPC(enc);
153
8.26M
    while (HAS_CHAR(enc, ptr, end)) {
154
8.26M
      switch (BYTE_TYPE(enc, ptr)) {
155
214k
        INVALID_CASES(ptr, nextTokPtr)
156
33.2k
      case BT_MINUS:
157
33.2k
        ptr += MINBPC(enc);
158
33.2k
        REQUIRE_CHAR(enc, ptr, end);
159
33.2k
        if (CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
160
14.2k
          ptr += MINBPC(enc);
161
14.2k
          REQUIRE_CHAR(enc, ptr, end);
162
14.2k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
163
9
            *nextTokPtr = ptr;
164
9
            return XML_TOK_INVALID;
165
9
          }
166
14.1k
          *nextTokPtr = ptr + MINBPC(enc);
167
14.1k
          return XML_TOK_COMMENT;
168
14.2k
        }
169
19.0k
        break;
170
8.12M
      default:
171
8.12M
        ptr += MINBPC(enc);
172
8.12M
        break;
173
8.26M
      }
174
8.26M
    }
175
14.3k
  }
176
82
  return XML_TOK_PARTIAL;
177
14.3k
}
xmltok.c:normal_scanComment
Line
Count
Source
146
14.3k
                    const char **nextTokPtr) {
147
14.3k
  if (HAS_CHAR(enc, ptr, end)) {
148
14.3k
    if (! CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
149
10
      *nextTokPtr = ptr;
150
10
      return XML_TOK_INVALID;
151
10
    }
152
14.3k
    ptr += MINBPC(enc);
153
8.26M
    while (HAS_CHAR(enc, ptr, end)) {
154
8.26M
      switch (BYTE_TYPE(enc, ptr)) {
155
214k
        INVALID_CASES(ptr, nextTokPtr)
156
33.2k
      case BT_MINUS:
157
33.2k
        ptr += MINBPC(enc);
158
33.2k
        REQUIRE_CHAR(enc, ptr, end);
159
33.2k
        if (CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
160
14.2k
          ptr += MINBPC(enc);
161
14.2k
          REQUIRE_CHAR(enc, ptr, end);
162
14.2k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
163
9
            *nextTokPtr = ptr;
164
9
            return XML_TOK_INVALID;
165
9
          }
166
14.1k
          *nextTokPtr = ptr + MINBPC(enc);
167
14.1k
          return XML_TOK_COMMENT;
168
14.2k
        }
169
19.0k
        break;
170
8.12M
      default:
171
8.12M
        ptr += MINBPC(enc);
172
8.12M
        break;
173
8.26M
      }
174
8.26M
    }
175
14.3k
  }
176
82
  return XML_TOK_PARTIAL;
177
14.3k
}
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
42.5k
                 const char **nextTokPtr) {
184
42.5k
  REQUIRE_CHAR(enc, ptr, end);
185
42.5k
  switch (BYTE_TYPE(enc, ptr)) {
186
2.45k
  case BT_MINUS:
187
2.45k
    return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
188
1
  case BT_LSQB:
189
1
    *nextTokPtr = ptr + MINBPC(enc);
190
1
    return XML_TOK_COND_SECT_OPEN;
191
1.38k
  case BT_NMSTRT:
192
40.0k
  case BT_HEX:
193
40.0k
    ptr += MINBPC(enc);
194
40.0k
    break;
195
4
  default:
196
4
    *nextTokPtr = ptr;
197
4
    return XML_TOK_INVALID;
198
42.5k
  }
199
273k
  while (HAS_CHAR(enc, ptr, end)) {
200
273k
    switch (BYTE_TYPE(enc, ptr)) {
201
21
    case BT_PERCNT:
202
21
      REQUIRE_CHARS(enc, ptr, end, 2);
203
      /* don't allow <!ENTITY% foo "whatever"> */
204
19
      switch (BYTE_TYPE(enc, ptr + MINBPC(enc))) {
205
1
      case BT_S:
206
2
      case BT_CR:
207
3
      case BT_LF:
208
6
      case BT_PERCNT:
209
6
        *nextTokPtr = ptr;
210
6
        return XML_TOK_INVALID;
211
19
      }
212
      /* fall through */
213
15.4k
    case BT_S:
214
35.9k
    case BT_CR:
215
39.9k
    case BT_LF:
216
39.9k
      *nextTokPtr = ptr;
217
39.9k
      return XML_TOK_DECL_OPEN;
218
215k
    case BT_NMSTRT:
219
233k
    case BT_HEX:
220
233k
      ptr += MINBPC(enc);
221
233k
      break;
222
7
    default:
223
7
      *nextTokPtr = ptr;
224
7
      return XML_TOK_INVALID;
225
273k
    }
226
273k
  }
227
72
  return XML_TOK_PARTIAL;
228
40.0k
}
xmltok.c:normal_scanDecl
Line
Count
Source
183
42.5k
                 const char **nextTokPtr) {
184
42.5k
  REQUIRE_CHAR(enc, ptr, end);
185
42.5k
  switch (BYTE_TYPE(enc, ptr)) {
186
2.45k
  case BT_MINUS:
187
2.45k
    return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
188
1
  case BT_LSQB:
189
1
    *nextTokPtr = ptr + MINBPC(enc);
190
1
    return XML_TOK_COND_SECT_OPEN;
191
1.38k
  case BT_NMSTRT:
192
40.0k
  case BT_HEX:
193
40.0k
    ptr += MINBPC(enc);
194
40.0k
    break;
195
4
  default:
196
4
    *nextTokPtr = ptr;
197
4
    return XML_TOK_INVALID;
198
42.5k
  }
199
273k
  while (HAS_CHAR(enc, ptr, end)) {
200
273k
    switch (BYTE_TYPE(enc, ptr)) {
201
21
    case BT_PERCNT:
202
21
      REQUIRE_CHARS(enc, ptr, end, 2);
203
      /* don't allow <!ENTITY% foo "whatever"> */
204
19
      switch (BYTE_TYPE(enc, ptr + MINBPC(enc))) {
205
1
      case BT_S:
206
2
      case BT_CR:
207
3
      case BT_LF:
208
6
      case BT_PERCNT:
209
6
        *nextTokPtr = ptr;
210
6
        return XML_TOK_INVALID;
211
19
      }
212
      /* fall through */
213
15.4k
    case BT_S:
214
35.9k
    case BT_CR:
215
39.9k
    case BT_LF:
216
39.9k
      *nextTokPtr = ptr;
217
39.9k
      return XML_TOK_DECL_OPEN;
218
215k
    case BT_NMSTRT:
219
233k
    case BT_HEX:
220
233k
      ptr += MINBPC(enc);
221
233k
      break;
222
7
    default:
223
7
      *nextTokPtr = ptr;
224
7
      return XML_TOK_INVALID;
225
273k
    }
226
273k
  }
227
72
  return XML_TOK_PARTIAL;
228
40.0k
}
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
49.3k
                      int *tokPtr) {
233
49.3k
  int upper = 0;
234
49.3k
  UNUSED_P(enc);
235
49.3k
  *tokPtr = XML_TOK_PI;
236
49.3k
  if (end - ptr != MINBPC(enc) * 3)
237
40.4k
    return 1;
238
8.88k
  switch (BYTE_TO_ASCII(enc, ptr)) {
239
5.54k
  case ASCII_x:
240
5.54k
    break;
241
994
  case ASCII_X:
242
994
    upper = 1;
243
994
    break;
244
2.34k
  default:
245
2.34k
    return 1;
246
8.88k
  }
247
6.53k
  ptr += MINBPC(enc);
248
6.53k
  switch (BYTE_TO_ASCII(enc, ptr)) {
249
1.67k
  case ASCII_m:
250
1.67k
    break;
251
845
  case ASCII_M:
252
845
    upper = 1;
253
845
    break;
254
4.01k
  default:
255
4.01k
    return 1;
256
6.53k
  }
257
2.52k
  ptr += MINBPC(enc);
258
2.52k
  switch (BYTE_TO_ASCII(enc, ptr)) {
259
1.14k
  case ASCII_l:
260
1.14k
    break;
261
2
  case ASCII_L:
262
2
    upper = 1;
263
2
    break;
264
1.37k
  default:
265
1.37k
    return 1;
266
2.52k
  }
267
1.14k
  if (upper)
268
5
    return 0;
269
1.14k
  *tokPtr = XML_TOK_XML_DECL;
270
1.14k
  return 1;
271
1.14k
}
xmltok.c:normal_checkPiTarget
Line
Count
Source
232
49.3k
                      int *tokPtr) {
233
49.3k
  int upper = 0;
234
49.3k
  UNUSED_P(enc);
235
49.3k
  *tokPtr = XML_TOK_PI;
236
49.3k
  if (end - ptr != MINBPC(enc) * 3)
237
40.4k
    return 1;
238
8.88k
  switch (BYTE_TO_ASCII(enc, ptr)) {
239
5.54k
  case ASCII_x:
240
5.54k
    break;
241
994
  case ASCII_X:
242
994
    upper = 1;
243
994
    break;
244
2.34k
  default:
245
2.34k
    return 1;
246
8.88k
  }
247
6.53k
  ptr += MINBPC(enc);
248
6.53k
  switch (BYTE_TO_ASCII(enc, ptr)) {
249
1.67k
  case ASCII_m:
250
1.67k
    break;
251
845
  case ASCII_M:
252
845
    upper = 1;
253
845
    break;
254
4.01k
  default:
255
4.01k
    return 1;
256
6.53k
  }
257
2.52k
  ptr += MINBPC(enc);
258
2.52k
  switch (BYTE_TO_ASCII(enc, ptr)) {
259
1.14k
  case ASCII_l:
260
1.14k
    break;
261
2
  case ASCII_L:
262
2
    upper = 1;
263
2
    break;
264
1.37k
  default:
265
1.37k
    return 1;
266
2.52k
  }
267
1.14k
  if (upper)
268
5
    return 0;
269
1.14k
  *tokPtr = XML_TOK_XML_DECL;
270
1.14k
  return 1;
271
1.14k
}
Unexecuted instantiation: xmltok.c:little2_checkPiTarget
Unexecuted instantiation: xmltok.c:big2_checkPiTarget
272
273
/* ptr points to character following "<?" */
274
275
static int PTRCALL
276
PREFIX(scanPi)(const ENCODING *enc, const char *ptr, const char *end,
277
49.5k
               const char **nextTokPtr) {
278
49.5k
  int tok;
279
49.5k
  const char *target = ptr;
280
49.5k
  REQUIRE_CHAR(enc, ptr, end);
281
49.5k
  switch (BYTE_TYPE(enc, ptr)) {
282
58.3k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
283
2
  default:
284
2
    *nextTokPtr = ptr;
285
2
    return XML_TOK_INVALID;
286
49.5k
  }
287
1.19M
  while (HAS_CHAR(enc, ptr, end)) {
288
1.19M
    switch (BYTE_TYPE(enc, ptr)) {
289
4.24M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
290
8.25k
    case BT_S:
291
24.7k
    case BT_CR:
292
28.0k
    case BT_LF:
293
28.0k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
294
3
        *nextTokPtr = ptr;
295
3
        return XML_TOK_INVALID;
296
3
      }
297
28.0k
      ptr += MINBPC(enc);
298
25.2M
      while (HAS_CHAR(enc, ptr, end)) {
299
25.2M
        switch (BYTE_TYPE(enc, ptr)) {
300
651k
          INVALID_CASES(ptr, nextTokPtr)
301
198k
        case BT_QUEST:
302
198k
          ptr += MINBPC(enc);
303
198k
          REQUIRE_CHAR(enc, ptr, end);
304
198k
          if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
305
27.8k
            *nextTokPtr = ptr + MINBPC(enc);
306
27.8k
            return tok;
307
27.8k
          }
308
171k
          break;
309
24.7M
        default:
310
24.7M
          ptr += MINBPC(enc);
311
24.7M
          break;
312
25.2M
        }
313
25.2M
      }
314
174
      return XML_TOK_PARTIAL;
315
21.2k
    case BT_QUEST:
316
21.2k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
317
2
        *nextTokPtr = ptr;
318
2
        return XML_TOK_INVALID;
319
2
      }
320
21.2k
      ptr += MINBPC(enc);
321
21.2k
      REQUIRE_CHAR(enc, ptr, end);
322
21.2k
      if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
323
21.2k
        *nextTokPtr = ptr + MINBPC(enc);
324
21.2k
        return tok;
325
21.2k
      }
326
      /* fall through */
327
34
    default:
328
34
      *nextTokPtr = ptr;
329
34
      return XML_TOK_INVALID;
330
1.19M
    }
331
1.19M
  }
332
98
  return XML_TOK_PARTIAL;
333
49.5k
}
xmltok.c:normal_scanPi
Line
Count
Source
277
49.5k
               const char **nextTokPtr) {
278
49.5k
  int tok;
279
49.5k
  const char *target = ptr;
280
49.5k
  REQUIRE_CHAR(enc, ptr, end);
281
49.5k
  switch (BYTE_TYPE(enc, ptr)) {
282
58.3k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
283
2
  default:
284
2
    *nextTokPtr = ptr;
285
2
    return XML_TOK_INVALID;
286
49.5k
  }
287
1.19M
  while (HAS_CHAR(enc, ptr, end)) {
288
1.19M
    switch (BYTE_TYPE(enc, ptr)) {
289
4.24M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
290
8.25k
    case BT_S:
291
24.7k
    case BT_CR:
292
28.0k
    case BT_LF:
293
28.0k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
294
3
        *nextTokPtr = ptr;
295
3
        return XML_TOK_INVALID;
296
3
      }
297
28.0k
      ptr += MINBPC(enc);
298
25.2M
      while (HAS_CHAR(enc, ptr, end)) {
299
25.2M
        switch (BYTE_TYPE(enc, ptr)) {
300
651k
          INVALID_CASES(ptr, nextTokPtr)
301
198k
        case BT_QUEST:
302
198k
          ptr += MINBPC(enc);
303
198k
          REQUIRE_CHAR(enc, ptr, end);
304
198k
          if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
305
27.8k
            *nextTokPtr = ptr + MINBPC(enc);
306
27.8k
            return tok;
307
27.8k
          }
308
171k
          break;
309
24.7M
        default:
310
24.7M
          ptr += MINBPC(enc);
311
24.7M
          break;
312
25.2M
        }
313
25.2M
      }
314
174
      return XML_TOK_PARTIAL;
315
21.2k
    case BT_QUEST:
316
21.2k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
317
2
        *nextTokPtr = ptr;
318
2
        return XML_TOK_INVALID;
319
2
      }
320
21.2k
      ptr += MINBPC(enc);
321
21.2k
      REQUIRE_CHAR(enc, ptr, end);
322
21.2k
      if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
323
21.2k
        *nextTokPtr = ptr + MINBPC(enc);
324
21.2k
        return tok;
325
21.2k
      }
326
      /* fall through */
327
34
    default:
328
34
      *nextTokPtr = ptr;
329
34
      return XML_TOK_INVALID;
330
1.19M
    }
331
1.19M
  }
332
98
  return XML_TOK_PARTIAL;
333
49.5k
}
Unexecuted instantiation: xmltok.c:little2_scanPi
Unexecuted instantiation: xmltok.c:big2_scanPi
334
335
static int PTRCALL
336
PREFIX(scanCdataSection)(const ENCODING *enc, const char *ptr, const char *end,
337
2.27k
                         const char **nextTokPtr) {
338
2.27k
  static const char CDATA_LSQB[]
339
2.27k
      = {ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, ASCII_LSQB};
340
2.27k
  int i;
341
2.27k
  UNUSED_P(enc);
342
  /* CDATA[ */
343
2.27k
  REQUIRE_CHARS(enc, ptr, end, 6);
344
15.5k
  for (i = 0; i < 6; i++, ptr += MINBPC(enc)) {
345
13.3k
    if (! CHAR_MATCHES(enc, ptr, CDATA_LSQB[i])) {
346
56
      *nextTokPtr = ptr;
347
56
      return XML_TOK_INVALID;
348
56
    }
349
13.3k
  }
350
2.19k
  *nextTokPtr = ptr;
351
2.19k
  return XML_TOK_CDATA_SECT_OPEN;
352
2.24k
}
xmltok.c:normal_scanCdataSection
Line
Count
Source
337
2.27k
                         const char **nextTokPtr) {
338
2.27k
  static const char CDATA_LSQB[]
339
2.27k
      = {ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, ASCII_LSQB};
340
2.27k
  int i;
341
2.27k
  UNUSED_P(enc);
342
  /* CDATA[ */
343
2.27k
  REQUIRE_CHARS(enc, ptr, end, 6);
344
15.5k
  for (i = 0; i < 6; i++, ptr += MINBPC(enc)) {
345
13.3k
    if (! CHAR_MATCHES(enc, ptr, CDATA_LSQB[i])) {
346
56
      *nextTokPtr = ptr;
347
56
      return XML_TOK_INVALID;
348
56
    }
349
13.3k
  }
350
2.19k
  *nextTokPtr = ptr;
351
2.19k
  return XML_TOK_CDATA_SECT_OPEN;
352
2.24k
}
Unexecuted instantiation: xmltok.c:little2_scanCdataSection
Unexecuted instantiation: xmltok.c:big2_scanCdataSection
353
354
static int PTRCALL
355
PREFIX(cdataSectionTok)(const ENCODING *enc, const char *ptr, const char *end,
356
4.27M
                        const char **nextTokPtr) {
357
4.27M
  if (ptr >= end)
358
242
    return XML_TOK_NONE;
359
4.27M
  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
4.27M
  switch (BYTE_TYPE(enc, ptr)) {
369
567k
  case BT_RSQB:
370
567k
    ptr += MINBPC(enc);
371
567k
    REQUIRE_CHAR(enc, ptr, end);
372
567k
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
373
299k
      break;
374
268k
    ptr += MINBPC(enc);
375
268k
    REQUIRE_CHAR(enc, ptr, end);
376
268k
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
377
266k
      ptr -= MINBPC(enc);
378
266k
      break;
379
266k
    }
380
1.99k
    *nextTokPtr = ptr + MINBPC(enc);
381
1.99k
    return XML_TOK_CDATA_SECT_CLOSE;
382
1.60M
  case BT_CR:
383
1.60M
    ptr += MINBPC(enc);
384
1.60M
    REQUIRE_CHAR(enc, ptr, end);
385
1.60M
    if (BYTE_TYPE(enc, ptr) == BT_LF)
386
330k
      ptr += MINBPC(enc);
387
1.60M
    *nextTokPtr = ptr;
388
1.60M
    return XML_TOK_DATA_NEWLINE;
389
1.23M
  case BT_LF:
390
1.23M
    *nextTokPtr = ptr + MINBPC(enc);
391
1.23M
    return XML_TOK_DATA_NEWLINE;
392
1.23M
    INVALID_CASES(ptr, nextTokPtr)
393
803k
  default:
394
803k
    ptr += MINBPC(enc);
395
803k
    break;
396
4.27M
  }
397
22.5M
  while (HAS_CHAR(enc, ptr, end)) {
398
22.5M
    switch (BYTE_TYPE(enc, ptr)) {
399
0
#  define LEAD_CASE(n)                                                         \
400
342k
  case BT_LEAD##n:                                                             \
401
342k
    if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) {                       \
402
22
      *nextTokPtr = ptr;                                                       \
403
22
      return XML_TOK_DATA_CHARS;                                               \
404
22
    }                                                                          \
405
342k
    ptr += n;                                                                  \
406
342k
    break;
407
155k
      LEAD_CASE(2)
408
132k
      LEAD_CASE(3)
409
53.7k
      LEAD_CASE(4)
410
0
#  undef LEAD_CASE
411
8
    case BT_NONXML:
412
12
    case BT_MALFORM:
413
19
    case BT_TRAIL:
414
616k
    case BT_CR:
415
964k
    case BT_LF:
416
1.42M
    case BT_RSQB:
417
1.42M
      *nextTokPtr = ptr;
418
1.42M
      return XML_TOK_DATA_CHARS;
419
20.8M
    default:
420
20.8M
      ptr += MINBPC(enc);
421
20.8M
      break;
422
22.5M
    }
423
22.5M
  }
424
75
  *nextTokPtr = ptr;
425
75
  return XML_TOK_DATA_CHARS;
426
1.42M
}
xmltok.c:normal_cdataSectionTok
Line
Count
Source
356
4.27M
                        const char **nextTokPtr) {
357
4.27M
  if (ptr >= end)
358
242
    return XML_TOK_NONE;
359
4.27M
  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
4.27M
  switch (BYTE_TYPE(enc, ptr)) {
369
567k
  case BT_RSQB:
370
567k
    ptr += MINBPC(enc);
371
567k
    REQUIRE_CHAR(enc, ptr, end);
372
567k
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
373
299k
      break;
374
268k
    ptr += MINBPC(enc);
375
268k
    REQUIRE_CHAR(enc, ptr, end);
376
268k
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
377
266k
      ptr -= MINBPC(enc);
378
266k
      break;
379
266k
    }
380
1.99k
    *nextTokPtr = ptr + MINBPC(enc);
381
1.99k
    return XML_TOK_CDATA_SECT_CLOSE;
382
1.60M
  case BT_CR:
383
1.60M
    ptr += MINBPC(enc);
384
1.60M
    REQUIRE_CHAR(enc, ptr, end);
385
1.60M
    if (BYTE_TYPE(enc, ptr) == BT_LF)
386
330k
      ptr += MINBPC(enc);
387
1.60M
    *nextTokPtr = ptr;
388
1.60M
    return XML_TOK_DATA_NEWLINE;
389
1.23M
  case BT_LF:
390
1.23M
    *nextTokPtr = ptr + MINBPC(enc);
391
1.23M
    return XML_TOK_DATA_NEWLINE;
392
1.23M
    INVALID_CASES(ptr, nextTokPtr)
393
803k
  default:
394
803k
    ptr += MINBPC(enc);
395
803k
    break;
396
4.27M
  }
397
22.5M
  while (HAS_CHAR(enc, ptr, end)) {
398
22.5M
    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
155k
      LEAD_CASE(2)
408
132k
      LEAD_CASE(3)
409
53.7k
      LEAD_CASE(4)
410
0
#  undef LEAD_CASE
411
8
    case BT_NONXML:
412
12
    case BT_MALFORM:
413
19
    case BT_TRAIL:
414
616k
    case BT_CR:
415
964k
    case BT_LF:
416
1.42M
    case BT_RSQB:
417
1.42M
      *nextTokPtr = ptr;
418
1.42M
      return XML_TOK_DATA_CHARS;
419
20.8M
    default:
420
20.8M
      ptr += MINBPC(enc);
421
20.8M
      break;
422
22.5M
    }
423
22.5M
  }
424
75
  *nextTokPtr = ptr;
425
75
  return XML_TOK_DATA_CHARS;
426
1.42M
}
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
101k
                   const char **nextTokPtr) {
433
101k
  REQUIRE_CHAR(enc, ptr, end);
434
101k
  switch (BYTE_TYPE(enc, ptr)) {
435
79.1k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
436
9
  default:
437
9
    *nextTokPtr = ptr;
438
9
    return XML_TOK_INVALID;
439
101k
  }
440
1.12M
  while (HAS_CHAR(enc, ptr, end)) {
441
1.12M
    switch (BYTE_TYPE(enc, ptr)) {
442
3.25M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
443
350
    case BT_S:
444
1.19k
    case BT_CR:
445
2.33k
    case BT_LF:
446
6.51k
      for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
447
6.51k
        switch (BYTE_TYPE(enc, ptr)) {
448
228
        case BT_S:
449
1.69k
        case BT_CR:
450
4.23k
        case BT_LF:
451
4.23k
          break;
452
2.27k
        case BT_GT:
453
2.27k
          *nextTokPtr = ptr + MINBPC(enc);
454
2.27k
          return XML_TOK_END_TAG;
455
2
        default:
456
2
          *nextTokPtr = ptr;
457
2
          return XML_TOK_INVALID;
458
6.51k
        }
459
6.51k
      }
460
56
      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
99.1k
    case BT_GT:
469
99.1k
      *nextTokPtr = ptr + MINBPC(enc);
470
99.1k
      return XML_TOK_END_TAG;
471
16
    default:
472
16
      *nextTokPtr = ptr;
473
16
      return XML_TOK_INVALID;
474
1.12M
    }
475
1.12M
  }
476
120
  return XML_TOK_PARTIAL;
477
101k
}
xmltok.c:normal_scanEndTag
Line
Count
Source
432
101k
                   const char **nextTokPtr) {
433
101k
  REQUIRE_CHAR(enc, ptr, end);
434
101k
  switch (BYTE_TYPE(enc, ptr)) {
435
79.1k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
436
9
  default:
437
9
    *nextTokPtr = ptr;
438
9
    return XML_TOK_INVALID;
439
101k
  }
440
1.12M
  while (HAS_CHAR(enc, ptr, end)) {
441
1.12M
    switch (BYTE_TYPE(enc, ptr)) {
442
3.25M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
443
350
    case BT_S:
444
1.19k
    case BT_CR:
445
2.33k
    case BT_LF:
446
6.51k
      for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
447
6.51k
        switch (BYTE_TYPE(enc, ptr)) {
448
228
        case BT_S:
449
1.69k
        case BT_CR:
450
4.23k
        case BT_LF:
451
4.23k
          break;
452
2.27k
        case BT_GT:
453
2.27k
          *nextTokPtr = ptr + MINBPC(enc);
454
2.27k
          return XML_TOK_END_TAG;
455
2
        default:
456
2
          *nextTokPtr = ptr;
457
2
          return XML_TOK_INVALID;
458
6.51k
        }
459
6.51k
      }
460
56
      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
99.1k
    case BT_GT:
469
99.1k
      *nextTokPtr = ptr + MINBPC(enc);
470
99.1k
      return XML_TOK_END_TAG;
471
16
    default:
472
16
      *nextTokPtr = ptr;
473
16
      return XML_TOK_INVALID;
474
1.12M
    }
475
1.12M
  }
476
120
  return XML_TOK_PARTIAL;
477
101k
}
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
17.0k
                       const char **nextTokPtr) {
484
17.0k
  if (HAS_CHAR(enc, ptr, end)) {
485
17.0k
    switch (BYTE_TYPE(enc, ptr)) {
486
10.5k
    case BT_DIGIT:
487
17.0k
    case BT_HEX:
488
17.0k
      break;
489
3
    default:
490
3
      *nextTokPtr = ptr;
491
3
      return XML_TOK_INVALID;
492
17.0k
    }
493
62.5k
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
494
62.5k
      switch (BYTE_TYPE(enc, ptr)) {
495
31.8k
      case BT_DIGIT:
496
45.5k
      case BT_HEX:
497
45.5k
        break;
498
17.0k
      case BT_SEMI:
499
17.0k
        *nextTokPtr = ptr + MINBPC(enc);
500
17.0k
        return XML_TOK_CHAR_REF;
501
3
      default:
502
3
        *nextTokPtr = ptr;
503
3
        return XML_TOK_INVALID;
504
62.5k
      }
505
62.5k
    }
506
17.0k
  }
507
35
  return XML_TOK_PARTIAL;
508
17.0k
}
xmltok.c:normal_scanHexCharRef
Line
Count
Source
483
17.0k
                       const char **nextTokPtr) {
484
17.0k
  if (HAS_CHAR(enc, ptr, end)) {
485
17.0k
    switch (BYTE_TYPE(enc, ptr)) {
486
10.5k
    case BT_DIGIT:
487
17.0k
    case BT_HEX:
488
17.0k
      break;
489
3
    default:
490
3
      *nextTokPtr = ptr;
491
3
      return XML_TOK_INVALID;
492
17.0k
    }
493
62.5k
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
494
62.5k
      switch (BYTE_TYPE(enc, ptr)) {
495
31.8k
      case BT_DIGIT:
496
45.5k
      case BT_HEX:
497
45.5k
        break;
498
17.0k
      case BT_SEMI:
499
17.0k
        *nextTokPtr = ptr + MINBPC(enc);
500
17.0k
        return XML_TOK_CHAR_REF;
501
3
      default:
502
3
        *nextTokPtr = ptr;
503
3
        return XML_TOK_INVALID;
504
62.5k
      }
505
62.5k
    }
506
17.0k
  }
507
35
  return XML_TOK_PARTIAL;
508
17.0k
}
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
23.2k
                    const char **nextTokPtr) {
515
23.2k
  if (HAS_CHAR(enc, ptr, end)) {
516
23.2k
    if (CHAR_MATCHES(enc, ptr, ASCII_x))
517
17.0k
      return PREFIX(scanHexCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
518
6.17k
    switch (BYTE_TYPE(enc, ptr)) {
519
6.16k
    case BT_DIGIT:
520
6.16k
      break;
521
11
    default:
522
11
      *nextTokPtr = ptr;
523
11
      return XML_TOK_INVALID;
524
6.17k
    }
525
17.6k
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
526
17.6k
      switch (BYTE_TYPE(enc, ptr)) {
527
11.5k
      case BT_DIGIT:
528
11.5k
        break;
529
6.14k
      case BT_SEMI:
530
6.14k
        *nextTokPtr = ptr + MINBPC(enc);
531
6.14k
        return XML_TOK_CHAR_REF;
532
3
      default:
533
3
        *nextTokPtr = ptr;
534
3
        return XML_TOK_INVALID;
535
17.6k
      }
536
17.6k
    }
537
6.16k
  }
538
20
  return XML_TOK_PARTIAL;
539
23.2k
}
xmltok.c:normal_scanCharRef
Line
Count
Source
514
23.2k
                    const char **nextTokPtr) {
515
23.2k
  if (HAS_CHAR(enc, ptr, end)) {
516
23.2k
    if (CHAR_MATCHES(enc, ptr, ASCII_x))
517
17.0k
      return PREFIX(scanHexCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
518
6.17k
    switch (BYTE_TYPE(enc, ptr)) {
519
6.16k
    case BT_DIGIT:
520
6.16k
      break;
521
11
    default:
522
11
      *nextTokPtr = ptr;
523
11
      return XML_TOK_INVALID;
524
6.17k
    }
525
17.6k
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
526
17.6k
      switch (BYTE_TYPE(enc, ptr)) {
527
11.5k
      case BT_DIGIT:
528
11.5k
        break;
529
6.14k
      case BT_SEMI:
530
6.14k
        *nextTokPtr = ptr + MINBPC(enc);
531
6.14k
        return XML_TOK_CHAR_REF;
532
3
      default:
533
3
        *nextTokPtr = ptr;
534
3
        return XML_TOK_INVALID;
535
17.6k
      }
536
17.6k
    }
537
6.16k
  }
538
20
  return XML_TOK_PARTIAL;
539
23.2k
}
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
137k
                const char **nextTokPtr) {
546
137k
  REQUIRE_CHAR(enc, ptr, end);
547
137k
  switch (BYTE_TYPE(enc, ptr)) {
548
55.4k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
549
23.2k
  case BT_NUM:
550
23.2k
    return PREFIX(scanCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
551
11
  default:
552
11
    *nextTokPtr = ptr;
553
11
    return XML_TOK_INVALID;
554
137k
  }
555
385k
  while (HAS_CHAR(enc, ptr, end)) {
556
385k
    switch (BYTE_TYPE(enc, ptr)) {
557
950k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
558
114k
    case BT_SEMI:
559
114k
      *nextTokPtr = ptr + MINBPC(enc);
560
114k
      return XML_TOK_ENTITY_REF;
561
17
    default:
562
17
      *nextTokPtr = ptr;
563
17
      return XML_TOK_INVALID;
564
385k
    }
565
385k
  }
566
100
  return XML_TOK_PARTIAL;
567
114k
}
xmltok.c:normal_scanRef
Line
Count
Source
545
137k
                const char **nextTokPtr) {
546
137k
  REQUIRE_CHAR(enc, ptr, end);
547
137k
  switch (BYTE_TYPE(enc, ptr)) {
548
55.4k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
549
23.2k
  case BT_NUM:
550
23.2k
    return PREFIX(scanCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
551
11
  default:
552
11
    *nextTokPtr = ptr;
553
11
    return XML_TOK_INVALID;
554
137k
  }
555
385k
  while (HAS_CHAR(enc, ptr, end)) {
556
385k
    switch (BYTE_TYPE(enc, ptr)) {
557
950k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
558
114k
    case BT_SEMI:
559
114k
      *nextTokPtr = ptr + MINBPC(enc);
560
114k
      return XML_TOK_ENTITY_REF;
561
17
    default:
562
17
      *nextTokPtr = ptr;
563
17
      return XML_TOK_INVALID;
564
385k
    }
565
385k
  }
566
100
  return XML_TOK_PARTIAL;
567
114k
}
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
87.1k
                 const char **nextTokPtr) {
574
#  ifdef XML_NS
575
  int hadColon = 0;
576
#  endif
577
3.48M
  while (HAS_CHAR(enc, ptr, end)) {
578
3.48M
    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
1.33k
    case BT_S:
598
9.98k
    case BT_CR:
599
12.9k
    case BT_LF:
600
27.7k
      for (;;) {
601
27.7k
        int t;
602
603
27.7k
        ptr += MINBPC(enc);
604
27.7k
        REQUIRE_CHAR(enc, ptr, end);
605
27.6k
        t = BYTE_TYPE(enc, ptr);
606
27.6k
        if (t == BT_EQUALS)
607
12.8k
          break;
608
14.7k
        switch (t) {
609
2.87k
        case BT_S:
610
5.41k
        case BT_LF:
611
14.7k
        case BT_CR:
612
14.7k
          break;
613
14
        default:
614
14
          *nextTokPtr = ptr;
615
14
          return XML_TOK_INVALID;
616
14.7k
        }
617
14.7k
      }
618
      /* fall through */
619
2.76M
    case BT_EQUALS: {
620
2.76M
      int open;
621
#  ifdef XML_NS
622
      hadColon = 0;
623
#  endif
624
2.80M
      for (;;) {
625
2.80M
        ptr += MINBPC(enc);
626
2.80M
        REQUIRE_CHAR(enc, ptr, end);
627
2.80M
        open = BYTE_TYPE(enc, ptr);
628
2.80M
        if (open == BT_QUOT || open == BT_APOS)
629
2.76M
          break;
630
34.0k
        switch (open) {
631
5.19k
        case BT_S:
632
13.6k
        case BT_LF:
633
34.0k
        case BT_CR:
634
34.0k
          break;
635
12
        default:
636
12
          *nextTokPtr = ptr;
637
12
          return XML_TOK_INVALID;
638
34.0k
        }
639
34.0k
      }
640
2.76M
      ptr += MINBPC(enc);
641
      /* in attribute value */
642
19.7M
      for (;;) {
643
19.7M
        int t;
644
19.7M
        REQUIRE_CHAR(enc, ptr, end);
645
19.7M
        t = BYTE_TYPE(enc, ptr);
646
19.7M
        if (t == open)
647
2.76M
          break;
648
17.0M
        switch (t) {
649
173k
          INVALID_CASES(ptr, nextTokPtr)
650
27.2k
        case BT_AMP: {
651
27.2k
          int tok = PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, &ptr);
652
27.2k
          if (tok <= 0) {
653
51
            if (tok == XML_TOK_INVALID)
654
15
              *nextTokPtr = ptr;
655
51
            return tok;
656
51
          }
657
27.2k
          break;
658
27.2k
        }
659
27.2k
        case BT_LT:
660
8
          *nextTokPtr = ptr;
661
8
          return XML_TOK_INVALID;
662
16.8M
        default:
663
16.8M
          ptr += MINBPC(enc);
664
16.8M
          break;
665
17.0M
        }
666
17.0M
      }
667
2.76M
      ptr += MINBPC(enc);
668
2.76M
      REQUIRE_CHAR(enc, ptr, end);
669
2.76M
      switch (BYTE_TYPE(enc, ptr)) {
670
1.47M
      case BT_S:
671
2.70M
      case BT_CR:
672
2.73M
      case BT_LF:
673
2.73M
        break;
674
17.4k
      case BT_SOL:
675
17.4k
        goto sol;
676
11.6k
      case BT_GT:
677
11.6k
        goto gt;
678
7
      default:
679
7
        *nextTokPtr = ptr;
680
7
        return XML_TOK_INVALID;
681
2.76M
      }
682
      /* ptr points to closing quote */
683
2.98M
      for (;;) {
684
2.98M
        ptr += MINBPC(enc);
685
2.98M
        REQUIRE_CHAR(enc, ptr, end);
686
2.98M
        switch (BYTE_TYPE(enc, ptr)) {
687
2.68M
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
688
169k
        case BT_S:
689
212k
        case BT_CR:
690
242k
        case BT_LF:
691
242k
          continue;
692
478
        case BT_GT:
693
12.1k
        gt:
694
12.1k
          *nextTokPtr = ptr + MINBPC(enc);
695
12.1k
          return XML_TOK_START_TAG_WITH_ATTS;
696
56.8k
        case BT_SOL:
697
74.3k
        sol:
698
74.3k
          ptr += MINBPC(enc);
699
74.3k
          REQUIRE_CHAR(enc, ptr, end);
700
74.2k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
701
10
            *nextTokPtr = ptr;
702
10
            return XML_TOK_INVALID;
703
10
          }
704
74.2k
          *nextTokPtr = ptr + MINBPC(enc);
705
74.2k
          return XML_TOK_EMPTY_ELEMENT_WITH_ATTS;
706
7
        default:
707
7
          *nextTokPtr = ptr;
708
7
          return XML_TOK_INVALID;
709
2.98M
        }
710
2.68M
        break;
711
2.98M
      }
712
2.68M
      break;
713
2.73M
    }
714
2.68M
    default:
715
25
      *nextTokPtr = ptr;
716
25
      return XML_TOK_INVALID;
717
3.48M
    }
718
3.48M
  }
719
140
  return XML_TOK_PARTIAL;
720
87.1k
}
xmltok.c:normal_scanAtts
Line
Count
Source
573
87.1k
                 const char **nextTokPtr) {
574
#  ifdef XML_NS
575
  int hadColon = 0;
576
#  endif
577
3.48M
  while (HAS_CHAR(enc, ptr, end)) {
578
3.48M
    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
1.33k
    case BT_S:
598
9.98k
    case BT_CR:
599
12.9k
    case BT_LF:
600
27.7k
      for (;;) {
601
27.7k
        int t;
602
603
27.7k
        ptr += MINBPC(enc);
604
27.7k
        REQUIRE_CHAR(enc, ptr, end);
605
27.6k
        t = BYTE_TYPE(enc, ptr);
606
27.6k
        if (t == BT_EQUALS)
607
12.8k
          break;
608
14.7k
        switch (t) {
609
2.87k
        case BT_S:
610
5.41k
        case BT_LF:
611
14.7k
        case BT_CR:
612
14.7k
          break;
613
14
        default:
614
14
          *nextTokPtr = ptr;
615
14
          return XML_TOK_INVALID;
616
14.7k
        }
617
14.7k
      }
618
      /* fall through */
619
2.76M
    case BT_EQUALS: {
620
2.76M
      int open;
621
#  ifdef XML_NS
622
      hadColon = 0;
623
#  endif
624
2.80M
      for (;;) {
625
2.80M
        ptr += MINBPC(enc);
626
2.80M
        REQUIRE_CHAR(enc, ptr, end);
627
2.80M
        open = BYTE_TYPE(enc, ptr);
628
2.80M
        if (open == BT_QUOT || open == BT_APOS)
629
2.76M
          break;
630
34.0k
        switch (open) {
631
5.19k
        case BT_S:
632
13.6k
        case BT_LF:
633
34.0k
        case BT_CR:
634
34.0k
          break;
635
12
        default:
636
12
          *nextTokPtr = ptr;
637
12
          return XML_TOK_INVALID;
638
34.0k
        }
639
34.0k
      }
640
2.76M
      ptr += MINBPC(enc);
641
      /* in attribute value */
642
19.7M
      for (;;) {
643
19.7M
        int t;
644
19.7M
        REQUIRE_CHAR(enc, ptr, end);
645
19.7M
        t = BYTE_TYPE(enc, ptr);
646
19.7M
        if (t == open)
647
2.76M
          break;
648
17.0M
        switch (t) {
649
173k
          INVALID_CASES(ptr, nextTokPtr)
650
27.2k
        case BT_AMP: {
651
27.2k
          int tok = PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, &ptr);
652
27.2k
          if (tok <= 0) {
653
51
            if (tok == XML_TOK_INVALID)
654
15
              *nextTokPtr = ptr;
655
51
            return tok;
656
51
          }
657
27.2k
          break;
658
27.2k
        }
659
27.2k
        case BT_LT:
660
8
          *nextTokPtr = ptr;
661
8
          return XML_TOK_INVALID;
662
16.8M
        default:
663
16.8M
          ptr += MINBPC(enc);
664
16.8M
          break;
665
17.0M
        }
666
17.0M
      }
667
2.76M
      ptr += MINBPC(enc);
668
2.76M
      REQUIRE_CHAR(enc, ptr, end);
669
2.76M
      switch (BYTE_TYPE(enc, ptr)) {
670
1.47M
      case BT_S:
671
2.70M
      case BT_CR:
672
2.73M
      case BT_LF:
673
2.73M
        break;
674
17.4k
      case BT_SOL:
675
17.4k
        goto sol;
676
11.6k
      case BT_GT:
677
11.6k
        goto gt;
678
7
      default:
679
7
        *nextTokPtr = ptr;
680
7
        return XML_TOK_INVALID;
681
2.76M
      }
682
      /* ptr points to closing quote */
683
2.98M
      for (;;) {
684
2.98M
        ptr += MINBPC(enc);
685
2.98M
        REQUIRE_CHAR(enc, ptr, end);
686
2.98M
        switch (BYTE_TYPE(enc, ptr)) {
687
2.68M
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
688
169k
        case BT_S:
689
212k
        case BT_CR:
690
242k
        case BT_LF:
691
242k
          continue;
692
478
        case BT_GT:
693
12.1k
        gt:
694
12.1k
          *nextTokPtr = ptr + MINBPC(enc);
695
12.1k
          return XML_TOK_START_TAG_WITH_ATTS;
696
56.8k
        case BT_SOL:
697
74.3k
        sol:
698
74.3k
          ptr += MINBPC(enc);
699
74.3k
          REQUIRE_CHAR(enc, ptr, end);
700
74.2k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
701
10
            *nextTokPtr = ptr;
702
10
            return XML_TOK_INVALID;
703
10
          }
704
74.2k
          *nextTokPtr = ptr + MINBPC(enc);
705
74.2k
          return XML_TOK_EMPTY_ELEMENT_WITH_ATTS;
706
7
        default:
707
7
          *nextTokPtr = ptr;
708
7
          return XML_TOK_INVALID;
709
2.98M
        }
710
2.68M
        break;
711
2.98M
      }
712
2.68M
      break;
713
2.73M
    }
714
2.68M
    default:
715
25
      *nextTokPtr = ptr;
716
25
      return XML_TOK_INVALID;
717
3.48M
    }
718
3.48M
  }
719
140
  return XML_TOK_PARTIAL;
720
87.1k
}
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.24M
               const char **nextTokPtr) {
727
#  ifdef XML_NS
728
  int hadColon;
729
#  endif
730
1.24M
  REQUIRE_CHAR(enc, ptr, end);
731
1.24M
  switch (BYTE_TYPE(enc, ptr)) {
732
1.05M
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
733
14.2k
  case BT_EXCL:
734
14.2k
    ptr += MINBPC(enc);
735
14.2k
    REQUIRE_CHAR(enc, ptr, end);
736
14.1k
    switch (BYTE_TYPE(enc, ptr)) {
737
11.9k
    case BT_MINUS:
738
11.9k
      return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
739
2.27k
    case BT_LSQB:
740
2.27k
      return PREFIX(scanCdataSection)(enc, ptr + MINBPC(enc), end, nextTokPtr);
741
14.1k
    }
742
3
    *nextTokPtr = ptr;
743
3
    return XML_TOK_INVALID;
744
39.4k
  case BT_QUEST:
745
39.4k
    return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
746
101k
  case BT_SOL:
747
101k
    return PREFIX(scanEndTag)(enc, ptr + MINBPC(enc), end, nextTokPtr);
748
21
  default:
749
21
    *nextTokPtr = ptr;
750
21
    return XML_TOK_INVALID;
751
1.24M
  }
752
#  ifdef XML_NS
753
  hadColon = 0;
754
#  endif
755
  /* we have a start-tag */
756
9.56M
  while (HAS_CHAR(enc, ptr, end)) {
757
9.56M
    switch (BYTE_TYPE(enc, ptr)) {
758
30.4M
      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
86.4k
    case BT_S:
777
92.9k
    case BT_CR:
778
95.6k
    case BT_LF: {
779
95.6k
      ptr += MINBPC(enc);
780
112k
      while (HAS_CHAR(enc, ptr, end)) {
781
112k
        switch (BYTE_TYPE(enc, ptr)) {
782
75.8k
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
783
2.42k
        case BT_GT:
784
2.42k
          goto gt;
785
5.96k
        case BT_SOL:
786
5.96k
          goto sol;
787
1.64k
        case BT_S:
788
15.1k
        case BT_CR:
789
17.1k
        case BT_LF:
790
17.1k
          ptr += MINBPC(enc);
791
17.1k
          continue;
792
5
        default:
793
5
          *nextTokPtr = ptr;
794
5
          return XML_TOK_INVALID;
795
112k
        }
796
87.1k
        return PREFIX(scanAtts)(enc, ptr, end, nextTokPtr);
797
112k
      }
798
66
      return XML_TOK_PARTIAL;
799
95.6k
    }
800
968k
    case BT_GT:
801
970k
    gt:
802
970k
      *nextTokPtr = ptr + MINBPC(enc);
803
970k
      return XML_TOK_START_TAG_NO_ATTS;
804
23.8k
    case BT_SOL:
805
29.7k
    sol:
806
29.7k
      ptr += MINBPC(enc);
807
29.7k
      REQUIRE_CHAR(enc, ptr, end);
808
29.7k
      if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
809
10
        *nextTokPtr = ptr;
810
10
        return XML_TOK_INVALID;
811
10
      }
812
29.7k
      *nextTokPtr = ptr + MINBPC(enc);
813
29.7k
      return XML_TOK_EMPTY_ELEMENT_NO_ATTS;
814
16
    default:
815
16
      *nextTokPtr = ptr;
816
16
      return XML_TOK_INVALID;
817
9.56M
    }
818
9.56M
  }
819
182
  return XML_TOK_PARTIAL;
820
1.08M
}
xmltok.c:normal_scanLt
Line
Count
Source
726
1.24M
               const char **nextTokPtr) {
727
#  ifdef XML_NS
728
  int hadColon;
729
#  endif
730
1.24M
  REQUIRE_CHAR(enc, ptr, end);
731
1.24M
  switch (BYTE_TYPE(enc, ptr)) {
732
1.05M
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
733
14.2k
  case BT_EXCL:
734
14.2k
    ptr += MINBPC(enc);
735
14.2k
    REQUIRE_CHAR(enc, ptr, end);
736
14.1k
    switch (BYTE_TYPE(enc, ptr)) {
737
11.9k
    case BT_MINUS:
738
11.9k
      return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
739
2.27k
    case BT_LSQB:
740
2.27k
      return PREFIX(scanCdataSection)(enc, ptr + MINBPC(enc), end, nextTokPtr);
741
14.1k
    }
742
3
    *nextTokPtr = ptr;
743
3
    return XML_TOK_INVALID;
744
39.4k
  case BT_QUEST:
745
39.4k
    return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
746
101k
  case BT_SOL:
747
101k
    return PREFIX(scanEndTag)(enc, ptr + MINBPC(enc), end, nextTokPtr);
748
21
  default:
749
21
    *nextTokPtr = ptr;
750
21
    return XML_TOK_INVALID;
751
1.24M
  }
752
#  ifdef XML_NS
753
  hadColon = 0;
754
#  endif
755
  /* we have a start-tag */
756
9.56M
  while (HAS_CHAR(enc, ptr, end)) {
757
9.56M
    switch (BYTE_TYPE(enc, ptr)) {
758
30.4M
      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
86.4k
    case BT_S:
777
92.9k
    case BT_CR:
778
95.6k
    case BT_LF: {
779
95.6k
      ptr += MINBPC(enc);
780
112k
      while (HAS_CHAR(enc, ptr, end)) {
781
112k
        switch (BYTE_TYPE(enc, ptr)) {
782
75.8k
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
783
2.42k
        case BT_GT:
784
2.42k
          goto gt;
785
5.96k
        case BT_SOL:
786
5.96k
          goto sol;
787
1.64k
        case BT_S:
788
15.1k
        case BT_CR:
789
17.1k
        case BT_LF:
790
17.1k
          ptr += MINBPC(enc);
791
17.1k
          continue;
792
5
        default:
793
5
          *nextTokPtr = ptr;
794
5
          return XML_TOK_INVALID;
795
112k
        }
796
87.1k
        return PREFIX(scanAtts)(enc, ptr, end, nextTokPtr);
797
112k
      }
798
66
      return XML_TOK_PARTIAL;
799
95.6k
    }
800
968k
    case BT_GT:
801
970k
    gt:
802
970k
      *nextTokPtr = ptr + MINBPC(enc);
803
970k
      return XML_TOK_START_TAG_NO_ATTS;
804
23.8k
    case BT_SOL:
805
29.7k
    sol:
806
29.7k
      ptr += MINBPC(enc);
807
29.7k
      REQUIRE_CHAR(enc, ptr, end);
808
29.7k
      if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
809
10
        *nextTokPtr = ptr;
810
10
        return XML_TOK_INVALID;
811
10
      }
812
29.7k
      *nextTokPtr = ptr + MINBPC(enc);
813
29.7k
      return XML_TOK_EMPTY_ELEMENT_NO_ATTS;
814
16
    default:
815
16
      *nextTokPtr = ptr;
816
16
      return XML_TOK_INVALID;
817
9.56M
    }
818
9.56M
  }
819
182
  return XML_TOK_PARTIAL;
820
1.08M
}
Unexecuted instantiation: xmltok.c:little2_scanLt
Unexecuted instantiation: xmltok.c:big2_scanLt
821
822
static int PTRCALL
823
PREFIX(contentTok)(const ENCODING *enc, const char *ptr, const char *end,
824
3.07M
                   const char **nextTokPtr) {
825
3.07M
  if (ptr >= end)
826
8.69k
    return XML_TOK_NONE;
827
3.06M
  if (MINBPC(enc) > 1) {
828
0
    size_t n = end - ptr;
829
0
    if (n & (MINBPC(enc) - 1)) {
830
0
      n &= ~(MINBPC(enc) - 1);
831
0
      if (n == 0)
832
0
        return XML_TOK_PARTIAL;
833
0
      end = ptr + n;
834
0
    }
835
0
  }
836
3.06M
  switch (BYTE_TYPE(enc, ptr)) {
837
1.24M
  case BT_LT:
838
1.24M
    return PREFIX(scanLt)(enc, ptr + MINBPC(enc), end, nextTokPtr);
839
28.4k
  case BT_AMP:
840
28.4k
    return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
841
738k
  case BT_CR:
842
738k
    ptr += MINBPC(enc);
843
738k
    if (! HAS_CHAR(enc, ptr, end))
844
18
      return XML_TOK_TRAILING_CR;
845
738k
    if (BYTE_TYPE(enc, ptr) == BT_LF)
846
121k
      ptr += MINBPC(enc);
847
738k
    *nextTokPtr = ptr;
848
738k
    return XML_TOK_DATA_NEWLINE;
849
511k
  case BT_LF:
850
511k
    *nextTokPtr = ptr + MINBPC(enc);
851
511k
    return XML_TOK_DATA_NEWLINE;
852
44.2k
  case BT_RSQB:
853
44.2k
    ptr += MINBPC(enc);
854
44.2k
    if (! HAS_CHAR(enc, ptr, end))
855
20
      return XML_TOK_TRAILING_RSQB;
856
44.2k
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
857
13.4k
      break;
858
30.7k
    ptr += MINBPC(enc);
859
30.7k
    if (! HAS_CHAR(enc, ptr, end))
860
8
      return XML_TOK_TRAILING_RSQB;
861
30.7k
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
862
30.7k
      ptr -= MINBPC(enc);
863
30.7k
      break;
864
30.7k
    }
865
1
    *nextTokPtr = ptr;
866
1
    return XML_TOK_INVALID;
867
68.1k
    INVALID_CASES(ptr, nextTokPtr)
868
462k
  default:
869
462k
    ptr += MINBPC(enc);
870
462k
    break;
871
3.06M
  }
872
10.6M
  while (HAS_CHAR(enc, ptr, end)) {
873
10.6M
    switch (BYTE_TYPE(enc, ptr)) {
874
0
#  define LEAD_CASE(n)                                                         \
875
99.2k
  case BT_LEAD##n:                                                             \
876
99.2k
    if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) {                       \
877
42
      *nextTokPtr = ptr;                                                       \
878
42
      return XML_TOK_DATA_CHARS;                                               \
879
42
    }                                                                          \
880
99.2k
    ptr += n;                                                                  \
881
99.2k
    break;
882
53.5k
      LEAD_CASE(2)
883
28.7k
      LEAD_CASE(3)
884
16.9k
      LEAD_CASE(4)
885
0
#  undef LEAD_CASE
886
273k
    case BT_RSQB:
887
273k
      if (HAS_CHARS(enc, ptr, end, 2)) {
888
273k
        if (! CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_RSQB)) {
889
96.9k
          ptr += MINBPC(enc);
890
96.9k
          break;
891
96.9k
        }
892
176k
        if (HAS_CHARS(enc, ptr, end, 3)) {
893
176k
          if (! CHAR_MATCHES(enc, ptr + 2 * MINBPC(enc), ASCII_GT)) {
894
176k
            ptr += MINBPC(enc);
895
176k
            break;
896
176k
          }
897
1
          *nextTokPtr = ptr + 2 * MINBPC(enc);
898
1
          return XML_TOK_INVALID;
899
176k
        }
900
176k
      }
901
      /* fall through */
902
9.69k
    case BT_AMP:
903
151k
    case BT_LT:
904
151k
    case BT_NONXML:
905
151k
    case BT_MALFORM:
906
151k
    case BT_TRAIL:
907
386k
    case BT_CR:
908
533k
    case BT_LF:
909
533k
      *nextTokPtr = ptr;
910
533k
      return XML_TOK_DATA_CHARS;
911
9.76M
    default:
912
9.76M
      ptr += MINBPC(enc);
913
9.76M
      break;
914
10.6M
    }
915
10.6M
  }
916
6.62k
  *nextTokPtr = ptr;
917
6.62k
  return XML_TOK_DATA_CHARS;
918
540k
}
xmltok.c:normal_contentTok
Line
Count
Source
824
3.07M
                   const char **nextTokPtr) {
825
3.07M
  if (ptr >= end)
826
8.69k
    return XML_TOK_NONE;
827
3.06M
  if (MINBPC(enc) > 1) {
828
0
    size_t n = end - ptr;
829
0
    if (n & (MINBPC(enc) - 1)) {
830
0
      n &= ~(MINBPC(enc) - 1);
831
0
      if (n == 0)
832
0
        return XML_TOK_PARTIAL;
833
0
      end = ptr + n;
834
0
    }
835
0
  }
836
3.06M
  switch (BYTE_TYPE(enc, ptr)) {
837
1.24M
  case BT_LT:
838
1.24M
    return PREFIX(scanLt)(enc, ptr + MINBPC(enc), end, nextTokPtr);
839
28.4k
  case BT_AMP:
840
28.4k
    return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
841
738k
  case BT_CR:
842
738k
    ptr += MINBPC(enc);
843
738k
    if (! HAS_CHAR(enc, ptr, end))
844
18
      return XML_TOK_TRAILING_CR;
845
738k
    if (BYTE_TYPE(enc, ptr) == BT_LF)
846
121k
      ptr += MINBPC(enc);
847
738k
    *nextTokPtr = ptr;
848
738k
    return XML_TOK_DATA_NEWLINE;
849
511k
  case BT_LF:
850
511k
    *nextTokPtr = ptr + MINBPC(enc);
851
511k
    return XML_TOK_DATA_NEWLINE;
852
44.2k
  case BT_RSQB:
853
44.2k
    ptr += MINBPC(enc);
854
44.2k
    if (! HAS_CHAR(enc, ptr, end))
855
20
      return XML_TOK_TRAILING_RSQB;
856
44.2k
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
857
13.4k
      break;
858
30.7k
    ptr += MINBPC(enc);
859
30.7k
    if (! HAS_CHAR(enc, ptr, end))
860
8
      return XML_TOK_TRAILING_RSQB;
861
30.7k
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
862
30.7k
      ptr -= MINBPC(enc);
863
30.7k
      break;
864
30.7k
    }
865
1
    *nextTokPtr = ptr;
866
1
    return XML_TOK_INVALID;
867
68.1k
    INVALID_CASES(ptr, nextTokPtr)
868
462k
  default:
869
462k
    ptr += MINBPC(enc);
870
462k
    break;
871
3.06M
  }
872
10.6M
  while (HAS_CHAR(enc, ptr, end)) {
873
10.6M
    switch (BYTE_TYPE(enc, ptr)) {
874
0
#  define LEAD_CASE(n)                                                         \
875
0
  case BT_LEAD##n:                                                             \
876
0
    if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) {                       \
877
0
      *nextTokPtr = ptr;                                                       \
878
0
      return XML_TOK_DATA_CHARS;                                               \
879
0
    }                                                                          \
880
0
    ptr += n;                                                                  \
881
0
    break;
882
53.5k
      LEAD_CASE(2)
883
28.7k
      LEAD_CASE(3)
884
16.9k
      LEAD_CASE(4)
885
0
#  undef LEAD_CASE
886
273k
    case BT_RSQB:
887
273k
      if (HAS_CHARS(enc, ptr, end, 2)) {
888
273k
        if (! CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_RSQB)) {
889
96.9k
          ptr += MINBPC(enc);
890
96.9k
          break;
891
96.9k
        }
892
176k
        if (HAS_CHARS(enc, ptr, end, 3)) {
893
176k
          if (! CHAR_MATCHES(enc, ptr + 2 * MINBPC(enc), ASCII_GT)) {
894
176k
            ptr += MINBPC(enc);
895
176k
            break;
896
176k
          }
897
1
          *nextTokPtr = ptr + 2 * MINBPC(enc);
898
1
          return XML_TOK_INVALID;
899
176k
        }
900
176k
      }
901
      /* fall through */
902
9.69k
    case BT_AMP:
903
151k
    case BT_LT:
904
151k
    case BT_NONXML:
905
151k
    case BT_MALFORM:
906
151k
    case BT_TRAIL:
907
386k
    case BT_CR:
908
533k
    case BT_LF:
909
533k
      *nextTokPtr = ptr;
910
533k
      return XML_TOK_DATA_CHARS;
911
9.76M
    default:
912
9.76M
      ptr += MINBPC(enc);
913
9.76M
      break;
914
10.6M
    }
915
10.6M
  }
916
6.62k
  *nextTokPtr = ptr;
917
6.62k
  return XML_TOK_DATA_CHARS;
918
540k
}
Unexecuted instantiation: xmltok.c:little2_contentTok
Unexecuted instantiation: xmltok.c:big2_contentTok
919
920
/* ptr points to character following "%" */
921
922
static int PTRCALL
923
PREFIX(scanPercent)(const ENCODING *enc, const char *ptr, const char *end,
924
4.96k
                    const char **nextTokPtr) {
925
4.96k
  REQUIRE_CHAR(enc, ptr, end);
926
4.93k
  switch (BYTE_TYPE(enc, ptr)) {
927
3.32k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
928
671
  case BT_S:
929
1.46k
  case BT_LF:
930
1.95k
  case BT_CR:
931
1.95k
  case BT_PERCNT:
932
1.95k
    *nextTokPtr = ptr;
933
1.95k
    return XML_TOK_PERCENT;
934
1
  default:
935
1
    *nextTokPtr = ptr;
936
1
    return XML_TOK_INVALID;
937
4.93k
  }
938
28.6k
  while (HAS_CHAR(enc, ptr, end)) {
939
28.6k
    switch (BYTE_TYPE(enc, ptr)) {
940
80.5k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
941
2.73k
    case BT_SEMI:
942
2.73k
      *nextTokPtr = ptr + MINBPC(enc);
943
2.73k
      return XML_TOK_PARAM_ENTITY_REF;
944
26
    default:
945
26
      *nextTokPtr = ptr;
946
26
      return XML_TOK_INVALID;
947
28.6k
    }
948
28.6k
  }
949
122
  return XML_TOK_PARTIAL;
950
2.93k
}
xmltok.c:normal_scanPercent
Line
Count
Source
924
4.96k
                    const char **nextTokPtr) {
925
4.96k
  REQUIRE_CHAR(enc, ptr, end);
926
4.93k
  switch (BYTE_TYPE(enc, ptr)) {
927
3.32k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
928
671
  case BT_S:
929
1.46k
  case BT_LF:
930
1.95k
  case BT_CR:
931
1.95k
  case BT_PERCNT:
932
1.95k
    *nextTokPtr = ptr;
933
1.95k
    return XML_TOK_PERCENT;
934
1
  default:
935
1
    *nextTokPtr = ptr;
936
1
    return XML_TOK_INVALID;
937
4.93k
  }
938
28.6k
  while (HAS_CHAR(enc, ptr, end)) {
939
28.6k
    switch (BYTE_TYPE(enc, ptr)) {
940
80.5k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
941
2.73k
    case BT_SEMI:
942
2.73k
      *nextTokPtr = ptr + MINBPC(enc);
943
2.73k
      return XML_TOK_PARAM_ENTITY_REF;
944
26
    default:
945
26
      *nextTokPtr = ptr;
946
26
      return XML_TOK_INVALID;
947
28.6k
    }
948
28.6k
  }
949
122
  return XML_TOK_PARTIAL;
950
2.93k
}
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
247k
                      const char **nextTokPtr) {
955
247k
  REQUIRE_CHAR(enc, ptr, end);
956
247k
  switch (BYTE_TYPE(enc, ptr)) {
957
246k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
958
4
  default:
959
4
    *nextTokPtr = ptr;
960
4
    return XML_TOK_INVALID;
961
247k
  }
962
1.82M
  while (HAS_CHAR(enc, ptr, end)) {
963
1.82M
    switch (BYTE_TYPE(enc, ptr)) {
964
5.72M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
965
47.1k
    case BT_CR:
966
51.5k
    case BT_LF:
967
243k
    case BT_S:
968
244k
    case BT_RPAR:
969
246k
    case BT_GT:
970
246k
    case BT_PERCNT:
971
247k
    case BT_VERBAR:
972
247k
      *nextTokPtr = ptr;
973
247k
      return XML_TOK_POUND_NAME;
974
24
    default:
975
24
      *nextTokPtr = ptr;
976
24
      return XML_TOK_INVALID;
977
1.82M
    }
978
1.82M
  }
979
230
  return -XML_TOK_POUND_NAME;
980
247k
}
xmltok.c:normal_scanPoundName
Line
Count
Source
954
247k
                      const char **nextTokPtr) {
955
247k
  REQUIRE_CHAR(enc, ptr, end);
956
247k
  switch (BYTE_TYPE(enc, ptr)) {
957
246k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
958
4
  default:
959
4
    *nextTokPtr = ptr;
960
4
    return XML_TOK_INVALID;
961
247k
  }
962
1.82M
  while (HAS_CHAR(enc, ptr, end)) {
963
1.82M
    switch (BYTE_TYPE(enc, ptr)) {
964
5.72M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
965
47.1k
    case BT_CR:
966
51.5k
    case BT_LF:
967
243k
    case BT_S:
968
244k
    case BT_RPAR:
969
246k
    case BT_GT:
970
246k
    case BT_PERCNT:
971
247k
    case BT_VERBAR:
972
247k
      *nextTokPtr = ptr;
973
247k
      return XML_TOK_POUND_NAME;
974
24
    default:
975
24
      *nextTokPtr = ptr;
976
24
      return XML_TOK_INVALID;
977
1.82M
    }
978
1.82M
  }
979
230
  return -XML_TOK_POUND_NAME;
980
247k
}
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
65.9k
                const char **nextTokPtr) {
985
8.06M
  while (HAS_CHAR(enc, ptr, end)) {
986
8.06M
    int t = BYTE_TYPE(enc, ptr);
987
8.06M
    switch (t) {
988
60.9k
      INVALID_CASES(ptr, nextTokPtr)
989
9.81k
    case BT_QUOT:
990
69.2k
    case BT_APOS:
991
69.2k
      ptr += MINBPC(enc);
992
69.2k
      if (t != open)
993
3.49k
        break;
994
65.7k
      if (! HAS_CHAR(enc, ptr, end))
995
681
        return -XML_TOK_LITERAL;
996
65.0k
      *nextTokPtr = ptr;
997
65.0k
      switch (BYTE_TYPE(enc, ptr)) {
998
10.0k
      case BT_S:
999
12.5k
      case BT_CR:
1000
48.0k
      case BT_LF:
1001
64.8k
      case BT_GT:
1002
64.8k
      case BT_PERCNT:
1003
65.0k
      case BT_LSQB:
1004
65.0k
        return XML_TOK_LITERAL;
1005
21
      default:
1006
21
        return XML_TOK_INVALID;
1007
65.0k
      }
1008
7.96M
    default:
1009
7.96M
      ptr += MINBPC(enc);
1010
7.96M
      break;
1011
8.06M
    }
1012
8.06M
  }
1013
118
  return XML_TOK_PARTIAL;
1014
65.9k
}
xmltok.c:normal_scanLit
Line
Count
Source
984
65.9k
                const char **nextTokPtr) {
985
8.06M
  while (HAS_CHAR(enc, ptr, end)) {
986
8.06M
    int t = BYTE_TYPE(enc, ptr);
987
8.06M
    switch (t) {
988
60.9k
      INVALID_CASES(ptr, nextTokPtr)
989
9.81k
    case BT_QUOT:
990
69.2k
    case BT_APOS:
991
69.2k
      ptr += MINBPC(enc);
992
69.2k
      if (t != open)
993
3.49k
        break;
994
65.7k
      if (! HAS_CHAR(enc, ptr, end))
995
681
        return -XML_TOK_LITERAL;
996
65.0k
      *nextTokPtr = ptr;
997
65.0k
      switch (BYTE_TYPE(enc, ptr)) {
998
10.0k
      case BT_S:
999
12.5k
      case BT_CR:
1000
48.0k
      case BT_LF:
1001
64.8k
      case BT_GT:
1002
64.8k
      case BT_PERCNT:
1003
65.0k
      case BT_LSQB:
1004
65.0k
        return XML_TOK_LITERAL;
1005
21
      default:
1006
21
        return XML_TOK_INVALID;
1007
65.0k
      }
1008
7.96M
    default:
1009
7.96M
      ptr += MINBPC(enc);
1010
7.96M
      break;
1011
8.06M
    }
1012
8.06M
  }
1013
118
  return XML_TOK_PARTIAL;
1014
65.9k
}
Unexecuted instantiation: xmltok.c:little2_scanLit
Unexecuted instantiation: xmltok.c:big2_scanLit
1015
1016
static int PTRCALL
1017
PREFIX(prologTok)(const ENCODING *enc, const char *ptr, const char *end,
1018
4.07M
                  const char **nextTokPtr) {
1019
4.07M
  int tok;
1020
4.07M
  if (ptr >= end)
1021
6.70k
    return XML_TOK_NONE;
1022
4.06M
  if (MINBPC(enc) > 1) {
1023
280
    size_t n = end - ptr;
1024
280
    if (n & (MINBPC(enc) - 1)) {
1025
40
      n &= ~(MINBPC(enc) - 1);
1026
40
      if (n == 0)
1027
4
        return XML_TOK_PARTIAL;
1028
36
      end = ptr + n;
1029
36
    }
1030
280
  }
1031
4.06M
  switch (BYTE_TYPE(enc, ptr)) {
1032
7.18k
  case BT_QUOT:
1033
7.18k
    return PREFIX(scanLit)(BT_QUOT, enc, ptr + MINBPC(enc), end, nextTokPtr);
1034
58.7k
  case BT_APOS:
1035
58.7k
    return PREFIX(scanLit)(BT_APOS, enc, ptr + MINBPC(enc), end, nextTokPtr);
1036
58.2k
  case BT_LT: {
1037
58.2k
    ptr += MINBPC(enc);
1038
58.2k
    REQUIRE_CHAR(enc, ptr, end);
1039
58.2k
    switch (BYTE_TYPE(enc, ptr)) {
1040
42.5k
    case BT_EXCL:
1041
42.5k
      return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1042
10.0k
    case BT_QUEST:
1043
10.0k
      return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1044
4.23k
    case BT_NMSTRT:
1045
5.47k
    case BT_HEX:
1046
5.47k
    case BT_NONASCII:
1047
5.52k
    case BT_LEAD2:
1048
5.56k
    case BT_LEAD3:
1049
5.57k
    case BT_LEAD4:
1050
5.57k
      *nextTokPtr = ptr - MINBPC(enc);
1051
5.57k
      return XML_TOK_INSTANCE_START;
1052
58.2k
    }
1053
23
    *nextTokPtr = ptr;
1054
23
    return XML_TOK_INVALID;
1055
58.2k
  }
1056
360k
  case BT_CR:
1057
360k
    if (ptr + MINBPC(enc) == end) {
1058
514
      *nextTokPtr = end;
1059
      /* indicate that this might be part of a CR/LF pair */
1060
514
      return -XML_TOK_PROLOG_S;
1061
514
    }
1062
    /* fall through */
1063
894k
  case BT_S:
1064
1.00M
  case BT_LF:
1065
1.45M
    for (;;) {
1066
1.45M
      ptr += MINBPC(enc);
1067
1.45M
      if (! HAS_CHAR(enc, ptr, end))
1068
303
        break;
1069
1.45M
      switch (BYTE_TYPE(enc, ptr)) {
1070
427k
      case BT_S:
1071
442k
      case BT_LF:
1072
442k
        break;
1073
8.28k
      case BT_CR:
1074
        /* don't split CR/LF pair */
1075
8.28k
        if (ptr + MINBPC(enc) != end)
1076
8.04k
          break;
1077
        /* fall through */
1078
1.00M
      default:
1079
1.00M
        *nextTokPtr = ptr;
1080
1.00M
        return XML_TOK_PROLOG_S;
1081
1.45M
      }
1082
1.45M
    }
1083
303
    *nextTokPtr = ptr;
1084
303
    return XML_TOK_PROLOG_S;
1085
4.96k
  case BT_PERCNT:
1086
4.96k
    return PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1087
6.98k
  case BT_COMMA:
1088
6.98k
    *nextTokPtr = ptr + MINBPC(enc);
1089
6.98k
    return XML_TOK_COMMA;
1090
2.76k
  case BT_LSQB:
1091
2.76k
    *nextTokPtr = ptr + MINBPC(enc);
1092
2.76k
    return XML_TOK_OPEN_BRACKET;
1093
1.04k
  case BT_RSQB:
1094
1.04k
    ptr += MINBPC(enc);
1095
1.04k
    if (! HAS_CHAR(enc, ptr, end))
1096
9
      return -XML_TOK_CLOSE_BRACKET;
1097
1.04k
    if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) {
1098
37
      REQUIRE_CHARS(enc, ptr, end, 2);
1099
35
      if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_GT)) {
1100
8
        *nextTokPtr = ptr + 2 * MINBPC(enc);
1101
8
        return XML_TOK_COND_SECT_CLOSE;
1102
8
      }
1103
35
    }
1104
1.03k
    *nextTokPtr = ptr;
1105
1.03k
    return XML_TOK_CLOSE_BRACKET;
1106
1.62M
  case BT_LPAR:
1107
1.62M
    *nextTokPtr = ptr + MINBPC(enc);
1108
1.62M
    return XML_TOK_OPEN_PAREN;
1109
314k
  case BT_RPAR:
1110
314k
    ptr += MINBPC(enc);
1111
314k
    if (! HAS_CHAR(enc, ptr, end))
1112
107
      return -XML_TOK_CLOSE_PAREN;
1113
314k
    switch (BYTE_TYPE(enc, ptr)) {
1114
16.9k
    case BT_AST:
1115
16.9k
      *nextTokPtr = ptr + MINBPC(enc);
1116
16.9k
      return XML_TOK_CLOSE_PAREN_ASTERISK;
1117
6.96k
    case BT_QUEST:
1118
6.96k
      *nextTokPtr = ptr + MINBPC(enc);
1119
6.96k
      return XML_TOK_CLOSE_PAREN_QUESTION;
1120
6.83k
    case BT_PLUS:
1121
6.83k
      *nextTokPtr = ptr + MINBPC(enc);
1122
6.83k
      return XML_TOK_CLOSE_PAREN_PLUS;
1123
9.65k
    case BT_CR:
1124
10.4k
    case BT_LF:
1125
249k
    case BT_S:
1126
250k
    case BT_GT:
1127
251k
    case BT_COMMA:
1128
257k
    case BT_VERBAR:
1129
283k
    case BT_RPAR:
1130
283k
      *nextTokPtr = ptr;
1131
283k
      return XML_TOK_CLOSE_PAREN;
1132
314k
    }
1133
9
    *nextTokPtr = ptr;
1134
9
    return XML_TOK_INVALID;
1135
24.5k
  case BT_VERBAR:
1136
24.5k
    *nextTokPtr = ptr + MINBPC(enc);
1137
24.5k
    return XML_TOK_OR;
1138
36.4k
  case BT_GT:
1139
36.4k
    *nextTokPtr = ptr + MINBPC(enc);
1140
36.4k
    return XML_TOK_DECL_CLOSE;
1141
247k
  case BT_NUM:
1142
247k
    return PREFIX(scanPoundName)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1143
0
#  define LEAD_CASE(n)                                                         \
1144
3.18k
  case BT_LEAD##n:                                                             \
1145
3.18k
    if (end - ptr < n)                                                         \
1146
86
      return XML_TOK_PARTIAL_CHAR;                                             \
1147
3.09k
    if (IS_INVALID_CHAR(enc, ptr, n)) {                                        \
1148
84
      *nextTokPtr = ptr;                                                       \
1149
84
      return XML_TOK_INVALID;                                                  \
1150
84
    }                                                                          \
1151
3.09k
    if (IS_NMSTRT_CHAR(enc, ptr, n)) {                                         \
1152
2.62k
      ptr += n;                                                                \
1153
2.62k
      tok = XML_TOK_NAME;                                                      \
1154
2.62k
      break;                                                                   \
1155
2.62k
    }                                                                          \
1156
3.01k
    if (IS_NAME_CHAR(enc, ptr, n)) {                                           \
1157
303
      ptr += n;                                                                \
1158
303
      tok = XML_TOK_NMTOKEN;                                                   \
1159
303
      break;                                                                   \
1160
303
    }                                                                          \
1161
388
    *nextTokPtr = ptr;                                                         \
1162
85
    return XML_TOK_INVALID;
1163
2.61k
    LEAD_CASE(2)
1164
6.73k
    LEAD_CASE(3)
1165
330
    LEAD_CASE(4)
1166
0
#  undef LEAD_CASE
1167
386k
  case BT_NMSTRT:
1168
666k
  case BT_HEX:
1169
666k
    tok = XML_TOK_NAME;
1170
666k
    ptr += MINBPC(enc);
1171
666k
    break;
1172
565
  case BT_DIGIT:
1173
5.89k
  case BT_NAME:
1174
6.56k
  case BT_MINUS:
1175
#  ifdef XML_NS
1176
  case BT_COLON:
1177
#  endif
1178
6.56k
    tok = XML_TOK_NMTOKEN;
1179
6.56k
    ptr += MINBPC(enc);
1180
6.56k
    break;
1181
217
  case BT_NONASCII:
1182
217
    if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {
1183
174
      ptr += MINBPC(enc);
1184
174
      tok = XML_TOK_NAME;
1185
174
      break;
1186
174
    }
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
75
  default:
1194
75
    *nextTokPtr = ptr;
1195
75
    return XML_TOK_INVALID;
1196
4.06M
  }
1197
12.2M
  while (HAS_CHAR(enc, ptr, end)) {
1198
12.2M
    switch (BYTE_TYPE(enc, ptr)) {
1199
30.8M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1200
11.6k
    case BT_GT:
1201
268k
    case BT_RPAR:
1202
269k
    case BT_COMMA:
1203
278k
    case BT_VERBAR:
1204
281k
    case BT_LSQB:
1205
281k
    case BT_PERCNT:
1206
356k
    case BT_S:
1207
618k
    case BT_CR:
1208
668k
    case BT_LF:
1209
668k
      *nextTokPtr = ptr;
1210
668k
      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
369
    case BT_PLUS:
1232
369
      if (tok == XML_TOK_NMTOKEN) {
1233
2
        *nextTokPtr = ptr;
1234
2
        return XML_TOK_INVALID;
1235
2
      }
1236
367
      *nextTokPtr = ptr + MINBPC(enc);
1237
367
      return XML_TOK_NAME_PLUS;
1238
6.52k
    case BT_AST:
1239
6.52k
      if (tok == XML_TOK_NMTOKEN) {
1240
2
        *nextTokPtr = ptr;
1241
2
        return XML_TOK_INVALID;
1242
2
      }
1243
6.52k
      *nextTokPtr = ptr + MINBPC(enc);
1244
6.52k
      return XML_TOK_NAME_ASTERISK;
1245
459
    case BT_QUEST:
1246
459
      if (tok == XML_TOK_NMTOKEN) {
1247
2
        *nextTokPtr = ptr;
1248
2
        return XML_TOK_INVALID;
1249
2
      }
1250
457
      *nextTokPtr = ptr + MINBPC(enc);
1251
457
      return XML_TOK_NAME_QUESTION;
1252
79
    default:
1253
79
      *nextTokPtr = ptr;
1254
79
      return XML_TOK_INVALID;
1255
12.2M
    }
1256
12.2M
  }
1257
825
  return -tok;
1258
676k
}
xmltok.c:normal_prologTok
Line
Count
Source
1018
4.07M
                  const char **nextTokPtr) {
1019
4.07M
  int tok;
1020
4.07M
  if (ptr >= end)
1021
6.70k
    return XML_TOK_NONE;
1022
4.06M
  if (MINBPC(enc) > 1) {
1023
0
    size_t n = end - ptr;
1024
0
    if (n & (MINBPC(enc) - 1)) {
1025
0
      n &= ~(MINBPC(enc) - 1);
1026
0
      if (n == 0)
1027
0
        return XML_TOK_PARTIAL;
1028
0
      end = ptr + n;
1029
0
    }
1030
0
  }
1031
4.06M
  switch (BYTE_TYPE(enc, ptr)) {
1032
7.18k
  case BT_QUOT:
1033
7.18k
    return PREFIX(scanLit)(BT_QUOT, enc, ptr + MINBPC(enc), end, nextTokPtr);
1034
58.7k
  case BT_APOS:
1035
58.7k
    return PREFIX(scanLit)(BT_APOS, enc, ptr + MINBPC(enc), end, nextTokPtr);
1036
58.2k
  case BT_LT: {
1037
58.2k
    ptr += MINBPC(enc);
1038
58.2k
    REQUIRE_CHAR(enc, ptr, end);
1039
58.2k
    switch (BYTE_TYPE(enc, ptr)) {
1040
42.5k
    case BT_EXCL:
1041
42.5k
      return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1042
10.0k
    case BT_QUEST:
1043
10.0k
      return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1044
4.23k
    case BT_NMSTRT:
1045
5.47k
    case BT_HEX:
1046
5.47k
    case BT_NONASCII:
1047
5.52k
    case BT_LEAD2:
1048
5.56k
    case BT_LEAD3:
1049
5.57k
    case BT_LEAD4:
1050
5.57k
      *nextTokPtr = ptr - MINBPC(enc);
1051
5.57k
      return XML_TOK_INSTANCE_START;
1052
58.2k
    }
1053
23
    *nextTokPtr = ptr;
1054
23
    return XML_TOK_INVALID;
1055
58.2k
  }
1056
360k
  case BT_CR:
1057
360k
    if (ptr + MINBPC(enc) == end) {
1058
514
      *nextTokPtr = end;
1059
      /* indicate that this might be part of a CR/LF pair */
1060
514
      return -XML_TOK_PROLOG_S;
1061
514
    }
1062
    /* fall through */
1063
894k
  case BT_S:
1064
1.00M
  case BT_LF:
1065
1.45M
    for (;;) {
1066
1.45M
      ptr += MINBPC(enc);
1067
1.45M
      if (! HAS_CHAR(enc, ptr, end))
1068
303
        break;
1069
1.45M
      switch (BYTE_TYPE(enc, ptr)) {
1070
427k
      case BT_S:
1071
442k
      case BT_LF:
1072
442k
        break;
1073
8.28k
      case BT_CR:
1074
        /* don't split CR/LF pair */
1075
8.28k
        if (ptr + MINBPC(enc) != end)
1076
8.04k
          break;
1077
        /* fall through */
1078
1.00M
      default:
1079
1.00M
        *nextTokPtr = ptr;
1080
1.00M
        return XML_TOK_PROLOG_S;
1081
1.45M
      }
1082
1.45M
    }
1083
303
    *nextTokPtr = ptr;
1084
303
    return XML_TOK_PROLOG_S;
1085
4.96k
  case BT_PERCNT:
1086
4.96k
    return PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1087
6.98k
  case BT_COMMA:
1088
6.98k
    *nextTokPtr = ptr + MINBPC(enc);
1089
6.98k
    return XML_TOK_COMMA;
1090
2.76k
  case BT_LSQB:
1091
2.76k
    *nextTokPtr = ptr + MINBPC(enc);
1092
2.76k
    return XML_TOK_OPEN_BRACKET;
1093
1.04k
  case BT_RSQB:
1094
1.04k
    ptr += MINBPC(enc);
1095
1.04k
    if (! HAS_CHAR(enc, ptr, end))
1096
9
      return -XML_TOK_CLOSE_BRACKET;
1097
1.04k
    if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) {
1098
37
      REQUIRE_CHARS(enc, ptr, end, 2);
1099
35
      if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_GT)) {
1100
8
        *nextTokPtr = ptr + 2 * MINBPC(enc);
1101
8
        return XML_TOK_COND_SECT_CLOSE;
1102
8
      }
1103
35
    }
1104
1.03k
    *nextTokPtr = ptr;
1105
1.03k
    return XML_TOK_CLOSE_BRACKET;
1106
1.62M
  case BT_LPAR:
1107
1.62M
    *nextTokPtr = ptr + MINBPC(enc);
1108
1.62M
    return XML_TOK_OPEN_PAREN;
1109
314k
  case BT_RPAR:
1110
314k
    ptr += MINBPC(enc);
1111
314k
    if (! HAS_CHAR(enc, ptr, end))
1112
107
      return -XML_TOK_CLOSE_PAREN;
1113
314k
    switch (BYTE_TYPE(enc, ptr)) {
1114
16.9k
    case BT_AST:
1115
16.9k
      *nextTokPtr = ptr + MINBPC(enc);
1116
16.9k
      return XML_TOK_CLOSE_PAREN_ASTERISK;
1117
6.96k
    case BT_QUEST:
1118
6.96k
      *nextTokPtr = ptr + MINBPC(enc);
1119
6.96k
      return XML_TOK_CLOSE_PAREN_QUESTION;
1120
6.83k
    case BT_PLUS:
1121
6.83k
      *nextTokPtr = ptr + MINBPC(enc);
1122
6.83k
      return XML_TOK_CLOSE_PAREN_PLUS;
1123
9.65k
    case BT_CR:
1124
10.4k
    case BT_LF:
1125
249k
    case BT_S:
1126
250k
    case BT_GT:
1127
251k
    case BT_COMMA:
1128
257k
    case BT_VERBAR:
1129
283k
    case BT_RPAR:
1130
283k
      *nextTokPtr = ptr;
1131
283k
      return XML_TOK_CLOSE_PAREN;
1132
314k
    }
1133
9
    *nextTokPtr = ptr;
1134
9
    return XML_TOK_INVALID;
1135
24.5k
  case BT_VERBAR:
1136
24.5k
    *nextTokPtr = ptr + MINBPC(enc);
1137
24.5k
    return XML_TOK_OR;
1138
36.4k
  case BT_GT:
1139
36.4k
    *nextTokPtr = ptr + MINBPC(enc);
1140
36.4k
    return XML_TOK_DECL_CLOSE;
1141
247k
  case BT_NUM:
1142
247k
    return PREFIX(scanPoundName)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1143
0
#  define LEAD_CASE(n)                                                         \
1144
0
  case BT_LEAD##n:                                                             \
1145
0
    if (end - ptr < n)                                                         \
1146
0
      return XML_TOK_PARTIAL_CHAR;                                             \
1147
0
    if (IS_INVALID_CHAR(enc, ptr, n)) {                                        \
1148
0
      *nextTokPtr = ptr;                                                       \
1149
0
      return XML_TOK_INVALID;                                                  \
1150
0
    }                                                                          \
1151
0
    if (IS_NMSTRT_CHAR(enc, ptr, n)) {                                         \
1152
0
      ptr += n;                                                                \
1153
0
      tok = XML_TOK_NAME;                                                      \
1154
0
      break;                                                                   \
1155
0
    }                                                                          \
1156
0
    if (IS_NAME_CHAR(enc, ptr, n)) {                                           \
1157
0
      ptr += n;                                                                \
1158
0
      tok = XML_TOK_NMTOKEN;                                                   \
1159
0
      break;                                                                   \
1160
0
    }                                                                          \
1161
0
    *nextTokPtr = ptr;                                                         \
1162
0
    return XML_TOK_INVALID;
1163
2.61k
    LEAD_CASE(2)
1164
6.73k
    LEAD_CASE(3)
1165
190
    LEAD_CASE(4)
1166
0
#  undef LEAD_CASE
1167
386k
  case BT_NMSTRT:
1168
666k
  case BT_HEX:
1169
666k
    tok = XML_TOK_NAME;
1170
666k
    ptr += MINBPC(enc);
1171
666k
    break;
1172
565
  case BT_DIGIT:
1173
5.89k
  case BT_NAME:
1174
6.56k
  case BT_MINUS:
1175
#  ifdef XML_NS
1176
  case BT_COLON:
1177
#  endif
1178
6.56k
    tok = XML_TOK_NMTOKEN;
1179
6.56k
    ptr += MINBPC(enc);
1180
6.56k
    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
38
  default:
1194
38
    *nextTokPtr = ptr;
1195
38
    return XML_TOK_INVALID;
1196
4.06M
  }
1197
12.1M
  while (HAS_CHAR(enc, ptr, end)) {
1198
12.1M
    switch (BYTE_TYPE(enc, ptr)) {
1199
30.5M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1200
11.6k
    case BT_GT:
1201
268k
    case BT_RPAR:
1202
269k
    case BT_COMMA:
1203
278k
    case BT_VERBAR:
1204
281k
    case BT_LSQB:
1205
281k
    case BT_PERCNT:
1206
356k
    case BT_S:
1207
618k
    case BT_CR:
1208
668k
    case BT_LF:
1209
668k
      *nextTokPtr = ptr;
1210
668k
      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
369
    case BT_PLUS:
1232
369
      if (tok == XML_TOK_NMTOKEN) {
1233
2
        *nextTokPtr = ptr;
1234
2
        return XML_TOK_INVALID;
1235
2
      }
1236
367
      *nextTokPtr = ptr + MINBPC(enc);
1237
367
      return XML_TOK_NAME_PLUS;
1238
6.52k
    case BT_AST:
1239
6.52k
      if (tok == XML_TOK_NMTOKEN) {
1240
2
        *nextTokPtr = ptr;
1241
2
        return XML_TOK_INVALID;
1242
2
      }
1243
6.52k
      *nextTokPtr = ptr + MINBPC(enc);
1244
6.52k
      return XML_TOK_NAME_ASTERISK;
1245
459
    case BT_QUEST:
1246
459
      if (tok == XML_TOK_NMTOKEN) {
1247
2
        *nextTokPtr = ptr;
1248
2
        return XML_TOK_INVALID;
1249
2
      }
1250
457
      *nextTokPtr = ptr + MINBPC(enc);
1251
457
      return XML_TOK_NAME_QUESTION;
1252
57
    default:
1253
57
      *nextTokPtr = ptr;
1254
57
      return XML_TOK_INVALID;
1255
12.1M
    }
1256
12.1M
  }
1257
775
  return -tok;
1258
676k
}
xmltok.c:little2_prologTok
Line
Count
Source
1018
147
                  const char **nextTokPtr) {
1019
147
  int tok;
1020
147
  if (ptr >= end)
1021
2
    return XML_TOK_NONE;
1022
145
  if (MINBPC(enc) > 1) {
1023
145
    size_t n = end - ptr;
1024
145
    if (n & (MINBPC(enc) - 1)) {
1025
24
      n &= ~(MINBPC(enc) - 1);
1026
24
      if (n == 0)
1027
2
        return XML_TOK_PARTIAL;
1028
22
      end = ptr + n;
1029
22
    }
1030
145
  }
1031
143
  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
72
    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
113
  case BT_NONASCII:
1182
113
    if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {
1183
90
      ptr += MINBPC(enc);
1184
90
      tok = XML_TOK_NAME;
1185
90
      break;
1186
90
    }
1187
23
    if (IS_NAME_CHAR_MINBPC(enc, ptr)) {
1188
10
      ptr += MINBPC(enc);
1189
10
      tok = XML_TOK_NMTOKEN;
1190
10
      break;
1191
10
    }
1192
    /* fall through */
1193
19
  default:
1194
19
    *nextTokPtr = ptr;
1195
19
    return XML_TOK_INVALID;
1196
143
  }
1197
1.33k
  while (HAS_CHAR(enc, ptr, end)) {
1198
1.33k
    switch (BYTE_TYPE(enc, ptr)) {
1199
6.38k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1200
0
    case BT_GT:
1201
0
    case BT_RPAR:
1202
0
    case BT_COMMA:
1203
0
    case BT_VERBAR:
1204
0
    case BT_LSQB:
1205
0
    case BT_PERCNT:
1206
0
    case BT_S:
1207
0
    case BT_CR:
1208
0
    case BT_LF:
1209
0
      *nextTokPtr = ptr;
1210
0
      return tok;
1211
#  ifdef XML_NS
1212
    case BT_COLON:
1213
      ptr += MINBPC(enc);
1214
      switch (tok) {
1215
      case XML_TOK_NAME:
1216
        REQUIRE_CHAR(enc, ptr, end);
1217
        tok = XML_TOK_PREFIXED_NAME;
1218
        switch (BYTE_TYPE(enc, ptr)) {
1219
          CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1220
        default:
1221
          tok = XML_TOK_NMTOKEN;
1222
          break;
1223
        }
1224
        break;
1225
      case XML_TOK_PREFIXED_NAME:
1226
        tok = XML_TOK_NMTOKEN;
1227
        break;
1228
      }
1229
      break;
1230
#  endif
1231
0
    case BT_PLUS:
1232
0
      if (tok == XML_TOK_NMTOKEN) {
1233
0
        *nextTokPtr = ptr;
1234
0
        return XML_TOK_INVALID;
1235
0
      }
1236
0
      *nextTokPtr = ptr + MINBPC(enc);
1237
0
      return XML_TOK_NAME_PLUS;
1238
0
    case BT_AST:
1239
0
      if (tok == XML_TOK_NMTOKEN) {
1240
0
        *nextTokPtr = ptr;
1241
0
        return XML_TOK_INVALID;
1242
0
      }
1243
0
      *nextTokPtr = ptr + MINBPC(enc);
1244
0
      return XML_TOK_NAME_ASTERISK;
1245
0
    case BT_QUEST:
1246
0
      if (tok == XML_TOK_NMTOKEN) {
1247
0
        *nextTokPtr = ptr;
1248
0
        return XML_TOK_INVALID;
1249
0
      }
1250
0
      *nextTokPtr = ptr + MINBPC(enc);
1251
0
      return XML_TOK_NAME_QUESTION;
1252
13
    default:
1253
13
      *nextTokPtr = ptr;
1254
13
      return XML_TOK_INVALID;
1255
1.33k
    }
1256
1.33k
  }
1257
30
  return -tok;
1258
100
}
xmltok.c:big2_prologTok
Line
Count
Source
1018
137
                  const char **nextTokPtr) {
1019
137
  int tok;
1020
137
  if (ptr >= end)
1021
2
    return XML_TOK_NONE;
1022
135
  if (MINBPC(enc) > 1) {
1023
135
    size_t n = end - ptr;
1024
135
    if (n & (MINBPC(enc) - 1)) {
1025
16
      n &= ~(MINBPC(enc) - 1);
1026
16
      if (n == 0)
1027
2
        return XML_TOK_PARTIAL;
1028
14
      end = ptr + n;
1029
14
    }
1030
135
  }
1031
133
  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
104
  case BT_NONASCII:
1182
104
    if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {
1183
84
      ptr += MINBPC(enc);
1184
84
      tok = XML_TOK_NAME;
1185
84
      break;
1186
84
    }
1187
20
    if (IS_NAME_CHAR_MINBPC(enc, ptr)) {
1188
8
      ptr += MINBPC(enc);
1189
8
      tok = XML_TOK_NMTOKEN;
1190
8
      break;
1191
8
    }
1192
    /* fall through */
1193
18
  default:
1194
18
    *nextTokPtr = ptr;
1195
18
    return XML_TOK_INVALID;
1196
133
  }
1197
53.0k
  while (HAS_CHAR(enc, ptr, end)) {
1198
53.0k
    switch (BYTE_TYPE(enc, ptr)) {
1199
264k
      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
53.0k
    }
1256
53.0k
  }
1257
20
  return -tok;
1258
92
}
1259
1260
static int PTRCALL
1261
PREFIX(attributeValueTok)(const ENCODING *enc, const char *ptr, const char *end,
1262
2.04M
                          const char **nextTokPtr) {
1263
2.04M
  const char *start;
1264
2.04M
  if (ptr >= end)
1265
98.5k
    return XML_TOK_NONE;
1266
1.95M
  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.95M
  start = ptr;
1275
16.4M
  while (HAS_CHAR(enc, ptr, end)) {
1276
16.4M
    switch (BYTE_TYPE(enc, ptr)) {
1277
0
#  define LEAD_CASE(n)                                                         \
1278
89.4k
  case BT_LEAD##n:                                                             \
1279
89.4k
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1280
89.4k
    break;
1281
42.8k
      LEAD_CASE(2)
1282
11.0k
      LEAD_CASE(3)
1283
35.5k
      LEAD_CASE(4)
1284
0
#  undef LEAD_CASE
1285
100k
    case BT_AMP:
1286
100k
      if (ptr == start)
1287
82.0k
        return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1288
18.3k
      *nextTokPtr = ptr;
1289
18.3k
      return XML_TOK_DATA_CHARS;
1290
1
    case BT_LT:
1291
      /* this is for inside entity references */
1292
1
      *nextTokPtr = ptr;
1293
1
      return XML_TOK_INVALID;
1294
389k
    case BT_LF:
1295
389k
      if (ptr == start) {
1296
328k
        *nextTokPtr = ptr + MINBPC(enc);
1297
328k
        return XML_TOK_DATA_NEWLINE;
1298
328k
      }
1299
61.4k
      *nextTokPtr = ptr;
1300
61.4k
      return XML_TOK_DATA_CHARS;
1301
764k
    case BT_CR:
1302
764k
      if (ptr == start) {
1303
627k
        ptr += MINBPC(enc);
1304
627k
        if (! HAS_CHAR(enc, ptr, end))
1305
1.01k
          return XML_TOK_TRAILING_CR;
1306
626k
        if (BYTE_TYPE(enc, ptr) == BT_LF)
1307
194k
          ptr += MINBPC(enc);
1308
626k
        *nextTokPtr = ptr;
1309
626k
        return XML_TOK_DATA_NEWLINE;
1310
627k
      }
1311
137k
      *nextTokPtr = ptr;
1312
137k
      return XML_TOK_DATA_CHARS;
1313
633k
    case BT_S:
1314
633k
      if (ptr == start) {
1315
432k
        *nextTokPtr = ptr + MINBPC(enc);
1316
432k
        return XML_TOK_ATTRIBUTE_VALUE_S;
1317
432k
      }
1318
200k
      *nextTokPtr = ptr;
1319
200k
      return XML_TOK_DATA_CHARS;
1320
14.4M
    default:
1321
14.4M
      ptr += MINBPC(enc);
1322
14.4M
      break;
1323
16.4M
    }
1324
16.4M
  }
1325
63.3k
  *nextTokPtr = ptr;
1326
63.3k
  return XML_TOK_DATA_CHARS;
1327
1.95M
}
xmltok.c:normal_attributeValueTok
Line
Count
Source
1262
2.04M
                          const char **nextTokPtr) {
1263
2.04M
  const char *start;
1264
2.04M
  if (ptr >= end)
1265
98.5k
    return XML_TOK_NONE;
1266
1.95M
  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.95M
  start = ptr;
1275
16.4M
  while (HAS_CHAR(enc, ptr, end)) {
1276
16.4M
    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
42.8k
      LEAD_CASE(2)
1282
11.0k
      LEAD_CASE(3)
1283
35.5k
      LEAD_CASE(4)
1284
0
#  undef LEAD_CASE
1285
100k
    case BT_AMP:
1286
100k
      if (ptr == start)
1287
82.0k
        return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1288
18.3k
      *nextTokPtr = ptr;
1289
18.3k
      return XML_TOK_DATA_CHARS;
1290
1
    case BT_LT:
1291
      /* this is for inside entity references */
1292
1
      *nextTokPtr = ptr;
1293
1
      return XML_TOK_INVALID;
1294
389k
    case BT_LF:
1295
389k
      if (ptr == start) {
1296
328k
        *nextTokPtr = ptr + MINBPC(enc);
1297
328k
        return XML_TOK_DATA_NEWLINE;
1298
328k
      }
1299
61.4k
      *nextTokPtr = ptr;
1300
61.4k
      return XML_TOK_DATA_CHARS;
1301
764k
    case BT_CR:
1302
764k
      if (ptr == start) {
1303
627k
        ptr += MINBPC(enc);
1304
627k
        if (! HAS_CHAR(enc, ptr, end))
1305
1.01k
          return XML_TOK_TRAILING_CR;
1306
626k
        if (BYTE_TYPE(enc, ptr) == BT_LF)
1307
194k
          ptr += MINBPC(enc);
1308
626k
        *nextTokPtr = ptr;
1309
626k
        return XML_TOK_DATA_NEWLINE;
1310
627k
      }
1311
137k
      *nextTokPtr = ptr;
1312
137k
      return XML_TOK_DATA_CHARS;
1313
633k
    case BT_S:
1314
633k
      if (ptr == start) {
1315
432k
        *nextTokPtr = ptr + MINBPC(enc);
1316
432k
        return XML_TOK_ATTRIBUTE_VALUE_S;
1317
432k
      }
1318
200k
      *nextTokPtr = ptr;
1319
200k
      return XML_TOK_DATA_CHARS;
1320
14.4M
    default:
1321
14.4M
      ptr += MINBPC(enc);
1322
14.4M
      break;
1323
16.4M
    }
1324
16.4M
  }
1325
63.3k
  *nextTokPtr = ptr;
1326
63.3k
  return XML_TOK_DATA_CHARS;
1327
1.95M
}
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.83k
                   const char **badPtr) {
1451
2.83k
  ptr += MINBPC(enc);
1452
2.83k
  end -= MINBPC(enc);
1453
536k
  for (; HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
1454
536k
    switch (BYTE_TYPE(enc, ptr)) {
1455
226k
    case BT_DIGIT:
1456
350k
    case BT_HEX:
1457
351k
    case BT_MINUS:
1458
351k
    case BT_APOS:
1459
352k
    case BT_LPAR:
1460
388k
    case BT_RPAR:
1461
389k
    case BT_PLUS:
1462
389k
    case BT_COMMA:
1463
446k
    case BT_SOL:
1464
447k
    case BT_EQUALS:
1465
451k
    case BT_QUEST:
1466
453k
    case BT_CR:
1467
454k
    case BT_LF:
1468
454k
    case BT_SEMI:
1469
454k
    case BT_EXCL:
1470
456k
    case BT_AST:
1471
458k
    case BT_PERCNT:
1472
465k
    case BT_NUM:
1473
#  ifdef XML_NS
1474
    case BT_COLON:
1475
#  endif
1476
465k
      break;
1477
1.66k
    case BT_S:
1478
1.66k
      if (CHAR_MATCHES(enc, ptr, ASCII_TAB)) {
1479
1
        *badPtr = ptr;
1480
1
        return 0;
1481
1
      }
1482
1.66k
      break;
1483
3.10k
    case BT_NAME:
1484
67.7k
    case BT_NMSTRT:
1485
67.7k
      if (! (BYTE_TO_ASCII(enc, ptr) & ~0x7f))
1486
67.7k
        break;
1487
      /* fall through */
1488
1.56k
    default:
1489
1.56k
      switch (BYTE_TO_ASCII(enc, ptr)) {
1490
1.35k
      case 0x24: /* $ */
1491
1.55k
      case 0x40: /* @ */
1492
1.55k
        break;
1493
11
      default:
1494
11
        *badPtr = ptr;
1495
11
        return 0;
1496
1.56k
      }
1497
1.55k
      break;
1498
536k
    }
1499
536k
  }
1500
2.82k
  return 1;
1501
2.83k
}
xmltok.c:normal_isPublicId
Line
Count
Source
1450
2.83k
                   const char **badPtr) {
1451
2.83k
  ptr += MINBPC(enc);
1452
2.83k
  end -= MINBPC(enc);
1453
536k
  for (; HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
1454
536k
    switch (BYTE_TYPE(enc, ptr)) {
1455
226k
    case BT_DIGIT:
1456
350k
    case BT_HEX:
1457
351k
    case BT_MINUS:
1458
351k
    case BT_APOS:
1459
352k
    case BT_LPAR:
1460
388k
    case BT_RPAR:
1461
389k
    case BT_PLUS:
1462
389k
    case BT_COMMA:
1463
446k
    case BT_SOL:
1464
447k
    case BT_EQUALS:
1465
451k
    case BT_QUEST:
1466
453k
    case BT_CR:
1467
454k
    case BT_LF:
1468
454k
    case BT_SEMI:
1469
454k
    case BT_EXCL:
1470
456k
    case BT_AST:
1471
458k
    case BT_PERCNT:
1472
465k
    case BT_NUM:
1473
#  ifdef XML_NS
1474
    case BT_COLON:
1475
#  endif
1476
465k
      break;
1477
1.66k
    case BT_S:
1478
1.66k
      if (CHAR_MATCHES(enc, ptr, ASCII_TAB)) {
1479
1
        *badPtr = ptr;
1480
1
        return 0;
1481
1
      }
1482
1.66k
      break;
1483
3.10k
    case BT_NAME:
1484
67.7k
    case BT_NMSTRT:
1485
67.7k
      if (! (BYTE_TO_ASCII(enc, ptr) & ~0x7f))
1486
67.7k
        break;
1487
      /* fall through */
1488
1.56k
    default:
1489
1.56k
      switch (BYTE_TO_ASCII(enc, ptr)) {
1490
1.35k
      case 0x24: /* $ */
1491
1.55k
      case 0x40: /* @ */
1492
1.55k
        break;
1493
11
      default:
1494
11
        *badPtr = ptr;
1495
11
        return 0;
1496
1.56k
      }
1497
1.55k
      break;
1498
536k
    }
1499
536k
  }
1500
2.82k
  return 1;
1501
2.83k
}
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.08M
                ATTRIBUTE *atts) {
1511
1.08M
  enum { other, inName, inValue } state = inName;
1512
1.08M
  int nAtts = 0;
1513
1.08M
  int open = 0; /* defined when state == inValue;
1514
                   initialization just to shut up compilers */
1515
1516
55.5M
  for (ptr += MINBPC(enc);; ptr += MINBPC(enc)) {
1517
55.5M
    switch (BYTE_TYPE(enc, ptr)) {
1518
0
#  define START_NAME                                                           \
1519
28.4M
    if (state == other) {                                                      \
1520
5.37M
      if (nAtts < attsMax) {                                                   \
1521
2.76M
        atts[nAtts].name = ptr;                                                \
1522
2.76M
        atts[nAtts].normalized = 1;                                            \
1523
2.76M
      }                                                                        \
1524
5.37M
      state = inName;                                                          \
1525
5.37M
    }
1526
0
#  define LEAD_CASE(n)                                                         \
1527
187k
  case BT_LEAD##n: /* NOTE: The encoding has already been validated. */        \
1528
187k
    START_NAME ptr += (n - MINBPC(enc));                                       \
1529
187k
    break;
1530
114k
      LEAD_CASE(2)
1531
51.9k
      LEAD_CASE(3)
1532
21.0k
      LEAD_CASE(4)
1533
0
#  undef LEAD_CASE
1534
0
    case BT_NONASCII:
1535
26.0M
    case BT_NMSTRT:
1536
28.2M
    case BT_HEX:
1537
28.2M
      START_NAME
1538
28.2M
      break;
1539
0
#  undef START_NAME
1540
854k
    case BT_QUOT:
1541
854k
      if (state != inValue) {
1542
344k
        if (nAtts < attsMax)
1543
248k
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1544
344k
        state = inValue;
1545
344k
        open = BT_QUOT;
1546
509k
      } else if (open == BT_QUOT) {
1547
344k
        state = other;
1548
344k
        if (nAtts < attsMax)
1549
248k
          atts[nAtts].valueEnd = ptr;
1550
344k
        nAtts++;
1551
344k
      }
1552
854k
      break;
1553
10.1M
    case BT_APOS:
1554
10.1M
      if (state != inValue) {
1555
5.03M
        if (nAtts < attsMax)
1556
2.52M
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1557
5.03M
        state = inValue;
1558
5.03M
        open = BT_APOS;
1559
5.07M
      } else if (open == BT_APOS) {
1560
5.03M
        state = other;
1561
5.03M
        if (nAtts < attsMax)
1562
2.52M
          atts[nAtts].valueEnd = ptr;
1563
5.03M
        nAtts++;
1564
5.03M
      }
1565
10.1M
      break;
1566
27.8k
    case BT_AMP:
1567
27.8k
      if (nAtts < attsMax)
1568
26.4k
        atts[nAtts].normalized = 0;
1569
27.8k
      break;
1570
3.85M
    case BT_S:
1571
3.85M
      if (state == inName)
1572
87.6k
        state = other;
1573
3.76M
      else if (state == inValue && nAtts < attsMax && atts[nAtts].normalized
1574
114k
               && (ptr == atts[nAtts].valuePtr
1575
13.2k
                   || BYTE_TO_ASCII(enc, ptr) != ASCII_SPACE
1576
7.11k
                   || BYTE_TO_ASCII(enc, ptr + MINBPC(enc)) == ASCII_SPACE
1577
6.49k
                   || BYTE_TYPE(enc, ptr + MINBPC(enc)) == open))
1578
108k
        atts[nAtts].normalized = 0;
1579
3.85M
      break;
1580
3.13M
    case BT_CR:
1581
3.74M
    case BT_LF:
1582
      /* This case ensures that the first attribute name is counted
1583
         Apart from that we could just change state on the quote. */
1584
3.74M
      if (state == inName)
1585
20.2k
        state = other;
1586
3.72M
      else if (state == inValue && nAtts < attsMax)
1587
995k
        atts[nAtts].normalized = 0;
1588
3.74M
      break;
1589
998k
    case BT_GT:
1590
1.11M
    case BT_SOL:
1591
1.11M
      if (state != inValue)
1592
1.08M
        return nAtts;
1593
25.2k
      break;
1594
7.34M
    default:
1595
7.34M
      break;
1596
55.5M
    }
1597
55.5M
  }
1598
  /* not reached */
1599
1.08M
}
xmltok.c:normal_getAtts
Line
Count
Source
1510
1.08M
                ATTRIBUTE *atts) {
1511
1.08M
  enum { other, inName, inValue } state = inName;
1512
1.08M
  int nAtts = 0;
1513
1.08M
  int open = 0; /* defined when state == inValue;
1514
                   initialization just to shut up compilers */
1515
1516
55.5M
  for (ptr += MINBPC(enc);; ptr += MINBPC(enc)) {
1517
55.5M
    switch (BYTE_TYPE(enc, ptr)) {
1518
0
#  define START_NAME                                                           \
1519
0
    if (state == other) {                                                      \
1520
0
      if (nAtts < attsMax) {                                                   \
1521
0
        atts[nAtts].name = ptr;                                                \
1522
0
        atts[nAtts].normalized = 1;                                            \
1523
0
      }                                                                        \
1524
0
      state = inName;                                                          \
1525
0
    }
1526
0
#  define LEAD_CASE(n)                                                         \
1527
0
  case BT_LEAD##n: /* NOTE: The encoding has already been validated. */        \
1528
0
    START_NAME ptr += (n - MINBPC(enc));                                       \
1529
0
    break;
1530
114k
      LEAD_CASE(2)
1531
51.9k
      LEAD_CASE(3)
1532
21.0k
      LEAD_CASE(4)
1533
0
#  undef LEAD_CASE
1534
0
    case BT_NONASCII:
1535
26.0M
    case BT_NMSTRT:
1536
28.2M
    case BT_HEX:
1537
28.2M
      START_NAME
1538
28.2M
      break;
1539
0
#  undef START_NAME
1540
854k
    case BT_QUOT:
1541
854k
      if (state != inValue) {
1542
344k
        if (nAtts < attsMax)
1543
248k
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1544
344k
        state = inValue;
1545
344k
        open = BT_QUOT;
1546
509k
      } else if (open == BT_QUOT) {
1547
344k
        state = other;
1548
344k
        if (nAtts < attsMax)
1549
248k
          atts[nAtts].valueEnd = ptr;
1550
344k
        nAtts++;
1551
344k
      }
1552
854k
      break;
1553
10.1M
    case BT_APOS:
1554
10.1M
      if (state != inValue) {
1555
5.03M
        if (nAtts < attsMax)
1556
2.52M
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1557
5.03M
        state = inValue;
1558
5.03M
        open = BT_APOS;
1559
5.07M
      } else if (open == BT_APOS) {
1560
5.03M
        state = other;
1561
5.03M
        if (nAtts < attsMax)
1562
2.52M
          atts[nAtts].valueEnd = ptr;
1563
5.03M
        nAtts++;
1564
5.03M
      }
1565
10.1M
      break;
1566
27.8k
    case BT_AMP:
1567
27.8k
      if (nAtts < attsMax)
1568
26.4k
        atts[nAtts].normalized = 0;
1569
27.8k
      break;
1570
3.85M
    case BT_S:
1571
3.85M
      if (state == inName)
1572
87.6k
        state = other;
1573
3.76M
      else if (state == inValue && nAtts < attsMax && atts[nAtts].normalized
1574
114k
               && (ptr == atts[nAtts].valuePtr
1575
13.2k
                   || BYTE_TO_ASCII(enc, ptr) != ASCII_SPACE
1576
7.11k
                   || BYTE_TO_ASCII(enc, ptr + MINBPC(enc)) == ASCII_SPACE
1577
6.49k
                   || BYTE_TYPE(enc, ptr + MINBPC(enc)) == open))
1578
108k
        atts[nAtts].normalized = 0;
1579
3.85M
      break;
1580
3.13M
    case BT_CR:
1581
3.74M
    case BT_LF:
1582
      /* This case ensures that the first attribute name is counted
1583
         Apart from that we could just change state on the quote. */
1584
3.74M
      if (state == inName)
1585
20.2k
        state = other;
1586
3.72M
      else if (state == inValue && nAtts < attsMax)
1587
995k
        atts[nAtts].normalized = 0;
1588
3.74M
      break;
1589
998k
    case BT_GT:
1590
1.11M
    case BT_SOL:
1591
1.11M
      if (state != inValue)
1592
1.08M
        return nAtts;
1593
25.2k
      break;
1594
7.34M
    default:
1595
7.34M
      break;
1596
55.5M
    }
1597
55.5M
  }
1598
  /* not reached */
1599
1.08M
}
Unexecuted instantiation: xmltok.c:little2_getAtts
Unexecuted instantiation: xmltok.c:big2_getAtts
1600
1601
static int PTRFASTCALL
1602
17.8k
PREFIX(charRefNumber)(const ENCODING *enc, const char *ptr) {
1603
17.8k
  int result = 0;
1604
  /* skip &# */
1605
17.8k
  UNUSED_P(enc);
1606
17.8k
  ptr += 2 * MINBPC(enc);
1607
17.8k
  if (CHAR_MATCHES(enc, ptr, ASCII_x)) {
1608
60.9k
    for (ptr += MINBPC(enc); ! CHAR_MATCHES(enc, ptr, ASCII_SEMI);
1609
47.7k
         ptr += MINBPC(enc)) {
1610
47.7k
      int c = BYTE_TO_ASCII(enc, ptr);
1611
47.7k
      switch (c) {
1612
7.00k
      case ASCII_0:
1613
10.5k
      case ASCII_1:
1614
13.5k
      case ASCII_2:
1615
14.4k
      case ASCII_3:
1616
15.6k
      case ASCII_4:
1617
18.7k
      case ASCII_5:
1618
22.7k
      case ASCII_6:
1619
26.0k
      case ASCII_7:
1620
30.2k
      case ASCII_8:
1621
32.7k
      case ASCII_9:
1622
32.7k
        result <<= 4;
1623
32.7k
        result |= (c - ASCII_0);
1624
32.7k
        break;
1625
868
      case ASCII_A:
1626
1.76k
      case ASCII_B:
1627
2.31k
      case ASCII_C:
1628
3.78k
      case ASCII_D:
1629
4.49k
      case ASCII_E:
1630
8.81k
      case ASCII_F:
1631
8.81k
        result <<= 4;
1632
8.81k
        result += 10 + (c - ASCII_A);
1633
8.81k
        break;
1634
676
      case ASCII_a:
1635
1.30k
      case ASCII_b:
1636
3.01k
      case ASCII_c:
1637
4.07k
      case ASCII_d:
1638
4.43k
      case ASCII_e:
1639
6.20k
      case ASCII_f:
1640
6.20k
        result <<= 4;
1641
6.20k
        result += 10 + (c - ASCII_a);
1642
6.20k
        break;
1643
47.7k
      }
1644
47.7k
      if (result >= 0x110000)
1645
14
        return -1;
1646
47.7k
    }
1647
13.1k
  } else {
1648
18.0k
    for (; ! CHAR_MATCHES(enc, ptr, ASCII_SEMI); ptr += MINBPC(enc)) {
1649
13.3k
      int c = BYTE_TO_ASCII(enc, ptr);
1650
13.3k
      result *= 10;
1651
13.3k
      result += (c - ASCII_0);
1652
13.3k
      if (result >= 0x110000)
1653
4
        return -1;
1654
13.3k
    }
1655
4.69k
  }
1656
17.8k
  return checkCharRefNumber(result);
1657
17.8k
}
xmltok.c:normal_charRefNumber
Line
Count
Source
1602
17.8k
PREFIX(charRefNumber)(const ENCODING *enc, const char *ptr) {
1603
17.8k
  int result = 0;
1604
  /* skip &# */
1605
17.8k
  UNUSED_P(enc);
1606
17.8k
  ptr += 2 * MINBPC(enc);
1607
17.8k
  if (CHAR_MATCHES(enc, ptr, ASCII_x)) {
1608
60.9k
    for (ptr += MINBPC(enc); ! CHAR_MATCHES(enc, ptr, ASCII_SEMI);
1609
47.7k
         ptr += MINBPC(enc)) {
1610
47.7k
      int c = BYTE_TO_ASCII(enc, ptr);
1611
47.7k
      switch (c) {
1612
7.00k
      case ASCII_0:
1613
10.5k
      case ASCII_1:
1614
13.5k
      case ASCII_2:
1615
14.4k
      case ASCII_3:
1616
15.6k
      case ASCII_4:
1617
18.7k
      case ASCII_5:
1618
22.7k
      case ASCII_6:
1619
26.0k
      case ASCII_7:
1620
30.2k
      case ASCII_8:
1621
32.7k
      case ASCII_9:
1622
32.7k
        result <<= 4;
1623
32.7k
        result |= (c - ASCII_0);
1624
32.7k
        break;
1625
868
      case ASCII_A:
1626
1.76k
      case ASCII_B:
1627
2.31k
      case ASCII_C:
1628
3.78k
      case ASCII_D:
1629
4.49k
      case ASCII_E:
1630
8.81k
      case ASCII_F:
1631
8.81k
        result <<= 4;
1632
8.81k
        result += 10 + (c - ASCII_A);
1633
8.81k
        break;
1634
676
      case ASCII_a:
1635
1.30k
      case ASCII_b:
1636
3.01k
      case ASCII_c:
1637
4.07k
      case ASCII_d:
1638
4.43k
      case ASCII_e:
1639
6.20k
      case ASCII_f:
1640
6.20k
        result <<= 4;
1641
6.20k
        result += 10 + (c - ASCII_a);
1642
6.20k
        break;
1643
47.7k
      }
1644
47.7k
      if (result >= 0x110000)
1645
14
        return -1;
1646
47.7k
    }
1647
13.1k
  } else {
1648
18.0k
    for (; ! CHAR_MATCHES(enc, ptr, ASCII_SEMI); ptr += MINBPC(enc)) {
1649
13.3k
      int c = BYTE_TO_ASCII(enc, ptr);
1650
13.3k
      result *= 10;
1651
13.3k
      result += (c - ASCII_0);
1652
13.3k
      if (result >= 0x110000)
1653
4
        return -1;
1654
13.3k
    }
1655
4.69k
  }
1656
17.8k
  return checkCharRefNumber(result);
1657
17.8k
}
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
99.8k
                             const char *end) {
1662
99.8k
  UNUSED_P(enc);
1663
99.8k
  switch ((end - ptr) / MINBPC(enc)) {
1664
6.05k
  case 2:
1665
6.05k
    if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_t)) {
1666
2.15k
      switch (BYTE_TO_ASCII(enc, ptr)) {
1667
1.61k
      case ASCII_l:
1668
1.61k
        return ASCII_LT;
1669
519
      case ASCII_g:
1670
519
        return ASCII_GT;
1671
2.15k
      }
1672
2.15k
    }
1673
3.92k
    break;
1674
34.4k
  case 3:
1675
34.4k
    if (CHAR_MATCHES(enc, ptr, ASCII_a)) {
1676
33.6k
      ptr += MINBPC(enc);
1677
33.6k
      if (CHAR_MATCHES(enc, ptr, ASCII_m)) {
1678
32.7k
        ptr += MINBPC(enc);
1679
32.7k
        if (CHAR_MATCHES(enc, ptr, ASCII_p))
1680
32.5k
          return ASCII_AMP;
1681
32.7k
      }
1682
33.6k
    }
1683
1.92k
    break;
1684
5.68k
  case 4:
1685
5.68k
    switch (BYTE_TO_ASCII(enc, ptr)) {
1686
2.30k
    case ASCII_q:
1687
2.30k
      ptr += MINBPC(enc);
1688
2.30k
      if (CHAR_MATCHES(enc, ptr, ASCII_u)) {
1689
1.94k
        ptr += MINBPC(enc);
1690
1.94k
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1691
1.57k
          ptr += MINBPC(enc);
1692
1.57k
          if (CHAR_MATCHES(enc, ptr, ASCII_t))
1693
1.21k
            return ASCII_QUOT;
1694
1.57k
        }
1695
1.94k
      }
1696
1.08k
      break;
1697
2.88k
    case ASCII_a:
1698
2.88k
      ptr += MINBPC(enc);
1699
2.88k
      if (CHAR_MATCHES(enc, ptr, ASCII_p)) {
1700
1.28k
        ptr += MINBPC(enc);
1701
1.28k
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1702
712
          ptr += MINBPC(enc);
1703
712
          if (CHAR_MATCHES(enc, ptr, ASCII_s))
1704
503
            return ASCII_APOS;
1705
712
        }
1706
1.28k
      }
1707
2.37k
      break;
1708
5.68k
    }
1709
99.8k
  }
1710
63.4k
  return 0;
1711
99.8k
}
xmltok.c:normal_predefinedEntityName
Line
Count
Source
1661
99.8k
                             const char *end) {
1662
99.8k
  UNUSED_P(enc);
1663
99.8k
  switch ((end - ptr) / MINBPC(enc)) {
1664
6.05k
  case 2:
1665
6.05k
    if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_t)) {
1666
2.15k
      switch (BYTE_TO_ASCII(enc, ptr)) {
1667
1.61k
      case ASCII_l:
1668
1.61k
        return ASCII_LT;
1669
519
      case ASCII_g:
1670
519
        return ASCII_GT;
1671
2.15k
      }
1672
2.15k
    }
1673
3.92k
    break;
1674
34.4k
  case 3:
1675
34.4k
    if (CHAR_MATCHES(enc, ptr, ASCII_a)) {
1676
33.6k
      ptr += MINBPC(enc);
1677
33.6k
      if (CHAR_MATCHES(enc, ptr, ASCII_m)) {
1678
32.7k
        ptr += MINBPC(enc);
1679
32.7k
        if (CHAR_MATCHES(enc, ptr, ASCII_p))
1680
32.5k
          return ASCII_AMP;
1681
32.7k
      }
1682
33.6k
    }
1683
1.92k
    break;
1684
5.68k
  case 4:
1685
5.68k
    switch (BYTE_TO_ASCII(enc, ptr)) {
1686
2.30k
    case ASCII_q:
1687
2.30k
      ptr += MINBPC(enc);
1688
2.30k
      if (CHAR_MATCHES(enc, ptr, ASCII_u)) {
1689
1.94k
        ptr += MINBPC(enc);
1690
1.94k
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1691
1.57k
          ptr += MINBPC(enc);
1692
1.57k
          if (CHAR_MATCHES(enc, ptr, ASCII_t))
1693
1.21k
            return ASCII_QUOT;
1694
1.57k
        }
1695
1.94k
      }
1696
1.08k
      break;
1697
2.88k
    case ASCII_a:
1698
2.88k
      ptr += MINBPC(enc);
1699
2.88k
      if (CHAR_MATCHES(enc, ptr, ASCII_p)) {
1700
1.28k
        ptr += MINBPC(enc);
1701
1.28k
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1702
712
          ptr += MINBPC(enc);
1703
712
          if (CHAR_MATCHES(enc, ptr, ASCII_s))
1704
503
            return ASCII_APOS;
1705
712
        }
1706
1.28k
      }
1707
2.37k
      break;
1708
5.68k
    }
1709
99.8k
  }
1710
63.4k
  return 0;
1711
99.8k
}
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
471k
                         const char *end1, const char *ptr2) {
1716
471k
  UNUSED_P(enc);
1717
2.70M
  for (; *ptr2; ptr1 += MINBPC(enc), ptr2++) {
1718
2.34M
    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
40
      return 0; /* LCOV_EXCL_LINE */
1725
40
    }
1726
2.34M
    if (! CHAR_MATCHES(enc, ptr1, *ptr2))
1727
119k
      return 0;
1728
2.34M
  }
1729
351k
  return ptr1 == end1;
1730
471k
}
xmltok.c:normal_nameMatchesAscii
Line
Count
Source
1715
471k
                         const char *end1, const char *ptr2) {
1716
471k
  UNUSED_P(enc);
1717
2.70M
  for (; *ptr2; ptr1 += MINBPC(enc), ptr2++) {
1718
2.34M
    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
40
      return 0; /* LCOV_EXCL_LINE */
1725
40
    }
1726
2.34M
    if (! CHAR_MATCHES(enc, ptr1, *ptr2))
1727
119k
      return 0;
1728
2.34M
  }
1729
351k
  return ptr1 == end1;
1730
471k
}
Unexecuted instantiation: xmltok.c:little2_nameMatchesAscii
Unexecuted instantiation: xmltok.c:big2_nameMatchesAscii
1731
1732
static int PTRFASTCALL
1733
1.34M
PREFIX(nameLength)(const ENCODING *enc, const char *ptr) {
1734
1.34M
  const char *start = ptr;
1735
12.5M
  for (;;) {
1736
12.5M
    switch (BYTE_TYPE(enc, ptr)) {
1737
0
#  define LEAD_CASE(n)                                                         \
1738
52.0k
  case BT_LEAD##n:                                                             \
1739
52.0k
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1740
52.0k
    break;
1741
32.2k
      LEAD_CASE(2)
1742
19.7k
      LEAD_CASE(3)
1743
0
      LEAD_CASE(4)
1744
0
#  undef LEAD_CASE
1745
0
    case BT_NONASCII:
1746
8.59M
    case BT_NMSTRT:
1747
#  ifdef XML_NS
1748
    case BT_COLON:
1749
#  endif
1750
10.4M
    case BT_HEX:
1751
10.4M
    case BT_DIGIT:
1752
10.4M
    case BT_NAME:
1753
11.1M
    case BT_MINUS:
1754
11.1M
      ptr += MINBPC(enc);
1755
11.1M
      break;
1756
1.34M
    default:
1757
1.34M
      return (int)(ptr - start);
1758
12.5M
    }
1759
12.5M
  }
1760
1.34M
}
xmltok.c:normal_nameLength
Line
Count
Source
1733
1.34M
PREFIX(nameLength)(const ENCODING *enc, const char *ptr) {
1734
1.34M
  const char *start = ptr;
1735
12.5M
  for (;;) {
1736
12.5M
    switch (BYTE_TYPE(enc, ptr)) {
1737
0
#  define LEAD_CASE(n)                                                         \
1738
0
  case BT_LEAD##n:                                                             \
1739
0
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1740
0
    break;
1741
32.2k
      LEAD_CASE(2)
1742
19.7k
      LEAD_CASE(3)
1743
0
      LEAD_CASE(4)
1744
0
#  undef LEAD_CASE
1745
0
    case BT_NONASCII:
1746
8.59M
    case BT_NMSTRT:
1747
#  ifdef XML_NS
1748
    case BT_COLON:
1749
#  endif
1750
10.4M
    case BT_HEX:
1751
10.4M
    case BT_DIGIT:
1752
10.4M
    case BT_NAME:
1753
11.1M
    case BT_MINUS:
1754
11.1M
      ptr += MINBPC(enc);
1755
11.1M
      break;
1756
1.34M
    default:
1757
1.34M
      return (int)(ptr - start);
1758
12.5M
    }
1759
12.5M
  }
1760
1.34M
}
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
21.2k
                       POSITION *pos) {
1780
120M
  while (HAS_CHAR(enc, ptr, end)) {
1781
120M
    switch (BYTE_TYPE(enc, ptr)) {
1782
0
#  define LEAD_CASE(n)                                                         \
1783
1.23M
  case BT_LEAD##n:                                                             \
1784
1.23M
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1785
1.23M
    pos->columnNumber++;                                                       \
1786
1.23M
    break;
1787
550k
      LEAD_CASE(2)
1788
466k
      LEAD_CASE(3)
1789
216k
      LEAD_CASE(4)
1790
0
#  undef LEAD_CASE
1791
3.52M
    case BT_LF:
1792
3.52M
      pos->columnNumber = 0;
1793
3.52M
      pos->lineNumber++;
1794
3.52M
      ptr += MINBPC(enc);
1795
3.52M
      break;
1796
4.99M
    case BT_CR:
1797
4.99M
      pos->lineNumber++;
1798
4.99M
      ptr += MINBPC(enc);
1799
4.99M
      if (HAS_CHAR(enc, ptr, end) && BYTE_TYPE(enc, ptr) == BT_LF)
1800
1.13M
        ptr += MINBPC(enc);
1801
4.99M
      pos->columnNumber = 0;
1802
4.99M
      break;
1803
111M
    default:
1804
111M
      ptr += MINBPC(enc);
1805
111M
      pos->columnNumber++;
1806
111M
      break;
1807
120M
    }
1808
120M
  }
1809
21.2k
}
xmltok.c:normal_updatePosition
Line
Count
Source
1779
20.7k
                       POSITION *pos) {
1780
120M
  while (HAS_CHAR(enc, ptr, end)) {
1781
120M
    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
550k
      LEAD_CASE(2)
1788
466k
      LEAD_CASE(3)
1789
216k
      LEAD_CASE(4)
1790
0
#  undef LEAD_CASE
1791
3.52M
    case BT_LF:
1792
3.52M
      pos->columnNumber = 0;
1793
3.52M
      pos->lineNumber++;
1794
3.52M
      ptr += MINBPC(enc);
1795
3.52M
      break;
1796
4.99M
    case BT_CR:
1797
4.99M
      pos->lineNumber++;
1798
4.99M
      ptr += MINBPC(enc);
1799
4.99M
      if (HAS_CHAR(enc, ptr, end) && BYTE_TYPE(enc, ptr) == BT_LF)
1800
1.13M
        ptr += MINBPC(enc);
1801
4.99M
      pos->columnNumber = 0;
1802
4.99M
      break;
1803
111M
    default:
1804
111M
      ptr += MINBPC(enc);
1805
111M
      pos->columnNumber++;
1806
111M
      break;
1807
120M
    }
1808
120M
  }
1809
20.7k
}
xmltok.c:little2_updatePosition
Line
Count
Source
1779
267
                       POSITION *pos) {
1780
788
  while (HAS_CHAR(enc, ptr, end)) {
1781
788
    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
788
    default:
1804
788
      ptr += MINBPC(enc);
1805
788
      pos->columnNumber++;
1806
788
      break;
1807
788
    }
1808
788
  }
1809
267
}
xmltok.c:big2_updatePosition
Line
Count
Source
1779
249
                       POSITION *pos) {
1780
52.7k
  while (HAS_CHAR(enc, ptr, end)) {
1781
52.7k
    switch (BYTE_TYPE(enc, ptr)) {
1782
0
#  define LEAD_CASE(n)                                                         \
1783
0
  case BT_LEAD##n:                                                             \
1784
0
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1785
0
    pos->columnNumber++;                                                       \
1786
0
    break;
1787
0
      LEAD_CASE(2)
1788
0
      LEAD_CASE(3)
1789
0
      LEAD_CASE(4)
1790
0
#  undef LEAD_CASE
1791
0
    case BT_LF:
1792
0
      pos->columnNumber = 0;
1793
0
      pos->lineNumber++;
1794
0
      ptr += MINBPC(enc);
1795
0
      break;
1796
0
    case BT_CR:
1797
0
      pos->lineNumber++;
1798
0
      ptr += MINBPC(enc);
1799
0
      if (HAS_CHAR(enc, ptr, end) && BYTE_TYPE(enc, ptr) == BT_LF)
1800
0
        ptr += MINBPC(enc);
1801
0
      pos->columnNumber = 0;
1802
0
      break;
1803
52.7k
    default:
1804
52.7k
      ptr += MINBPC(enc);
1805
52.7k
      pos->columnNumber++;
1806
52.7k
      break;
1807
52.7k
    }
1808
52.7k
  }
1809
249
}
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 */