Coverage Report

Created: 2025-10-28 06:39

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