Coverage Report

Created: 2022-08-24 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
130
#    define IS_INVALID_CHAR(enc, ptr, n) (0)
45
#  endif
46
47
#  define INVALID_LEAD_CASE(n, ptr, nextTokPtr)                                \
48
16.2M
  case BT_LEAD##n:                                                             \
49
16.2M
    if (end - ptr < n)                                                         \
50
16.2M
      return XML_TOK_PARTIAL_CHAR;                                             \
51
16.2M
    if (IS_INVALID_CHAR(enc, ptr, n)) {                                        \
52
165
      *(nextTokPtr) = (ptr);                                                   \
53
165
      return XML_TOK_INVALID;                                                  \
54
165
    }                                                                          \
55
16.2M
    ptr += n;                                                                  \
56
16.2M
    break;
57
58
#  define INVALID_CASES(ptr, nextTokPtr)                                       \
59
16.2M
    INVALID_LEAD_CASE(2, ptr, nextTokPtr)                                      \
60
16.2M
    INVALID_LEAD_CASE(3, ptr, nextTokPtr)                                      \
61
18.1k
    INVALID_LEAD_CASE(4, ptr, nextTokPtr)                                      \
62
9.25k
  case BT_NONXML:                                                              \
63
115
  case BT_MALFORM:                                                             \
64
198
  case BT_TRAIL:                                                               \
65
198
    *(nextTokPtr) = (ptr);                                                     \
66
198
    return XML_TOK_INVALID;
67
68
#  define CHECK_NAME_CASE(n, enc, ptr, end, nextTokPtr)                        \
69
8.27M
  case BT_LEAD##n:                                                             \
70
8.28M
    if (end - ptr < n)                                                         \
71
8.27M
      return XML_TOK_PARTIAL_CHAR;                                             \
72
8.28M
    if (IS_INVALID_CHAR(enc, ptr, n) || ! IS_NAME_CHAR(enc, ptr, n)) {         \
73
489
      *nextTokPtr = ptr;                                                       \
74
489
      return XML_TOK_INVALID;                                                  \
75
489
    }                                                                          \
76
8.28M
    ptr += n;                                                                  \
77
8.27M
    break;
78
79
#  define CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)                          \
80
69.6M
  case BT_NONASCII:                                                            \
81
69.6M
    if (! IS_NAME_CHAR_MINBPC(enc, ptr)) {                                     \
82
73
      *nextTokPtr = ptr;                                                       \
83
73
      return XML_TOK_INVALID;                                                  \
84
73
    }                                                                          \
85
69.6M
    /* fall through */                                                         \
86
69.6M
  case BT_NMSTRT:                                                              \
87
56.9M
  case BT_HEX:                                                                 \
88
69.5M
  case BT_DIGIT:                                                               \
89
69.6M
  case BT_NAME:                                                                \
90
69.6M
  case BT_MINUS:                                                               \
91
69.6M
    ptr += MINBPC(enc);                                                        \
92
69.6M
    break;                                                                     \
93
69.6M
    CHECK_NAME_CASE(2, enc, ptr, end, nextTokPtr)                              \
94
8.27M
    CHECK_NAME_CASE(3, enc, ptr, end, nextTokPtr)                              \
95
7.21k
    CHECK_NAME_CASE(4, enc, ptr, end, nextTokPtr)
96
97
#  define CHECK_NMSTRT_CASE(n, enc, ptr, end, nextTokPtr)                      \
98
67.3k
  case BT_LEAD##n:                                                             \
99
67.7k
    if (end - ptr < n)                                                         \
100
67.3k
      return XML_TOK_PARTIAL_CHAR;                                             \
101
67.6k
    if (IS_INVALID_CHAR(enc, ptr, n) || ! IS_NMSTRT_CHAR(enc, ptr, n)) {       \
102
301
      *nextTokPtr = ptr;                                                       \
103
301
      return XML_TOK_INVALID;                                                  \
104
301
    }                                                                          \
105
67.6k
    ptr += n;                                                                  \
106
67.3k
    break;
107
108
#  define CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)                        \
109
17.6M
  case BT_NONASCII:                                                            \
110
17.6M
    if (! IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {                                   \
111
0
      *nextTokPtr = ptr;                                                       \
112
0
      return XML_TOK_INVALID;                                                  \
113
0
    }                                                                          \
114
17.6M
    /* fall through */                                                         \
115
17.6M
  case BT_NMSTRT:                                                              \
116
17.6M
  case BT_HEX:                                                                 \
117
17.6M
    ptr += MINBPC(enc);                                                        \
118
17.6M
    break;                                                                     \
119
17.6M
    CHECK_NMSTRT_CASE(2, enc, ptr, end, nextTokPtr)                            \
120
57.2k
    CHECK_NMSTRT_CASE(3, enc, ptr, end, nextTokPtr)                            \
121
10.0k
    CHECK_NMSTRT_CASE(4, enc, ptr, end, nextTokPtr)
122
123
#  ifndef PREFIX
124
#    define PREFIX(ident) ident
125
#  endif
126
127
13.9G
#  define HAS_CHARS(enc, ptr, end, count) (end - ptr >= count * MINBPC(enc))
128
129
200M
#  define HAS_CHAR(enc, ptr, end) HAS_CHARS(enc, ptr, end, 1)
130
131
#  define REQUIRE_CHARS(enc, ptr, end, count)                                  \
132
34.1M
    {                                                                          \
133
34.1M
      if (! HAS_CHARS(enc, ptr, end, count)) {                                 \
134
825
        return XML_TOK_PARTIAL;                                                \
135
825
      }                                                                        \
136
34.1M
    }
137
138
34.1M
#  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.57k
                    const char **nextTokPtr) {
145
1.57k
  if (HAS_CHAR(enc, ptr, end)) {
146
1.55k
    if (! CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
147
16
      *nextTokPtr = ptr;
148
16
      return XML_TOK_INVALID;
149
16
    }
150
1.53k
    ptr += MINBPC(enc);
151
1.09M
    while (HAS_CHAR(enc, ptr, end)) {
152
1.09M
      switch (BYTE_TYPE(enc, ptr)) {
153
2.09M
        INVALID_CASES(ptr, nextTokPtr)
154
2.95k
      case BT_MINUS:
155
2.95k
        ptr += MINBPC(enc);
156
2.95k
        REQUIRE_CHAR(enc, ptr, end);
157
2.94k
        if (CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
158
1.35k
          ptr += MINBPC(enc);
159
1.35k
          REQUIRE_CHAR(enc, ptr, end);
160
1.34k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
161
34
            *nextTokPtr = ptr;
162
34
            return XML_TOK_INVALID;
163
34
          }
164
1.31k
          *nextTokPtr = ptr + MINBPC(enc);
165
1.31k
          return XML_TOK_COMMENT;
166
1.34k
        }
167
1.59k
        break;
168
45.1k
      default:
169
45.1k
        ptr += MINBPC(enc);
170
45.1k
        break;
171
1.09M
      }
172
1.09M
    }
173
1.53k
  }
174
147
  return XML_TOK_PARTIAL;
175
1.57k
}
xmltok.c:normal_scanComment
Line
Count
Source
144
1.57k
                    const char **nextTokPtr) {
145
1.57k
  if (HAS_CHAR(enc, ptr, end)) {
146
1.55k
    if (! CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
147
16
      *nextTokPtr = ptr;
148
16
      return XML_TOK_INVALID;
149
16
    }
150
1.53k
    ptr += MINBPC(enc);
151
1.09M
    while (HAS_CHAR(enc, ptr, end)) {
152
1.09M
      switch (BYTE_TYPE(enc, ptr)) {
153
2.09M
        INVALID_CASES(ptr, nextTokPtr)
154
2.95k
      case BT_MINUS:
155
2.95k
        ptr += MINBPC(enc);
156
2.95k
        REQUIRE_CHAR(enc, ptr, end);
157
2.94k
        if (CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
158
1.35k
          ptr += MINBPC(enc);
159
1.35k
          REQUIRE_CHAR(enc, ptr, end);
160
1.34k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
161
34
            *nextTokPtr = ptr;
162
34
            return XML_TOK_INVALID;
163
34
          }
164
1.31k
          *nextTokPtr = ptr + MINBPC(enc);
165
1.31k
          return XML_TOK_COMMENT;
166
1.34k
        }
167
1.59k
        break;
168
45.1k
      default:
169
45.1k
        ptr += MINBPC(enc);
170
45.1k
        break;
171
1.09M
      }
172
1.09M
    }
173
1.53k
  }
174
147
  return XML_TOK_PARTIAL;
175
1.57k
}
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
32.9k
                 const char **nextTokPtr) {
182
32.9k
  REQUIRE_CHAR(enc, ptr, end);
183
32.9k
  switch (BYTE_TYPE(enc, ptr)) {
184
1.04k
  case BT_MINUS:
185
1.04k
    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.04k
  case BT_NMSTRT:
190
31.8k
  case BT_HEX:
191
31.8k
    ptr += MINBPC(enc);
192
31.8k
    break;
193
4
  default:
194
4
    *nextTokPtr = ptr;
195
4
    return XML_TOK_INVALID;
196
32.9k
  }
197
219k
  while (HAS_CHAR(enc, ptr, end)) {
198
219k
    switch (BYTE_TYPE(enc, ptr)) {
199
34
    case BT_PERCNT:
200
34
      REQUIRE_CHARS(enc, ptr, end, 2);
201
      /* don't allow <!ENTITY% foo "whatever"> */
202
30
      switch (BYTE_TYPE(enc, ptr + MINBPC(enc))) {
203
1
      case BT_S:
204
3
      case BT_CR:
205
5
      case BT_LF:
206
9
      case BT_PERCNT:
207
9
        *nextTokPtr = ptr;
208
9
        return XML_TOK_INVALID;
209
30
      }
210
      /* fall through */
211
12.8k
    case BT_S:
212
25.4k
    case BT_CR:
213
31.7k
    case BT_LF:
214
31.7k
      *nextTokPtr = ptr;
215
31.7k
      return XML_TOK_DECL_OPEN;
216
169k
    case BT_NMSTRT:
217
187k
    case BT_HEX:
218
187k
      ptr += MINBPC(enc);
219
187k
      break;
220
23
    default:
221
23
      *nextTokPtr = ptr;
222
23
      return XML_TOK_INVALID;
223
219k
    }
224
219k
  }
225
114
  return XML_TOK_PARTIAL;
226
31.8k
}
xmltok.c:normal_scanDecl
Line
Count
Source
181
32.9k
                 const char **nextTokPtr) {
182
32.9k
  REQUIRE_CHAR(enc, ptr, end);
183
32.9k
  switch (BYTE_TYPE(enc, ptr)) {
184
1.04k
  case BT_MINUS:
185
1.04k
    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.04k
  case BT_NMSTRT:
190
31.8k
  case BT_HEX:
191
31.8k
    ptr += MINBPC(enc);
192
31.8k
    break;
193
4
  default:
194
4
    *nextTokPtr = ptr;
195
4
    return XML_TOK_INVALID;
196
32.9k
  }
197
219k
  while (HAS_CHAR(enc, ptr, end)) {
198
219k
    switch (BYTE_TYPE(enc, ptr)) {
199
34
    case BT_PERCNT:
200
34
      REQUIRE_CHARS(enc, ptr, end, 2);
201
      /* don't allow <!ENTITY% foo "whatever"> */
202
30
      switch (BYTE_TYPE(enc, ptr + MINBPC(enc))) {
203
1
      case BT_S:
204
3
      case BT_CR:
205
5
      case BT_LF:
206
9
      case BT_PERCNT:
207
9
        *nextTokPtr = ptr;
208
9
        return XML_TOK_INVALID;
209
30
      }
210
      /* fall through */
211
12.8k
    case BT_S:
212
25.4k
    case BT_CR:
213
31.7k
    case BT_LF:
214
31.7k
      *nextTokPtr = ptr;
215
31.7k
      return XML_TOK_DECL_OPEN;
216
169k
    case BT_NMSTRT:
217
187k
    case BT_HEX:
218
187k
      ptr += MINBPC(enc);
219
187k
      break;
220
23
    default:
221
23
      *nextTokPtr = ptr;
222
23
      return XML_TOK_INVALID;
223
219k
    }
224
219k
  }
225
114
  return XML_TOK_PARTIAL;
226
31.8k
}
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.5k
                      int *tokPtr) {
231
12.5k
  int upper = 0;
232
12.5k
  UNUSED_P(enc);
233
12.5k
  *tokPtr = XML_TOK_PI;
234
12.5k
  if (end - ptr != MINBPC(enc) * 3)
235
6.15k
    return 1;
236
6.39k
  switch (BYTE_TO_ASCII(enc, ptr)) {
237
3.27k
  case ASCII_x:
238
3.27k
    break;
239
2.23k
  case ASCII_X:
240
2.23k
    upper = 1;
241
2.23k
    break;
242
886
  default:
243
886
    return 1;
244
6.39k
  }
245
5.50k
  ptr += MINBPC(enc);
246
5.50k
  switch (BYTE_TO_ASCII(enc, ptr)) {
247
3.78k
  case ASCII_m:
248
3.78k
    break;
249
776
  case ASCII_M:
250
776
    upper = 1;
251
776
    break;
252
942
  default:
253
942
    return 1;
254
5.50k
  }
255
4.56k
  ptr += MINBPC(enc);
256
4.56k
  switch (BYTE_TO_ASCII(enc, ptr)) {
257
2.16k
  case ASCII_l:
258
2.16k
    break;
259
3
  case ASCII_L:
260
3
    upper = 1;
261
3
    break;
262
2.40k
  default:
263
2.40k
    return 1;
264
4.56k
  }
265
2.16k
  if (upper)
266
6
    return 0;
267
2.15k
  *tokPtr = XML_TOK_XML_DECL;
268
2.15k
  return 1;
269
2.16k
}
xmltok.c:normal_checkPiTarget
Line
Count
Source
230
12.5k
                      int *tokPtr) {
231
12.5k
  int upper = 0;
232
12.5k
  UNUSED_P(enc);
233
12.5k
  *tokPtr = XML_TOK_PI;
234
12.5k
  if (end - ptr != MINBPC(enc) * 3)
235
6.15k
    return 1;
236
6.39k
  switch (BYTE_TO_ASCII(enc, ptr)) {
237
3.27k
  case ASCII_x:
238
3.27k
    break;
239
2.23k
  case ASCII_X:
240
2.23k
    upper = 1;
241
2.23k
    break;
242
886
  default:
243
886
    return 1;
244
6.39k
  }
245
5.50k
  ptr += MINBPC(enc);
246
5.50k
  switch (BYTE_TO_ASCII(enc, ptr)) {
247
3.78k
  case ASCII_m:
248
3.78k
    break;
249
776
  case ASCII_M:
250
776
    upper = 1;
251
776
    break;
252
942
  default:
253
942
    return 1;
254
5.50k
  }
255
4.56k
  ptr += MINBPC(enc);
256
4.56k
  switch (BYTE_TO_ASCII(enc, ptr)) {
257
2.16k
  case ASCII_l:
258
2.16k
    break;
259
3
  case ASCII_L:
260
3
    upper = 1;
261
3
    break;
262
2.40k
  default:
263
2.40k
    return 1;
264
4.56k
  }
265
2.16k
  if (upper)
266
6
    return 0;
267
2.15k
  *tokPtr = XML_TOK_XML_DECL;
268
2.15k
  return 1;
269
2.16k
}
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.8k
               const char **nextTokPtr) {
276
12.8k
  int tok;
277
12.8k
  const char *target = ptr;
278
12.8k
  REQUIRE_CHAR(enc, ptr, end);
279
12.8k
  switch (BYTE_TYPE(enc, ptr)) {
280
13.0k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
281
6
  default:
282
6
    *nextTokPtr = ptr;
283
6
    return XML_TOK_INVALID;
284
12.8k
  }
285
618k
  while (HAS_CHAR(enc, ptr, end)) {
286
618k
    switch (BYTE_TYPE(enc, ptr)) {
287
1.33M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
288
3.34k
    case BT_S:
289
3.95k
    case BT_CR:
290
6.52k
    case BT_LF:
291
6.52k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
292
3
        *nextTokPtr = ptr;
293
3
        return XML_TOK_INVALID;
294
3
      }
295
6.52k
      ptr += MINBPC(enc);
296
5.96M
      while (HAS_CHAR(enc, ptr, end)) {
297
5.96M
        switch (BYTE_TYPE(enc, ptr)) {
298
11.1M
          INVALID_CASES(ptr, nextTokPtr)
299
8.83k
        case BT_QUEST:
300
8.83k
          ptr += MINBPC(enc);
301
8.83k
          REQUIRE_CHAR(enc, ptr, end);
302
8.82k
          if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
303
6.28k
            *nextTokPtr = ptr + MINBPC(enc);
304
6.28k
            return tok;
305
6.28k
          }
306
2.53k
          break;
307
402k
        default:
308
402k
          ptr += MINBPC(enc);
309
402k
          break;
310
5.96M
        }
311
5.96M
      }
312
186
      return XML_TOK_PARTIAL;
313
6.02k
    case BT_QUEST:
314
6.02k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
315
3
        *nextTokPtr = ptr;
316
3
        return XML_TOK_INVALID;
317
3
      }
318
6.01k
      ptr += MINBPC(enc);
319
6.01k
      REQUIRE_CHAR(enc, ptr, end);
320
5.96k
      if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
321
5.92k
        *nextTokPtr = ptr + MINBPC(enc);
322
5.92k
        return tok;
323
5.92k
      }
324
      /* fall through */
325
73
    default:
326
73
      *nextTokPtr = ptr;
327
73
      return XML_TOK_INVALID;
328
618k
    }
329
618k
  }
330
122
  return XML_TOK_PARTIAL;
331
12.7k
}
xmltok.c:normal_scanPi
Line
Count
Source
275
12.8k
               const char **nextTokPtr) {
276
12.8k
  int tok;
277
12.8k
  const char *target = ptr;
278
12.8k
  REQUIRE_CHAR(enc, ptr, end);
279
12.8k
  switch (BYTE_TYPE(enc, ptr)) {
280
13.0k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
281
6
  default:
282
6
    *nextTokPtr = ptr;
283
6
    return XML_TOK_INVALID;
284
12.8k
  }
285
618k
  while (HAS_CHAR(enc, ptr, end)) {
286
618k
    switch (BYTE_TYPE(enc, ptr)) {
287
1.33M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
288
3.34k
    case BT_S:
289
3.95k
    case BT_CR:
290
6.52k
    case BT_LF:
291
6.52k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
292
3
        *nextTokPtr = ptr;
293
3
        return XML_TOK_INVALID;
294
3
      }
295
6.52k
      ptr += MINBPC(enc);
296
5.96M
      while (HAS_CHAR(enc, ptr, end)) {
297
5.96M
        switch (BYTE_TYPE(enc, ptr)) {
298
11.1M
          INVALID_CASES(ptr, nextTokPtr)
299
8.83k
        case BT_QUEST:
300
8.83k
          ptr += MINBPC(enc);
301
8.83k
          REQUIRE_CHAR(enc, ptr, end);
302
8.82k
          if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
303
6.28k
            *nextTokPtr = ptr + MINBPC(enc);
304
6.28k
            return tok;
305
6.28k
          }
306
2.53k
          break;
307
402k
        default:
308
402k
          ptr += MINBPC(enc);
309
402k
          break;
310
5.96M
        }
311
5.96M
      }
312
186
      return XML_TOK_PARTIAL;
313
6.02k
    case BT_QUEST:
314
6.02k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
315
3
        *nextTokPtr = ptr;
316
3
        return XML_TOK_INVALID;
317
3
      }
318
6.01k
      ptr += MINBPC(enc);
319
6.01k
      REQUIRE_CHAR(enc, ptr, end);
320
5.96k
      if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
321
5.92k
        *nextTokPtr = ptr + MINBPC(enc);
322
5.92k
        return tok;
323
5.92k
      }
324
      /* fall through */
325
73
    default:
326
73
      *nextTokPtr = ptr;
327
73
      return XML_TOK_INVALID;
328
618k
    }
329
618k
  }
330
122
  return XML_TOK_PARTIAL;
331
12.7k
}
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
1.07k
                         const char **nextTokPtr) {
336
1.07k
  static const char CDATA_LSQB[]
337
1.07k
      = {ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, ASCII_LSQB};
338
1.07k
  int i;
339
1.07k
  UNUSED_P(enc);
340
  /* CDATA[ */
341
1.07k
  REQUIRE_CHARS(enc, ptr, end, 6);
342
7.19k
  for (i = 0; i < 6; i++, ptr += MINBPC(enc)) {
343
6.20k
    if (! CHAR_MATCHES(enc, ptr, CDATA_LSQB[i])) {
344
62
      *nextTokPtr = ptr;
345
62
      return XML_TOK_INVALID;
346
62
    }
347
6.20k
  }
348
998
  *nextTokPtr = ptr;
349
998
  return XML_TOK_CDATA_SECT_OPEN;
350
1.06k
}
xmltok.c:normal_scanCdataSection
Line
Count
Source
335
1.07k
                         const char **nextTokPtr) {
336
1.07k
  static const char CDATA_LSQB[]
337
1.07k
      = {ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, ASCII_LSQB};
338
1.07k
  int i;
339
1.07k
  UNUSED_P(enc);
340
  /* CDATA[ */
341
1.07k
  REQUIRE_CHARS(enc, ptr, end, 6);
342
7.19k
  for (i = 0; i < 6; i++, ptr += MINBPC(enc)) {
343
6.20k
    if (! CHAR_MATCHES(enc, ptr, CDATA_LSQB[i])) {
344
62
      *nextTokPtr = ptr;
345
62
      return XML_TOK_INVALID;
346
62
    }
347
6.20k
  }
348
998
  *nextTokPtr = ptr;
349
998
  return XML_TOK_CDATA_SECT_OPEN;
350
1.06k
}
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
40.0k
                        const char **nextTokPtr) {
355
40.0k
  if (ptr >= end)
356
308
    return XML_TOK_NONE;
357
39.6k
  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
39.6k
  switch (BYTE_TYPE(enc, ptr)) {
367
8.50k
  case BT_RSQB:
368
8.50k
    ptr += MINBPC(enc);
369
8.50k
    REQUIRE_CHAR(enc, ptr, end);
370
8.49k
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
371
3.00k
      break;
372
5.49k
    ptr += MINBPC(enc);
373
5.49k
    REQUIRE_CHAR(enc, ptr, end);
374
5.48k
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
375
4.77k
      ptr -= MINBPC(enc);
376
4.77k
      break;
377
4.77k
    }
378
715
    *nextTokPtr = ptr + MINBPC(enc);
379
715
    return XML_TOK_CDATA_SECT_CLOSE;
380
840
  case BT_CR:
381
840
    ptr += MINBPC(enc);
382
840
    REQUIRE_CHAR(enc, ptr, end);
383
818
    if (BYTE_TYPE(enc, ptr) == BT_LF)
384
196
      ptr += MINBPC(enc);
385
818
    *nextTokPtr = ptr;
386
818
    return XML_TOK_DATA_NEWLINE;
387
20.6k
  case BT_LF:
388
20.6k
    *nextTokPtr = ptr + MINBPC(enc);
389
20.6k
    return XML_TOK_DATA_NEWLINE;
390
20.6k
    INVALID_CASES(ptr, nextTokPtr)
391
4.66k
  default:
392
4.66k
    ptr += MINBPC(enc);
393
4.66k
    break;
394
39.6k
  }
395
4.34M
  while (HAS_CHAR(enc, ptr, end)) {
396
4.34M
    switch (BYTE_TYPE(enc, ptr)) {
397
0
#  define LEAD_CASE(n)                                                         \
398
3.97M
  case BT_LEAD##n:                                                             \
399
3.97M
    if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) {                       \
400
38
      *nextTokPtr = ptr;                                                       \
401
38
      return XML_TOK_DATA_CHARS;                                               \
402
38
    }                                                                          \
403
3.97M
    ptr += n;                                                                  \
404
3.97M
    break;
405
3.97M
      LEAD_CASE(2)
406
2.50k
      LEAD_CASE(3)
407
2.85k
      LEAD_CASE(4)
408
0
#  undef LEAD_CASE
409
5
    case BT_NONXML:
410
11
    case BT_MALFORM:
411
22
    case BT_TRAIL:
412
407
    case BT_CR:
413
9.07k
    case BT_LF:
414
17.1k
    case BT_RSQB:
415
17.1k
      *nextTokPtr = ptr;
416
17.1k
      return XML_TOK_DATA_CHARS;
417
352k
    default:
418
352k
      ptr += MINBPC(enc);
419
352k
      break;
420
4.34M
    }
421
4.34M
  }
422
145
  *nextTokPtr = ptr;
423
145
  return XML_TOK_DATA_CHARS;
424
17.3k
}
xmltok.c:normal_cdataSectionTok
Line
Count
Source
354
40.0k
                        const char **nextTokPtr) {
355
40.0k
  if (ptr >= end)
356
308
    return XML_TOK_NONE;
357
39.6k
  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
39.6k
  switch (BYTE_TYPE(enc, ptr)) {
367
8.50k
  case BT_RSQB:
368
8.50k
    ptr += MINBPC(enc);
369
8.50k
    REQUIRE_CHAR(enc, ptr, end);
370
8.49k
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
371
3.00k
      break;
372
5.49k
    ptr += MINBPC(enc);
373
5.49k
    REQUIRE_CHAR(enc, ptr, end);
374
5.48k
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
375
4.77k
      ptr -= MINBPC(enc);
376
4.77k
      break;
377
4.77k
    }
378
715
    *nextTokPtr = ptr + MINBPC(enc);
379
715
    return XML_TOK_CDATA_SECT_CLOSE;
380
840
  case BT_CR:
381
840
    ptr += MINBPC(enc);
382
840
    REQUIRE_CHAR(enc, ptr, end);
383
818
    if (BYTE_TYPE(enc, ptr) == BT_LF)
384
196
      ptr += MINBPC(enc);
385
818
    *nextTokPtr = ptr;
386
818
    return XML_TOK_DATA_NEWLINE;
387
20.6k
  case BT_LF:
388
20.6k
    *nextTokPtr = ptr + MINBPC(enc);
389
20.6k
    return XML_TOK_DATA_NEWLINE;
390
20.6k
    INVALID_CASES(ptr, nextTokPtr)
391
4.66k
  default:
392
4.66k
    ptr += MINBPC(enc);
393
4.66k
    break;
394
39.6k
  }
395
4.34M
  while (HAS_CHAR(enc, ptr, end)) {
396
4.34M
    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
3.97M
      LEAD_CASE(2)
406
2.50k
      LEAD_CASE(3)
407
2.85k
      LEAD_CASE(4)
408
0
#  undef LEAD_CASE
409
5
    case BT_NONXML:
410
11
    case BT_MALFORM:
411
22
    case BT_TRAIL:
412
407
    case BT_CR:
413
9.07k
    case BT_LF:
414
17.1k
    case BT_RSQB:
415
17.1k
      *nextTokPtr = ptr;
416
17.1k
      return XML_TOK_DATA_CHARS;
417
352k
    default:
418
352k
      ptr += MINBPC(enc);
419
352k
      break;
420
4.34M
    }
421
4.34M
  }
422
145
  *nextTokPtr = ptr;
423
145
  return XML_TOK_DATA_CHARS;
424
17.3k
}
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
94.4k
                   const char **nextTokPtr) {
431
94.4k
  REQUIRE_CHAR(enc, ptr, end);
432
94.4k
  switch (BYTE_TYPE(enc, ptr)) {
433
3.95k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
434
1
  default:
435
1
    *nextTokPtr = ptr;
436
1
    return XML_TOK_INVALID;
437
94.4k
  }
438
2.43M
  while (HAS_CHAR(enc, ptr, end)) {
439
2.43M
    switch (BYTE_TYPE(enc, ptr)) {
440
4.68M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
441
664
    case BT_S:
442
891
    case BT_CR:
443
1.45k
    case BT_LF:
444
2.33k
      for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
445
2.33k
        switch (BYTE_TYPE(enc, ptr)) {
446
521
        case BT_S:
447
753
        case BT_CR:
448
957
        case BT_LF:
449
957
          break;
450
1.36k
        case BT_GT:
451
1.36k
          *nextTokPtr = ptr + MINBPC(enc);
452
1.36k
          return XML_TOK_END_TAG;
453
15
        default:
454
15
          *nextTokPtr = ptr;
455
15
          return XML_TOK_INVALID;
456
2.33k
        }
457
2.33k
      }
458
76
      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
92.7k
    case BT_GT:
467
92.7k
      *nextTokPtr = ptr + MINBPC(enc);
468
92.7k
      return XML_TOK_END_TAG;
469
37
    default:
470
37
      *nextTokPtr = ptr;
471
37
      return XML_TOK_INVALID;
472
2.43M
    }
473
2.43M
  }
474
123
  return XML_TOK_PARTIAL;
475
94.4k
}
xmltok.c:normal_scanEndTag
Line
Count
Source
430
94.4k
                   const char **nextTokPtr) {
431
94.4k
  REQUIRE_CHAR(enc, ptr, end);
432
94.4k
  switch (BYTE_TYPE(enc, ptr)) {
433
3.95k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
434
1
  default:
435
1
    *nextTokPtr = ptr;
436
1
    return XML_TOK_INVALID;
437
94.4k
  }
438
2.43M
  while (HAS_CHAR(enc, ptr, end)) {
439
2.43M
    switch (BYTE_TYPE(enc, ptr)) {
440
4.68M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
441
664
    case BT_S:
442
891
    case BT_CR:
443
1.45k
    case BT_LF:
444
2.33k
      for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
445
2.33k
        switch (BYTE_TYPE(enc, ptr)) {
446
521
        case BT_S:
447
753
        case BT_CR:
448
957
        case BT_LF:
449
957
          break;
450
1.36k
        case BT_GT:
451
1.36k
          *nextTokPtr = ptr + MINBPC(enc);
452
1.36k
          return XML_TOK_END_TAG;
453
15
        default:
454
15
          *nextTokPtr = ptr;
455
15
          return XML_TOK_INVALID;
456
2.33k
        }
457
2.33k
      }
458
76
      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
92.7k
    case BT_GT:
467
92.7k
      *nextTokPtr = ptr + MINBPC(enc);
468
92.7k
      return XML_TOK_END_TAG;
469
37
    default:
470
37
      *nextTokPtr = ptr;
471
37
      return XML_TOK_INVALID;
472
2.43M
    }
473
2.43M
  }
474
123
  return XML_TOK_PARTIAL;
475
94.4k
}
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
49.1k
                       const char **nextTokPtr) {
482
49.1k
  if (HAS_CHAR(enc, ptr, end)) {
483
49.1k
    switch (BYTE_TYPE(enc, ptr)) {
484
24.6k
    case BT_DIGIT:
485
49.0k
    case BT_HEX:
486
49.0k
      break;
487
9
    default:
488
9
      *nextTokPtr = ptr;
489
9
      return XML_TOK_INVALID;
490
49.1k
    }
491
217k
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
492
217k
      switch (BYTE_TYPE(enc, ptr)) {
493
56.8k
      case BT_DIGIT:
494
168k
      case BT_HEX:
495
168k
        break;
496
49.0k
      case BT_SEMI:
497
49.0k
        *nextTokPtr = ptr + MINBPC(enc);
498
49.0k
        return XML_TOK_CHAR_REF;
499
12
      default:
500
12
        *nextTokPtr = ptr;
501
12
        return XML_TOK_INVALID;
502
217k
      }
503
217k
    }
504
49.0k
  }
505
43
  return XML_TOK_PARTIAL;
506
49.1k
}
xmltok.c:normal_scanHexCharRef
Line
Count
Source
481
49.1k
                       const char **nextTokPtr) {
482
49.1k
  if (HAS_CHAR(enc, ptr, end)) {
483
49.1k
    switch (BYTE_TYPE(enc, ptr)) {
484
24.6k
    case BT_DIGIT:
485
49.0k
    case BT_HEX:
486
49.0k
      break;
487
9
    default:
488
9
      *nextTokPtr = ptr;
489
9
      return XML_TOK_INVALID;
490
49.1k
    }
491
217k
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
492
217k
      switch (BYTE_TYPE(enc, ptr)) {
493
56.8k
      case BT_DIGIT:
494
168k
      case BT_HEX:
495
168k
        break;
496
49.0k
      case BT_SEMI:
497
49.0k
        *nextTokPtr = ptr + MINBPC(enc);
498
49.0k
        return XML_TOK_CHAR_REF;
499
12
      default:
500
12
        *nextTokPtr = ptr;
501
12
        return XML_TOK_INVALID;
502
217k
      }
503
217k
    }
504
49.0k
  }
505
43
  return XML_TOK_PARTIAL;
506
49.1k
}
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
158k
                    const char **nextTokPtr) {
513
158k
  if (HAS_CHAR(enc, ptr, end)) {
514
158k
    if (CHAR_MATCHES(enc, ptr, ASCII_x))
515
49.1k
      return PREFIX(scanHexCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
516
109k
    switch (BYTE_TYPE(enc, ptr)) {
517
109k
    case BT_DIGIT:
518
109k
      break;
519
15
    default:
520
15
      *nextTokPtr = ptr;
521
15
      return XML_TOK_INVALID;
522
109k
    }
523
512k
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
524
512k
      switch (BYTE_TYPE(enc, ptr)) {
525
402k
      case BT_DIGIT:
526
402k
        break;
527
109k
      case BT_SEMI:
528
109k
        *nextTokPtr = ptr + MINBPC(enc);
529
109k
        return XML_TOK_CHAR_REF;
530
4
      default:
531
4
        *nextTokPtr = ptr;
532
4
        return XML_TOK_INVALID;
533
512k
      }
534
512k
    }
535
109k
  }
536
19
  return XML_TOK_PARTIAL;
537
158k
}
xmltok.c:normal_scanCharRef
Line
Count
Source
512
158k
                    const char **nextTokPtr) {
513
158k
  if (HAS_CHAR(enc, ptr, end)) {
514
158k
    if (CHAR_MATCHES(enc, ptr, ASCII_x))
515
49.1k
      return PREFIX(scanHexCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
516
109k
    switch (BYTE_TYPE(enc, ptr)) {
517
109k
    case BT_DIGIT:
518
109k
      break;
519
15
    default:
520
15
      *nextTokPtr = ptr;
521
15
      return XML_TOK_INVALID;
522
109k
    }
523
512k
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
524
512k
      switch (BYTE_TYPE(enc, ptr)) {
525
402k
      case BT_DIGIT:
526
402k
        break;
527
109k
      case BT_SEMI:
528
109k
        *nextTokPtr = ptr + MINBPC(enc);
529
109k
        return XML_TOK_CHAR_REF;
530
4
      default:
531
4
        *nextTokPtr = ptr;
532
4
        return XML_TOK_INVALID;
533
512k
      }
534
512k
    }
535
109k
  }
536
19
  return XML_TOK_PARTIAL;
537
158k
}
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
13.3M
                const char **nextTokPtr) {
544
13.3M
  REQUIRE_CHAR(enc, ptr, end);
545
13.3M
  switch (BYTE_TYPE(enc, ptr)) {
546
12.5M
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
547
158k
  case BT_NUM:
548
158k
    return PREFIX(scanCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
549
47
  default:
550
47
    *nextTokPtr = ptr;
551
47
    return XML_TOK_INVALID;
552
13.3M
  }
553
76.7M
  while (HAS_CHAR(enc, ptr, end)) {
554
76.7M
    switch (BYTE_TYPE(enc, ptr)) {
555
215M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
556
13.1M
    case BT_SEMI:
557
13.1M
      *nextTokPtr = ptr + MINBPC(enc);
558
13.1M
      return XML_TOK_ENTITY_REF;
559
35
    default:
560
35
      *nextTokPtr = ptr;
561
35
      return XML_TOK_INVALID;
562
76.7M
    }
563
76.7M
  }
564
174
  return XML_TOK_PARTIAL;
565
13.1M
}
xmltok.c:normal_scanRef
Line
Count
Source
543
13.3M
                const char **nextTokPtr) {
544
13.3M
  REQUIRE_CHAR(enc, ptr, end);
545
13.3M
  switch (BYTE_TYPE(enc, ptr)) {
546
12.5M
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
547
158k
  case BT_NUM:
548
158k
    return PREFIX(scanCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
549
47
  default:
550
47
    *nextTokPtr = ptr;
551
47
    return XML_TOK_INVALID;
552
13.3M
  }
553
76.7M
  while (HAS_CHAR(enc, ptr, end)) {
554
76.7M
    switch (BYTE_TYPE(enc, ptr)) {
555
215M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
556
13.1M
    case BT_SEMI:
557
13.1M
      *nextTokPtr = ptr + MINBPC(enc);
558
13.1M
      return XML_TOK_ENTITY_REF;
559
35
    default:
560
35
      *nextTokPtr = ptr;
561
35
      return XML_TOK_INVALID;
562
76.7M
    }
563
76.7M
  }
564
174
  return XML_TOK_PARTIAL;
565
13.1M
}
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
61.9k
                 const char **nextTokPtr) {
572
#  ifdef XML_NS
573
  int hadColon = 0;
574
#  endif
575
2.15M
  while (HAS_CHAR(enc, ptr, end)) {
576
2.15M
    switch (BYTE_TYPE(enc, ptr)) {
577
1.32M
      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
1.25k
    case BT_S:
596
1.58k
    case BT_CR:
597
4.00k
    case BT_LF:
598
5.26k
      for (;;) {
599
5.26k
        int t;
600
601
5.26k
        ptr += MINBPC(enc);
602
5.26k
        REQUIRE_CHAR(enc, ptr, end);
603
5.18k
        t = BYTE_TYPE(enc, ptr);
604
5.18k
        if (t == BT_EQUALS)
605
3.90k
          break;
606
1.27k
        switch (t) {
607
565
        case BT_S:
608
987
        case BT_LF:
609
1.25k
        case BT_CR:
610
1.25k
          break;
611
23
        default:
612
23
          *nextTokPtr = ptr;
613
23
          return XML_TOK_INVALID;
614
1.27k
        }
615
1.27k
      }
616
      /* fall through */
617
1.71M
    case BT_EQUALS: {
618
1.71M
      int open;
619
#  ifdef XML_NS
620
      hadColon = 0;
621
#  endif
622
1.71M
      for (;;) {
623
1.71M
        ptr += MINBPC(enc);
624
1.71M
        REQUIRE_CHAR(enc, ptr, end);
625
1.71M
        open = BYTE_TYPE(enc, ptr);
626
1.71M
        if (open == BT_QUOT || open == BT_APOS)
627
1.71M
          break;
628
1.95k
        switch (open) {
629
1.04k
        case BT_S:
630
1.60k
        case BT_LF:
631
1.93k
        case BT_CR:
632
1.93k
          break;
633
21
        default:
634
21
          *nextTokPtr = ptr;
635
21
          return XML_TOK_INVALID;
636
1.95k
        }
637
1.95k
      }
638
1.71M
      ptr += MINBPC(enc);
639
      /* in attribute value */
640
12.4M
      for (;;) {
641
12.4M
        int t;
642
12.4M
        REQUIRE_CHAR(enc, ptr, end);
643
12.4M
        t = BYTE_TYPE(enc, ptr);
644
12.4M
        if (t == open)
645
1.71M
          break;
646
10.7M
        switch (t) {
647
19.3M
          INVALID_CASES(ptr, nextTokPtr)
648
246k
        case BT_AMP: {
649
246k
          int tok = PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, &ptr);
650
246k
          if (tok <= 0) {
651
42
            if (tok == XML_TOK_INVALID)
652
15
              *nextTokPtr = ptr;
653
42
            return tok;
654
42
          }
655
246k
          break;
656
246k
        }
657
246k
        case BT_LT:
658
24
          *nextTokPtr = ptr;
659
24
          return XML_TOK_INVALID;
660
851k
        default:
661
851k
          ptr += MINBPC(enc);
662
851k
          break;
663
10.7M
        }
664
10.7M
      }
665
1.71M
      ptr += MINBPC(enc);
666
1.71M
      REQUIRE_CHAR(enc, ptr, end);
667
1.71M
      switch (BYTE_TYPE(enc, ptr)) {
668
830k
      case BT_S:
669
1.59M
      case BT_CR:
670
1.65M
      case BT_LF:
671
1.65M
        break;
672
9.22k
      case BT_SOL:
673
9.22k
        goto sol;
674
49.2k
      case BT_GT:
675
49.2k
        goto gt;
676
18
      default:
677
18
        *nextTokPtr = ptr;
678
18
        return XML_TOK_INVALID;
679
1.71M
      }
680
      /* ptr points to closing quote */
681
1.77M
      for (;;) {
682
1.77M
        ptr += MINBPC(enc);
683
1.77M
        REQUIRE_CHAR(enc, ptr, end);
684
1.77M
        switch (BYTE_TYPE(enc, ptr)) {
685
1.70M
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
686
77.3k
        case BT_S:
687
102k
        case BT_CR:
688
120k
        case BT_LF:
689
120k
          continue;
690
745
        case BT_GT:
691
49.9k
        gt:
692
49.9k
          *nextTokPtr = ptr + MINBPC(enc);
693
49.9k
          return XML_TOK_START_TAG_WITH_ATTS;
694
1.92k
        case BT_SOL:
695
11.1k
        sol:
696
11.1k
          ptr += MINBPC(enc);
697
11.1k
          REQUIRE_CHAR(enc, ptr, end);
698
11.1k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
699
13
            *nextTokPtr = ptr;
700
13
            return XML_TOK_INVALID;
701
13
          }
702
11.1k
          *nextTokPtr = ptr + MINBPC(enc);
703
11.1k
          return XML_TOK_EMPTY_ELEMENT_WITH_ATTS;
704
7
        default:
705
7
          *nextTokPtr = ptr;
706
7
          return XML_TOK_INVALID;
707
1.77M
        }
708
1.65M
        break;
709
1.77M
      }
710
1.65M
      break;
711
1.65M
    }
712
1.65M
    default:
713
70
      *nextTokPtr = ptr;
714
70
      return XML_TOK_INVALID;
715
2.15M
    }
716
2.15M
  }
717
181
  return XML_TOK_PARTIAL;
718
61.9k
}
xmltok.c:normal_scanAtts
Line
Count
Source
571
61.9k
                 const char **nextTokPtr) {
572
#  ifdef XML_NS
573
  int hadColon = 0;
574
#  endif
575
2.15M
  while (HAS_CHAR(enc, ptr, end)) {
576
2.15M
    switch (BYTE_TYPE(enc, ptr)) {
577
1.32M
      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
1.25k
    case BT_S:
596
1.58k
    case BT_CR:
597
4.00k
    case BT_LF:
598
5.26k
      for (;;) {
599
5.26k
        int t;
600
601
5.26k
        ptr += MINBPC(enc);
602
5.26k
        REQUIRE_CHAR(enc, ptr, end);
603
5.18k
        t = BYTE_TYPE(enc, ptr);
604
5.18k
        if (t == BT_EQUALS)
605
3.90k
          break;
606
1.27k
        switch (t) {
607
565
        case BT_S:
608
987
        case BT_LF:
609
1.25k
        case BT_CR:
610
1.25k
          break;
611
23
        default:
612
23
          *nextTokPtr = ptr;
613
23
          return XML_TOK_INVALID;
614
1.27k
        }
615
1.27k
      }
616
      /* fall through */
617
1.71M
    case BT_EQUALS: {
618
1.71M
      int open;
619
#  ifdef XML_NS
620
      hadColon = 0;
621
#  endif
622
1.71M
      for (;;) {
623
1.71M
        ptr += MINBPC(enc);
624
1.71M
        REQUIRE_CHAR(enc, ptr, end);
625
1.71M
        open = BYTE_TYPE(enc, ptr);
626
1.71M
        if (open == BT_QUOT || open == BT_APOS)
627
1.71M
          break;
628
1.95k
        switch (open) {
629
1.04k
        case BT_S:
630
1.60k
        case BT_LF:
631
1.93k
        case BT_CR:
632
1.93k
          break;
633
21
        default:
634
21
          *nextTokPtr = ptr;
635
21
          return XML_TOK_INVALID;
636
1.95k
        }
637
1.95k
      }
638
1.71M
      ptr += MINBPC(enc);
639
      /* in attribute value */
640
12.4M
      for (;;) {
641
12.4M
        int t;
642
12.4M
        REQUIRE_CHAR(enc, ptr, end);
643
12.4M
        t = BYTE_TYPE(enc, ptr);
644
12.4M
        if (t == open)
645
1.71M
          break;
646
10.7M
        switch (t) {
647
19.3M
          INVALID_CASES(ptr, nextTokPtr)
648
246k
        case BT_AMP: {
649
246k
          int tok = PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, &ptr);
650
246k
          if (tok <= 0) {
651
42
            if (tok == XML_TOK_INVALID)
652
15
              *nextTokPtr = ptr;
653
42
            return tok;
654
42
          }
655
246k
          break;
656
246k
        }
657
246k
        case BT_LT:
658
24
          *nextTokPtr = ptr;
659
24
          return XML_TOK_INVALID;
660
851k
        default:
661
851k
          ptr += MINBPC(enc);
662
851k
          break;
663
10.7M
        }
664
10.7M
      }
665
1.71M
      ptr += MINBPC(enc);
666
1.71M
      REQUIRE_CHAR(enc, ptr, end);
667
1.71M
      switch (BYTE_TYPE(enc, ptr)) {
668
830k
      case BT_S:
669
1.59M
      case BT_CR:
670
1.65M
      case BT_LF:
671
1.65M
        break;
672
9.22k
      case BT_SOL:
673
9.22k
        goto sol;
674
49.2k
      case BT_GT:
675
49.2k
        goto gt;
676
18
      default:
677
18
        *nextTokPtr = ptr;
678
18
        return XML_TOK_INVALID;
679
1.71M
      }
680
      /* ptr points to closing quote */
681
1.77M
      for (;;) {
682
1.77M
        ptr += MINBPC(enc);
683
1.77M
        REQUIRE_CHAR(enc, ptr, end);
684
1.77M
        switch (BYTE_TYPE(enc, ptr)) {
685
1.70M
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
686
77.3k
        case BT_S:
687
102k
        case BT_CR:
688
120k
        case BT_LF:
689
120k
          continue;
690
745
        case BT_GT:
691
49.9k
        gt:
692
49.9k
          *nextTokPtr = ptr + MINBPC(enc);
693
49.9k
          return XML_TOK_START_TAG_WITH_ATTS;
694
1.92k
        case BT_SOL:
695
11.1k
        sol:
696
11.1k
          ptr += MINBPC(enc);
697
11.1k
          REQUIRE_CHAR(enc, ptr, end);
698
11.1k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
699
13
            *nextTokPtr = ptr;
700
13
            return XML_TOK_INVALID;
701
13
          }
702
11.1k
          *nextTokPtr = ptr + MINBPC(enc);
703
11.1k
          return XML_TOK_EMPTY_ELEMENT_WITH_ATTS;
704
7
        default:
705
7
          *nextTokPtr = ptr;
706
7
          return XML_TOK_INVALID;
707
1.77M
        }
708
1.65M
        break;
709
1.77M
      }
710
1.65M
      break;
711
1.65M
    }
712
1.65M
    default:
713
70
      *nextTokPtr = ptr;
714
70
      return XML_TOK_INVALID;
715
2.15M
    }
716
2.15M
  }
717
181
  return XML_TOK_PARTIAL;
718
61.9k
}
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
2.82M
               const char **nextTokPtr) {
725
#  ifdef XML_NS
726
  int hadColon;
727
#  endif
728
2.82M
  REQUIRE_CHAR(enc, ptr, end);
729
2.82M
  switch (BYTE_TYPE(enc, ptr)) {
730
1.96M
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
731
1.61k
  case BT_EXCL:
732
1.61k
    ptr += MINBPC(enc);
733
1.61k
    REQUIRE_CHAR(enc, ptr, end);
734
1.61k
    switch (BYTE_TYPE(enc, ptr)) {
735
528
    case BT_MINUS:
736
528
      return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
737
1.07k
    case BT_LSQB:
738
1.07k
      return PREFIX(scanCdataSection)(enc, ptr + MINBPC(enc), end, nextTokPtr);
739
1.61k
    }
740
14
    *nextTokPtr = ptr;
741
14
    return XML_TOK_INVALID;
742
7.72k
  case BT_QUEST:
743
7.72k
    return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
744
94.4k
  case BT_SOL:
745
94.4k
    return PREFIX(scanEndTag)(enc, ptr + MINBPC(enc), end, nextTokPtr);
746
33
  default:
747
33
    *nextTokPtr = ptr;
748
33
    return XML_TOK_INVALID;
749
2.82M
  }
750
#  ifdef XML_NS
751
  hadColon = 0;
752
#  endif
753
  /* we have a start-tag */
754
11.5M
  while (HAS_CHAR(enc, ptr, end)) {
755
11.5M
    switch (BYTE_TYPE(enc, ptr)) {
756
25.6M
      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
60.4k
    case BT_S:
775
62.1k
    case BT_CR:
776
67.4k
    case BT_LF: {
777
67.4k
      ptr += MINBPC(enc);
778
74.9k
      while (HAS_CHAR(enc, ptr, end)) {
779
74.9k
        switch (BYTE_TYPE(enc, ptr)) {
780
65.1k
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
781
1.52k
        case BT_GT:
782
1.52k
          goto gt;
783
3.75k
        case BT_SOL:
784
3.75k
          goto sol;
785
3.50k
        case BT_S:
786
6.99k
        case BT_CR:
787
7.59k
        case BT_LF:
788
7.59k
          ptr += MINBPC(enc);
789
7.59k
          continue;
790
11
        default:
791
11
          *nextTokPtr = ptr;
792
11
          return XML_TOK_INVALID;
793
74.9k
        }
794
61.9k
        return PREFIX(scanAtts)(enc, ptr, end, nextTokPtr);
795
74.9k
      }
796
84
      return XML_TOK_PARTIAL;
797
67.4k
    }
798
2.64M
    case BT_GT:
799
2.64M
    gt:
800
2.64M
      *nextTokPtr = ptr + MINBPC(enc);
801
2.64M
      return XML_TOK_START_TAG_NO_ATTS;
802
2.57k
    case BT_SOL:
803
6.33k
    sol:
804
6.33k
      ptr += MINBPC(enc);
805
6.33k
      REQUIRE_CHAR(enc, ptr, end);
806
6.31k
      if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
807
20
        *nextTokPtr = ptr;
808
20
        return XML_TOK_INVALID;
809
20
      }
810
6.29k
      *nextTokPtr = ptr + MINBPC(enc);
811
6.29k
      return XML_TOK_EMPTY_ELEMENT_NO_ATTS;
812
96
    default:
813
96
      *nextTokPtr = ptr;
814
96
      return XML_TOK_INVALID;
815
11.5M
    }
816
11.5M
  }
817
248
  return XML_TOK_PARTIAL;
818
2.71M
}
xmltok.c:normal_scanLt
Line
Count
Source
724
2.82M
               const char **nextTokPtr) {
725
#  ifdef XML_NS
726
  int hadColon;
727
#  endif
728
2.82M
  REQUIRE_CHAR(enc, ptr, end);
729
2.82M
  switch (BYTE_TYPE(enc, ptr)) {
730
1.96M
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
731
1.61k
  case BT_EXCL:
732
1.61k
    ptr += MINBPC(enc);
733
1.61k
    REQUIRE_CHAR(enc, ptr, end);
734
1.61k
    switch (BYTE_TYPE(enc, ptr)) {
735
528
    case BT_MINUS:
736
528
      return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
737
1.07k
    case BT_LSQB:
738
1.07k
      return PREFIX(scanCdataSection)(enc, ptr + MINBPC(enc), end, nextTokPtr);
739
1.61k
    }
740
14
    *nextTokPtr = ptr;
741
14
    return XML_TOK_INVALID;
742
7.72k
  case BT_QUEST:
743
7.72k
    return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
744
94.4k
  case BT_SOL:
745
94.4k
    return PREFIX(scanEndTag)(enc, ptr + MINBPC(enc), end, nextTokPtr);
746
33
  default:
747
33
    *nextTokPtr = ptr;
748
33
    return XML_TOK_INVALID;
749
2.82M
  }
750
#  ifdef XML_NS
751
  hadColon = 0;
752
#  endif
753
  /* we have a start-tag */
754
11.5M
  while (HAS_CHAR(enc, ptr, end)) {
755
11.5M
    switch (BYTE_TYPE(enc, ptr)) {
756
25.6M
      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
60.4k
    case BT_S:
775
62.1k
    case BT_CR:
776
67.4k
    case BT_LF: {
777
67.4k
      ptr += MINBPC(enc);
778
74.9k
      while (HAS_CHAR(enc, ptr, end)) {
779
74.9k
        switch (BYTE_TYPE(enc, ptr)) {
780
65.1k
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
781
1.52k
        case BT_GT:
782
1.52k
          goto gt;
783
3.75k
        case BT_SOL:
784
3.75k
          goto sol;
785
3.50k
        case BT_S:
786
6.99k
        case BT_CR:
787
7.59k
        case BT_LF:
788
7.59k
          ptr += MINBPC(enc);
789
7.59k
          continue;
790
11
        default:
791
11
          *nextTokPtr = ptr;
792
11
          return XML_TOK_INVALID;
793
74.9k
        }
794
61.9k
        return PREFIX(scanAtts)(enc, ptr, end, nextTokPtr);
795
74.9k
      }
796
84
      return XML_TOK_PARTIAL;
797
67.4k
    }
798
2.64M
    case BT_GT:
799
2.64M
    gt:
800
2.64M
      *nextTokPtr = ptr + MINBPC(enc);
801
2.64M
      return XML_TOK_START_TAG_NO_ATTS;
802
2.57k
    case BT_SOL:
803
6.33k
    sol:
804
6.33k
      ptr += MINBPC(enc);
805
6.33k
      REQUIRE_CHAR(enc, ptr, end);
806
6.31k
      if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
807
20
        *nextTokPtr = ptr;
808
20
        return XML_TOK_INVALID;
809
20
      }
810
6.29k
      *nextTokPtr = ptr + MINBPC(enc);
811
6.29k
      return XML_TOK_EMPTY_ELEMENT_NO_ATTS;
812
96
    default:
813
96
      *nextTokPtr = ptr;
814
96
      return XML_TOK_INVALID;
815
11.5M
    }
816
11.5M
  }
817
248
  return XML_TOK_PARTIAL;
818
2.71M
}
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
11.4M
                   const char **nextTokPtr) {
823
11.4M
  if (ptr >= end)
824
1.20M
    return XML_TOK_NONE;
825
10.2M
  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
10.2M
  switch (BYTE_TYPE(enc, ptr)) {
835
2.82M
  case BT_LT:
836
2.82M
    return PREFIX(scanLt)(enc, ptr + MINBPC(enc), end, nextTokPtr);
837
1.23M
  case BT_AMP:
838
1.23M
    return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
839
8.53k
  case BT_CR:
840
8.53k
    ptr += MINBPC(enc);
841
8.53k
    if (! HAS_CHAR(enc, ptr, end))
842
32
      return XML_TOK_TRAILING_CR;
843
8.50k
    if (BYTE_TYPE(enc, ptr) == BT_LF)
844
452
      ptr += MINBPC(enc);
845
8.50k
    *nextTokPtr = ptr;
846
8.50k
    return XML_TOK_DATA_NEWLINE;
847
3.06M
  case BT_LF:
848
3.06M
    *nextTokPtr = ptr + MINBPC(enc);
849
3.06M
    return XML_TOK_DATA_NEWLINE;
850
51.0k
  case BT_RSQB:
851
51.0k
    ptr += MINBPC(enc);
852
51.0k
    if (! HAS_CHAR(enc, ptr, end))
853
5.11k
      return XML_TOK_TRAILING_RSQB;
854
45.9k
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
855
38.9k
      break;
856
6.98k
    ptr += MINBPC(enc);
857
6.98k
    if (! HAS_CHAR(enc, ptr, end))
858
6.36k
      return XML_TOK_TRAILING_RSQB;
859
613
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
860
612
      ptr -= MINBPC(enc);
861
612
      break;
862
612
    }
863
1
    *nextTokPtr = ptr;
864
1
    return XML_TOK_INVALID;
865
40.7k
    INVALID_CASES(ptr, nextTokPtr)
866
3.04M
  default:
867
3.04M
    ptr += MINBPC(enc);
868
3.04M
    break;
869
10.2M
  }
870
202M
  while (HAS_CHAR(enc, ptr, end)) {
871
202M
    switch (BYTE_TYPE(enc, ptr)) {
872
0
#  define LEAD_CASE(n)                                                         \
873
2.59M
  case BT_LEAD##n:                                                             \
874
2.59M
    if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) {                       \
875
54
      *nextTokPtr = ptr;                                                       \
876
54
      return XML_TOK_DATA_CHARS;                                               \
877
54
    }                                                                          \
878
2.59M
    ptr += n;                                                                  \
879
2.59M
    break;
880
2.59M
      LEAD_CASE(2)
881
2.00k
      LEAD_CASE(3)
882
1.06k
      LEAD_CASE(4)
883
0
#  undef LEAD_CASE
884
56.8k
    case BT_RSQB:
885
56.8k
      if (HAS_CHARS(enc, ptr, end, 2)) {
886
51.9k
        if (! CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_RSQB)) {
887
19.0k
          ptr += MINBPC(enc);
888
19.0k
          break;
889
19.0k
        }
890
32.8k
        if (HAS_CHARS(enc, ptr, end, 3)) {
891
26.5k
          if (! CHAR_MATCHES(enc, ptr + 2 * MINBPC(enc), ASCII_GT)) {
892
26.5k
            ptr += MINBPC(enc);
893
26.5k
            break;
894
26.5k
          }
895
2
          *nextTokPtr = ptr + 2 * MINBPC(enc);
896
2
          return XML_TOK_INVALID;
897
26.5k
        }
898
32.8k
      }
899
      /* fall through */
900
104k
    case BT_AMP:
901
166k
    case BT_LT:
902
166k
    case BT_NONXML:
903
166k
    case BT_MALFORM:
904
166k
    case BT_TRAIL:
905
170k
    case BT_CR:
906
2.50M
    case BT_LF:
907
2.50M
      *nextTokPtr = ptr;
908
2.50M
      return XML_TOK_DATA_CHARS;
909
197M
    default:
910
197M
      ptr += MINBPC(enc);
911
197M
      break;
912
202M
    }
913
202M
  }
914
605k
  *nextTokPtr = ptr;
915
605k
  return XML_TOK_DATA_CHARS;
916
3.10M
}
xmltok.c:normal_contentTok
Line
Count
Source
822
11.4M
                   const char **nextTokPtr) {
823
11.4M
  if (ptr >= end)
824
1.20M
    return XML_TOK_NONE;
825
10.2M
  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
10.2M
  switch (BYTE_TYPE(enc, ptr)) {
835
2.82M
  case BT_LT:
836
2.82M
    return PREFIX(scanLt)(enc, ptr + MINBPC(enc), end, nextTokPtr);
837
1.23M
  case BT_AMP:
838
1.23M
    return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
839
8.53k
  case BT_CR:
840
8.53k
    ptr += MINBPC(enc);
841
8.53k
    if (! HAS_CHAR(enc, ptr, end))
842
32
      return XML_TOK_TRAILING_CR;
843
8.50k
    if (BYTE_TYPE(enc, ptr) == BT_LF)
844
452
      ptr += MINBPC(enc);
845
8.50k
    *nextTokPtr = ptr;
846
8.50k
    return XML_TOK_DATA_NEWLINE;
847
3.06M
  case BT_LF:
848
3.06M
    *nextTokPtr = ptr + MINBPC(enc);
849
3.06M
    return XML_TOK_DATA_NEWLINE;
850
51.0k
  case BT_RSQB:
851
51.0k
    ptr += MINBPC(enc);
852
51.0k
    if (! HAS_CHAR(enc, ptr, end))
853
5.11k
      return XML_TOK_TRAILING_RSQB;
854
45.9k
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
855
38.9k
      break;
856
6.98k
    ptr += MINBPC(enc);
857
6.98k
    if (! HAS_CHAR(enc, ptr, end))
858
6.36k
      return XML_TOK_TRAILING_RSQB;
859
613
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
860
612
      ptr -= MINBPC(enc);
861
612
      break;
862
612
    }
863
1
    *nextTokPtr = ptr;
864
1
    return XML_TOK_INVALID;
865
40.7k
    INVALID_CASES(ptr, nextTokPtr)
866
3.04M
  default:
867
3.04M
    ptr += MINBPC(enc);
868
3.04M
    break;
869
10.2M
  }
870
202M
  while (HAS_CHAR(enc, ptr, end)) {
871
202M
    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
2.59M
      LEAD_CASE(2)
881
2.00k
      LEAD_CASE(3)
882
1.06k
      LEAD_CASE(4)
883
0
#  undef LEAD_CASE
884
56.8k
    case BT_RSQB:
885
56.8k
      if (HAS_CHARS(enc, ptr, end, 2)) {
886
51.9k
        if (! CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_RSQB)) {
887
19.0k
          ptr += MINBPC(enc);
888
19.0k
          break;
889
19.0k
        }
890
32.8k
        if (HAS_CHARS(enc, ptr, end, 3)) {
891
26.5k
          if (! CHAR_MATCHES(enc, ptr + 2 * MINBPC(enc), ASCII_GT)) {
892
26.5k
            ptr += MINBPC(enc);
893
26.5k
            break;
894
26.5k
          }
895
2
          *nextTokPtr = ptr + 2 * MINBPC(enc);
896
2
          return XML_TOK_INVALID;
897
26.5k
        }
898
32.8k
      }
899
      /* fall through */
900
104k
    case BT_AMP:
901
166k
    case BT_LT:
902
166k
    case BT_NONXML:
903
166k
    case BT_MALFORM:
904
166k
    case BT_TRAIL:
905
170k
    case BT_CR:
906
2.50M
    case BT_LF:
907
2.50M
      *nextTokPtr = ptr;
908
2.50M
      return XML_TOK_DATA_CHARS;
909
197M
    default:
910
197M
      ptr += MINBPC(enc);
911
197M
      break;
912
202M
    }
913
202M
  }
914
605k
  *nextTokPtr = ptr;
915
605k
  return XML_TOK_DATA_CHARS;
916
3.10M
}
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
3.14k
                    const char **nextTokPtr) {
923
3.14k
  REQUIRE_CHAR(enc, ptr, end);
924
3.12k
  switch (BYTE_TYPE(enc, ptr)) {
925
1.91k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
926
763
  case BT_S:
927
994
  case BT_LF:
928
1.33k
  case BT_CR:
929
1.33k
  case BT_PERCNT:
930
1.33k
    *nextTokPtr = ptr;
931
1.33k
    return XML_TOK_PERCENT;
932
7
  default:
933
7
    *nextTokPtr = ptr;
934
7
    return XML_TOK_INVALID;
935
3.12k
  }
936
5.68k
  while (HAS_CHAR(enc, ptr, end)) {
937
5.68k
    switch (BYTE_TYPE(enc, ptr)) {
938
10.9k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
939
1.48k
    case BT_SEMI:
940
1.48k
      *nextTokPtr = ptr + MINBPC(enc);
941
1.48k
      return XML_TOK_PARAM_ENTITY_REF;
942
30
    default:
943
30
      *nextTokPtr = ptr;
944
30
      return XML_TOK_INVALID;
945
5.68k
    }
946
5.68k
  }
947
154
  return XML_TOK_PARTIAL;
948
1.71k
}
xmltok.c:normal_scanPercent
Line
Count
Source
922
3.14k
                    const char **nextTokPtr) {
923
3.14k
  REQUIRE_CHAR(enc, ptr, end);
924
3.12k
  switch (BYTE_TYPE(enc, ptr)) {
925
1.91k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
926
763
  case BT_S:
927
994
  case BT_LF:
928
1.33k
  case BT_CR:
929
1.33k
  case BT_PERCNT:
930
1.33k
    *nextTokPtr = ptr;
931
1.33k
    return XML_TOK_PERCENT;
932
7
  default:
933
7
    *nextTokPtr = ptr;
934
7
    return XML_TOK_INVALID;
935
3.12k
  }
936
5.68k
  while (HAS_CHAR(enc, ptr, end)) {
937
5.68k
    switch (BYTE_TYPE(enc, ptr)) {
938
10.9k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
939
1.48k
    case BT_SEMI:
940
1.48k
      *nextTokPtr = ptr + MINBPC(enc);
941
1.48k
      return XML_TOK_PARAM_ENTITY_REF;
942
30
    default:
943
30
      *nextTokPtr = ptr;
944
30
      return XML_TOK_INVALID;
945
5.68k
    }
946
5.68k
  }
947
154
  return XML_TOK_PARTIAL;
948
1.71k
}
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
44.1k
                      const char **nextTokPtr) {
953
44.1k
  REQUIRE_CHAR(enc, ptr, end);
954
44.1k
  switch (BYTE_TYPE(enc, ptr)) {
955
43.6k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
956
3
  default:
957
3
    *nextTokPtr = ptr;
958
3
    return XML_TOK_INVALID;
959
44.1k
  }
960
1.01M
  while (HAS_CHAR(enc, ptr, end)) {
961
1.01M
    switch (BYTE_TYPE(enc, ptr)) {
962
3.73M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
963
161
    case BT_CR:
964
1.90k
    case BT_LF:
965
42.9k
    case BT_S:
966
43.1k
    case BT_RPAR:
967
43.5k
    case BT_GT:
968
43.5k
    case BT_PERCNT:
969
43.8k
    case BT_VERBAR:
970
43.8k
      *nextTokPtr = ptr;
971
43.8k
      return XML_TOK_POUND_NAME;
972
33
    default:
973
33
      *nextTokPtr = ptr;
974
33
      return XML_TOK_INVALID;
975
1.01M
    }
976
1.01M
  }
977
210
  return -XML_TOK_POUND_NAME;
978
44.1k
}
xmltok.c:normal_scanPoundName
Line
Count
Source
952
44.1k
                      const char **nextTokPtr) {
953
44.1k
  REQUIRE_CHAR(enc, ptr, end);
954
44.1k
  switch (BYTE_TYPE(enc, ptr)) {
955
43.6k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
956
3
  default:
957
3
    *nextTokPtr = ptr;
958
3
    return XML_TOK_INVALID;
959
44.1k
  }
960
1.01M
  while (HAS_CHAR(enc, ptr, end)) {
961
1.01M
    switch (BYTE_TYPE(enc, ptr)) {
962
3.73M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
963
161
    case BT_CR:
964
1.90k
    case BT_LF:
965
42.9k
    case BT_S:
966
43.1k
    case BT_RPAR:
967
43.5k
    case BT_GT:
968
43.5k
    case BT_PERCNT:
969
43.8k
    case BT_VERBAR:
970
43.8k
      *nextTokPtr = ptr;
971
43.8k
      return XML_TOK_POUND_NAME;
972
33
    default:
973
33
      *nextTokPtr = ptr;
974
33
      return XML_TOK_INVALID;
975
1.01M
    }
976
1.01M
  }
977
210
  return -XML_TOK_POUND_NAME;
978
44.1k
}
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
51.5k
                const char **nextTokPtr) {
983
93.7M
  while (HAS_CHAR(enc, ptr, end)) {
984
93.7M
    int t = BYTE_TYPE(enc, ptr);
985
93.7M
    switch (t) {
986
8.14k
      INVALID_CASES(ptr, nextTokPtr)
987
152k
    case BT_QUOT:
988
199k
    case BT_APOS:
989
199k
      ptr += MINBPC(enc);
990
199k
      if (t != open)
991
148k
        break;
992
51.2k
      if (! HAS_CHAR(enc, ptr, end))
993
1.23k
        return -XML_TOK_LITERAL;
994
50.0k
      *nextTokPtr = ptr;
995
50.0k
      switch (BYTE_TYPE(enc, ptr)) {
996
16.6k
      case BT_S:
997
17.3k
      case BT_CR:
998
37.7k
      case BT_LF:
999
49.8k
      case BT_GT:
1000
49.8k
      case BT_PERCNT:
1001
50.0k
      case BT_LSQB:
1002
50.0k
        return XML_TOK_LITERAL;
1003
20
      default:
1004
20
        return XML_TOK_INVALID;
1005
50.0k
      }
1006
93.5M
    default:
1007
93.5M
      ptr += MINBPC(enc);
1008
93.5M
      break;
1009
93.7M
    }
1010
93.7M
  }
1011
200
  return XML_TOK_PARTIAL;
1012
51.5k
}
xmltok.c:normal_scanLit
Line
Count
Source
982
51.5k
                const char **nextTokPtr) {
983
93.7M
  while (HAS_CHAR(enc, ptr, end)) {
984
93.7M
    int t = BYTE_TYPE(enc, ptr);
985
93.7M
    switch (t) {
986
8.14k
      INVALID_CASES(ptr, nextTokPtr)
987
152k
    case BT_QUOT:
988
199k
    case BT_APOS:
989
199k
      ptr += MINBPC(enc);
990
199k
      if (t != open)
991
148k
        break;
992
51.2k
      if (! HAS_CHAR(enc, ptr, end))
993
1.23k
        return -XML_TOK_LITERAL;
994
50.0k
      *nextTokPtr = ptr;
995
50.0k
      switch (BYTE_TYPE(enc, ptr)) {
996
16.6k
      case BT_S:
997
17.3k
      case BT_CR:
998
37.7k
      case BT_LF:
999
49.8k
      case BT_GT:
1000
49.8k
      case BT_PERCNT:
1001
50.0k
      case BT_LSQB:
1002
50.0k
        return XML_TOK_LITERAL;
1003
20
      default:
1004
20
        return XML_TOK_INVALID;
1005
50.0k
      }
1006
93.5M
    default:
1007
93.5M
      ptr += MINBPC(enc);
1008
93.5M
      break;
1009
93.7M
    }
1010
93.7M
  }
1011
200
  return XML_TOK_PARTIAL;
1012
51.5k
}
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
5.99M
                  const char **nextTokPtr) {
1017
5.99M
  int tok;
1018
5.99M
  if (ptr >= end)
1019
2.35k
    return XML_TOK_NONE;
1020
5.99M
  if (MINBPC(enc) > 1) {
1021
311
    size_t n = end - ptr;
1022
311
    if (n & (MINBPC(enc) - 1)) {
1023
38
      n &= ~(MINBPC(enc) - 1);
1024
38
      if (n == 0)
1025
4
        return XML_TOK_PARTIAL;
1026
34
      end = ptr + n;
1027
34
    }
1028
311
  }
1029
5.99M
  switch (BYTE_TYPE(enc, ptr)) {
1030
4.82k
  case BT_QUOT:
1031
4.82k
    return PREFIX(scanLit)(BT_QUOT, enc, ptr + MINBPC(enc), end, nextTokPtr);
1032
46.7k
  case BT_APOS:
1033
46.7k
    return PREFIX(scanLit)(BT_APOS, enc, ptr + MINBPC(enc), end, nextTokPtr);
1034
43.6k
  case BT_LT: {
1035
43.6k
    ptr += MINBPC(enc);
1036
43.6k
    REQUIRE_CHAR(enc, ptr, end);
1037
43.5k
    switch (BYTE_TYPE(enc, ptr)) {
1038
32.9k
    case BT_EXCL:
1039
32.9k
      return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1040
5.15k
    case BT_QUEST:
1041
5.15k
      return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1042
3.56k
    case BT_NMSTRT:
1043
5.37k
    case BT_HEX:
1044
5.37k
    case BT_NONASCII:
1045
5.40k
    case BT_LEAD2:
1046
5.45k
    case BT_LEAD3:
1047
5.46k
    case BT_LEAD4:
1048
5.46k
      *nextTokPtr = ptr - MINBPC(enc);
1049
5.46k
      return XML_TOK_INSTANCE_START;
1050
43.5k
    }
1051
21
    *nextTokPtr = ptr;
1052
21
    return XML_TOK_INVALID;
1053
43.5k
  }
1054
119k
  case BT_CR:
1055
119k
    if (ptr + MINBPC(enc) == end) {
1056
297
      *nextTokPtr = end;
1057
      /* indicate that this might be part of a CR/LF pair */
1058
297
      return -XML_TOK_PROLOG_S;
1059
297
    }
1060
    /* fall through */
1061
299k
  case BT_S:
1062
414k
  case BT_LF:
1063
432k
    for (;;) {
1064
432k
      ptr += MINBPC(enc);
1065
432k
      if (! HAS_CHAR(enc, ptr, end))
1066
204
        break;
1067
432k
      switch (BYTE_TYPE(enc, ptr)) {
1068
2.63k
      case BT_S:
1069
15.0k
      case BT_LF:
1070
15.0k
        break;
1071
2.91k
      case BT_CR:
1072
        /* don't split CR/LF pair */
1073
2.91k
        if (ptr + MINBPC(enc) != end)
1074
2.80k
          break;
1075
        /* fall through */
1076
414k
      default:
1077
414k
        *nextTokPtr = ptr;
1078
414k
        return XML_TOK_PROLOG_S;
1079
432k
      }
1080
432k
    }
1081
204
    *nextTokPtr = ptr;
1082
204
    return XML_TOK_PROLOG_S;
1083
3.13k
  case BT_PERCNT:
1084
3.13k
    return PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1085
1.19k
  case BT_COMMA:
1086
1.19k
    *nextTokPtr = ptr + MINBPC(enc);
1087
1.19k
    return XML_TOK_COMMA;
1088
4.12k
  case BT_LSQB:
1089
4.12k
    *nextTokPtr = ptr + MINBPC(enc);
1090
4.12k
    return XML_TOK_OPEN_BRACKET;
1091
2.03k
  case BT_RSQB:
1092
2.03k
    ptr += MINBPC(enc);
1093
2.03k
    if (! HAS_CHAR(enc, ptr, end))
1094
7
      return -XML_TOK_CLOSE_BRACKET;
1095
2.03k
    if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) {
1096
35
      REQUIRE_CHARS(enc, ptr, end, 2);
1097
33
      if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_GT)) {
1098
1
        *nextTokPtr = ptr + 2 * MINBPC(enc);
1099
1
        return XML_TOK_COND_SECT_CLOSE;
1100
1
      }
1101
33
    }
1102
2.02k
    *nextTokPtr = ptr;
1103
2.02k
    return XML_TOK_CLOSE_BRACKET;
1104
4.93M
  case BT_LPAR:
1105
4.93M
    *nextTokPtr = ptr + MINBPC(enc);
1106
4.93M
    return XML_TOK_OPEN_PAREN;
1107
74.2k
  case BT_RPAR:
1108
74.2k
    ptr += MINBPC(enc);
1109
74.2k
    if (! HAS_CHAR(enc, ptr, end))
1110
115
      return -XML_TOK_CLOSE_PAREN;
1111
74.0k
    switch (BYTE_TYPE(enc, ptr)) {
1112
2.74k
    case BT_AST:
1113
2.74k
      *nextTokPtr = ptr + MINBPC(enc);
1114
2.74k
      return XML_TOK_CLOSE_PAREN_ASTERISK;
1115
5.17k
    case BT_QUEST:
1116
5.17k
      *nextTokPtr = ptr + MINBPC(enc);
1117
5.17k
      return XML_TOK_CLOSE_PAREN_QUESTION;
1118
11.8k
    case BT_PLUS:
1119
11.8k
      *nextTokPtr = ptr + MINBPC(enc);
1120
11.8k
      return XML_TOK_CLOSE_PAREN_PLUS;
1121
1.58k
    case BT_CR:
1122
33.1k
    case BT_LF:
1123
33.8k
    case BT_S:
1124
34.8k
    case BT_GT:
1125
35.1k
    case BT_COMMA:
1126
36.8k
    case BT_VERBAR:
1127
54.3k
    case BT_RPAR:
1128
54.3k
      *nextTokPtr = ptr;
1129
54.3k
      return XML_TOK_CLOSE_PAREN;
1130
74.0k
    }
1131
20
    *nextTokPtr = ptr;
1132
20
    return XML_TOK_INVALID;
1133
91.5k
  case BT_VERBAR:
1134
91.5k
    *nextTokPtr = ptr + MINBPC(enc);
1135
91.5k
    return XML_TOK_OR;
1136
27.4k
  case BT_GT:
1137
27.4k
    *nextTokPtr = ptr + MINBPC(enc);
1138
27.4k
    return XML_TOK_DECL_CLOSE;
1139
44.1k
  case BT_NUM:
1140
44.1k
    return PREFIX(scanPoundName)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1141
0
#  define LEAD_CASE(n)                                                         \
1142
90
  case BT_LEAD##n:                                                             \
1143
1.17k
    if (end - ptr < n)                                                         \
1144
90
      return XML_TOK_PARTIAL_CHAR;                                             \
1145
1.10k
    if (IS_INVALID_CHAR(enc, ptr, n)) {                                        \
1146
157
      *nextTokPtr = ptr;                                                       \
1147
157
      return XML_TOK_INVALID;                                                  \
1148
157
    }                                                                          \
1149
1.10k
    if (IS_NMSTRT_CHAR(enc, ptr, n)) {                                         \
1150
513
      ptr += n;                                                                \
1151
513
      tok = XML_TOK_NAME;                                                      \
1152
513
      break;                                                                   \
1153
513
    }                                                                          \
1154
951
    if (IS_NAME_CHAR(enc, ptr, n)) {                                           \
1155
348
      ptr += n;                                                                \
1156
348
      tok = XML_TOK_NMTOKEN;                                                   \
1157
348
      break;                                                                   \
1158
348
    }                                                                          \
1159
438
    *nextTokPtr = ptr;                                                         \
1160
90
    return XML_TOK_INVALID;
1161
1.96k
    LEAD_CASE(2)
1162
1.29k
    LEAD_CASE(3)
1163
406
    LEAD_CASE(4)
1164
0
#  undef LEAD_CASE
1165
138k
  case BT_NMSTRT:
1166
283k
  case BT_HEX:
1167
283k
    tok = XML_TOK_NAME;
1168
283k
    ptr += MINBPC(enc);
1169
283k
    break;
1170
12.4k
  case BT_DIGIT:
1171
12.8k
  case BT_NAME:
1172
13.1k
  case BT_MINUS:
1173
#  ifdef XML_NS
1174
  case BT_COLON:
1175
#  endif
1176
13.1k
    tok = XML_TOK_NMTOKEN;
1177
13.1k
    ptr += MINBPC(enc);
1178
13.1k
    break;
1179
232
  case BT_NONASCII:
1180
232
    if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {
1181
183
      ptr += MINBPC(enc);
1182
183
      tok = XML_TOK_NAME;
1183
183
      break;
1184
183
    }
1185
49
    if (IS_NAME_CHAR_MINBPC(enc, ptr)) {
1186
21
      ptr += MINBPC(enc);
1187
21
      tok = XML_TOK_NMTOKEN;
1188
21
      break;
1189
21
    }
1190
    /* fall through */
1191
127
  default:
1192
127
    *nextTokPtr = ptr;
1193
127
    return XML_TOK_INVALID;
1194
5.99M
  }
1195
1.42M
  while (HAS_CHAR(enc, ptr, end)) {
1196
1.42M
    switch (BYTE_TYPE(enc, ptr)) {
1197
4.28M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1198
8.12k
    case BT_GT:
1199
46.9k
    case BT_RPAR:
1200
47.8k
    case BT_COMMA:
1201
95.1k
    case BT_VERBAR:
1202
99.0k
    case BT_LSQB:
1203
99.0k
    case BT_PERCNT:
1204
202k
    case BT_S:
1205
246k
    case BT_CR:
1206
279k
    case BT_LF:
1207
279k
      *nextTokPtr = ptr;
1208
279k
      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
487
    case BT_PLUS:
1230
487
      if (tok == XML_TOK_NMTOKEN) {
1231
1
        *nextTokPtr = ptr;
1232
1
        return XML_TOK_INVALID;
1233
1
      }
1234
486
      *nextTokPtr = ptr + MINBPC(enc);
1235
486
      return XML_TOK_NAME_PLUS;
1236
454
    case BT_AST:
1237
454
      if (tok == XML_TOK_NMTOKEN) {
1238
1
        *nextTokPtr = ptr;
1239
1
        return XML_TOK_INVALID;
1240
1
      }
1241
453
      *nextTokPtr = ptr + MINBPC(enc);
1242
453
      return XML_TOK_NAME_ASTERISK;
1243
15.9k
    case BT_QUEST:
1244
15.9k
      if (tok == XML_TOK_NMTOKEN) {
1245
1
        *nextTokPtr = ptr;
1246
1
        return XML_TOK_INVALID;
1247
1
      }
1248
15.9k
      *nextTokPtr = ptr + MINBPC(enc);
1249
15.9k
      return XML_TOK_NAME_QUESTION;
1250
116
    default:
1251
116
      *nextTokPtr = ptr;
1252
116
      return XML_TOK_INVALID;
1253
1.42M
    }
1254
1.42M
  }
1255
1.11k
  return -tok;
1256
298k
}
xmltok.c:normal_prologTok
Line
Count
Source
1016
5.99M
                  const char **nextTokPtr) {
1017
5.99M
  int tok;
1018
5.99M
  if (ptr >= end)
1019
2.35k
    return XML_TOK_NONE;
1020
5.99M
  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
5.99M
  switch (BYTE_TYPE(enc, ptr)) {
1030
4.82k
  case BT_QUOT:
1031
4.82k
    return PREFIX(scanLit)(BT_QUOT, enc, ptr + MINBPC(enc), end, nextTokPtr);
1032
46.7k
  case BT_APOS:
1033
46.7k
    return PREFIX(scanLit)(BT_APOS, enc, ptr + MINBPC(enc), end, nextTokPtr);
1034
43.6k
  case BT_LT: {
1035
43.6k
    ptr += MINBPC(enc);
1036
43.6k
    REQUIRE_CHAR(enc, ptr, end);
1037
43.5k
    switch (BYTE_TYPE(enc, ptr)) {
1038
32.9k
    case BT_EXCL:
1039
32.9k
      return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1040
5.15k
    case BT_QUEST:
1041
5.15k
      return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1042
3.56k
    case BT_NMSTRT:
1043
5.37k
    case BT_HEX:
1044
5.37k
    case BT_NONASCII:
1045
5.40k
    case BT_LEAD2:
1046
5.45k
    case BT_LEAD3:
1047
5.46k
    case BT_LEAD4:
1048
5.46k
      *nextTokPtr = ptr - MINBPC(enc);
1049
5.46k
      return XML_TOK_INSTANCE_START;
1050
43.5k
    }
1051
21
    *nextTokPtr = ptr;
1052
21
    return XML_TOK_INVALID;
1053
43.5k
  }
1054
119k
  case BT_CR:
1055
119k
    if (ptr + MINBPC(enc) == end) {
1056
297
      *nextTokPtr = end;
1057
      /* indicate that this might be part of a CR/LF pair */
1058
297
      return -XML_TOK_PROLOG_S;
1059
297
    }
1060
    /* fall through */
1061
299k
  case BT_S:
1062
414k
  case BT_LF:
1063
432k
    for (;;) {
1064
432k
      ptr += MINBPC(enc);
1065
432k
      if (! HAS_CHAR(enc, ptr, end))
1066
204
        break;
1067
432k
      switch (BYTE_TYPE(enc, ptr)) {
1068
2.63k
      case BT_S:
1069
15.0k
      case BT_LF:
1070
15.0k
        break;
1071
2.91k
      case BT_CR:
1072
        /* don't split CR/LF pair */
1073
2.91k
        if (ptr + MINBPC(enc) != end)
1074
2.80k
          break;
1075
        /* fall through */
1076
414k
      default:
1077
414k
        *nextTokPtr = ptr;
1078
414k
        return XML_TOK_PROLOG_S;
1079
432k
      }
1080
432k
    }
1081
204
    *nextTokPtr = ptr;
1082
204
    return XML_TOK_PROLOG_S;
1083
3.13k
  case BT_PERCNT:
1084
3.13k
    return PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1085
1.19k
  case BT_COMMA:
1086
1.19k
    *nextTokPtr = ptr + MINBPC(enc);
1087
1.19k
    return XML_TOK_COMMA;
1088
4.12k
  case BT_LSQB:
1089
4.12k
    *nextTokPtr = ptr + MINBPC(enc);
1090
4.12k
    return XML_TOK_OPEN_BRACKET;
1091
2.03k
  case BT_RSQB:
1092
2.03k
    ptr += MINBPC(enc);
1093
2.03k
    if (! HAS_CHAR(enc, ptr, end))
1094
7
      return -XML_TOK_CLOSE_BRACKET;
1095
2.03k
    if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) {
1096
35
      REQUIRE_CHARS(enc, ptr, end, 2);
1097
33
      if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_GT)) {
1098
1
        *nextTokPtr = ptr + 2 * MINBPC(enc);
1099
1
        return XML_TOK_COND_SECT_CLOSE;
1100
1
      }
1101
33
    }
1102
2.02k
    *nextTokPtr = ptr;
1103
2.02k
    return XML_TOK_CLOSE_BRACKET;
1104
4.93M
  case BT_LPAR:
1105
4.93M
    *nextTokPtr = ptr + MINBPC(enc);
1106
4.93M
    return XML_TOK_OPEN_PAREN;
1107
74.2k
  case BT_RPAR:
1108
74.2k
    ptr += MINBPC(enc);
1109
74.2k
    if (! HAS_CHAR(enc, ptr, end))
1110
115
      return -XML_TOK_CLOSE_PAREN;
1111
74.0k
    switch (BYTE_TYPE(enc, ptr)) {
1112
2.74k
    case BT_AST:
1113
2.74k
      *nextTokPtr = ptr + MINBPC(enc);
1114
2.74k
      return XML_TOK_CLOSE_PAREN_ASTERISK;
1115
5.17k
    case BT_QUEST:
1116
5.17k
      *nextTokPtr = ptr + MINBPC(enc);
1117
5.17k
      return XML_TOK_CLOSE_PAREN_QUESTION;
1118
11.8k
    case BT_PLUS:
1119
11.8k
      *nextTokPtr = ptr + MINBPC(enc);
1120
11.8k
      return XML_TOK_CLOSE_PAREN_PLUS;
1121
1.58k
    case BT_CR:
1122
33.1k
    case BT_LF:
1123
33.8k
    case BT_S:
1124
34.8k
    case BT_GT:
1125
35.1k
    case BT_COMMA:
1126
36.8k
    case BT_VERBAR:
1127
54.3k
    case BT_RPAR:
1128
54.3k
      *nextTokPtr = ptr;
1129
54.3k
      return XML_TOK_CLOSE_PAREN;
1130
74.0k
    }
1131
20
    *nextTokPtr = ptr;
1132
20
    return XML_TOK_INVALID;
1133
91.5k
  case BT_VERBAR:
1134
91.5k
    *nextTokPtr = ptr + MINBPC(enc);
1135
91.5k
    return XML_TOK_OR;
1136
27.4k
  case BT_GT:
1137
27.4k
    *nextTokPtr = ptr + MINBPC(enc);
1138
27.4k
    return XML_TOK_DECL_CLOSE;
1139
44.1k
  case BT_NUM:
1140
44.1k
    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.96k
    LEAD_CASE(2)
1162
1.29k
    LEAD_CASE(3)
1163
206
    LEAD_CASE(4)
1164
0
#  undef LEAD_CASE
1165
138k
  case BT_NMSTRT:
1166
283k
  case BT_HEX:
1167
283k
    tok = XML_TOK_NAME;
1168
283k
    ptr += MINBPC(enc);
1169
283k
    break;
1170
12.4k
  case BT_DIGIT:
1171
12.8k
  case BT_NAME:
1172
13.1k
  case BT_MINUS:
1173
#  ifdef XML_NS
1174
  case BT_COLON:
1175
#  endif
1176
13.1k
    tok = XML_TOK_NMTOKEN;
1177
13.1k
    ptr += MINBPC(enc);
1178
13.1k
    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
86
  default:
1192
86
    *nextTokPtr = ptr;
1193
86
    return XML_TOK_INVALID;
1194
5.99M
  }
1195
1.29M
  while (HAS_CHAR(enc, ptr, end)) {
1196
1.29M
    switch (BYTE_TYPE(enc, ptr)) {
1197
3.59M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1198
8.12k
    case BT_GT:
1199
46.9k
    case BT_RPAR:
1200
47.8k
    case BT_COMMA:
1201
95.1k
    case BT_VERBAR:
1202
99.0k
    case BT_LSQB:
1203
99.0k
    case BT_PERCNT:
1204
202k
    case BT_S:
1205
246k
    case BT_CR:
1206
279k
    case BT_LF:
1207
279k
      *nextTokPtr = ptr;
1208
279k
      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
487
    case BT_PLUS:
1230
487
      if (tok == XML_TOK_NMTOKEN) {
1231
1
        *nextTokPtr = ptr;
1232
1
        return XML_TOK_INVALID;
1233
1
      }
1234
486
      *nextTokPtr = ptr + MINBPC(enc);
1235
486
      return XML_TOK_NAME_PLUS;
1236
454
    case BT_AST:
1237
454
      if (tok == XML_TOK_NMTOKEN) {
1238
1
        *nextTokPtr = ptr;
1239
1
        return XML_TOK_INVALID;
1240
1
      }
1241
453
      *nextTokPtr = ptr + MINBPC(enc);
1242
453
      return XML_TOK_NAME_ASTERISK;
1243
15.9k
    case BT_QUEST:
1244
15.9k
      if (tok == XML_TOK_NMTOKEN) {
1245
1
        *nextTokPtr = ptr;
1246
1
        return XML_TOK_INVALID;
1247
1
      }
1248
15.9k
      *nextTokPtr = ptr + MINBPC(enc);
1249
15.9k
      return XML_TOK_NAME_QUESTION;
1250
101
    default:
1251
101
      *nextTokPtr = ptr;
1252
101
      return XML_TOK_INVALID;
1253
1.29M
    }
1254
1.29M
  }
1255
1.05k
  return -tok;
1256
297k
}
xmltok.c:little2_prologTok
Line
Count
Source
1016
178
                  const char **nextTokPtr) {
1017
178
  int tok;
1018
178
  if (ptr >= end)
1019
2
    return XML_TOK_NONE;
1020
176
  if (MINBPC(enc) > 1) {
1021
176
    size_t n = end - ptr;
1022
176
    if (n & (MINBPC(enc) - 1)) {
1023
29
      n &= ~(MINBPC(enc) - 1);
1024
29
      if (n == 0)
1025
2
        return XML_TOK_PARTIAL;
1026
27
      end = ptr + n;
1027
27
    }
1028
176
  }
1029
174
  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
108
    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
133
  case BT_NONASCII:
1180
133
    if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {
1181
106
      ptr += MINBPC(enc);
1182
106
      tok = XML_TOK_NAME;
1183
106
      break;
1184
106
    }
1185
27
    if (IS_NAME_CHAR_MINBPC(enc, ptr)) {
1186
14
      ptr += MINBPC(enc);
1187
14
      tok = XML_TOK_NMTOKEN;
1188
14
      break;
1189
14
    }
1190
    /* fall through */
1191
21
  default:
1192
21
    *nextTokPtr = ptr;
1193
21
    return XML_TOK_INVALID;
1194
174
  }
1195
136k
  while (HAS_CHAR(enc, ptr, end)) {
1196
136k
    switch (BYTE_TYPE(enc, ptr)) {
1197
683k
      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
136k
    }
1254
136k
  }
1255
28
  return -tok;
1256
120
}
xmltok.c:big2_prologTok
Line
Count
Source
1016
137
                  const char **nextTokPtr) {
1017
137
  int tok;
1018
137
  if (ptr >= end)
1019
2
    return XML_TOK_NONE;
1020
135
  if (MINBPC(enc) > 1) {
1021
135
    size_t n = end - ptr;
1022
135
    if (n & (MINBPC(enc) - 1)) {
1023
9
      n &= ~(MINBPC(enc) - 1);
1024
9
      if (n == 0)
1025
2
        return XML_TOK_PARTIAL;
1026
7
      end = ptr + n;
1027
7
    }
1028
135
  }
1029
133
  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
92
    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
99
  case BT_NONASCII:
1180
99
    if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {
1181
77
      ptr += MINBPC(enc);
1182
77
      tok = XML_TOK_NAME;
1183
77
      break;
1184
77
    }
1185
22
    if (IS_NAME_CHAR_MINBPC(enc, ptr)) {
1186
7
      ptr += MINBPC(enc);
1187
7
      tok = XML_TOK_NMTOKEN;
1188
7
      break;
1189
7
    }
1190
    /* fall through */
1191
20
  default:
1192
20
    *nextTokPtr = ptr;
1193
20
    return XML_TOK_INVALID;
1194
133
  }
1195
2.11k
  while (HAS_CHAR(enc, ptr, end)) {
1196
2.11k
    switch (BYTE_TYPE(enc, ptr)) {
1197
10.3k
      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
2.11k
    }
1254
2.11k
  }
1255
26
  return -tok;
1256
84
}
1257
1258
static int PTRCALL
1259
PREFIX(attributeValueTok)(const ENCODING *enc, const char *ptr, const char *end,
1260
209M
                          const char **nextTokPtr) {
1261
209M
  const char *start;
1262
209M
  if (ptr >= end)
1263
11.6M
    return XML_TOK_NONE;
1264
198M
  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
198M
  start = ptr;
1273
13.0G
  while (HAS_CHAR(enc, ptr, end)) {
1274
13.0G
    switch (BYTE_TYPE(enc, ptr)) {
1275
0
#  define LEAD_CASE(n)                                                         \
1276
7.84G
  case BT_LEAD##n:                                                             \
1277
7.84G
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1278
7.84G
    break;
1279
7.84G
      LEAD_CASE(2)
1280
5.42k
      LEAD_CASE(3)
1281
4.33k
      LEAD_CASE(4)
1282
0
#  undef LEAD_CASE
1283
12.2M
    case BT_AMP:
1284
12.2M
      if (ptr == start)
1285
11.6M
        return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1286
605k
      *nextTokPtr = ptr;
1287
605k
      return XML_TOK_DATA_CHARS;
1288
13
    case BT_LT:
1289
      /* this is for inside entity references */
1290
13
      *nextTokPtr = ptr;
1291
13
      return XML_TOK_INVALID;
1292
172M
    case BT_LF:
1293
172M
      if (ptr == start) {
1294
94.2M
        *nextTokPtr = ptr + MINBPC(enc);
1295
94.2M
        return XML_TOK_DATA_NEWLINE;
1296
94.2M
      }
1297
78.4M
      *nextTokPtr = ptr;
1298
78.4M
      return XML_TOK_DATA_CHARS;
1299
84.5k
    case BT_CR:
1300
84.5k
      if (ptr == start) {
1301
56.1k
        ptr += MINBPC(enc);
1302
56.1k
        if (! HAS_CHAR(enc, ptr, end))
1303
349
          return XML_TOK_TRAILING_CR;
1304
55.8k
        if (BYTE_TYPE(enc, ptr) == BT_LF)
1305
25.8k
          ptr += MINBPC(enc);
1306
55.8k
        *nextTokPtr = ptr;
1307
55.8k
        return XML_TOK_DATA_NEWLINE;
1308
56.1k
      }
1309
28.3k
      *nextTokPtr = ptr;
1310
28.3k
      return XML_TOK_DATA_CHARS;
1311
7.16M
    case BT_S:
1312
7.16M
      if (ptr == start) {
1313
3.66M
        *nextTokPtr = ptr + MINBPC(enc);
1314
3.66M
        return XML_TOK_ATTRIBUTE_VALUE_S;
1315
3.66M
      }
1316
3.49M
      *nextTokPtr = ptr;
1317
3.49M
      return XML_TOK_DATA_CHARS;
1318
5.02G
    default:
1319
5.02G
      ptr += MINBPC(enc);
1320
5.02G
      break;
1321
13.0G
    }
1322
13.0G
  }
1323
5.95M
  *nextTokPtr = ptr;
1324
5.95M
  return XML_TOK_DATA_CHARS;
1325
198M
}
xmltok.c:normal_attributeValueTok
Line
Count
Source
1260
209M
                          const char **nextTokPtr) {
1261
209M
  const char *start;
1262
209M
  if (ptr >= end)
1263
11.6M
    return XML_TOK_NONE;
1264
198M
  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
198M
  start = ptr;
1273
13.0G
  while (HAS_CHAR(enc, ptr, end)) {
1274
13.0G
    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
7.84G
      LEAD_CASE(2)
1280
5.42k
      LEAD_CASE(3)
1281
4.33k
      LEAD_CASE(4)
1282
0
#  undef LEAD_CASE
1283
12.2M
    case BT_AMP:
1284
12.2M
      if (ptr == start)
1285
11.6M
        return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1286
605k
      *nextTokPtr = ptr;
1287
605k
      return XML_TOK_DATA_CHARS;
1288
13
    case BT_LT:
1289
      /* this is for inside entity references */
1290
13
      *nextTokPtr = ptr;
1291
13
      return XML_TOK_INVALID;
1292
172M
    case BT_LF:
1293
172M
      if (ptr == start) {
1294
94.2M
        *nextTokPtr = ptr + MINBPC(enc);
1295
94.2M
        return XML_TOK_DATA_NEWLINE;
1296
94.2M
      }
1297
78.4M
      *nextTokPtr = ptr;
1298
78.4M
      return XML_TOK_DATA_CHARS;
1299
84.5k
    case BT_CR:
1300
84.5k
      if (ptr == start) {
1301
56.1k
        ptr += MINBPC(enc);
1302
56.1k
        if (! HAS_CHAR(enc, ptr, end))
1303
349
          return XML_TOK_TRAILING_CR;
1304
55.8k
        if (BYTE_TYPE(enc, ptr) == BT_LF)
1305
25.8k
          ptr += MINBPC(enc);
1306
55.8k
        *nextTokPtr = ptr;
1307
55.8k
        return XML_TOK_DATA_NEWLINE;
1308
56.1k
      }
1309
28.3k
      *nextTokPtr = ptr;
1310
28.3k
      return XML_TOK_DATA_CHARS;
1311
7.16M
    case BT_S:
1312
7.16M
      if (ptr == start) {
1313
3.66M
        *nextTokPtr = ptr + MINBPC(enc);
1314
3.66M
        return XML_TOK_ATTRIBUTE_VALUE_S;
1315
3.66M
      }
1316
3.49M
      *nextTokPtr = ptr;
1317
3.49M
      return XML_TOK_DATA_CHARS;
1318
5.02G
    default:
1319
5.02G
      ptr += MINBPC(enc);
1320
5.02G
      break;
1321
13.0G
    }
1322
13.0G
  }
1323
5.95M
  *nextTokPtr = ptr;
1324
5.95M
  return XML_TOK_DATA_CHARS;
1325
198M
}
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
653k
                       const char **nextTokPtr) {
1330
653k
  const char *start;
1331
653k
  if (ptr >= end)
1332
5.64k
    return XML_TOK_NONE;
1333
648k
  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
648k
  start = ptr;
1342
87.0M
  while (HAS_CHAR(enc, ptr, end)) {
1343
87.0M
    switch (BYTE_TYPE(enc, ptr)) {
1344
0
#  define LEAD_CASE(n)                                                         \
1345
1.84k
  case BT_LEAD##n:                                                             \
1346
1.84k
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1347
1.84k
    break;
1348
715
      LEAD_CASE(2)
1349
689
      LEAD_CASE(3)
1350
442
      LEAD_CASE(4)
1351
0
#  undef LEAD_CASE
1352
252k
    case BT_AMP:
1353
252k
      if (ptr == start)
1354
155k
        return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1355
97.1k
      *nextTokPtr = ptr;
1356
97.1k
      return XML_TOK_DATA_CHARS;
1357
13
    case BT_PERCNT:
1358
13
      if (ptr == start) {
1359
9
        int tok = PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1360
9
        return (tok == XML_TOK_PERCENT) ? XML_TOK_INVALID : tok;
1361
9
      }
1362
4
      *nextTokPtr = ptr;
1363
4
      return XML_TOK_DATA_CHARS;
1364
192k
    case BT_LF:
1365
192k
      if (ptr == start) {
1366
150k
        *nextTokPtr = ptr + MINBPC(enc);
1367
150k
        return XML_TOK_DATA_NEWLINE;
1368
150k
      }
1369
42.6k
      *nextTokPtr = ptr;
1370
42.6k
      return XML_TOK_DATA_CHARS;
1371
199k
    case BT_CR:
1372
199k
      if (ptr == start) {
1373
109k
        ptr += MINBPC(enc);
1374
109k
        if (! HAS_CHAR(enc, ptr, end))
1375
445
          return XML_TOK_TRAILING_CR;
1376
109k
        if (BYTE_TYPE(enc, ptr) == BT_LF)
1377
2.76k
          ptr += MINBPC(enc);
1378
109k
        *nextTokPtr = ptr;
1379
109k
        return XML_TOK_DATA_NEWLINE;
1380
109k
      }
1381
89.6k
      *nextTokPtr = ptr;
1382
89.6k
      return XML_TOK_DATA_CHARS;
1383
86.4M
    default:
1384
86.4M
      ptr += MINBPC(enc);
1385
86.4M
      break;
1386
87.0M
    }
1387
87.0M
  }
1388
3.15k
  *nextTokPtr = ptr;
1389
3.15k
  return XML_TOK_DATA_CHARS;
1390
648k
}
xmltok.c:normal_entityValueTok
Line
Count
Source
1329
653k
                       const char **nextTokPtr) {
1330
653k
  const char *start;
1331
653k
  if (ptr >= end)
1332
5.64k
    return XML_TOK_NONE;
1333
648k
  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
648k
  start = ptr;
1342
87.0M
  while (HAS_CHAR(enc, ptr, end)) {
1343
87.0M
    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
715
      LEAD_CASE(2)
1349
689
      LEAD_CASE(3)
1350
442
      LEAD_CASE(4)
1351
0
#  undef LEAD_CASE
1352
252k
    case BT_AMP:
1353
252k
      if (ptr == start)
1354
155k
        return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1355
97.1k
      *nextTokPtr = ptr;
1356
97.1k
      return XML_TOK_DATA_CHARS;
1357
13
    case BT_PERCNT:
1358
13
      if (ptr == start) {
1359
9
        int tok = PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1360
9
        return (tok == XML_TOK_PERCENT) ? XML_TOK_INVALID : tok;
1361
9
      }
1362
4
      *nextTokPtr = ptr;
1363
4
      return XML_TOK_DATA_CHARS;
1364
192k
    case BT_LF:
1365
192k
      if (ptr == start) {
1366
150k
        *nextTokPtr = ptr + MINBPC(enc);
1367
150k
        return XML_TOK_DATA_NEWLINE;
1368
150k
      }
1369
42.6k
      *nextTokPtr = ptr;
1370
42.6k
      return XML_TOK_DATA_CHARS;
1371
199k
    case BT_CR:
1372
199k
      if (ptr == start) {
1373
109k
        ptr += MINBPC(enc);
1374
109k
        if (! HAS_CHAR(enc, ptr, end))
1375
445
          return XML_TOK_TRAILING_CR;
1376
109k
        if (BYTE_TYPE(enc, ptr) == BT_LF)
1377
2.76k
          ptr += MINBPC(enc);
1378
109k
        *nextTokPtr = ptr;
1379
109k
        return XML_TOK_DATA_NEWLINE;
1380
109k
      }
1381
89.6k
      *nextTokPtr = ptr;
1382
89.6k
      return XML_TOK_DATA_CHARS;
1383
86.4M
    default:
1384
86.4M
      ptr += MINBPC(enc);
1385
86.4M
      break;
1386
87.0M
    }
1387
87.0M
  }
1388
3.15k
  *nextTokPtr = ptr;
1389
3.15k
  return XML_TOK_DATA_CHARS;
1390
648k
}
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
2.40k
                   const char **badPtr) {
1449
2.40k
  ptr += MINBPC(enc);
1450
2.40k
  end -= MINBPC(enc);
1451
63.6k
  for (; HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
1452
63.6k
    switch (BYTE_TYPE(enc, ptr)) {
1453
2.15k
    case BT_DIGIT:
1454
4.99k
    case BT_HEX:
1455
5.34k
    case BT_MINUS:
1456
5.53k
    case BT_APOS:
1457
7.02k
    case BT_LPAR:
1458
7.39k
    case BT_RPAR:
1459
7.81k
    case BT_PLUS:
1460
8.19k
    case BT_COMMA:
1461
8.95k
    case BT_SOL:
1462
9.17k
    case BT_EQUALS:
1463
9.54k
    case BT_QUEST:
1464
10.1k
    case BT_CR:
1465
10.6k
    case BT_LF:
1466
11.0k
    case BT_SEMI:
1467
11.4k
    case BT_EXCL:
1468
11.6k
    case BT_AST:
1469
11.8k
    case BT_PERCNT:
1470
12.4k
    case BT_NUM:
1471
#  ifdef XML_NS
1472
    case BT_COLON:
1473
#  endif
1474
12.4k
      break;
1475
954
    case BT_S:
1476
954
      if (CHAR_MATCHES(enc, ptr, ASCII_TAB)) {
1477
1
        *badPtr = ptr;
1478
1
        return 0;
1479
1
      }
1480
953
      break;
1481
7.25k
    case BT_NAME:
1482
49.3k
    case BT_NMSTRT:
1483
49.3k
      if (! (BYTE_TO_ASCII(enc, ptr) & ~0x7f))
1484
49.3k
        break;
1485
      /* fall through */
1486
955
    default:
1487
955
      switch (BYTE_TO_ASCII(enc, ptr)) {
1488
329
      case 0x24: /* $ */
1489
938
      case 0x40: /* @ */
1490
938
        break;
1491
17
      default:
1492
17
        *badPtr = ptr;
1493
17
        return 0;
1494
955
      }
1495
938
      break;
1496
63.6k
    }
1497
63.6k
  }
1498
2.38k
  return 1;
1499
2.40k
}
xmltok.c:normal_isPublicId
Line
Count
Source
1448
2.40k
                   const char **badPtr) {
1449
2.40k
  ptr += MINBPC(enc);
1450
2.40k
  end -= MINBPC(enc);
1451
63.6k
  for (; HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
1452
63.6k
    switch (BYTE_TYPE(enc, ptr)) {
1453
2.15k
    case BT_DIGIT:
1454
4.99k
    case BT_HEX:
1455
5.34k
    case BT_MINUS:
1456
5.53k
    case BT_APOS:
1457
7.02k
    case BT_LPAR:
1458
7.39k
    case BT_RPAR:
1459
7.81k
    case BT_PLUS:
1460
8.19k
    case BT_COMMA:
1461
8.95k
    case BT_SOL:
1462
9.17k
    case BT_EQUALS:
1463
9.54k
    case BT_QUEST:
1464
10.1k
    case BT_CR:
1465
10.6k
    case BT_LF:
1466
11.0k
    case BT_SEMI:
1467
11.4k
    case BT_EXCL:
1468
11.6k
    case BT_AST:
1469
11.8k
    case BT_PERCNT:
1470
12.4k
    case BT_NUM:
1471
#  ifdef XML_NS
1472
    case BT_COLON:
1473
#  endif
1474
12.4k
      break;
1475
954
    case BT_S:
1476
954
      if (CHAR_MATCHES(enc, ptr, ASCII_TAB)) {
1477
1
        *badPtr = ptr;
1478
1
        return 0;
1479
1
      }
1480
953
      break;
1481
7.25k
    case BT_NAME:
1482
49.3k
    case BT_NMSTRT:
1483
49.3k
      if (! (BYTE_TO_ASCII(enc, ptr) & ~0x7f))
1484
49.3k
        break;
1485
      /* fall through */
1486
955
    default:
1487
955
      switch (BYTE_TO_ASCII(enc, ptr)) {
1488
329
      case 0x24: /* $ */
1489
938
      case 0x40: /* @ */
1490
938
        break;
1491
17
      default:
1492
17
        *badPtr = ptr;
1493
17
        return 0;
1494
955
      }
1495
938
      break;
1496
63.6k
    }
1497
63.6k
  }
1498
2.38k
  return 1;
1499
2.40k
}
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
2.71M
                ATTRIBUTE *atts) {
1509
2.71M
  enum { other, inName, inValue } state = inName;
1510
2.71M
  int nAtts = 0;
1511
2.71M
  int open = 0; /* defined when state == inValue;
1512
                   initialization just to shut up compilers */
1513
1514
44.5M
  for (ptr += MINBPC(enc);; ptr += MINBPC(enc)) {
1515
44.5M
    switch (BYTE_TYPE(enc, ptr)) {
1516
0
#  define START_NAME                                                           \
1517
26.4M
    if (state == other) {                                                      \
1518
3.35M
      if (nAtts < attsMax) {                                                   \
1519
1.71M
        atts[nAtts].name = ptr;                                                \
1520
1.71M
        atts[nAtts].normalized = 1;                                            \
1521
1.71M
      }                                                                        \
1522
3.35M
      state = inName;                                                          \
1523
3.35M
    }
1524
0
#  define LEAD_CASE(n)                                                         \
1525
15.1M
  case BT_LEAD##n: /* NOTE: The encoding has already been validated. */        \
1526
15.1M
    START_NAME ptr += (n - MINBPC(enc));                                       \
1527
15.1M
    break;
1528
15.1M
      LEAD_CASE(2)
1529
15.8k
      LEAD_CASE(3)
1530
1.99k
      LEAD_CASE(4)
1531
0
#  undef LEAD_CASE
1532
0
    case BT_NONASCII:
1533
9.79M
    case BT_NMSTRT:
1534
11.2M
    case BT_HEX:
1535
11.2M
      START_NAME
1536
11.2M
      break;
1537
0
#  undef START_NAME
1538
559k
    case BT_QUOT:
1539
559k
      if (state != inValue) {
1540
227k
        if (nAtts < attsMax)
1541
146k
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1542
227k
        state = inValue;
1543
227k
        open = BT_QUOT;
1544
331k
      } else if (open == BT_QUOT) {
1545
227k
        state = other;
1546
227k
        if (nAtts < attsMax)
1547
146k
          atts[nAtts].valueEnd = ptr;
1548
227k
        nAtts++;
1549
227k
      }
1550
559k
      break;
1551
6.26M
    case BT_APOS:
1552
6.26M
      if (state != inValue) {
1553
3.12M
        if (nAtts < attsMax)
1554
1.56M
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1555
3.12M
        state = inValue;
1556
3.12M
        open = BT_APOS;
1557
3.13M
      } else if (open == BT_APOS) {
1558
3.12M
        state = other;
1559
3.12M
        if (nAtts < attsMax)
1560
1.56M
          atts[nAtts].valueEnd = ptr;
1561
3.12M
        nAtts++;
1562
3.12M
      }
1563
6.26M
      break;
1564
344k
    case BT_AMP:
1565
344k
      if (nAtts < attsMax)
1566
245k
        atts[nAtts].normalized = 0;
1567
344k
      break;
1568
2.28M
    case BT_S:
1569
2.28M
      if (state == inName)
1570
61.2k
        state = other;
1571
2.22M
      else if (state == inValue && nAtts < attsMax && atts[nAtts].normalized
1572
2.22M
               && (ptr == atts[nAtts].valuePtr
1573
56.3k
                   || BYTE_TO_ASCII(enc, ptr) != ASCII_SPACE
1574
56.3k
                   || BYTE_TO_ASCII(enc, ptr + MINBPC(enc)) == ASCII_SPACE
1575
56.3k
                   || BYTE_TYPE(enc, ptr + MINBPC(enc)) == open))
1576
55.5k
        atts[nAtts].normalized = 0;
1577
2.28M
      break;
1578
1.61M
    case BT_CR:
1579
1.83M
    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
1.83M
      if (state == inName)
1583
9.16k
        state = other;
1584
1.82M
      else if (state == inValue && nAtts < attsMax)
1585
80.7k
        atts[nAtts].normalized = 0;
1586
1.83M
      break;
1587
2.70M
    case BT_GT:
1588
2.72M
    case BT_SOL:
1589
2.72M
      if (state != inValue)
1590
2.71M
        return nAtts;
1591
3.47k
      break;
1592
4.09M
    default:
1593
4.09M
      break;
1594
44.5M
    }
1595
44.5M
  }
1596
  /* not reached */
1597
2.71M
}
xmltok.c:normal_getAtts
Line
Count
Source
1508
2.71M
                ATTRIBUTE *atts) {
1509
2.71M
  enum { other, inName, inValue } state = inName;
1510
2.71M
  int nAtts = 0;
1511
2.71M
  int open = 0; /* defined when state == inValue;
1512
                   initialization just to shut up compilers */
1513
1514
44.5M
  for (ptr += MINBPC(enc);; ptr += MINBPC(enc)) {
1515
44.5M
    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
15.1M
      LEAD_CASE(2)
1529
15.8k
      LEAD_CASE(3)
1530
1.99k
      LEAD_CASE(4)
1531
0
#  undef LEAD_CASE
1532
0
    case BT_NONASCII:
1533
9.79M
    case BT_NMSTRT:
1534
11.2M
    case BT_HEX:
1535
11.2M
      START_NAME
1536
11.2M
      break;
1537
0
#  undef START_NAME
1538
559k
    case BT_QUOT:
1539
559k
      if (state != inValue) {
1540
227k
        if (nAtts < attsMax)
1541
146k
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1542
227k
        state = inValue;
1543
227k
        open = BT_QUOT;
1544
331k
      } else if (open == BT_QUOT) {
1545
227k
        state = other;
1546
227k
        if (nAtts < attsMax)
1547
146k
          atts[nAtts].valueEnd = ptr;
1548
227k
        nAtts++;
1549
227k
      }
1550
559k
      break;
1551
6.26M
    case BT_APOS:
1552
6.26M
      if (state != inValue) {
1553
3.12M
        if (nAtts < attsMax)
1554
1.56M
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1555
3.12M
        state = inValue;
1556
3.12M
        open = BT_APOS;
1557
3.13M
      } else if (open == BT_APOS) {
1558
3.12M
        state = other;
1559
3.12M
        if (nAtts < attsMax)
1560
1.56M
          atts[nAtts].valueEnd = ptr;
1561
3.12M
        nAtts++;
1562
3.12M
      }
1563
6.26M
      break;
1564
344k
    case BT_AMP:
1565
344k
      if (nAtts < attsMax)
1566
245k
        atts[nAtts].normalized = 0;
1567
344k
      break;
1568
2.28M
    case BT_S:
1569
2.28M
      if (state == inName)
1570
61.2k
        state = other;
1571
2.22M
      else if (state == inValue && nAtts < attsMax && atts[nAtts].normalized
1572
2.22M
               && (ptr == atts[nAtts].valuePtr
1573
56.3k
                   || BYTE_TO_ASCII(enc, ptr) != ASCII_SPACE
1574
56.3k
                   || BYTE_TO_ASCII(enc, ptr + MINBPC(enc)) == ASCII_SPACE
1575
56.3k
                   || BYTE_TYPE(enc, ptr + MINBPC(enc)) == open))
1576
55.5k
        atts[nAtts].normalized = 0;
1577
2.28M
      break;
1578
1.61M
    case BT_CR:
1579
1.83M
    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
1.83M
      if (state == inName)
1583
9.16k
        state = other;
1584
1.82M
      else if (state == inValue && nAtts < attsMax)
1585
80.7k
        atts[nAtts].normalized = 0;
1586
1.83M
      break;
1587
2.70M
    case BT_GT:
1588
2.72M
    case BT_SOL:
1589
2.72M
      if (state != inValue)
1590
2.71M
        return nAtts;
1591
3.47k
      break;
1592
4.09M
    default:
1593
4.09M
      break;
1594
44.5M
    }
1595
44.5M
  }
1596
  /* not reached */
1597
2.71M
}
Unexecuted instantiation: xmltok.c:little2_getAtts
Unexecuted instantiation: xmltok.c:big2_getAtts
1598
1599
static int PTRFASTCALL
1600
157k
PREFIX(charRefNumber)(const ENCODING *enc, const char *ptr) {
1601
157k
  int result = 0;
1602
  /* skip &# */
1603
157k
  UNUSED_P(enc);
1604
157k
  ptr += 2 * MINBPC(enc);
1605
157k
  if (CHAR_MATCHES(enc, ptr, ASCII_x)) {
1606
262k
    for (ptr += MINBPC(enc); ! CHAR_MATCHES(enc, ptr, ASCII_SEMI);
1607
213k
         ptr += MINBPC(enc)) {
1608
213k
      int c = BYTE_TO_ASCII(enc, ptr);
1609
213k
      switch (c) {
1610
15.1k
      case ASCII_0:
1611
22.8k
      case ASCII_1:
1612
33.0k
      case ASCII_2:
1613
38.4k
      case ASCII_3:
1614
41.9k
      case ASCII_4:
1615
55.5k
      case ASCII_5:
1616
57.0k
      case ASCII_6:
1617
60.2k
      case ASCII_7:
1618
68.1k
      case ASCII_8:
1619
79.3k
      case ASCII_9:
1620
79.3k
        result <<= 4;
1621
79.3k
        result |= (c - ASCII_0);
1622
79.3k
        break;
1623
1.20k
      case ASCII_A:
1624
16.3k
      case ASCII_B:
1625
27.8k
      case ASCII_C:
1626
32.0k
      case ASCII_D:
1627
38.5k
      case ASCII_E:
1628
87.8k
      case ASCII_F:
1629
87.8k
        result <<= 4;
1630
87.8k
        result += 10 + (c - ASCII_A);
1631
87.8k
        break;
1632
1.07k
      case ASCII_a:
1633
28.6k
      case ASCII_b:
1634
29.3k
      case ASCII_c:
1635
29.6k
      case ASCII_d:
1636
33.2k
      case ASCII_e:
1637
46.3k
      case ASCII_f:
1638
46.3k
        result <<= 4;
1639
46.3k
        result += 10 + (c - ASCII_a);
1640
46.3k
        break;
1641
213k
      }
1642
213k
      if (result >= 0x110000)
1643
20
        return -1;
1644
213k
    }
1645
109k
  } else {
1646
621k
    for (; ! CHAR_MATCHES(enc, ptr, ASCII_SEMI); ptr += MINBPC(enc)) {
1647
511k
      int c = BYTE_TO_ASCII(enc, ptr);
1648
511k
      result *= 10;
1649
511k
      result += (c - ASCII_0);
1650
511k
      if (result >= 0x110000)
1651
6
        return -1;
1652
511k
    }
1653
109k
  }
1654
157k
  return checkCharRefNumber(result);
1655
157k
}
xmltok.c:normal_charRefNumber
Line
Count
Source
1600
157k
PREFIX(charRefNumber)(const ENCODING *enc, const char *ptr) {
1601
157k
  int result = 0;
1602
  /* skip &# */
1603
157k
  UNUSED_P(enc);
1604
157k
  ptr += 2 * MINBPC(enc);
1605
157k
  if (CHAR_MATCHES(enc, ptr, ASCII_x)) {
1606
262k
    for (ptr += MINBPC(enc); ! CHAR_MATCHES(enc, ptr, ASCII_SEMI);
1607
213k
         ptr += MINBPC(enc)) {
1608
213k
      int c = BYTE_TO_ASCII(enc, ptr);
1609
213k
      switch (c) {
1610
15.1k
      case ASCII_0:
1611
22.8k
      case ASCII_1:
1612
33.0k
      case ASCII_2:
1613
38.4k
      case ASCII_3:
1614
41.9k
      case ASCII_4:
1615
55.5k
      case ASCII_5:
1616
57.0k
      case ASCII_6:
1617
60.2k
      case ASCII_7:
1618
68.1k
      case ASCII_8:
1619
79.3k
      case ASCII_9:
1620
79.3k
        result <<= 4;
1621
79.3k
        result |= (c - ASCII_0);
1622
79.3k
        break;
1623
1.20k
      case ASCII_A:
1624
16.3k
      case ASCII_B:
1625
27.8k
      case ASCII_C:
1626
32.0k
      case ASCII_D:
1627
38.5k
      case ASCII_E:
1628
87.8k
      case ASCII_F:
1629
87.8k
        result <<= 4;
1630
87.8k
        result += 10 + (c - ASCII_A);
1631
87.8k
        break;
1632
1.07k
      case ASCII_a:
1633
28.6k
      case ASCII_b:
1634
29.3k
      case ASCII_c:
1635
29.6k
      case ASCII_d:
1636
33.2k
      case ASCII_e:
1637
46.3k
      case ASCII_f:
1638
46.3k
        result <<= 4;
1639
46.3k
        result += 10 + (c - ASCII_a);
1640
46.3k
        break;
1641
213k
      }
1642
213k
      if (result >= 0x110000)
1643
20
        return -1;
1644
213k
    }
1645
109k
  } else {
1646
621k
    for (; ! CHAR_MATCHES(enc, ptr, ASCII_SEMI); ptr += MINBPC(enc)) {
1647
511k
      int c = BYTE_TO_ASCII(enc, ptr);
1648
511k
      result *= 10;
1649
511k
      result += (c - ASCII_0);
1650
511k
      if (result >= 0x110000)
1651
6
        return -1;
1652
511k
    }
1653
109k
  }
1654
157k
  return checkCharRefNumber(result);
1655
157k
}
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
12.7M
                             const char *end) {
1660
12.7M
  UNUSED_P(enc);
1661
12.7M
  switch ((end - ptr) / MINBPC(enc)) {
1662
11.4k
  case 2:
1663
11.4k
    if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_t)) {
1664
3.99k
      switch (BYTE_TO_ASCII(enc, ptr)) {
1665
3.26k
      case ASCII_l:
1666
3.26k
        return ASCII_LT;
1667
9
      case ASCII_g:
1668
9
        return ASCII_GT;
1669
3.99k
      }
1670
3.99k
    }
1671
8.20k
    break;
1672
8.20k
  case 3:
1673
3.43k
    if (CHAR_MATCHES(enc, ptr, ASCII_a)) {
1674
1.63k
      ptr += MINBPC(enc);
1675
1.63k
      if (CHAR_MATCHES(enc, ptr, ASCII_m)) {
1676
970
        ptr += MINBPC(enc);
1677
970
        if (CHAR_MATCHES(enc, ptr, ASCII_p))
1678
523
          return ASCII_AMP;
1679
970
      }
1680
1.63k
    }
1681
2.90k
    break;
1682
8.66k
  case 4:
1683
8.66k
    switch (BYTE_TO_ASCII(enc, ptr)) {
1684
1.09k
    case ASCII_q:
1685
1.09k
      ptr += MINBPC(enc);
1686
1.09k
      if (CHAR_MATCHES(enc, ptr, ASCII_u)) {
1687
764
        ptr += MINBPC(enc);
1688
764
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1689
523
          ptr += MINBPC(enc);
1690
523
          if (CHAR_MATCHES(enc, ptr, ASCII_t))
1691
253
            return ASCII_QUOT;
1692
523
        }
1693
764
      }
1694
842
      break;
1695
7.13k
    case ASCII_a:
1696
7.13k
      ptr += MINBPC(enc);
1697
7.13k
      if (CHAR_MATCHES(enc, ptr, ASCII_p)) {
1698
6.91k
        ptr += MINBPC(enc);
1699
6.91k
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1700
553
          ptr += MINBPC(enc);
1701
553
          if (CHAR_MATCHES(enc, ptr, ASCII_s))
1702
218
            return ASCII_APOS;
1703
553
        }
1704
6.91k
      }
1705
6.91k
      break;
1706
8.66k
    }
1707
12.7M
  }
1708
12.7M
  return 0;
1709
12.7M
}
xmltok.c:normal_predefinedEntityName
Line
Count
Source
1659
12.7M
                             const char *end) {
1660
12.7M
  UNUSED_P(enc);
1661
12.7M
  switch ((end - ptr) / MINBPC(enc)) {
1662
11.4k
  case 2:
1663
11.4k
    if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_t)) {
1664
3.99k
      switch (BYTE_TO_ASCII(enc, ptr)) {
1665
3.26k
      case ASCII_l:
1666
3.26k
        return ASCII_LT;
1667
9
      case ASCII_g:
1668
9
        return ASCII_GT;
1669
3.99k
      }
1670
3.99k
    }
1671
8.20k
    break;
1672
8.20k
  case 3:
1673
3.43k
    if (CHAR_MATCHES(enc, ptr, ASCII_a)) {
1674
1.63k
      ptr += MINBPC(enc);
1675
1.63k
      if (CHAR_MATCHES(enc, ptr, ASCII_m)) {
1676
970
        ptr += MINBPC(enc);
1677
970
        if (CHAR_MATCHES(enc, ptr, ASCII_p))
1678
523
          return ASCII_AMP;
1679
970
      }
1680
1.63k
    }
1681
2.90k
    break;
1682
8.66k
  case 4:
1683
8.66k
    switch (BYTE_TO_ASCII(enc, ptr)) {
1684
1.09k
    case ASCII_q:
1685
1.09k
      ptr += MINBPC(enc);
1686
1.09k
      if (CHAR_MATCHES(enc, ptr, ASCII_u)) {
1687
764
        ptr += MINBPC(enc);
1688
764
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1689
523
          ptr += MINBPC(enc);
1690
523
          if (CHAR_MATCHES(enc, ptr, ASCII_t))
1691
253
            return ASCII_QUOT;
1692
523
        }
1693
764
      }
1694
842
      break;
1695
7.13k
    case ASCII_a:
1696
7.13k
      ptr += MINBPC(enc);
1697
7.13k
      if (CHAR_MATCHES(enc, ptr, ASCII_p)) {
1698
6.91k
        ptr += MINBPC(enc);
1699
6.91k
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1700
553
          ptr += MINBPC(enc);
1701
553
          if (CHAR_MATCHES(enc, ptr, ASCII_s))
1702
218
            return ASCII_APOS;
1703
553
        }
1704
6.91k
      }
1705
6.91k
      break;
1706
8.66k
    }
1707
12.7M
  }
1708
12.7M
  return 0;
1709
12.7M
}
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
214k
                         const char *end1, const char *ptr2) {
1714
214k
  UNUSED_P(enc);
1715
1.08M
  for (; *ptr2; ptr1 += MINBPC(enc), ptr2++) {
1716
947k
    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
49
      return 0; /* LCOV_EXCL_LINE */
1723
49
    }
1724
947k
    if (! CHAR_MATCHES(enc, ptr1, *ptr2))
1725
79.9k
      return 0;
1726
947k
  }
1727
134k
  return ptr1 == end1;
1728
214k
}
xmltok.c:normal_nameMatchesAscii
Line
Count
Source
1713
214k
                         const char *end1, const char *ptr2) {
1714
214k
  UNUSED_P(enc);
1715
1.08M
  for (; *ptr2; ptr1 += MINBPC(enc), ptr2++) {
1716
947k
    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
49
      return 0; /* LCOV_EXCL_LINE */
1723
49
    }
1724
947k
    if (! CHAR_MATCHES(enc, ptr1, *ptr2))
1725
79.9k
      return 0;
1726
947k
  }
1727
134k
  return ptr1 == end1;
1728
214k
}
Unexecuted instantiation: xmltok.c:little2_nameMatchesAscii
Unexecuted instantiation: xmltok.c:big2_nameMatchesAscii
1729
1730
static int PTRFASTCALL
1731
2.87M
PREFIX(nameLength)(const ENCODING *enc, const char *ptr) {
1732
2.87M
  const char *start = ptr;
1733
15.8M
  for (;;) {
1734
15.8M
    switch (BYTE_TYPE(enc, ptr)) {
1735
0
#  define LEAD_CASE(n)                                                         \
1736
5.84M
  case BT_LEAD##n:                                                             \
1737
5.84M
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1738
5.84M
    break;
1739
5.83M
      LEAD_CASE(2)
1740
11.0k
      LEAD_CASE(3)
1741
0
      LEAD_CASE(4)
1742
0
#  undef LEAD_CASE
1743
0
    case BT_NONASCII:
1744
6.13M
    case BT_NMSTRT:
1745
#  ifdef XML_NS
1746
    case BT_COLON:
1747
#  endif
1748
7.07M
    case BT_HEX:
1749
7.10M
    case BT_DIGIT:
1750
7.12M
    case BT_NAME:
1751
7.12M
    case BT_MINUS:
1752
7.12M
      ptr += MINBPC(enc);
1753
7.12M
      break;
1754
2.87M
    default:
1755
2.87M
      return (int)(ptr - start);
1756
15.8M
    }
1757
15.8M
  }
1758
2.87M
}
xmltok.c:normal_nameLength
Line
Count
Source
1731
2.87M
PREFIX(nameLength)(const ENCODING *enc, const char *ptr) {
1732
2.87M
  const char *start = ptr;
1733
15.8M
  for (;;) {
1734
15.8M
    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
5.83M
      LEAD_CASE(2)
1740
11.0k
      LEAD_CASE(3)
1741
0
      LEAD_CASE(4)
1742
0
#  undef LEAD_CASE
1743
0
    case BT_NONASCII:
1744
6.13M
    case BT_NMSTRT:
1745
#  ifdef XML_NS
1746
    case BT_COLON:
1747
#  endif
1748
7.07M
    case BT_HEX:
1749
7.10M
    case BT_DIGIT:
1750
7.12M
    case BT_NAME:
1751
7.12M
    case BT_MINUS:
1752
7.12M
      ptr += MINBPC(enc);
1753
7.12M
      break;
1754
2.87M
    default:
1755
2.87M
      return (int)(ptr - start);
1756
15.8M
    }
1757
15.8M
  }
1758
2.87M
}
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
26.0k
                       POSITION *pos) {
1778
111M
  while (HAS_CHAR(enc, ptr, end)) {
1779
111M
    switch (BYTE_TYPE(enc, ptr)) {
1780
0
#  define LEAD_CASE(n)                                                         \
1781
15.0k
  case BT_LEAD##n:                                                             \
1782
15.0k
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1783
15.0k
    pos->columnNumber++;                                                       \
1784
15.0k
    break;
1785
3.95k
      LEAD_CASE(2)
1786
10.2k
      LEAD_CASE(3)
1787
804
      LEAD_CASE(4)
1788
0
#  undef LEAD_CASE
1789
330k
    case BT_LF:
1790
330k
      pos->columnNumber = 0;
1791
330k
      pos->lineNumber++;
1792
330k
      ptr += MINBPC(enc);
1793
330k
      break;
1794
307k
    case BT_CR:
1795
307k
      pos->lineNumber++;
1796
307k
      ptr += MINBPC(enc);
1797
307k
      if (HAS_CHAR(enc, ptr, end) && BYTE_TYPE(enc, ptr) == BT_LF)
1798
29.4k
        ptr += MINBPC(enc);
1799
307k
      pos->columnNumber = 0;
1800
307k
      break;
1801
111M
    default:
1802
111M
      ptr += MINBPC(enc);
1803
111M
      pos->columnNumber++;
1804
111M
      break;
1805
111M
    }
1806
111M
  }
1807
26.0k
}
xmltok.c:normal_updatePosition
Line
Count
Source
1777
25.4k
                       POSITION *pos) {
1778
111M
  while (HAS_CHAR(enc, ptr, end)) {
1779
111M
    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
3.95k
      LEAD_CASE(2)
1786
10.2k
      LEAD_CASE(3)
1787
804
      LEAD_CASE(4)
1788
0
#  undef LEAD_CASE
1789
330k
    case BT_LF:
1790
330k
      pos->columnNumber = 0;
1791
330k
      pos->lineNumber++;
1792
330k
      ptr += MINBPC(enc);
1793
330k
      break;
1794
307k
    case BT_CR:
1795
307k
      pos->lineNumber++;
1796
307k
      ptr += MINBPC(enc);
1797
307k
      if (HAS_CHAR(enc, ptr, end) && BYTE_TYPE(enc, ptr) == BT_LF)
1798
29.4k
        ptr += MINBPC(enc);
1799
307k
      pos->columnNumber = 0;
1800
307k
      break;
1801
110M
    default:
1802
110M
      ptr += MINBPC(enc);
1803
110M
      pos->columnNumber++;
1804
110M
      break;
1805
111M
    }
1806
111M
  }
1807
25.4k
}
xmltok.c:little2_updatePosition
Line
Count
Source
1777
331
                       POSITION *pos) {
1778
136k
  while (HAS_CHAR(enc, ptr, end)) {
1779
136k
    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
136k
    default:
1802
136k
      ptr += MINBPC(enc);
1803
136k
      pos->columnNumber++;
1804
136k
      break;
1805
136k
    }
1806
136k
  }
1807
331
}
xmltok.c:big2_updatePosition
Line
Count
Source
1777
250
                       POSITION *pos) {
1778
1.83k
  while (HAS_CHAR(enc, ptr, end)) {
1779
1.83k
    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.83k
    default:
1802
1.83k
      ptr += MINBPC(enc);
1803
1.83k
      pos->columnNumber++;
1804
1.83k
      break;
1805
1.83k
    }
1806
1.83k
  }
1807
250
}
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 */