Coverage Report

Created: 2025-12-14 07:09

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
66
#    define IS_INVALID_CHAR(enc, ptr, n) (0)
46
#  endif
47
48
#  define INVALID_LEAD_CASE(n, ptr, nextTokPtr)                                \
49
749k
  case BT_LEAD##n:                                                             \
50
749k
    if (end - ptr < n)                                                         \
51
749k
      return XML_TOK_PARTIAL_CHAR;                                             \
52
749k
    if (IS_INVALID_CHAR(enc, ptr, n)) {                                        \
53
79
      *(nextTokPtr) = (ptr);                                                   \
54
79
      return XML_TOK_INVALID;                                                  \
55
79
    }                                                                          \
56
749k
    ptr += n;                                                                  \
57
749k
    break;
58
59
#  define INVALID_CASES(ptr, nextTokPtr)                                       \
60
329k
    INVALID_LEAD_CASE(2, ptr, nextTokPtr)                                      \
61
328k
    INVALID_LEAD_CASE(3, ptr, nextTokPtr)                                      \
62
280k
    INVALID_LEAD_CASE(4, ptr, nextTokPtr)                                      \
63
140k
  case BT_NONXML:                                                              \
64
48
  case BT_MALFORM:                                                             \
65
83
  case BT_TRAIL:                                                               \
66
83
    *(nextTokPtr) = (ptr);                                                     \
67
83
    return XML_TOK_INVALID;
68
69
#  define CHECK_NAME_CASE(n, enc, ptr, end, nextTokPtr)                        \
70
336k
  case BT_LEAD##n:                                                             \
71
336k
    if (end - ptr < n)                                                         \
72
335k
      return XML_TOK_PARTIAL_CHAR;                                             \
73
335k
    if (IS_INVALID_CHAR(enc, ptr, n) || ! IS_NAME_CHAR(enc, ptr, n)) {         \
74
264
      *nextTokPtr = ptr;                                                       \
75
264
      return XML_TOK_INVALID;                                                  \
76
264
    }                                                                          \
77
335k
    ptr += n;                                                                  \
78
335k
    break;
79
80
#  define CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)                          \
81
30.2M
  case BT_NONASCII:                                                            \
82
30.2M
    if (! IS_NAME_CHAR_MINBPC(enc, ptr)) {                                     \
83
44
      *nextTokPtr = ptr;                                                       \
84
44
      return XML_TOK_INVALID;                                                  \
85
44
    }                                                                          \
86
30.2M
    /* fall through */                                                         \
87
30.2M
  case BT_NMSTRT:                                                              \
88
27.7M
  case BT_HEX:                                                                 \
89
29.9M
  case BT_DIGIT:                                                               \
90
30.0M
  case BT_NAME:                                                                \
91
30.2M
  case BT_MINUS:                                                               \
92
30.2M
    ptr += MINBPC(enc);                                                        \
93
30.2M
    break;                                                                     \
94
30.2M
    CHECK_NAME_CASE(2, enc, ptr, end, nextTokPtr)                              \
95
210k
    CHECK_NAME_CASE(3, enc, ptr, end, nextTokPtr)                              \
96
125k
    CHECK_NAME_CASE(4, enc, ptr, end, nextTokPtr)
97
98
#  define CHECK_NMSTRT_CASE(n, enc, ptr, end, nextTokPtr)                      \
99
172k
  case BT_LEAD##n:                                                             \
100
172k
    if ((end) - (ptr) < (n))                                                   \
101
172k
      return XML_TOK_PARTIAL_CHAR;                                             \
102
172k
    if (IS_INVALID_CHAR(enc, ptr, n) || ! IS_NMSTRT_CHAR(enc, ptr, n)) {       \
103
128
      *nextTokPtr = ptr;                                                       \
104
128
      return XML_TOK_INVALID;                                                  \
105
128
    }                                                                          \
106
172k
    ptr += n;                                                                  \
107
172k
    break;
108
109
#  define CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)                        \
110
2.78M
  case BT_NONASCII:                                                            \
111
2.78M
    if (! IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {                                   \
112
0
      *nextTokPtr = ptr;                                                       \
113
0
      return XML_TOK_INVALID;                                                  \
114
0
    }                                                                          \
115
2.78M
    /* fall through */                                                         \
116
2.78M
  case BT_NMSTRT:                                                              \
117
2.78M
  case BT_HEX:                                                                 \
118
2.78M
    ptr += MINBPC(enc);                                                        \
119
2.78M
    break;                                                                     \
120
2.78M
    CHECK_NMSTRT_CASE(2, enc, ptr, end, nextTokPtr)                            \
121
88.2k
    CHECK_NMSTRT_CASE(3, enc, ptr, end, nextTokPtr)                            \
122
84.1k
    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
301M
    ((end) - (ptr) >= ((count) * MINBPC(enc)))
130
131
10.7M
#  define HAS_CHAR(enc, ptr, end) HAS_CHARS(enc, ptr, end, 1)
132
133
#  define REQUIRE_CHARS(enc, ptr, end, count)                                  \
134
27.4M
    {                                                                          \
135
27.4M
      if (! HAS_CHARS(enc, ptr, end, count)) {                                 \
136
569
        return XML_TOK_PARTIAL;                                                \
137
569
      }                                                                        \
138
27.4M
    }
139
140
27.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
16.5k
                    const char **nextTokPtr) {
147
16.5k
  if (HAS_CHAR(enc, ptr, end)) {
148
16.5k
    if (! CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
149
11
      *nextTokPtr = ptr;
150
11
      return XML_TOK_INVALID;
151
11
    }
152
16.5k
    ptr += MINBPC(enc);
153
2.13M
    while (HAS_CHAR(enc, ptr, end)) {
154
2.13M
      switch (BYTE_TYPE(enc, ptr)) {
155
135k
        INVALID_CASES(ptr, nextTokPtr)
156
25.7k
      case BT_MINUS:
157
25.7k
        ptr += MINBPC(enc);
158
25.7k
        REQUIRE_CHAR(enc, ptr, end);
159
25.7k
        if (CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
160
16.4k
          ptr += MINBPC(enc);
161
16.4k
          REQUIRE_CHAR(enc, ptr, end);
162
16.4k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
163
8
            *nextTokPtr = ptr;
164
8
            return XML_TOK_INVALID;
165
8
          }
166
16.3k
          *nextTokPtr = ptr + MINBPC(enc);
167
16.3k
          return XML_TOK_COMMENT;
168
16.4k
        }
169
9.35k
        break;
170
2.04M
      default:
171
2.04M
        ptr += MINBPC(enc);
172
2.04M
        break;
173
2.13M
      }
174
2.13M
    }
175
16.5k
  }
176
62
  return XML_TOK_PARTIAL;
177
16.5k
}
xmltok.c:normal_scanComment
Line
Count
Source
146
16.5k
                    const char **nextTokPtr) {
147
16.5k
  if (HAS_CHAR(enc, ptr, end)) {
148
16.5k
    if (! CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
149
11
      *nextTokPtr = ptr;
150
11
      return XML_TOK_INVALID;
151
11
    }
152
16.5k
    ptr += MINBPC(enc);
153
2.13M
    while (HAS_CHAR(enc, ptr, end)) {
154
2.13M
      switch (BYTE_TYPE(enc, ptr)) {
155
135k
        INVALID_CASES(ptr, nextTokPtr)
156
25.7k
      case BT_MINUS:
157
25.7k
        ptr += MINBPC(enc);
158
25.7k
        REQUIRE_CHAR(enc, ptr, end);
159
25.7k
        if (CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
160
16.4k
          ptr += MINBPC(enc);
161
16.4k
          REQUIRE_CHAR(enc, ptr, end);
162
16.4k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
163
8
            *nextTokPtr = ptr;
164
8
            return XML_TOK_INVALID;
165
8
          }
166
16.3k
          *nextTokPtr = ptr + MINBPC(enc);
167
16.3k
          return XML_TOK_COMMENT;
168
16.4k
        }
169
9.35k
        break;
170
2.04M
      default:
171
2.04M
        ptr += MINBPC(enc);
172
2.04M
        break;
173
2.13M
      }
174
2.13M
    }
175
16.5k
  }
176
62
  return XML_TOK_PARTIAL;
177
16.5k
}
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
78.5k
                 const char **nextTokPtr) {
184
78.5k
  REQUIRE_CHAR(enc, ptr, end);
185
78.5k
  switch (BYTE_TYPE(enc, ptr)) {
186
2.06k
  case BT_MINUS:
187
2.06k
    return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
188
3
  case BT_LSQB:
189
3
    *nextTokPtr = ptr + MINBPC(enc);
190
3
    return XML_TOK_COND_SECT_OPEN;
191
1.15k
  case BT_NMSTRT:
192
76.4k
  case BT_HEX:
193
76.4k
    ptr += MINBPC(enc);
194
76.4k
    break;
195
4
  default:
196
4
    *nextTokPtr = ptr;
197
4
    return XML_TOK_INVALID;
198
78.5k
  }
199
558k
  while (HAS_CHAR(enc, ptr, end)) {
200
558k
    switch (BYTE_TYPE(enc, ptr)) {
201
17
    case BT_PERCNT:
202
17
      REQUIRE_CHARS(enc, ptr, end, 2);
203
      /* don't allow <!ENTITY% foo "whatever"> */
204
17
      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
17
      }
212
      /* fall through */
213
49.1k
    case BT_S:
214
71.7k
    case BT_CR:
215
76.4k
    case BT_LF:
216
76.4k
      *nextTokPtr = ptr;
217
76.4k
      return XML_TOK_DECL_OPEN;
218
435k
    case BT_NMSTRT:
219
482k
    case BT_HEX:
220
482k
      ptr += MINBPC(enc);
221
482k
      break;
222
16
    default:
223
16
      *nextTokPtr = ptr;
224
16
      return XML_TOK_INVALID;
225
558k
    }
226
558k
  }
227
62
  return XML_TOK_PARTIAL;
228
76.4k
}
xmltok.c:normal_scanDecl
Line
Count
Source
183
78.5k
                 const char **nextTokPtr) {
184
78.5k
  REQUIRE_CHAR(enc, ptr, end);
185
78.5k
  switch (BYTE_TYPE(enc, ptr)) {
186
2.06k
  case BT_MINUS:
187
2.06k
    return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
188
3
  case BT_LSQB:
189
3
    *nextTokPtr = ptr + MINBPC(enc);
190
3
    return XML_TOK_COND_SECT_OPEN;
191
1.15k
  case BT_NMSTRT:
192
76.4k
  case BT_HEX:
193
76.4k
    ptr += MINBPC(enc);
194
76.4k
    break;
195
4
  default:
196
4
    *nextTokPtr = ptr;
197
4
    return XML_TOK_INVALID;
198
78.5k
  }
199
558k
  while (HAS_CHAR(enc, ptr, end)) {
200
558k
    switch (BYTE_TYPE(enc, ptr)) {
201
17
    case BT_PERCNT:
202
17
      REQUIRE_CHARS(enc, ptr, end, 2);
203
      /* don't allow <!ENTITY% foo "whatever"> */
204
17
      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
17
      }
212
      /* fall through */
213
49.1k
    case BT_S:
214
71.7k
    case BT_CR:
215
76.4k
    case BT_LF:
216
76.4k
      *nextTokPtr = ptr;
217
76.4k
      return XML_TOK_DECL_OPEN;
218
435k
    case BT_NMSTRT:
219
482k
    case BT_HEX:
220
482k
      ptr += MINBPC(enc);
221
482k
      break;
222
16
    default:
223
16
      *nextTokPtr = ptr;
224
16
      return XML_TOK_INVALID;
225
558k
    }
226
558k
  }
227
62
  return XML_TOK_PARTIAL;
228
76.4k
}
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
40.7k
                      int *tokPtr) {
233
40.7k
  int upper = 0;
234
40.7k
  UNUSED_P(enc);
235
40.7k
  *tokPtr = XML_TOK_PI;
236
40.7k
  if (end - ptr != MINBPC(enc) * 3)
237
26.4k
    return 1;
238
14.2k
  switch (BYTE_TO_ASCII(enc, ptr)) {
239
9.57k
  case ASCII_x:
240
9.57k
    break;
241
1.76k
  case ASCII_X:
242
1.76k
    upper = 1;
243
1.76k
    break;
244
2.90k
  default:
245
2.90k
    return 1;
246
14.2k
  }
247
11.3k
  ptr += MINBPC(enc);
248
11.3k
  switch (BYTE_TO_ASCII(enc, ptr)) {
249
1.90k
  case ASCII_m:
250
1.90k
    break;
251
1.43k
  case ASCII_M:
252
1.43k
    upper = 1;
253
1.43k
    break;
254
7.98k
  default:
255
7.98k
    return 1;
256
11.3k
  }
257
3.34k
  ptr += MINBPC(enc);
258
3.34k
  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
2.19k
  default:
265
2.19k
    return 1;
266
3.34k
  }
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
40.7k
                      int *tokPtr) {
233
40.7k
  int upper = 0;
234
40.7k
  UNUSED_P(enc);
235
40.7k
  *tokPtr = XML_TOK_PI;
236
40.7k
  if (end - ptr != MINBPC(enc) * 3)
237
26.4k
    return 1;
238
14.2k
  switch (BYTE_TO_ASCII(enc, ptr)) {
239
9.57k
  case ASCII_x:
240
9.57k
    break;
241
1.76k
  case ASCII_X:
242
1.76k
    upper = 1;
243
1.76k
    break;
244
2.90k
  default:
245
2.90k
    return 1;
246
14.2k
  }
247
11.3k
  ptr += MINBPC(enc);
248
11.3k
  switch (BYTE_TO_ASCII(enc, ptr)) {
249
1.90k
  case ASCII_m:
250
1.90k
    break;
251
1.43k
  case ASCII_M:
252
1.43k
    upper = 1;
253
1.43k
    break;
254
7.98k
  default:
255
7.98k
    return 1;
256
11.3k
  }
257
3.34k
  ptr += MINBPC(enc);
258
3.34k
  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
2.19k
  default:
265
2.19k
    return 1;
266
3.34k
  }
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
40.8k
               const char **nextTokPtr) {
278
40.8k
  int tok;
279
40.8k
  const char *target = ptr;
280
40.8k
  REQUIRE_CHAR(enc, ptr, end);
281
40.8k
  switch (BYTE_TYPE(enc, ptr)) {
282
53.3k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
283
2
  default:
284
2
    *nextTokPtr = ptr;
285
2
    return XML_TOK_INVALID;
286
40.8k
  }
287
1.23M
  while (HAS_CHAR(enc, ptr, end)) {
288
1.23M
    switch (BYTE_TYPE(enc, ptr)) {
289
4.42M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
290
12.1k
    case BT_S:
291
14.3k
    case BT_CR:
292
16.9k
    case BT_LF:
293
16.9k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
294
3
        *nextTokPtr = ptr;
295
3
        return XML_TOK_INVALID;
296
3
      }
297
16.9k
      ptr += MINBPC(enc);
298
16.2M
      while (HAS_CHAR(enc, ptr, end)) {
299
16.2M
        switch (BYTE_TYPE(enc, ptr)) {
300
350k
          INVALID_CASES(ptr, nextTokPtr)
301
89.1k
        case BT_QUEST:
302
89.1k
          ptr += MINBPC(enc);
303
89.1k
          REQUIRE_CHAR(enc, ptr, end);
304
89.1k
          if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
305
16.7k
            *nextTokPtr = ptr + MINBPC(enc);
306
16.7k
            return tok;
307
16.7k
          }
308
72.3k
          break;
309
16.0M
        default:
310
16.0M
          ptr += MINBPC(enc);
311
16.0M
          break;
312
16.2M
        }
313
16.2M
      }
314
128
      return XML_TOK_PARTIAL;
315
23.8k
    case BT_QUEST:
316
23.8k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
317
2
        *nextTokPtr = ptr;
318
2
        return XML_TOK_INVALID;
319
2
      }
320
23.8k
      ptr += MINBPC(enc);
321
23.8k
      REQUIRE_CHAR(enc, ptr, end);
322
23.7k
      if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
323
23.7k
        *nextTokPtr = ptr + MINBPC(enc);
324
23.7k
        return tok;
325
23.7k
      }
326
      /* fall through */
327
27
    default:
328
27
      *nextTokPtr = ptr;
329
27
      return XML_TOK_INVALID;
330
1.23M
    }
331
1.23M
  }
332
74
  return XML_TOK_PARTIAL;
333
40.8k
}
xmltok.c:normal_scanPi
Line
Count
Source
277
40.8k
               const char **nextTokPtr) {
278
40.8k
  int tok;
279
40.8k
  const char *target = ptr;
280
40.8k
  REQUIRE_CHAR(enc, ptr, end);
281
40.8k
  switch (BYTE_TYPE(enc, ptr)) {
282
53.3k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
283
2
  default:
284
2
    *nextTokPtr = ptr;
285
2
    return XML_TOK_INVALID;
286
40.8k
  }
287
1.23M
  while (HAS_CHAR(enc, ptr, end)) {
288
1.23M
    switch (BYTE_TYPE(enc, ptr)) {
289
4.42M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
290
12.1k
    case BT_S:
291
14.3k
    case BT_CR:
292
16.9k
    case BT_LF:
293
16.9k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
294
3
        *nextTokPtr = ptr;
295
3
        return XML_TOK_INVALID;
296
3
      }
297
16.9k
      ptr += MINBPC(enc);
298
16.2M
      while (HAS_CHAR(enc, ptr, end)) {
299
16.2M
        switch (BYTE_TYPE(enc, ptr)) {
300
350k
          INVALID_CASES(ptr, nextTokPtr)
301
89.1k
        case BT_QUEST:
302
89.1k
          ptr += MINBPC(enc);
303
89.1k
          REQUIRE_CHAR(enc, ptr, end);
304
89.1k
          if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
305
16.7k
            *nextTokPtr = ptr + MINBPC(enc);
306
16.7k
            return tok;
307
16.7k
          }
308
72.3k
          break;
309
16.0M
        default:
310
16.0M
          ptr += MINBPC(enc);
311
16.0M
          break;
312
16.2M
        }
313
16.2M
      }
314
128
      return XML_TOK_PARTIAL;
315
23.8k
    case BT_QUEST:
316
23.8k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
317
2
        *nextTokPtr = ptr;
318
2
        return XML_TOK_INVALID;
319
2
      }
320
23.8k
      ptr += MINBPC(enc);
321
23.8k
      REQUIRE_CHAR(enc, ptr, end);
322
23.7k
      if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
323
23.7k
        *nextTokPtr = ptr + MINBPC(enc);
324
23.7k
        return tok;
325
23.7k
      }
326
      /* fall through */
327
27
    default:
328
27
      *nextTokPtr = ptr;
329
27
      return XML_TOK_INVALID;
330
1.23M
    }
331
1.23M
  }
332
74
  return XML_TOK_PARTIAL;
333
40.8k
}
Unexecuted instantiation: xmltok.c:little2_scanPi
Unexecuted instantiation: xmltok.c:big2_scanPi
334
335
static int PTRCALL
336
PREFIX(scanCdataSection)(const ENCODING *enc, const char *ptr, const char *end,
337
2.22k
                         const char **nextTokPtr) {
338
2.22k
  static const char CDATA_LSQB[]
339
2.22k
      = {ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, ASCII_LSQB};
340
2.22k
  int i;
341
2.22k
  UNUSED_P(enc);
342
  /* CDATA[ */
343
2.22k
  REQUIRE_CHARS(enc, ptr, end, 6);
344
15.3k
  for (i = 0; i < 6; i++, ptr += MINBPC(enc)) {
345
13.1k
    if (! CHAR_MATCHES(enc, ptr, CDATA_LSQB[i])) {
346
50
      *nextTokPtr = ptr;
347
50
      return XML_TOK_INVALID;
348
50
    }
349
13.1k
  }
350
2.16k
  *nextTokPtr = ptr;
351
2.16k
  return XML_TOK_CDATA_SECT_OPEN;
352
2.21k
}
xmltok.c:normal_scanCdataSection
Line
Count
Source
337
2.22k
                         const char **nextTokPtr) {
338
2.22k
  static const char CDATA_LSQB[]
339
2.22k
      = {ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, ASCII_LSQB};
340
2.22k
  int i;
341
2.22k
  UNUSED_P(enc);
342
  /* CDATA[ */
343
2.22k
  REQUIRE_CHARS(enc, ptr, end, 6);
344
15.3k
  for (i = 0; i < 6; i++, ptr += MINBPC(enc)) {
345
13.1k
    if (! CHAR_MATCHES(enc, ptr, CDATA_LSQB[i])) {
346
50
      *nextTokPtr = ptr;
347
50
      return XML_TOK_INVALID;
348
50
    }
349
13.1k
  }
350
2.16k
  *nextTokPtr = ptr;
351
2.16k
  return XML_TOK_CDATA_SECT_OPEN;
352
2.21k
}
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.77M
                        const char **nextTokPtr) {
357
4.77M
  if (ptr >= end)
358
168
    return XML_TOK_NONE;
359
4.77M
  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.77M
  switch (BYTE_TYPE(enc, ptr)) {
369
601k
  case BT_RSQB:
370
601k
    ptr += MINBPC(enc);
371
601k
    REQUIRE_CHAR(enc, ptr, end);
372
601k
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
373
296k
      break;
374
305k
    ptr += MINBPC(enc);
375
305k
    REQUIRE_CHAR(enc, ptr, end);
376
305k
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
377
303k
      ptr -= MINBPC(enc);
378
303k
      break;
379
303k
    }
380
2.02k
    *nextTokPtr = ptr + MINBPC(enc);
381
2.02k
    return XML_TOK_CDATA_SECT_CLOSE;
382
1.76M
  case BT_CR:
383
1.76M
    ptr += MINBPC(enc);
384
1.76M
    REQUIRE_CHAR(enc, ptr, end);
385
1.76M
    if (BYTE_TYPE(enc, ptr) == BT_LF)
386
362k
      ptr += MINBPC(enc);
387
1.76M
    *nextTokPtr = ptr;
388
1.76M
    return XML_TOK_DATA_NEWLINE;
389
1.33M
  case BT_LF:
390
1.33M
    *nextTokPtr = ptr + MINBPC(enc);
391
1.33M
    return XML_TOK_DATA_NEWLINE;
392
1.33M
    INVALID_CASES(ptr, nextTokPtr)
393
914k
  default:
394
914k
    ptr += MINBPC(enc);
395
914k
    break;
396
4.77M
  }
397
27.0M
  while (HAS_CHAR(enc, ptr, end)) {
398
27.0M
    switch (BYTE_TYPE(enc, ptr)) {
399
0
#  define LEAD_CASE(n)                                                         \
400
329k
  case BT_LEAD##n:                                                             \
401
329k
    if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) {                       \
402
14
      *nextTokPtr = ptr;                                                       \
403
14
      return XML_TOK_DATA_CHARS;                                               \
404
14
    }                                                                          \
405
329k
    ptr += n;                                                                  \
406
329k
    break;
407
151k
      LEAD_CASE(2)
408
110k
      LEAD_CASE(3)
409
67.8k
      LEAD_CASE(4)
410
0
#  undef LEAD_CASE
411
6
    case BT_NONXML:
412
11
    case BT_MALFORM:
413
16
    case BT_TRAIL:
414
629k
    case BT_CR:
415
1.13M
    case BT_LF:
416
1.66M
    case BT_RSQB:
417
1.66M
      *nextTokPtr = ptr;
418
1.66M
      return XML_TOK_DATA_CHARS;
419
25.0M
    default:
420
25.0M
      ptr += MINBPC(enc);
421
25.0M
      break;
422
27.0M
    }
423
27.0M
  }
424
60
  *nextTokPtr = ptr;
425
60
  return XML_TOK_DATA_CHARS;
426
1.66M
}
xmltok.c:normal_cdataSectionTok
Line
Count
Source
356
4.77M
                        const char **nextTokPtr) {
357
4.77M
  if (ptr >= end)
358
168
    return XML_TOK_NONE;
359
4.77M
  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.77M
  switch (BYTE_TYPE(enc, ptr)) {
369
601k
  case BT_RSQB:
370
601k
    ptr += MINBPC(enc);
371
601k
    REQUIRE_CHAR(enc, ptr, end);
372
601k
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
373
296k
      break;
374
305k
    ptr += MINBPC(enc);
375
305k
    REQUIRE_CHAR(enc, ptr, end);
376
305k
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
377
303k
      ptr -= MINBPC(enc);
378
303k
      break;
379
303k
    }
380
2.02k
    *nextTokPtr = ptr + MINBPC(enc);
381
2.02k
    return XML_TOK_CDATA_SECT_CLOSE;
382
1.76M
  case BT_CR:
383
1.76M
    ptr += MINBPC(enc);
384
1.76M
    REQUIRE_CHAR(enc, ptr, end);
385
1.76M
    if (BYTE_TYPE(enc, ptr) == BT_LF)
386
362k
      ptr += MINBPC(enc);
387
1.76M
    *nextTokPtr = ptr;
388
1.76M
    return XML_TOK_DATA_NEWLINE;
389
1.33M
  case BT_LF:
390
1.33M
    *nextTokPtr = ptr + MINBPC(enc);
391
1.33M
    return XML_TOK_DATA_NEWLINE;
392
1.33M
    INVALID_CASES(ptr, nextTokPtr)
393
914k
  default:
394
914k
    ptr += MINBPC(enc);
395
914k
    break;
396
4.77M
  }
397
27.0M
  while (HAS_CHAR(enc, ptr, end)) {
398
27.0M
    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
151k
      LEAD_CASE(2)
408
110k
      LEAD_CASE(3)
409
67.8k
      LEAD_CASE(4)
410
0
#  undef LEAD_CASE
411
6
    case BT_NONXML:
412
11
    case BT_MALFORM:
413
16
    case BT_TRAIL:
414
629k
    case BT_CR:
415
1.13M
    case BT_LF:
416
1.66M
    case BT_RSQB:
417
1.66M
      *nextTokPtr = ptr;
418
1.66M
      return XML_TOK_DATA_CHARS;
419
25.0M
    default:
420
25.0M
      ptr += MINBPC(enc);
421
25.0M
      break;
422
27.0M
    }
423
27.0M
  }
424
60
  *nextTokPtr = ptr;
425
60
  return XML_TOK_DATA_CHARS;
426
1.66M
}
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
75.0k
                   const char **nextTokPtr) {
433
75.0k
  REQUIRE_CHAR(enc, ptr, end);
434
75.0k
  switch (BYTE_TYPE(enc, ptr)) {
435
61.1k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
436
7
  default:
437
7
    *nextTokPtr = ptr;
438
7
    return XML_TOK_INVALID;
439
75.0k
  }
440
474k
  while (HAS_CHAR(enc, ptr, end)) {
441
474k
    switch (BYTE_TYPE(enc, ptr)) {
442
1.34M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
443
274
    case BT_S:
444
835
    case BT_CR:
445
11.3k
    case BT_LF:
446
28.3k
      for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
447
28.3k
        switch (BYTE_TYPE(enc, ptr)) {
448
1.70k
        case BT_S:
449
4.67k
        case BT_CR:
450
17.0k
        case BT_LF:
451
17.0k
          break;
452
11.3k
        case BT_GT:
453
11.3k
          *nextTokPtr = ptr + MINBPC(enc);
454
11.3k
          return XML_TOK_END_TAG;
455
2
        default:
456
2
          *nextTokPtr = ptr;
457
2
          return XML_TOK_INVALID;
458
28.3k
        }
459
28.3k
      }
460
36
      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
63.5k
    case BT_GT:
469
63.5k
      *nextTokPtr = ptr + MINBPC(enc);
470
63.5k
      return XML_TOK_END_TAG;
471
7
    default:
472
7
      *nextTokPtr = ptr;
473
7
      return XML_TOK_INVALID;
474
474k
    }
475
474k
  }
476
114
  return XML_TOK_PARTIAL;
477
75.0k
}
xmltok.c:normal_scanEndTag
Line
Count
Source
432
75.0k
                   const char **nextTokPtr) {
433
75.0k
  REQUIRE_CHAR(enc, ptr, end);
434
75.0k
  switch (BYTE_TYPE(enc, ptr)) {
435
61.1k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
436
7
  default:
437
7
    *nextTokPtr = ptr;
438
7
    return XML_TOK_INVALID;
439
75.0k
  }
440
474k
  while (HAS_CHAR(enc, ptr, end)) {
441
474k
    switch (BYTE_TYPE(enc, ptr)) {
442
1.34M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
443
274
    case BT_S:
444
835
    case BT_CR:
445
11.3k
    case BT_LF:
446
28.3k
      for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
447
28.3k
        switch (BYTE_TYPE(enc, ptr)) {
448
1.70k
        case BT_S:
449
4.67k
        case BT_CR:
450
17.0k
        case BT_LF:
451
17.0k
          break;
452
11.3k
        case BT_GT:
453
11.3k
          *nextTokPtr = ptr + MINBPC(enc);
454
11.3k
          return XML_TOK_END_TAG;
455
2
        default:
456
2
          *nextTokPtr = ptr;
457
2
          return XML_TOK_INVALID;
458
28.3k
        }
459
28.3k
      }
460
36
      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
63.5k
    case BT_GT:
469
63.5k
      *nextTokPtr = ptr + MINBPC(enc);
470
63.5k
      return XML_TOK_END_TAG;
471
7
    default:
472
7
      *nextTokPtr = ptr;
473
7
      return XML_TOK_INVALID;
474
474k
    }
475
474k
  }
476
114
  return XML_TOK_PARTIAL;
477
75.0k
}
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
230k
                       const char **nextTokPtr) {
484
230k
  if (HAS_CHAR(enc, ptr, end)) {
485
230k
    switch (BYTE_TYPE(enc, ptr)) {
486
96.0k
    case BT_DIGIT:
487
230k
    case BT_HEX:
488
230k
      break;
489
5
    default:
490
5
      *nextTokPtr = ptr;
491
5
      return XML_TOK_INVALID;
492
230k
    }
493
832k
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
494
832k
      switch (BYTE_TYPE(enc, ptr)) {
495
434k
      case BT_DIGIT:
496
602k
      case BT_HEX:
497
602k
        break;
498
230k
      case BT_SEMI:
499
230k
        *nextTokPtr = ptr + MINBPC(enc);
500
230k
        return XML_TOK_CHAR_REF;
501
4
      default:
502
4
        *nextTokPtr = ptr;
503
4
        return XML_TOK_INVALID;
504
832k
      }
505
832k
    }
506
230k
  }
507
26
  return XML_TOK_PARTIAL;
508
230k
}
xmltok.c:normal_scanHexCharRef
Line
Count
Source
483
230k
                       const char **nextTokPtr) {
484
230k
  if (HAS_CHAR(enc, ptr, end)) {
485
230k
    switch (BYTE_TYPE(enc, ptr)) {
486
96.0k
    case BT_DIGIT:
487
230k
    case BT_HEX:
488
230k
      break;
489
5
    default:
490
5
      *nextTokPtr = ptr;
491
5
      return XML_TOK_INVALID;
492
230k
    }
493
832k
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
494
832k
      switch (BYTE_TYPE(enc, ptr)) {
495
434k
      case BT_DIGIT:
496
602k
      case BT_HEX:
497
602k
        break;
498
230k
      case BT_SEMI:
499
230k
        *nextTokPtr = ptr + MINBPC(enc);
500
230k
        return XML_TOK_CHAR_REF;
501
4
      default:
502
4
        *nextTokPtr = ptr;
503
4
        return XML_TOK_INVALID;
504
832k
      }
505
832k
    }
506
230k
  }
507
26
  return XML_TOK_PARTIAL;
508
230k
}
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
251k
                    const char **nextTokPtr) {
515
251k
  if (HAS_CHAR(enc, ptr, end)) {
516
251k
    if (CHAR_MATCHES(enc, ptr, ASCII_x))
517
230k
      return PREFIX(scanHexCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
518
21.1k
    switch (BYTE_TYPE(enc, ptr)) {
519
21.1k
    case BT_DIGIT:
520
21.1k
      break;
521
15
    default:
522
15
      *nextTokPtr = ptr;
523
15
      return XML_TOK_INVALID;
524
21.1k
    }
525
87.5k
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
526
87.5k
      switch (BYTE_TYPE(enc, ptr)) {
527
66.4k
      case BT_DIGIT:
528
66.4k
        break;
529
21.1k
      case BT_SEMI:
530
21.1k
        *nextTokPtr = ptr + MINBPC(enc);
531
21.1k
        return XML_TOK_CHAR_REF;
532
3
      default:
533
3
        *nextTokPtr = ptr;
534
3
        return XML_TOK_INVALID;
535
87.5k
      }
536
87.5k
    }
537
21.1k
  }
538
21
  return XML_TOK_PARTIAL;
539
251k
}
xmltok.c:normal_scanCharRef
Line
Count
Source
514
251k
                    const char **nextTokPtr) {
515
251k
  if (HAS_CHAR(enc, ptr, end)) {
516
251k
    if (CHAR_MATCHES(enc, ptr, ASCII_x))
517
230k
      return PREFIX(scanHexCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
518
21.1k
    switch (BYTE_TYPE(enc, ptr)) {
519
21.1k
    case BT_DIGIT:
520
21.1k
      break;
521
15
    default:
522
15
      *nextTokPtr = ptr;
523
15
      return XML_TOK_INVALID;
524
21.1k
    }
525
87.5k
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
526
87.5k
      switch (BYTE_TYPE(enc, ptr)) {
527
66.4k
      case BT_DIGIT:
528
66.4k
        break;
529
21.1k
      case BT_SEMI:
530
21.1k
        *nextTokPtr = ptr + MINBPC(enc);
531
21.1k
        return XML_TOK_CHAR_REF;
532
3
      default:
533
3
        *nextTokPtr = ptr;
534
3
        return XML_TOK_INVALID;
535
87.5k
      }
536
87.5k
    }
537
21.1k
  }
538
21
  return XML_TOK_PARTIAL;
539
251k
}
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
445k
                const char **nextTokPtr) {
546
445k
  REQUIRE_CHAR(enc, ptr, end);
547
445k
  switch (BYTE_TYPE(enc, ptr)) {
548
117k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
549
251k
  case BT_NUM:
550
251k
    return PREFIX(scanCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
551
5
  default:
552
5
    *nextTokPtr = ptr;
553
5
    return XML_TOK_INVALID;
554
445k
  }
555
1.05M
  while (HAS_CHAR(enc, ptr, end)) {
556
1.05M
    switch (BYTE_TYPE(enc, ptr)) {
557
3.17M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
558
193k
    case BT_SEMI:
559
193k
      *nextTokPtr = ptr + MINBPC(enc);
560
193k
      return XML_TOK_ENTITY_REF;
561
10
    default:
562
10
      *nextTokPtr = ptr;
563
10
      return XML_TOK_INVALID;
564
1.05M
    }
565
1.05M
  }
566
64
  return XML_TOK_PARTIAL;
567
194k
}
xmltok.c:normal_scanRef
Line
Count
Source
545
445k
                const char **nextTokPtr) {
546
445k
  REQUIRE_CHAR(enc, ptr, end);
547
445k
  switch (BYTE_TYPE(enc, ptr)) {
548
117k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
549
251k
  case BT_NUM:
550
251k
    return PREFIX(scanCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
551
5
  default:
552
5
    *nextTokPtr = ptr;
553
5
    return XML_TOK_INVALID;
554
445k
  }
555
1.05M
  while (HAS_CHAR(enc, ptr, end)) {
556
1.05M
    switch (BYTE_TYPE(enc, ptr)) {
557
3.17M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
558
193k
    case BT_SEMI:
559
193k
      *nextTokPtr = ptr + MINBPC(enc);
560
193k
      return XML_TOK_ENTITY_REF;
561
10
    default:
562
10
      *nextTokPtr = ptr;
563
10
      return XML_TOK_INVALID;
564
1.05M
    }
565
1.05M
  }
566
64
  return XML_TOK_PARTIAL;
567
194k
}
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
63.5k
                 const char **nextTokPtr) {
574
#  ifdef XML_NS
575
  int hadColon = 0;
576
#  endif
577
2.68M
  while (HAS_CHAR(enc, ptr, end)) {
578
2.68M
    switch (BYTE_TYPE(enc, ptr)) {
579
2.20M
      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
4.03k
    case BT_S:
598
18.7k
    case BT_CR:
599
23.7k
    case BT_LF:
600
48.2k
      for (;;) {
601
48.2k
        int t;
602
603
48.2k
        ptr += MINBPC(enc);
604
48.2k
        REQUIRE_CHAR(enc, ptr, end);
605
48.2k
        t = BYTE_TYPE(enc, ptr);
606
48.2k
        if (t == BT_EQUALS)
607
23.7k
          break;
608
24.5k
        switch (t) {
609
6.02k
        case BT_S:
610
10.7k
        case BT_LF:
611
24.5k
        case BT_CR:
612
24.5k
          break;
613
10
        default:
614
10
          *nextTokPtr = ptr;
615
10
          return XML_TOK_INVALID;
616
24.5k
        }
617
24.5k
      }
618
      /* fall through */
619
2.05M
    case BT_EQUALS: {
620
2.05M
      int open;
621
#  ifdef XML_NS
622
      hadColon = 0;
623
#  endif
624
2.12M
      for (;;) {
625
2.12M
        ptr += MINBPC(enc);
626
2.12M
        REQUIRE_CHAR(enc, ptr, end);
627
2.12M
        open = BYTE_TYPE(enc, ptr);
628
2.12M
        if (open == BT_QUOT || open == BT_APOS)
629
2.05M
          break;
630
70.9k
        switch (open) {
631
14.1k
        case BT_S:
632
29.6k
        case BT_LF:
633
70.9k
        case BT_CR:
634
70.9k
          break;
635
14
        default:
636
14
          *nextTokPtr = ptr;
637
14
          return XML_TOK_INVALID;
638
70.9k
        }
639
70.9k
      }
640
2.05M
      ptr += MINBPC(enc);
641
      /* in attribute value */
642
16.5M
      for (;;) {
643
16.5M
        int t;
644
16.5M
        REQUIRE_CHAR(enc, ptr, end);
645
16.5M
        t = BYTE_TYPE(enc, ptr);
646
16.5M
        if (t == open)
647
2.05M
          break;
648
14.5M
        switch (t) {
649
290k
          INVALID_CASES(ptr, nextTokPtr)
650
142k
        case BT_AMP: {
651
142k
          int tok = PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, &ptr);
652
142k
          if (tok <= 0) {
653
32
            if (tok == XML_TOK_INVALID)
654
14
              *nextTokPtr = ptr;
655
32
            return tok;
656
32
          }
657
142k
          break;
658
142k
        }
659
142k
        case BT_LT:
660
5
          *nextTokPtr = ptr;
661
5
          return XML_TOK_INVALID;
662
14.2M
        default:
663
14.2M
          ptr += MINBPC(enc);
664
14.2M
          break;
665
14.5M
        }
666
14.5M
      }
667
2.05M
      ptr += MINBPC(enc);
668
2.05M
      REQUIRE_CHAR(enc, ptr, end);
669
2.05M
      switch (BYTE_TYPE(enc, ptr)) {
670
1.02M
      case BT_S:
671
1.94M
      case BT_CR:
672
1.99M
      case BT_LF:
673
1.99M
        break;
674
36.8k
      case BT_SOL:
675
36.8k
        goto sol;
676
15.0k
      case BT_GT:
677
15.0k
        goto gt;
678
8
      default:
679
8
        *nextTokPtr = ptr;
680
8
        return XML_TOK_INVALID;
681
2.05M
      }
682
      /* ptr points to closing quote */
683
2.19M
      for (;;) {
684
2.19M
        ptr += MINBPC(enc);
685
2.19M
        REQUIRE_CHAR(enc, ptr, end);
686
2.19M
        switch (BYTE_TYPE(enc, ptr)) {
687
1.98M
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
688
137k
        case BT_S:
689
173k
        case BT_CR:
690
197k
        case BT_LF:
691
197k
          continue;
692
277
        case BT_GT:
693
15.2k
        gt:
694
15.2k
          *nextTokPtr = ptr + MINBPC(enc);
695
15.2k
          return XML_TOK_START_TAG_WITH_ATTS;
696
10.8k
        case BT_SOL:
697
47.6k
        sol:
698
47.6k
          ptr += MINBPC(enc);
699
47.6k
          REQUIRE_CHAR(enc, ptr, end);
700
47.6k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
701
10
            *nextTokPtr = ptr;
702
10
            return XML_TOK_INVALID;
703
10
          }
704
47.6k
          *nextTokPtr = ptr + MINBPC(enc);
705
47.6k
          return XML_TOK_EMPTY_ELEMENT_WITH_ATTS;
706
6
        default:
707
6
          *nextTokPtr = ptr;
708
6
          return XML_TOK_INVALID;
709
2.19M
        }
710
1.98M
        break;
711
2.19M
      }
712
1.98M
      break;
713
1.99M
    }
714
1.98M
    default:
715
17
      *nextTokPtr = ptr;
716
17
      return XML_TOK_INVALID;
717
2.68M
    }
718
2.68M
  }
719
76
  return XML_TOK_PARTIAL;
720
63.5k
}
xmltok.c:normal_scanAtts
Line
Count
Source
573
63.5k
                 const char **nextTokPtr) {
574
#  ifdef XML_NS
575
  int hadColon = 0;
576
#  endif
577
2.68M
  while (HAS_CHAR(enc, ptr, end)) {
578
2.68M
    switch (BYTE_TYPE(enc, ptr)) {
579
2.20M
      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
4.03k
    case BT_S:
598
18.7k
    case BT_CR:
599
23.7k
    case BT_LF:
600
48.2k
      for (;;) {
601
48.2k
        int t;
602
603
48.2k
        ptr += MINBPC(enc);
604
48.2k
        REQUIRE_CHAR(enc, ptr, end);
605
48.2k
        t = BYTE_TYPE(enc, ptr);
606
48.2k
        if (t == BT_EQUALS)
607
23.7k
          break;
608
24.5k
        switch (t) {
609
6.02k
        case BT_S:
610
10.7k
        case BT_LF:
611
24.5k
        case BT_CR:
612
24.5k
          break;
613
10
        default:
614
10
          *nextTokPtr = ptr;
615
10
          return XML_TOK_INVALID;
616
24.5k
        }
617
24.5k
      }
618
      /* fall through */
619
2.05M
    case BT_EQUALS: {
620
2.05M
      int open;
621
#  ifdef XML_NS
622
      hadColon = 0;
623
#  endif
624
2.12M
      for (;;) {
625
2.12M
        ptr += MINBPC(enc);
626
2.12M
        REQUIRE_CHAR(enc, ptr, end);
627
2.12M
        open = BYTE_TYPE(enc, ptr);
628
2.12M
        if (open == BT_QUOT || open == BT_APOS)
629
2.05M
          break;
630
70.9k
        switch (open) {
631
14.1k
        case BT_S:
632
29.6k
        case BT_LF:
633
70.9k
        case BT_CR:
634
70.9k
          break;
635
14
        default:
636
14
          *nextTokPtr = ptr;
637
14
          return XML_TOK_INVALID;
638
70.9k
        }
639
70.9k
      }
640
2.05M
      ptr += MINBPC(enc);
641
      /* in attribute value */
642
16.5M
      for (;;) {
643
16.5M
        int t;
644
16.5M
        REQUIRE_CHAR(enc, ptr, end);
645
16.5M
        t = BYTE_TYPE(enc, ptr);
646
16.5M
        if (t == open)
647
2.05M
          break;
648
14.5M
        switch (t) {
649
290k
          INVALID_CASES(ptr, nextTokPtr)
650
142k
        case BT_AMP: {
651
142k
          int tok = PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, &ptr);
652
142k
          if (tok <= 0) {
653
32
            if (tok == XML_TOK_INVALID)
654
14
              *nextTokPtr = ptr;
655
32
            return tok;
656
32
          }
657
142k
          break;
658
142k
        }
659
142k
        case BT_LT:
660
5
          *nextTokPtr = ptr;
661
5
          return XML_TOK_INVALID;
662
14.2M
        default:
663
14.2M
          ptr += MINBPC(enc);
664
14.2M
          break;
665
14.5M
        }
666
14.5M
      }
667
2.05M
      ptr += MINBPC(enc);
668
2.05M
      REQUIRE_CHAR(enc, ptr, end);
669
2.05M
      switch (BYTE_TYPE(enc, ptr)) {
670
1.02M
      case BT_S:
671
1.94M
      case BT_CR:
672
1.99M
      case BT_LF:
673
1.99M
        break;
674
36.8k
      case BT_SOL:
675
36.8k
        goto sol;
676
15.0k
      case BT_GT:
677
15.0k
        goto gt;
678
8
      default:
679
8
        *nextTokPtr = ptr;
680
8
        return XML_TOK_INVALID;
681
2.05M
      }
682
      /* ptr points to closing quote */
683
2.19M
      for (;;) {
684
2.19M
        ptr += MINBPC(enc);
685
2.19M
        REQUIRE_CHAR(enc, ptr, end);
686
2.19M
        switch (BYTE_TYPE(enc, ptr)) {
687
1.98M
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
688
137k
        case BT_S:
689
173k
        case BT_CR:
690
197k
        case BT_LF:
691
197k
          continue;
692
277
        case BT_GT:
693
15.2k
        gt:
694
15.2k
          *nextTokPtr = ptr + MINBPC(enc);
695
15.2k
          return XML_TOK_START_TAG_WITH_ATTS;
696
10.8k
        case BT_SOL:
697
47.6k
        sol:
698
47.6k
          ptr += MINBPC(enc);
699
47.6k
          REQUIRE_CHAR(enc, ptr, end);
700
47.6k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
701
10
            *nextTokPtr = ptr;
702
10
            return XML_TOK_INVALID;
703
10
          }
704
47.6k
          *nextTokPtr = ptr + MINBPC(enc);
705
47.6k
          return XML_TOK_EMPTY_ELEMENT_WITH_ATTS;
706
6
        default:
707
6
          *nextTokPtr = ptr;
708
6
          return XML_TOK_INVALID;
709
2.19M
        }
710
1.98M
        break;
711
2.19M
      }
712
1.98M
      break;
713
1.99M
    }
714
1.98M
    default:
715
17
      *nextTokPtr = ptr;
716
17
      return XML_TOK_INVALID;
717
2.68M
    }
718
2.68M
  }
719
76
  return XML_TOK_PARTIAL;
720
63.5k
}
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
528k
               const char **nextTokPtr) {
727
#  ifdef XML_NS
728
  int hadColon;
729
#  endif
730
528k
  REQUIRE_CHAR(enc, ptr, end);
731
528k
  switch (BYTE_TYPE(enc, ptr)) {
732
378k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
733
16.7k
  case BT_EXCL:
734
16.7k
    ptr += MINBPC(enc);
735
16.7k
    REQUIRE_CHAR(enc, ptr, end);
736
16.7k
    switch (BYTE_TYPE(enc, ptr)) {
737
14.4k
    case BT_MINUS:
738
14.4k
      return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
739
2.22k
    case BT_LSQB:
740
2.22k
      return PREFIX(scanCdataSection)(enc, ptr + MINBPC(enc), end, nextTokPtr);
741
16.7k
    }
742
3
    *nextTokPtr = ptr;
743
3
    return XML_TOK_INVALID;
744
30.4k
  case BT_QUEST:
745
30.4k
    return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
746
75.0k
  case BT_SOL:
747
75.0k
    return PREFIX(scanEndTag)(enc, ptr + MINBPC(enc), end, nextTokPtr);
748
12
  default:
749
12
    *nextTokPtr = ptr;
750
12
    return XML_TOK_INVALID;
751
528k
  }
752
#  ifdef XML_NS
753
  hadColon = 0;
754
#  endif
755
  /* we have a start-tag */
756
11.5M
  while (HAS_CHAR(enc, ptr, end)) {
757
11.5M
    switch (BYTE_TYPE(enc, ptr)) {
758
44.4M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
759
#  ifdef XML_NS
760
    case BT_COLON:
761
      if (hadColon) {
762
        *nextTokPtr = ptr;
763
        return XML_TOK_INVALID;
764
      }
765
      hadColon = 1;
766
      ptr += MINBPC(enc);
767
      REQUIRE_CHAR(enc, ptr, end);
768
      switch (BYTE_TYPE(enc, ptr)) {
769
        CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
770
      default:
771
        *nextTokPtr = ptr;
772
        return XML_TOK_INVALID;
773
      }
774
      break;
775
#  endif
776
52.2k
    case BT_S:
777
68.2k
    case BT_CR:
778
73.3k
    case BT_LF: {
779
73.3k
      ptr += MINBPC(enc);
780
103k
      while (HAS_CHAR(enc, ptr, end)) {
781
103k
        switch (BYTE_TYPE(enc, ptr)) {
782
48.8k
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
783
728
        case BT_GT:
784
728
          goto gt;
785
9.02k
        case BT_SOL:
786
9.02k
          goto sol;
787
4.36k
        case BT_S:
788
28.5k
        case BT_CR:
789
29.8k
        case BT_LF:
790
29.8k
          ptr += MINBPC(enc);
791
29.8k
          continue;
792
11
        default:
793
11
          *nextTokPtr = ptr;
794
11
          return XML_TOK_INVALID;
795
103k
        }
796
63.5k
        return PREFIX(scanAtts)(enc, ptr, end, nextTokPtr);
797
103k
      }
798
50
      return XML_TOK_PARTIAL;
799
73.3k
    }
800
290k
    case BT_GT:
801
291k
    gt:
802
291k
      *nextTokPtr = ptr + MINBPC(enc);
803
291k
      return XML_TOK_START_TAG_NO_ATTS;
804
41.7k
    case BT_SOL:
805
50.7k
    sol:
806
50.7k
      ptr += MINBPC(enc);
807
50.7k
      REQUIRE_CHAR(enc, ptr, end);
808
50.7k
      if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
809
15
        *nextTokPtr = ptr;
810
15
        return XML_TOK_INVALID;
811
15
      }
812
50.7k
      *nextTokPtr = ptr + MINBPC(enc);
813
50.7k
      return XML_TOK_EMPTY_ELEMENT_NO_ATTS;
814
20
    default:
815
20
      *nextTokPtr = ptr;
816
20
      return XML_TOK_INVALID;
817
11.5M
    }
818
11.5M
  }
819
146
  return XML_TOK_PARTIAL;
820
406k
}
xmltok.c:normal_scanLt
Line
Count
Source
726
528k
               const char **nextTokPtr) {
727
#  ifdef XML_NS
728
  int hadColon;
729
#  endif
730
528k
  REQUIRE_CHAR(enc, ptr, end);
731
528k
  switch (BYTE_TYPE(enc, ptr)) {
732
378k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
733
16.7k
  case BT_EXCL:
734
16.7k
    ptr += MINBPC(enc);
735
16.7k
    REQUIRE_CHAR(enc, ptr, end);
736
16.7k
    switch (BYTE_TYPE(enc, ptr)) {
737
14.4k
    case BT_MINUS:
738
14.4k
      return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
739
2.22k
    case BT_LSQB:
740
2.22k
      return PREFIX(scanCdataSection)(enc, ptr + MINBPC(enc), end, nextTokPtr);
741
16.7k
    }
742
3
    *nextTokPtr = ptr;
743
3
    return XML_TOK_INVALID;
744
30.4k
  case BT_QUEST:
745
30.4k
    return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
746
75.0k
  case BT_SOL:
747
75.0k
    return PREFIX(scanEndTag)(enc, ptr + MINBPC(enc), end, nextTokPtr);
748
12
  default:
749
12
    *nextTokPtr = ptr;
750
12
    return XML_TOK_INVALID;
751
528k
  }
752
#  ifdef XML_NS
753
  hadColon = 0;
754
#  endif
755
  /* we have a start-tag */
756
11.5M
  while (HAS_CHAR(enc, ptr, end)) {
757
11.5M
    switch (BYTE_TYPE(enc, ptr)) {
758
44.4M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
759
#  ifdef XML_NS
760
    case BT_COLON:
761
      if (hadColon) {
762
        *nextTokPtr = ptr;
763
        return XML_TOK_INVALID;
764
      }
765
      hadColon = 1;
766
      ptr += MINBPC(enc);
767
      REQUIRE_CHAR(enc, ptr, end);
768
      switch (BYTE_TYPE(enc, ptr)) {
769
        CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
770
      default:
771
        *nextTokPtr = ptr;
772
        return XML_TOK_INVALID;
773
      }
774
      break;
775
#  endif
776
52.2k
    case BT_S:
777
68.2k
    case BT_CR:
778
73.3k
    case BT_LF: {
779
73.3k
      ptr += MINBPC(enc);
780
103k
      while (HAS_CHAR(enc, ptr, end)) {
781
103k
        switch (BYTE_TYPE(enc, ptr)) {
782
48.8k
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
783
728
        case BT_GT:
784
728
          goto gt;
785
9.02k
        case BT_SOL:
786
9.02k
          goto sol;
787
4.36k
        case BT_S:
788
28.5k
        case BT_CR:
789
29.8k
        case BT_LF:
790
29.8k
          ptr += MINBPC(enc);
791
29.8k
          continue;
792
11
        default:
793
11
          *nextTokPtr = ptr;
794
11
          return XML_TOK_INVALID;
795
103k
        }
796
63.5k
        return PREFIX(scanAtts)(enc, ptr, end, nextTokPtr);
797
103k
      }
798
50
      return XML_TOK_PARTIAL;
799
73.3k
    }
800
290k
    case BT_GT:
801
291k
    gt:
802
291k
      *nextTokPtr = ptr + MINBPC(enc);
803
291k
      return XML_TOK_START_TAG_NO_ATTS;
804
41.7k
    case BT_SOL:
805
50.7k
    sol:
806
50.7k
      ptr += MINBPC(enc);
807
50.7k
      REQUIRE_CHAR(enc, ptr, end);
808
50.7k
      if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
809
15
        *nextTokPtr = ptr;
810
15
        return XML_TOK_INVALID;
811
15
      }
812
50.7k
      *nextTokPtr = ptr + MINBPC(enc);
813
50.7k
      return XML_TOK_EMPTY_ELEMENT_NO_ATTS;
814
20
    default:
815
20
      *nextTokPtr = ptr;
816
20
      return XML_TOK_INVALID;
817
11.5M
    }
818
11.5M
  }
819
146
  return XML_TOK_PARTIAL;
820
406k
}
Unexecuted instantiation: xmltok.c:little2_scanLt
Unexecuted instantiation: xmltok.c:big2_scanLt
821
822
static int PTRCALL
823
PREFIX(contentTok)(const ENCODING *enc, const char *ptr, const char *end,
824
4.01M
                   const char **nextTokPtr) {
825
4.01M
  if (ptr >= end)
826
2.90k
    return XML_TOK_NONE;
827
4.01M
  if (MINBPC(enc) > 1) {
828
0
    size_t n = end - ptr;
829
0
    if (n & (MINBPC(enc) - 1)) {
830
0
      n &= ~(MINBPC(enc) - 1);
831
0
      if (n == 0)
832
0
        return XML_TOK_PARTIAL;
833
0
      end = ptr + n;
834
0
    }
835
0
  }
836
4.01M
  switch (BYTE_TYPE(enc, ptr)) {
837
528k
  case BT_LT:
838
528k
    return PREFIX(scanLt)(enc, ptr + MINBPC(enc), end, nextTokPtr);
839
37.0k
  case BT_AMP:
840
37.0k
    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
18
      return XML_TOK_TRAILING_CR;
845
1.49M
    if (BYTE_TYPE(enc, ptr) == BT_LF)
846
266k
      ptr += MINBPC(enc);
847
1.49M
    *nextTokPtr = ptr;
848
1.49M
    return XML_TOK_DATA_NEWLINE;
849
947k
  case BT_LF:
850
947k
    *nextTokPtr = ptr + MINBPC(enc);
851
947k
    return XML_TOK_DATA_NEWLINE;
852
149k
  case BT_RSQB:
853
149k
    ptr += MINBPC(enc);
854
149k
    if (! HAS_CHAR(enc, ptr, end))
855
6
      return XML_TOK_TRAILING_RSQB;
856
149k
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
857
58.1k
      break;
858
90.9k
    ptr += MINBPC(enc);
859
90.9k
    if (! HAS_CHAR(enc, ptr, end))
860
6
      return XML_TOK_TRAILING_RSQB;
861
90.9k
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
862
90.9k
      ptr -= MINBPC(enc);
863
90.9k
      break;
864
90.9k
    }
865
1
    *nextTokPtr = ptr;
866
1
    return XML_TOK_INVALID;
867
238k
    INVALID_CASES(ptr, nextTokPtr)
868
740k
  default:
869
740k
    ptr += MINBPC(enc);
870
740k
    break;
871
4.01M
  }
872
19.0M
  while (HAS_CHAR(enc, ptr, end)) {
873
19.0M
    switch (BYTE_TYPE(enc, ptr)) {
874
0
#  define LEAD_CASE(n)                                                         \
875
155k
  case BT_LEAD##n:                                                             \
876
155k
    if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) {                       \
877
26
      *nextTokPtr = ptr;                                                       \
878
26
      return XML_TOK_DATA_CHARS;                                               \
879
26
    }                                                                          \
880
155k
    ptr += n;                                                                  \
881
155k
    break;
882
88.6k
      LEAD_CASE(2)
883
24.5k
      LEAD_CASE(3)
884
41.9k
      LEAD_CASE(4)
885
0
#  undef LEAD_CASE
886
464k
    case BT_RSQB:
887
464k
      if (HAS_CHARS(enc, ptr, end, 2)) {
888
464k
        if (! CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_RSQB)) {
889
207k
          ptr += MINBPC(enc);
890
207k
          break;
891
207k
        }
892
256k
        if (HAS_CHARS(enc, ptr, end, 3)) {
893
256k
          if (! CHAR_MATCHES(enc, ptr + 2 * MINBPC(enc), ASCII_GT)) {
894
256k
            ptr += MINBPC(enc);
895
256k
            break;
896
256k
          }
897
4
          *nextTokPtr = ptr + 2 * MINBPC(enc);
898
4
          return XML_TOK_INVALID;
899
256k
        }
900
256k
      }
901
      /* fall through */
902
20.3k
    case BT_AMP:
903
168k
    case BT_LT:
904
168k
    case BT_NONXML:
905
168k
    case BT_MALFORM:
906
168k
    case BT_TRAIL:
907
681k
    case BT_CR:
908
1.00M
    case BT_LF:
909
1.00M
      *nextTokPtr = ptr;
910
1.00M
      return XML_TOK_DATA_CHARS;
911
17.4M
    default:
912
17.4M
      ptr += MINBPC(enc);
913
17.4M
      break;
914
19.0M
    }
915
19.0M
  }
916
1.40k
  *nextTokPtr = ptr;
917
1.40k
  return XML_TOK_DATA_CHARS;
918
1.00M
}
xmltok.c:normal_contentTok
Line
Count
Source
824
4.01M
                   const char **nextTokPtr) {
825
4.01M
  if (ptr >= end)
826
2.90k
    return XML_TOK_NONE;
827
4.01M
  if (MINBPC(enc) > 1) {
828
0
    size_t n = end - ptr;
829
0
    if (n & (MINBPC(enc) - 1)) {
830
0
      n &= ~(MINBPC(enc) - 1);
831
0
      if (n == 0)
832
0
        return XML_TOK_PARTIAL;
833
0
      end = ptr + n;
834
0
    }
835
0
  }
836
4.01M
  switch (BYTE_TYPE(enc, ptr)) {
837
528k
  case BT_LT:
838
528k
    return PREFIX(scanLt)(enc, ptr + MINBPC(enc), end, nextTokPtr);
839
37.0k
  case BT_AMP:
840
37.0k
    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
18
      return XML_TOK_TRAILING_CR;
845
1.49M
    if (BYTE_TYPE(enc, ptr) == BT_LF)
846
266k
      ptr += MINBPC(enc);
847
1.49M
    *nextTokPtr = ptr;
848
1.49M
    return XML_TOK_DATA_NEWLINE;
849
947k
  case BT_LF:
850
947k
    *nextTokPtr = ptr + MINBPC(enc);
851
947k
    return XML_TOK_DATA_NEWLINE;
852
149k
  case BT_RSQB:
853
149k
    ptr += MINBPC(enc);
854
149k
    if (! HAS_CHAR(enc, ptr, end))
855
6
      return XML_TOK_TRAILING_RSQB;
856
149k
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
857
58.1k
      break;
858
90.9k
    ptr += MINBPC(enc);
859
90.9k
    if (! HAS_CHAR(enc, ptr, end))
860
6
      return XML_TOK_TRAILING_RSQB;
861
90.9k
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
862
90.9k
      ptr -= MINBPC(enc);
863
90.9k
      break;
864
90.9k
    }
865
1
    *nextTokPtr = ptr;
866
1
    return XML_TOK_INVALID;
867
238k
    INVALID_CASES(ptr, nextTokPtr)
868
740k
  default:
869
740k
    ptr += MINBPC(enc);
870
740k
    break;
871
4.01M
  }
872
19.0M
  while (HAS_CHAR(enc, ptr, end)) {
873
19.0M
    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
88.6k
      LEAD_CASE(2)
883
24.5k
      LEAD_CASE(3)
884
41.9k
      LEAD_CASE(4)
885
0
#  undef LEAD_CASE
886
464k
    case BT_RSQB:
887
464k
      if (HAS_CHARS(enc, ptr, end, 2)) {
888
464k
        if (! CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_RSQB)) {
889
207k
          ptr += MINBPC(enc);
890
207k
          break;
891
207k
        }
892
256k
        if (HAS_CHARS(enc, ptr, end, 3)) {
893
256k
          if (! CHAR_MATCHES(enc, ptr + 2 * MINBPC(enc), ASCII_GT)) {
894
256k
            ptr += MINBPC(enc);
895
256k
            break;
896
256k
          }
897
4
          *nextTokPtr = ptr + 2 * MINBPC(enc);
898
4
          return XML_TOK_INVALID;
899
256k
        }
900
256k
      }
901
      /* fall through */
902
20.3k
    case BT_AMP:
903
168k
    case BT_LT:
904
168k
    case BT_NONXML:
905
168k
    case BT_MALFORM:
906
168k
    case BT_TRAIL:
907
681k
    case BT_CR:
908
1.00M
    case BT_LF:
909
1.00M
      *nextTokPtr = ptr;
910
1.00M
      return XML_TOK_DATA_CHARS;
911
17.4M
    default:
912
17.4M
      ptr += MINBPC(enc);
913
17.4M
      break;
914
19.0M
    }
915
19.0M
  }
916
1.40k
  *nextTokPtr = ptr;
917
1.40k
  return XML_TOK_DATA_CHARS;
918
1.00M
}
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
75.3k
                    const char **nextTokPtr) {
925
75.3k
  REQUIRE_CHAR(enc, ptr, end);
926
75.3k
  switch (BYTE_TYPE(enc, ptr)) {
927
144k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
928
543
  case BT_S:
929
1.24k
  case BT_LF:
930
1.73k
  case BT_CR:
931
1.74k
  case BT_PERCNT:
932
1.74k
    *nextTokPtr = ptr;
933
1.74k
    return XML_TOK_PERCENT;
934
5
  default:
935
5
    *nextTokPtr = ptr;
936
5
    return XML_TOK_INVALID;
937
75.3k
  }
938
1.05M
  while (HAS_CHAR(enc, ptr, end)) {
939
1.05M
    switch (BYTE_TYPE(enc, ptr)) {
940
3.51M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
941
73.3k
    case BT_SEMI:
942
73.3k
      *nextTokPtr = ptr + MINBPC(enc);
943
73.3k
      return XML_TOK_PARAM_ENTITY_REF;
944
20
    default:
945
20
      *nextTokPtr = ptr;
946
20
      return XML_TOK_INVALID;
947
1.05M
    }
948
1.05M
  }
949
80
  return XML_TOK_PARTIAL;
950
73.5k
}
xmltok.c:normal_scanPercent
Line
Count
Source
924
75.3k
                    const char **nextTokPtr) {
925
75.3k
  REQUIRE_CHAR(enc, ptr, end);
926
75.3k
  switch (BYTE_TYPE(enc, ptr)) {
927
144k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
928
543
  case BT_S:
929
1.24k
  case BT_LF:
930
1.73k
  case BT_CR:
931
1.74k
  case BT_PERCNT:
932
1.74k
    *nextTokPtr = ptr;
933
1.74k
    return XML_TOK_PERCENT;
934
5
  default:
935
5
    *nextTokPtr = ptr;
936
5
    return XML_TOK_INVALID;
937
75.3k
  }
938
1.05M
  while (HAS_CHAR(enc, ptr, end)) {
939
1.05M
    switch (BYTE_TYPE(enc, ptr)) {
940
3.51M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
941
73.3k
    case BT_SEMI:
942
73.3k
      *nextTokPtr = ptr + MINBPC(enc);
943
73.3k
      return XML_TOK_PARAM_ENTITY_REF;
944
20
    default:
945
20
      *nextTokPtr = ptr;
946
20
      return XML_TOK_INVALID;
947
1.05M
    }
948
1.05M
  }
949
80
  return XML_TOK_PARTIAL;
950
73.5k
}
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
113k
                      const char **nextTokPtr) {
955
113k
  REQUIRE_CHAR(enc, ptr, end);
956
113k
  switch (BYTE_TYPE(enc, ptr)) {
957
113k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
958
3
  default:
959
3
    *nextTokPtr = ptr;
960
3
    return XML_TOK_INVALID;
961
113k
  }
962
886k
  while (HAS_CHAR(enc, ptr, end)) {
963
886k
    switch (BYTE_TYPE(enc, ptr)) {
964
2.78M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
965
79.5k
    case BT_CR:
966
110k
    case BT_LF:
967
110k
    case BT_S:
968
110k
    case BT_RPAR:
969
112k
    case BT_GT:
970
112k
    case BT_PERCNT:
971
113k
    case BT_VERBAR:
972
113k
      *nextTokPtr = ptr;
973
113k
      return XML_TOK_POUND_NAME;
974
20
    default:
975
20
      *nextTokPtr = ptr;
976
20
      return XML_TOK_INVALID;
977
886k
    }
978
886k
  }
979
230
  return -XML_TOK_POUND_NAME;
980
113k
}
xmltok.c:normal_scanPoundName
Line
Count
Source
954
113k
                      const char **nextTokPtr) {
955
113k
  REQUIRE_CHAR(enc, ptr, end);
956
113k
  switch (BYTE_TYPE(enc, ptr)) {
957
113k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
958
3
  default:
959
3
    *nextTokPtr = ptr;
960
3
    return XML_TOK_INVALID;
961
113k
  }
962
886k
  while (HAS_CHAR(enc, ptr, end)) {
963
886k
    switch (BYTE_TYPE(enc, ptr)) {
964
2.78M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
965
79.5k
    case BT_CR:
966
110k
    case BT_LF:
967
110k
    case BT_S:
968
110k
    case BT_RPAR:
969
112k
    case BT_GT:
970
112k
    case BT_PERCNT:
971
113k
    case BT_VERBAR:
972
113k
      *nextTokPtr = ptr;
973
113k
      return XML_TOK_POUND_NAME;
974
20
    default:
975
20
      *nextTokPtr = ptr;
976
20
      return XML_TOK_INVALID;
977
886k
    }
978
886k
  }
979
230
  return -XML_TOK_POUND_NAME;
980
113k
}
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
64.4k
                const char **nextTokPtr) {
985
8.71M
  while (HAS_CHAR(enc, ptr, end)) {
986
8.71M
    int t = BYTE_TYPE(enc, ptr);
987
8.71M
    switch (t) {
988
181k
      INVALID_CASES(ptr, nextTokPtr)
989
28.2k
    case BT_QUOT:
990
89.0k
    case BT_APOS:
991
89.0k
      ptr += MINBPC(enc);
992
89.0k
      if (t != open)
993
24.6k
        break;
994
64.3k
      if (! HAS_CHAR(enc, ptr, end))
995
435
        return -XML_TOK_LITERAL;
996
63.8k
      *nextTokPtr = ptr;
997
63.8k
      switch (BYTE_TYPE(enc, ptr)) {
998
5.67k
      case BT_S:
999
8.62k
      case BT_CR:
1000
16.0k
      case BT_LF:
1001
63.5k
      case BT_GT:
1002
63.5k
      case BT_PERCNT:
1003
63.8k
      case BT_LSQB:
1004
63.8k
        return XML_TOK_LITERAL;
1005
22
      default:
1006
22
        return XML_TOK_INVALID;
1007
63.8k
      }
1008
8.53M
    default:
1009
8.53M
      ptr += MINBPC(enc);
1010
8.53M
      break;
1011
8.71M
    }
1012
8.71M
  }
1013
94
  return XML_TOK_PARTIAL;
1014
64.4k
}
xmltok.c:normal_scanLit
Line
Count
Source
984
64.4k
                const char **nextTokPtr) {
985
8.71M
  while (HAS_CHAR(enc, ptr, end)) {
986
8.71M
    int t = BYTE_TYPE(enc, ptr);
987
8.71M
    switch (t) {
988
181k
      INVALID_CASES(ptr, nextTokPtr)
989
28.2k
    case BT_QUOT:
990
89.0k
    case BT_APOS:
991
89.0k
      ptr += MINBPC(enc);
992
89.0k
      if (t != open)
993
24.6k
        break;
994
64.3k
      if (! HAS_CHAR(enc, ptr, end))
995
435
        return -XML_TOK_LITERAL;
996
63.8k
      *nextTokPtr = ptr;
997
63.8k
      switch (BYTE_TYPE(enc, ptr)) {
998
5.67k
      case BT_S:
999
8.62k
      case BT_CR:
1000
16.0k
      case BT_LF:
1001
63.5k
      case BT_GT:
1002
63.5k
      case BT_PERCNT:
1003
63.8k
      case BT_LSQB:
1004
63.8k
        return XML_TOK_LITERAL;
1005
22
      default:
1006
22
        return XML_TOK_INVALID;
1007
63.8k
      }
1008
8.53M
    default:
1009
8.53M
      ptr += MINBPC(enc);
1010
8.53M
      break;
1011
8.71M
    }
1012
8.71M
  }
1013
94
  return XML_TOK_PARTIAL;
1014
64.4k
}
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
6.28M
                  const char **nextTokPtr) {
1019
6.28M
  int tok;
1020
6.28M
  if (ptr >= end)
1021
8.14k
    return XML_TOK_NONE;
1022
6.27M
  if (MINBPC(enc) > 1) {
1023
222
    size_t n = end - ptr;
1024
222
    if (n & (MINBPC(enc) - 1)) {
1025
42
      n &= ~(MINBPC(enc) - 1);
1026
42
      if (n == 0)
1027
4
        return XML_TOK_PARTIAL;
1028
38
      end = ptr + n;
1029
38
    }
1030
222
  }
1031
6.27M
  switch (BYTE_TYPE(enc, ptr)) {
1032
6.17k
  case BT_QUOT:
1033
6.17k
    return PREFIX(scanLit)(BT_QUOT, enc, ptr + MINBPC(enc), end, nextTokPtr);
1034
58.2k
  case BT_APOS:
1035
58.2k
    return PREFIX(scanLit)(BT_APOS, enc, ptr + MINBPC(enc), end, nextTokPtr);
1036
94.8k
  case BT_LT: {
1037
94.8k
    ptr += MINBPC(enc);
1038
94.8k
    REQUIRE_CHAR(enc, ptr, end);
1039
94.8k
    switch (BYTE_TYPE(enc, ptr)) {
1040
78.5k
    case BT_EXCL:
1041
78.5k
      return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1042
10.4k
    case BT_QUEST:
1043
10.4k
      return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1044
4.57k
    case BT_NMSTRT:
1045
5.70k
    case BT_HEX:
1046
5.70k
    case BT_NONASCII:
1047
5.74k
    case BT_LEAD2:
1048
5.76k
    case BT_LEAD3:
1049
5.77k
    case BT_LEAD4:
1050
5.77k
      *nextTokPtr = ptr - MINBPC(enc);
1051
5.77k
      return XML_TOK_INSTANCE_START;
1052
94.8k
    }
1053
19
    *nextTokPtr = ptr;
1054
19
    return XML_TOK_INVALID;
1055
94.8k
  }
1056
302k
  case BT_CR:
1057
302k
    if (ptr + MINBPC(enc) == end) {
1058
317
      *nextTokPtr = end;
1059
      /* indicate that this might be part of a CR/LF pair */
1060
317
      return -XML_TOK_PROLOG_S;
1061
317
    }
1062
    /* fall through */
1063
640k
  case BT_S:
1064
714k
  case BT_LF:
1065
732k
    for (;;) {
1066
732k
      ptr += MINBPC(enc);
1067
732k
      if (! HAS_CHAR(enc, ptr, end))
1068
196
        break;
1069
732k
      switch (BYTE_TYPE(enc, ptr)) {
1070
6.84k
      case BT_S:
1071
14.6k
      case BT_LF:
1072
14.6k
        break;
1073
3.38k
      case BT_CR:
1074
        /* don't split CR/LF pair */
1075
3.38k
        if (ptr + MINBPC(enc) != end)
1076
3.24k
          break;
1077
        /* fall through */
1078
714k
      default:
1079
714k
        *nextTokPtr = ptr;
1080
714k
        return XML_TOK_PROLOG_S;
1081
732k
      }
1082
732k
    }
1083
196
    *nextTokPtr = ptr;
1084
196
    return XML_TOK_PROLOG_S;
1085
75.3k
  case BT_PERCNT:
1086
75.3k
    return PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1087
3.20k
  case BT_COMMA:
1088
3.20k
    *nextTokPtr = ptr + MINBPC(enc);
1089
3.20k
    return XML_TOK_COMMA;
1090
2.64k
  case BT_LSQB:
1091
2.64k
    *nextTokPtr = ptr + MINBPC(enc);
1092
2.64k
    return XML_TOK_OPEN_BRACKET;
1093
1.36k
  case BT_RSQB:
1094
1.36k
    ptr += MINBPC(enc);
1095
1.36k
    if (! HAS_CHAR(enc, ptr, end))
1096
3
      return -XML_TOK_CLOSE_BRACKET;
1097
1.36k
    if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) {
1098
22
      REQUIRE_CHARS(enc, ptr, end, 2);
1099
18
      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
18
    }
1104
1.35k
    *nextTokPtr = ptr;
1105
1.35k
    return XML_TOK_CLOSE_BRACKET;
1106
4.16M
  case BT_LPAR:
1107
4.16M
    *nextTokPtr = ptr + MINBPC(enc);
1108
4.16M
    return XML_TOK_OPEN_PAREN;
1109
124k
  case BT_RPAR:
1110
124k
    ptr += MINBPC(enc);
1111
124k
    if (! HAS_CHAR(enc, ptr, end))
1112
85
      return -XML_TOK_CLOSE_PAREN;
1113
124k
    switch (BYTE_TYPE(enc, ptr)) {
1114
2.48k
    case BT_AST:
1115
2.48k
      *nextTokPtr = ptr + MINBPC(enc);
1116
2.48k
      return XML_TOK_CLOSE_PAREN_ASTERISK;
1117
1.35k
    case BT_QUEST:
1118
1.35k
      *nextTokPtr = ptr + MINBPC(enc);
1119
1.35k
      return XML_TOK_CLOSE_PAREN_QUESTION;
1120
1.77k
    case BT_PLUS:
1121
1.77k
      *nextTokPtr = ptr + MINBPC(enc);
1122
1.77k
      return XML_TOK_CLOSE_PAREN_PLUS;
1123
29.7k
    case BT_CR:
1124
30.2k
    case BT_LF:
1125
109k
    case BT_S:
1126
110k
    case BT_GT:
1127
111k
    case BT_COMMA:
1128
114k
    case BT_VERBAR:
1129
118k
    case BT_RPAR:
1130
118k
      *nextTokPtr = ptr;
1131
118k
      return XML_TOK_CLOSE_PAREN;
1132
124k
    }
1133
21
    *nextTokPtr = ptr;
1134
21
    return XML_TOK_INVALID;
1135
214k
  case BT_VERBAR:
1136
214k
    *nextTokPtr = ptr + MINBPC(enc);
1137
214k
    return XML_TOK_OR;
1138
73.8k
  case BT_GT:
1139
73.8k
    *nextTokPtr = ptr + MINBPC(enc);
1140
73.8k
    return XML_TOK_DECL_CLOSE;
1141
113k
  case BT_NUM:
1142
113k
    return PREFIX(scanPoundName)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1143
0
#  define LEAD_CASE(n)                                                         \
1144
176k
  case BT_LEAD##n:                                                             \
1145
176k
    if (end - ptr < n)                                                         \
1146
65
      return XML_TOK_PARTIAL_CHAR;                                             \
1147
176k
    if (IS_INVALID_CHAR(enc, ptr, n)) {                                        \
1148
83
      *nextTokPtr = ptr;                                                       \
1149
83
      return XML_TOK_INVALID;                                                  \
1150
83
    }                                                                          \
1151
176k
    if (IS_NMSTRT_CHAR(enc, ptr, n)) {                                         \
1152
16.7k
      ptr += n;                                                                \
1153
16.7k
      tok = XML_TOK_NAME;                                                      \
1154
16.7k
      break;                                                                   \
1155
16.7k
    }                                                                          \
1156
176k
    if (IS_NAME_CHAR(enc, ptr, n)) {                                           \
1157
159k
      ptr += n;                                                                \
1158
159k
      tok = XML_TOK_NMTOKEN;                                                   \
1159
159k
      break;                                                                   \
1160
159k
    }                                                                          \
1161
159k
    *nextTokPtr = ptr;                                                         \
1162
65
    return XML_TOK_INVALID;
1163
672k
    LEAD_CASE(2)
1164
15.3k
    LEAD_CASE(3)
1165
250
    LEAD_CASE(4)
1166
0
#  undef LEAD_CASE
1167
267k
  case BT_NMSTRT:
1168
447k
  case BT_HEX:
1169
447k
    tok = XML_TOK_NAME;
1170
447k
    ptr += MINBPC(enc);
1171
447k
    break;
1172
848
  case BT_DIGIT:
1173
1.22k
  case BT_NAME:
1174
1.68k
  case BT_MINUS:
1175
#  ifdef XML_NS
1176
  case BT_COLON:
1177
#  endif
1178
1.68k
    tok = XML_TOK_NMTOKEN;
1179
1.68k
    ptr += MINBPC(enc);
1180
1.68k
    break;
1181
178
  case BT_NONASCII:
1182
178
    if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {
1183
143
      ptr += MINBPC(enc);
1184
143
      tok = XML_TOK_NAME;
1185
143
      break;
1186
143
    }
1187
35
    if (IS_NAME_CHAR_MINBPC(enc, ptr)) {
1188
13
      ptr += MINBPC(enc);
1189
13
      tok = XML_TOK_NMTOKEN;
1190
13
      break;
1191
13
    }
1192
    /* fall through */
1193
85
  default:
1194
85
    *nextTokPtr = ptr;
1195
85
    return XML_TOK_INVALID;
1196
6.27M
  }
1197
15.1M
  while (HAS_CHAR(enc, ptr, end)) {
1198
15.1M
    switch (BYTE_TYPE(enc, ptr)) {
1199
45.0M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1200
18.8k
    case BT_GT:
1201
131k
    case BT_RPAR:
1202
132k
    case BT_COMMA:
1203
321k
    case BT_VERBAR:
1204
323k
    case BT_LSQB:
1205
323k
    case BT_PERCNT:
1206
470k
    case BT_S:
1207
600k
    case BT_CR:
1208
621k
    case BT_LF:
1209
621k
      *nextTokPtr = ptr;
1210
621k
      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
713
    case BT_PLUS:
1232
713
      if (tok == XML_TOK_NMTOKEN) {
1233
1
        *nextTokPtr = ptr;
1234
1
        return XML_TOK_INVALID;
1235
1
      }
1236
712
      *nextTokPtr = ptr + MINBPC(enc);
1237
712
      return XML_TOK_NAME_PLUS;
1238
2.11k
    case BT_AST:
1239
2.11k
      if (tok == XML_TOK_NMTOKEN) {
1240
1
        *nextTokPtr = ptr;
1241
1
        return XML_TOK_INVALID;
1242
1
      }
1243
2.11k
      *nextTokPtr = ptr + MINBPC(enc);
1244
2.11k
      return XML_TOK_NAME_ASTERISK;
1245
248
    case BT_QUEST:
1246
248
      if (tok == XML_TOK_NMTOKEN) {
1247
1
        *nextTokPtr = ptr;
1248
1
        return XML_TOK_INVALID;
1249
1
      }
1250
247
      *nextTokPtr = ptr + MINBPC(enc);
1251
247
      return XML_TOK_NAME_QUESTION;
1252
63
    default:
1253
63
      *nextTokPtr = ptr;
1254
63
      return XML_TOK_INVALID;
1255
15.1M
    }
1256
15.1M
  }
1257
681
  return -tok;
1258
625k
}
xmltok.c:normal_prologTok
Line
Count
Source
1018
6.28M
                  const char **nextTokPtr) {
1019
6.28M
  int tok;
1020
6.28M
  if (ptr >= end)
1021
8.14k
    return XML_TOK_NONE;
1022
6.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
6.27M
  switch (BYTE_TYPE(enc, ptr)) {
1032
6.17k
  case BT_QUOT:
1033
6.17k
    return PREFIX(scanLit)(BT_QUOT, enc, ptr + MINBPC(enc), end, nextTokPtr);
1034
58.2k
  case BT_APOS:
1035
58.2k
    return PREFIX(scanLit)(BT_APOS, enc, ptr + MINBPC(enc), end, nextTokPtr);
1036
94.8k
  case BT_LT: {
1037
94.8k
    ptr += MINBPC(enc);
1038
94.8k
    REQUIRE_CHAR(enc, ptr, end);
1039
94.8k
    switch (BYTE_TYPE(enc, ptr)) {
1040
78.5k
    case BT_EXCL:
1041
78.5k
      return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1042
10.4k
    case BT_QUEST:
1043
10.4k
      return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1044
4.57k
    case BT_NMSTRT:
1045
5.70k
    case BT_HEX:
1046
5.70k
    case BT_NONASCII:
1047
5.74k
    case BT_LEAD2:
1048
5.76k
    case BT_LEAD3:
1049
5.77k
    case BT_LEAD4:
1050
5.77k
      *nextTokPtr = ptr - MINBPC(enc);
1051
5.77k
      return XML_TOK_INSTANCE_START;
1052
94.8k
    }
1053
19
    *nextTokPtr = ptr;
1054
19
    return XML_TOK_INVALID;
1055
94.8k
  }
1056
302k
  case BT_CR:
1057
302k
    if (ptr + MINBPC(enc) == end) {
1058
317
      *nextTokPtr = end;
1059
      /* indicate that this might be part of a CR/LF pair */
1060
317
      return -XML_TOK_PROLOG_S;
1061
317
    }
1062
    /* fall through */
1063
640k
  case BT_S:
1064
714k
  case BT_LF:
1065
732k
    for (;;) {
1066
732k
      ptr += MINBPC(enc);
1067
732k
      if (! HAS_CHAR(enc, ptr, end))
1068
196
        break;
1069
732k
      switch (BYTE_TYPE(enc, ptr)) {
1070
6.84k
      case BT_S:
1071
14.6k
      case BT_LF:
1072
14.6k
        break;
1073
3.38k
      case BT_CR:
1074
        /* don't split CR/LF pair */
1075
3.38k
        if (ptr + MINBPC(enc) != end)
1076
3.24k
          break;
1077
        /* fall through */
1078
714k
      default:
1079
714k
        *nextTokPtr = ptr;
1080
714k
        return XML_TOK_PROLOG_S;
1081
732k
      }
1082
732k
    }
1083
196
    *nextTokPtr = ptr;
1084
196
    return XML_TOK_PROLOG_S;
1085
75.3k
  case BT_PERCNT:
1086
75.3k
    return PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1087
3.20k
  case BT_COMMA:
1088
3.20k
    *nextTokPtr = ptr + MINBPC(enc);
1089
3.20k
    return XML_TOK_COMMA;
1090
2.64k
  case BT_LSQB:
1091
2.64k
    *nextTokPtr = ptr + MINBPC(enc);
1092
2.64k
    return XML_TOK_OPEN_BRACKET;
1093
1.36k
  case BT_RSQB:
1094
1.36k
    ptr += MINBPC(enc);
1095
1.36k
    if (! HAS_CHAR(enc, ptr, end))
1096
3
      return -XML_TOK_CLOSE_BRACKET;
1097
1.36k
    if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) {
1098
22
      REQUIRE_CHARS(enc, ptr, end, 2);
1099
18
      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
18
    }
1104
1.35k
    *nextTokPtr = ptr;
1105
1.35k
    return XML_TOK_CLOSE_BRACKET;
1106
4.16M
  case BT_LPAR:
1107
4.16M
    *nextTokPtr = ptr + MINBPC(enc);
1108
4.16M
    return XML_TOK_OPEN_PAREN;
1109
124k
  case BT_RPAR:
1110
124k
    ptr += MINBPC(enc);
1111
124k
    if (! HAS_CHAR(enc, ptr, end))
1112
85
      return -XML_TOK_CLOSE_PAREN;
1113
124k
    switch (BYTE_TYPE(enc, ptr)) {
1114
2.48k
    case BT_AST:
1115
2.48k
      *nextTokPtr = ptr + MINBPC(enc);
1116
2.48k
      return XML_TOK_CLOSE_PAREN_ASTERISK;
1117
1.35k
    case BT_QUEST:
1118
1.35k
      *nextTokPtr = ptr + MINBPC(enc);
1119
1.35k
      return XML_TOK_CLOSE_PAREN_QUESTION;
1120
1.77k
    case BT_PLUS:
1121
1.77k
      *nextTokPtr = ptr + MINBPC(enc);
1122
1.77k
      return XML_TOK_CLOSE_PAREN_PLUS;
1123
29.7k
    case BT_CR:
1124
30.2k
    case BT_LF:
1125
109k
    case BT_S:
1126
110k
    case BT_GT:
1127
111k
    case BT_COMMA:
1128
114k
    case BT_VERBAR:
1129
118k
    case BT_RPAR:
1130
118k
      *nextTokPtr = ptr;
1131
118k
      return XML_TOK_CLOSE_PAREN;
1132
124k
    }
1133
21
    *nextTokPtr = ptr;
1134
21
    return XML_TOK_INVALID;
1135
214k
  case BT_VERBAR:
1136
214k
    *nextTokPtr = ptr + MINBPC(enc);
1137
214k
    return XML_TOK_OR;
1138
73.8k
  case BT_GT:
1139
73.8k
    *nextTokPtr = ptr + MINBPC(enc);
1140
73.8k
    return XML_TOK_DECL_CLOSE;
1141
113k
  case BT_NUM:
1142
113k
    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
672k
    LEAD_CASE(2)
1164
15.3k
    LEAD_CASE(3)
1165
178
    LEAD_CASE(4)
1166
0
#  undef LEAD_CASE
1167
267k
  case BT_NMSTRT:
1168
447k
  case BT_HEX:
1169
447k
    tok = XML_TOK_NAME;
1170
447k
    ptr += MINBPC(enc);
1171
447k
    break;
1172
848
  case BT_DIGIT:
1173
1.22k
  case BT_NAME:
1174
1.68k
  case BT_MINUS:
1175
#  ifdef XML_NS
1176
  case BT_COLON:
1177
#  endif
1178
1.68k
    tok = XML_TOK_NMTOKEN;
1179
1.68k
    ptr += MINBPC(enc);
1180
1.68k
    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
53
  default:
1194
53
    *nextTokPtr = ptr;
1195
53
    return XML_TOK_INVALID;
1196
6.27M
  }
1197
15.1M
  while (HAS_CHAR(enc, ptr, end)) {
1198
15.1M
    switch (BYTE_TYPE(enc, ptr)) {
1199
44.9M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1200
18.8k
    case BT_GT:
1201
131k
    case BT_RPAR:
1202
132k
    case BT_COMMA:
1203
321k
    case BT_VERBAR:
1204
323k
    case BT_LSQB:
1205
323k
    case BT_PERCNT:
1206
470k
    case BT_S:
1207
600k
    case BT_CR:
1208
621k
    case BT_LF:
1209
621k
      *nextTokPtr = ptr;
1210
621k
      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
713
    case BT_PLUS:
1232
713
      if (tok == XML_TOK_NMTOKEN) {
1233
1
        *nextTokPtr = ptr;
1234
1
        return XML_TOK_INVALID;
1235
1
      }
1236
712
      *nextTokPtr = ptr + MINBPC(enc);
1237
712
      return XML_TOK_NAME_PLUS;
1238
2.11k
    case BT_AST:
1239
2.11k
      if (tok == XML_TOK_NMTOKEN) {
1240
1
        *nextTokPtr = ptr;
1241
1
        return XML_TOK_INVALID;
1242
1
      }
1243
2.11k
      *nextTokPtr = ptr + MINBPC(enc);
1244
2.11k
      return XML_TOK_NAME_ASTERISK;
1245
248
    case BT_QUEST:
1246
248
      if (tok == XML_TOK_NMTOKEN) {
1247
1
        *nextTokPtr = ptr;
1248
1
        return XML_TOK_INVALID;
1249
1
      }
1250
247
      *nextTokPtr = ptr + MINBPC(enc);
1251
247
      return XML_TOK_NAME_QUESTION;
1252
47
    default:
1253
47
      *nextTokPtr = ptr;
1254
47
      return XML_TOK_INVALID;
1255
15.1M
    }
1256
15.1M
  }
1257
637
  return -tok;
1258
625k
}
xmltok.c:little2_prologTok
Line
Count
Source
1018
112
                  const char **nextTokPtr) {
1019
112
  int tok;
1020
112
  if (ptr >= end)
1021
2
    return XML_TOK_NONE;
1022
110
  if (MINBPC(enc) > 1) {
1023
110
    size_t n = end - ptr;
1024
110
    if (n & (MINBPC(enc) - 1)) {
1025
21
      n &= ~(MINBPC(enc) - 1);
1026
21
      if (n == 0)
1027
2
        return XML_TOK_PARTIAL;
1028
19
      end = ptr + n;
1029
19
    }
1030
110
  }
1031
108
  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
28
    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
77
      ptr += MINBPC(enc);
1184
77
      tok = XML_TOK_NAME;
1185
77
      break;
1186
77
    }
1187
13
    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
15
  default:
1194
15
    *nextTokPtr = ptr;
1195
15
    return XML_TOK_INVALID;
1196
108
  }
1197
787
  while (HAS_CHAR(enc, ptr, end)) {
1198
787
    switch (BYTE_TYPE(enc, ptr)) {
1199
3.70k
      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
787
    }
1256
787
  }
1257
20
  return -tok;
1258
80
}
xmltok.c:big2_prologTok
Line
Count
Source
1018
114
                  const char **nextTokPtr) {
1019
114
  int tok;
1020
114
  if (ptr >= end)
1021
2
    return XML_TOK_NONE;
1022
112
  if (MINBPC(enc) > 1) {
1023
112
    size_t n = end - ptr;
1024
112
    if (n & (MINBPC(enc) - 1)) {
1025
21
      n &= ~(MINBPC(enc) - 1);
1026
21
      if (n == 0)
1027
2
        return XML_TOK_PARTIAL;
1028
19
      end = ptr + n;
1029
19
    }
1030
112
  }
1031
110
  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
44
    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
88
  case BT_NONASCII:
1182
88
    if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {
1183
66
      ptr += MINBPC(enc);
1184
66
      tok = XML_TOK_NAME;
1185
66
      break;
1186
66
    }
1187
22
    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
17
  default:
1194
17
    *nextTokPtr = ptr;
1195
17
    return XML_TOK_INVALID;
1196
110
  }
1197
1.35k
  while (HAS_CHAR(enc, ptr, end)) {
1198
1.35k
    switch (BYTE_TYPE(enc, ptr)) {
1199
6.58k
      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
7
    default:
1253
7
      *nextTokPtr = ptr;
1254
7
      return XML_TOK_INVALID;
1255
1.35k
    }
1256
1.35k
  }
1257
24
  return -tok;
1258
76
}
1259
1260
static int PTRCALL
1261
PREFIX(attributeValueTok)(const ENCODING *enc, const char *ptr, const char *end,
1262
2.23M
                          const char **nextTokPtr) {
1263
2.23M
  const char *start;
1264
2.23M
  if (ptr >= end)
1265
120k
    return XML_TOK_NONE;
1266
2.11M
  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.11M
  start = ptr;
1275
16.9M
  while (HAS_CHAR(enc, ptr, end)) {
1276
16.9M
    switch (BYTE_TYPE(enc, ptr)) {
1277
0
#  define LEAD_CASE(n)                                                         \
1278
161k
  case BT_LEAD##n:                                                             \
1279
161k
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1280
161k
    break;
1281
25.8k
      LEAD_CASE(2)
1282
69.6k
      LEAD_CASE(3)
1283
65.5k
      LEAD_CASE(4)
1284
0
#  undef LEAD_CASE
1285
353k
    case BT_AMP:
1286
353k
      if (ptr == start)
1287
266k
        return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1288
87.4k
      *nextTokPtr = ptr;
1289
87.4k
      return XML_TOK_DATA_CHARS;
1290
2
    case BT_LT:
1291
      /* this is for inside entity references */
1292
2
      *nextTokPtr = ptr;
1293
2
      return XML_TOK_INVALID;
1294
502k
    case BT_LF:
1295
502k
      if (ptr == start) {
1296
356k
        *nextTokPtr = ptr + MINBPC(enc);
1297
356k
        return XML_TOK_DATA_NEWLINE;
1298
356k
      }
1299
145k
      *nextTokPtr = ptr;
1300
145k
      return XML_TOK_DATA_CHARS;
1301
881k
    case BT_CR:
1302
881k
      if (ptr == start) {
1303
595k
        ptr += MINBPC(enc);
1304
595k
        if (! HAS_CHAR(enc, ptr, end))
1305
4.01k
          return XML_TOK_TRAILING_CR;
1306
591k
        if (BYTE_TYPE(enc, ptr) == BT_LF)
1307
63.6k
          ptr += MINBPC(enc);
1308
591k
        *nextTokPtr = ptr;
1309
591k
        return XML_TOK_DATA_NEWLINE;
1310
595k
      }
1311
286k
      *nextTokPtr = ptr;
1312
286k
      return XML_TOK_DATA_CHARS;
1313
271k
    case BT_S:
1314
271k
      if (ptr == start) {
1315
189k
        *nextTokPtr = ptr + MINBPC(enc);
1316
189k
        return XML_TOK_ATTRIBUTE_VALUE_S;
1317
189k
      }
1318
81.8k
      *nextTokPtr = ptr;
1319
81.8k
      return XML_TOK_DATA_CHARS;
1320
14.8M
    default:
1321
14.8M
      ptr += MINBPC(enc);
1322
14.8M
      break;
1323
16.9M
    }
1324
16.9M
  }
1325
102k
  *nextTokPtr = ptr;
1326
102k
  return XML_TOK_DATA_CHARS;
1327
2.11M
}
xmltok.c:normal_attributeValueTok
Line
Count
Source
1262
2.23M
                          const char **nextTokPtr) {
1263
2.23M
  const char *start;
1264
2.23M
  if (ptr >= end)
1265
120k
    return XML_TOK_NONE;
1266
2.11M
  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.11M
  start = ptr;
1275
16.9M
  while (HAS_CHAR(enc, ptr, end)) {
1276
16.9M
    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
25.8k
      LEAD_CASE(2)
1282
69.6k
      LEAD_CASE(3)
1283
65.5k
      LEAD_CASE(4)
1284
0
#  undef LEAD_CASE
1285
353k
    case BT_AMP:
1286
353k
      if (ptr == start)
1287
266k
        return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1288
87.4k
      *nextTokPtr = ptr;
1289
87.4k
      return XML_TOK_DATA_CHARS;
1290
2
    case BT_LT:
1291
      /* this is for inside entity references */
1292
2
      *nextTokPtr = ptr;
1293
2
      return XML_TOK_INVALID;
1294
502k
    case BT_LF:
1295
502k
      if (ptr == start) {
1296
356k
        *nextTokPtr = ptr + MINBPC(enc);
1297
356k
        return XML_TOK_DATA_NEWLINE;
1298
356k
      }
1299
145k
      *nextTokPtr = ptr;
1300
145k
      return XML_TOK_DATA_CHARS;
1301
881k
    case BT_CR:
1302
881k
      if (ptr == start) {
1303
595k
        ptr += MINBPC(enc);
1304
595k
        if (! HAS_CHAR(enc, ptr, end))
1305
4.01k
          return XML_TOK_TRAILING_CR;
1306
591k
        if (BYTE_TYPE(enc, ptr) == BT_LF)
1307
63.6k
          ptr += MINBPC(enc);
1308
591k
        *nextTokPtr = ptr;
1309
591k
        return XML_TOK_DATA_NEWLINE;
1310
595k
      }
1311
286k
      *nextTokPtr = ptr;
1312
286k
      return XML_TOK_DATA_CHARS;
1313
271k
    case BT_S:
1314
271k
      if (ptr == start) {
1315
189k
        *nextTokPtr = ptr + MINBPC(enc);
1316
189k
        return XML_TOK_ATTRIBUTE_VALUE_S;
1317
189k
      }
1318
81.8k
      *nextTokPtr = ptr;
1319
81.8k
      return XML_TOK_DATA_CHARS;
1320
14.8M
    default:
1321
14.8M
      ptr += MINBPC(enc);
1322
14.8M
      break;
1323
16.9M
    }
1324
16.9M
  }
1325
102k
  *nextTokPtr = ptr;
1326
102k
  return XML_TOK_DATA_CHARS;
1327
2.11M
}
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.79k
                   const char **badPtr) {
1451
2.79k
  ptr += MINBPC(enc);
1452
2.79k
  end -= MINBPC(enc);
1453
802k
  for (; HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
1454
802k
    switch (BYTE_TYPE(enc, ptr)) {
1455
342k
    case BT_DIGIT:
1456
525k
    case BT_HEX:
1457
527k
    case BT_MINUS:
1458
527k
    case BT_APOS:
1459
527k
    case BT_LPAR:
1460
582k
    case BT_RPAR:
1461
583k
    case BT_PLUS:
1462
584k
    case BT_COMMA:
1463
667k
    case BT_SOL:
1464
668k
    case BT_EQUALS:
1465
674k
    case BT_QUEST:
1466
677k
    case BT_CR:
1467
678k
    case BT_LF:
1468
679k
    case BT_SEMI:
1469
679k
    case BT_EXCL:
1470
681k
    case BT_AST:
1471
685k
    case BT_PERCNT:
1472
695k
    case BT_NUM:
1473
#  ifdef XML_NS
1474
    case BT_COLON:
1475
#  endif
1476
695k
      break;
1477
2.47k
    case BT_S:
1478
2.47k
      if (CHAR_MATCHES(enc, ptr, ASCII_TAB)) {
1479
1
        *badPtr = ptr;
1480
1
        return 0;
1481
1
      }
1482
2.47k
      break;
1483
4.60k
    case BT_NAME:
1484
102k
    case BT_NMSTRT:
1485
102k
      if (! (BYTE_TO_ASCII(enc, ptr) & ~0x7f))
1486
102k
        break;
1487
      /* fall through */
1488
1.87k
    default:
1489
1.87k
      switch (BYTE_TO_ASCII(enc, ptr)) {
1490
1.66k
      case 0x24: /* $ */
1491
1.86k
      case 0x40: /* @ */
1492
1.86k
        break;
1493
9
      default:
1494
9
        *badPtr = ptr;
1495
9
        return 0;
1496
1.87k
      }
1497
1.86k
      break;
1498
802k
    }
1499
802k
  }
1500
2.78k
  return 1;
1501
2.79k
}
xmltok.c:normal_isPublicId
Line
Count
Source
1450
2.79k
                   const char **badPtr) {
1451
2.79k
  ptr += MINBPC(enc);
1452
2.79k
  end -= MINBPC(enc);
1453
802k
  for (; HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
1454
802k
    switch (BYTE_TYPE(enc, ptr)) {
1455
342k
    case BT_DIGIT:
1456
525k
    case BT_HEX:
1457
527k
    case BT_MINUS:
1458
527k
    case BT_APOS:
1459
527k
    case BT_LPAR:
1460
582k
    case BT_RPAR:
1461
583k
    case BT_PLUS:
1462
584k
    case BT_COMMA:
1463
667k
    case BT_SOL:
1464
668k
    case BT_EQUALS:
1465
674k
    case BT_QUEST:
1466
677k
    case BT_CR:
1467
678k
    case BT_LF:
1468
679k
    case BT_SEMI:
1469
679k
    case BT_EXCL:
1470
681k
    case BT_AST:
1471
685k
    case BT_PERCNT:
1472
695k
    case BT_NUM:
1473
#  ifdef XML_NS
1474
    case BT_COLON:
1475
#  endif
1476
695k
      break;
1477
2.47k
    case BT_S:
1478
2.47k
      if (CHAR_MATCHES(enc, ptr, ASCII_TAB)) {
1479
1
        *badPtr = ptr;
1480
1
        return 0;
1481
1
      }
1482
2.47k
      break;
1483
4.60k
    case BT_NAME:
1484
102k
    case BT_NMSTRT:
1485
102k
      if (! (BYTE_TO_ASCII(enc, ptr) & ~0x7f))
1486
102k
        break;
1487
      /* fall through */
1488
1.87k
    default:
1489
1.87k
      switch (BYTE_TO_ASCII(enc, ptr)) {
1490
1.66k
      case 0x24: /* $ */
1491
1.86k
      case 0x40: /* @ */
1492
1.86k
        break;
1493
9
      default:
1494
9
        *badPtr = ptr;
1495
9
        return 0;
1496
1.87k
      }
1497
1.86k
      break;
1498
802k
    }
1499
802k
  }
1500
2.78k
  return 1;
1501
2.79k
}
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
405k
                ATTRIBUTE *atts) {
1511
405k
  enum { other, inName, inValue } state = inName;
1512
405k
  int nAtts = 0;
1513
405k
  int open = 0; /* defined when state == inValue;
1514
                   initialization just to shut up compilers */
1515
1516
48.6M
  for (ptr += MINBPC(enc);; ptr += MINBPC(enc)) {
1517
48.6M
    switch (BYTE_TYPE(enc, ptr)) {
1518
0
#  define START_NAME                                                           \
1519
27.5M
    if (state == other) {                                                      \
1520
3.98M
      if (nAtts < attsMax) {                                                   \
1521
2.03M
        atts[nAtts].name = ptr;                                                \
1522
2.03M
        atts[nAtts].normalized = 1;                                            \
1523
2.03M
      }                                                                        \
1524
3.98M
      state = inName;                                                          \
1525
3.98M
    }
1526
0
#  define LEAD_CASE(n)                                                         \
1527
268k
  case BT_LEAD##n: /* NOTE: The encoding has already been validated. */        \
1528
268k
    START_NAME ptr += (n - MINBPC(enc));                                       \
1529
268k
    break;
1530
89.7k
      LEAD_CASE(2)
1531
129k
      LEAD_CASE(3)
1532
49.5k
      LEAD_CASE(4)
1533
0
#  undef LEAD_CASE
1534
0
    case BT_NONASCII:
1535
26.2M
    case BT_NMSTRT:
1536
27.3M
    case BT_HEX:
1537
27.3M
      START_NAME
1538
27.3M
      break;
1539
0
#  undef START_NAME
1540
613k
    case BT_QUOT:
1541
613k
      if (state != inValue) {
1542
244k
        if (nAtts < attsMax)
1543
156k
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1544
244k
        state = inValue;
1545
244k
        open = BT_QUOT;
1546
369k
      } else if (open == BT_QUOT) {
1547
244k
        state = other;
1548
244k
        if (nAtts < attsMax)
1549
156k
          atts[nAtts].valueEnd = ptr;
1550
244k
        nAtts++;
1551
244k
      }
1552
613k
      break;
1553
7.51M
    case BT_APOS:
1554
7.51M
      if (state != inValue) {
1555
3.73M
        if (nAtts < attsMax)
1556
1.88M
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1557
3.73M
        state = inValue;
1558
3.73M
        open = BT_APOS;
1559
3.77M
      } else if (open == BT_APOS) {
1560
3.73M
        state = other;
1561
3.73M
        if (nAtts < attsMax)
1562
1.88M
          atts[nAtts].valueEnd = ptr;
1563
3.73M
        nAtts++;
1564
3.73M
      }
1565
7.51M
      break;
1566
148k
    case BT_AMP:
1567
148k
      if (nAtts < attsMax)
1568
140k
        atts[nAtts].normalized = 0;
1569
148k
      break;
1570
2.59M
    case BT_S:
1571
2.59M
      if (state == inName)
1572
60.7k
        state = other;
1573
2.53M
      else if (state == inValue && nAtts < attsMax && atts[nAtts].normalized
1574
99.3k
               && (ptr == atts[nAtts].valuePtr
1575
20.6k
                   || BYTE_TO_ASCII(enc, ptr) != ASCII_SPACE
1576
12.7k
                   || BYTE_TO_ASCII(enc, ptr + MINBPC(enc)) == ASCII_SPACE
1577
12.1k
                   || BYTE_TYPE(enc, ptr + MINBPC(enc)) == open))
1578
90.6k
        atts[nAtts].normalized = 0;
1579
2.59M
      break;
1580
2.30M
    case BT_CR:
1581
2.83M
    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
2.83M
      if (state == inName)
1585
40.7k
        state = other;
1586
2.79M
      else if (state == inValue && nAtts < attsMax)
1587
651k
        atts[nAtts].normalized = 0;
1588
2.83M
      break;
1589
319k
    case BT_GT:
1590
441k
    case BT_SOL:
1591
441k
      if (state != inValue)
1592
405k
        return nAtts;
1593
36.2k
      break;
1594
6.91M
    default:
1595
6.91M
      break;
1596
48.6M
    }
1597
48.6M
  }
1598
  /* not reached */
1599
405k
}
xmltok.c:normal_getAtts
Line
Count
Source
1510
405k
                ATTRIBUTE *atts) {
1511
405k
  enum { other, inName, inValue } state = inName;
1512
405k
  int nAtts = 0;
1513
405k
  int open = 0; /* defined when state == inValue;
1514
                   initialization just to shut up compilers */
1515
1516
48.6M
  for (ptr += MINBPC(enc);; ptr += MINBPC(enc)) {
1517
48.6M
    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
89.7k
      LEAD_CASE(2)
1531
129k
      LEAD_CASE(3)
1532
49.5k
      LEAD_CASE(4)
1533
0
#  undef LEAD_CASE
1534
0
    case BT_NONASCII:
1535
26.2M
    case BT_NMSTRT:
1536
27.3M
    case BT_HEX:
1537
27.3M
      START_NAME
1538
27.3M
      break;
1539
0
#  undef START_NAME
1540
613k
    case BT_QUOT:
1541
613k
      if (state != inValue) {
1542
244k
        if (nAtts < attsMax)
1543
156k
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1544
244k
        state = inValue;
1545
244k
        open = BT_QUOT;
1546
369k
      } else if (open == BT_QUOT) {
1547
244k
        state = other;
1548
244k
        if (nAtts < attsMax)
1549
156k
          atts[nAtts].valueEnd = ptr;
1550
244k
        nAtts++;
1551
244k
      }
1552
613k
      break;
1553
7.51M
    case BT_APOS:
1554
7.51M
      if (state != inValue) {
1555
3.73M
        if (nAtts < attsMax)
1556
1.88M
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1557
3.73M
        state = inValue;
1558
3.73M
        open = BT_APOS;
1559
3.77M
      } else if (open == BT_APOS) {
1560
3.73M
        state = other;
1561
3.73M
        if (nAtts < attsMax)
1562
1.88M
          atts[nAtts].valueEnd = ptr;
1563
3.73M
        nAtts++;
1564
3.73M
      }
1565
7.51M
      break;
1566
148k
    case BT_AMP:
1567
148k
      if (nAtts < attsMax)
1568
140k
        atts[nAtts].normalized = 0;
1569
148k
      break;
1570
2.59M
    case BT_S:
1571
2.59M
      if (state == inName)
1572
60.7k
        state = other;
1573
2.53M
      else if (state == inValue && nAtts < attsMax && atts[nAtts].normalized
1574
99.3k
               && (ptr == atts[nAtts].valuePtr
1575
20.6k
                   || BYTE_TO_ASCII(enc, ptr) != ASCII_SPACE
1576
12.7k
                   || BYTE_TO_ASCII(enc, ptr + MINBPC(enc)) == ASCII_SPACE
1577
12.1k
                   || BYTE_TYPE(enc, ptr + MINBPC(enc)) == open))
1578
90.6k
        atts[nAtts].normalized = 0;
1579
2.59M
      break;
1580
2.30M
    case BT_CR:
1581
2.83M
    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
2.83M
      if (state == inName)
1585
40.7k
        state = other;
1586
2.79M
      else if (state == inValue && nAtts < attsMax)
1587
651k
        atts[nAtts].normalized = 0;
1588
2.83M
      break;
1589
319k
    case BT_GT:
1590
441k
    case BT_SOL:
1591
441k
      if (state != inValue)
1592
405k
        return nAtts;
1593
36.2k
      break;
1594
6.91M
    default:
1595
6.91M
      break;
1596
48.6M
    }
1597
48.6M
  }
1598
  /* not reached */
1599
405k
}
Unexecuted instantiation: xmltok.c:little2_getAtts
Unexecuted instantiation: xmltok.c:big2_getAtts
1600
1601
static int PTRFASTCALL
1602
143k
PREFIX(charRefNumber)(const ENCODING *enc, const char *ptr) {
1603
143k
  int result = 0;
1604
  /* skip &# */
1605
143k
  UNUSED_P(enc);
1606
143k
  ptr += 2 * MINBPC(enc);
1607
143k
  if (CHAR_MATCHES(enc, ptr, ASCII_x)) {
1608
602k
    for (ptr += MINBPC(enc); ! CHAR_MATCHES(enc, ptr, ASCII_SEMI);
1609
471k
         ptr += MINBPC(enc)) {
1610
471k
      int c = BYTE_TO_ASCII(enc, ptr);
1611
471k
      switch (c) {
1612
9.28k
      case ASCII_0:
1613
44.4k
      case ASCII_1:
1614
95.8k
      case ASCII_2:
1615
103k
      case ASCII_3:
1616
164k
      case ASCII_4:
1617
209k
      case ASCII_5:
1618
215k
      case ASCII_6:
1619
256k
      case ASCII_7:
1620
290k
      case ASCII_8:
1621
302k
      case ASCII_9:
1622
302k
        result <<= 4;
1623
302k
        result |= (c - ASCII_0);
1624
302k
        break;
1625
44.7k
      case ASCII_A:
1626
48.6k
      case ASCII_B:
1627
49.9k
      case ASCII_C:
1628
55.0k
      case ASCII_D:
1629
57.4k
      case ASCII_E:
1630
84.9k
      case ASCII_F:
1631
84.9k
        result <<= 4;
1632
84.9k
        result += 10 + (c - ASCII_A);
1633
84.9k
        break;
1634
964
      case ASCII_a:
1635
22.0k
      case ASCII_b:
1636
23.8k
      case ASCII_c:
1637
67.7k
      case ASCII_d:
1638
69.7k
      case ASCII_e:
1639
84.1k
      case ASCII_f:
1640
84.1k
        result <<= 4;
1641
84.1k
        result += 10 + (c - ASCII_a);
1642
84.1k
        break;
1643
471k
      }
1644
471k
      if (result >= 0x110000)
1645
16
        return -1;
1646
471k
    }
1647
130k
  } else {
1648
61.1k
    for (; ! CHAR_MATCHES(enc, ptr, ASCII_SEMI); ptr += MINBPC(enc)) {
1649
48.6k
      int c = BYTE_TO_ASCII(enc, ptr);
1650
48.6k
      result *= 10;
1651
48.6k
      result += (c - ASCII_0);
1652
48.6k
      if (result >= 0x110000)
1653
2
        return -1;
1654
48.6k
    }
1655
12.5k
  }
1656
143k
  return checkCharRefNumber(result);
1657
143k
}
xmltok.c:normal_charRefNumber
Line
Count
Source
1602
143k
PREFIX(charRefNumber)(const ENCODING *enc, const char *ptr) {
1603
143k
  int result = 0;
1604
  /* skip &# */
1605
143k
  UNUSED_P(enc);
1606
143k
  ptr += 2 * MINBPC(enc);
1607
143k
  if (CHAR_MATCHES(enc, ptr, ASCII_x)) {
1608
602k
    for (ptr += MINBPC(enc); ! CHAR_MATCHES(enc, ptr, ASCII_SEMI);
1609
471k
         ptr += MINBPC(enc)) {
1610
471k
      int c = BYTE_TO_ASCII(enc, ptr);
1611
471k
      switch (c) {
1612
9.28k
      case ASCII_0:
1613
44.4k
      case ASCII_1:
1614
95.8k
      case ASCII_2:
1615
103k
      case ASCII_3:
1616
164k
      case ASCII_4:
1617
209k
      case ASCII_5:
1618
215k
      case ASCII_6:
1619
256k
      case ASCII_7:
1620
290k
      case ASCII_8:
1621
302k
      case ASCII_9:
1622
302k
        result <<= 4;
1623
302k
        result |= (c - ASCII_0);
1624
302k
        break;
1625
44.7k
      case ASCII_A:
1626
48.6k
      case ASCII_B:
1627
49.9k
      case ASCII_C:
1628
55.0k
      case ASCII_D:
1629
57.4k
      case ASCII_E:
1630
84.9k
      case ASCII_F:
1631
84.9k
        result <<= 4;
1632
84.9k
        result += 10 + (c - ASCII_A);
1633
84.9k
        break;
1634
964
      case ASCII_a:
1635
22.0k
      case ASCII_b:
1636
23.8k
      case ASCII_c:
1637
67.7k
      case ASCII_d:
1638
69.7k
      case ASCII_e:
1639
84.1k
      case ASCII_f:
1640
84.1k
        result <<= 4;
1641
84.1k
        result += 10 + (c - ASCII_a);
1642
84.1k
        break;
1643
471k
      }
1644
471k
      if (result >= 0x110000)
1645
16
        return -1;
1646
471k
    }
1647
130k
  } else {
1648
61.1k
    for (; ! CHAR_MATCHES(enc, ptr, ASCII_SEMI); ptr += MINBPC(enc)) {
1649
48.6k
      int c = BYTE_TO_ASCII(enc, ptr);
1650
48.6k
      result *= 10;
1651
48.6k
      result += (c - ASCII_0);
1652
48.6k
      if (result >= 0x110000)
1653
2
        return -1;
1654
48.6k
    }
1655
12.5k
  }
1656
143k
  return checkCharRefNumber(result);
1657
143k
}
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
168k
                             const char *end) {
1662
168k
  UNUSED_P(enc);
1663
168k
  switch ((end - ptr) / MINBPC(enc)) {
1664
9.99k
  case 2:
1665
9.99k
    if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_t)) {
1666
3.31k
      switch (BYTE_TO_ASCII(enc, ptr)) {
1667
708
      case ASCII_l:
1668
708
        return ASCII_LT;
1669
479
      case ASCII_g:
1670
479
        return ASCII_GT;
1671
3.31k
      }
1672
3.31k
    }
1673
8.81k
    break;
1674
51.1k
  case 3:
1675
51.1k
    if (CHAR_MATCHES(enc, ptr, ASCII_a)) {
1676
38.8k
      ptr += MINBPC(enc);
1677
38.8k
      if (CHAR_MATCHES(enc, ptr, ASCII_m)) {
1678
36.9k
        ptr += MINBPC(enc);
1679
36.9k
        if (CHAR_MATCHES(enc, ptr, ASCII_p))
1680
36.6k
          return ASCII_AMP;
1681
36.9k
      }
1682
38.8k
    }
1683
14.4k
    break;
1684
21.4k
  case 4:
1685
21.4k
    switch (BYTE_TO_ASCII(enc, ptr)) {
1686
10.8k
    case ASCII_q:
1687
10.8k
      ptr += MINBPC(enc);
1688
10.8k
      if (CHAR_MATCHES(enc, ptr, ASCII_u)) {
1689
9.19k
        ptr += MINBPC(enc);
1690
9.19k
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1691
8.49k
          ptr += MINBPC(enc);
1692
8.49k
          if (CHAR_MATCHES(enc, ptr, ASCII_t))
1693
8.16k
            return ASCII_QUOT;
1694
8.49k
        }
1695
9.19k
      }
1696
2.72k
      break;
1697
2.72k
    case ASCII_a:
1698
2.72k
      ptr += MINBPC(enc);
1699
2.72k
      if (CHAR_MATCHES(enc, ptr, ASCII_p)) {
1700
1.01k
        ptr += MINBPC(enc);
1701
1.01k
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1702
649
          ptr += MINBPC(enc);
1703
649
          if (CHAR_MATCHES(enc, ptr, ASCII_s))
1704
248
            return ASCII_APOS;
1705
649
        }
1706
1.01k
      }
1707
2.47k
      break;
1708
21.4k
    }
1709
168k
  }
1710
122k
  return 0;
1711
168k
}
xmltok.c:normal_predefinedEntityName
Line
Count
Source
1661
168k
                             const char *end) {
1662
168k
  UNUSED_P(enc);
1663
168k
  switch ((end - ptr) / MINBPC(enc)) {
1664
9.99k
  case 2:
1665
9.99k
    if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_t)) {
1666
3.31k
      switch (BYTE_TO_ASCII(enc, ptr)) {
1667
708
      case ASCII_l:
1668
708
        return ASCII_LT;
1669
479
      case ASCII_g:
1670
479
        return ASCII_GT;
1671
3.31k
      }
1672
3.31k
    }
1673
8.81k
    break;
1674
51.1k
  case 3:
1675
51.1k
    if (CHAR_MATCHES(enc, ptr, ASCII_a)) {
1676
38.8k
      ptr += MINBPC(enc);
1677
38.8k
      if (CHAR_MATCHES(enc, ptr, ASCII_m)) {
1678
36.9k
        ptr += MINBPC(enc);
1679
36.9k
        if (CHAR_MATCHES(enc, ptr, ASCII_p))
1680
36.6k
          return ASCII_AMP;
1681
36.9k
      }
1682
38.8k
    }
1683
14.4k
    break;
1684
21.4k
  case 4:
1685
21.4k
    switch (BYTE_TO_ASCII(enc, ptr)) {
1686
10.8k
    case ASCII_q:
1687
10.8k
      ptr += MINBPC(enc);
1688
10.8k
      if (CHAR_MATCHES(enc, ptr, ASCII_u)) {
1689
9.19k
        ptr += MINBPC(enc);
1690
9.19k
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1691
8.49k
          ptr += MINBPC(enc);
1692
8.49k
          if (CHAR_MATCHES(enc, ptr, ASCII_t))
1693
8.16k
            return ASCII_QUOT;
1694
8.49k
        }
1695
9.19k
      }
1696
2.72k
      break;
1697
2.72k
    case ASCII_a:
1698
2.72k
      ptr += MINBPC(enc);
1699
2.72k
      if (CHAR_MATCHES(enc, ptr, ASCII_p)) {
1700
1.01k
        ptr += MINBPC(enc);
1701
1.01k
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1702
649
          ptr += MINBPC(enc);
1703
649
          if (CHAR_MATCHES(enc, ptr, ASCII_s))
1704
248
            return ASCII_APOS;
1705
649
        }
1706
1.01k
      }
1707
2.47k
      break;
1708
21.4k
    }
1709
168k
  }
1710
122k
  return 0;
1711
168k
}
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
516k
                         const char *end1, const char *ptr2) {
1716
516k
  UNUSED_P(enc);
1717
2.37M
  for (; *ptr2; ptr1 += MINBPC(enc), ptr2++) {
1718
2.11M
    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
44
      return 0; /* LCOV_EXCL_LINE */
1725
44
    }
1726
2.11M
    if (! CHAR_MATCHES(enc, ptr1, *ptr2))
1727
265k
      return 0;
1728
2.11M
  }
1729
251k
  return ptr1 == end1;
1730
516k
}
xmltok.c:normal_nameMatchesAscii
Line
Count
Source
1715
516k
                         const char *end1, const char *ptr2) {
1716
516k
  UNUSED_P(enc);
1717
2.37M
  for (; *ptr2; ptr1 += MINBPC(enc), ptr2++) {
1718
2.11M
    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
44
      return 0; /* LCOV_EXCL_LINE */
1725
44
    }
1726
2.11M
    if (! CHAR_MATCHES(enc, ptr1, *ptr2))
1727
265k
      return 0;
1728
2.11M
  }
1729
251k
  return ptr1 == end1;
1730
516k
}
Unexecuted instantiation: xmltok.c:little2_nameMatchesAscii
Unexecuted instantiation: xmltok.c:big2_nameMatchesAscii
1731
1732
static int PTRFASTCALL
1733
567k
PREFIX(nameLength)(const ENCODING *enc, const char *ptr) {
1734
567k
  const char *start = ptr;
1735
12.9M
  for (;;) {
1736
12.9M
    switch (BYTE_TYPE(enc, ptr)) {
1737
0
#  define LEAD_CASE(n)                                                         \
1738
101k
  case BT_LEAD##n:                                                             \
1739
101k
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1740
101k
    break;
1741
66.1k
      LEAD_CASE(2)
1742
35.0k
      LEAD_CASE(3)
1743
0
      LEAD_CASE(4)
1744
0
#  undef LEAD_CASE
1745
0
    case BT_NONASCII:
1746
11.5M
    case BT_NMSTRT:
1747
#  ifdef XML_NS
1748
    case BT_COLON:
1749
#  endif
1750
12.1M
    case BT_HEX:
1751
12.2M
    case BT_DIGIT:
1752
12.2M
    case BT_NAME:
1753
12.2M
    case BT_MINUS:
1754
12.2M
      ptr += MINBPC(enc);
1755
12.2M
      break;
1756
567k
    default:
1757
567k
      return (int)(ptr - start);
1758
12.9M
    }
1759
12.9M
  }
1760
567k
}
xmltok.c:normal_nameLength
Line
Count
Source
1733
567k
PREFIX(nameLength)(const ENCODING *enc, const char *ptr) {
1734
567k
  const char *start = ptr;
1735
12.9M
  for (;;) {
1736
12.9M
    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
66.1k
      LEAD_CASE(2)
1742
35.0k
      LEAD_CASE(3)
1743
0
      LEAD_CASE(4)
1744
0
#  undef LEAD_CASE
1745
0
    case BT_NONASCII:
1746
11.5M
    case BT_NMSTRT:
1747
#  ifdef XML_NS
1748
    case BT_COLON:
1749
#  endif
1750
12.1M
    case BT_HEX:
1751
12.2M
    case BT_DIGIT:
1752
12.2M
    case BT_NAME:
1753
12.2M
    case BT_MINUS:
1754
12.2M
      ptr += MINBPC(enc);
1755
12.2M
      break;
1756
567k
    default:
1757
567k
      return (int)(ptr - start);
1758
12.9M
    }
1759
12.9M
  }
1760
567k
}
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.6k
                       POSITION *pos) {
1780
130M
  while (HAS_CHAR(enc, ptr, end)) {
1781
130M
    switch (BYTE_TYPE(enc, ptr)) {
1782
0
#  define LEAD_CASE(n)                                                         \
1783
1.80M
  case BT_LEAD##n:                                                             \
1784
1.80M
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1785
1.80M
    pos->columnNumber++;                                                       \
1786
1.80M
    break;
1787
992k
      LEAD_CASE(2)
1788
571k
      LEAD_CASE(3)
1789
239k
      LEAD_CASE(4)
1790
0
#  undef LEAD_CASE
1791
3.11M
    case BT_LF:
1792
3.11M
      pos->columnNumber = 0;
1793
3.11M
      pos->lineNumber++;
1794
3.11M
      ptr += MINBPC(enc);
1795
3.11M
      break;
1796
4.85M
    case BT_CR:
1797
4.85M
      pos->lineNumber++;
1798
4.85M
      ptr += MINBPC(enc);
1799
4.85M
      if (HAS_CHAR(enc, ptr, end) && BYTE_TYPE(enc, ptr) == BT_LF)
1800
787k
        ptr += MINBPC(enc);
1801
4.85M
      pos->columnNumber = 0;
1802
4.85M
      break;
1803
120M
    default:
1804
120M
      ptr += MINBPC(enc);
1805
120M
      pos->columnNumber++;
1806
120M
      break;
1807
130M
    }
1808
130M
  }
1809
17.6k
}
xmltok.c:normal_updatePosition
Line
Count
Source
1779
17.2k
                       POSITION *pos) {
1780
130M
  while (HAS_CHAR(enc, ptr, end)) {
1781
130M
    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
992k
      LEAD_CASE(2)
1788
571k
      LEAD_CASE(3)
1789
239k
      LEAD_CASE(4)
1790
0
#  undef LEAD_CASE
1791
3.11M
    case BT_LF:
1792
3.11M
      pos->columnNumber = 0;
1793
3.11M
      pos->lineNumber++;
1794
3.11M
      ptr += MINBPC(enc);
1795
3.11M
      break;
1796
4.85M
    case BT_CR:
1797
4.85M
      pos->lineNumber++;
1798
4.85M
      ptr += MINBPC(enc);
1799
4.85M
      if (HAS_CHAR(enc, ptr, end) && BYTE_TYPE(enc, ptr) == BT_LF)
1800
787k
        ptr += MINBPC(enc);
1801
4.85M
      pos->columnNumber = 0;
1802
4.85M
      break;
1803
120M
    default:
1804
120M
      ptr += MINBPC(enc);
1805
120M
      pos->columnNumber++;
1806
120M
      break;
1807
130M
    }
1808
130M
  }
1809
17.2k
}
xmltok.c:little2_updatePosition
Line
Count
Source
1779
201
                       POSITION *pos) {
1780
608
  while (HAS_CHAR(enc, ptr, end)) {
1781
608
    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
608
    default:
1804
608
      ptr += MINBPC(enc);
1805
608
      pos->columnNumber++;
1806
608
      break;
1807
608
    }
1808
608
  }
1809
201
}
xmltok.c:big2_updatePosition
Line
Count
Source
1779
204
                       POSITION *pos) {
1780
1.10k
  while (HAS_CHAR(enc, ptr, end)) {
1781
1.10k
    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
1.10k
    default:
1804
1.10k
      ptr += MINBPC(enc);
1805
1.10k
      pos->columnNumber++;
1806
1.10k
      break;
1807
1.10k
    }
1808
1.10k
  }
1809
204
}
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 */