Coverage Report

Created: 2023-06-07 06:17

/src/CMake/Utilities/cmexpat/lib/xmltok_impl.c
Line
Count
Source (jump to first uncovered line)
1
/* This file is included (from xmltok.c, 1-3 times depending on XML_MIN_SIZE)!
2
                            __  __            _
3
                         ___\ \/ /_ __   __ _| |_
4
                        / _ \\  /| '_ \ / _` | __|
5
                       |  __//  \| |_) | (_| | |_
6
                        \___/_/\_\ .__/ \__,_|\__|
7
                                 |_| XML parser
8
9
   Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
10
   Copyright (c) 2000      Clark Cooper <coopercc@users.sourceforge.net>
11
   Copyright (c) 2002      Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
12
   Copyright (c) 2002-2016 Karl Waclawek <karl@waclawek.net>
13
   Copyright (c) 2016-2022 Sebastian Pipping <sebastian@pipping.org>
14
   Copyright (c) 2017      Rhodri James <rhodri@wildebeest.org.uk>
15
   Copyright (c) 2018      Benjamin Peterson <benjamin@python.org>
16
   Copyright (c) 2018      Anton Maklakov <antmak.pub@gmail.com>
17
   Copyright (c) 2019      David Loffredo <loffredo@steptools.com>
18
   Copyright (c) 2020      Boris Kolpackov <boris@codesynthesis.com>
19
   Licensed under the MIT license:
20
21
   Permission is  hereby granted,  free of charge,  to any  person obtaining
22
   a  copy  of  this  software   and  associated  documentation  files  (the
23
   "Software"),  to  deal in  the  Software  without restriction,  including
24
   without  limitation the  rights  to use,  copy,  modify, merge,  publish,
25
   distribute, sublicense, and/or sell copies of the Software, and to permit
26
   persons  to whom  the Software  is  furnished to  do so,  subject to  the
27
   following conditions:
28
29
   The above copyright  notice and this permission notice  shall be included
30
   in all copies or substantial portions of the Software.
31
32
   THE  SOFTWARE  IS  PROVIDED  "AS  IS",  WITHOUT  WARRANTY  OF  ANY  KIND,
33
   EXPRESS  OR IMPLIED,  INCLUDING  BUT  NOT LIMITED  TO  THE WARRANTIES  OF
34
   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
35
   NO EVENT SHALL THE AUTHORS OR  COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
36
   DAMAGES OR  OTHER LIABILITY, WHETHER  IN AN  ACTION OF CONTRACT,  TORT OR
37
   OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
38
   USE OR OTHER DEALINGS IN THE SOFTWARE.
39
*/
40
41
#ifdef XML_TOK_IMPL_C
42
43
#  ifndef IS_INVALID_CHAR // i.e. for UTF-16 and XML_MIN_SIZE not defined
44
85
#    define IS_INVALID_CHAR(enc, ptr, n) (0)
45
#  endif
46
47
#  define INVALID_LEAD_CASE(n, ptr, nextTokPtr)                                \
48
14.6M
  case BT_LEAD##n:                                                             \
49
14.6M
    if (end - ptr < n)                                                         \
50
14.6M
      return XML_TOK_PARTIAL_CHAR;                                             \
51
14.6M
    if (IS_INVALID_CHAR(enc, ptr, n)) {                                        \
52
133
      *(nextTokPtr) = (ptr);                                                   \
53
133
      return XML_TOK_INVALID;                                                  \
54
133
    }                                                                          \
55
14.6M
    ptr += n;                                                                  \
56
14.6M
    break;
57
58
#  define INVALID_CASES(ptr, nextTokPtr)                                       \
59
14.5M
    INVALID_LEAD_CASE(2, ptr, nextTokPtr)                                      \
60
14.5M
    INVALID_LEAD_CASE(3, ptr, nextTokPtr)                                      \
61
9.93k
    INVALID_LEAD_CASE(4, ptr, nextTokPtr)                                      \
62
9.83k
  case BT_NONXML:                                                              \
63
105
  case BT_MALFORM:                                                             \
64
181
  case BT_TRAIL:                                                               \
65
181
    *(nextTokPtr) = (ptr);                                                     \
66
181
    return XML_TOK_INVALID;
67
68
#  define CHECK_NAME_CASE(n, enc, ptr, end, nextTokPtr)                        \
69
8.28M
  case BT_LEAD##n:                                                             \
70
8.28M
    if (end - ptr < n)                                                         \
71
8.28M
      return XML_TOK_PARTIAL_CHAR;                                             \
72
8.28M
    if (IS_INVALID_CHAR(enc, ptr, n) || ! IS_NAME_CHAR(enc, ptr, n)) {         \
73
313
      *nextTokPtr = ptr;                                                       \
74
313
      return XML_TOK_INVALID;                                                  \
75
313
    }                                                                          \
76
8.28M
    ptr += n;                                                                  \
77
8.28M
    break;
78
79
#  define CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)                          \
80
61.6M
  case BT_NONASCII:                                                            \
81
61.6M
    if (! IS_NAME_CHAR_MINBPC(enc, ptr)) {                                     \
82
53
      *nextTokPtr = ptr;                                                       \
83
53
      return XML_TOK_INVALID;                                                  \
84
53
    }                                                                          \
85
61.6M
    /* fall through */                                                         \
86
61.6M
  case BT_NMSTRT:                                                              \
87
47.4M
  case BT_HEX:                                                                 \
88
60.0M
  case BT_DIGIT:                                                               \
89
61.6M
  case BT_NAME:                                                                \
90
61.6M
  case BT_MINUS:                                                               \
91
61.6M
    ptr += MINBPC(enc);                                                        \
92
61.6M
    break;                                                                     \
93
61.6M
    CHECK_NAME_CASE(2, enc, ptr, end, nextTokPtr)                              \
94
8.27M
    CHECK_NAME_CASE(3, enc, ptr, end, nextTokPtr)                              \
95
3.12k
    CHECK_NAME_CASE(4, enc, ptr, end, nextTokPtr)
96
97
#  define CHECK_NMSTRT_CASE(n, enc, ptr, end, nextTokPtr)                      \
98
21.1k
  case BT_LEAD##n:                                                             \
99
21.5k
    if (end - ptr < n)                                                         \
100
21.1k
      return XML_TOK_PARTIAL_CHAR;                                             \
101
21.4k
    if (IS_INVALID_CHAR(enc, ptr, n) || ! IS_NMSTRT_CHAR(enc, ptr, n)) {       \
102
254
      *nextTokPtr = ptr;                                                       \
103
254
      return XML_TOK_INVALID;                                                  \
104
254
    }                                                                          \
105
21.4k
    ptr += n;                                                                  \
106
21.1k
    break;
107
108
#  define CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)                        \
109
12.8M
  case BT_NONASCII:                                                            \
110
12.8M
    if (! IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {                                   \
111
0
      *nextTokPtr = ptr;                                                       \
112
0
      return XML_TOK_INVALID;                                                  \
113
0
    }                                                                          \
114
12.8M
    /* fall through */                                                         \
115
12.8M
  case BT_NMSTRT:                                                              \
116
12.8M
  case BT_HEX:                                                                 \
117
12.8M
    ptr += MINBPC(enc);                                                        \
118
12.8M
    break;                                                                     \
119
12.8M
    CHECK_NMSTRT_CASE(2, enc, ptr, end, nextTokPtr)                            \
120
13.4k
    CHECK_NMSTRT_CASE(3, enc, ptr, end, nextTokPtr)                            \
121
7.69k
    CHECK_NMSTRT_CASE(4, enc, ptr, end, nextTokPtr)
122
123
#  ifndef PREFIX
124
#    define PREFIX(ident) ident
125
#  endif
126
127
5.18G
#  define HAS_CHARS(enc, ptr, end, count) (end - ptr >= count * MINBPC(enc))
128
129
26.5M
#  define HAS_CHAR(enc, ptr, end) HAS_CHARS(enc, ptr, end, 1)
130
131
#  define REQUIRE_CHARS(enc, ptr, end, count)                                  \
132
23.5M
    {                                                                          \
133
23.5M
      if (! HAS_CHARS(enc, ptr, end, count)) {                                 \
134
688
        return XML_TOK_PARTIAL;                                                \
135
688
      }                                                                        \
136
23.5M
    }
137
138
23.5M
#  define REQUIRE_CHAR(enc, ptr, end) REQUIRE_CHARS(enc, ptr, end, 1)
139
140
/* ptr points to character following "<!-" */
141
142
static int PTRCALL
143
PREFIX(scanComment)(const ENCODING *enc, const char *ptr, const char *end,
144
1.42k
                    const char **nextTokPtr) {
145
1.42k
  if (HAS_CHAR(enc, ptr, end)) {
146
1.40k
    if (! CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
147
8
      *nextTokPtr = ptr;
148
8
      return XML_TOK_INVALID;
149
8
    }
150
1.39k
    ptr += MINBPC(enc);
151
2.25M
    while (HAS_CHAR(enc, ptr, end)) {
152
2.25M
      switch (BYTE_TYPE(enc, ptr)) {
153
4.31M
        INVALID_CASES(ptr, nextTokPtr)
154
2.10k
      case BT_MINUS:
155
2.10k
        ptr += MINBPC(enc);
156
2.10k
        REQUIRE_CHAR(enc, ptr, end);
157
2.09k
        if (CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
158
1.23k
          ptr += MINBPC(enc);
159
1.23k
          REQUIRE_CHAR(enc, ptr, end);
160
1.22k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
161
21
            *nextTokPtr = ptr;
162
21
            return XML_TOK_INVALID;
163
21
          }
164
1.20k
          *nextTokPtr = ptr + MINBPC(enc);
165
1.20k
          return XML_TOK_COMMENT;
166
1.22k
        }
167
868
        break;
168
97.5k
      default:
169
97.5k
        ptr += MINBPC(enc);
170
97.5k
        break;
171
2.25M
      }
172
2.25M
    }
173
1.39k
  }
174
122
  return XML_TOK_PARTIAL;
175
1.42k
}
xmltok.c:normal_scanComment
Line
Count
Source
144
1.42k
                    const char **nextTokPtr) {
145
1.42k
  if (HAS_CHAR(enc, ptr, end)) {
146
1.40k
    if (! CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
147
8
      *nextTokPtr = ptr;
148
8
      return XML_TOK_INVALID;
149
8
    }
150
1.39k
    ptr += MINBPC(enc);
151
2.25M
    while (HAS_CHAR(enc, ptr, end)) {
152
2.25M
      switch (BYTE_TYPE(enc, ptr)) {
153
4.31M
        INVALID_CASES(ptr, nextTokPtr)
154
2.10k
      case BT_MINUS:
155
2.10k
        ptr += MINBPC(enc);
156
2.10k
        REQUIRE_CHAR(enc, ptr, end);
157
2.09k
        if (CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
158
1.23k
          ptr += MINBPC(enc);
159
1.23k
          REQUIRE_CHAR(enc, ptr, end);
160
1.22k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
161
21
            *nextTokPtr = ptr;
162
21
            return XML_TOK_INVALID;
163
21
          }
164
1.20k
          *nextTokPtr = ptr + MINBPC(enc);
165
1.20k
          return XML_TOK_COMMENT;
166
1.22k
        }
167
868
        break;
168
97.5k
      default:
169
97.5k
        ptr += MINBPC(enc);
170
97.5k
        break;
171
2.25M
      }
172
2.25M
    }
173
1.39k
  }
174
122
  return XML_TOK_PARTIAL;
175
1.42k
}
Unexecuted instantiation: xmltok.c:little2_scanComment
Unexecuted instantiation: xmltok.c:big2_scanComment
176
177
/* ptr points to character following "<!" */
178
179
static int PTRCALL
180
PREFIX(scanDecl)(const ENCODING *enc, const char *ptr, const char *end,
181
28.8k
                 const char **nextTokPtr) {
182
28.8k
  REQUIRE_CHAR(enc, ptr, end);
183
28.8k
  switch (BYTE_TYPE(enc, ptr)) {
184
751
  case BT_MINUS:
185
751
    return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
186
1
  case BT_LSQB:
187
1
    *nextTokPtr = ptr + MINBPC(enc);
188
1
    return XML_TOK_COND_SECT_OPEN;
189
1.28k
  case BT_NMSTRT:
190
28.0k
  case BT_HEX:
191
28.0k
    ptr += MINBPC(enc);
192
28.0k
    break;
193
6
  default:
194
6
    *nextTokPtr = ptr;
195
6
    return XML_TOK_INVALID;
196
28.8k
  }
197
204k
  while (HAS_CHAR(enc, ptr, end)) {
198
204k
    switch (BYTE_TYPE(enc, ptr)) {
199
24
    case BT_PERCNT:
200
24
      REQUIRE_CHARS(enc, ptr, end, 2);
201
      /* don't allow <!ENTITY% foo "whatever"> */
202
22
      switch (BYTE_TYPE(enc, ptr + MINBPC(enc))) {
203
5
      case BT_S:
204
6
      case BT_CR:
205
7
      case BT_LF:
206
8
      case BT_PERCNT:
207
8
        *nextTokPtr = ptr;
208
8
        return XML_TOK_INVALID;
209
22
      }
210
      /* fall through */
211
11.1k
    case BT_S:
212
23.7k
    case BT_CR:
213
27.9k
    case BT_LF:
214
27.9k
      *nextTokPtr = ptr;
215
27.9k
      return XML_TOK_DECL_OPEN;
216
145k
    case BT_NMSTRT:
217
176k
    case BT_HEX:
218
176k
      ptr += MINBPC(enc);
219
176k
      break;
220
42
    default:
221
42
      *nextTokPtr = ptr;
222
42
      return XML_TOK_INVALID;
223
204k
    }
224
204k
  }
225
80
  return XML_TOK_PARTIAL;
226
28.0k
}
xmltok.c:normal_scanDecl
Line
Count
Source
181
28.8k
                 const char **nextTokPtr) {
182
28.8k
  REQUIRE_CHAR(enc, ptr, end);
183
28.8k
  switch (BYTE_TYPE(enc, ptr)) {
184
751
  case BT_MINUS:
185
751
    return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
186
1
  case BT_LSQB:
187
1
    *nextTokPtr = ptr + MINBPC(enc);
188
1
    return XML_TOK_COND_SECT_OPEN;
189
1.28k
  case BT_NMSTRT:
190
28.0k
  case BT_HEX:
191
28.0k
    ptr += MINBPC(enc);
192
28.0k
    break;
193
6
  default:
194
6
    *nextTokPtr = ptr;
195
6
    return XML_TOK_INVALID;
196
28.8k
  }
197
204k
  while (HAS_CHAR(enc, ptr, end)) {
198
204k
    switch (BYTE_TYPE(enc, ptr)) {
199
24
    case BT_PERCNT:
200
24
      REQUIRE_CHARS(enc, ptr, end, 2);
201
      /* don't allow <!ENTITY% foo "whatever"> */
202
22
      switch (BYTE_TYPE(enc, ptr + MINBPC(enc))) {
203
5
      case BT_S:
204
6
      case BT_CR:
205
7
      case BT_LF:
206
8
      case BT_PERCNT:
207
8
        *nextTokPtr = ptr;
208
8
        return XML_TOK_INVALID;
209
22
      }
210
      /* fall through */
211
11.1k
    case BT_S:
212
23.7k
    case BT_CR:
213
27.9k
    case BT_LF:
214
27.9k
      *nextTokPtr = ptr;
215
27.9k
      return XML_TOK_DECL_OPEN;
216
145k
    case BT_NMSTRT:
217
176k
    case BT_HEX:
218
176k
      ptr += MINBPC(enc);
219
176k
      break;
220
42
    default:
221
42
      *nextTokPtr = ptr;
222
42
      return XML_TOK_INVALID;
223
204k
    }
224
204k
  }
225
80
  return XML_TOK_PARTIAL;
226
28.0k
}
Unexecuted instantiation: xmltok.c:little2_scanDecl
Unexecuted instantiation: xmltok.c:big2_scanDecl
227
228
static int PTRCALL
229
PREFIX(checkPiTarget)(const ENCODING *enc, const char *ptr, const char *end,
230
12.4k
                      int *tokPtr) {
231
12.4k
  int upper = 0;
232
12.4k
  UNUSED_P(enc);
233
12.4k
  *tokPtr = XML_TOK_PI;
234
12.4k
  if (end - ptr != MINBPC(enc) * 3)
235
8.17k
    return 1;
236
4.31k
  switch (BYTE_TO_ASCII(enc, ptr)) {
237
3.22k
  case ASCII_x:
238
3.22k
    break;
239
629
  case ASCII_X:
240
629
    upper = 1;
241
629
    break;
242
467
  default:
243
467
    return 1;
244
4.31k
  }
245
3.85k
  ptr += MINBPC(enc);
246
3.85k
  switch (BYTE_TO_ASCII(enc, ptr)) {
247
2.33k
  case ASCII_m:
248
2.33k
    break;
249
477
  case ASCII_M:
250
477
    upper = 1;
251
477
    break;
252
1.03k
  default:
253
1.03k
    return 1;
254
3.85k
  }
255
2.81k
  ptr += MINBPC(enc);
256
2.81k
  switch (BYTE_TO_ASCII(enc, ptr)) {
257
1.58k
  case ASCII_l:
258
1.58k
    break;
259
2
  case ASCII_L:
260
2
    upper = 1;
261
2
    break;
262
1.22k
  default:
263
1.22k
    return 1;
264
2.81k
  }
265
1.58k
  if (upper)
266
4
    return 0;
267
1.58k
  *tokPtr = XML_TOK_XML_DECL;
268
1.58k
  return 1;
269
1.58k
}
xmltok.c:normal_checkPiTarget
Line
Count
Source
230
12.4k
                      int *tokPtr) {
231
12.4k
  int upper = 0;
232
12.4k
  UNUSED_P(enc);
233
12.4k
  *tokPtr = XML_TOK_PI;
234
12.4k
  if (end - ptr != MINBPC(enc) * 3)
235
8.17k
    return 1;
236
4.31k
  switch (BYTE_TO_ASCII(enc, ptr)) {
237
3.22k
  case ASCII_x:
238
3.22k
    break;
239
629
  case ASCII_X:
240
629
    upper = 1;
241
629
    break;
242
467
  default:
243
467
    return 1;
244
4.31k
  }
245
3.85k
  ptr += MINBPC(enc);
246
3.85k
  switch (BYTE_TO_ASCII(enc, ptr)) {
247
2.33k
  case ASCII_m:
248
2.33k
    break;
249
477
  case ASCII_M:
250
477
    upper = 1;
251
477
    break;
252
1.03k
  default:
253
1.03k
    return 1;
254
3.85k
  }
255
2.81k
  ptr += MINBPC(enc);
256
2.81k
  switch (BYTE_TO_ASCII(enc, ptr)) {
257
1.58k
  case ASCII_l:
258
1.58k
    break;
259
2
  case ASCII_L:
260
2
    upper = 1;
261
2
    break;
262
1.22k
  default:
263
1.22k
    return 1;
264
2.81k
  }
265
1.58k
  if (upper)
266
4
    return 0;
267
1.58k
  *tokPtr = XML_TOK_XML_DECL;
268
1.58k
  return 1;
269
1.58k
}
Unexecuted instantiation: xmltok.c:little2_checkPiTarget
Unexecuted instantiation: xmltok.c:big2_checkPiTarget
270
271
/* ptr points to character following "<?" */
272
273
static int PTRCALL
274
PREFIX(scanPi)(const ENCODING *enc, const char *ptr, const char *end,
275
12.7k
               const char **nextTokPtr) {
276
12.7k
  int tok;
277
12.7k
  const char *target = ptr;
278
12.7k
  REQUIRE_CHAR(enc, ptr, end);
279
12.7k
  switch (BYTE_TYPE(enc, ptr)) {
280
8.74k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
281
10
  default:
282
10
    *nextTokPtr = ptr;
283
10
    return XML_TOK_INVALID;
284
12.7k
  }
285
1.52M
  while (HAS_CHAR(enc, ptr, end)) {
286
1.52M
    switch (BYTE_TYPE(enc, ptr)) {
287
3.04M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
288
3.04k
    case BT_S:
289
3.54k
    case BT_CR:
290
9.06k
    case BT_LF:
291
9.06k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
292
2
        *nextTokPtr = ptr;
293
2
        return XML_TOK_INVALID;
294
2
      }
295
9.06k
      ptr += MINBPC(enc);
296
6.37M
      while (HAS_CHAR(enc, ptr, end)) {
297
6.37M
        switch (BYTE_TYPE(enc, ptr)) {
298
11.6M
          INVALID_CASES(ptr, nextTokPtr)
299
10.8k
        case BT_QUEST:
300
10.8k
          ptr += MINBPC(enc);
301
10.8k
          REQUIRE_CHAR(enc, ptr, end);
302
10.8k
          if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
303
8.83k
            *nextTokPtr = ptr + MINBPC(enc);
304
8.83k
            return tok;
305
8.83k
          }
306
2.04k
          break;
307
547k
        default:
308
547k
          ptr += MINBPC(enc);
309
547k
          break;
310
6.37M
        }
311
6.37M
      }
312
167
      return XML_TOK_PARTIAL;
313
3.43k
    case BT_QUEST:
314
3.43k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
315
2
        *nextTokPtr = ptr;
316
2
        return XML_TOK_INVALID;
317
2
      }
318
3.43k
      ptr += MINBPC(enc);
319
3.43k
      REQUIRE_CHAR(enc, ptr, end);
320
3.40k
      if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
321
3.37k
        *nextTokPtr = ptr + MINBPC(enc);
322
3.37k
        return tok;
323
3.37k
      }
324
      /* fall through */
325
65
    default:
326
65
      *nextTokPtr = ptr;
327
65
      return XML_TOK_INVALID;
328
1.52M
    }
329
1.52M
  }
330
95
  return XML_TOK_PARTIAL;
331
12.6k
}
xmltok.c:normal_scanPi
Line
Count
Source
275
12.7k
               const char **nextTokPtr) {
276
12.7k
  int tok;
277
12.7k
  const char *target = ptr;
278
12.7k
  REQUIRE_CHAR(enc, ptr, end);
279
12.7k
  switch (BYTE_TYPE(enc, ptr)) {
280
8.74k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
281
10
  default:
282
10
    *nextTokPtr = ptr;
283
10
    return XML_TOK_INVALID;
284
12.7k
  }
285
1.52M
  while (HAS_CHAR(enc, ptr, end)) {
286
1.52M
    switch (BYTE_TYPE(enc, ptr)) {
287
3.04M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
288
3.04k
    case BT_S:
289
3.54k
    case BT_CR:
290
9.06k
    case BT_LF:
291
9.06k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
292
2
        *nextTokPtr = ptr;
293
2
        return XML_TOK_INVALID;
294
2
      }
295
9.06k
      ptr += MINBPC(enc);
296
6.37M
      while (HAS_CHAR(enc, ptr, end)) {
297
6.37M
        switch (BYTE_TYPE(enc, ptr)) {
298
11.6M
          INVALID_CASES(ptr, nextTokPtr)
299
10.8k
        case BT_QUEST:
300
10.8k
          ptr += MINBPC(enc);
301
10.8k
          REQUIRE_CHAR(enc, ptr, end);
302
10.8k
          if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
303
8.83k
            *nextTokPtr = ptr + MINBPC(enc);
304
8.83k
            return tok;
305
8.83k
          }
306
2.04k
          break;
307
547k
        default:
308
547k
          ptr += MINBPC(enc);
309
547k
          break;
310
6.37M
        }
311
6.37M
      }
312
167
      return XML_TOK_PARTIAL;
313
3.43k
    case BT_QUEST:
314
3.43k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
315
2
        *nextTokPtr = ptr;
316
2
        return XML_TOK_INVALID;
317
2
      }
318
3.43k
      ptr += MINBPC(enc);
319
3.43k
      REQUIRE_CHAR(enc, ptr, end);
320
3.40k
      if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
321
3.37k
        *nextTokPtr = ptr + MINBPC(enc);
322
3.37k
        return tok;
323
3.37k
      }
324
      /* fall through */
325
65
    default:
326
65
      *nextTokPtr = ptr;
327
65
      return XML_TOK_INVALID;
328
1.52M
    }
329
1.52M
  }
330
95
  return XML_TOK_PARTIAL;
331
12.6k
}
Unexecuted instantiation: xmltok.c:little2_scanPi
Unexecuted instantiation: xmltok.c:big2_scanPi
332
333
static int PTRCALL
334
PREFIX(scanCdataSection)(const ENCODING *enc, const char *ptr, const char *end,
335
2.05k
                         const char **nextTokPtr) {
336
2.05k
  static const char CDATA_LSQB[]
337
2.05k
      = {ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, ASCII_LSQB};
338
2.05k
  int i;
339
2.05k
  UNUSED_P(enc);
340
  /* CDATA[ */
341
2.05k
  REQUIRE_CHARS(enc, ptr, end, 6);
342
14.1k
  for (i = 0; i < 6; i++, ptr += MINBPC(enc)) {
343
12.1k
    if (! CHAR_MATCHES(enc, ptr, CDATA_LSQB[i])) {
344
51
      *nextTokPtr = ptr;
345
51
      return XML_TOK_INVALID;
346
51
    }
347
12.1k
  }
348
1.99k
  *nextTokPtr = ptr;
349
1.99k
  return XML_TOK_CDATA_SECT_OPEN;
350
2.04k
}
xmltok.c:normal_scanCdataSection
Line
Count
Source
335
2.05k
                         const char **nextTokPtr) {
336
2.05k
  static const char CDATA_LSQB[]
337
2.05k
      = {ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, ASCII_LSQB};
338
2.05k
  int i;
339
2.05k
  UNUSED_P(enc);
340
  /* CDATA[ */
341
2.05k
  REQUIRE_CHARS(enc, ptr, end, 6);
342
14.1k
  for (i = 0; i < 6; i++, ptr += MINBPC(enc)) {
343
12.1k
    if (! CHAR_MATCHES(enc, ptr, CDATA_LSQB[i])) {
344
51
      *nextTokPtr = ptr;
345
51
      return XML_TOK_INVALID;
346
51
    }
347
12.1k
  }
348
1.99k
  *nextTokPtr = ptr;
349
1.99k
  return XML_TOK_CDATA_SECT_OPEN;
350
2.04k
}
Unexecuted instantiation: xmltok.c:little2_scanCdataSection
Unexecuted instantiation: xmltok.c:big2_scanCdataSection
351
352
static int PTRCALL
353
PREFIX(cdataSectionTok)(const ENCODING *enc, const char *ptr, const char *end,
354
42.6k
                        const char **nextTokPtr) {
355
42.6k
  if (ptr >= end)
356
209
    return XML_TOK_NONE;
357
42.4k
  if (MINBPC(enc) > 1) {
358
0
    size_t n = end - ptr;
359
0
    if (n & (MINBPC(enc) - 1)) {
360
0
      n &= ~(MINBPC(enc) - 1);
361
0
      if (n == 0)
362
0
        return XML_TOK_PARTIAL;
363
0
      end = ptr + n;
364
0
    }
365
0
  }
366
42.4k
  switch (BYTE_TYPE(enc, ptr)) {
367
6.62k
  case BT_RSQB:
368
6.62k
    ptr += MINBPC(enc);
369
6.62k
    REQUIRE_CHAR(enc, ptr, end);
370
6.62k
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
371
2.52k
      break;
372
4.09k
    ptr += MINBPC(enc);
373
4.09k
    REQUIRE_CHAR(enc, ptr, end);
374
4.08k
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
375
2.30k
      ptr -= MINBPC(enc);
376
2.30k
      break;
377
2.30k
    }
378
1.77k
    *nextTokPtr = ptr + MINBPC(enc);
379
1.77k
    return XML_TOK_CDATA_SECT_CLOSE;
380
7.95k
  case BT_CR:
381
7.95k
    ptr += MINBPC(enc);
382
7.95k
    REQUIRE_CHAR(enc, ptr, end);
383
7.93k
    if (BYTE_TYPE(enc, ptr) == BT_LF)
384
684
      ptr += MINBPC(enc);
385
7.93k
    *nextTokPtr = ptr;
386
7.93k
    return XML_TOK_DATA_NEWLINE;
387
15.8k
  case BT_LF:
388
15.8k
    *nextTokPtr = ptr + MINBPC(enc);
389
15.8k
    return XML_TOK_DATA_NEWLINE;
390
15.8k
    INVALID_CASES(ptr, nextTokPtr)
391
7.59k
  default:
392
7.59k
    ptr += MINBPC(enc);
393
7.59k
    break;
394
42.4k
  }
395
7.30M
  while (HAS_CHAR(enc, ptr, end)) {
396
7.30M
    switch (BYTE_TYPE(enc, ptr)) {
397
0
#  define LEAD_CASE(n)                                                         \
398
6.49M
  case BT_LEAD##n:                                                             \
399
6.49M
    if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) {                       \
400
28
      *nextTokPtr = ptr;                                                       \
401
28
      return XML_TOK_DATA_CHARS;                                               \
402
28
    }                                                                          \
403
6.49M
    ptr += n;                                                                  \
404
6.49M
    break;
405
6.49M
      LEAD_CASE(2)
406
1.23k
      LEAD_CASE(3)
407
931
      LEAD_CASE(4)
408
0
#  undef LEAD_CASE
409
6
    case BT_NONXML:
410
10
    case BT_MALFORM:
411
28
    case BT_TRAIL:
412
4.64k
    case BT_CR:
413
11.1k
    case BT_LF:
414
16.6k
    case BT_RSQB:
415
16.6k
      *nextTokPtr = ptr;
416
16.6k
      return XML_TOK_DATA_CHARS;
417
791k
    default:
418
791k
      ptr += MINBPC(enc);
419
791k
      break;
420
7.30M
    }
421
7.30M
  }
422
106
  *nextTokPtr = ptr;
423
106
  return XML_TOK_DATA_CHARS;
424
16.7k
}
xmltok.c:normal_cdataSectionTok
Line
Count
Source
354
42.6k
                        const char **nextTokPtr) {
355
42.6k
  if (ptr >= end)
356
209
    return XML_TOK_NONE;
357
42.4k
  if (MINBPC(enc) > 1) {
358
0
    size_t n = end - ptr;
359
0
    if (n & (MINBPC(enc) - 1)) {
360
0
      n &= ~(MINBPC(enc) - 1);
361
0
      if (n == 0)
362
0
        return XML_TOK_PARTIAL;
363
0
      end = ptr + n;
364
0
    }
365
0
  }
366
42.4k
  switch (BYTE_TYPE(enc, ptr)) {
367
6.62k
  case BT_RSQB:
368
6.62k
    ptr += MINBPC(enc);
369
6.62k
    REQUIRE_CHAR(enc, ptr, end);
370
6.62k
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
371
2.52k
      break;
372
4.09k
    ptr += MINBPC(enc);
373
4.09k
    REQUIRE_CHAR(enc, ptr, end);
374
4.08k
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
375
2.30k
      ptr -= MINBPC(enc);
376
2.30k
      break;
377
2.30k
    }
378
1.77k
    *nextTokPtr = ptr + MINBPC(enc);
379
1.77k
    return XML_TOK_CDATA_SECT_CLOSE;
380
7.95k
  case BT_CR:
381
7.95k
    ptr += MINBPC(enc);
382
7.95k
    REQUIRE_CHAR(enc, ptr, end);
383
7.93k
    if (BYTE_TYPE(enc, ptr) == BT_LF)
384
684
      ptr += MINBPC(enc);
385
7.93k
    *nextTokPtr = ptr;
386
7.93k
    return XML_TOK_DATA_NEWLINE;
387
15.8k
  case BT_LF:
388
15.8k
    *nextTokPtr = ptr + MINBPC(enc);
389
15.8k
    return XML_TOK_DATA_NEWLINE;
390
15.8k
    INVALID_CASES(ptr, nextTokPtr)
391
7.59k
  default:
392
7.59k
    ptr += MINBPC(enc);
393
7.59k
    break;
394
42.4k
  }
395
7.30M
  while (HAS_CHAR(enc, ptr, end)) {
396
7.30M
    switch (BYTE_TYPE(enc, ptr)) {
397
0
#  define LEAD_CASE(n)                                                         \
398
0
  case BT_LEAD##n:                                                             \
399
0
    if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) {                       \
400
0
      *nextTokPtr = ptr;                                                       \
401
0
      return XML_TOK_DATA_CHARS;                                               \
402
0
    }                                                                          \
403
0
    ptr += n;                                                                  \
404
0
    break;
405
6.49M
      LEAD_CASE(2)
406
1.23k
      LEAD_CASE(3)
407
931
      LEAD_CASE(4)
408
0
#  undef LEAD_CASE
409
6
    case BT_NONXML:
410
10
    case BT_MALFORM:
411
28
    case BT_TRAIL:
412
4.64k
    case BT_CR:
413
11.1k
    case BT_LF:
414
16.6k
    case BT_RSQB:
415
16.6k
      *nextTokPtr = ptr;
416
16.6k
      return XML_TOK_DATA_CHARS;
417
791k
    default:
418
791k
      ptr += MINBPC(enc);
419
791k
      break;
420
7.30M
    }
421
7.30M
  }
422
106
  *nextTokPtr = ptr;
423
106
  return XML_TOK_DATA_CHARS;
424
16.7k
}
Unexecuted instantiation: xmltok.c:little2_cdataSectionTok
Unexecuted instantiation: xmltok.c:big2_cdataSectionTok
425
426
/* ptr points to character following "</" */
427
428
static int PTRCALL
429
PREFIX(scanEndTag)(const ENCODING *enc, const char *ptr, const char *end,
430
135k
                   const char **nextTokPtr) {
431
135k
  REQUIRE_CHAR(enc, ptr, end);
432
135k
  switch (BYTE_TYPE(enc, ptr)) {
433
82.7k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
434
3
  default:
435
3
    *nextTokPtr = ptr;
436
3
    return XML_TOK_INVALID;
437
135k
  }
438
1.17M
  while (HAS_CHAR(enc, ptr, end)) {
439
1.17M
    switch (BYTE_TYPE(enc, ptr)) {
440
2.81M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
441
307
    case BT_S:
442
558
    case BT_CR:
443
665
    case BT_LF:
444
1.22k
      for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
445
1.22k
        switch (BYTE_TYPE(enc, ptr)) {
446
338
        case BT_S:
447
382
        case BT_CR:
448
620
        case BT_LF:
449
620
          break;
450
582
        case BT_GT:
451
582
          *nextTokPtr = ptr + MINBPC(enc);
452
582
          return XML_TOK_END_TAG;
453
19
        default:
454
19
          *nextTokPtr = ptr;
455
19
          return XML_TOK_INVALID;
456
1.22k
        }
457
1.22k
      }
458
64
      return XML_TOK_PARTIAL;
459
#  ifdef XML_NS
460
    case BT_COLON:
461
      /* no need to check qname syntax here,
462
         since end-tag must match exactly */
463
      ptr += MINBPC(enc);
464
      break;
465
#  endif
466
134k
    case BT_GT:
467
134k
      *nextTokPtr = ptr + MINBPC(enc);
468
134k
      return XML_TOK_END_TAG;
469
25
    default:
470
25
      *nextTokPtr = ptr;
471
25
      return XML_TOK_INVALID;
472
1.17M
    }
473
1.17M
  }
474
110
  return XML_TOK_PARTIAL;
475
135k
}
xmltok.c:normal_scanEndTag
Line
Count
Source
430
135k
                   const char **nextTokPtr) {
431
135k
  REQUIRE_CHAR(enc, ptr, end);
432
135k
  switch (BYTE_TYPE(enc, ptr)) {
433
82.7k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
434
3
  default:
435
3
    *nextTokPtr = ptr;
436
3
    return XML_TOK_INVALID;
437
135k
  }
438
1.17M
  while (HAS_CHAR(enc, ptr, end)) {
439
1.17M
    switch (BYTE_TYPE(enc, ptr)) {
440
2.81M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
441
307
    case BT_S:
442
558
    case BT_CR:
443
665
    case BT_LF:
444
1.22k
      for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
445
1.22k
        switch (BYTE_TYPE(enc, ptr)) {
446
338
        case BT_S:
447
382
        case BT_CR:
448
620
        case BT_LF:
449
620
          break;
450
582
        case BT_GT:
451
582
          *nextTokPtr = ptr + MINBPC(enc);
452
582
          return XML_TOK_END_TAG;
453
19
        default:
454
19
          *nextTokPtr = ptr;
455
19
          return XML_TOK_INVALID;
456
1.22k
        }
457
1.22k
      }
458
64
      return XML_TOK_PARTIAL;
459
#  ifdef XML_NS
460
    case BT_COLON:
461
      /* no need to check qname syntax here,
462
         since end-tag must match exactly */
463
      ptr += MINBPC(enc);
464
      break;
465
#  endif
466
134k
    case BT_GT:
467
134k
      *nextTokPtr = ptr + MINBPC(enc);
468
134k
      return XML_TOK_END_TAG;
469
25
    default:
470
25
      *nextTokPtr = ptr;
471
25
      return XML_TOK_INVALID;
472
1.17M
    }
473
1.17M
  }
474
110
  return XML_TOK_PARTIAL;
475
135k
}
Unexecuted instantiation: xmltok.c:little2_scanEndTag
Unexecuted instantiation: xmltok.c:big2_scanEndTag
476
477
/* ptr points to character following "&#X" */
478
479
static int PTRCALL
480
PREFIX(scanHexCharRef)(const ENCODING *enc, const char *ptr, const char *end,
481
748k
                       const char **nextTokPtr) {
482
748k
  if (HAS_CHAR(enc, ptr, end)) {
483
748k
    switch (BYTE_TYPE(enc, ptr)) {
484
741k
    case BT_DIGIT:
485
748k
    case BT_HEX:
486
748k
      break;
487
10
    default:
488
10
      *nextTokPtr = ptr;
489
10
      return XML_TOK_INVALID;
490
748k
    }
491
2.60M
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
492
2.60M
      switch (BYTE_TYPE(enc, ptr)) {
493
1.05M
      case BT_DIGIT:
494
1.85M
      case BT_HEX:
495
1.85M
        break;
496
748k
      case BT_SEMI:
497
748k
        *nextTokPtr = ptr + MINBPC(enc);
498
748k
        return XML_TOK_CHAR_REF;
499
11
      default:
500
11
        *nextTokPtr = ptr;
501
11
        return XML_TOK_INVALID;
502
2.60M
      }
503
2.60M
    }
504
748k
  }
505
31
  return XML_TOK_PARTIAL;
506
748k
}
xmltok.c:normal_scanHexCharRef
Line
Count
Source
481
748k
                       const char **nextTokPtr) {
482
748k
  if (HAS_CHAR(enc, ptr, end)) {
483
748k
    switch (BYTE_TYPE(enc, ptr)) {
484
741k
    case BT_DIGIT:
485
748k
    case BT_HEX:
486
748k
      break;
487
10
    default:
488
10
      *nextTokPtr = ptr;
489
10
      return XML_TOK_INVALID;
490
748k
    }
491
2.60M
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
492
2.60M
      switch (BYTE_TYPE(enc, ptr)) {
493
1.05M
      case BT_DIGIT:
494
1.85M
      case BT_HEX:
495
1.85M
        break;
496
748k
      case BT_SEMI:
497
748k
        *nextTokPtr = ptr + MINBPC(enc);
498
748k
        return XML_TOK_CHAR_REF;
499
11
      default:
500
11
        *nextTokPtr = ptr;
501
11
        return XML_TOK_INVALID;
502
2.60M
      }
503
2.60M
    }
504
748k
  }
505
31
  return XML_TOK_PARTIAL;
506
748k
}
Unexecuted instantiation: xmltok.c:little2_scanHexCharRef
Unexecuted instantiation: xmltok.c:big2_scanHexCharRef
507
508
/* ptr points to character following "&#" */
509
510
static int PTRCALL
511
PREFIX(scanCharRef)(const ENCODING *enc, const char *ptr, const char *end,
512
755k
                    const char **nextTokPtr) {
513
755k
  if (HAS_CHAR(enc, ptr, end)) {
514
755k
    if (CHAR_MATCHES(enc, ptr, ASCII_x))
515
748k
      return PREFIX(scanHexCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
516
6.38k
    switch (BYTE_TYPE(enc, ptr)) {
517
6.36k
    case BT_DIGIT:
518
6.36k
      break;
519
19
    default:
520
19
      *nextTokPtr = ptr;
521
19
      return XML_TOK_INVALID;
522
6.38k
    }
523
19.5k
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
524
19.5k
      switch (BYTE_TYPE(enc, ptr)) {
525
13.2k
      case BT_DIGIT:
526
13.2k
        break;
527
6.35k
      case BT_SEMI:
528
6.35k
        *nextTokPtr = ptr + MINBPC(enc);
529
6.35k
        return XML_TOK_CHAR_REF;
530
3
      default:
531
3
        *nextTokPtr = ptr;
532
3
        return XML_TOK_INVALID;
533
19.5k
      }
534
19.5k
    }
535
6.36k
  }
536
13
  return XML_TOK_PARTIAL;
537
755k
}
xmltok.c:normal_scanCharRef
Line
Count
Source
512
755k
                    const char **nextTokPtr) {
513
755k
  if (HAS_CHAR(enc, ptr, end)) {
514
755k
    if (CHAR_MATCHES(enc, ptr, ASCII_x))
515
748k
      return PREFIX(scanHexCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
516
6.38k
    switch (BYTE_TYPE(enc, ptr)) {
517
6.36k
    case BT_DIGIT:
518
6.36k
      break;
519
19
    default:
520
19
      *nextTokPtr = ptr;
521
19
      return XML_TOK_INVALID;
522
6.38k
    }
523
19.5k
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
524
19.5k
      switch (BYTE_TYPE(enc, ptr)) {
525
13.2k
      case BT_DIGIT:
526
13.2k
        break;
527
6.35k
      case BT_SEMI:
528
6.35k
        *nextTokPtr = ptr + MINBPC(enc);
529
6.35k
        return XML_TOK_CHAR_REF;
530
3
      default:
531
3
        *nextTokPtr = ptr;
532
3
        return XML_TOK_INVALID;
533
19.5k
      }
534
19.5k
    }
535
6.36k
  }
536
13
  return XML_TOK_PARTIAL;
537
755k
}
Unexecuted instantiation: xmltok.c:little2_scanCharRef
Unexecuted instantiation: xmltok.c:big2_scanCharRef
538
539
/* ptr points to character following "&" */
540
541
static int PTRCALL
542
PREFIX(scanRef)(const ENCODING *enc, const char *ptr, const char *end,
543
11.3M
                const char **nextTokPtr) {
544
11.3M
  REQUIRE_CHAR(enc, ptr, end);
545
11.3M
  switch (BYTE_TYPE(enc, ptr)) {
546
10.5M
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
547
755k
  case BT_NUM:
548
755k
    return PREFIX(scanCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
549
55
  default:
550
55
    *nextTokPtr = ptr;
551
55
    return XML_TOK_INVALID;
552
11.3M
  }
553
63.2M
  while (HAS_CHAR(enc, ptr, end)) {
554
63.2M
    switch (BYTE_TYPE(enc, ptr)) {
555
178M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
556
10.5M
    case BT_SEMI:
557
10.5M
      *nextTokPtr = ptr + MINBPC(enc);
558
10.5M
      return XML_TOK_ENTITY_REF;
559
69
    default:
560
69
      *nextTokPtr = ptr;
561
69
      return XML_TOK_INVALID;
562
63.2M
    }
563
63.2M
  }
564
117
  return XML_TOK_PARTIAL;
565
10.5M
}
xmltok.c:normal_scanRef
Line
Count
Source
543
11.3M
                const char **nextTokPtr) {
544
11.3M
  REQUIRE_CHAR(enc, ptr, end);
545
11.3M
  switch (BYTE_TYPE(enc, ptr)) {
546
10.5M
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
547
755k
  case BT_NUM:
548
755k
    return PREFIX(scanCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
549
55
  default:
550
55
    *nextTokPtr = ptr;
551
55
    return XML_TOK_INVALID;
552
11.3M
  }
553
63.2M
  while (HAS_CHAR(enc, ptr, end)) {
554
63.2M
    switch (BYTE_TYPE(enc, ptr)) {
555
178M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
556
10.5M
    case BT_SEMI:
557
10.5M
      *nextTokPtr = ptr + MINBPC(enc);
558
10.5M
      return XML_TOK_ENTITY_REF;
559
69
    default:
560
69
      *nextTokPtr = ptr;
561
69
      return XML_TOK_INVALID;
562
63.2M
    }
563
63.2M
  }
564
117
  return XML_TOK_PARTIAL;
565
10.5M
}
Unexecuted instantiation: xmltok.c:little2_scanRef
Unexecuted instantiation: xmltok.c:big2_scanRef
566
567
/* ptr points to character following first character of attribute name */
568
569
static int PTRCALL
570
PREFIX(scanAtts)(const ENCODING *enc, const char *ptr, const char *end,
571
14.8k
                 const char **nextTokPtr) {
572
#  ifdef XML_NS
573
  int hadColon = 0;
574
#  endif
575
872k
  while (HAS_CHAR(enc, ptr, end)) {
576
872k
    switch (BYTE_TYPE(enc, ptr)) {
577
457k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
578
#  ifdef XML_NS
579
    case BT_COLON:
580
      if (hadColon) {
581
        *nextTokPtr = ptr;
582
        return XML_TOK_INVALID;
583
      }
584
      hadColon = 1;
585
      ptr += MINBPC(enc);
586
      REQUIRE_CHAR(enc, ptr, end);
587
      switch (BYTE_TYPE(enc, ptr)) {
588
        CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
589
      default:
590
        *nextTokPtr = ptr;
591
        return XML_TOK_INVALID;
592
      }
593
      break;
594
#  endif
595
6.29k
    case BT_S:
596
6.57k
    case BT_CR:
597
7.41k
    case BT_LF:
598
8.55k
      for (;;) {
599
8.55k
        int t;
600
601
8.55k
        ptr += MINBPC(enc);
602
8.55k
        REQUIRE_CHAR(enc, ptr, end);
603
8.48k
        t = BYTE_TYPE(enc, ptr);
604
8.48k
        if (t == BT_EQUALS)
605
7.31k
          break;
606
1.16k
        switch (t) {
607
328
        case BT_S:
608
848
        case BT_LF:
609
1.14k
        case BT_CR:
610
1.14k
          break;
611
21
        default:
612
21
          *nextTokPtr = ptr;
613
21
          return XML_TOK_INVALID;
614
1.16k
        }
615
1.16k
      }
616
      /* fall through */
617
724k
    case BT_EQUALS: {
618
724k
      int open;
619
#  ifdef XML_NS
620
      hadColon = 0;
621
#  endif
622
725k
      for (;;) {
623
725k
        ptr += MINBPC(enc);
624
725k
        REQUIRE_CHAR(enc, ptr, end);
625
725k
        open = BYTE_TYPE(enc, ptr);
626
725k
        if (open == BT_QUOT || open == BT_APOS)
627
724k
          break;
628
940
        switch (open) {
629
248
        case BT_S:
630
553
        case BT_LF:
631
912
        case BT_CR:
632
912
          break;
633
28
        default:
634
28
          *nextTokPtr = ptr;
635
28
          return XML_TOK_INVALID;
636
940
        }
637
940
      }
638
724k
      ptr += MINBPC(enc);
639
      /* in attribute value */
640
8.07M
      for (;;) {
641
8.07M
        int t;
642
8.07M
        REQUIRE_CHAR(enc, ptr, end);
643
8.07M
        t = BYTE_TYPE(enc, ptr);
644
8.07M
        if (t == open)
645
723k
          break;
646
7.35M
        switch (t) {
647
13.1M
          INVALID_CASES(ptr, nextTokPtr)
648
25.3k
        case BT_AMP: {
649
25.3k
          int tok = PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, &ptr);
650
25.3k
          if (tok <= 0) {
651
43
            if (tok == XML_TOK_INVALID)
652
18
              *nextTokPtr = ptr;
653
43
            return tok;
654
43
          }
655
25.2k
          break;
656
25.3k
        }
657
25.2k
        case BT_LT:
658
16
          *nextTokPtr = ptr;
659
16
          return XML_TOK_INVALID;
660
744k
        default:
661
744k
          ptr += MINBPC(enc);
662
744k
          break;
663
7.35M
        }
664
7.35M
      }
665
723k
      ptr += MINBPC(enc);
666
723k
      REQUIRE_CHAR(enc, ptr, end);
667
723k
      switch (BYTE_TYPE(enc, ptr)) {
668
374k
      case BT_S:
669
703k
      case BT_CR:
670
716k
      case BT_LF:
671
716k
        break;
672
5.08k
      case BT_SOL:
673
5.08k
        goto sol;
674
2.76k
      case BT_GT:
675
2.76k
        goto gt;
676
9
      default:
677
9
        *nextTokPtr = ptr;
678
9
        return XML_TOK_INVALID;
679
723k
      }
680
      /* ptr points to closing quote */
681
892k
      for (;;) {
682
892k
        ptr += MINBPC(enc);
683
892k
        REQUIRE_CHAR(enc, ptr, end);
684
892k
        switch (BYTE_TYPE(enc, ptr)) {
685
714k
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
686
140k
        case BT_S:
687
167k
        case BT_CR:
688
176k
        case BT_LF:
689
176k
          continue;
690
2.49k
        case BT_GT:
691
5.25k
        gt:
692
5.25k
          *nextTokPtr = ptr + MINBPC(enc);
693
5.25k
          return XML_TOK_START_TAG_WITH_ATTS;
694
3.74k
        case BT_SOL:
695
8.82k
        sol:
696
8.82k
          ptr += MINBPC(enc);
697
8.82k
          REQUIRE_CHAR(enc, ptr, end);
698
8.81k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
699
14
            *nextTokPtr = ptr;
700
14
            return XML_TOK_INVALID;
701
14
          }
702
8.80k
          *nextTokPtr = ptr + MINBPC(enc);
703
8.80k
          return XML_TOK_EMPTY_ELEMENT_WITH_ATTS;
704
13
        default:
705
13
          *nextTokPtr = ptr;
706
13
          return XML_TOK_INVALID;
707
892k
        }
708
709k
        break;
709
892k
      }
710
709k
      break;
711
716k
    }
712
709k
    default:
713
38
      *nextTokPtr = ptr;
714
38
      return XML_TOK_INVALID;
715
872k
    }
716
872k
  }
717
133
  return XML_TOK_PARTIAL;
718
14.8k
}
xmltok.c:normal_scanAtts
Line
Count
Source
571
14.8k
                 const char **nextTokPtr) {
572
#  ifdef XML_NS
573
  int hadColon = 0;
574
#  endif
575
872k
  while (HAS_CHAR(enc, ptr, end)) {
576
872k
    switch (BYTE_TYPE(enc, ptr)) {
577
457k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
578
#  ifdef XML_NS
579
    case BT_COLON:
580
      if (hadColon) {
581
        *nextTokPtr = ptr;
582
        return XML_TOK_INVALID;
583
      }
584
      hadColon = 1;
585
      ptr += MINBPC(enc);
586
      REQUIRE_CHAR(enc, ptr, end);
587
      switch (BYTE_TYPE(enc, ptr)) {
588
        CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
589
      default:
590
        *nextTokPtr = ptr;
591
        return XML_TOK_INVALID;
592
      }
593
      break;
594
#  endif
595
6.29k
    case BT_S:
596
6.57k
    case BT_CR:
597
7.41k
    case BT_LF:
598
8.55k
      for (;;) {
599
8.55k
        int t;
600
601
8.55k
        ptr += MINBPC(enc);
602
8.55k
        REQUIRE_CHAR(enc, ptr, end);
603
8.48k
        t = BYTE_TYPE(enc, ptr);
604
8.48k
        if (t == BT_EQUALS)
605
7.31k
          break;
606
1.16k
        switch (t) {
607
328
        case BT_S:
608
848
        case BT_LF:
609
1.14k
        case BT_CR:
610
1.14k
          break;
611
21
        default:
612
21
          *nextTokPtr = ptr;
613
21
          return XML_TOK_INVALID;
614
1.16k
        }
615
1.16k
      }
616
      /* fall through */
617
724k
    case BT_EQUALS: {
618
724k
      int open;
619
#  ifdef XML_NS
620
      hadColon = 0;
621
#  endif
622
725k
      for (;;) {
623
725k
        ptr += MINBPC(enc);
624
725k
        REQUIRE_CHAR(enc, ptr, end);
625
725k
        open = BYTE_TYPE(enc, ptr);
626
725k
        if (open == BT_QUOT || open == BT_APOS)
627
724k
          break;
628
940
        switch (open) {
629
248
        case BT_S:
630
553
        case BT_LF:
631
912
        case BT_CR:
632
912
          break;
633
28
        default:
634
28
          *nextTokPtr = ptr;
635
28
          return XML_TOK_INVALID;
636
940
        }
637
940
      }
638
724k
      ptr += MINBPC(enc);
639
      /* in attribute value */
640
8.07M
      for (;;) {
641
8.07M
        int t;
642
8.07M
        REQUIRE_CHAR(enc, ptr, end);
643
8.07M
        t = BYTE_TYPE(enc, ptr);
644
8.07M
        if (t == open)
645
723k
          break;
646
7.35M
        switch (t) {
647
13.1M
          INVALID_CASES(ptr, nextTokPtr)
648
25.3k
        case BT_AMP: {
649
25.3k
          int tok = PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, &ptr);
650
25.3k
          if (tok <= 0) {
651
43
            if (tok == XML_TOK_INVALID)
652
18
              *nextTokPtr = ptr;
653
43
            return tok;
654
43
          }
655
25.2k
          break;
656
25.3k
        }
657
25.2k
        case BT_LT:
658
16
          *nextTokPtr = ptr;
659
16
          return XML_TOK_INVALID;
660
744k
        default:
661
744k
          ptr += MINBPC(enc);
662
744k
          break;
663
7.35M
        }
664
7.35M
      }
665
723k
      ptr += MINBPC(enc);
666
723k
      REQUIRE_CHAR(enc, ptr, end);
667
723k
      switch (BYTE_TYPE(enc, ptr)) {
668
374k
      case BT_S:
669
703k
      case BT_CR:
670
716k
      case BT_LF:
671
716k
        break;
672
5.08k
      case BT_SOL:
673
5.08k
        goto sol;
674
2.76k
      case BT_GT:
675
2.76k
        goto gt;
676
9
      default:
677
9
        *nextTokPtr = ptr;
678
9
        return XML_TOK_INVALID;
679
723k
      }
680
      /* ptr points to closing quote */
681
892k
      for (;;) {
682
892k
        ptr += MINBPC(enc);
683
892k
        REQUIRE_CHAR(enc, ptr, end);
684
892k
        switch (BYTE_TYPE(enc, ptr)) {
685
714k
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
686
140k
        case BT_S:
687
167k
        case BT_CR:
688
176k
        case BT_LF:
689
176k
          continue;
690
2.49k
        case BT_GT:
691
5.25k
        gt:
692
5.25k
          *nextTokPtr = ptr + MINBPC(enc);
693
5.25k
          return XML_TOK_START_TAG_WITH_ATTS;
694
3.74k
        case BT_SOL:
695
8.82k
        sol:
696
8.82k
          ptr += MINBPC(enc);
697
8.82k
          REQUIRE_CHAR(enc, ptr, end);
698
8.81k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
699
14
            *nextTokPtr = ptr;
700
14
            return XML_TOK_INVALID;
701
14
          }
702
8.80k
          *nextTokPtr = ptr + MINBPC(enc);
703
8.80k
          return XML_TOK_EMPTY_ELEMENT_WITH_ATTS;
704
13
        default:
705
13
          *nextTokPtr = ptr;
706
13
          return XML_TOK_INVALID;
707
892k
        }
708
709k
        break;
709
892k
      }
710
709k
      break;
711
716k
    }
712
709k
    default:
713
38
      *nextTokPtr = ptr;
714
38
      return XML_TOK_INVALID;
715
872k
    }
716
872k
  }
717
133
  return XML_TOK_PARTIAL;
718
14.8k
}
Unexecuted instantiation: xmltok.c:little2_scanAtts
Unexecuted instantiation: xmltok.c:big2_scanAtts
719
720
/* ptr points to character following "<" */
721
722
static int PTRCALL
723
PREFIX(scanLt)(const ENCODING *enc, const char *ptr, const char *end,
724
1.50M
               const char **nextTokPtr) {
725
#  ifdef XML_NS
726
  int hadColon;
727
#  endif
728
1.50M
  REQUIRE_CHAR(enc, ptr, end);
729
1.50M
  switch (BYTE_TYPE(enc, ptr)) {
730
656k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
731
2.73k
  case BT_EXCL:
732
2.73k
    ptr += MINBPC(enc);
733
2.73k
    REQUIRE_CHAR(enc, ptr, end);
734
2.73k
    switch (BYTE_TYPE(enc, ptr)) {
735
670
    case BT_MINUS:
736
670
      return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
737
2.05k
    case BT_LSQB:
738
2.05k
      return PREFIX(scanCdataSection)(enc, ptr + MINBPC(enc), end, nextTokPtr);
739
2.73k
    }
740
11
    *nextTokPtr = ptr;
741
11
    return XML_TOK_INVALID;
742
5.41k
  case BT_QUEST:
743
5.41k
    return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
744
135k
  case BT_SOL:
745
135k
    return PREFIX(scanEndTag)(enc, ptr + MINBPC(enc), end, nextTokPtr);
746
31
  default:
747
31
    *nextTokPtr = ptr;
748
31
    return XML_TOK_INVALID;
749
1.50M
  }
750
#  ifdef XML_NS
751
  hadColon = 0;
752
#  endif
753
  /* we have a start-tag */
754
12.3M
  while (HAS_CHAR(enc, ptr, end)) {
755
12.3M
    switch (BYTE_TYPE(enc, ptr)) {
756
26.9M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
757
#  ifdef XML_NS
758
    case BT_COLON:
759
      if (hadColon) {
760
        *nextTokPtr = ptr;
761
        return XML_TOK_INVALID;
762
      }
763
      hadColon = 1;
764
      ptr += MINBPC(enc);
765
      REQUIRE_CHAR(enc, ptr, end);
766
      switch (BYTE_TYPE(enc, ptr)) {
767
        CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
768
      default:
769
        *nextTokPtr = ptr;
770
        return XML_TOK_INVALID;
771
      }
772
      break;
773
#  endif
774
16.2k
    case BT_S:
775
17.3k
    case BT_CR:
776
18.5k
    case BT_LF: {
777
18.5k
      ptr += MINBPC(enc);
778
20.2k
      while (HAS_CHAR(enc, ptr, end)) {
779
20.2k
        switch (BYTE_TYPE(enc, ptr)) {
780
15.2k
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
781
450
        case BT_GT:
782
450
          goto gt;
783
3.17k
        case BT_SOL:
784
3.17k
          goto sol;
785
443
        case BT_S:
786
1.07k
        case BT_CR:
787
1.79k
        case BT_LF:
788
1.79k
          ptr += MINBPC(enc);
789
1.79k
          continue;
790
9
        default:
791
9
          *nextTokPtr = ptr;
792
9
          return XML_TOK_INVALID;
793
20.2k
        }
794
14.8k
        return PREFIX(scanAtts)(enc, ptr, end, nextTokPtr);
795
20.2k
      }
796
78
      return XML_TOK_PARTIAL;
797
18.5k
    }
798
1.33M
    case BT_GT:
799
1.33M
    gt:
800
1.33M
      *nextTokPtr = ptr + MINBPC(enc);
801
1.33M
      return XML_TOK_START_TAG_NO_ATTS;
802
2.56k
    case BT_SOL:
803
5.73k
    sol:
804
5.73k
      ptr += MINBPC(enc);
805
5.73k
      REQUIRE_CHAR(enc, ptr, end);
806
5.72k
      if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
807
15
        *nextTokPtr = ptr;
808
15
        return XML_TOK_INVALID;
809
15
      }
810
5.71k
      *nextTokPtr = ptr + MINBPC(enc);
811
5.71k
      return XML_TOK_EMPTY_ELEMENT_NO_ATTS;
812
64
    default:
813
64
      *nextTokPtr = ptr;
814
64
      return XML_TOK_INVALID;
815
12.3M
    }
816
12.3M
  }
817
196
  return XML_TOK_PARTIAL;
818
1.35M
}
xmltok.c:normal_scanLt
Line
Count
Source
724
1.50M
               const char **nextTokPtr) {
725
#  ifdef XML_NS
726
  int hadColon;
727
#  endif
728
1.50M
  REQUIRE_CHAR(enc, ptr, end);
729
1.50M
  switch (BYTE_TYPE(enc, ptr)) {
730
656k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
731
2.73k
  case BT_EXCL:
732
2.73k
    ptr += MINBPC(enc);
733
2.73k
    REQUIRE_CHAR(enc, ptr, end);
734
2.73k
    switch (BYTE_TYPE(enc, ptr)) {
735
670
    case BT_MINUS:
736
670
      return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
737
2.05k
    case BT_LSQB:
738
2.05k
      return PREFIX(scanCdataSection)(enc, ptr + MINBPC(enc), end, nextTokPtr);
739
2.73k
    }
740
11
    *nextTokPtr = ptr;
741
11
    return XML_TOK_INVALID;
742
5.41k
  case BT_QUEST:
743
5.41k
    return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
744
135k
  case BT_SOL:
745
135k
    return PREFIX(scanEndTag)(enc, ptr + MINBPC(enc), end, nextTokPtr);
746
31
  default:
747
31
    *nextTokPtr = ptr;
748
31
    return XML_TOK_INVALID;
749
1.50M
  }
750
#  ifdef XML_NS
751
  hadColon = 0;
752
#  endif
753
  /* we have a start-tag */
754
12.3M
  while (HAS_CHAR(enc, ptr, end)) {
755
12.3M
    switch (BYTE_TYPE(enc, ptr)) {
756
26.9M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
757
#  ifdef XML_NS
758
    case BT_COLON:
759
      if (hadColon) {
760
        *nextTokPtr = ptr;
761
        return XML_TOK_INVALID;
762
      }
763
      hadColon = 1;
764
      ptr += MINBPC(enc);
765
      REQUIRE_CHAR(enc, ptr, end);
766
      switch (BYTE_TYPE(enc, ptr)) {
767
        CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
768
      default:
769
        *nextTokPtr = ptr;
770
        return XML_TOK_INVALID;
771
      }
772
      break;
773
#  endif
774
16.2k
    case BT_S:
775
17.3k
    case BT_CR:
776
18.5k
    case BT_LF: {
777
18.5k
      ptr += MINBPC(enc);
778
20.2k
      while (HAS_CHAR(enc, ptr, end)) {
779
20.2k
        switch (BYTE_TYPE(enc, ptr)) {
780
15.2k
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
781
450
        case BT_GT:
782
450
          goto gt;
783
3.17k
        case BT_SOL:
784
3.17k
          goto sol;
785
443
        case BT_S:
786
1.07k
        case BT_CR:
787
1.79k
        case BT_LF:
788
1.79k
          ptr += MINBPC(enc);
789
1.79k
          continue;
790
9
        default:
791
9
          *nextTokPtr = ptr;
792
9
          return XML_TOK_INVALID;
793
20.2k
        }
794
14.8k
        return PREFIX(scanAtts)(enc, ptr, end, nextTokPtr);
795
20.2k
      }
796
78
      return XML_TOK_PARTIAL;
797
18.5k
    }
798
1.33M
    case BT_GT:
799
1.33M
    gt:
800
1.33M
      *nextTokPtr = ptr + MINBPC(enc);
801
1.33M
      return XML_TOK_START_TAG_NO_ATTS;
802
2.56k
    case BT_SOL:
803
5.73k
    sol:
804
5.73k
      ptr += MINBPC(enc);
805
5.73k
      REQUIRE_CHAR(enc, ptr, end);
806
5.72k
      if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
807
15
        *nextTokPtr = ptr;
808
15
        return XML_TOK_INVALID;
809
15
      }
810
5.71k
      *nextTokPtr = ptr + MINBPC(enc);
811
5.71k
      return XML_TOK_EMPTY_ELEMENT_NO_ATTS;
812
64
    default:
813
64
      *nextTokPtr = ptr;
814
64
      return XML_TOK_INVALID;
815
12.3M
    }
816
12.3M
  }
817
196
  return XML_TOK_PARTIAL;
818
1.35M
}
Unexecuted instantiation: xmltok.c:little2_scanLt
Unexecuted instantiation: xmltok.c:big2_scanLt
819
820
static int PTRCALL
821
PREFIX(contentTok)(const ENCODING *enc, const char *ptr, const char *end,
822
3.37M
                   const char **nextTokPtr) {
823
3.37M
  if (ptr >= end)
824
18.2k
    return XML_TOK_NONE;
825
3.35M
  if (MINBPC(enc) > 1) {
826
0
    size_t n = end - ptr;
827
0
    if (n & (MINBPC(enc) - 1)) {
828
0
      n &= ~(MINBPC(enc) - 1);
829
0
      if (n == 0)
830
0
        return XML_TOK_PARTIAL;
831
0
      end = ptr + n;
832
0
    }
833
0
  }
834
3.35M
  switch (BYTE_TYPE(enc, ptr)) {
835
1.50M
  case BT_LT:
836
1.50M
    return PREFIX(scanLt)(enc, ptr + MINBPC(enc), end, nextTokPtr);
837
62.6k
  case BT_AMP:
838
62.6k
    return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
839
13.8k
  case BT_CR:
840
13.8k
    ptr += MINBPC(enc);
841
13.8k
    if (! HAS_CHAR(enc, ptr, end))
842
18
      return XML_TOK_TRAILING_CR;
843
13.8k
    if (BYTE_TYPE(enc, ptr) == BT_LF)
844
1.11k
      ptr += MINBPC(enc);
845
13.8k
    *nextTokPtr = ptr;
846
13.8k
    return XML_TOK_DATA_NEWLINE;
847
838k
  case BT_LF:
848
838k
    *nextTokPtr = ptr + MINBPC(enc);
849
838k
    return XML_TOK_DATA_NEWLINE;
850
6.80k
  case BT_RSQB:
851
6.80k
    ptr += MINBPC(enc);
852
6.80k
    if (! HAS_CHAR(enc, ptr, end))
853
4.40k
      return XML_TOK_TRAILING_RSQB;
854
2.39k
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
855
1.31k
      break;
856
1.07k
    ptr += MINBPC(enc);
857
1.07k
    if (! HAS_CHAR(enc, ptr, end))
858
229
      return XML_TOK_TRAILING_RSQB;
859
846
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
860
846
      ptr -= MINBPC(enc);
861
846
      break;
862
846
    }
863
0
    *nextTokPtr = ptr;
864
0
    return XML_TOK_INVALID;
865
97.3k
    INVALID_CASES(ptr, nextTokPtr)
866
887k
  default:
867
887k
    ptr += MINBPC(enc);
868
887k
    break;
869
3.35M
  }
870
42.7M
  while (HAS_CHAR(enc, ptr, end)) {
871
42.7M
    switch (BYTE_TYPE(enc, ptr)) {
872
0
#  define LEAD_CASE(n)                                                         \
873
21.8M
  case BT_LEAD##n:                                                             \
874
21.8M
    if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) {                       \
875
42
      *nextTokPtr = ptr;                                                       \
876
42
      return XML_TOK_DATA_CHARS;                                               \
877
42
    }                                                                          \
878
21.8M
    ptr += n;                                                                  \
879
21.8M
    break;
880
21.7M
      LEAD_CASE(2)
881
12.7k
      LEAD_CASE(3)
882
30.5k
      LEAD_CASE(4)
883
0
#  undef LEAD_CASE
884
45.9k
    case BT_RSQB:
885
45.9k
      if (HAS_CHARS(enc, ptr, end, 2)) {
886
41.5k
        if (! CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_RSQB)) {
887
34.4k
          ptr += MINBPC(enc);
888
34.4k
          break;
889
34.4k
        }
890
7.16k
        if (HAS_CHARS(enc, ptr, end, 3)) {
891
6.94k
          if (! CHAR_MATCHES(enc, ptr + 2 * MINBPC(enc), ASCII_GT)) {
892
6.94k
            ptr += MINBPC(enc);
893
6.94k
            break;
894
6.94k
          }
895
1
          *nextTokPtr = ptr + 2 * MINBPC(enc);
896
1
          return XML_TOK_INVALID;
897
6.94k
        }
898
7.16k
      }
899
      /* fall through */
900
47.7k
    case BT_AMP:
901
136k
    case BT_LT:
902
136k
    case BT_NONXML:
903
136k
    case BT_MALFORM:
904
136k
    case BT_TRAIL:
905
148k
    case BT_CR:
906
932k
    case BT_LF:
907
932k
      *nextTokPtr = ptr;
908
932k
      return XML_TOK_DATA_CHARS;
909
19.9M
    default:
910
19.9M
      ptr += MINBPC(enc);
911
19.9M
      break;
912
42.7M
    }
913
42.7M
  }
914
6.15k
  *nextTokPtr = ptr;
915
6.15k
  return XML_TOK_DATA_CHARS;
916
938k
}
xmltok.c:normal_contentTok
Line
Count
Source
822
3.37M
                   const char **nextTokPtr) {
823
3.37M
  if (ptr >= end)
824
18.2k
    return XML_TOK_NONE;
825
3.35M
  if (MINBPC(enc) > 1) {
826
0
    size_t n = end - ptr;
827
0
    if (n & (MINBPC(enc) - 1)) {
828
0
      n &= ~(MINBPC(enc) - 1);
829
0
      if (n == 0)
830
0
        return XML_TOK_PARTIAL;
831
0
      end = ptr + n;
832
0
    }
833
0
  }
834
3.35M
  switch (BYTE_TYPE(enc, ptr)) {
835
1.50M
  case BT_LT:
836
1.50M
    return PREFIX(scanLt)(enc, ptr + MINBPC(enc), end, nextTokPtr);
837
62.6k
  case BT_AMP:
838
62.6k
    return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
839
13.8k
  case BT_CR:
840
13.8k
    ptr += MINBPC(enc);
841
13.8k
    if (! HAS_CHAR(enc, ptr, end))
842
18
      return XML_TOK_TRAILING_CR;
843
13.8k
    if (BYTE_TYPE(enc, ptr) == BT_LF)
844
1.11k
      ptr += MINBPC(enc);
845
13.8k
    *nextTokPtr = ptr;
846
13.8k
    return XML_TOK_DATA_NEWLINE;
847
838k
  case BT_LF:
848
838k
    *nextTokPtr = ptr + MINBPC(enc);
849
838k
    return XML_TOK_DATA_NEWLINE;
850
6.80k
  case BT_RSQB:
851
6.80k
    ptr += MINBPC(enc);
852
6.80k
    if (! HAS_CHAR(enc, ptr, end))
853
4.40k
      return XML_TOK_TRAILING_RSQB;
854
2.39k
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
855
1.31k
      break;
856
1.07k
    ptr += MINBPC(enc);
857
1.07k
    if (! HAS_CHAR(enc, ptr, end))
858
229
      return XML_TOK_TRAILING_RSQB;
859
846
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
860
846
      ptr -= MINBPC(enc);
861
846
      break;
862
846
    }
863
0
    *nextTokPtr = ptr;
864
0
    return XML_TOK_INVALID;
865
97.3k
    INVALID_CASES(ptr, nextTokPtr)
866
887k
  default:
867
887k
    ptr += MINBPC(enc);
868
887k
    break;
869
3.35M
  }
870
42.7M
  while (HAS_CHAR(enc, ptr, end)) {
871
42.7M
    switch (BYTE_TYPE(enc, ptr)) {
872
0
#  define LEAD_CASE(n)                                                         \
873
0
  case BT_LEAD##n:                                                             \
874
0
    if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) {                       \
875
0
      *nextTokPtr = ptr;                                                       \
876
0
      return XML_TOK_DATA_CHARS;                                               \
877
0
    }                                                                          \
878
0
    ptr += n;                                                                  \
879
0
    break;
880
21.7M
      LEAD_CASE(2)
881
12.7k
      LEAD_CASE(3)
882
30.5k
      LEAD_CASE(4)
883
0
#  undef LEAD_CASE
884
45.9k
    case BT_RSQB:
885
45.9k
      if (HAS_CHARS(enc, ptr, end, 2)) {
886
41.5k
        if (! CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_RSQB)) {
887
34.4k
          ptr += MINBPC(enc);
888
34.4k
          break;
889
34.4k
        }
890
7.16k
        if (HAS_CHARS(enc, ptr, end, 3)) {
891
6.94k
          if (! CHAR_MATCHES(enc, ptr + 2 * MINBPC(enc), ASCII_GT)) {
892
6.94k
            ptr += MINBPC(enc);
893
6.94k
            break;
894
6.94k
          }
895
1
          *nextTokPtr = ptr + 2 * MINBPC(enc);
896
1
          return XML_TOK_INVALID;
897
6.94k
        }
898
7.16k
      }
899
      /* fall through */
900
47.7k
    case BT_AMP:
901
136k
    case BT_LT:
902
136k
    case BT_NONXML:
903
136k
    case BT_MALFORM:
904
136k
    case BT_TRAIL:
905
148k
    case BT_CR:
906
932k
    case BT_LF:
907
932k
      *nextTokPtr = ptr;
908
932k
      return XML_TOK_DATA_CHARS;
909
19.9M
    default:
910
19.9M
      ptr += MINBPC(enc);
911
19.9M
      break;
912
42.7M
    }
913
42.7M
  }
914
6.15k
  *nextTokPtr = ptr;
915
6.15k
  return XML_TOK_DATA_CHARS;
916
938k
}
Unexecuted instantiation: xmltok.c:little2_contentTok
Unexecuted instantiation: xmltok.c:big2_contentTok
917
918
/* ptr points to character following "%" */
919
920
static int PTRCALL
921
PREFIX(scanPercent)(const ENCODING *enc, const char *ptr, const char *end,
922
2.79k
                    const char **nextTokPtr) {
923
2.79k
  REQUIRE_CHAR(enc, ptr, end);
924
2.78k
  switch (BYTE_TYPE(enc, ptr)) {
925
1.39k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
926
363
  case BT_S:
927
691
  case BT_LF:
928
1.00k
  case BT_CR:
929
1.00k
  case BT_PERCNT:
930
1.00k
    *nextTokPtr = ptr;
931
1.00k
    return XML_TOK_PERCENT;
932
6
  default:
933
6
    *nextTokPtr = ptr;
934
6
    return XML_TOK_INVALID;
935
2.78k
  }
936
4.30k
  while (HAS_CHAR(enc, ptr, end)) {
937
4.30k
    switch (BYTE_TYPE(enc, ptr)) {
938
7.50k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
939
1.53k
    case BT_SEMI:
940
1.53k
      *nextTokPtr = ptr + MINBPC(enc);
941
1.53k
      return XML_TOK_PARAM_ENTITY_REF;
942
32
    default:
943
32
      *nextTokPtr = ptr;
944
32
      return XML_TOK_INVALID;
945
4.30k
    }
946
4.30k
  }
947
120
  return XML_TOK_PARTIAL;
948
1.72k
}
xmltok.c:normal_scanPercent
Line
Count
Source
922
2.79k
                    const char **nextTokPtr) {
923
2.79k
  REQUIRE_CHAR(enc, ptr, end);
924
2.78k
  switch (BYTE_TYPE(enc, ptr)) {
925
1.39k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
926
363
  case BT_S:
927
691
  case BT_LF:
928
1.00k
  case BT_CR:
929
1.00k
  case BT_PERCNT:
930
1.00k
    *nextTokPtr = ptr;
931
1.00k
    return XML_TOK_PERCENT;
932
6
  default:
933
6
    *nextTokPtr = ptr;
934
6
    return XML_TOK_INVALID;
935
2.78k
  }
936
4.30k
  while (HAS_CHAR(enc, ptr, end)) {
937
4.30k
    switch (BYTE_TYPE(enc, ptr)) {
938
7.50k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
939
1.53k
    case BT_SEMI:
940
1.53k
      *nextTokPtr = ptr + MINBPC(enc);
941
1.53k
      return XML_TOK_PARAM_ENTITY_REF;
942
32
    default:
943
32
      *nextTokPtr = ptr;
944
32
      return XML_TOK_INVALID;
945
4.30k
    }
946
4.30k
  }
947
120
  return XML_TOK_PARTIAL;
948
1.72k
}
Unexecuted instantiation: xmltok.c:little2_scanPercent
Unexecuted instantiation: xmltok.c:big2_scanPercent
949
950
static int PTRCALL
951
PREFIX(scanPoundName)(const ENCODING *enc, const char *ptr, const char *end,
952
14.5k
                      const char **nextTokPtr) {
953
14.5k
  REQUIRE_CHAR(enc, ptr, end);
954
14.5k
  switch (BYTE_TYPE(enc, ptr)) {
955
14.3k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
956
1
  default:
957
1
    *nextTokPtr = ptr;
958
1
    return XML_TOK_INVALID;
959
14.5k
  }
960
107k
  while (HAS_CHAR(enc, ptr, end)) {
961
107k
    switch (BYTE_TYPE(enc, ptr)) {
962
333k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
963
4.66k
    case BT_CR:
964
6.07k
    case BT_LF:
965
13.2k
    case BT_S:
966
13.4k
    case BT_RPAR:
967
14.0k
    case BT_GT:
968
14.0k
    case BT_PERCNT:
969
14.3k
    case BT_VERBAR:
970
14.3k
      *nextTokPtr = ptr;
971
14.3k
      return XML_TOK_POUND_NAME;
972
22
    default:
973
22
      *nextTokPtr = ptr;
974
22
      return XML_TOK_INVALID;
975
107k
    }
976
107k
  }
977
156
  return -XML_TOK_POUND_NAME;
978
14.5k
}
xmltok.c:normal_scanPoundName
Line
Count
Source
952
14.5k
                      const char **nextTokPtr) {
953
14.5k
  REQUIRE_CHAR(enc, ptr, end);
954
14.5k
  switch (BYTE_TYPE(enc, ptr)) {
955
14.3k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
956
1
  default:
957
1
    *nextTokPtr = ptr;
958
1
    return XML_TOK_INVALID;
959
14.5k
  }
960
107k
  while (HAS_CHAR(enc, ptr, end)) {
961
107k
    switch (BYTE_TYPE(enc, ptr)) {
962
333k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
963
4.66k
    case BT_CR:
964
6.07k
    case BT_LF:
965
13.2k
    case BT_S:
966
13.4k
    case BT_RPAR:
967
14.0k
    case BT_GT:
968
14.0k
    case BT_PERCNT:
969
14.3k
    case BT_VERBAR:
970
14.3k
      *nextTokPtr = ptr;
971
14.3k
      return XML_TOK_POUND_NAME;
972
22
    default:
973
22
      *nextTokPtr = ptr;
974
22
      return XML_TOK_INVALID;
975
107k
    }
976
107k
  }
977
156
  return -XML_TOK_POUND_NAME;
978
14.5k
}
Unexecuted instantiation: xmltok.c:little2_scanPoundName
Unexecuted instantiation: xmltok.c:big2_scanPoundName
979
980
static int PTRCALL
981
PREFIX(scanLit)(int open, const ENCODING *enc, const char *ptr, const char *end,
982
27.0k
                const char **nextTokPtr) {
983
65.1M
  while (HAS_CHAR(enc, ptr, end)) {
984
65.1M
    int t = BYTE_TYPE(enc, ptr);
985
65.1M
    switch (t) {
986
8.15k
      INVALID_CASES(ptr, nextTokPtr)
987
32.7k
    case BT_QUOT:
988
56.4k
    case BT_APOS:
989
56.4k
      ptr += MINBPC(enc);
990
56.4k
      if (t != open)
991
29.6k
        break;
992
26.8k
      if (! HAS_CHAR(enc, ptr, end))
993
749
        return -XML_TOK_LITERAL;
994
26.0k
      *nextTokPtr = ptr;
995
26.0k
      switch (BYTE_TYPE(enc, ptr)) {
996
8.54k
      case BT_S:
997
8.85k
      case BT_CR:
998
15.4k
      case BT_LF:
999
25.8k
      case BT_GT:
1000
25.8k
      case BT_PERCNT:
1001
26.0k
      case BT_LSQB:
1002
26.0k
        return XML_TOK_LITERAL;
1003
44
      default:
1004
44
        return XML_TOK_INVALID;
1005
26.0k
      }
1006
65.1M
    default:
1007
65.1M
      ptr += MINBPC(enc);
1008
65.1M
      break;
1009
65.1M
    }
1010
65.1M
  }
1011
176
  return XML_TOK_PARTIAL;
1012
27.0k
}
xmltok.c:normal_scanLit
Line
Count
Source
982
27.0k
                const char **nextTokPtr) {
983
65.1M
  while (HAS_CHAR(enc, ptr, end)) {
984
65.1M
    int t = BYTE_TYPE(enc, ptr);
985
65.1M
    switch (t) {
986
8.15k
      INVALID_CASES(ptr, nextTokPtr)
987
32.7k
    case BT_QUOT:
988
56.4k
    case BT_APOS:
989
56.4k
      ptr += MINBPC(enc);
990
56.4k
      if (t != open)
991
29.6k
        break;
992
26.8k
      if (! HAS_CHAR(enc, ptr, end))
993
749
        return -XML_TOK_LITERAL;
994
26.0k
      *nextTokPtr = ptr;
995
26.0k
      switch (BYTE_TYPE(enc, ptr)) {
996
8.54k
      case BT_S:
997
8.85k
      case BT_CR:
998
15.4k
      case BT_LF:
999
25.8k
      case BT_GT:
1000
25.8k
      case BT_PERCNT:
1001
26.0k
      case BT_LSQB:
1002
26.0k
        return XML_TOK_LITERAL;
1003
44
      default:
1004
44
        return XML_TOK_INVALID;
1005
26.0k
      }
1006
65.1M
    default:
1007
65.1M
      ptr += MINBPC(enc);
1008
65.1M
      break;
1009
65.1M
    }
1010
65.1M
  }
1011
176
  return XML_TOK_PARTIAL;
1012
27.0k
}
Unexecuted instantiation: xmltok.c:little2_scanLit
Unexecuted instantiation: xmltok.c:big2_scanLit
1013
1014
static int PTRCALL
1015
PREFIX(prologTok)(const ENCODING *enc, const char *ptr, const char *end,
1016
928k
                  const char **nextTokPtr) {
1017
928k
  int tok;
1018
928k
  if (ptr >= end)
1019
1.32k
    return XML_TOK_NONE;
1020
927k
  if (MINBPC(enc) > 1) {
1021
242
    size_t n = end - ptr;
1022
242
    if (n & (MINBPC(enc) - 1)) {
1023
33
      n &= ~(MINBPC(enc) - 1);
1024
33
      if (n == 0)
1025
4
        return XML_TOK_PARTIAL;
1026
29
      end = ptr + n;
1027
29
    }
1028
242
  }
1029
927k
  switch (BYTE_TYPE(enc, ptr)) {
1030
4.55k
  case BT_QUOT:
1031
4.55k
    return PREFIX(scanLit)(BT_QUOT, enc, ptr + MINBPC(enc), end, nextTokPtr);
1032
22.5k
  case BT_APOS:
1033
22.5k
    return PREFIX(scanLit)(BT_APOS, enc, ptr + MINBPC(enc), end, nextTokPtr);
1034
40.1k
  case BT_LT: {
1035
40.1k
    ptr += MINBPC(enc);
1036
40.1k
    REQUIRE_CHAR(enc, ptr, end);
1037
40.1k
    switch (BYTE_TYPE(enc, ptr)) {
1038
28.8k
    case BT_EXCL:
1039
28.8k
      return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1040
7.33k
    case BT_QUEST:
1041
7.33k
      return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1042
2.79k
    case BT_NMSTRT:
1043
3.87k
    case BT_HEX:
1044
3.87k
    case BT_NONASCII:
1045
3.90k
    case BT_LEAD2:
1046
3.93k
    case BT_LEAD3:
1047
3.94k
    case BT_LEAD4:
1048
3.94k
      *nextTokPtr = ptr - MINBPC(enc);
1049
3.94k
      return XML_TOK_INSTANCE_START;
1050
40.1k
    }
1051
13
    *nextTokPtr = ptr;
1052
13
    return XML_TOK_INVALID;
1053
40.1k
  }
1054
47.4k
  case BT_CR:
1055
47.4k
    if (ptr + MINBPC(enc) == end) {
1056
197
      *nextTokPtr = end;
1057
      /* indicate that this might be part of a CR/LF pair */
1058
197
      return -XML_TOK_PROLOG_S;
1059
197
    }
1060
    /* fall through */
1061
114k
  case BT_S:
1062
144k
  case BT_LF:
1063
151k
    for (;;) {
1064
151k
      ptr += MINBPC(enc);
1065
151k
      if (! HAS_CHAR(enc, ptr, end))
1066
140
        break;
1067
151k
      switch (BYTE_TYPE(enc, ptr)) {
1068
971
      case BT_S:
1069
3.41k
      case BT_LF:
1070
3.41k
        break;
1071
3.92k
      case BT_CR:
1072
        /* don't split CR/LF pair */
1073
3.92k
        if (ptr + MINBPC(enc) != end)
1074
3.84k
          break;
1075
        /* fall through */
1076
143k
      default:
1077
143k
        *nextTokPtr = ptr;
1078
143k
        return XML_TOK_PROLOG_S;
1079
151k
      }
1080
151k
    }
1081
140
    *nextTokPtr = ptr;
1082
140
    return XML_TOK_PROLOG_S;
1083
2.78k
  case BT_PERCNT:
1084
2.78k
    return PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1085
1.51k
  case BT_COMMA:
1086
1.51k
    *nextTokPtr = ptr + MINBPC(enc);
1087
1.51k
    return XML_TOK_COMMA;
1088
2.97k
  case BT_LSQB:
1089
2.97k
    *nextTokPtr = ptr + MINBPC(enc);
1090
2.97k
    return XML_TOK_OPEN_BRACKET;
1091
1.41k
  case BT_RSQB:
1092
1.41k
    ptr += MINBPC(enc);
1093
1.41k
    if (! HAS_CHAR(enc, ptr, end))
1094
11
      return -XML_TOK_CLOSE_BRACKET;
1095
1.40k
    if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) {
1096
30
      REQUIRE_CHARS(enc, ptr, end, 2);
1097
28
      if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_GT)) {
1098
2
        *nextTokPtr = ptr + 2 * MINBPC(enc);
1099
2
        return XML_TOK_COND_SECT_CLOSE;
1100
2
      }
1101
28
    }
1102
1.40k
    *nextTokPtr = ptr;
1103
1.40k
    return XML_TOK_CLOSE_BRACKET;
1104
544k
  case BT_LPAR:
1105
544k
    *nextTokPtr = ptr + MINBPC(enc);
1106
544k
    return XML_TOK_OPEN_PAREN;
1107
19.3k
  case BT_RPAR:
1108
19.3k
    ptr += MINBPC(enc);
1109
19.3k
    if (! HAS_CHAR(enc, ptr, end))
1110
59
      return -XML_TOK_CLOSE_PAREN;
1111
19.3k
    switch (BYTE_TYPE(enc, ptr)) {
1112
1.36k
    case BT_AST:
1113
1.36k
      *nextTokPtr = ptr + MINBPC(enc);
1114
1.36k
      return XML_TOK_CLOSE_PAREN_ASTERISK;
1115
1.23k
    case BT_QUEST:
1116
1.23k
      *nextTokPtr = ptr + MINBPC(enc);
1117
1.23k
      return XML_TOK_CLOSE_PAREN_QUESTION;
1118
922
    case BT_PLUS:
1119
922
      *nextTokPtr = ptr + MINBPC(enc);
1120
922
      return XML_TOK_CLOSE_PAREN_PLUS;
1121
1.13k
    case BT_CR:
1122
8.65k
    case BT_LF:
1123
13.5k
    case BT_S:
1124
14.1k
    case BT_GT:
1125
14.3k
    case BT_COMMA:
1126
14.7k
    case BT_VERBAR:
1127
15.7k
    case BT_RPAR:
1128
15.7k
      *nextTokPtr = ptr;
1129
15.7k
      return XML_TOK_CLOSE_PAREN;
1130
19.3k
    }
1131
27
    *nextTokPtr = ptr;
1132
27
    return XML_TOK_INVALID;
1133
6.06k
  case BT_VERBAR:
1134
6.06k
    *nextTokPtr = ptr + MINBPC(enc);
1135
6.06k
    return XML_TOK_OR;
1136
24.7k
  case BT_GT:
1137
24.7k
    *nextTokPtr = ptr + MINBPC(enc);
1138
24.7k
    return XML_TOK_DECL_CLOSE;
1139
14.5k
  case BT_NUM:
1140
14.5k
    return PREFIX(scanPoundName)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1141
0
#  define LEAD_CASE(n)                                                         \
1142
49
  case BT_LEAD##n:                                                             \
1143
1.09k
    if (end - ptr < n)                                                         \
1144
62
      return XML_TOK_PARTIAL_CHAR;                                             \
1145
1.03k
    if (IS_INVALID_CHAR(enc, ptr, n)) {                                        \
1146
87
      *nextTokPtr = ptr;                                                       \
1147
87
      return XML_TOK_INVALID;                                                  \
1148
87
    }                                                                          \
1149
1.03k
    if (IS_NMSTRT_CHAR(enc, ptr, n)) {                                         \
1150
773
      ptr += n;                                                                \
1151
773
      tok = XML_TOK_NAME;                                                      \
1152
773
      break;                                                                   \
1153
773
    }                                                                          \
1154
947
    if (IS_NAME_CHAR(enc, ptr, n)) {                                           \
1155
125
      ptr += n;                                                                \
1156
125
      tok = XML_TOK_NMTOKEN;                                                   \
1157
125
      break;                                                                   \
1158
125
    }                                                                          \
1159
174
    *nextTokPtr = ptr;                                                         \
1160
49
    return XML_TOK_INVALID;
1161
1.18k
    LEAD_CASE(2)
1162
1.86k
    LEAD_CASE(3)
1163
204
    LEAD_CASE(4)
1164
0
#  undef LEAD_CASE
1165
47.3k
  case BT_NMSTRT:
1166
92.4k
  case BT_HEX:
1167
92.4k
    tok = XML_TOK_NAME;
1168
92.4k
    ptr += MINBPC(enc);
1169
92.4k
    break;
1170
3.30k
  case BT_DIGIT:
1171
3.57k
  case BT_NAME:
1172
3.86k
  case BT_MINUS:
1173
#  ifdef XML_NS
1174
  case BT_COLON:
1175
#  endif
1176
3.86k
    tok = XML_TOK_NMTOKEN;
1177
3.86k
    ptr += MINBPC(enc);
1178
3.86k
    break;
1179
186
  case BT_NONASCII:
1180
186
    if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {
1181
156
      ptr += MINBPC(enc);
1182
156
      tok = XML_TOK_NAME;
1183
156
      break;
1184
156
    }
1185
30
    if (IS_NAME_CHAR_MINBPC(enc, ptr)) {
1186
8
      ptr += MINBPC(enc);
1187
8
      tok = XML_TOK_NMTOKEN;
1188
8
      break;
1189
8
    }
1190
    /* fall through */
1191
146
  default:
1192
146
    *nextTokPtr = ptr;
1193
146
    return XML_TOK_INVALID;
1194
927k
  }
1195
3.56M
  while (HAS_CHAR(enc, ptr, end)) {
1196
3.56M
    switch (BYTE_TYPE(enc, ptr)) {
1197
9.03M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1198
8.78k
    case BT_GT:
1199
23.9k
    case BT_RPAR:
1200
24.9k
    case BT_COMMA:
1201
28.4k
    case BT_VERBAR:
1202
31.1k
    case BT_LSQB:
1203
31.1k
    case BT_PERCNT:
1204
63.6k
    case BT_S:
1205
88.7k
    case BT_CR:
1206
95.1k
    case BT_LF:
1207
95.1k
      *nextTokPtr = ptr;
1208
95.1k
      return tok;
1209
#  ifdef XML_NS
1210
    case BT_COLON:
1211
      ptr += MINBPC(enc);
1212
      switch (tok) {
1213
      case XML_TOK_NAME:
1214
        REQUIRE_CHAR(enc, ptr, end);
1215
        tok = XML_TOK_PREFIXED_NAME;
1216
        switch (BYTE_TYPE(enc, ptr)) {
1217
          CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1218
        default:
1219
          tok = XML_TOK_NMTOKEN;
1220
          break;
1221
        }
1222
        break;
1223
      case XML_TOK_PREFIXED_NAME:
1224
        tok = XML_TOK_NMTOKEN;
1225
        break;
1226
      }
1227
      break;
1228
#  endif
1229
180
    case BT_PLUS:
1230
180
      if (tok == XML_TOK_NMTOKEN) {
1231
1
        *nextTokPtr = ptr;
1232
1
        return XML_TOK_INVALID;
1233
1
      }
1234
179
      *nextTokPtr = ptr + MINBPC(enc);
1235
179
      return XML_TOK_NAME_PLUS;
1236
386
    case BT_AST:
1237
386
      if (tok == XML_TOK_NMTOKEN) {
1238
1
        *nextTokPtr = ptr;
1239
1
        return XML_TOK_INVALID;
1240
1
      }
1241
385
      *nextTokPtr = ptr + MINBPC(enc);
1242
385
      return XML_TOK_NAME_ASTERISK;
1243
697
    case BT_QUEST:
1244
697
      if (tok == XML_TOK_NMTOKEN) {
1245
1
        *nextTokPtr = ptr;
1246
1
        return XML_TOK_INVALID;
1247
1
      }
1248
696
      *nextTokPtr = ptr + MINBPC(enc);
1249
696
      return XML_TOK_NAME_QUESTION;
1250
110
    default:
1251
110
      *nextTokPtr = ptr;
1252
110
      return XML_TOK_INVALID;
1253
3.56M
    }
1254
3.56M
  }
1255
730
  return -tok;
1256
97.3k
}
xmltok.c:normal_prologTok
Line
Count
Source
1016
928k
                  const char **nextTokPtr) {
1017
928k
  int tok;
1018
928k
  if (ptr >= end)
1019
1.31k
    return XML_TOK_NONE;
1020
927k
  if (MINBPC(enc) > 1) {
1021
0
    size_t n = end - ptr;
1022
0
    if (n & (MINBPC(enc) - 1)) {
1023
0
      n &= ~(MINBPC(enc) - 1);
1024
0
      if (n == 0)
1025
0
        return XML_TOK_PARTIAL;
1026
0
      end = ptr + n;
1027
0
    }
1028
0
  }
1029
927k
  switch (BYTE_TYPE(enc, ptr)) {
1030
4.55k
  case BT_QUOT:
1031
4.55k
    return PREFIX(scanLit)(BT_QUOT, enc, ptr + MINBPC(enc), end, nextTokPtr);
1032
22.5k
  case BT_APOS:
1033
22.5k
    return PREFIX(scanLit)(BT_APOS, enc, ptr + MINBPC(enc), end, nextTokPtr);
1034
40.1k
  case BT_LT: {
1035
40.1k
    ptr += MINBPC(enc);
1036
40.1k
    REQUIRE_CHAR(enc, ptr, end);
1037
40.1k
    switch (BYTE_TYPE(enc, ptr)) {
1038
28.8k
    case BT_EXCL:
1039
28.8k
      return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1040
7.33k
    case BT_QUEST:
1041
7.33k
      return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1042
2.79k
    case BT_NMSTRT:
1043
3.87k
    case BT_HEX:
1044
3.87k
    case BT_NONASCII:
1045
3.90k
    case BT_LEAD2:
1046
3.93k
    case BT_LEAD3:
1047
3.94k
    case BT_LEAD4:
1048
3.94k
      *nextTokPtr = ptr - MINBPC(enc);
1049
3.94k
      return XML_TOK_INSTANCE_START;
1050
40.1k
    }
1051
13
    *nextTokPtr = ptr;
1052
13
    return XML_TOK_INVALID;
1053
40.1k
  }
1054
47.4k
  case BT_CR:
1055
47.4k
    if (ptr + MINBPC(enc) == end) {
1056
197
      *nextTokPtr = end;
1057
      /* indicate that this might be part of a CR/LF pair */
1058
197
      return -XML_TOK_PROLOG_S;
1059
197
    }
1060
    /* fall through */
1061
114k
  case BT_S:
1062
144k
  case BT_LF:
1063
151k
    for (;;) {
1064
151k
      ptr += MINBPC(enc);
1065
151k
      if (! HAS_CHAR(enc, ptr, end))
1066
140
        break;
1067
151k
      switch (BYTE_TYPE(enc, ptr)) {
1068
971
      case BT_S:
1069
3.41k
      case BT_LF:
1070
3.41k
        break;
1071
3.92k
      case BT_CR:
1072
        /* don't split CR/LF pair */
1073
3.92k
        if (ptr + MINBPC(enc) != end)
1074
3.84k
          break;
1075
        /* fall through */
1076
143k
      default:
1077
143k
        *nextTokPtr = ptr;
1078
143k
        return XML_TOK_PROLOG_S;
1079
151k
      }
1080
151k
    }
1081
140
    *nextTokPtr = ptr;
1082
140
    return XML_TOK_PROLOG_S;
1083
2.78k
  case BT_PERCNT:
1084
2.78k
    return PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1085
1.51k
  case BT_COMMA:
1086
1.51k
    *nextTokPtr = ptr + MINBPC(enc);
1087
1.51k
    return XML_TOK_COMMA;
1088
2.97k
  case BT_LSQB:
1089
2.97k
    *nextTokPtr = ptr + MINBPC(enc);
1090
2.97k
    return XML_TOK_OPEN_BRACKET;
1091
1.41k
  case BT_RSQB:
1092
1.41k
    ptr += MINBPC(enc);
1093
1.41k
    if (! HAS_CHAR(enc, ptr, end))
1094
11
      return -XML_TOK_CLOSE_BRACKET;
1095
1.40k
    if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) {
1096
30
      REQUIRE_CHARS(enc, ptr, end, 2);
1097
28
      if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_GT)) {
1098
2
        *nextTokPtr = ptr + 2 * MINBPC(enc);
1099
2
        return XML_TOK_COND_SECT_CLOSE;
1100
2
      }
1101
28
    }
1102
1.40k
    *nextTokPtr = ptr;
1103
1.40k
    return XML_TOK_CLOSE_BRACKET;
1104
544k
  case BT_LPAR:
1105
544k
    *nextTokPtr = ptr + MINBPC(enc);
1106
544k
    return XML_TOK_OPEN_PAREN;
1107
19.3k
  case BT_RPAR:
1108
19.3k
    ptr += MINBPC(enc);
1109
19.3k
    if (! HAS_CHAR(enc, ptr, end))
1110
59
      return -XML_TOK_CLOSE_PAREN;
1111
19.3k
    switch (BYTE_TYPE(enc, ptr)) {
1112
1.36k
    case BT_AST:
1113
1.36k
      *nextTokPtr = ptr + MINBPC(enc);
1114
1.36k
      return XML_TOK_CLOSE_PAREN_ASTERISK;
1115
1.23k
    case BT_QUEST:
1116
1.23k
      *nextTokPtr = ptr + MINBPC(enc);
1117
1.23k
      return XML_TOK_CLOSE_PAREN_QUESTION;
1118
922
    case BT_PLUS:
1119
922
      *nextTokPtr = ptr + MINBPC(enc);
1120
922
      return XML_TOK_CLOSE_PAREN_PLUS;
1121
1.13k
    case BT_CR:
1122
8.65k
    case BT_LF:
1123
13.5k
    case BT_S:
1124
14.1k
    case BT_GT:
1125
14.3k
    case BT_COMMA:
1126
14.7k
    case BT_VERBAR:
1127
15.7k
    case BT_RPAR:
1128
15.7k
      *nextTokPtr = ptr;
1129
15.7k
      return XML_TOK_CLOSE_PAREN;
1130
19.3k
    }
1131
27
    *nextTokPtr = ptr;
1132
27
    return XML_TOK_INVALID;
1133
6.06k
  case BT_VERBAR:
1134
6.06k
    *nextTokPtr = ptr + MINBPC(enc);
1135
6.06k
    return XML_TOK_OR;
1136
24.7k
  case BT_GT:
1137
24.7k
    *nextTokPtr = ptr + MINBPC(enc);
1138
24.7k
    return XML_TOK_DECL_CLOSE;
1139
14.5k
  case BT_NUM:
1140
14.5k
    return PREFIX(scanPoundName)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1141
0
#  define LEAD_CASE(n)                                                         \
1142
0
  case BT_LEAD##n:                                                             \
1143
0
    if (end - ptr < n)                                                         \
1144
0
      return XML_TOK_PARTIAL_CHAR;                                             \
1145
0
    if (IS_INVALID_CHAR(enc, ptr, n)) {                                        \
1146
0
      *nextTokPtr = ptr;                                                       \
1147
0
      return XML_TOK_INVALID;                                                  \
1148
0
    }                                                                          \
1149
0
    if (IS_NMSTRT_CHAR(enc, ptr, n)) {                                         \
1150
0
      ptr += n;                                                                \
1151
0
      tok = XML_TOK_NAME;                                                      \
1152
0
      break;                                                                   \
1153
0
    }                                                                          \
1154
0
    if (IS_NAME_CHAR(enc, ptr, n)) {                                           \
1155
0
      ptr += n;                                                                \
1156
0
      tok = XML_TOK_NMTOKEN;                                                   \
1157
0
      break;                                                                   \
1158
0
    }                                                                          \
1159
0
    *nextTokPtr = ptr;                                                         \
1160
0
    return XML_TOK_INVALID;
1161
1.18k
    LEAD_CASE(2)
1162
1.86k
    LEAD_CASE(3)
1163
102
    LEAD_CASE(4)
1164
0
#  undef LEAD_CASE
1165
47.3k
  case BT_NMSTRT:
1166
92.4k
  case BT_HEX:
1167
92.4k
    tok = XML_TOK_NAME;
1168
92.4k
    ptr += MINBPC(enc);
1169
92.4k
    break;
1170
3.30k
  case BT_DIGIT:
1171
3.57k
  case BT_NAME:
1172
3.86k
  case BT_MINUS:
1173
#  ifdef XML_NS
1174
  case BT_COLON:
1175
#  endif
1176
3.86k
    tok = XML_TOK_NMTOKEN;
1177
3.86k
    ptr += MINBPC(enc);
1178
3.86k
    break;
1179
0
  case BT_NONASCII:
1180
0
    if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {
1181
0
      ptr += MINBPC(enc);
1182
0
      tok = XML_TOK_NAME;
1183
0
      break;
1184
0
    }
1185
0
    if (IS_NAME_CHAR_MINBPC(enc, ptr)) {
1186
0
      ptr += MINBPC(enc);
1187
0
      tok = XML_TOK_NMTOKEN;
1188
0
      break;
1189
0
    }
1190
    /* fall through */
1191
111
  default:
1192
111
    *nextTokPtr = ptr;
1193
111
    return XML_TOK_INVALID;
1194
927k
  }
1195
3.56M
  while (HAS_CHAR(enc, ptr, end)) {
1196
3.56M
    switch (BYTE_TYPE(enc, ptr)) {
1197
9.02M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1198
8.78k
    case BT_GT:
1199
23.9k
    case BT_RPAR:
1200
24.9k
    case BT_COMMA:
1201
28.4k
    case BT_VERBAR:
1202
31.1k
    case BT_LSQB:
1203
31.1k
    case BT_PERCNT:
1204
63.6k
    case BT_S:
1205
88.7k
    case BT_CR:
1206
95.1k
    case BT_LF:
1207
95.1k
      *nextTokPtr = ptr;
1208
95.1k
      return tok;
1209
#  ifdef XML_NS
1210
    case BT_COLON:
1211
      ptr += MINBPC(enc);
1212
      switch (tok) {
1213
      case XML_TOK_NAME:
1214
        REQUIRE_CHAR(enc, ptr, end);
1215
        tok = XML_TOK_PREFIXED_NAME;
1216
        switch (BYTE_TYPE(enc, ptr)) {
1217
          CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1218
        default:
1219
          tok = XML_TOK_NMTOKEN;
1220
          break;
1221
        }
1222
        break;
1223
      case XML_TOK_PREFIXED_NAME:
1224
        tok = XML_TOK_NMTOKEN;
1225
        break;
1226
      }
1227
      break;
1228
#  endif
1229
180
    case BT_PLUS:
1230
180
      if (tok == XML_TOK_NMTOKEN) {
1231
1
        *nextTokPtr = ptr;
1232
1
        return XML_TOK_INVALID;
1233
1
      }
1234
179
      *nextTokPtr = ptr + MINBPC(enc);
1235
179
      return XML_TOK_NAME_PLUS;
1236
386
    case BT_AST:
1237
386
      if (tok == XML_TOK_NMTOKEN) {
1238
1
        *nextTokPtr = ptr;
1239
1
        return XML_TOK_INVALID;
1240
1
      }
1241
385
      *nextTokPtr = ptr + MINBPC(enc);
1242
385
      return XML_TOK_NAME_ASTERISK;
1243
697
    case BT_QUEST:
1244
697
      if (tok == XML_TOK_NMTOKEN) {
1245
1
        *nextTokPtr = ptr;
1246
1
        return XML_TOK_INVALID;
1247
1
      }
1248
696
      *nextTokPtr = ptr + MINBPC(enc);
1249
696
      return XML_TOK_NAME_QUESTION;
1250
95
    default:
1251
95
      *nextTokPtr = ptr;
1252
95
      return XML_TOK_INVALID;
1253
3.56M
    }
1254
3.56M
  }
1255
684
  return -tok;
1256
97.2k
}
xmltok.c:little2_prologTok
Line
Count
Source
1016
133
                  const char **nextTokPtr) {
1017
133
  int tok;
1018
133
  if (ptr >= end)
1019
2
    return XML_TOK_NONE;
1020
131
  if (MINBPC(enc) > 1) {
1021
131
    size_t n = end - ptr;
1022
131
    if (n & (MINBPC(enc) - 1)) {
1023
17
      n &= ~(MINBPC(enc) - 1);
1024
17
      if (n == 0)
1025
2
        return XML_TOK_PARTIAL;
1026
15
      end = ptr + n;
1027
15
    }
1028
131
  }
1029
129
  switch (BYTE_TYPE(enc, ptr)) {
1030
0
  case BT_QUOT:
1031
0
    return PREFIX(scanLit)(BT_QUOT, enc, ptr + MINBPC(enc), end, nextTokPtr);
1032
0
  case BT_APOS:
1033
0
    return PREFIX(scanLit)(BT_APOS, enc, ptr + MINBPC(enc), end, nextTokPtr);
1034
0
  case BT_LT: {
1035
0
    ptr += MINBPC(enc);
1036
0
    REQUIRE_CHAR(enc, ptr, end);
1037
0
    switch (BYTE_TYPE(enc, ptr)) {
1038
0
    case BT_EXCL:
1039
0
      return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1040
0
    case BT_QUEST:
1041
0
      return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1042
0
    case BT_NMSTRT:
1043
0
    case BT_HEX:
1044
0
    case BT_NONASCII:
1045
0
    case BT_LEAD2:
1046
0
    case BT_LEAD3:
1047
0
    case BT_LEAD4:
1048
0
      *nextTokPtr = ptr - MINBPC(enc);
1049
0
      return XML_TOK_INSTANCE_START;
1050
0
    }
1051
0
    *nextTokPtr = ptr;
1052
0
    return XML_TOK_INVALID;
1053
0
  }
1054
0
  case BT_CR:
1055
0
    if (ptr + MINBPC(enc) == end) {
1056
0
      *nextTokPtr = end;
1057
      /* indicate that this might be part of a CR/LF pair */
1058
0
      return -XML_TOK_PROLOG_S;
1059
0
    }
1060
    /* fall through */
1061
0
  case BT_S:
1062
0
  case BT_LF:
1063
0
    for (;;) {
1064
0
      ptr += MINBPC(enc);
1065
0
      if (! HAS_CHAR(enc, ptr, end))
1066
0
        break;
1067
0
      switch (BYTE_TYPE(enc, ptr)) {
1068
0
      case BT_S:
1069
0
      case BT_LF:
1070
0
        break;
1071
0
      case BT_CR:
1072
        /* don't split CR/LF pair */
1073
0
        if (ptr + MINBPC(enc) != end)
1074
0
          break;
1075
        /* fall through */
1076
0
      default:
1077
0
        *nextTokPtr = ptr;
1078
0
        return XML_TOK_PROLOG_S;
1079
0
      }
1080
0
    }
1081
0
    *nextTokPtr = ptr;
1082
0
    return XML_TOK_PROLOG_S;
1083
0
  case BT_PERCNT:
1084
0
    return PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1085
0
  case BT_COMMA:
1086
0
    *nextTokPtr = ptr + MINBPC(enc);
1087
0
    return XML_TOK_COMMA;
1088
0
  case BT_LSQB:
1089
0
    *nextTokPtr = ptr + MINBPC(enc);
1090
0
    return XML_TOK_OPEN_BRACKET;
1091
0
  case BT_RSQB:
1092
0
    ptr += MINBPC(enc);
1093
0
    if (! HAS_CHAR(enc, ptr, end))
1094
0
      return -XML_TOK_CLOSE_BRACKET;
1095
0
    if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) {
1096
0
      REQUIRE_CHARS(enc, ptr, end, 2);
1097
0
      if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_GT)) {
1098
0
        *nextTokPtr = ptr + 2 * MINBPC(enc);
1099
0
        return XML_TOK_COND_SECT_CLOSE;
1100
0
      }
1101
0
    }
1102
0
    *nextTokPtr = ptr;
1103
0
    return XML_TOK_CLOSE_BRACKET;
1104
0
  case BT_LPAR:
1105
0
    *nextTokPtr = ptr + MINBPC(enc);
1106
0
    return XML_TOK_OPEN_PAREN;
1107
0
  case BT_RPAR:
1108
0
    ptr += MINBPC(enc);
1109
0
    if (! HAS_CHAR(enc, ptr, end))
1110
0
      return -XML_TOK_CLOSE_PAREN;
1111
0
    switch (BYTE_TYPE(enc, ptr)) {
1112
0
    case BT_AST:
1113
0
      *nextTokPtr = ptr + MINBPC(enc);
1114
0
      return XML_TOK_CLOSE_PAREN_ASTERISK;
1115
0
    case BT_QUEST:
1116
0
      *nextTokPtr = ptr + MINBPC(enc);
1117
0
      return XML_TOK_CLOSE_PAREN_QUESTION;
1118
0
    case BT_PLUS:
1119
0
      *nextTokPtr = ptr + MINBPC(enc);
1120
0
      return XML_TOK_CLOSE_PAREN_PLUS;
1121
0
    case BT_CR:
1122
0
    case BT_LF:
1123
0
    case BT_S:
1124
0
    case BT_GT:
1125
0
    case BT_COMMA:
1126
0
    case BT_VERBAR:
1127
0
    case BT_RPAR:
1128
0
      *nextTokPtr = ptr;
1129
0
      return XML_TOK_CLOSE_PAREN;
1130
0
    }
1131
0
    *nextTokPtr = ptr;
1132
0
    return XML_TOK_INVALID;
1133
0
  case BT_VERBAR:
1134
0
    *nextTokPtr = ptr + MINBPC(enc);
1135
0
    return XML_TOK_OR;
1136
0
  case BT_GT:
1137
0
    *nextTokPtr = ptr + MINBPC(enc);
1138
0
    return XML_TOK_DECL_CLOSE;
1139
0
  case BT_NUM:
1140
0
    return PREFIX(scanPoundName)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1141
0
#  define LEAD_CASE(n)                                                         \
1142
0
  case BT_LEAD##n:                                                             \
1143
0
    if (end - ptr < n)                                                         \
1144
0
      return XML_TOK_PARTIAL_CHAR;                                             \
1145
0
    if (IS_INVALID_CHAR(enc, ptr, n)) {                                        \
1146
0
      *nextTokPtr = ptr;                                                       \
1147
0
      return XML_TOK_INVALID;                                                  \
1148
0
    }                                                                          \
1149
0
    if (IS_NMSTRT_CHAR(enc, ptr, n)) {                                         \
1150
0
      ptr += n;                                                                \
1151
0
      tok = XML_TOK_NAME;                                                      \
1152
0
      break;                                                                   \
1153
0
    }                                                                          \
1154
0
    if (IS_NAME_CHAR(enc, ptr, n)) {                                           \
1155
0
      ptr += n;                                                                \
1156
0
      tok = XML_TOK_NMTOKEN;                                                   \
1157
0
      break;                                                                   \
1158
0
    }                                                                          \
1159
0
    *nextTokPtr = ptr;                                                         \
1160
0
    return XML_TOK_INVALID;
1161
0
    LEAD_CASE(2)
1162
0
    LEAD_CASE(3)
1163
78
    LEAD_CASE(4)
1164
0
#  undef LEAD_CASE
1165
0
  case BT_NMSTRT:
1166
0
  case BT_HEX:
1167
0
    tok = XML_TOK_NAME;
1168
0
    ptr += MINBPC(enc);
1169
0
    break;
1170
0
  case BT_DIGIT:
1171
0
  case BT_NAME:
1172
0
  case BT_MINUS:
1173
#  ifdef XML_NS
1174
  case BT_COLON:
1175
#  endif
1176
0
    tok = XML_TOK_NMTOKEN;
1177
0
    ptr += MINBPC(enc);
1178
0
    break;
1179
96
  case BT_NONASCII:
1180
96
    if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {
1181
80
      ptr += MINBPC(enc);
1182
80
      tok = XML_TOK_NAME;
1183
80
      break;
1184
80
    }
1185
16
    if (IS_NAME_CHAR_MINBPC(enc, ptr)) {
1186
5
      ptr += MINBPC(enc);
1187
5
      tok = XML_TOK_NMTOKEN;
1188
5
      break;
1189
5
    }
1190
    /* fall through */
1191
17
  default:
1192
17
    *nextTokPtr = ptr;
1193
17
    return XML_TOK_INVALID;
1194
129
  }
1195
1.10k
  while (HAS_CHAR(enc, ptr, end)) {
1196
1.10k
    switch (BYTE_TYPE(enc, ptr)) {
1197
5.29k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1198
0
    case BT_GT:
1199
0
    case BT_RPAR:
1200
0
    case BT_COMMA:
1201
0
    case BT_VERBAR:
1202
0
    case BT_LSQB:
1203
0
    case BT_PERCNT:
1204
0
    case BT_S:
1205
0
    case BT_CR:
1206
0
    case BT_LF:
1207
0
      *nextTokPtr = ptr;
1208
0
      return tok;
1209
#  ifdef XML_NS
1210
    case BT_COLON:
1211
      ptr += MINBPC(enc);
1212
      switch (tok) {
1213
      case XML_TOK_NAME:
1214
        REQUIRE_CHAR(enc, ptr, end);
1215
        tok = XML_TOK_PREFIXED_NAME;
1216
        switch (BYTE_TYPE(enc, ptr)) {
1217
          CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1218
        default:
1219
          tok = XML_TOK_NMTOKEN;
1220
          break;
1221
        }
1222
        break;
1223
      case XML_TOK_PREFIXED_NAME:
1224
        tok = XML_TOK_NMTOKEN;
1225
        break;
1226
      }
1227
      break;
1228
#  endif
1229
0
    case BT_PLUS:
1230
0
      if (tok == XML_TOK_NMTOKEN) {
1231
0
        *nextTokPtr = ptr;
1232
0
        return XML_TOK_INVALID;
1233
0
      }
1234
0
      *nextTokPtr = ptr + MINBPC(enc);
1235
0
      return XML_TOK_NAME_PLUS;
1236
0
    case BT_AST:
1237
0
      if (tok == XML_TOK_NMTOKEN) {
1238
0
        *nextTokPtr = ptr;
1239
0
        return XML_TOK_INVALID;
1240
0
      }
1241
0
      *nextTokPtr = ptr + MINBPC(enc);
1242
0
      return XML_TOK_NAME_ASTERISK;
1243
0
    case BT_QUEST:
1244
0
      if (tok == XML_TOK_NMTOKEN) {
1245
0
        *nextTokPtr = ptr;
1246
0
        return XML_TOK_INVALID;
1247
0
      }
1248
0
      *nextTokPtr = ptr + MINBPC(enc);
1249
0
      return XML_TOK_NAME_QUESTION;
1250
6
    default:
1251
6
      *nextTokPtr = ptr;
1252
6
      return XML_TOK_INVALID;
1253
1.10k
    }
1254
1.10k
  }
1255
20
  return -tok;
1256
85
}
xmltok.c:big2_prologTok
Line
Count
Source
1016
113
                  const char **nextTokPtr) {
1017
113
  int tok;
1018
113
  if (ptr >= end)
1019
2
    return XML_TOK_NONE;
1020
111
  if (MINBPC(enc) > 1) {
1021
111
    size_t n = end - ptr;
1022
111
    if (n & (MINBPC(enc) - 1)) {
1023
16
      n &= ~(MINBPC(enc) - 1);
1024
16
      if (n == 0)
1025
2
        return XML_TOK_PARTIAL;
1026
14
      end = ptr + n;
1027
14
    }
1028
111
  }
1029
109
  switch (BYTE_TYPE(enc, ptr)) {
1030
0
  case BT_QUOT:
1031
0
    return PREFIX(scanLit)(BT_QUOT, enc, ptr + MINBPC(enc), end, nextTokPtr);
1032
0
  case BT_APOS:
1033
0
    return PREFIX(scanLit)(BT_APOS, enc, ptr + MINBPC(enc), end, nextTokPtr);
1034
0
  case BT_LT: {
1035
0
    ptr += MINBPC(enc);
1036
0
    REQUIRE_CHAR(enc, ptr, end);
1037
0
    switch (BYTE_TYPE(enc, ptr)) {
1038
0
    case BT_EXCL:
1039
0
      return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1040
0
    case BT_QUEST:
1041
0
      return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1042
0
    case BT_NMSTRT:
1043
0
    case BT_HEX:
1044
0
    case BT_NONASCII:
1045
0
    case BT_LEAD2:
1046
0
    case BT_LEAD3:
1047
0
    case BT_LEAD4:
1048
0
      *nextTokPtr = ptr - MINBPC(enc);
1049
0
      return XML_TOK_INSTANCE_START;
1050
0
    }
1051
0
    *nextTokPtr = ptr;
1052
0
    return XML_TOK_INVALID;
1053
0
  }
1054
0
  case BT_CR:
1055
0
    if (ptr + MINBPC(enc) == end) {
1056
0
      *nextTokPtr = end;
1057
      /* indicate that this might be part of a CR/LF pair */
1058
0
      return -XML_TOK_PROLOG_S;
1059
0
    }
1060
    /* fall through */
1061
0
  case BT_S:
1062
0
  case BT_LF:
1063
0
    for (;;) {
1064
0
      ptr += MINBPC(enc);
1065
0
      if (! HAS_CHAR(enc, ptr, end))
1066
0
        break;
1067
0
      switch (BYTE_TYPE(enc, ptr)) {
1068
0
      case BT_S:
1069
0
      case BT_LF:
1070
0
        break;
1071
0
      case BT_CR:
1072
        /* don't split CR/LF pair */
1073
0
        if (ptr + MINBPC(enc) != end)
1074
0
          break;
1075
        /* fall through */
1076
0
      default:
1077
0
        *nextTokPtr = ptr;
1078
0
        return XML_TOK_PROLOG_S;
1079
0
      }
1080
0
    }
1081
0
    *nextTokPtr = ptr;
1082
0
    return XML_TOK_PROLOG_S;
1083
0
  case BT_PERCNT:
1084
0
    return PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1085
0
  case BT_COMMA:
1086
0
    *nextTokPtr = ptr + MINBPC(enc);
1087
0
    return XML_TOK_COMMA;
1088
0
  case BT_LSQB:
1089
0
    *nextTokPtr = ptr + MINBPC(enc);
1090
0
    return XML_TOK_OPEN_BRACKET;
1091
0
  case BT_RSQB:
1092
0
    ptr += MINBPC(enc);
1093
0
    if (! HAS_CHAR(enc, ptr, end))
1094
0
      return -XML_TOK_CLOSE_BRACKET;
1095
0
    if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) {
1096
0
      REQUIRE_CHARS(enc, ptr, end, 2);
1097
0
      if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_GT)) {
1098
0
        *nextTokPtr = ptr + 2 * MINBPC(enc);
1099
0
        return XML_TOK_COND_SECT_CLOSE;
1100
0
      }
1101
0
    }
1102
0
    *nextTokPtr = ptr;
1103
0
    return XML_TOK_CLOSE_BRACKET;
1104
0
  case BT_LPAR:
1105
0
    *nextTokPtr = ptr + MINBPC(enc);
1106
0
    return XML_TOK_OPEN_PAREN;
1107
0
  case BT_RPAR:
1108
0
    ptr += MINBPC(enc);
1109
0
    if (! HAS_CHAR(enc, ptr, end))
1110
0
      return -XML_TOK_CLOSE_PAREN;
1111
0
    switch (BYTE_TYPE(enc, ptr)) {
1112
0
    case BT_AST:
1113
0
      *nextTokPtr = ptr + MINBPC(enc);
1114
0
      return XML_TOK_CLOSE_PAREN_ASTERISK;
1115
0
    case BT_QUEST:
1116
0
      *nextTokPtr = ptr + MINBPC(enc);
1117
0
      return XML_TOK_CLOSE_PAREN_QUESTION;
1118
0
    case BT_PLUS:
1119
0
      *nextTokPtr = ptr + MINBPC(enc);
1120
0
      return XML_TOK_CLOSE_PAREN_PLUS;
1121
0
    case BT_CR:
1122
0
    case BT_LF:
1123
0
    case BT_S:
1124
0
    case BT_GT:
1125
0
    case BT_COMMA:
1126
0
    case BT_VERBAR:
1127
0
    case BT_RPAR:
1128
0
      *nextTokPtr = ptr;
1129
0
      return XML_TOK_CLOSE_PAREN;
1130
0
    }
1131
0
    *nextTokPtr = ptr;
1132
0
    return XML_TOK_INVALID;
1133
0
  case BT_VERBAR:
1134
0
    *nextTokPtr = ptr + MINBPC(enc);
1135
0
    return XML_TOK_OR;
1136
0
  case BT_GT:
1137
0
    *nextTokPtr = ptr + MINBPC(enc);
1138
0
    return XML_TOK_DECL_CLOSE;
1139
0
  case BT_NUM:
1140
0
    return PREFIX(scanPoundName)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1141
0
#  define LEAD_CASE(n)                                                         \
1142
0
  case BT_LEAD##n:                                                             \
1143
0
    if (end - ptr < n)                                                         \
1144
0
      return XML_TOK_PARTIAL_CHAR;                                             \
1145
0
    if (IS_INVALID_CHAR(enc, ptr, n)) {                                        \
1146
0
      *nextTokPtr = ptr;                                                       \
1147
0
      return XML_TOK_INVALID;                                                  \
1148
0
    }                                                                          \
1149
0
    if (IS_NMSTRT_CHAR(enc, ptr, n)) {                                         \
1150
0
      ptr += n;                                                                \
1151
0
      tok = XML_TOK_NAME;                                                      \
1152
0
      break;                                                                   \
1153
0
    }                                                                          \
1154
0
    if (IS_NAME_CHAR(enc, ptr, n)) {                                           \
1155
0
      ptr += n;                                                                \
1156
0
      tok = XML_TOK_NMTOKEN;                                                   \
1157
0
      break;                                                                   \
1158
0
    }                                                                          \
1159
0
    *nextTokPtr = ptr;                                                         \
1160
0
    return XML_TOK_INVALID;
1161
0
    LEAD_CASE(2)
1162
0
    LEAD_CASE(3)
1163
24
    LEAD_CASE(4)
1164
0
#  undef LEAD_CASE
1165
0
  case BT_NMSTRT:
1166
0
  case BT_HEX:
1167
0
    tok = XML_TOK_NAME;
1168
0
    ptr += MINBPC(enc);
1169
0
    break;
1170
0
  case BT_DIGIT:
1171
0
  case BT_NAME:
1172
0
  case BT_MINUS:
1173
#  ifdef XML_NS
1174
  case BT_COLON:
1175
#  endif
1176
0
    tok = XML_TOK_NMTOKEN;
1177
0
    ptr += MINBPC(enc);
1178
0
    break;
1179
90
  case BT_NONASCII:
1180
90
    if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {
1181
76
      ptr += MINBPC(enc);
1182
76
      tok = XML_TOK_NAME;
1183
76
      break;
1184
76
    }
1185
14
    if (IS_NAME_CHAR_MINBPC(enc, ptr)) {
1186
3
      ptr += MINBPC(enc);
1187
3
      tok = XML_TOK_NMTOKEN;
1188
3
      break;
1189
3
    }
1190
    /* fall through */
1191
18
  default:
1192
18
    *nextTokPtr = ptr;
1193
18
    return XML_TOK_INVALID;
1194
109
  }
1195
1.29k
  while (HAS_CHAR(enc, ptr, end)) {
1196
1.29k
    switch (BYTE_TYPE(enc, ptr)) {
1197
6.25k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1198
0
    case BT_GT:
1199
0
    case BT_RPAR:
1200
0
    case BT_COMMA:
1201
0
    case BT_VERBAR:
1202
0
    case BT_LSQB:
1203
0
    case BT_PERCNT:
1204
0
    case BT_S:
1205
0
    case BT_CR:
1206
0
    case BT_LF:
1207
0
      *nextTokPtr = ptr;
1208
0
      return tok;
1209
#  ifdef XML_NS
1210
    case BT_COLON:
1211
      ptr += MINBPC(enc);
1212
      switch (tok) {
1213
      case XML_TOK_NAME:
1214
        REQUIRE_CHAR(enc, ptr, end);
1215
        tok = XML_TOK_PREFIXED_NAME;
1216
        switch (BYTE_TYPE(enc, ptr)) {
1217
          CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1218
        default:
1219
          tok = XML_TOK_NMTOKEN;
1220
          break;
1221
        }
1222
        break;
1223
      case XML_TOK_PREFIXED_NAME:
1224
        tok = XML_TOK_NMTOKEN;
1225
        break;
1226
      }
1227
      break;
1228
#  endif
1229
0
    case BT_PLUS:
1230
0
      if (tok == XML_TOK_NMTOKEN) {
1231
0
        *nextTokPtr = ptr;
1232
0
        return XML_TOK_INVALID;
1233
0
      }
1234
0
      *nextTokPtr = ptr + MINBPC(enc);
1235
0
      return XML_TOK_NAME_PLUS;
1236
0
    case BT_AST:
1237
0
      if (tok == XML_TOK_NMTOKEN) {
1238
0
        *nextTokPtr = ptr;
1239
0
        return XML_TOK_INVALID;
1240
0
      }
1241
0
      *nextTokPtr = ptr + MINBPC(enc);
1242
0
      return XML_TOK_NAME_ASTERISK;
1243
0
    case BT_QUEST:
1244
0
      if (tok == XML_TOK_NMTOKEN) {
1245
0
        *nextTokPtr = ptr;
1246
0
        return XML_TOK_INVALID;
1247
0
      }
1248
0
      *nextTokPtr = ptr + MINBPC(enc);
1249
0
      return XML_TOK_NAME_QUESTION;
1250
9
    default:
1251
9
      *nextTokPtr = ptr;
1252
9
      return XML_TOK_INVALID;
1253
1.29k
    }
1254
1.29k
  }
1255
26
  return -tok;
1256
79
}
1257
1258
static int PTRCALL
1259
PREFIX(attributeValueTok)(const ENCODING *enc, const char *ptr, const char *end,
1260
34.9M
                          const char **nextTokPtr) {
1261
34.9M
  const char *start;
1262
34.9M
  if (ptr >= end)
1263
10.5M
    return XML_TOK_NONE;
1264
24.3M
  else if (! HAS_CHAR(enc, ptr, end)) {
1265
    /* This line cannot be executed.  The incoming data has already
1266
     * been tokenized once, so incomplete characters like this have
1267
     * already been eliminated from the input.  Retaining the paranoia
1268
     * check is still valuable, however.
1269
     */
1270
0
    return XML_TOK_PARTIAL; /* LCOV_EXCL_LINE */
1271
0
  }
1272
24.3M
  start = ptr;
1273
4.77G
  while (HAS_CHAR(enc, ptr, end)) {
1274
4.77G
    switch (BYTE_TYPE(enc, ptr)) {
1275
0
#  define LEAD_CASE(n)                                                         \
1276
4.54G
  case BT_LEAD##n:                                                             \
1277
4.54G
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1278
4.54G
    break;
1279
4.54G
      LEAD_CASE(2)
1280
8.04k
      LEAD_CASE(3)
1281
6.77k
      LEAD_CASE(4)
1282
0
#  undef LEAD_CASE
1283
12.5M
    case BT_AMP:
1284
12.5M
      if (ptr == start)
1285
11.2M
        return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1286
1.32M
      *nextTokPtr = ptr;
1287
1.32M
      return XML_TOK_DATA_CHARS;
1288
14
    case BT_LT:
1289
      /* this is for inside entity references */
1290
14
      *nextTokPtr = ptr;
1291
14
      return XML_TOK_INVALID;
1292
5.12M
    case BT_LF:
1293
5.12M
      if (ptr == start) {
1294
4.75M
        *nextTokPtr = ptr + MINBPC(enc);
1295
4.75M
        return XML_TOK_DATA_NEWLINE;
1296
4.75M
      }
1297
364k
      *nextTokPtr = ptr;
1298
364k
      return XML_TOK_DATA_CHARS;
1299
16.9k
    case BT_CR:
1300
16.9k
      if (ptr == start) {
1301
14.1k
        ptr += MINBPC(enc);
1302
14.1k
        if (! HAS_CHAR(enc, ptr, end))
1303
727
          return XML_TOK_TRAILING_CR;
1304
13.4k
        if (BYTE_TYPE(enc, ptr) == BT_LF)
1305
1.11k
          ptr += MINBPC(enc);
1306
13.4k
        *nextTokPtr = ptr;
1307
13.4k
        return XML_TOK_DATA_NEWLINE;
1308
14.1k
      }
1309
2.81k
      *nextTokPtr = ptr;
1310
2.81k
      return XML_TOK_DATA_CHARS;
1311
1.03M
    case BT_S:
1312
1.03M
      if (ptr == start) {
1313
593k
        *nextTokPtr = ptr + MINBPC(enc);
1314
593k
        return XML_TOK_ATTRIBUTE_VALUE_S;
1315
593k
      }
1316
437k
      *nextTokPtr = ptr;
1317
437k
      return XML_TOK_DATA_CHARS;
1318
214M
    default:
1319
214M
      ptr += MINBPC(enc);
1320
214M
      break;
1321
4.77G
    }
1322
4.77G
  }
1323
5.66M
  *nextTokPtr = ptr;
1324
5.66M
  return XML_TOK_DATA_CHARS;
1325
24.3M
}
xmltok.c:normal_attributeValueTok
Line
Count
Source
1260
34.9M
                          const char **nextTokPtr) {
1261
34.9M
  const char *start;
1262
34.9M
  if (ptr >= end)
1263
10.5M
    return XML_TOK_NONE;
1264
24.3M
  else if (! HAS_CHAR(enc, ptr, end)) {
1265
    /* This line cannot be executed.  The incoming data has already
1266
     * been tokenized once, so incomplete characters like this have
1267
     * already been eliminated from the input.  Retaining the paranoia
1268
     * check is still valuable, however.
1269
     */
1270
0
    return XML_TOK_PARTIAL; /* LCOV_EXCL_LINE */
1271
0
  }
1272
24.3M
  start = ptr;
1273
4.77G
  while (HAS_CHAR(enc, ptr, end)) {
1274
4.77G
    switch (BYTE_TYPE(enc, ptr)) {
1275
0
#  define LEAD_CASE(n)                                                         \
1276
0
  case BT_LEAD##n:                                                             \
1277
0
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1278
0
    break;
1279
4.54G
      LEAD_CASE(2)
1280
8.04k
      LEAD_CASE(3)
1281
6.77k
      LEAD_CASE(4)
1282
0
#  undef LEAD_CASE
1283
12.5M
    case BT_AMP:
1284
12.5M
      if (ptr == start)
1285
11.2M
        return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1286
1.32M
      *nextTokPtr = ptr;
1287
1.32M
      return XML_TOK_DATA_CHARS;
1288
14
    case BT_LT:
1289
      /* this is for inside entity references */
1290
14
      *nextTokPtr = ptr;
1291
14
      return XML_TOK_INVALID;
1292
5.12M
    case BT_LF:
1293
5.12M
      if (ptr == start) {
1294
4.75M
        *nextTokPtr = ptr + MINBPC(enc);
1295
4.75M
        return XML_TOK_DATA_NEWLINE;
1296
4.75M
      }
1297
364k
      *nextTokPtr = ptr;
1298
364k
      return XML_TOK_DATA_CHARS;
1299
16.9k
    case BT_CR:
1300
16.9k
      if (ptr == start) {
1301
14.1k
        ptr += MINBPC(enc);
1302
14.1k
        if (! HAS_CHAR(enc, ptr, end))
1303
727
          return XML_TOK_TRAILING_CR;
1304
13.4k
        if (BYTE_TYPE(enc, ptr) == BT_LF)
1305
1.11k
          ptr += MINBPC(enc);
1306
13.4k
        *nextTokPtr = ptr;
1307
13.4k
        return XML_TOK_DATA_NEWLINE;
1308
14.1k
      }
1309
2.81k
      *nextTokPtr = ptr;
1310
2.81k
      return XML_TOK_DATA_CHARS;
1311
1.03M
    case BT_S:
1312
1.03M
      if (ptr == start) {
1313
593k
        *nextTokPtr = ptr + MINBPC(enc);
1314
593k
        return XML_TOK_ATTRIBUTE_VALUE_S;
1315
593k
      }
1316
437k
      *nextTokPtr = ptr;
1317
437k
      return XML_TOK_DATA_CHARS;
1318
214M
    default:
1319
214M
      ptr += MINBPC(enc);
1320
214M
      break;
1321
4.77G
    }
1322
4.77G
  }
1323
5.66M
  *nextTokPtr = ptr;
1324
5.66M
  return XML_TOK_DATA_CHARS;
1325
24.3M
}
Unexecuted instantiation: xmltok.c:little2_attributeValueTok
Unexecuted instantiation: xmltok.c:big2_attributeValueTok
1326
1327
static int PTRCALL
1328
PREFIX(entityValueTok)(const ENCODING *enc, const char *ptr, const char *end,
1329
232k
                       const char **nextTokPtr) {
1330
232k
  const char *start;
1331
232k
  if (ptr >= end)
1332
5.13k
    return XML_TOK_NONE;
1333
226k
  else if (! HAS_CHAR(enc, ptr, end)) {
1334
    /* This line cannot be executed.  The incoming data has already
1335
     * been tokenized once, so incomplete characters like this have
1336
     * already been eliminated from the input.  Retaining the paranoia
1337
     * check is still valuable, however.
1338
     */
1339
0
    return XML_TOK_PARTIAL; /* LCOV_EXCL_LINE */
1340
0
  }
1341
226k
  start = ptr;
1342
60.4M
  while (HAS_CHAR(enc, ptr, end)) {
1343
60.4M
    switch (BYTE_TYPE(enc, ptr)) {
1344
0
#  define LEAD_CASE(n)                                                         \
1345
2.86k
  case BT_LEAD##n:                                                             \
1346
2.86k
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1347
2.86k
    break;
1348
748
      LEAD_CASE(2)
1349
825
      LEAD_CASE(3)
1350
1.28k
      LEAD_CASE(4)
1351
0
#  undef LEAD_CASE
1352
60.4k
    case BT_AMP:
1353
60.4k
      if (ptr == start)
1354
37.1k
        return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1355
23.3k
      *nextTokPtr = ptr;
1356
23.3k
      return XML_TOK_DATA_CHARS;
1357
11
    case BT_PERCNT:
1358
11
      if (ptr == start) {
1359
7
        int tok = PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1360
7
        return (tok == XML_TOK_PERCENT) ? XML_TOK_INVALID : tok;
1361
7
      }
1362
4
      *nextTokPtr = ptr;
1363
4
      return XML_TOK_DATA_CHARS;
1364
52.6k
    case BT_LF:
1365
52.6k
      if (ptr == start) {
1366
41.0k
        *nextTokPtr = ptr + MINBPC(enc);
1367
41.0k
        return XML_TOK_DATA_NEWLINE;
1368
41.0k
      }
1369
11.6k
      *nextTokPtr = ptr;
1370
11.6k
      return XML_TOK_DATA_CHARS;
1371
111k
    case BT_CR:
1372
111k
      if (ptr == start) {
1373
69.3k
        ptr += MINBPC(enc);
1374
69.3k
        if (! HAS_CHAR(enc, ptr, end))
1375
236
          return XML_TOK_TRAILING_CR;
1376
69.1k
        if (BYTE_TYPE(enc, ptr) == BT_LF)
1377
2.00k
          ptr += MINBPC(enc);
1378
69.1k
        *nextTokPtr = ptr;
1379
69.1k
        return XML_TOK_DATA_NEWLINE;
1380
69.3k
      }
1381
42.0k
      *nextTokPtr = ptr;
1382
42.0k
      return XML_TOK_DATA_CHARS;
1383
60.2M
    default:
1384
60.2M
      ptr += MINBPC(enc);
1385
60.2M
      break;
1386
60.4M
    }
1387
60.4M
  }
1388
2.37k
  *nextTokPtr = ptr;
1389
2.37k
  return XML_TOK_DATA_CHARS;
1390
226k
}
xmltok.c:normal_entityValueTok
Line
Count
Source
1329
232k
                       const char **nextTokPtr) {
1330
232k
  const char *start;
1331
232k
  if (ptr >= end)
1332
5.13k
    return XML_TOK_NONE;
1333
226k
  else if (! HAS_CHAR(enc, ptr, end)) {
1334
    /* This line cannot be executed.  The incoming data has already
1335
     * been tokenized once, so incomplete characters like this have
1336
     * already been eliminated from the input.  Retaining the paranoia
1337
     * check is still valuable, however.
1338
     */
1339
0
    return XML_TOK_PARTIAL; /* LCOV_EXCL_LINE */
1340
0
  }
1341
226k
  start = ptr;
1342
60.4M
  while (HAS_CHAR(enc, ptr, end)) {
1343
60.4M
    switch (BYTE_TYPE(enc, ptr)) {
1344
0
#  define LEAD_CASE(n)                                                         \
1345
0
  case BT_LEAD##n:                                                             \
1346
0
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1347
0
    break;
1348
748
      LEAD_CASE(2)
1349
825
      LEAD_CASE(3)
1350
1.28k
      LEAD_CASE(4)
1351
0
#  undef LEAD_CASE
1352
60.4k
    case BT_AMP:
1353
60.4k
      if (ptr == start)
1354
37.1k
        return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1355
23.3k
      *nextTokPtr = ptr;
1356
23.3k
      return XML_TOK_DATA_CHARS;
1357
11
    case BT_PERCNT:
1358
11
      if (ptr == start) {
1359
7
        int tok = PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1360
7
        return (tok == XML_TOK_PERCENT) ? XML_TOK_INVALID : tok;
1361
7
      }
1362
4
      *nextTokPtr = ptr;
1363
4
      return XML_TOK_DATA_CHARS;
1364
52.6k
    case BT_LF:
1365
52.6k
      if (ptr == start) {
1366
41.0k
        *nextTokPtr = ptr + MINBPC(enc);
1367
41.0k
        return XML_TOK_DATA_NEWLINE;
1368
41.0k
      }
1369
11.6k
      *nextTokPtr = ptr;
1370
11.6k
      return XML_TOK_DATA_CHARS;
1371
111k
    case BT_CR:
1372
111k
      if (ptr == start) {
1373
69.3k
        ptr += MINBPC(enc);
1374
69.3k
        if (! HAS_CHAR(enc, ptr, end))
1375
236
          return XML_TOK_TRAILING_CR;
1376
69.1k
        if (BYTE_TYPE(enc, ptr) == BT_LF)
1377
2.00k
          ptr += MINBPC(enc);
1378
69.1k
        *nextTokPtr = ptr;
1379
69.1k
        return XML_TOK_DATA_NEWLINE;
1380
69.3k
      }
1381
42.0k
      *nextTokPtr = ptr;
1382
42.0k
      return XML_TOK_DATA_CHARS;
1383
60.2M
    default:
1384
60.2M
      ptr += MINBPC(enc);
1385
60.2M
      break;
1386
60.4M
    }
1387
60.4M
  }
1388
2.37k
  *nextTokPtr = ptr;
1389
2.37k
  return XML_TOK_DATA_CHARS;
1390
226k
}
Unexecuted instantiation: xmltok.c:little2_entityValueTok
Unexecuted instantiation: xmltok.c:big2_entityValueTok
1391
1392
#  ifdef XML_DTD
1393
1394
static int PTRCALL
1395
PREFIX(ignoreSectionTok)(const ENCODING *enc, const char *ptr, const char *end,
1396
                         const char **nextTokPtr) {
1397
  int level = 0;
1398
  if (MINBPC(enc) > 1) {
1399
    size_t n = end - ptr;
1400
    if (n & (MINBPC(enc) - 1)) {
1401
      n &= ~(MINBPC(enc) - 1);
1402
      end = ptr + n;
1403
    }
1404
  }
1405
  while (HAS_CHAR(enc, ptr, end)) {
1406
    switch (BYTE_TYPE(enc, ptr)) {
1407
      INVALID_CASES(ptr, nextTokPtr)
1408
    case BT_LT:
1409
      ptr += MINBPC(enc);
1410
      REQUIRE_CHAR(enc, ptr, end);
1411
      if (CHAR_MATCHES(enc, ptr, ASCII_EXCL)) {
1412
        ptr += MINBPC(enc);
1413
        REQUIRE_CHAR(enc, ptr, end);
1414
        if (CHAR_MATCHES(enc, ptr, ASCII_LSQB)) {
1415
          ++level;
1416
          ptr += MINBPC(enc);
1417
        }
1418
      }
1419
      break;
1420
    case BT_RSQB:
1421
      ptr += MINBPC(enc);
1422
      REQUIRE_CHAR(enc, ptr, end);
1423
      if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) {
1424
        ptr += MINBPC(enc);
1425
        REQUIRE_CHAR(enc, ptr, end);
1426
        if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
1427
          ptr += MINBPC(enc);
1428
          if (level == 0) {
1429
            *nextTokPtr = ptr;
1430
            return XML_TOK_IGNORE_SECT;
1431
          }
1432
          --level;
1433
        }
1434
      }
1435
      break;
1436
    default:
1437
      ptr += MINBPC(enc);
1438
      break;
1439
    }
1440
  }
1441
  return XML_TOK_PARTIAL;
1442
}
1443
1444
#  endif /* XML_DTD */
1445
1446
static int PTRCALL
1447
PREFIX(isPublicId)(const ENCODING *enc, const char *ptr, const char *end,
1448
4.95k
                   const char **badPtr) {
1449
4.95k
  ptr += MINBPC(enc);
1450
4.95k
  end -= MINBPC(enc);
1451
88.7k
  for (; HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
1452
88.7k
    switch (BYTE_TYPE(enc, ptr)) {
1453
4.15k
    case BT_DIGIT:
1454
11.7k
    case BT_HEX:
1455
12.3k
    case BT_MINUS:
1456
12.5k
    case BT_APOS:
1457
12.8k
    case BT_LPAR:
1458
13.3k
    case BT_RPAR:
1459
13.7k
    case BT_PLUS:
1460
13.9k
    case BT_COMMA:
1461
14.9k
    case BT_SOL:
1462
18.5k
    case BT_EQUALS:
1463
18.9k
    case BT_QUEST:
1464
19.9k
    case BT_CR:
1465
20.3k
    case BT_LF:
1466
20.5k
    case BT_SEMI:
1467
20.8k
    case BT_EXCL:
1468
21.4k
    case BT_AST:
1469
21.9k
    case BT_PERCNT:
1470
22.1k
    case BT_NUM:
1471
#  ifdef XML_NS
1472
    case BT_COLON:
1473
#  endif
1474
22.1k
      break;
1475
1.90k
    case BT_S:
1476
1.90k
      if (CHAR_MATCHES(enc, ptr, ASCII_TAB)) {
1477
2
        *badPtr = ptr;
1478
2
        return 0;
1479
2
      }
1480
1.90k
      break;
1481
5.66k
    case BT_NAME:
1482
59.9k
    case BT_NMSTRT:
1483
59.9k
      if (! (BYTE_TO_ASCII(enc, ptr) & ~0x7f))
1484
59.9k
        break;
1485
      /* fall through */
1486
4.66k
    default:
1487
4.66k
      switch (BYTE_TO_ASCII(enc, ptr)) {
1488
3.73k
      case 0x24: /* $ */
1489
4.65k
      case 0x40: /* @ */
1490
4.65k
        break;
1491
12
      default:
1492
12
        *badPtr = ptr;
1493
12
        return 0;
1494
4.66k
      }
1495
4.65k
      break;
1496
88.7k
    }
1497
88.7k
  }
1498
4.93k
  return 1;
1499
4.95k
}
xmltok.c:normal_isPublicId
Line
Count
Source
1448
4.95k
                   const char **badPtr) {
1449
4.95k
  ptr += MINBPC(enc);
1450
4.95k
  end -= MINBPC(enc);
1451
88.7k
  for (; HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
1452
88.7k
    switch (BYTE_TYPE(enc, ptr)) {
1453
4.15k
    case BT_DIGIT:
1454
11.7k
    case BT_HEX:
1455
12.3k
    case BT_MINUS:
1456
12.5k
    case BT_APOS:
1457
12.8k
    case BT_LPAR:
1458
13.3k
    case BT_RPAR:
1459
13.7k
    case BT_PLUS:
1460
13.9k
    case BT_COMMA:
1461
14.9k
    case BT_SOL:
1462
18.5k
    case BT_EQUALS:
1463
18.9k
    case BT_QUEST:
1464
19.9k
    case BT_CR:
1465
20.3k
    case BT_LF:
1466
20.5k
    case BT_SEMI:
1467
20.8k
    case BT_EXCL:
1468
21.4k
    case BT_AST:
1469
21.9k
    case BT_PERCNT:
1470
22.1k
    case BT_NUM:
1471
#  ifdef XML_NS
1472
    case BT_COLON:
1473
#  endif
1474
22.1k
      break;
1475
1.90k
    case BT_S:
1476
1.90k
      if (CHAR_MATCHES(enc, ptr, ASCII_TAB)) {
1477
2
        *badPtr = ptr;
1478
2
        return 0;
1479
2
      }
1480
1.90k
      break;
1481
5.66k
    case BT_NAME:
1482
59.9k
    case BT_NMSTRT:
1483
59.9k
      if (! (BYTE_TO_ASCII(enc, ptr) & ~0x7f))
1484
59.9k
        break;
1485
      /* fall through */
1486
4.66k
    default:
1487
4.66k
      switch (BYTE_TO_ASCII(enc, ptr)) {
1488
3.73k
      case 0x24: /* $ */
1489
4.65k
      case 0x40: /* @ */
1490
4.65k
        break;
1491
12
      default:
1492
12
        *badPtr = ptr;
1493
12
        return 0;
1494
4.66k
      }
1495
4.65k
      break;
1496
88.7k
    }
1497
88.7k
  }
1498
4.93k
  return 1;
1499
4.95k
}
Unexecuted instantiation: xmltok.c:little2_isPublicId
Unexecuted instantiation: xmltok.c:big2_isPublicId
1500
1501
/* This must only be called for a well-formed start-tag or empty
1502
   element tag.  Returns the number of attributes.  Pointers to the
1503
   first attsMax attributes are stored in atts.
1504
*/
1505
1506
static int PTRCALL
1507
PREFIX(getAtts)(const ENCODING *enc, const char *ptr, int attsMax,
1508
1.35M
                ATTRIBUTE *atts) {
1509
1.35M
  enum { other, inName, inValue } state = inName;
1510
1.35M
  int nAtts = 0;
1511
1.35M
  int open = 0; /* defined when state == inValue;
1512
                   initialization just to shut up compilers */
1513
1514
26.6M
  for (ptr += MINBPC(enc);; ptr += MINBPC(enc)) {
1515
26.6M
    switch (BYTE_TYPE(enc, ptr)) {
1516
0
#  define START_NAME                                                           \
1517
17.4M
    if (state == other) {                                                      \
1518
1.39M
      if (nAtts < attsMax) {                                                   \
1519
710k
        atts[nAtts].name = ptr;                                                \
1520
710k
        atts[nAtts].normalized = 1;                                            \
1521
710k
      }                                                                        \
1522
1.39M
      state = inName;                                                          \
1523
1.39M
    }
1524
0
#  define LEAD_CASE(n)                                                         \
1525
10.7M
  case BT_LEAD##n: /* NOTE: The encoding has already been validated. */        \
1526
10.7M
    START_NAME ptr += (n - MINBPC(enc));                                       \
1527
10.7M
    break;
1528
10.7M
      LEAD_CASE(2)
1529
13.5k
      LEAD_CASE(3)
1530
2.19k
      LEAD_CASE(4)
1531
0
#  undef LEAD_CASE
1532
0
    case BT_NONASCII:
1533
5.79M
    case BT_NMSTRT:
1534
6.70M
    case BT_HEX:
1535
6.70M
      START_NAME
1536
6.70M
      break;
1537
0
#  undef START_NAME
1538
203k
    case BT_QUOT:
1539
203k
      if (state != inValue) {
1540
79.1k
        if (nAtts < attsMax)
1541
53.0k
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1542
79.1k
        state = inValue;
1543
79.1k
        open = BT_QUOT;
1544
124k
      } else if (open == BT_QUOT) {
1545
79.1k
        state = other;
1546
79.1k
        if (nAtts < attsMax)
1547
53.0k
          atts[nAtts].valueEnd = ptr;
1548
79.1k
        nAtts++;
1549
79.1k
      }
1550
203k
      break;
1551
2.62M
    case BT_APOS:
1552
2.62M
      if (state != inValue) {
1553
1.31M
        if (nAtts < attsMax)
1554
657k
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1555
1.31M
        state = inValue;
1556
1.31M
        open = BT_APOS;
1557
1.31M
      } else if (open == BT_APOS) {
1558
1.31M
        state = other;
1559
1.31M
        if (nAtts < attsMax)
1560
657k
          atts[nAtts].valueEnd = ptr;
1561
1.31M
        nAtts++;
1562
1.31M
      }
1563
2.62M
      break;
1564
20.9k
    case BT_AMP:
1565
20.9k
      if (nAtts < attsMax)
1566
17.2k
        atts[nAtts].normalized = 0;
1567
20.9k
      break;
1568
1.06M
    case BT_S:
1569
1.06M
      if (state == inName)
1570
21.9k
        state = other;
1571
1.04M
      else if (state == inValue && nAtts < attsMax && atts[nAtts].normalized
1572
1.04M
               && (ptr == atts[nAtts].valuePtr
1573
26.8k
                   || BYTE_TO_ASCII(enc, ptr) != ASCII_SPACE
1574
26.8k
                   || BYTE_TO_ASCII(enc, ptr + MINBPC(enc)) == ASCII_SPACE
1575
26.8k
                   || BYTE_TYPE(enc, ptr + MINBPC(enc)) == open))
1576
25.2k
        atts[nAtts].normalized = 0;
1577
1.06M
      break;
1578
702k
    case BT_CR:
1579
757k
    case BT_LF:
1580
      /* This case ensures that the first attribute name is counted
1581
         Apart from that we could just change state on the quote. */
1582
757k
      if (state == inName)
1583
2.81k
        state = other;
1584
755k
      else if (state == inValue && nAtts < attsMax)
1585
18.8k
        atts[nAtts].normalized = 0;
1586
757k
      break;
1587
1.34M
    case BT_GT:
1588
1.35M
    case BT_SOL:
1589
1.35M
      if (state != inValue)
1590
1.35M
        return nAtts;
1591
3.41k
      break;
1592
3.21M
    default:
1593
3.21M
      break;
1594
26.6M
    }
1595
26.6M
  }
1596
  /* not reached */
1597
1.35M
}
xmltok.c:normal_getAtts
Line
Count
Source
1508
1.35M
                ATTRIBUTE *atts) {
1509
1.35M
  enum { other, inName, inValue } state = inName;
1510
1.35M
  int nAtts = 0;
1511
1.35M
  int open = 0; /* defined when state == inValue;
1512
                   initialization just to shut up compilers */
1513
1514
26.6M
  for (ptr += MINBPC(enc);; ptr += MINBPC(enc)) {
1515
26.6M
    switch (BYTE_TYPE(enc, ptr)) {
1516
0
#  define START_NAME                                                           \
1517
0
    if (state == other) {                                                      \
1518
0
      if (nAtts < attsMax) {                                                   \
1519
0
        atts[nAtts].name = ptr;                                                \
1520
0
        atts[nAtts].normalized = 1;                                            \
1521
0
      }                                                                        \
1522
0
      state = inName;                                                          \
1523
0
    }
1524
0
#  define LEAD_CASE(n)                                                         \
1525
0
  case BT_LEAD##n: /* NOTE: The encoding has already been validated. */        \
1526
0
    START_NAME ptr += (n - MINBPC(enc));                                       \
1527
0
    break;
1528
10.7M
      LEAD_CASE(2)
1529
13.5k
      LEAD_CASE(3)
1530
2.19k
      LEAD_CASE(4)
1531
0
#  undef LEAD_CASE
1532
0
    case BT_NONASCII:
1533
5.79M
    case BT_NMSTRT:
1534
6.70M
    case BT_HEX:
1535
6.70M
      START_NAME
1536
6.70M
      break;
1537
0
#  undef START_NAME
1538
203k
    case BT_QUOT:
1539
203k
      if (state != inValue) {
1540
79.1k
        if (nAtts < attsMax)
1541
53.0k
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1542
79.1k
        state = inValue;
1543
79.1k
        open = BT_QUOT;
1544
124k
      } else if (open == BT_QUOT) {
1545
79.1k
        state = other;
1546
79.1k
        if (nAtts < attsMax)
1547
53.0k
          atts[nAtts].valueEnd = ptr;
1548
79.1k
        nAtts++;
1549
79.1k
      }
1550
203k
      break;
1551
2.62M
    case BT_APOS:
1552
2.62M
      if (state != inValue) {
1553
1.31M
        if (nAtts < attsMax)
1554
657k
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1555
1.31M
        state = inValue;
1556
1.31M
        open = BT_APOS;
1557
1.31M
      } else if (open == BT_APOS) {
1558
1.31M
        state = other;
1559
1.31M
        if (nAtts < attsMax)
1560
657k
          atts[nAtts].valueEnd = ptr;
1561
1.31M
        nAtts++;
1562
1.31M
      }
1563
2.62M
      break;
1564
20.9k
    case BT_AMP:
1565
20.9k
      if (nAtts < attsMax)
1566
17.2k
        atts[nAtts].normalized = 0;
1567
20.9k
      break;
1568
1.06M
    case BT_S:
1569
1.06M
      if (state == inName)
1570
21.9k
        state = other;
1571
1.04M
      else if (state == inValue && nAtts < attsMax && atts[nAtts].normalized
1572
1.04M
               && (ptr == atts[nAtts].valuePtr
1573
26.8k
                   || BYTE_TO_ASCII(enc, ptr) != ASCII_SPACE
1574
26.8k
                   || BYTE_TO_ASCII(enc, ptr + MINBPC(enc)) == ASCII_SPACE
1575
26.8k
                   || BYTE_TYPE(enc, ptr + MINBPC(enc)) == open))
1576
25.2k
        atts[nAtts].normalized = 0;
1577
1.06M
      break;
1578
702k
    case BT_CR:
1579
757k
    case BT_LF:
1580
      /* This case ensures that the first attribute name is counted
1581
         Apart from that we could just change state on the quote. */
1582
757k
      if (state == inName)
1583
2.81k
        state = other;
1584
755k
      else if (state == inValue && nAtts < attsMax)
1585
18.8k
        atts[nAtts].normalized = 0;
1586
757k
      break;
1587
1.34M
    case BT_GT:
1588
1.35M
    case BT_SOL:
1589
1.35M
      if (state != inValue)
1590
1.35M
        return nAtts;
1591
3.41k
      break;
1592
3.21M
    default:
1593
3.21M
      break;
1594
26.6M
    }
1595
26.6M
  }
1596
  /* not reached */
1597
1.35M
}
Unexecuted instantiation: xmltok.c:little2_getAtts
Unexecuted instantiation: xmltok.c:big2_getAtts
1598
1599
static int PTRFASTCALL
1600
754k
PREFIX(charRefNumber)(const ENCODING *enc, const char *ptr) {
1601
754k
  int result = 0;
1602
  /* skip &# */
1603
754k
  UNUSED_P(enc);
1604
754k
  ptr += 2 * MINBPC(enc);
1605
754k
  if (CHAR_MATCHES(enc, ptr, ASCII_x)) {
1606
3.35M
    for (ptr += MINBPC(enc); ! CHAR_MATCHES(enc, ptr, ASCII_SEMI);
1607
2.60M
         ptr += MINBPC(enc)) {
1608
2.60M
      int c = BYTE_TO_ASCII(enc, ptr);
1609
2.60M
      switch (c) {
1610
9.49k
      case ASCII_0:
1611
912k
      case ASCII_1:
1612
1.07M
      case ASCII_2:
1613
1.23M
      case ASCII_3:
1614
1.23M
      case ASCII_4:
1615
1.24M
      case ASCII_5:
1616
1.63M
      case ASCII_6:
1617
1.63M
      case ASCII_7:
1618
1.79M
      case ASCII_8:
1619
1.79M
      case ASCII_9:
1620
1.79M
        result <<= 4;
1621
1.79M
        result |= (c - ASCII_0);
1622
1.79M
        break;
1623
157k
      case ASCII_A:
1624
163k
      case ASCII_B:
1625
170k
      case ASCII_C:
1626
176k
      case ASCII_D:
1627
182k
      case ASCII_E:
1628
777k
      case ASCII_F:
1629
777k
        result <<= 4;
1630
777k
        result += 10 + (c - ASCII_A);
1631
777k
        break;
1632
1.09k
      case ASCII_a:
1633
20.1k
      case ASCII_b:
1634
21.3k
      case ASCII_c:
1635
22.3k
      case ASCII_d:
1636
26.9k
      case ASCII_e:
1637
29.4k
      case ASCII_f:
1638
29.4k
        result <<= 4;
1639
29.4k
        result += 10 + (c - ASCII_a);
1640
29.4k
        break;
1641
2.60M
      }
1642
2.60M
      if (result >= 0x110000)
1643
18
        return -1;
1644
2.60M
    }
1645
748k
  } else {
1646
25.2k
    for (; ! CHAR_MATCHES(enc, ptr, ASCII_SEMI); ptr += MINBPC(enc)) {
1647
19.0k
      int c = BYTE_TO_ASCII(enc, ptr);
1648
19.0k
      result *= 10;
1649
19.0k
      result += (c - ASCII_0);
1650
19.0k
      if (result >= 0x110000)
1651
8
        return -1;
1652
19.0k
    }
1653
6.20k
  }
1654
754k
  return checkCharRefNumber(result);
1655
754k
}
xmltok.c:normal_charRefNumber
Line
Count
Source
1600
754k
PREFIX(charRefNumber)(const ENCODING *enc, const char *ptr) {
1601
754k
  int result = 0;
1602
  /* skip &# */
1603
754k
  UNUSED_P(enc);
1604
754k
  ptr += 2 * MINBPC(enc);
1605
754k
  if (CHAR_MATCHES(enc, ptr, ASCII_x)) {
1606
3.35M
    for (ptr += MINBPC(enc); ! CHAR_MATCHES(enc, ptr, ASCII_SEMI);
1607
2.60M
         ptr += MINBPC(enc)) {
1608
2.60M
      int c = BYTE_TO_ASCII(enc, ptr);
1609
2.60M
      switch (c) {
1610
9.49k
      case ASCII_0:
1611
912k
      case ASCII_1:
1612
1.07M
      case ASCII_2:
1613
1.23M
      case ASCII_3:
1614
1.23M
      case ASCII_4:
1615
1.24M
      case ASCII_5:
1616
1.63M
      case ASCII_6:
1617
1.63M
      case ASCII_7:
1618
1.79M
      case ASCII_8:
1619
1.79M
      case ASCII_9:
1620
1.79M
        result <<= 4;
1621
1.79M
        result |= (c - ASCII_0);
1622
1.79M
        break;
1623
157k
      case ASCII_A:
1624
163k
      case ASCII_B:
1625
170k
      case ASCII_C:
1626
176k
      case ASCII_D:
1627
182k
      case ASCII_E:
1628
777k
      case ASCII_F:
1629
777k
        result <<= 4;
1630
777k
        result += 10 + (c - ASCII_A);
1631
777k
        break;
1632
1.09k
      case ASCII_a:
1633
20.1k
      case ASCII_b:
1634
21.3k
      case ASCII_c:
1635
22.3k
      case ASCII_d:
1636
26.9k
      case ASCII_e:
1637
29.4k
      case ASCII_f:
1638
29.4k
        result <<= 4;
1639
29.4k
        result += 10 + (c - ASCII_a);
1640
29.4k
        break;
1641
2.60M
      }
1642
2.60M
      if (result >= 0x110000)
1643
18
        return -1;
1644
2.60M
    }
1645
748k
  } else {
1646
25.2k
    for (; ! CHAR_MATCHES(enc, ptr, ASCII_SEMI); ptr += MINBPC(enc)) {
1647
19.0k
      int c = BYTE_TO_ASCII(enc, ptr);
1648
19.0k
      result *= 10;
1649
19.0k
      result += (c - ASCII_0);
1650
19.0k
      if (result >= 0x110000)
1651
8
        return -1;
1652
19.0k
    }
1653
6.20k
  }
1654
754k
  return checkCharRefNumber(result);
1655
754k
}
Unexecuted instantiation: xmltok.c:little2_charRefNumber
Unexecuted instantiation: xmltok.c:big2_charRefNumber
1656
1657
static int PTRCALL
1658
PREFIX(predefinedEntityName)(const ENCODING *enc, const char *ptr,
1659
10.5M
                             const char *end) {
1660
10.5M
  UNUSED_P(enc);
1661
10.5M
  switch ((end - ptr) / MINBPC(enc)) {
1662
2.28k
  case 2:
1663
2.28k
    if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_t)) {
1664
432
      switch (BYTE_TO_ASCII(enc, ptr)) {
1665
231
      case ASCII_l:
1666
231
        return ASCII_LT;
1667
80
      case ASCII_g:
1668
80
        return ASCII_GT;
1669
432
      }
1670
432
    }
1671
1.97k
    break;
1672
1.97k
  case 3:
1673
1.65k
    if (CHAR_MATCHES(enc, ptr, ASCII_a)) {
1674
836
      ptr += MINBPC(enc);
1675
836
      if (CHAR_MATCHES(enc, ptr, ASCII_m)) {
1676
301
        ptr += MINBPC(enc);
1677
301
        if (CHAR_MATCHES(enc, ptr, ASCII_p))
1678
71
          return ASCII_AMP;
1679
301
      }
1680
836
    }
1681
1.58k
    break;
1682
4.51k
  case 4:
1683
4.51k
    switch (BYTE_TO_ASCII(enc, ptr)) {
1684
1.25k
    case ASCII_q:
1685
1.25k
      ptr += MINBPC(enc);
1686
1.25k
      if (CHAR_MATCHES(enc, ptr, ASCII_u)) {
1687
745
        ptr += MINBPC(enc);
1688
745
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1689
298
          ptr += MINBPC(enc);
1690
298
          if (CHAR_MATCHES(enc, ptr, ASCII_t))
1691
87
            return ASCII_QUOT;
1692
298
        }
1693
745
      }
1694
1.17k
      break;
1695
2.56k
    case ASCII_a:
1696
2.56k
      ptr += MINBPC(enc);
1697
2.56k
      if (CHAR_MATCHES(enc, ptr, ASCII_p)) {
1698
1.50k
        ptr += MINBPC(enc);
1699
1.50k
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1700
843
          ptr += MINBPC(enc);
1701
843
          if (CHAR_MATCHES(enc, ptr, ASCII_s))
1702
211
            return ASCII_APOS;
1703
843
        }
1704
1.50k
      }
1705
2.35k
      break;
1706
4.51k
    }
1707
10.5M
  }
1708
10.5M
  return 0;
1709
10.5M
}
xmltok.c:normal_predefinedEntityName
Line
Count
Source
1659
10.5M
                             const char *end) {
1660
10.5M
  UNUSED_P(enc);
1661
10.5M
  switch ((end - ptr) / MINBPC(enc)) {
1662
2.28k
  case 2:
1663
2.28k
    if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_t)) {
1664
432
      switch (BYTE_TO_ASCII(enc, ptr)) {
1665
231
      case ASCII_l:
1666
231
        return ASCII_LT;
1667
80
      case ASCII_g:
1668
80
        return ASCII_GT;
1669
432
      }
1670
432
    }
1671
1.97k
    break;
1672
1.97k
  case 3:
1673
1.65k
    if (CHAR_MATCHES(enc, ptr, ASCII_a)) {
1674
836
      ptr += MINBPC(enc);
1675
836
      if (CHAR_MATCHES(enc, ptr, ASCII_m)) {
1676
301
        ptr += MINBPC(enc);
1677
301
        if (CHAR_MATCHES(enc, ptr, ASCII_p))
1678
71
          return ASCII_AMP;
1679
301
      }
1680
836
    }
1681
1.58k
    break;
1682
4.51k
  case 4:
1683
4.51k
    switch (BYTE_TO_ASCII(enc, ptr)) {
1684
1.25k
    case ASCII_q:
1685
1.25k
      ptr += MINBPC(enc);
1686
1.25k
      if (CHAR_MATCHES(enc, ptr, ASCII_u)) {
1687
745
        ptr += MINBPC(enc);
1688
745
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1689
298
          ptr += MINBPC(enc);
1690
298
          if (CHAR_MATCHES(enc, ptr, ASCII_t))
1691
87
            return ASCII_QUOT;
1692
298
        }
1693
745
      }
1694
1.17k
      break;
1695
2.56k
    case ASCII_a:
1696
2.56k
      ptr += MINBPC(enc);
1697
2.56k
      if (CHAR_MATCHES(enc, ptr, ASCII_p)) {
1698
1.50k
        ptr += MINBPC(enc);
1699
1.50k
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1700
843
          ptr += MINBPC(enc);
1701
843
          if (CHAR_MATCHES(enc, ptr, ASCII_s))
1702
211
            return ASCII_APOS;
1703
843
        }
1704
1.50k
      }
1705
2.35k
      break;
1706
4.51k
    }
1707
10.5M
  }
1708
10.5M
  return 0;
1709
10.5M
}
Unexecuted instantiation: xmltok.c:little2_predefinedEntityName
Unexecuted instantiation: xmltok.c:big2_predefinedEntityName
1710
1711
static int PTRCALL
1712
PREFIX(nameMatchesAscii)(const ENCODING *enc, const char *ptr1,
1713
111k
                         const char *end1, const char *ptr2) {
1714
111k
  UNUSED_P(enc);
1715
531k
  for (; *ptr2; ptr1 += MINBPC(enc), ptr2++) {
1716
466k
    if (end1 - ptr1 < MINBPC(enc)) {
1717
      /* This line cannot be executed.  The incoming data has already
1718
       * been tokenized once, so incomplete characters like this have
1719
       * already been eliminated from the input.  Retaining the
1720
       * paranoia check is still valuable, however.
1721
       */
1722
55
      return 0; /* LCOV_EXCL_LINE */
1723
55
    }
1724
466k
    if (! CHAR_MATCHES(enc, ptr1, *ptr2))
1725
46.4k
      return 0;
1726
466k
  }
1727
65.2k
  return ptr1 == end1;
1728
111k
}
xmltok.c:normal_nameMatchesAscii
Line
Count
Source
1713
111k
                         const char *end1, const char *ptr2) {
1714
111k
  UNUSED_P(enc);
1715
531k
  for (; *ptr2; ptr1 += MINBPC(enc), ptr2++) {
1716
466k
    if (end1 - ptr1 < MINBPC(enc)) {
1717
      /* This line cannot be executed.  The incoming data has already
1718
       * been tokenized once, so incomplete characters like this have
1719
       * already been eliminated from the input.  Retaining the
1720
       * paranoia check is still valuable, however.
1721
       */
1722
55
      return 0; /* LCOV_EXCL_LINE */
1723
55
    }
1724
466k
    if (! CHAR_MATCHES(enc, ptr1, *ptr2))
1725
46.4k
      return 0;
1726
466k
  }
1727
65.2k
  return ptr1 == end1;
1728
111k
}
Unexecuted instantiation: xmltok.c:little2_nameMatchesAscii
Unexecuted instantiation: xmltok.c:big2_nameMatchesAscii
1729
1730
static int PTRFASTCALL
1731
1.51M
PREFIX(nameLength)(const ENCODING *enc, const char *ptr) {
1732
1.51M
  const char *start = ptr;
1733
13.4M
  for (;;) {
1734
13.4M
    switch (BYTE_TYPE(enc, ptr)) {
1735
0
#  define LEAD_CASE(n)                                                         \
1736
4.99M
  case BT_LEAD##n:                                                             \
1737
4.99M
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1738
4.99M
    break;
1739
4.99M
      LEAD_CASE(2)
1740
2.40k
      LEAD_CASE(3)
1741
0
      LEAD_CASE(4)
1742
0
#  undef LEAD_CASE
1743
0
    case BT_NONASCII:
1744
4.29M
    case BT_NMSTRT:
1745
#  ifdef XML_NS
1746
    case BT_COLON:
1747
#  endif
1748
5.25M
    case BT_HEX:
1749
5.27M
    case BT_DIGIT:
1750
6.88M
    case BT_NAME:
1751
6.88M
    case BT_MINUS:
1752
6.88M
      ptr += MINBPC(enc);
1753
6.88M
      break;
1754
1.51M
    default:
1755
1.51M
      return (int)(ptr - start);
1756
13.4M
    }
1757
13.4M
  }
1758
1.51M
}
xmltok.c:normal_nameLength
Line
Count
Source
1731
1.51M
PREFIX(nameLength)(const ENCODING *enc, const char *ptr) {
1732
1.51M
  const char *start = ptr;
1733
13.4M
  for (;;) {
1734
13.4M
    switch (BYTE_TYPE(enc, ptr)) {
1735
0
#  define LEAD_CASE(n)                                                         \
1736
0
  case BT_LEAD##n:                                                             \
1737
0
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1738
0
    break;
1739
4.99M
      LEAD_CASE(2)
1740
2.40k
      LEAD_CASE(3)
1741
0
      LEAD_CASE(4)
1742
0
#  undef LEAD_CASE
1743
0
    case BT_NONASCII:
1744
4.29M
    case BT_NMSTRT:
1745
#  ifdef XML_NS
1746
    case BT_COLON:
1747
#  endif
1748
5.25M
    case BT_HEX:
1749
5.27M
    case BT_DIGIT:
1750
6.88M
    case BT_NAME:
1751
6.88M
    case BT_MINUS:
1752
6.88M
      ptr += MINBPC(enc);
1753
6.88M
      break;
1754
1.51M
    default:
1755
1.51M
      return (int)(ptr - start);
1756
13.4M
    }
1757
13.4M
  }
1758
1.51M
}
Unexecuted instantiation: xmltok.c:little2_nameLength
Unexecuted instantiation: xmltok.c:big2_nameLength
1759
1760
static const char *PTRFASTCALL
1761
0
PREFIX(skipS)(const ENCODING *enc, const char *ptr) {
1762
0
  for (;;) {
1763
0
    switch (BYTE_TYPE(enc, ptr)) {
1764
0
    case BT_LF:
1765
0
    case BT_CR:
1766
0
    case BT_S:
1767
0
      ptr += MINBPC(enc);
1768
0
      break;
1769
0
    default:
1770
0
      return ptr;
1771
0
    }
1772
0
  }
1773
0
}
Unexecuted instantiation: xmltok.c:normal_skipS
Unexecuted instantiation: xmltok.c:little2_skipS
Unexecuted instantiation: xmltok.c:big2_skipS
1774
1775
static void PTRCALL
1776
PREFIX(updatePosition)(const ENCODING *enc, const char *ptr, const char *end,
1777
18.6k
                       POSITION *pos) {
1778
75.1M
  while (HAS_CHAR(enc, ptr, end)) {
1779
75.1M
    switch (BYTE_TYPE(enc, ptr)) {
1780
0
#  define LEAD_CASE(n)                                                         \
1781
8.48k
  case BT_LEAD##n:                                                             \
1782
8.48k
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1783
8.48k
    pos->columnNumber++;                                                       \
1784
8.48k
    break;
1785
2.50k
      LEAD_CASE(2)
1786
3.90k
      LEAD_CASE(3)
1787
2.07k
      LEAD_CASE(4)
1788
0
#  undef LEAD_CASE
1789
130k
    case BT_LF:
1790
130k
      pos->columnNumber = 0;
1791
130k
      pos->lineNumber++;
1792
130k
      ptr += MINBPC(enc);
1793
130k
      break;
1794
169k
    case BT_CR:
1795
169k
      pos->lineNumber++;
1796
169k
      ptr += MINBPC(enc);
1797
169k
      if (HAS_CHAR(enc, ptr, end) && BYTE_TYPE(enc, ptr) == BT_LF)
1798
5.01k
        ptr += MINBPC(enc);
1799
169k
      pos->columnNumber = 0;
1800
169k
      break;
1801
74.8M
    default:
1802
74.8M
      ptr += MINBPC(enc);
1803
74.8M
      pos->columnNumber++;
1804
74.8M
      break;
1805
75.1M
    }
1806
75.1M
  }
1807
18.6k
}
xmltok.c:normal_updatePosition
Line
Count
Source
1777
18.2k
                       POSITION *pos) {
1778
75.1M
  while (HAS_CHAR(enc, ptr, end)) {
1779
75.1M
    switch (BYTE_TYPE(enc, ptr)) {
1780
0
#  define LEAD_CASE(n)                                                         \
1781
0
  case BT_LEAD##n:                                                             \
1782
0
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1783
0
    pos->columnNumber++;                                                       \
1784
0
    break;
1785
2.50k
      LEAD_CASE(2)
1786
3.90k
      LEAD_CASE(3)
1787
2.07k
      LEAD_CASE(4)
1788
0
#  undef LEAD_CASE
1789
130k
    case BT_LF:
1790
130k
      pos->columnNumber = 0;
1791
130k
      pos->lineNumber++;
1792
130k
      ptr += MINBPC(enc);
1793
130k
      break;
1794
169k
    case BT_CR:
1795
169k
      pos->lineNumber++;
1796
169k
      ptr += MINBPC(enc);
1797
169k
      if (HAS_CHAR(enc, ptr, end) && BYTE_TYPE(enc, ptr) == BT_LF)
1798
5.01k
        ptr += MINBPC(enc);
1799
169k
      pos->columnNumber = 0;
1800
169k
      break;
1801
74.8M
    default:
1802
74.8M
      ptr += MINBPC(enc);
1803
74.8M
      pos->columnNumber++;
1804
74.8M
      break;
1805
75.1M
    }
1806
75.1M
  }
1807
18.2k
}
xmltok.c:little2_updatePosition
Line
Count
Source
1777
244
                       POSITION *pos) {
1778
865
  while (HAS_CHAR(enc, ptr, end)) {
1779
865
    switch (BYTE_TYPE(enc, ptr)) {
1780
0
#  define LEAD_CASE(n)                                                         \
1781
0
  case BT_LEAD##n:                                                             \
1782
0
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1783
0
    pos->columnNumber++;                                                       \
1784
0
    break;
1785
0
      LEAD_CASE(2)
1786
0
      LEAD_CASE(3)
1787
0
      LEAD_CASE(4)
1788
0
#  undef LEAD_CASE
1789
0
    case BT_LF:
1790
0
      pos->columnNumber = 0;
1791
0
      pos->lineNumber++;
1792
0
      ptr += MINBPC(enc);
1793
0
      break;
1794
0
    case BT_CR:
1795
0
      pos->lineNumber++;
1796
0
      ptr += MINBPC(enc);
1797
0
      if (HAS_CHAR(enc, ptr, end) && BYTE_TYPE(enc, ptr) == BT_LF)
1798
0
        ptr += MINBPC(enc);
1799
0
      pos->columnNumber = 0;
1800
0
      break;
1801
865
    default:
1802
865
      ptr += MINBPC(enc);
1803
865
      pos->columnNumber++;
1804
865
      break;
1805
865
    }
1806
865
  }
1807
244
}
xmltok.c:big2_updatePosition
Line
Count
Source
1777
203
                       POSITION *pos) {
1778
1.11k
  while (HAS_CHAR(enc, ptr, end)) {
1779
1.11k
    switch (BYTE_TYPE(enc, ptr)) {
1780
0
#  define LEAD_CASE(n)                                                         \
1781
0
  case BT_LEAD##n:                                                             \
1782
0
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1783
0
    pos->columnNumber++;                                                       \
1784
0
    break;
1785
0
      LEAD_CASE(2)
1786
0
      LEAD_CASE(3)
1787
0
      LEAD_CASE(4)
1788
0
#  undef LEAD_CASE
1789
0
    case BT_LF:
1790
0
      pos->columnNumber = 0;
1791
0
      pos->lineNumber++;
1792
0
      ptr += MINBPC(enc);
1793
0
      break;
1794
0
    case BT_CR:
1795
0
      pos->lineNumber++;
1796
0
      ptr += MINBPC(enc);
1797
0
      if (HAS_CHAR(enc, ptr, end) && BYTE_TYPE(enc, ptr) == BT_LF)
1798
0
        ptr += MINBPC(enc);
1799
0
      pos->columnNumber = 0;
1800
0
      break;
1801
1.11k
    default:
1802
1.11k
      ptr += MINBPC(enc);
1803
1.11k
      pos->columnNumber++;
1804
1.11k
      break;
1805
1.11k
    }
1806
1.11k
  }
1807
203
}
1808
1809
#  undef DO_LEAD_CASE
1810
#  undef MULTIBYTE_CASES
1811
#  undef INVALID_CASES
1812
#  undef CHECK_NAME_CASE
1813
#  undef CHECK_NAME_CASES
1814
#  undef CHECK_NMSTRT_CASE
1815
#  undef CHECK_NMSTRT_CASES
1816
1817
#endif /* XML_TOK_IMPL_C */