Coverage Report

Created: 2025-08-29 06:27

/src/CMake/Utilities/cmexpat/lib/xmltok_impl.c
Line
Count
Source (jump to first uncovered line)
1
/* This file is included (from xmltok.c, 1-3 times depending on XML_MIN_SIZE)!
2
                            __  __            _
3
                         ___\ \/ /_ __   __ _| |_
4
                        / _ \\  /| '_ \ / _` | __|
5
                       |  __//  \| |_) | (_| | |_
6
                        \___/_/\_\ .__/ \__,_|\__|
7
                                 |_| XML parser
8
9
   Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
10
   Copyright (c) 2000      Clark Cooper <coopercc@users.sourceforge.net>
11
   Copyright (c) 2002      Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
12
   Copyright (c) 2002-2016 Karl Waclawek <karl@waclawek.net>
13
   Copyright (c) 2016-2022 Sebastian Pipping <sebastian@pipping.org>
14
   Copyright (c) 2017      Rhodri James <rhodri@wildebeest.org.uk>
15
   Copyright (c) 2018      Benjamin Peterson <benjamin@python.org>
16
   Copyright (c) 2018      Anton Maklakov <antmak.pub@gmail.com>
17
   Copyright (c) 2019      David Loffredo <loffredo@steptools.com>
18
   Copyright (c) 2020      Boris Kolpackov <boris@codesynthesis.com>
19
   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
28
#    define IS_INVALID_CHAR(enc, ptr, n) (0)
46
#  endif
47
48
#  define INVALID_LEAD_CASE(n, ptr, nextTokPtr)                                \
49
388k
  case BT_LEAD##n:                                                             \
50
388k
    if (end - ptr < n)                                                         \
51
388k
      return XML_TOK_PARTIAL_CHAR;                                             \
52
388k
    if (IS_INVALID_CHAR(enc, ptr, n)) {                                        \
53
67
      *(nextTokPtr) = (ptr);                                                   \
54
67
      return XML_TOK_INVALID;                                                  \
55
67
    }                                                                          \
56
388k
    ptr += n;                                                                  \
57
388k
    break;
58
59
#  define INVALID_CASES(ptr, nextTokPtr)                                       \
60
126k
    INVALID_LEAD_CASE(2, ptr, nextTokPtr)                                      \
61
153k
    INVALID_LEAD_CASE(3, ptr, nextTokPtr)                                      \
62
153k
    INVALID_LEAD_CASE(4, ptr, nextTokPtr)                                      \
63
108k
  case BT_NONXML:                                                              \
64
34
  case BT_MALFORM:                                                             \
65
63
  case BT_TRAIL:                                                               \
66
63
    *(nextTokPtr) = (ptr);                                                     \
67
63
    return XML_TOK_INVALID;
68
69
#  define CHECK_NAME_CASE(n, enc, ptr, end, nextTokPtr)                        \
70
226k
  case BT_LEAD##n:                                                             \
71
226k
    if (end - ptr < n)                                                         \
72
226k
      return XML_TOK_PARTIAL_CHAR;                                             \
73
226k
    if (IS_INVALID_CHAR(enc, ptr, n) || ! IS_NAME_CHAR(enc, ptr, n)) {         \
74
138
      *nextTokPtr = ptr;                                                       \
75
138
      return XML_TOK_INVALID;                                                  \
76
138
    }                                                                          \
77
226k
    ptr += n;                                                                  \
78
226k
    break;
79
80
#  define CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)                          \
81
17.3M
  case BT_NONASCII:                                                            \
82
17.3M
    if (! IS_NAME_CHAR_MINBPC(enc, ptr)) {                                     \
83
35
      *nextTokPtr = ptr;                                                       \
84
35
      return XML_TOK_INVALID;                                                  \
85
35
    }                                                                          \
86
17.3M
    /* fall through */                                                         \
87
17.3M
  case BT_NMSTRT:                                                              \
88
13.8M
  case BT_HEX:                                                                 \
89
17.0M
  case BT_DIGIT:                                                               \
90
17.1M
  case BT_NAME:                                                                \
91
17.3M
  case BT_MINUS:                                                               \
92
17.3M
    ptr += MINBPC(enc);                                                        \
93
17.3M
    break;                                                                     \
94
17.3M
    CHECK_NAME_CASE(2, enc, ptr, end, nextTokPtr)                              \
95
159k
    CHECK_NAME_CASE(3, enc, ptr, end, nextTokPtr)                              \
96
159k
    CHECK_NAME_CASE(4, enc, ptr, end, nextTokPtr)
97
98
#  define CHECK_NMSTRT_CASE(n, enc, ptr, end, nextTokPtr)                      \
99
62.4k
  case BT_LEAD##n:                                                             \
100
62.6k
    if ((end) - (ptr) < (n))                                                   \
101
62.4k
      return XML_TOK_PARTIAL_CHAR;                                             \
102
62.5k
    if (IS_INVALID_CHAR(enc, ptr, n) || ! IS_NMSTRT_CHAR(enc, ptr, n)) {       \
103
93
      *nextTokPtr = ptr;                                                       \
104
93
      return XML_TOK_INVALID;                                                  \
105
93
    }                                                                          \
106
62.5k
    ptr += n;                                                                  \
107
62.4k
    break;
108
109
#  define CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)                        \
110
2.47M
  case BT_NONASCII:                                                            \
111
2.47M
    if (! IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {                                   \
112
0
      *nextTokPtr = ptr;                                                       \
113
0
      return XML_TOK_INVALID;                                                  \
114
0
    }                                                                          \
115
2.47M
    /* fall through */                                                         \
116
2.47M
  case BT_NMSTRT:                                                              \
117
2.47M
  case BT_HEX:                                                                 \
118
2.47M
    ptr += MINBPC(enc);                                                        \
119
2.47M
    break;                                                                     \
120
2.47M
    CHECK_NMSTRT_CASE(2, enc, ptr, end, nextTokPtr)                            \
121
33.9k
    CHECK_NMSTRT_CASE(3, enc, ptr, end, nextTokPtr)                            \
122
33.8k
    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
166M
    ((end) - (ptr) >= ((count) * MINBPC(enc)))
130
131
6.04M
#  define HAS_CHAR(enc, ptr, end) HAS_CHARS(enc, ptr, end, 1)
132
133
#  define REQUIRE_CHARS(enc, ptr, end, count)                                  \
134
19.6M
    {                                                                          \
135
19.6M
      if (! HAS_CHARS(enc, ptr, end, count)) {                                 \
136
407
        return XML_TOK_PARTIAL;                                                \
137
407
      }                                                                        \
138
19.6M
    }
139
140
19.6M
#  define REQUIRE_CHAR(enc, ptr, end) REQUIRE_CHARS(enc, ptr, end, 1)
141
142
/* ptr points to character following "<!-" */
143
144
static int PTRCALL
145
PREFIX(scanComment)(const ENCODING *enc, const char *ptr, const char *end,
146
14.6k
                    const char **nextTokPtr) {
147
14.6k
  if (HAS_CHAR(enc, ptr, end)) {
148
14.6k
    if (! CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
149
8
      *nextTokPtr = ptr;
150
8
      return XML_TOK_INVALID;
151
8
    }
152
14.6k
    ptr += MINBPC(enc);
153
4.48M
    while (HAS_CHAR(enc, ptr, end)) {
154
4.48M
      switch (BYTE_TYPE(enc, ptr)) {
155
223k
        INVALID_CASES(ptr, nextTokPtr)
156
31.5k
      case BT_MINUS:
157
31.5k
        ptr += MINBPC(enc);
158
31.5k
        REQUIRE_CHAR(enc, ptr, end);
159
31.5k
        if (CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
160
14.5k
          ptr += MINBPC(enc);
161
14.5k
          REQUIRE_CHAR(enc, ptr, end);
162
14.5k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
163
7
            *nextTokPtr = ptr;
164
7
            return XML_TOK_INVALID;
165
7
          }
166
14.5k
          *nextTokPtr = ptr + MINBPC(enc);
167
14.5k
          return XML_TOK_COMMENT;
168
14.5k
        }
169
16.9k
        break;
170
4.34M
      default:
171
4.34M
        ptr += MINBPC(enc);
172
4.34M
        break;
173
4.48M
      }
174
4.48M
    }
175
14.6k
  }
176
74
  return XML_TOK_PARTIAL;
177
14.6k
}
xmltok.c:normal_scanComment
Line
Count
Source
146
14.6k
                    const char **nextTokPtr) {
147
14.6k
  if (HAS_CHAR(enc, ptr, end)) {
148
14.6k
    if (! CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
149
8
      *nextTokPtr = ptr;
150
8
      return XML_TOK_INVALID;
151
8
    }
152
14.6k
    ptr += MINBPC(enc);
153
4.48M
    while (HAS_CHAR(enc, ptr, end)) {
154
4.48M
      switch (BYTE_TYPE(enc, ptr)) {
155
223k
        INVALID_CASES(ptr, nextTokPtr)
156
31.5k
      case BT_MINUS:
157
31.5k
        ptr += MINBPC(enc);
158
31.5k
        REQUIRE_CHAR(enc, ptr, end);
159
31.5k
        if (CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
160
14.5k
          ptr += MINBPC(enc);
161
14.5k
          REQUIRE_CHAR(enc, ptr, end);
162
14.5k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
163
7
            *nextTokPtr = ptr;
164
7
            return XML_TOK_INVALID;
165
7
          }
166
14.5k
          *nextTokPtr = ptr + MINBPC(enc);
167
14.5k
          return XML_TOK_COMMENT;
168
14.5k
        }
169
16.9k
        break;
170
4.34M
      default:
171
4.34M
        ptr += MINBPC(enc);
172
4.34M
        break;
173
4.48M
      }
174
4.48M
    }
175
14.6k
  }
176
74
  return XML_TOK_PARTIAL;
177
14.6k
}
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
54.3k
                 const char **nextTokPtr) {
184
54.3k
  REQUIRE_CHAR(enc, ptr, end);
185
54.3k
  switch (BYTE_TYPE(enc, ptr)) {
186
2.20k
  case BT_MINUS:
187
2.20k
    return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
188
7
  case BT_LSQB:
189
7
    *nextTokPtr = ptr + MINBPC(enc);
190
7
    return XML_TOK_COND_SECT_OPEN;
191
1.07k
  case BT_NMSTRT:
192
52.1k
  case BT_HEX:
193
52.1k
    ptr += MINBPC(enc);
194
52.1k
    break;
195
1
  default:
196
1
    *nextTokPtr = ptr;
197
1
    return XML_TOK_INVALID;
198
54.3k
  }
199
366k
  while (HAS_CHAR(enc, ptr, end)) {
200
366k
    switch (BYTE_TYPE(enc, ptr)) {
201
13
    case BT_PERCNT:
202
13
      REQUIRE_CHARS(enc, ptr, end, 2);
203
      /* don't allow <!ENTITY% foo "whatever"> */
204
13
      switch (BYTE_TYPE(enc, ptr + MINBPC(enc))) {
205
1
      case BT_S:
206
2
      case BT_CR:
207
3
      case BT_LF:
208
5
      case BT_PERCNT:
209
5
        *nextTokPtr = ptr;
210
5
        return XML_TOK_INVALID;
211
13
      }
212
      /* fall through */
213
16.3k
    case BT_S:
214
48.8k
    case BT_CR:
215
52.0k
    case BT_LF:
216
52.0k
      *nextTokPtr = ptr;
217
52.0k
      return XML_TOK_DECL_OPEN;
218
287k
    case BT_NMSTRT:
219
314k
    case BT_HEX:
220
314k
      ptr += MINBPC(enc);
221
314k
      break;
222
5
    default:
223
5
      *nextTokPtr = ptr;
224
5
      return XML_TOK_INVALID;
225
366k
    }
226
366k
  }
227
60
  return XML_TOK_PARTIAL;
228
52.1k
}
xmltok.c:normal_scanDecl
Line
Count
Source
183
54.3k
                 const char **nextTokPtr) {
184
54.3k
  REQUIRE_CHAR(enc, ptr, end);
185
54.3k
  switch (BYTE_TYPE(enc, ptr)) {
186
2.20k
  case BT_MINUS:
187
2.20k
    return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
188
7
  case BT_LSQB:
189
7
    *nextTokPtr = ptr + MINBPC(enc);
190
7
    return XML_TOK_COND_SECT_OPEN;
191
1.07k
  case BT_NMSTRT:
192
52.1k
  case BT_HEX:
193
52.1k
    ptr += MINBPC(enc);
194
52.1k
    break;
195
1
  default:
196
1
    *nextTokPtr = ptr;
197
1
    return XML_TOK_INVALID;
198
54.3k
  }
199
366k
  while (HAS_CHAR(enc, ptr, end)) {
200
366k
    switch (BYTE_TYPE(enc, ptr)) {
201
13
    case BT_PERCNT:
202
13
      REQUIRE_CHARS(enc, ptr, end, 2);
203
      /* don't allow <!ENTITY% foo "whatever"> */
204
13
      switch (BYTE_TYPE(enc, ptr + MINBPC(enc))) {
205
1
      case BT_S:
206
2
      case BT_CR:
207
3
      case BT_LF:
208
5
      case BT_PERCNT:
209
5
        *nextTokPtr = ptr;
210
5
        return XML_TOK_INVALID;
211
13
      }
212
      /* fall through */
213
16.3k
    case BT_S:
214
48.8k
    case BT_CR:
215
52.0k
    case BT_LF:
216
52.0k
      *nextTokPtr = ptr;
217
52.0k
      return XML_TOK_DECL_OPEN;
218
287k
    case BT_NMSTRT:
219
314k
    case BT_HEX:
220
314k
      ptr += MINBPC(enc);
221
314k
      break;
222
5
    default:
223
5
      *nextTokPtr = ptr;
224
5
      return XML_TOK_INVALID;
225
366k
    }
226
366k
  }
227
60
  return XML_TOK_PARTIAL;
228
52.1k
}
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
25.6k
                      int *tokPtr) {
233
25.6k
  int upper = 0;
234
25.6k
  UNUSED_P(enc);
235
25.6k
  *tokPtr = XML_TOK_PI;
236
25.6k
  if (end - ptr != MINBPC(enc) * 3)
237
17.5k
    return 1;
238
8.09k
  switch (BYTE_TO_ASCII(enc, ptr)) {
239
5.29k
  case ASCII_x:
240
5.29k
    break;
241
1.15k
  case ASCII_X:
242
1.15k
    upper = 1;
243
1.15k
    break;
244
1.65k
  default:
245
1.65k
    return 1;
246
8.09k
  }
247
6.44k
  ptr += MINBPC(enc);
248
6.44k
  switch (BYTE_TO_ASCII(enc, ptr)) {
249
2.55k
  case ASCII_m:
250
2.55k
    break;
251
540
  case ASCII_M:
252
540
    upper = 1;
253
540
    break;
254
3.34k
  default:
255
3.34k
    return 1;
256
6.44k
  }
257
3.09k
  ptr += MINBPC(enc);
258
3.09k
  switch (BYTE_TO_ASCII(enc, ptr)) {
259
813
  case ASCII_l:
260
813
    break;
261
3
  case ASCII_L:
262
3
    upper = 1;
263
3
    break;
264
2.28k
  default:
265
2.28k
    return 1;
266
3.09k
  }
267
816
  if (upper)
268
6
    return 0;
269
810
  *tokPtr = XML_TOK_XML_DECL;
270
810
  return 1;
271
816
}
xmltok.c:normal_checkPiTarget
Line
Count
Source
232
25.6k
                      int *tokPtr) {
233
25.6k
  int upper = 0;
234
25.6k
  UNUSED_P(enc);
235
25.6k
  *tokPtr = XML_TOK_PI;
236
25.6k
  if (end - ptr != MINBPC(enc) * 3)
237
17.5k
    return 1;
238
8.09k
  switch (BYTE_TO_ASCII(enc, ptr)) {
239
5.29k
  case ASCII_x:
240
5.29k
    break;
241
1.15k
  case ASCII_X:
242
1.15k
    upper = 1;
243
1.15k
    break;
244
1.65k
  default:
245
1.65k
    return 1;
246
8.09k
  }
247
6.44k
  ptr += MINBPC(enc);
248
6.44k
  switch (BYTE_TO_ASCII(enc, ptr)) {
249
2.55k
  case ASCII_m:
250
2.55k
    break;
251
540
  case ASCII_M:
252
540
    upper = 1;
253
540
    break;
254
3.34k
  default:
255
3.34k
    return 1;
256
6.44k
  }
257
3.09k
  ptr += MINBPC(enc);
258
3.09k
  switch (BYTE_TO_ASCII(enc, ptr)) {
259
813
  case ASCII_l:
260
813
    break;
261
3
  case ASCII_L:
262
3
    upper = 1;
263
3
    break;
264
2.28k
  default:
265
2.28k
    return 1;
266
3.09k
  }
267
816
  if (upper)
268
6
    return 0;
269
810
  *tokPtr = XML_TOK_XML_DECL;
270
810
  return 1;
271
816
}
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
25.7k
               const char **nextTokPtr) {
278
25.7k
  int tok;
279
25.7k
  const char *target = ptr;
280
25.7k
  REQUIRE_CHAR(enc, ptr, end);
281
25.7k
  switch (BYTE_TYPE(enc, ptr)) {
282
32.8k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
283
1
  default:
284
1
    *nextTokPtr = ptr;
285
1
    return XML_TOK_INVALID;
286
25.7k
  }
287
641k
  while (HAS_CHAR(enc, ptr, end)) {
288
641k
    switch (BYTE_TYPE(enc, ptr)) {
289
2.21M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
290
5.69k
    case BT_S:
291
7.90k
    case BT_CR:
292
10.7k
    case BT_LF:
293
10.7k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
294
3
        *nextTokPtr = ptr;
295
3
        return XML_TOK_INVALID;
296
3
      }
297
10.7k
      ptr += MINBPC(enc);
298
3.76M
      while (HAS_CHAR(enc, ptr, end)) {
299
3.76M
        switch (BYTE_TYPE(enc, ptr)) {
300
122k
          INVALID_CASES(ptr, nextTokPtr)
301
40.6k
        case BT_QUEST:
302
40.6k
          ptr += MINBPC(enc);
303
40.6k
          REQUIRE_CHAR(enc, ptr, end);
304
40.6k
          if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
305
10.6k
            *nextTokPtr = ptr + MINBPC(enc);
306
10.6k
            return tok;
307
10.6k
          }
308
30.0k
          break;
309
3.66M
        default:
310
3.66M
          ptr += MINBPC(enc);
311
3.66M
          break;
312
3.76M
        }
313
3.76M
      }
314
82
      return XML_TOK_PARTIAL;
315
14.8k
    case BT_QUEST:
316
14.8k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
317
3
        *nextTokPtr = ptr;
318
3
        return XML_TOK_INVALID;
319
3
      }
320
14.8k
      ptr += MINBPC(enc);
321
14.8k
      REQUIRE_CHAR(enc, ptr, end);
322
14.8k
      if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
323
14.8k
        *nextTokPtr = ptr + MINBPC(enc);
324
14.8k
        return tok;
325
14.8k
      }
326
      /* fall through */
327
18
    default:
328
18
      *nextTokPtr = ptr;
329
18
      return XML_TOK_INVALID;
330
641k
    }
331
641k
  }
332
34
  return XML_TOK_PARTIAL;
333
25.7k
}
xmltok.c:normal_scanPi
Line
Count
Source
277
25.7k
               const char **nextTokPtr) {
278
25.7k
  int tok;
279
25.7k
  const char *target = ptr;
280
25.7k
  REQUIRE_CHAR(enc, ptr, end);
281
25.7k
  switch (BYTE_TYPE(enc, ptr)) {
282
32.8k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
283
1
  default:
284
1
    *nextTokPtr = ptr;
285
1
    return XML_TOK_INVALID;
286
25.7k
  }
287
641k
  while (HAS_CHAR(enc, ptr, end)) {
288
641k
    switch (BYTE_TYPE(enc, ptr)) {
289
2.21M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
290
5.69k
    case BT_S:
291
7.90k
    case BT_CR:
292
10.7k
    case BT_LF:
293
10.7k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
294
3
        *nextTokPtr = ptr;
295
3
        return XML_TOK_INVALID;
296
3
      }
297
10.7k
      ptr += MINBPC(enc);
298
3.76M
      while (HAS_CHAR(enc, ptr, end)) {
299
3.76M
        switch (BYTE_TYPE(enc, ptr)) {
300
122k
          INVALID_CASES(ptr, nextTokPtr)
301
40.6k
        case BT_QUEST:
302
40.6k
          ptr += MINBPC(enc);
303
40.6k
          REQUIRE_CHAR(enc, ptr, end);
304
40.6k
          if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
305
10.6k
            *nextTokPtr = ptr + MINBPC(enc);
306
10.6k
            return tok;
307
10.6k
          }
308
30.0k
          break;
309
3.66M
        default:
310
3.66M
          ptr += MINBPC(enc);
311
3.66M
          break;
312
3.76M
        }
313
3.76M
      }
314
82
      return XML_TOK_PARTIAL;
315
14.8k
    case BT_QUEST:
316
14.8k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
317
3
        *nextTokPtr = ptr;
318
3
        return XML_TOK_INVALID;
319
3
      }
320
14.8k
      ptr += MINBPC(enc);
321
14.8k
      REQUIRE_CHAR(enc, ptr, end);
322
14.8k
      if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
323
14.8k
        *nextTokPtr = ptr + MINBPC(enc);
324
14.8k
        return tok;
325
14.8k
      }
326
      /* fall through */
327
18
    default:
328
18
      *nextTokPtr = ptr;
329
18
      return XML_TOK_INVALID;
330
641k
    }
331
641k
  }
332
34
  return XML_TOK_PARTIAL;
333
25.7k
}
Unexecuted instantiation: xmltok.c:little2_scanPi
Unexecuted instantiation: xmltok.c:big2_scanPi
334
335
static int PTRCALL
336
PREFIX(scanCdataSection)(const ENCODING *enc, const char *ptr, const char *end,
337
1.31k
                         const char **nextTokPtr) {
338
1.31k
  static const char CDATA_LSQB[]
339
1.31k
      = {ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, ASCII_LSQB};
340
1.31k
  int i;
341
1.31k
  UNUSED_P(enc);
342
  /* CDATA[ */
343
1.31k
  REQUIRE_CHARS(enc, ptr, end, 6);
344
9.00k
  for (i = 0; i < 6; i++, ptr += MINBPC(enc)) {
345
7.74k
    if (! CHAR_MATCHES(enc, ptr, CDATA_LSQB[i])) {
346
37
      *nextTokPtr = ptr;
347
37
      return XML_TOK_INVALID;
348
37
    }
349
7.74k
  }
350
1.26k
  *nextTokPtr = ptr;
351
1.26k
  return XML_TOK_CDATA_SECT_OPEN;
352
1.30k
}
xmltok.c:normal_scanCdataSection
Line
Count
Source
337
1.31k
                         const char **nextTokPtr) {
338
1.31k
  static const char CDATA_LSQB[]
339
1.31k
      = {ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, ASCII_LSQB};
340
1.31k
  int i;
341
1.31k
  UNUSED_P(enc);
342
  /* CDATA[ */
343
1.31k
  REQUIRE_CHARS(enc, ptr, end, 6);
344
9.00k
  for (i = 0; i < 6; i++, ptr += MINBPC(enc)) {
345
7.74k
    if (! CHAR_MATCHES(enc, ptr, CDATA_LSQB[i])) {
346
37
      *nextTokPtr = ptr;
347
37
      return XML_TOK_INVALID;
348
37
    }
349
7.74k
  }
350
1.26k
  *nextTokPtr = ptr;
351
1.26k
  return XML_TOK_CDATA_SECT_OPEN;
352
1.30k
}
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
1.53M
                        const char **nextTokPtr) {
357
1.53M
  if (ptr >= end)
358
150
    return XML_TOK_NONE;
359
1.53M
  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
1.53M
  switch (BYTE_TYPE(enc, ptr)) {
369
222k
  case BT_RSQB:
370
222k
    ptr += MINBPC(enc);
371
222k
    REQUIRE_CHAR(enc, ptr, end);
372
222k
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
373
102k
      break;
374
119k
    ptr += MINBPC(enc);
375
119k
    REQUIRE_CHAR(enc, ptr, end);
376
119k
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
377
118k
      ptr -= MINBPC(enc);
378
118k
      break;
379
118k
    }
380
1.14k
    *nextTokPtr = ptr + MINBPC(enc);
381
1.14k
    return XML_TOK_CDATA_SECT_CLOSE;
382
586k
  case BT_CR:
383
586k
    ptr += MINBPC(enc);
384
586k
    REQUIRE_CHAR(enc, ptr, end);
385
586k
    if (BYTE_TYPE(enc, ptr) == BT_LF)
386
96.6k
      ptr += MINBPC(enc);
387
586k
    *nextTokPtr = ptr;
388
586k
    return XML_TOK_DATA_NEWLINE;
389
352k
  case BT_LF:
390
352k
    *nextTokPtr = ptr + MINBPC(enc);
391
352k
    return XML_TOK_DATA_NEWLINE;
392
352k
    INVALID_CASES(ptr, nextTokPtr)
393
348k
  default:
394
348k
    ptr += MINBPC(enc);
395
348k
    break;
396
1.53M
  }
397
10.0M
  while (HAS_CHAR(enc, ptr, end)) {
398
10.0M
    switch (BYTE_TYPE(enc, ptr)) {
399
0
#  define LEAD_CASE(n)                                                         \
400
158k
  case BT_LEAD##n:                                                             \
401
158k
    if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) {                       \
402
13
      *nextTokPtr = ptr;                                                       \
403
13
      return XML_TOK_DATA_CHARS;                                               \
404
13
    }                                                                          \
405
158k
    ptr += n;                                                                  \
406
158k
    break;
407
77.5k
      LEAD_CASE(2)
408
65.6k
      LEAD_CASE(3)
409
15.7k
      LEAD_CASE(4)
410
0
#  undef LEAD_CASE
411
3
    case BT_NONXML:
412
4
    case BT_MALFORM:
413
9
    case BT_TRAIL:
414
265k
    case BT_CR:
415
401k
    case BT_LF:
416
596k
    case BT_RSQB:
417
596k
      *nextTokPtr = ptr;
418
596k
      return XML_TOK_DATA_CHARS;
419
9.27M
    default:
420
9.27M
      ptr += MINBPC(enc);
421
9.27M
      break;
422
10.0M
    }
423
10.0M
  }
424
51
  *nextTokPtr = ptr;
425
51
  return XML_TOK_DATA_CHARS;
426
596k
}
xmltok.c:normal_cdataSectionTok
Line
Count
Source
356
1.53M
                        const char **nextTokPtr) {
357
1.53M
  if (ptr >= end)
358
150
    return XML_TOK_NONE;
359
1.53M
  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
1.53M
  switch (BYTE_TYPE(enc, ptr)) {
369
222k
  case BT_RSQB:
370
222k
    ptr += MINBPC(enc);
371
222k
    REQUIRE_CHAR(enc, ptr, end);
372
222k
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
373
102k
      break;
374
119k
    ptr += MINBPC(enc);
375
119k
    REQUIRE_CHAR(enc, ptr, end);
376
119k
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
377
118k
      ptr -= MINBPC(enc);
378
118k
      break;
379
118k
    }
380
1.14k
    *nextTokPtr = ptr + MINBPC(enc);
381
1.14k
    return XML_TOK_CDATA_SECT_CLOSE;
382
586k
  case BT_CR:
383
586k
    ptr += MINBPC(enc);
384
586k
    REQUIRE_CHAR(enc, ptr, end);
385
586k
    if (BYTE_TYPE(enc, ptr) == BT_LF)
386
96.6k
      ptr += MINBPC(enc);
387
586k
    *nextTokPtr = ptr;
388
586k
    return XML_TOK_DATA_NEWLINE;
389
352k
  case BT_LF:
390
352k
    *nextTokPtr = ptr + MINBPC(enc);
391
352k
    return XML_TOK_DATA_NEWLINE;
392
352k
    INVALID_CASES(ptr, nextTokPtr)
393
348k
  default:
394
348k
    ptr += MINBPC(enc);
395
348k
    break;
396
1.53M
  }
397
10.0M
  while (HAS_CHAR(enc, ptr, end)) {
398
10.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
77.5k
      LEAD_CASE(2)
408
65.6k
      LEAD_CASE(3)
409
15.7k
      LEAD_CASE(4)
410
0
#  undef LEAD_CASE
411
3
    case BT_NONXML:
412
4
    case BT_MALFORM:
413
9
    case BT_TRAIL:
414
265k
    case BT_CR:
415
401k
    case BT_LF:
416
596k
    case BT_RSQB:
417
596k
      *nextTokPtr = ptr;
418
596k
      return XML_TOK_DATA_CHARS;
419
9.27M
    default:
420
9.27M
      ptr += MINBPC(enc);
421
9.27M
      break;
422
10.0M
    }
423
10.0M
  }
424
51
  *nextTokPtr = ptr;
425
51
  return XML_TOK_DATA_CHARS;
426
596k
}
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
27.4k
                   const char **nextTokPtr) {
433
27.4k
  REQUIRE_CHAR(enc, ptr, end);
434
27.4k
  switch (BYTE_TYPE(enc, ptr)) {
435
34.5k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
436
5
  default:
437
5
    *nextTokPtr = ptr;
438
5
    return XML_TOK_INVALID;
439
27.4k
  }
440
247k
  while (HAS_CHAR(enc, ptr, end)) {
441
247k
    switch (BYTE_TYPE(enc, ptr)) {
442
674k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
443
647
    case BT_S:
444
959
    case BT_CR:
445
1.20k
    case BT_LF:
446
4.79k
      for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
447
4.79k
        switch (BYTE_TYPE(enc, ptr)) {
448
2.36k
        case BT_S:
449
3.18k
        case BT_CR:
450
3.63k
        case BT_LF:
451
3.63k
          break;
452
1.15k
        case BT_GT:
453
1.15k
          *nextTokPtr = ptr + MINBPC(enc);
454
1.15k
          return XML_TOK_END_TAG;
455
4
        default:
456
4
          *nextTokPtr = ptr;
457
4
          return XML_TOK_INVALID;
458
4.79k
        }
459
4.79k
      }
460
44
      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
26.0k
    case BT_GT:
469
26.0k
      *nextTokPtr = ptr + MINBPC(enc);
470
26.0k
      return XML_TOK_END_TAG;
471
9
    default:
472
9
      *nextTokPtr = ptr;
473
9
      return XML_TOK_INVALID;
474
247k
    }
475
247k
  }
476
78
  return XML_TOK_PARTIAL;
477
27.3k
}
xmltok.c:normal_scanEndTag
Line
Count
Source
432
27.4k
                   const char **nextTokPtr) {
433
27.4k
  REQUIRE_CHAR(enc, ptr, end);
434
27.4k
  switch (BYTE_TYPE(enc, ptr)) {
435
34.5k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
436
5
  default:
437
5
    *nextTokPtr = ptr;
438
5
    return XML_TOK_INVALID;
439
27.4k
  }
440
247k
  while (HAS_CHAR(enc, ptr, end)) {
441
247k
    switch (BYTE_TYPE(enc, ptr)) {
442
674k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
443
647
    case BT_S:
444
959
    case BT_CR:
445
1.20k
    case BT_LF:
446
4.79k
      for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
447
4.79k
        switch (BYTE_TYPE(enc, ptr)) {
448
2.36k
        case BT_S:
449
3.18k
        case BT_CR:
450
3.63k
        case BT_LF:
451
3.63k
          break;
452
1.15k
        case BT_GT:
453
1.15k
          *nextTokPtr = ptr + MINBPC(enc);
454
1.15k
          return XML_TOK_END_TAG;
455
4
        default:
456
4
          *nextTokPtr = ptr;
457
4
          return XML_TOK_INVALID;
458
4.79k
        }
459
4.79k
      }
460
44
      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
26.0k
    case BT_GT:
469
26.0k
      *nextTokPtr = ptr + MINBPC(enc);
470
26.0k
      return XML_TOK_END_TAG;
471
9
    default:
472
9
      *nextTokPtr = ptr;
473
9
      return XML_TOK_INVALID;
474
247k
    }
475
247k
  }
476
78
  return XML_TOK_PARTIAL;
477
27.3k
}
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
72.9k
                       const char **nextTokPtr) {
484
72.9k
  if (HAS_CHAR(enc, ptr, end)) {
485
72.9k
    switch (BYTE_TYPE(enc, ptr)) {
486
28.3k
    case BT_DIGIT:
487
72.9k
    case BT_HEX:
488
72.9k
      break;
489
4
    default:
490
4
      *nextTokPtr = ptr;
491
4
      return XML_TOK_INVALID;
492
72.9k
    }
493
266k
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
494
266k
      switch (BYTE_TYPE(enc, ptr)) {
495
127k
      case BT_DIGIT:
496
193k
      case BT_HEX:
497
193k
        break;
498
72.9k
      case BT_SEMI:
499
72.9k
        *nextTokPtr = ptr + MINBPC(enc);
500
72.9k
        return XML_TOK_CHAR_REF;
501
1
      default:
502
1
        *nextTokPtr = ptr;
503
1
        return XML_TOK_INVALID;
504
266k
      }
505
266k
    }
506
72.9k
  }
507
14
  return XML_TOK_PARTIAL;
508
72.9k
}
xmltok.c:normal_scanHexCharRef
Line
Count
Source
483
72.9k
                       const char **nextTokPtr) {
484
72.9k
  if (HAS_CHAR(enc, ptr, end)) {
485
72.9k
    switch (BYTE_TYPE(enc, ptr)) {
486
28.3k
    case BT_DIGIT:
487
72.9k
    case BT_HEX:
488
72.9k
      break;
489
4
    default:
490
4
      *nextTokPtr = ptr;
491
4
      return XML_TOK_INVALID;
492
72.9k
    }
493
266k
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
494
266k
      switch (BYTE_TYPE(enc, ptr)) {
495
127k
      case BT_DIGIT:
496
193k
      case BT_HEX:
497
193k
        break;
498
72.9k
      case BT_SEMI:
499
72.9k
        *nextTokPtr = ptr + MINBPC(enc);
500
72.9k
        return XML_TOK_CHAR_REF;
501
1
      default:
502
1
        *nextTokPtr = ptr;
503
1
        return XML_TOK_INVALID;
504
266k
      }
505
266k
    }
506
72.9k
  }
507
14
  return XML_TOK_PARTIAL;
508
72.9k
}
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
75.1k
                    const char **nextTokPtr) {
515
75.1k
  if (HAS_CHAR(enc, ptr, end)) {
516
75.1k
    if (CHAR_MATCHES(enc, ptr, ASCII_x))
517
72.9k
      return PREFIX(scanHexCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
518
2.24k
    switch (BYTE_TYPE(enc, ptr)) {
519
2.23k
    case BT_DIGIT:
520
2.23k
      break;
521
8
    default:
522
8
      *nextTokPtr = ptr;
523
8
      return XML_TOK_INVALID;
524
2.24k
    }
525
6.63k
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
526
6.63k
      switch (BYTE_TYPE(enc, ptr)) {
527
4.40k
      case BT_DIGIT:
528
4.40k
        break;
529
2.22k
      case BT_SEMI:
530
2.22k
        *nextTokPtr = ptr + MINBPC(enc);
531
2.22k
        return XML_TOK_CHAR_REF;
532
1
      default:
533
1
        *nextTokPtr = ptr;
534
1
        return XML_TOK_INVALID;
535
6.63k
      }
536
6.63k
    }
537
2.23k
  }
538
12
  return XML_TOK_PARTIAL;
539
75.1k
}
xmltok.c:normal_scanCharRef
Line
Count
Source
514
75.1k
                    const char **nextTokPtr) {
515
75.1k
  if (HAS_CHAR(enc, ptr, end)) {
516
75.1k
    if (CHAR_MATCHES(enc, ptr, ASCII_x))
517
72.9k
      return PREFIX(scanHexCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
518
2.24k
    switch (BYTE_TYPE(enc, ptr)) {
519
2.23k
    case BT_DIGIT:
520
2.23k
      break;
521
8
    default:
522
8
      *nextTokPtr = ptr;
523
8
      return XML_TOK_INVALID;
524
2.24k
    }
525
6.63k
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
526
6.63k
      switch (BYTE_TYPE(enc, ptr)) {
527
4.40k
      case BT_DIGIT:
528
4.40k
        break;
529
2.22k
      case BT_SEMI:
530
2.22k
        *nextTokPtr = ptr + MINBPC(enc);
531
2.22k
        return XML_TOK_CHAR_REF;
532
1
      default:
533
1
        *nextTokPtr = ptr;
534
1
        return XML_TOK_INVALID;
535
6.63k
      }
536
6.63k
    }
537
2.23k
  }
538
12
  return XML_TOK_PARTIAL;
539
75.1k
}
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
251k
                const char **nextTokPtr) {
546
251k
  REQUIRE_CHAR(enc, ptr, end);
547
251k
  switch (BYTE_TYPE(enc, ptr)) {
548
101k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
549
75.1k
  case BT_NUM:
550
75.1k
    return PREFIX(scanCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
551
3
  default:
552
3
    *nextTokPtr = ptr;
553
3
    return XML_TOK_INVALID;
554
251k
  }
555
800k
  while (HAS_CHAR(enc, ptr, end)) {
556
800k
    switch (BYTE_TYPE(enc, ptr)) {
557
2.34M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
558
175k
    case BT_SEMI:
559
175k
      *nextTokPtr = ptr + MINBPC(enc);
560
175k
      return XML_TOK_ENTITY_REF;
561
6
    default:
562
6
      *nextTokPtr = ptr;
563
6
      return XML_TOK_INVALID;
564
800k
    }
565
800k
  }
566
67
  return XML_TOK_PARTIAL;
567
175k
}
xmltok.c:normal_scanRef
Line
Count
Source
545
251k
                const char **nextTokPtr) {
546
251k
  REQUIRE_CHAR(enc, ptr, end);
547
251k
  switch (BYTE_TYPE(enc, ptr)) {
548
101k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
549
75.1k
  case BT_NUM:
550
75.1k
    return PREFIX(scanCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
551
3
  default:
552
3
    *nextTokPtr = ptr;
553
3
    return XML_TOK_INVALID;
554
251k
  }
555
800k
  while (HAS_CHAR(enc, ptr, end)) {
556
800k
    switch (BYTE_TYPE(enc, ptr)) {
557
2.34M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
558
175k
    case BT_SEMI:
559
175k
      *nextTokPtr = ptr + MINBPC(enc);
560
175k
      return XML_TOK_ENTITY_REF;
561
6
    default:
562
6
      *nextTokPtr = ptr;
563
6
      return XML_TOK_INVALID;
564
800k
    }
565
800k
  }
566
67
  return XML_TOK_PARTIAL;
567
175k
}
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
128k
                 const char **nextTokPtr) {
574
#  ifdef XML_NS
575
  int hadColon = 0;
576
#  endif
577
2.41M
  while (HAS_CHAR(enc, ptr, end)) {
578
2.41M
    switch (BYTE_TYPE(enc, ptr)) {
579
1.47M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
580
#  ifdef XML_NS
581
    case BT_COLON:
582
      if (hadColon) {
583
        *nextTokPtr = ptr;
584
        return XML_TOK_INVALID;
585
      }
586
      hadColon = 1;
587
      ptr += MINBPC(enc);
588
      REQUIRE_CHAR(enc, ptr, end);
589
      switch (BYTE_TYPE(enc, ptr)) {
590
        CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
591
      default:
592
        *nextTokPtr = ptr;
593
        return XML_TOK_INVALID;
594
      }
595
      break;
596
#  endif
597
2.13k
    case BT_S:
598
13.0k
    case BT_CR:
599
14.1k
    case BT_LF:
600
26.8k
      for (;;) {
601
26.8k
        int t;
602
603
26.8k
        ptr += MINBPC(enc);
604
26.8k
        REQUIRE_CHAR(enc, ptr, end);
605
26.8k
        t = BYTE_TYPE(enc, ptr);
606
26.8k
        if (t == BT_EQUALS)
607
14.0k
          break;
608
12.7k
        switch (t) {
609
1.69k
        case BT_S:
610
2.37k
        case BT_LF:
611
12.7k
        case BT_CR:
612
12.7k
          break;
613
4
        default:
614
4
          *nextTokPtr = ptr;
615
4
          return XML_TOK_INVALID;
616
12.7k
        }
617
12.7k
      }
618
      /* fall through */
619
1.96M
    case BT_EQUALS: {
620
1.96M
      int open;
621
#  ifdef XML_NS
622
      hadColon = 0;
623
#  endif
624
2.01M
      for (;;) {
625
2.01M
        ptr += MINBPC(enc);
626
2.01M
        REQUIRE_CHAR(enc, ptr, end);
627
2.01M
        open = BYTE_TYPE(enc, ptr);
628
2.01M
        if (open == BT_QUOT || open == BT_APOS)
629
1.96M
          break;
630
42.5k
        switch (open) {
631
7.60k
        case BT_S:
632
16.5k
        case BT_LF:
633
42.5k
        case BT_CR:
634
42.5k
          break;
635
10
        default:
636
10
          *nextTokPtr = ptr;
637
10
          return XML_TOK_INVALID;
638
42.5k
        }
639
42.5k
      }
640
1.96M
      ptr += MINBPC(enc);
641
      /* in attribute value */
642
11.4M
      for (;;) {
643
11.4M
        int t;
644
11.4M
        REQUIRE_CHAR(enc, ptr, end);
645
11.4M
        t = BYTE_TYPE(enc, ptr);
646
11.4M
        if (t == open)
647
1.96M
          break;
648
9.50M
        switch (t) {
649
165k
          INVALID_CASES(ptr, nextTokPtr)
650
36.5k
        case BT_AMP: {
651
36.5k
          int tok = PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, &ptr);
652
36.5k
          if (tok <= 0) {
653
18
            if (tok == XML_TOK_INVALID)
654
4
              *nextTokPtr = ptr;
655
18
            return tok;
656
18
          }
657
36.5k
          break;
658
36.5k
        }
659
36.5k
        case BT_LT:
660
6
          *nextTokPtr = ptr;
661
6
          return XML_TOK_INVALID;
662
9.38M
        default:
663
9.38M
          ptr += MINBPC(enc);
664
9.38M
          break;
665
9.50M
        }
666
9.50M
      }
667
1.96M
      ptr += MINBPC(enc);
668
1.96M
      REQUIRE_CHAR(enc, ptr, end);
669
1.96M
      switch (BYTE_TYPE(enc, ptr)) {
670
1.05M
      case BT_S:
671
1.92M
      case BT_CR:
672
1.94M
      case BT_LF:
673
1.94M
        break;
674
17.7k
      case BT_SOL:
675
17.7k
        goto sol;
676
4.31k
      case BT_GT:
677
4.31k
        goto gt;
678
6
      default:
679
6
        *nextTokPtr = ptr;
680
6
        return XML_TOK_INVALID;
681
1.96M
      }
682
      /* ptr points to closing quote */
683
2.16M
      for (;;) {
684
2.16M
        ptr += MINBPC(enc);
685
2.16M
        REQUIRE_CHAR(enc, ptr, end);
686
2.16M
        switch (BYTE_TYPE(enc, ptr)) {
687
1.83M
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
688
146k
        case BT_S:
689
178k
        case BT_CR:
690
214k
        case BT_LF:
691
214k
          continue;
692
221
        case BT_GT:
693
4.53k
        gt:
694
4.53k
          *nextTokPtr = ptr + MINBPC(enc);
695
4.53k
          return XML_TOK_START_TAG_WITH_ATTS;
696
105k
        case BT_SOL:
697
123k
        sol:
698
123k
          ptr += MINBPC(enc);
699
123k
          REQUIRE_CHAR(enc, ptr, end);
700
123k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
701
4
            *nextTokPtr = ptr;
702
4
            return XML_TOK_INVALID;
703
4
          }
704
123k
          *nextTokPtr = ptr + MINBPC(enc);
705
123k
          return XML_TOK_EMPTY_ELEMENT_WITH_ATTS;
706
2
        default:
707
2
          *nextTokPtr = ptr;
708
2
          return XML_TOK_INVALID;
709
2.16M
        }
710
1.84M
        break;
711
2.16M
      }
712
1.84M
      break;
713
1.94M
    }
714
1.84M
    default:
715
7
      *nextTokPtr = ptr;
716
7
      return XML_TOK_INVALID;
717
2.41M
    }
718
2.41M
  }
719
48
  return XML_TOK_PARTIAL;
720
128k
}
xmltok.c:normal_scanAtts
Line
Count
Source
573
128k
                 const char **nextTokPtr) {
574
#  ifdef XML_NS
575
  int hadColon = 0;
576
#  endif
577
2.41M
  while (HAS_CHAR(enc, ptr, end)) {
578
2.41M
    switch (BYTE_TYPE(enc, ptr)) {
579
1.47M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
580
#  ifdef XML_NS
581
    case BT_COLON:
582
      if (hadColon) {
583
        *nextTokPtr = ptr;
584
        return XML_TOK_INVALID;
585
      }
586
      hadColon = 1;
587
      ptr += MINBPC(enc);
588
      REQUIRE_CHAR(enc, ptr, end);
589
      switch (BYTE_TYPE(enc, ptr)) {
590
        CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
591
      default:
592
        *nextTokPtr = ptr;
593
        return XML_TOK_INVALID;
594
      }
595
      break;
596
#  endif
597
2.13k
    case BT_S:
598
13.0k
    case BT_CR:
599
14.1k
    case BT_LF:
600
26.8k
      for (;;) {
601
26.8k
        int t;
602
603
26.8k
        ptr += MINBPC(enc);
604
26.8k
        REQUIRE_CHAR(enc, ptr, end);
605
26.8k
        t = BYTE_TYPE(enc, ptr);
606
26.8k
        if (t == BT_EQUALS)
607
14.0k
          break;
608
12.7k
        switch (t) {
609
1.69k
        case BT_S:
610
2.37k
        case BT_LF:
611
12.7k
        case BT_CR:
612
12.7k
          break;
613
4
        default:
614
4
          *nextTokPtr = ptr;
615
4
          return XML_TOK_INVALID;
616
12.7k
        }
617
12.7k
      }
618
      /* fall through */
619
1.96M
    case BT_EQUALS: {
620
1.96M
      int open;
621
#  ifdef XML_NS
622
      hadColon = 0;
623
#  endif
624
2.01M
      for (;;) {
625
2.01M
        ptr += MINBPC(enc);
626
2.01M
        REQUIRE_CHAR(enc, ptr, end);
627
2.01M
        open = BYTE_TYPE(enc, ptr);
628
2.01M
        if (open == BT_QUOT || open == BT_APOS)
629
1.96M
          break;
630
42.5k
        switch (open) {
631
7.60k
        case BT_S:
632
16.5k
        case BT_LF:
633
42.5k
        case BT_CR:
634
42.5k
          break;
635
10
        default:
636
10
          *nextTokPtr = ptr;
637
10
          return XML_TOK_INVALID;
638
42.5k
        }
639
42.5k
      }
640
1.96M
      ptr += MINBPC(enc);
641
      /* in attribute value */
642
11.4M
      for (;;) {
643
11.4M
        int t;
644
11.4M
        REQUIRE_CHAR(enc, ptr, end);
645
11.4M
        t = BYTE_TYPE(enc, ptr);
646
11.4M
        if (t == open)
647
1.96M
          break;
648
9.50M
        switch (t) {
649
165k
          INVALID_CASES(ptr, nextTokPtr)
650
36.5k
        case BT_AMP: {
651
36.5k
          int tok = PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, &ptr);
652
36.5k
          if (tok <= 0) {
653
18
            if (tok == XML_TOK_INVALID)
654
4
              *nextTokPtr = ptr;
655
18
            return tok;
656
18
          }
657
36.5k
          break;
658
36.5k
        }
659
36.5k
        case BT_LT:
660
6
          *nextTokPtr = ptr;
661
6
          return XML_TOK_INVALID;
662
9.38M
        default:
663
9.38M
          ptr += MINBPC(enc);
664
9.38M
          break;
665
9.50M
        }
666
9.50M
      }
667
1.96M
      ptr += MINBPC(enc);
668
1.96M
      REQUIRE_CHAR(enc, ptr, end);
669
1.96M
      switch (BYTE_TYPE(enc, ptr)) {
670
1.05M
      case BT_S:
671
1.92M
      case BT_CR:
672
1.94M
      case BT_LF:
673
1.94M
        break;
674
17.7k
      case BT_SOL:
675
17.7k
        goto sol;
676
4.31k
      case BT_GT:
677
4.31k
        goto gt;
678
6
      default:
679
6
        *nextTokPtr = ptr;
680
6
        return XML_TOK_INVALID;
681
1.96M
      }
682
      /* ptr points to closing quote */
683
2.16M
      for (;;) {
684
2.16M
        ptr += MINBPC(enc);
685
2.16M
        REQUIRE_CHAR(enc, ptr, end);
686
2.16M
        switch (BYTE_TYPE(enc, ptr)) {
687
1.83M
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
688
146k
        case BT_S:
689
178k
        case BT_CR:
690
214k
        case BT_LF:
691
214k
          continue;
692
221
        case BT_GT:
693
4.53k
        gt:
694
4.53k
          *nextTokPtr = ptr + MINBPC(enc);
695
4.53k
          return XML_TOK_START_TAG_WITH_ATTS;
696
105k
        case BT_SOL:
697
123k
        sol:
698
123k
          ptr += MINBPC(enc);
699
123k
          REQUIRE_CHAR(enc, ptr, end);
700
123k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
701
4
            *nextTokPtr = ptr;
702
4
            return XML_TOK_INVALID;
703
4
          }
704
123k
          *nextTokPtr = ptr + MINBPC(enc);
705
123k
          return XML_TOK_EMPTY_ELEMENT_WITH_ATTS;
706
2
        default:
707
2
          *nextTokPtr = ptr;
708
2
          return XML_TOK_INVALID;
709
2.16M
        }
710
1.84M
        break;
711
2.16M
      }
712
1.84M
      break;
713
1.94M
    }
714
1.84M
    default:
715
7
      *nextTokPtr = ptr;
716
7
      return XML_TOK_INVALID;
717
2.41M
    }
718
2.41M
  }
719
48
  return XML_TOK_PARTIAL;
720
128k
}
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
356k
               const char **nextTokPtr) {
727
#  ifdef XML_NS
728
  int hadColon;
729
#  endif
730
356k
  REQUIRE_CHAR(enc, ptr, end);
731
356k
  switch (BYTE_TYPE(enc, ptr)) {
732
283k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
733
13.7k
  case BT_EXCL:
734
13.7k
    ptr += MINBPC(enc);
735
13.7k
    REQUIRE_CHAR(enc, ptr, end);
736
13.7k
    switch (BYTE_TYPE(enc, ptr)) {
737
12.4k
    case BT_MINUS:
738
12.4k
      return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
739
1.31k
    case BT_LSQB:
740
1.31k
      return PREFIX(scanCdataSection)(enc, ptr + MINBPC(enc), end, nextTokPtr);
741
13.7k
    }
742
2
    *nextTokPtr = ptr;
743
2
    return XML_TOK_INVALID;
744
18.2k
  case BT_QUEST:
745
18.2k
    return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
746
27.4k
  case BT_SOL:
747
27.4k
    return PREFIX(scanEndTag)(enc, ptr + MINBPC(enc), end, nextTokPtr);
748
8
  default:
749
8
    *nextTokPtr = ptr;
750
8
    return XML_TOK_INVALID;
751
356k
  }
752
#  ifdef XML_NS
753
  hadColon = 0;
754
#  endif
755
  /* we have a start-tag */
756
4.72M
  while (HAS_CHAR(enc, ptr, end)) {
757
4.72M
    switch (BYTE_TYPE(enc, ptr)) {
758
17.3M
      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
123k
    case BT_S:
777
130k
    case BT_CR:
778
133k
    case BT_LF: {
779
133k
      ptr += MINBPC(enc);
780
152k
      while (HAS_CHAR(enc, ptr, end)) {
781
152k
        switch (BYTE_TYPE(enc, ptr)) {
782
18.1k
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
783
551
        case BT_GT:
784
551
          goto gt;
785
4.35k
        case BT_SOL:
786
4.35k
          goto sol;
787
2.21k
        case BT_S:
788
19.5k
        case BT_CR:
789
19.9k
        case BT_LF:
790
19.9k
          ptr += MINBPC(enc);
791
19.9k
          continue;
792
4
        default:
793
4
          *nextTokPtr = ptr;
794
4
          return XML_TOK_INVALID;
795
152k
        }
796
128k
        return PREFIX(scanAtts)(enc, ptr, end, nextTokPtr);
797
152k
      }
798
34
      return XML_TOK_PARTIAL;
799
133k
    }
800
138k
    case BT_GT:
801
139k
    gt:
802
139k
      *nextTokPtr = ptr + MINBPC(enc);
803
139k
      return XML_TOK_START_TAG_NO_ATTS;
804
25.8k
    case BT_SOL:
805
30.1k
    sol:
806
30.1k
      ptr += MINBPC(enc);
807
30.1k
      REQUIRE_CHAR(enc, ptr, end);
808
30.1k
      if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
809
7
        *nextTokPtr = ptr;
810
7
        return XML_TOK_INVALID;
811
7
      }
812
30.1k
      *nextTokPtr = ptr + MINBPC(enc);
813
30.1k
      return XML_TOK_EMPTY_ELEMENT_NO_ATTS;
814
9
    default:
815
9
      *nextTokPtr = ptr;
816
9
      return XML_TOK_INVALID;
817
4.72M
    }
818
4.72M
  }
819
76
  return XML_TOK_PARTIAL;
820
297k
}
xmltok.c:normal_scanLt
Line
Count
Source
726
356k
               const char **nextTokPtr) {
727
#  ifdef XML_NS
728
  int hadColon;
729
#  endif
730
356k
  REQUIRE_CHAR(enc, ptr, end);
731
356k
  switch (BYTE_TYPE(enc, ptr)) {
732
283k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
733
13.7k
  case BT_EXCL:
734
13.7k
    ptr += MINBPC(enc);
735
13.7k
    REQUIRE_CHAR(enc, ptr, end);
736
13.7k
    switch (BYTE_TYPE(enc, ptr)) {
737
12.4k
    case BT_MINUS:
738
12.4k
      return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
739
1.31k
    case BT_LSQB:
740
1.31k
      return PREFIX(scanCdataSection)(enc, ptr + MINBPC(enc), end, nextTokPtr);
741
13.7k
    }
742
2
    *nextTokPtr = ptr;
743
2
    return XML_TOK_INVALID;
744
18.2k
  case BT_QUEST:
745
18.2k
    return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
746
27.4k
  case BT_SOL:
747
27.4k
    return PREFIX(scanEndTag)(enc, ptr + MINBPC(enc), end, nextTokPtr);
748
8
  default:
749
8
    *nextTokPtr = ptr;
750
8
    return XML_TOK_INVALID;
751
356k
  }
752
#  ifdef XML_NS
753
  hadColon = 0;
754
#  endif
755
  /* we have a start-tag */
756
4.72M
  while (HAS_CHAR(enc, ptr, end)) {
757
4.72M
    switch (BYTE_TYPE(enc, ptr)) {
758
17.3M
      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
123k
    case BT_S:
777
130k
    case BT_CR:
778
133k
    case BT_LF: {
779
133k
      ptr += MINBPC(enc);
780
152k
      while (HAS_CHAR(enc, ptr, end)) {
781
152k
        switch (BYTE_TYPE(enc, ptr)) {
782
18.1k
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
783
551
        case BT_GT:
784
551
          goto gt;
785
4.35k
        case BT_SOL:
786
4.35k
          goto sol;
787
2.21k
        case BT_S:
788
19.5k
        case BT_CR:
789
19.9k
        case BT_LF:
790
19.9k
          ptr += MINBPC(enc);
791
19.9k
          continue;
792
4
        default:
793
4
          *nextTokPtr = ptr;
794
4
          return XML_TOK_INVALID;
795
152k
        }
796
128k
        return PREFIX(scanAtts)(enc, ptr, end, nextTokPtr);
797
152k
      }
798
34
      return XML_TOK_PARTIAL;
799
133k
    }
800
138k
    case BT_GT:
801
139k
    gt:
802
139k
      *nextTokPtr = ptr + MINBPC(enc);
803
139k
      return XML_TOK_START_TAG_NO_ATTS;
804
25.8k
    case BT_SOL:
805
30.1k
    sol:
806
30.1k
      ptr += MINBPC(enc);
807
30.1k
      REQUIRE_CHAR(enc, ptr, end);
808
30.1k
      if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
809
7
        *nextTokPtr = ptr;
810
7
        return XML_TOK_INVALID;
811
7
      }
812
30.1k
      *nextTokPtr = ptr + MINBPC(enc);
813
30.1k
      return XML_TOK_EMPTY_ELEMENT_NO_ATTS;
814
9
    default:
815
9
      *nextTokPtr = ptr;
816
9
      return XML_TOK_INVALID;
817
4.72M
    }
818
4.72M
  }
819
76
  return XML_TOK_PARTIAL;
820
297k
}
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
2.53M
                   const char **nextTokPtr) {
825
2.53M
  if (ptr >= end)
826
2.37k
    return XML_TOK_NONE;
827
2.53M
  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
2.53M
  switch (BYTE_TYPE(enc, ptr)) {
837
356k
  case BT_LT:
838
356k
    return PREFIX(scanLt)(enc, ptr + MINBPC(enc), end, nextTokPtr);
839
31.7k
  case BT_AMP:
840
31.7k
    return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
841
973k
  case BT_CR:
842
973k
    ptr += MINBPC(enc);
843
973k
    if (! HAS_CHAR(enc, ptr, end))
844
18
      return XML_TOK_TRAILING_CR;
845
973k
    if (BYTE_TYPE(enc, ptr) == BT_LF)
846
196k
      ptr += MINBPC(enc);
847
973k
    *nextTokPtr = ptr;
848
973k
    return XML_TOK_DATA_NEWLINE;
849
684k
  case BT_LF:
850
684k
    *nextTokPtr = ptr + MINBPC(enc);
851
684k
    return XML_TOK_DATA_NEWLINE;
852
25.1k
  case BT_RSQB:
853
25.1k
    ptr += MINBPC(enc);
854
25.1k
    if (! HAS_CHAR(enc, ptr, end))
855
6
      return XML_TOK_TRAILING_RSQB;
856
25.1k
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
857
8.46k
      break;
858
16.7k
    ptr += MINBPC(enc);
859
16.7k
    if (! HAS_CHAR(enc, ptr, end))
860
4
      return XML_TOK_TRAILING_RSQB;
861
16.7k
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
862
16.7k
      ptr -= MINBPC(enc);
863
16.7k
      break;
864
16.7k
    }
865
2
    *nextTokPtr = ptr;
866
2
    return XML_TOK_INVALID;
867
51.7k
    INVALID_CASES(ptr, nextTokPtr)
868
434k
  default:
869
434k
    ptr += MINBPC(enc);
870
434k
    break;
871
2.53M
  }
872
10.4M
  while (HAS_CHAR(enc, ptr, end)) {
873
10.4M
    switch (BYTE_TYPE(enc, ptr)) {
874
0
#  define LEAD_CASE(n)                                                         \
875
113k
  case BT_LEAD##n:                                                             \
876
113k
    if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) {                       \
877
20
      *nextTokPtr = ptr;                                                       \
878
20
      return XML_TOK_DATA_CHARS;                                               \
879
20
    }                                                                          \
880
113k
    ptr += n;                                                                  \
881
113k
    break;
882
62.8k
      LEAD_CASE(2)
883
27.7k
      LEAD_CASE(3)
884
22.9k
      LEAD_CASE(4)
885
0
#  undef LEAD_CASE
886
254k
    case BT_RSQB:
887
254k
      if (HAS_CHARS(enc, ptr, end, 2)) {
888
254k
        if (! CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_RSQB)) {
889
79.3k
          ptr += MINBPC(enc);
890
79.3k
          break;
891
79.3k
        }
892
175k
        if (HAS_CHARS(enc, ptr, end, 3)) {
893
175k
          if (! CHAR_MATCHES(enc, ptr + 2 * MINBPC(enc), ASCII_GT)) {
894
175k
            ptr += MINBPC(enc);
895
175k
            break;
896
175k
          }
897
2
          *nextTokPtr = ptr + 2 * MINBPC(enc);
898
2
          return XML_TOK_INVALID;
899
175k
        }
900
175k
      }
901
      /* fall through */
902
18.2k
    case BT_AMP:
903
96.5k
    case BT_LT:
904
96.5k
    case BT_NONXML:
905
96.5k
    case BT_MALFORM:
906
96.5k
    case BT_TRAIL:
907
359k
    case BT_CR:
908
484k
    case BT_LF:
909
484k
      *nextTokPtr = ptr;
910
484k
      return XML_TOK_DATA_CHARS;
911
9.59M
    default:
912
9.59M
      ptr += MINBPC(enc);
913
9.59M
      break;
914
10.4M
    }
915
10.4M
  }
916
1.21k
  *nextTokPtr = ptr;
917
1.21k
  return XML_TOK_DATA_CHARS;
918
485k
}
xmltok.c:normal_contentTok
Line
Count
Source
824
2.53M
                   const char **nextTokPtr) {
825
2.53M
  if (ptr >= end)
826
2.37k
    return XML_TOK_NONE;
827
2.53M
  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
2.53M
  switch (BYTE_TYPE(enc, ptr)) {
837
356k
  case BT_LT:
838
356k
    return PREFIX(scanLt)(enc, ptr + MINBPC(enc), end, nextTokPtr);
839
31.7k
  case BT_AMP:
840
31.7k
    return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
841
973k
  case BT_CR:
842
973k
    ptr += MINBPC(enc);
843
973k
    if (! HAS_CHAR(enc, ptr, end))
844
18
      return XML_TOK_TRAILING_CR;
845
973k
    if (BYTE_TYPE(enc, ptr) == BT_LF)
846
196k
      ptr += MINBPC(enc);
847
973k
    *nextTokPtr = ptr;
848
973k
    return XML_TOK_DATA_NEWLINE;
849
684k
  case BT_LF:
850
684k
    *nextTokPtr = ptr + MINBPC(enc);
851
684k
    return XML_TOK_DATA_NEWLINE;
852
25.1k
  case BT_RSQB:
853
25.1k
    ptr += MINBPC(enc);
854
25.1k
    if (! HAS_CHAR(enc, ptr, end))
855
6
      return XML_TOK_TRAILING_RSQB;
856
25.1k
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
857
8.46k
      break;
858
16.7k
    ptr += MINBPC(enc);
859
16.7k
    if (! HAS_CHAR(enc, ptr, end))
860
4
      return XML_TOK_TRAILING_RSQB;
861
16.7k
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
862
16.7k
      ptr -= MINBPC(enc);
863
16.7k
      break;
864
16.7k
    }
865
2
    *nextTokPtr = ptr;
866
2
    return XML_TOK_INVALID;
867
51.7k
    INVALID_CASES(ptr, nextTokPtr)
868
434k
  default:
869
434k
    ptr += MINBPC(enc);
870
434k
    break;
871
2.53M
  }
872
10.4M
  while (HAS_CHAR(enc, ptr, end)) {
873
10.4M
    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
62.8k
      LEAD_CASE(2)
883
27.7k
      LEAD_CASE(3)
884
22.9k
      LEAD_CASE(4)
885
0
#  undef LEAD_CASE
886
254k
    case BT_RSQB:
887
254k
      if (HAS_CHARS(enc, ptr, end, 2)) {
888
254k
        if (! CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_RSQB)) {
889
79.3k
          ptr += MINBPC(enc);
890
79.3k
          break;
891
79.3k
        }
892
175k
        if (HAS_CHARS(enc, ptr, end, 3)) {
893
175k
          if (! CHAR_MATCHES(enc, ptr + 2 * MINBPC(enc), ASCII_GT)) {
894
175k
            ptr += MINBPC(enc);
895
175k
            break;
896
175k
          }
897
2
          *nextTokPtr = ptr + 2 * MINBPC(enc);
898
2
          return XML_TOK_INVALID;
899
175k
        }
900
175k
      }
901
      /* fall through */
902
18.2k
    case BT_AMP:
903
96.5k
    case BT_LT:
904
96.5k
    case BT_NONXML:
905
96.5k
    case BT_MALFORM:
906
96.5k
    case BT_TRAIL:
907
359k
    case BT_CR:
908
484k
    case BT_LF:
909
484k
      *nextTokPtr = ptr;
910
484k
      return XML_TOK_DATA_CHARS;
911
9.59M
    default:
912
9.59M
      ptr += MINBPC(enc);
913
9.59M
      break;
914
10.4M
    }
915
10.4M
  }
916
1.21k
  *nextTokPtr = ptr;
917
1.21k
  return XML_TOK_DATA_CHARS;
918
485k
}
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
5.16k
                    const char **nextTokPtr) {
925
5.16k
  REQUIRE_CHAR(enc, ptr, end);
926
5.16k
  switch (BYTE_TYPE(enc, ptr)) {
927
2.74k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
928
2.08k
  case BT_S:
929
2.36k
  case BT_LF:
930
3.09k
  case BT_CR:
931
3.09k
  case BT_PERCNT:
932
3.09k
    *nextTokPtr = ptr;
933
3.09k
    return XML_TOK_PERCENT;
934
3
  default:
935
3
    *nextTokPtr = ptr;
936
3
    return XML_TOK_INVALID;
937
5.16k
  }
938
129k
  while (HAS_CHAR(enc, ptr, end)) {
939
129k
    switch (BYTE_TYPE(enc, ptr)) {
940
432k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
941
1.95k
    case BT_SEMI:
942
1.95k
      *nextTokPtr = ptr + MINBPC(enc);
943
1.95k
      return XML_TOK_PARAM_ENTITY_REF;
944
9
    default:
945
9
      *nextTokPtr = ptr;
946
9
      return XML_TOK_INVALID;
947
129k
    }
948
129k
  }
949
52
  return XML_TOK_PARTIAL;
950
2.04k
}
xmltok.c:normal_scanPercent
Line
Count
Source
924
5.16k
                    const char **nextTokPtr) {
925
5.16k
  REQUIRE_CHAR(enc, ptr, end);
926
5.16k
  switch (BYTE_TYPE(enc, ptr)) {
927
2.74k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
928
2.08k
  case BT_S:
929
2.36k
  case BT_LF:
930
3.09k
  case BT_CR:
931
3.09k
  case BT_PERCNT:
932
3.09k
    *nextTokPtr = ptr;
933
3.09k
    return XML_TOK_PERCENT;
934
3
  default:
935
3
    *nextTokPtr = ptr;
936
3
    return XML_TOK_INVALID;
937
5.16k
  }
938
129k
  while (HAS_CHAR(enc, ptr, end)) {
939
129k
    switch (BYTE_TYPE(enc, ptr)) {
940
432k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
941
1.95k
    case BT_SEMI:
942
1.95k
      *nextTokPtr = ptr + MINBPC(enc);
943
1.95k
      return XML_TOK_PARAM_ENTITY_REF;
944
9
    default:
945
9
      *nextTokPtr = ptr;
946
9
      return XML_TOK_INVALID;
947
129k
    }
948
129k
  }
949
52
  return XML_TOK_PARTIAL;
950
2.04k
}
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
39.4k
                      const char **nextTokPtr) {
955
39.4k
  REQUIRE_CHAR(enc, ptr, end);
956
39.4k
  switch (BYTE_TYPE(enc, ptr)) {
957
39.2k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
958
2
  default:
959
2
    *nextTokPtr = ptr;
960
2
    return XML_TOK_INVALID;
961
39.4k
  }
962
623k
  while (HAS_CHAR(enc, ptr, end)) {
963
623k
    switch (BYTE_TYPE(enc, ptr)) {
964
1.98M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
965
30.5k
    case BT_CR:
966
35.5k
    case BT_LF:
967
35.9k
    case BT_S:
968
36.1k
    case BT_RPAR:
969
39.0k
    case BT_GT:
970
39.0k
    case BT_PERCNT:
971
39.2k
    case BT_VERBAR:
972
39.2k
      *nextTokPtr = ptr;
973
39.2k
      return XML_TOK_POUND_NAME;
974
9
    default:
975
9
      *nextTokPtr = ptr;
976
9
      return XML_TOK_INVALID;
977
623k
    }
978
623k
  }
979
146
  return -XML_TOK_POUND_NAME;
980
39.4k
}
xmltok.c:normal_scanPoundName
Line
Count
Source
954
39.4k
                      const char **nextTokPtr) {
955
39.4k
  REQUIRE_CHAR(enc, ptr, end);
956
39.4k
  switch (BYTE_TYPE(enc, ptr)) {
957
39.2k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
958
2
  default:
959
2
    *nextTokPtr = ptr;
960
2
    return XML_TOK_INVALID;
961
39.4k
  }
962
623k
  while (HAS_CHAR(enc, ptr, end)) {
963
623k
    switch (BYTE_TYPE(enc, ptr)) {
964
1.98M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
965
30.5k
    case BT_CR:
966
35.5k
    case BT_LF:
967
35.9k
    case BT_S:
968
36.1k
    case BT_RPAR:
969
39.0k
    case BT_GT:
970
39.0k
    case BT_PERCNT:
971
39.2k
    case BT_VERBAR:
972
39.2k
      *nextTokPtr = ptr;
973
39.2k
      return XML_TOK_POUND_NAME;
974
9
    default:
975
9
      *nextTokPtr = ptr;
976
9
      return XML_TOK_INVALID;
977
623k
    }
978
623k
  }
979
146
  return -XML_TOK_POUND_NAME;
980
39.4k
}
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
36.1k
                const char **nextTokPtr) {
985
7.13M
  while (HAS_CHAR(enc, ptr, end)) {
986
7.13M
    int t = BYTE_TYPE(enc, ptr);
987
7.13M
    switch (t) {
988
160k
      INVALID_CASES(ptr, nextTokPtr)
989
10.0k
    case BT_QUOT:
990
109k
    case BT_APOS:
991
109k
      ptr += MINBPC(enc);
992
109k
      if (t != open)
993
73.1k
        break;
994
36.0k
      if (! HAS_CHAR(enc, ptr, end))
995
441
        return -XML_TOK_LITERAL;
996
35.5k
      *nextTokPtr = ptr;
997
35.5k
      switch (BYTE_TYPE(enc, ptr)) {
998
6.49k
      case BT_S:
999
8.11k
      case BT_CR:
1000
15.8k
      case BT_LF:
1001
35.2k
      case BT_GT:
1002
35.2k
      case BT_PERCNT:
1003
35.5k
      case BT_LSQB:
1004
35.5k
        return XML_TOK_LITERAL;
1005
8
      default:
1006
8
        return XML_TOK_INVALID;
1007
35.5k
      }
1008
6.94M
    default:
1009
6.94M
      ptr += MINBPC(enc);
1010
6.94M
      break;
1011
7.13M
    }
1012
7.13M
  }
1013
86
  return XML_TOK_PARTIAL;
1014
36.1k
}
xmltok.c:normal_scanLit
Line
Count
Source
984
36.1k
                const char **nextTokPtr) {
985
7.13M
  while (HAS_CHAR(enc, ptr, end)) {
986
7.13M
    int t = BYTE_TYPE(enc, ptr);
987
7.13M
    switch (t) {
988
160k
      INVALID_CASES(ptr, nextTokPtr)
989
10.0k
    case BT_QUOT:
990
109k
    case BT_APOS:
991
109k
      ptr += MINBPC(enc);
992
109k
      if (t != open)
993
73.1k
        break;
994
36.0k
      if (! HAS_CHAR(enc, ptr, end))
995
441
        return -XML_TOK_LITERAL;
996
35.5k
      *nextTokPtr = ptr;
997
35.5k
      switch (BYTE_TYPE(enc, ptr)) {
998
6.49k
      case BT_S:
999
8.11k
      case BT_CR:
1000
15.8k
      case BT_LF:
1001
35.2k
      case BT_GT:
1002
35.2k
      case BT_PERCNT:
1003
35.5k
      case BT_LSQB:
1004
35.5k
        return XML_TOK_LITERAL;
1005
8
      default:
1006
8
        return XML_TOK_INVALID;
1007
35.5k
      }
1008
6.94M
    default:
1009
6.94M
      ptr += MINBPC(enc);
1010
6.94M
      break;
1011
7.13M
    }
1012
7.13M
  }
1013
86
  return XML_TOK_PARTIAL;
1014
36.1k
}
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
2.67M
                  const char **nextTokPtr) {
1019
2.67M
  int tok;
1020
2.67M
  if (ptr >= end)
1021
4.97k
    return XML_TOK_NONE;
1022
2.67M
  if (MINBPC(enc) > 1) {
1023
167
    size_t n = end - ptr;
1024
167
    if (n & (MINBPC(enc) - 1)) {
1025
26
      n &= ~(MINBPC(enc) - 1);
1026
26
      if (n == 0)
1027
4
        return XML_TOK_PARTIAL;
1028
22
      end = ptr + n;
1029
22
    }
1030
167
  }
1031
2.67M
  switch (BYTE_TYPE(enc, ptr)) {
1032
7.59k
  case BT_QUOT:
1033
7.59k
    return PREFIX(scanLit)(BT_QUOT, enc, ptr + MINBPC(enc), end, nextTokPtr);
1034
28.5k
  case BT_APOS:
1035
28.5k
    return PREFIX(scanLit)(BT_APOS, enc, ptr + MINBPC(enc), end, nextTokPtr);
1036
65.4k
  case BT_LT: {
1037
65.4k
    ptr += MINBPC(enc);
1038
65.4k
    REQUIRE_CHAR(enc, ptr, end);
1039
65.4k
    switch (BYTE_TYPE(enc, ptr)) {
1040
54.3k
    case BT_EXCL:
1041
54.3k
      return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1042
7.53k
    case BT_QUEST:
1043
7.53k
      return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1044
2.74k
    case BT_NMSTRT:
1045
3.51k
    case BT_HEX:
1046
3.51k
    case BT_NONASCII:
1047
3.53k
    case BT_LEAD2:
1048
3.55k
    case BT_LEAD3:
1049
3.55k
    case BT_LEAD4:
1050
3.55k
      *nextTokPtr = ptr - MINBPC(enc);
1051
3.55k
      return XML_TOK_INSTANCE_START;
1052
65.4k
    }
1053
8
    *nextTokPtr = ptr;
1054
8
    return XML_TOK_INVALID;
1055
65.4k
  }
1056
129k
  case BT_CR:
1057
129k
    if (ptr + MINBPC(enc) == end) {
1058
313
      *nextTokPtr = end;
1059
      /* indicate that this might be part of a CR/LF pair */
1060
313
      return -XML_TOK_PROLOG_S;
1061
313
    }
1062
    /* fall through */
1063
230k
  case BT_S:
1064
275k
  case BT_LF:
1065
371k
    for (;;) {
1066
371k
      ptr += MINBPC(enc);
1067
371k
      if (! HAS_CHAR(enc, ptr, end))
1068
186
        break;
1069
371k
      switch (BYTE_TYPE(enc, ptr)) {
1070
8.69k
      case BT_S:
1071
12.8k
      case BT_LF:
1072
12.8k
        break;
1073
82.8k
      case BT_CR:
1074
        /* don't split CR/LF pair */
1075
82.8k
        if (ptr + MINBPC(enc) != end)
1076
82.6k
          break;
1077
        /* fall through */
1078
275k
      default:
1079
275k
        *nextTokPtr = ptr;
1080
275k
        return XML_TOK_PROLOG_S;
1081
371k
      }
1082
371k
    }
1083
186
    *nextTokPtr = ptr;
1084
186
    return XML_TOK_PROLOG_S;
1085
5.16k
  case BT_PERCNT:
1086
5.16k
    return PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1087
5.74k
  case BT_COMMA:
1088
5.74k
    *nextTokPtr = ptr + MINBPC(enc);
1089
5.74k
    return XML_TOK_COMMA;
1090
1.99k
  case BT_LSQB:
1091
1.99k
    *nextTokPtr = ptr + MINBPC(enc);
1092
1.99k
    return XML_TOK_OPEN_BRACKET;
1093
843
  case BT_RSQB:
1094
843
    ptr += MINBPC(enc);
1095
843
    if (! HAS_CHAR(enc, ptr, end))
1096
3
      return -XML_TOK_CLOSE_BRACKET;
1097
840
    if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) {
1098
16
      REQUIRE_CHARS(enc, ptr, end, 2);
1099
14
      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
14
    }
1104
837
    *nextTokPtr = ptr;
1105
837
    return XML_TOK_CLOSE_BRACKET;
1106
1.68M
  case BT_LPAR:
1107
1.68M
    *nextTokPtr = ptr + MINBPC(enc);
1108
1.68M
    return XML_TOK_OPEN_PAREN;
1109
56.6k
  case BT_RPAR:
1110
56.6k
    ptr += MINBPC(enc);
1111
56.6k
    if (! HAS_CHAR(enc, ptr, end))
1112
77
      return -XML_TOK_CLOSE_PAREN;
1113
56.6k
    switch (BYTE_TYPE(enc, ptr)) {
1114
2.87k
    case BT_AST:
1115
2.87k
      *nextTokPtr = ptr + MINBPC(enc);
1116
2.87k
      return XML_TOK_CLOSE_PAREN_ASTERISK;
1117
2.89k
    case BT_QUEST:
1118
2.89k
      *nextTokPtr = ptr + MINBPC(enc);
1119
2.89k
      return XML_TOK_CLOSE_PAREN_QUESTION;
1120
4.23k
    case BT_PLUS:
1121
4.23k
      *nextTokPtr = ptr + MINBPC(enc);
1122
4.23k
      return XML_TOK_CLOSE_PAREN_PLUS;
1123
1.19k
    case BT_CR:
1124
4.76k
    case BT_LF:
1125
34.9k
    case BT_S:
1126
35.6k
    case BT_GT:
1127
38.8k
    case BT_COMMA:
1128
44.0k
    case BT_VERBAR:
1129
46.6k
    case BT_RPAR:
1130
46.6k
      *nextTokPtr = ptr;
1131
46.6k
      return XML_TOK_CLOSE_PAREN;
1132
56.6k
    }
1133
4
    *nextTokPtr = ptr;
1134
4
    return XML_TOK_INVALID;
1135
138k
  case BT_VERBAR:
1136
138k
    *nextTokPtr = ptr + MINBPC(enc);
1137
138k
    return XML_TOK_OR;
1138
49.7k
  case BT_GT:
1139
49.7k
    *nextTokPtr = ptr + MINBPC(enc);
1140
49.7k
    return XML_TOK_DECL_CLOSE;
1141
39.4k
  case BT_NUM:
1142
39.4k
    return PREFIX(scanPoundName)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1143
0
#  define LEAD_CASE(n)                                                         \
1144
31
  case BT_LEAD##n:                                                             \
1145
11.3k
    if (end - ptr < n)                                                         \
1146
48
      return XML_TOK_PARTIAL_CHAR;                                             \
1147
11.2k
    if (IS_INVALID_CHAR(enc, ptr, n)) {                                        \
1148
47
      *nextTokPtr = ptr;                                                       \
1149
47
      return XML_TOK_INVALID;                                                  \
1150
47
    }                                                                          \
1151
11.2k
    if (IS_NMSTRT_CHAR(enc, ptr, n)) {                                         \
1152
8.12k
      ptr += n;                                                                \
1153
8.12k
      tok = XML_TOK_NAME;                                                      \
1154
8.12k
      break;                                                                   \
1155
8.12k
    }                                                                          \
1156
11.2k
    if (IS_NAME_CHAR(enc, ptr, n)) {                                           \
1157
3.06k
      ptr += n;                                                                \
1158
3.06k
      tok = XML_TOK_NMTOKEN;                                                   \
1159
3.06k
      break;                                                                   \
1160
3.06k
    }                                                                          \
1161
3.09k
    *nextTokPtr = ptr;                                                         \
1162
31
    return XML_TOK_INVALID;
1163
25.4k
    LEAD_CASE(2)
1164
11.2k
    LEAD_CASE(3)
1165
120
    LEAD_CASE(4)
1166
0
#  undef LEAD_CASE
1167
114k
  case BT_NMSTRT:
1168
183k
  case BT_HEX:
1169
183k
    tok = XML_TOK_NAME;
1170
183k
    ptr += MINBPC(enc);
1171
183k
    break;
1172
119k
  case BT_DIGIT:
1173
119k
  case BT_NAME:
1174
119k
  case BT_MINUS:
1175
#  ifdef XML_NS
1176
  case BT_COLON:
1177
#  endif
1178
119k
    tok = XML_TOK_NMTOKEN;
1179
119k
    ptr += MINBPC(enc);
1180
119k
    break;
1181
130
  case BT_NONASCII:
1182
130
    if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {
1183
96
      ptr += MINBPC(enc);
1184
96
      tok = XML_TOK_NAME;
1185
96
      break;
1186
96
    }
1187
34
    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
60
  default:
1194
60
    *nextTokPtr = ptr;
1195
60
    return XML_TOK_INVALID;
1196
2.67M
  }
1197
10.8M
  while (HAS_CHAR(enc, ptr, end)) {
1198
10.8M
    switch (BYTE_TYPE(enc, ptr)) {
1199
29.4M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1200
22.3k
    case BT_GT:
1201
64.6k
    case BT_RPAR:
1202
65.1k
    case BT_COMMA:
1203
191k
    case BT_VERBAR:
1204
192k
    case BT_LSQB:
1205
192k
    case BT_PERCNT:
1206
232k
    case BT_S:
1207
292k
    case BT_CR:
1208
310k
    case BT_LF:
1209
310k
      *nextTokPtr = ptr;
1210
310k
      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
2.13k
    case BT_PLUS:
1232
2.13k
      if (tok == XML_TOK_NMTOKEN) {
1233
1
        *nextTokPtr = ptr;
1234
1
        return XML_TOK_INVALID;
1235
1
      }
1236
2.13k
      *nextTokPtr = ptr + MINBPC(enc);
1237
2.13k
      return XML_TOK_NAME_PLUS;
1238
537
    case BT_AST:
1239
537
      if (tok == XML_TOK_NMTOKEN) {
1240
2
        *nextTokPtr = ptr;
1241
2
        return XML_TOK_INVALID;
1242
2
      }
1243
535
      *nextTokPtr = ptr + MINBPC(enc);
1244
535
      return XML_TOK_NAME_ASTERISK;
1245
560
    case BT_QUEST:
1246
560
      if (tok == XML_TOK_NMTOKEN) {
1247
3
        *nextTokPtr = ptr;
1248
3
        return XML_TOK_INVALID;
1249
3
      }
1250
557
      *nextTokPtr = ptr + MINBPC(enc);
1251
557
      return XML_TOK_NAME_QUESTION;
1252
34
    default:
1253
34
      *nextTokPtr = ptr;
1254
34
      return XML_TOK_INVALID;
1255
10.8M
    }
1256
10.8M
  }
1257
560
  return -tok;
1258
314k
}
xmltok.c:normal_prologTok
Line
Count
Source
1018
2.67M
                  const char **nextTokPtr) {
1019
2.67M
  int tok;
1020
2.67M
  if (ptr >= end)
1021
4.97k
    return XML_TOK_NONE;
1022
2.67M
  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
2.67M
  switch (BYTE_TYPE(enc, ptr)) {
1032
7.59k
  case BT_QUOT:
1033
7.59k
    return PREFIX(scanLit)(BT_QUOT, enc, ptr + MINBPC(enc), end, nextTokPtr);
1034
28.5k
  case BT_APOS:
1035
28.5k
    return PREFIX(scanLit)(BT_APOS, enc, ptr + MINBPC(enc), end, nextTokPtr);
1036
65.4k
  case BT_LT: {
1037
65.4k
    ptr += MINBPC(enc);
1038
65.4k
    REQUIRE_CHAR(enc, ptr, end);
1039
65.4k
    switch (BYTE_TYPE(enc, ptr)) {
1040
54.3k
    case BT_EXCL:
1041
54.3k
      return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1042
7.53k
    case BT_QUEST:
1043
7.53k
      return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1044
2.74k
    case BT_NMSTRT:
1045
3.51k
    case BT_HEX:
1046
3.51k
    case BT_NONASCII:
1047
3.53k
    case BT_LEAD2:
1048
3.55k
    case BT_LEAD3:
1049
3.55k
    case BT_LEAD4:
1050
3.55k
      *nextTokPtr = ptr - MINBPC(enc);
1051
3.55k
      return XML_TOK_INSTANCE_START;
1052
65.4k
    }
1053
8
    *nextTokPtr = ptr;
1054
8
    return XML_TOK_INVALID;
1055
65.4k
  }
1056
129k
  case BT_CR:
1057
129k
    if (ptr + MINBPC(enc) == end) {
1058
313
      *nextTokPtr = end;
1059
      /* indicate that this might be part of a CR/LF pair */
1060
313
      return -XML_TOK_PROLOG_S;
1061
313
    }
1062
    /* fall through */
1063
230k
  case BT_S:
1064
275k
  case BT_LF:
1065
371k
    for (;;) {
1066
371k
      ptr += MINBPC(enc);
1067
371k
      if (! HAS_CHAR(enc, ptr, end))
1068
186
        break;
1069
371k
      switch (BYTE_TYPE(enc, ptr)) {
1070
8.69k
      case BT_S:
1071
12.8k
      case BT_LF:
1072
12.8k
        break;
1073
82.8k
      case BT_CR:
1074
        /* don't split CR/LF pair */
1075
82.8k
        if (ptr + MINBPC(enc) != end)
1076
82.6k
          break;
1077
        /* fall through */
1078
275k
      default:
1079
275k
        *nextTokPtr = ptr;
1080
275k
        return XML_TOK_PROLOG_S;
1081
371k
      }
1082
371k
    }
1083
186
    *nextTokPtr = ptr;
1084
186
    return XML_TOK_PROLOG_S;
1085
5.16k
  case BT_PERCNT:
1086
5.16k
    return PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1087
5.74k
  case BT_COMMA:
1088
5.74k
    *nextTokPtr = ptr + MINBPC(enc);
1089
5.74k
    return XML_TOK_COMMA;
1090
1.99k
  case BT_LSQB:
1091
1.99k
    *nextTokPtr = ptr + MINBPC(enc);
1092
1.99k
    return XML_TOK_OPEN_BRACKET;
1093
843
  case BT_RSQB:
1094
843
    ptr += MINBPC(enc);
1095
843
    if (! HAS_CHAR(enc, ptr, end))
1096
3
      return -XML_TOK_CLOSE_BRACKET;
1097
840
    if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) {
1098
16
      REQUIRE_CHARS(enc, ptr, end, 2);
1099
14
      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
14
    }
1104
837
    *nextTokPtr = ptr;
1105
837
    return XML_TOK_CLOSE_BRACKET;
1106
1.68M
  case BT_LPAR:
1107
1.68M
    *nextTokPtr = ptr + MINBPC(enc);
1108
1.68M
    return XML_TOK_OPEN_PAREN;
1109
56.6k
  case BT_RPAR:
1110
56.6k
    ptr += MINBPC(enc);
1111
56.6k
    if (! HAS_CHAR(enc, ptr, end))
1112
77
      return -XML_TOK_CLOSE_PAREN;
1113
56.6k
    switch (BYTE_TYPE(enc, ptr)) {
1114
2.87k
    case BT_AST:
1115
2.87k
      *nextTokPtr = ptr + MINBPC(enc);
1116
2.87k
      return XML_TOK_CLOSE_PAREN_ASTERISK;
1117
2.89k
    case BT_QUEST:
1118
2.89k
      *nextTokPtr = ptr + MINBPC(enc);
1119
2.89k
      return XML_TOK_CLOSE_PAREN_QUESTION;
1120
4.23k
    case BT_PLUS:
1121
4.23k
      *nextTokPtr = ptr + MINBPC(enc);
1122
4.23k
      return XML_TOK_CLOSE_PAREN_PLUS;
1123
1.19k
    case BT_CR:
1124
4.76k
    case BT_LF:
1125
34.9k
    case BT_S:
1126
35.6k
    case BT_GT:
1127
38.8k
    case BT_COMMA:
1128
44.0k
    case BT_VERBAR:
1129
46.6k
    case BT_RPAR:
1130
46.6k
      *nextTokPtr = ptr;
1131
46.6k
      return XML_TOK_CLOSE_PAREN;
1132
56.6k
    }
1133
4
    *nextTokPtr = ptr;
1134
4
    return XML_TOK_INVALID;
1135
138k
  case BT_VERBAR:
1136
138k
    *nextTokPtr = ptr + MINBPC(enc);
1137
138k
    return XML_TOK_OR;
1138
49.7k
  case BT_GT:
1139
49.7k
    *nextTokPtr = ptr + MINBPC(enc);
1140
49.7k
    return XML_TOK_DECL_CLOSE;
1141
39.4k
  case BT_NUM:
1142
39.4k
    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
25.4k
    LEAD_CASE(2)
1164
11.2k
    LEAD_CASE(3)
1165
72
    LEAD_CASE(4)
1166
0
#  undef LEAD_CASE
1167
114k
  case BT_NMSTRT:
1168
183k
  case BT_HEX:
1169
183k
    tok = XML_TOK_NAME;
1170
183k
    ptr += MINBPC(enc);
1171
183k
    break;
1172
119k
  case BT_DIGIT:
1173
119k
  case BT_NAME:
1174
119k
  case BT_MINUS:
1175
#  ifdef XML_NS
1176
  case BT_COLON:
1177
#  endif
1178
119k
    tok = XML_TOK_NMTOKEN;
1179
119k
    ptr += MINBPC(enc);
1180
119k
    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
30
  default:
1194
30
    *nextTokPtr = ptr;
1195
30
    return XML_TOK_INVALID;
1196
2.67M
  }
1197
10.7M
  while (HAS_CHAR(enc, ptr, end)) {
1198
10.7M
    switch (BYTE_TYPE(enc, ptr)) {
1199
29.1M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1200
22.3k
    case BT_GT:
1201
64.6k
    case BT_RPAR:
1202
65.1k
    case BT_COMMA:
1203
191k
    case BT_VERBAR:
1204
192k
    case BT_LSQB:
1205
192k
    case BT_PERCNT:
1206
232k
    case BT_S:
1207
292k
    case BT_CR:
1208
310k
    case BT_LF:
1209
310k
      *nextTokPtr = ptr;
1210
310k
      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
2.13k
    case BT_PLUS:
1232
2.13k
      if (tok == XML_TOK_NMTOKEN) {
1233
1
        *nextTokPtr = ptr;
1234
1
        return XML_TOK_INVALID;
1235
1
      }
1236
2.13k
      *nextTokPtr = ptr + MINBPC(enc);
1237
2.13k
      return XML_TOK_NAME_PLUS;
1238
537
    case BT_AST:
1239
537
      if (tok == XML_TOK_NMTOKEN) {
1240
2
        *nextTokPtr = ptr;
1241
2
        return XML_TOK_INVALID;
1242
2
      }
1243
535
      *nextTokPtr = ptr + MINBPC(enc);
1244
535
      return XML_TOK_NAME_ASTERISK;
1245
560
    case BT_QUEST:
1246
560
      if (tok == XML_TOK_NMTOKEN) {
1247
3
        *nextTokPtr = ptr;
1248
3
        return XML_TOK_INVALID;
1249
3
      }
1250
557
      *nextTokPtr = ptr + MINBPC(enc);
1251
557
      return XML_TOK_NAME_QUESTION;
1252
20
    default:
1253
20
      *nextTokPtr = ptr;
1254
20
      return XML_TOK_INVALID;
1255
10.7M
    }
1256
10.7M
  }
1257
526
  return -tok;
1258
314k
}
xmltok.c:little2_prologTok
Line
Count
Source
1018
90
                  const char **nextTokPtr) {
1019
90
  int tok;
1020
90
  if (ptr >= end)
1021
2
    return XML_TOK_NONE;
1022
88
  if (MINBPC(enc) > 1) {
1023
88
    size_t n = end - ptr;
1024
88
    if (n & (MINBPC(enc) - 1)) {
1025
17
      n &= ~(MINBPC(enc) - 1);
1026
17
      if (n == 0)
1027
2
        return XML_TOK_PARTIAL;
1028
15
      end = ptr + n;
1029
15
    }
1030
88
  }
1031
86
  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
69
  case BT_NONASCII:
1182
69
    if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {
1183
50
      ptr += MINBPC(enc);
1184
50
      tok = XML_TOK_NAME;
1185
50
      break;
1186
50
    }
1187
19
    if (IS_NAME_CHAR_MINBPC(enc, ptr)) {
1188
7
      ptr += MINBPC(enc);
1189
7
      tok = XML_TOK_NMTOKEN;
1190
7
      break;
1191
7
    }
1192
    /* fall through */
1193
16
  default:
1194
16
    *nextTokPtr = ptr;
1195
16
    return XML_TOK_INVALID;
1196
86
  }
1197
57.0k
  while (HAS_CHAR(enc, ptr, end)) {
1198
57.0k
    switch (BYTE_TYPE(enc, ptr)) {
1199
284k
      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
6
    default:
1253
6
      *nextTokPtr = ptr;
1254
6
      return XML_TOK_INVALID;
1255
57.0k
    }
1256
57.0k
  }
1257
16
  return -tok;
1258
57
}
xmltok.c:big2_prologTok
Line
Count
Source
1018
81
                  const char **nextTokPtr) {
1019
81
  int tok;
1020
81
  if (ptr >= end)
1021
2
    return XML_TOK_NONE;
1022
79
  if (MINBPC(enc) > 1) {
1023
79
    size_t n = end - ptr;
1024
79
    if (n & (MINBPC(enc) - 1)) {
1025
9
      n &= ~(MINBPC(enc) - 1);
1026
9
      if (n == 0)
1027
2
        return XML_TOK_PARTIAL;
1028
7
      end = ptr + n;
1029
7
    }
1030
79
  }
1031
77
  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
20
    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
61
  case BT_NONASCII:
1182
61
    if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {
1183
46
      ptr += MINBPC(enc);
1184
46
      tok = XML_TOK_NAME;
1185
46
      break;
1186
46
    }
1187
15
    if (IS_NAME_CHAR_MINBPC(enc, ptr)) {
1188
6
      ptr += MINBPC(enc);
1189
6
      tok = XML_TOK_NMTOKEN;
1190
6
      break;
1191
6
    }
1192
    /* fall through */
1193
14
  default:
1194
14
    *nextTokPtr = ptr;
1195
14
    return XML_TOK_INVALID;
1196
77
  }
1197
598
  while (HAS_CHAR(enc, ptr, end)) {
1198
598
    switch (BYTE_TYPE(enc, ptr)) {
1199
2.85k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1200
0
    case BT_GT:
1201
0
    case BT_RPAR:
1202
0
    case BT_COMMA:
1203
0
    case BT_VERBAR:
1204
0
    case BT_LSQB:
1205
0
    case BT_PERCNT:
1206
0
    case BT_S:
1207
0
    case BT_CR:
1208
0
    case BT_LF:
1209
0
      *nextTokPtr = ptr;
1210
0
      return tok;
1211
#  ifdef XML_NS
1212
    case BT_COLON:
1213
      ptr += MINBPC(enc);
1214
      switch (tok) {
1215
      case XML_TOK_NAME:
1216
        REQUIRE_CHAR(enc, ptr, end);
1217
        tok = XML_TOK_PREFIXED_NAME;
1218
        switch (BYTE_TYPE(enc, ptr)) {
1219
          CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1220
        default:
1221
          tok = XML_TOK_NMTOKEN;
1222
          break;
1223
        }
1224
        break;
1225
      case XML_TOK_PREFIXED_NAME:
1226
        tok = XML_TOK_NMTOKEN;
1227
        break;
1228
      }
1229
      break;
1230
#  endif
1231
0
    case BT_PLUS:
1232
0
      if (tok == XML_TOK_NMTOKEN) {
1233
0
        *nextTokPtr = ptr;
1234
0
        return XML_TOK_INVALID;
1235
0
      }
1236
0
      *nextTokPtr = ptr + MINBPC(enc);
1237
0
      return XML_TOK_NAME_PLUS;
1238
0
    case BT_AST:
1239
0
      if (tok == XML_TOK_NMTOKEN) {
1240
0
        *nextTokPtr = ptr;
1241
0
        return XML_TOK_INVALID;
1242
0
      }
1243
0
      *nextTokPtr = ptr + MINBPC(enc);
1244
0
      return XML_TOK_NAME_ASTERISK;
1245
0
    case BT_QUEST:
1246
0
      if (tok == XML_TOK_NMTOKEN) {
1247
0
        *nextTokPtr = ptr;
1248
0
        return XML_TOK_INVALID;
1249
0
      }
1250
0
      *nextTokPtr = ptr + MINBPC(enc);
1251
0
      return XML_TOK_NAME_QUESTION;
1252
8
    default:
1253
8
      *nextTokPtr = ptr;
1254
8
      return XML_TOK_INVALID;
1255
598
    }
1256
598
  }
1257
18
  return -tok;
1258
52
}
1259
1260
static int PTRCALL
1261
PREFIX(attributeValueTok)(const ENCODING *enc, const char *ptr, const char *end,
1262
1.55M
                          const char **nextTokPtr) {
1263
1.55M
  const char *start;
1264
1.55M
  if (ptr >= end)
1265
61.4k
    return XML_TOK_NONE;
1266
1.49M
  else if (! HAS_CHAR(enc, ptr, end)) {
1267
    /* This line cannot be executed.  The incoming data has already
1268
     * been tokenized once, so incomplete characters like this have
1269
     * already been eliminated from the input.  Retaining the paranoia
1270
     * check is still valuable, however.
1271
     */
1272
0
    return XML_TOK_PARTIAL; /* LCOV_EXCL_LINE */
1273
0
  }
1274
1.49M
  start = ptr;
1275
11.6M
  while (HAS_CHAR(enc, ptr, end)) {
1276
11.6M
    switch (BYTE_TYPE(enc, ptr)) {
1277
0
#  define LEAD_CASE(n)                                                         \
1278
145k
  case BT_LEAD##n:                                                             \
1279
145k
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1280
145k
    break;
1281
41.1k
      LEAD_CASE(2)
1282
51.9k
      LEAD_CASE(3)
1283
52.0k
      LEAD_CASE(4)
1284
0
#  undef LEAD_CASE
1285
247k
    case BT_AMP:
1286
247k
      if (ptr == start)
1287
182k
        return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1288
64.9k
      *nextTokPtr = ptr;
1289
64.9k
      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
340k
    case BT_LF:
1295
340k
      if (ptr == start) {
1296
235k
        *nextTokPtr = ptr + MINBPC(enc);
1297
235k
        return XML_TOK_DATA_NEWLINE;
1298
235k
      }
1299
105k
      *nextTokPtr = ptr;
1300
105k
      return XML_TOK_DATA_CHARS;
1301
486k
    case BT_CR:
1302
486k
      if (ptr == start) {
1303
367k
        ptr += MINBPC(enc);
1304
367k
        if (! HAS_CHAR(enc, ptr, end))
1305
1.46k
          return XML_TOK_TRAILING_CR;
1306
365k
        if (BYTE_TYPE(enc, ptr) == BT_LF)
1307
62.5k
          ptr += MINBPC(enc);
1308
365k
        *nextTokPtr = ptr;
1309
365k
        return XML_TOK_DATA_NEWLINE;
1310
367k
      }
1311
118k
      *nextTokPtr = ptr;
1312
118k
      return XML_TOK_DATA_CHARS;
1313
375k
    case BT_S:
1314
375k
      if (ptr == start) {
1315
263k
        *nextTokPtr = ptr + MINBPC(enc);
1316
263k
        return XML_TOK_ATTRIBUTE_VALUE_S;
1317
263k
      }
1318
112k
      *nextTokPtr = ptr;
1319
112k
      return XML_TOK_DATA_CHARS;
1320
10.0M
    default:
1321
10.0M
      ptr += MINBPC(enc);
1322
10.0M
      break;
1323
11.6M
    }
1324
11.6M
  }
1325
47.1k
  *nextTokPtr = ptr;
1326
47.1k
  return XML_TOK_DATA_CHARS;
1327
1.49M
}
xmltok.c:normal_attributeValueTok
Line
Count
Source
1262
1.55M
                          const char **nextTokPtr) {
1263
1.55M
  const char *start;
1264
1.55M
  if (ptr >= end)
1265
61.4k
    return XML_TOK_NONE;
1266
1.49M
  else if (! HAS_CHAR(enc, ptr, end)) {
1267
    /* This line cannot be executed.  The incoming data has already
1268
     * been tokenized once, so incomplete characters like this have
1269
     * already been eliminated from the input.  Retaining the paranoia
1270
     * check is still valuable, however.
1271
     */
1272
0
    return XML_TOK_PARTIAL; /* LCOV_EXCL_LINE */
1273
0
  }
1274
1.49M
  start = ptr;
1275
11.6M
  while (HAS_CHAR(enc, ptr, end)) {
1276
11.6M
    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
41.1k
      LEAD_CASE(2)
1282
51.9k
      LEAD_CASE(3)
1283
52.0k
      LEAD_CASE(4)
1284
0
#  undef LEAD_CASE
1285
247k
    case BT_AMP:
1286
247k
      if (ptr == start)
1287
182k
        return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1288
64.9k
      *nextTokPtr = ptr;
1289
64.9k
      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
340k
    case BT_LF:
1295
340k
      if (ptr == start) {
1296
235k
        *nextTokPtr = ptr + MINBPC(enc);
1297
235k
        return XML_TOK_DATA_NEWLINE;
1298
235k
      }
1299
105k
      *nextTokPtr = ptr;
1300
105k
      return XML_TOK_DATA_CHARS;
1301
486k
    case BT_CR:
1302
486k
      if (ptr == start) {
1303
367k
        ptr += MINBPC(enc);
1304
367k
        if (! HAS_CHAR(enc, ptr, end))
1305
1.46k
          return XML_TOK_TRAILING_CR;
1306
365k
        if (BYTE_TYPE(enc, ptr) == BT_LF)
1307
62.5k
          ptr += MINBPC(enc);
1308
365k
        *nextTokPtr = ptr;
1309
365k
        return XML_TOK_DATA_NEWLINE;
1310
367k
      }
1311
118k
      *nextTokPtr = ptr;
1312
118k
      return XML_TOK_DATA_CHARS;
1313
375k
    case BT_S:
1314
375k
      if (ptr == start) {
1315
263k
        *nextTokPtr = ptr + MINBPC(enc);
1316
263k
        return XML_TOK_ATTRIBUTE_VALUE_S;
1317
263k
      }
1318
112k
      *nextTokPtr = ptr;
1319
112k
      return XML_TOK_DATA_CHARS;
1320
10.0M
    default:
1321
10.0M
      ptr += MINBPC(enc);
1322
10.0M
      break;
1323
11.6M
    }
1324
11.6M
  }
1325
47.1k
  *nextTokPtr = ptr;
1326
47.1k
  return XML_TOK_DATA_CHARS;
1327
1.49M
}
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
4.70k
                   const char **badPtr) {
1451
4.70k
  ptr += MINBPC(enc);
1452
4.70k
  end -= MINBPC(enc);
1453
1.66M
  for (; HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
1454
1.66M
    switch (BYTE_TYPE(enc, ptr)) {
1455
660k
    case BT_DIGIT:
1456
1.01M
    case BT_HEX:
1457
1.01M
    case BT_MINUS:
1458
1.08M
    case BT_APOS:
1459
1.08M
    case BT_LPAR:
1460
1.19M
    case BT_RPAR:
1461
1.20M
    case BT_PLUS:
1462
1.21M
    case BT_COMMA:
1463
1.37M
    case BT_SOL:
1464
1.37M
    case BT_EQUALS:
1465
1.38M
    case BT_QUEST:
1466
1.39M
    case BT_CR:
1467
1.39M
    case BT_LF:
1468
1.39M
    case BT_SEMI:
1469
1.39M
    case BT_EXCL:
1470
1.40M
    case BT_AST:
1471
1.41M
    case BT_PERCNT:
1472
1.43M
    case BT_NUM:
1473
#  ifdef XML_NS
1474
    case BT_COLON:
1475
#  endif
1476
1.43M
      break;
1477
4.33k
    case BT_S:
1478
4.33k
      if (CHAR_MATCHES(enc, ptr, ASCII_TAB)) {
1479
1
        *badPtr = ptr;
1480
1
        return 0;
1481
1
      }
1482
4.33k
      break;
1483
9.02k
    case BT_NAME:
1484
217k
    case BT_NMSTRT:
1485
217k
      if (! (BYTE_TO_ASCII(enc, ptr) & ~0x7f))
1486
217k
        break;
1487
      /* fall through */
1488
7.36k
    default:
1489
7.36k
      switch (BYTE_TO_ASCII(enc, ptr)) {
1490
3.54k
      case 0x24: /* $ */
1491
7.36k
      case 0x40: /* @ */
1492
7.36k
        break;
1493
5
      default:
1494
5
        *badPtr = ptr;
1495
5
        return 0;
1496
7.36k
      }
1497
7.36k
      break;
1498
1.66M
    }
1499
1.66M
  }
1500
4.70k
  return 1;
1501
4.70k
}
xmltok.c:normal_isPublicId
Line
Count
Source
1450
4.70k
                   const char **badPtr) {
1451
4.70k
  ptr += MINBPC(enc);
1452
4.70k
  end -= MINBPC(enc);
1453
1.66M
  for (; HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
1454
1.66M
    switch (BYTE_TYPE(enc, ptr)) {
1455
660k
    case BT_DIGIT:
1456
1.01M
    case BT_HEX:
1457
1.01M
    case BT_MINUS:
1458
1.08M
    case BT_APOS:
1459
1.08M
    case BT_LPAR:
1460
1.19M
    case BT_RPAR:
1461
1.20M
    case BT_PLUS:
1462
1.21M
    case BT_COMMA:
1463
1.37M
    case BT_SOL:
1464
1.37M
    case BT_EQUALS:
1465
1.38M
    case BT_QUEST:
1466
1.39M
    case BT_CR:
1467
1.39M
    case BT_LF:
1468
1.39M
    case BT_SEMI:
1469
1.39M
    case BT_EXCL:
1470
1.40M
    case BT_AST:
1471
1.41M
    case BT_PERCNT:
1472
1.43M
    case BT_NUM:
1473
#  ifdef XML_NS
1474
    case BT_COLON:
1475
#  endif
1476
1.43M
      break;
1477
4.33k
    case BT_S:
1478
4.33k
      if (CHAR_MATCHES(enc, ptr, ASCII_TAB)) {
1479
1
        *badPtr = ptr;
1480
1
        return 0;
1481
1
      }
1482
4.33k
      break;
1483
9.02k
    case BT_NAME:
1484
217k
    case BT_NMSTRT:
1485
217k
      if (! (BYTE_TO_ASCII(enc, ptr) & ~0x7f))
1486
217k
        break;
1487
      /* fall through */
1488
7.36k
    default:
1489
7.36k
      switch (BYTE_TO_ASCII(enc, ptr)) {
1490
3.54k
      case 0x24: /* $ */
1491
7.36k
      case 0x40: /* @ */
1492
7.36k
        break;
1493
5
      default:
1494
5
        *badPtr = ptr;
1495
5
        return 0;
1496
7.36k
      }
1497
7.36k
      break;
1498
1.66M
    }
1499
1.66M
  }
1500
4.70k
  return 1;
1501
4.70k
}
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
297k
                ATTRIBUTE *atts) {
1511
297k
  enum { other, inName, inValue } state = inName;
1512
297k
  int nAtts = 0;
1513
297k
  int open = 0; /* defined when state == inValue;
1514
                   initialization just to shut up compilers */
1515
1516
35.1M
  for (ptr += MINBPC(enc);; ptr += MINBPC(enc)) {
1517
35.1M
    switch (BYTE_TYPE(enc, ptr)) {
1518
0
#  define START_NAME                                                           \
1519
16.6M
    if (state == other) {                                                      \
1520
3.79M
      if (nAtts < attsMax) {                                                   \
1521
1.97M
        atts[nAtts].name = ptr;                                                \
1522
1.97M
        atts[nAtts].normalized = 1;                                            \
1523
1.97M
      }                                                                        \
1524
3.79M
      state = inName;                                                          \
1525
3.79M
    }
1526
0
#  define LEAD_CASE(n)                                                         \
1527
149k
  case BT_LEAD##n: /* NOTE: The encoding has already been validated. */        \
1528
149k
    START_NAME ptr += (n - MINBPC(enc));                                       \
1529
149k
    break;
1530
56.7k
      LEAD_CASE(2)
1531
69.4k
      LEAD_CASE(3)
1532
23.1k
      LEAD_CASE(4)
1533
0
#  undef LEAD_CASE
1534
0
    case BT_NONASCII:
1535
15.5M
    case BT_NMSTRT:
1536
16.5M
    case BT_HEX:
1537
16.5M
      START_NAME
1538
16.5M
      break;
1539
0
#  undef START_NAME
1540
636k
    case BT_QUOT:
1541
636k
      if (state != inValue) {
1542
262k
        if (nAtts < attsMax)
1543
198k
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1544
262k
        state = inValue;
1545
262k
        open = BT_QUOT;
1546
373k
      } else if (open == BT_QUOT) {
1547
262k
        state = other;
1548
262k
        if (nAtts < attsMax)
1549
198k
          atts[nAtts].valueEnd = ptr;
1550
262k
        nAtts++;
1551
262k
      }
1552
636k
      break;
1553
7.16M
    case BT_APOS:
1554
7.16M
      if (state != inValue) {
1555
3.53M
        if (nAtts < attsMax)
1556
1.77M
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1557
3.53M
        state = inValue;
1558
3.53M
        open = BT_APOS;
1559
3.63M
      } else if (open == BT_APOS) {
1560
3.53M
        state = other;
1561
3.53M
        if (nAtts < attsMax)
1562
1.77M
          atts[nAtts].valueEnd = ptr;
1563
3.53M
        nAtts++;
1564
3.53M
      }
1565
7.16M
      break;
1566
37.5k
    case BT_AMP:
1567
37.5k
      if (nAtts < attsMax)
1568
36.3k
        atts[nAtts].normalized = 0;
1569
37.5k
      break;
1570
2.79M
    case BT_S:
1571
2.79M
      if (state == inName)
1572
125k
        state = other;
1573
2.66M
      else if (state == inValue && nAtts < attsMax && atts[nAtts].normalized
1574
2.66M
               && (ptr == atts[nAtts].valuePtr
1575
82.4k
                   || BYTE_TO_ASCII(enc, ptr) != ASCII_SPACE
1576
82.4k
                   || BYTE_TO_ASCII(enc, ptr + MINBPC(enc)) == ASCII_SPACE
1577
82.4k
                   || BYTE_TYPE(enc, ptr + MINBPC(enc)) == open))
1578
78.1k
        atts[nAtts].normalized = 0;
1579
2.79M
      break;
1580
2.18M
    case BT_CR:
1581
2.55M
    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.55M
      if (state == inName)
1585
21.1k
        state = other;
1586
2.53M
      else if (state == inValue && nAtts < attsMax)
1587
565k
        atts[nAtts].normalized = 0;
1588
2.55M
      break;
1589
151k
    case BT_GT:
1590
311k
    case BT_SOL:
1591
311k
      if (state != inValue)
1592
297k
        return nAtts;
1593
14.6k
      break;
1594
4.97M
    default:
1595
4.97M
      break;
1596
35.1M
    }
1597
35.1M
  }
1598
  /* not reached */
1599
297k
}
xmltok.c:normal_getAtts
Line
Count
Source
1510
297k
                ATTRIBUTE *atts) {
1511
297k
  enum { other, inName, inValue } state = inName;
1512
297k
  int nAtts = 0;
1513
297k
  int open = 0; /* defined when state == inValue;
1514
                   initialization just to shut up compilers */
1515
1516
35.1M
  for (ptr += MINBPC(enc);; ptr += MINBPC(enc)) {
1517
35.1M
    switch (BYTE_TYPE(enc, ptr)) {
1518
0
#  define START_NAME                                                           \
1519
0
    if (state == other) {                                                      \
1520
0
      if (nAtts < attsMax) {                                                   \
1521
0
        atts[nAtts].name = ptr;                                                \
1522
0
        atts[nAtts].normalized = 1;                                            \
1523
0
      }                                                                        \
1524
0
      state = inName;                                                          \
1525
0
    }
1526
0
#  define LEAD_CASE(n)                                                         \
1527
0
  case BT_LEAD##n: /* NOTE: The encoding has already been validated. */        \
1528
0
    START_NAME ptr += (n - MINBPC(enc));                                       \
1529
0
    break;
1530
56.7k
      LEAD_CASE(2)
1531
69.4k
      LEAD_CASE(3)
1532
23.1k
      LEAD_CASE(4)
1533
0
#  undef LEAD_CASE
1534
0
    case BT_NONASCII:
1535
15.5M
    case BT_NMSTRT:
1536
16.5M
    case BT_HEX:
1537
16.5M
      START_NAME
1538
16.5M
      break;
1539
0
#  undef START_NAME
1540
636k
    case BT_QUOT:
1541
636k
      if (state != inValue) {
1542
262k
        if (nAtts < attsMax)
1543
198k
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1544
262k
        state = inValue;
1545
262k
        open = BT_QUOT;
1546
373k
      } else if (open == BT_QUOT) {
1547
262k
        state = other;
1548
262k
        if (nAtts < attsMax)
1549
198k
          atts[nAtts].valueEnd = ptr;
1550
262k
        nAtts++;
1551
262k
      }
1552
636k
      break;
1553
7.16M
    case BT_APOS:
1554
7.16M
      if (state != inValue) {
1555
3.53M
        if (nAtts < attsMax)
1556
1.77M
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1557
3.53M
        state = inValue;
1558
3.53M
        open = BT_APOS;
1559
3.63M
      } else if (open == BT_APOS) {
1560
3.53M
        state = other;
1561
3.53M
        if (nAtts < attsMax)
1562
1.77M
          atts[nAtts].valueEnd = ptr;
1563
3.53M
        nAtts++;
1564
3.53M
      }
1565
7.16M
      break;
1566
37.5k
    case BT_AMP:
1567
37.5k
      if (nAtts < attsMax)
1568
36.3k
        atts[nAtts].normalized = 0;
1569
37.5k
      break;
1570
2.79M
    case BT_S:
1571
2.79M
      if (state == inName)
1572
125k
        state = other;
1573
2.66M
      else if (state == inValue && nAtts < attsMax && atts[nAtts].normalized
1574
2.66M
               && (ptr == atts[nAtts].valuePtr
1575
82.4k
                   || BYTE_TO_ASCII(enc, ptr) != ASCII_SPACE
1576
82.4k
                   || BYTE_TO_ASCII(enc, ptr + MINBPC(enc)) == ASCII_SPACE
1577
82.4k
                   || BYTE_TYPE(enc, ptr + MINBPC(enc)) == open))
1578
78.1k
        atts[nAtts].normalized = 0;
1579
2.79M
      break;
1580
2.18M
    case BT_CR:
1581
2.55M
    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.55M
      if (state == inName)
1585
21.1k
        state = other;
1586
2.53M
      else if (state == inValue && nAtts < attsMax)
1587
565k
        atts[nAtts].normalized = 0;
1588
2.55M
      break;
1589
151k
    case BT_GT:
1590
311k
    case BT_SOL:
1591
311k
      if (state != inValue)
1592
297k
        return nAtts;
1593
14.6k
      break;
1594
4.97M
    default:
1595
4.97M
      break;
1596
35.1M
    }
1597
35.1M
  }
1598
  /* not reached */
1599
297k
}
Unexecuted instantiation: xmltok.c:little2_getAtts
Unexecuted instantiation: xmltok.c:big2_getAtts
1600
1601
static int PTRFASTCALL
1602
42.8k
PREFIX(charRefNumber)(const ENCODING *enc, const char *ptr) {
1603
42.8k
  int result = 0;
1604
  /* skip &# */
1605
42.8k
  UNUSED_P(enc);
1606
42.8k
  ptr += 2 * MINBPC(enc);
1607
42.8k
  if (CHAR_MATCHES(enc, ptr, ASCII_x)) {
1608
190k
    for (ptr += MINBPC(enc); ! CHAR_MATCHES(enc, ptr, ASCII_SEMI);
1609
149k
         ptr += MINBPC(enc)) {
1610
149k
      int c = BYTE_TO_ASCII(enc, ptr);
1611
149k
      switch (c) {
1612
2.49k
      case ASCII_0:
1613
13.9k
      case ASCII_1:
1614
28.1k
      case ASCII_2:
1615
33.4k
      case ASCII_3:
1616
49.6k
      case ASCII_4:
1617
62.9k
      case ASCII_5:
1618
65.0k
      case ASCII_6:
1619
72.5k
      case ASCII_7:
1620
83.2k
      case ASCII_8:
1621
86.7k
      case ASCII_9:
1622
86.7k
        result <<= 4;
1623
86.7k
        result |= (c - ASCII_0);
1624
86.7k
        break;
1625
12.8k
      case ASCII_A:
1626
15.7k
      case ASCII_B:
1627
17.9k
      case ASCII_C:
1628
21.3k
      case ASCII_D:
1629
23.0k
      case ASCII_E:
1630
30.9k
      case ASCII_F:
1631
30.9k
        result <<= 4;
1632
30.9k
        result += 10 + (c - ASCII_A);
1633
30.9k
        break;
1634
499
      case ASCII_a:
1635
7.41k
      case ASCII_b:
1636
8.95k
      case ASCII_c:
1637
21.6k
      case ASCII_d:
1638
22.9k
      case ASCII_e:
1639
32.1k
      case ASCII_f:
1640
32.1k
        result <<= 4;
1641
32.1k
        result += 10 + (c - ASCII_a);
1642
32.1k
        break;
1643
149k
      }
1644
149k
      if (result >= 0x110000)
1645
13
        return -1;
1646
149k
    }
1647
40.8k
  } else {
1648
7.67k
    for (; ! CHAR_MATCHES(enc, ptr, ASCII_SEMI); ptr += MINBPC(enc)) {
1649
5.70k
      int c = BYTE_TO_ASCII(enc, ptr);
1650
5.70k
      result *= 10;
1651
5.70k
      result += (c - ASCII_0);
1652
5.70k
      if (result >= 0x110000)
1653
4
        return -1;
1654
5.70k
    }
1655
1.97k
  }
1656
42.8k
  return checkCharRefNumber(result);
1657
42.8k
}
xmltok.c:normal_charRefNumber
Line
Count
Source
1602
42.8k
PREFIX(charRefNumber)(const ENCODING *enc, const char *ptr) {
1603
42.8k
  int result = 0;
1604
  /* skip &# */
1605
42.8k
  UNUSED_P(enc);
1606
42.8k
  ptr += 2 * MINBPC(enc);
1607
42.8k
  if (CHAR_MATCHES(enc, ptr, ASCII_x)) {
1608
190k
    for (ptr += MINBPC(enc); ! CHAR_MATCHES(enc, ptr, ASCII_SEMI);
1609
149k
         ptr += MINBPC(enc)) {
1610
149k
      int c = BYTE_TO_ASCII(enc, ptr);
1611
149k
      switch (c) {
1612
2.49k
      case ASCII_0:
1613
13.9k
      case ASCII_1:
1614
28.1k
      case ASCII_2:
1615
33.4k
      case ASCII_3:
1616
49.6k
      case ASCII_4:
1617
62.9k
      case ASCII_5:
1618
65.0k
      case ASCII_6:
1619
72.5k
      case ASCII_7:
1620
83.2k
      case ASCII_8:
1621
86.7k
      case ASCII_9:
1622
86.7k
        result <<= 4;
1623
86.7k
        result |= (c - ASCII_0);
1624
86.7k
        break;
1625
12.8k
      case ASCII_A:
1626
15.7k
      case ASCII_B:
1627
17.9k
      case ASCII_C:
1628
21.3k
      case ASCII_D:
1629
23.0k
      case ASCII_E:
1630
30.9k
      case ASCII_F:
1631
30.9k
        result <<= 4;
1632
30.9k
        result += 10 + (c - ASCII_A);
1633
30.9k
        break;
1634
499
      case ASCII_a:
1635
7.41k
      case ASCII_b:
1636
8.95k
      case ASCII_c:
1637
21.6k
      case ASCII_d:
1638
22.9k
      case ASCII_e:
1639
32.1k
      case ASCII_f:
1640
32.1k
        result <<= 4;
1641
32.1k
        result += 10 + (c - ASCII_a);
1642
32.1k
        break;
1643
149k
      }
1644
149k
      if (result >= 0x110000)
1645
13
        return -1;
1646
149k
    }
1647
40.8k
  } else {
1648
7.67k
    for (; ! CHAR_MATCHES(enc, ptr, ASCII_SEMI); ptr += MINBPC(enc)) {
1649
5.70k
      int c = BYTE_TO_ASCII(enc, ptr);
1650
5.70k
      result *= 10;
1651
5.70k
      result += (c - ASCII_0);
1652
5.70k
      if (result >= 0x110000)
1653
4
        return -1;
1654
5.70k
    }
1655
1.97k
  }
1656
42.8k
  return checkCharRefNumber(result);
1657
42.8k
}
Unexecuted instantiation: xmltok.c:little2_charRefNumber
Unexecuted instantiation: xmltok.c:big2_charRefNumber
1658
1659
static int PTRCALL
1660
PREFIX(predefinedEntityName)(const ENCODING *enc, const char *ptr,
1661
183k
                             const char *end) {
1662
183k
  UNUSED_P(enc);
1663
183k
  switch ((end - ptr) / MINBPC(enc)) {
1664
13.4k
  case 2:
1665
13.4k
    if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_t)) {
1666
3.88k
      switch (BYTE_TO_ASCII(enc, ptr)) {
1667
569
      case ASCII_l:
1668
569
        return ASCII_LT;
1669
156
      case ASCII_g:
1670
156
        return ASCII_GT;
1671
3.88k
      }
1672
3.88k
    }
1673
12.6k
    break;
1674
42.8k
  case 3:
1675
42.8k
    if (CHAR_MATCHES(enc, ptr, ASCII_a)) {
1676
24.9k
      ptr += MINBPC(enc);
1677
24.9k
      if (CHAR_MATCHES(enc, ptr, ASCII_m)) {
1678
23.3k
        ptr += MINBPC(enc);
1679
23.3k
        if (CHAR_MATCHES(enc, ptr, ASCII_p))
1680
23.1k
          return ASCII_AMP;
1681
23.3k
      }
1682
24.9k
    }
1683
19.7k
    break;
1684
22.5k
  case 4:
1685
22.5k
    switch (BYTE_TO_ASCII(enc, ptr)) {
1686
13.5k
    case ASCII_q:
1687
13.5k
      ptr += MINBPC(enc);
1688
13.5k
      if (CHAR_MATCHES(enc, ptr, ASCII_u)) {
1689
12.6k
        ptr += MINBPC(enc);
1690
12.6k
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1691
12.0k
          ptr += MINBPC(enc);
1692
12.0k
          if (CHAR_MATCHES(enc, ptr, ASCII_t))
1693
11.6k
            return ASCII_QUOT;
1694
12.0k
        }
1695
12.6k
      }
1696
1.86k
      break;
1697
5.84k
    case ASCII_a:
1698
5.84k
      ptr += MINBPC(enc);
1699
5.84k
      if (CHAR_MATCHES(enc, ptr, ASCII_p)) {
1700
1.31k
        ptr += MINBPC(enc);
1701
1.31k
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1702
829
          ptr += MINBPC(enc);
1703
829
          if (CHAR_MATCHES(enc, ptr, ASCII_s))
1704
506
            return ASCII_APOS;
1705
829
        }
1706
1.31k
      }
1707
5.33k
      break;
1708
22.5k
    }
1709
183k
  }
1710
147k
  return 0;
1711
183k
}
xmltok.c:normal_predefinedEntityName
Line
Count
Source
1661
183k
                             const char *end) {
1662
183k
  UNUSED_P(enc);
1663
183k
  switch ((end - ptr) / MINBPC(enc)) {
1664
13.4k
  case 2:
1665
13.4k
    if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_t)) {
1666
3.88k
      switch (BYTE_TO_ASCII(enc, ptr)) {
1667
569
      case ASCII_l:
1668
569
        return ASCII_LT;
1669
156
      case ASCII_g:
1670
156
        return ASCII_GT;
1671
3.88k
      }
1672
3.88k
    }
1673
12.6k
    break;
1674
42.8k
  case 3:
1675
42.8k
    if (CHAR_MATCHES(enc, ptr, ASCII_a)) {
1676
24.9k
      ptr += MINBPC(enc);
1677
24.9k
      if (CHAR_MATCHES(enc, ptr, ASCII_m)) {
1678
23.3k
        ptr += MINBPC(enc);
1679
23.3k
        if (CHAR_MATCHES(enc, ptr, ASCII_p))
1680
23.1k
          return ASCII_AMP;
1681
23.3k
      }
1682
24.9k
    }
1683
19.7k
    break;
1684
22.5k
  case 4:
1685
22.5k
    switch (BYTE_TO_ASCII(enc, ptr)) {
1686
13.5k
    case ASCII_q:
1687
13.5k
      ptr += MINBPC(enc);
1688
13.5k
      if (CHAR_MATCHES(enc, ptr, ASCII_u)) {
1689
12.6k
        ptr += MINBPC(enc);
1690
12.6k
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1691
12.0k
          ptr += MINBPC(enc);
1692
12.0k
          if (CHAR_MATCHES(enc, ptr, ASCII_t))
1693
11.6k
            return ASCII_QUOT;
1694
12.0k
        }
1695
12.6k
      }
1696
1.86k
      break;
1697
5.84k
    case ASCII_a:
1698
5.84k
      ptr += MINBPC(enc);
1699
5.84k
      if (CHAR_MATCHES(enc, ptr, ASCII_p)) {
1700
1.31k
        ptr += MINBPC(enc);
1701
1.31k
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1702
829
          ptr += MINBPC(enc);
1703
829
          if (CHAR_MATCHES(enc, ptr, ASCII_s))
1704
506
            return ASCII_APOS;
1705
829
        }
1706
1.31k
      }
1707
5.33k
      break;
1708
22.5k
    }
1709
183k
  }
1710
147k
  return 0;
1711
183k
}
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
197k
                         const char *end1, const char *ptr2) {
1716
197k
  UNUSED_P(enc);
1717
932k
  for (; *ptr2; ptr1 += MINBPC(enc), ptr2++) {
1718
809k
    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
35
      return 0; /* LCOV_EXCL_LINE */
1725
35
    }
1726
809k
    if (! CHAR_MATCHES(enc, ptr1, *ptr2))
1727
74.3k
      return 0;
1728
809k
  }
1729
123k
  return ptr1 == end1;
1730
197k
}
xmltok.c:normal_nameMatchesAscii
Line
Count
Source
1715
197k
                         const char *end1, const char *ptr2) {
1716
197k
  UNUSED_P(enc);
1717
932k
  for (; *ptr2; ptr1 += MINBPC(enc), ptr2++) {
1718
809k
    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
35
      return 0; /* LCOV_EXCL_LINE */
1725
35
    }
1726
809k
    if (! CHAR_MATCHES(enc, ptr1, *ptr2))
1727
74.3k
      return 0;
1728
809k
  }
1729
123k
  return ptr1 == end1;
1730
197k
}
Unexecuted instantiation: xmltok.c:little2_nameMatchesAscii
Unexecuted instantiation: xmltok.c:big2_nameMatchesAscii
1731
1732
static int PTRFASTCALL
1733
469k
PREFIX(nameLength)(const ENCODING *enc, const char *ptr) {
1734
469k
  const char *start = ptr;
1735
5.95M
  for (;;) {
1736
5.95M
    switch (BYTE_TYPE(enc, ptr)) {
1737
0
#  define LEAD_CASE(n)                                                         \
1738
68.6k
  case BT_LEAD##n:                                                             \
1739
68.6k
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1740
68.6k
    break;
1741
31.6k
      LEAD_CASE(2)
1742
37.0k
      LEAD_CASE(3)
1743
0
      LEAD_CASE(4)
1744
0
#  undef LEAD_CASE
1745
0
    case BT_NONASCII:
1746
4.52M
    case BT_NMSTRT:
1747
#  ifdef XML_NS
1748
    case BT_COLON:
1749
#  endif
1750
5.28M
    case BT_HEX:
1751
5.36M
    case BT_DIGIT:
1752
5.38M
    case BT_NAME:
1753
5.41M
    case BT_MINUS:
1754
5.41M
      ptr += MINBPC(enc);
1755
5.41M
      break;
1756
469k
    default:
1757
469k
      return (int)(ptr - start);
1758
5.95M
    }
1759
5.95M
  }
1760
469k
}
xmltok.c:normal_nameLength
Line
Count
Source
1733
469k
PREFIX(nameLength)(const ENCODING *enc, const char *ptr) {
1734
469k
  const char *start = ptr;
1735
5.95M
  for (;;) {
1736
5.95M
    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
31.6k
      LEAD_CASE(2)
1742
37.0k
      LEAD_CASE(3)
1743
0
      LEAD_CASE(4)
1744
0
#  undef LEAD_CASE
1745
0
    case BT_NONASCII:
1746
4.52M
    case BT_NMSTRT:
1747
#  ifdef XML_NS
1748
    case BT_COLON:
1749
#  endif
1750
5.28M
    case BT_HEX:
1751
5.36M
    case BT_DIGIT:
1752
5.38M
    case BT_NAME:
1753
5.41M
    case BT_MINUS:
1754
5.41M
      ptr += MINBPC(enc);
1755
5.41M
      break;
1756
469k
    default:
1757
469k
      return (int)(ptr - start);
1758
5.95M
    }
1759
5.95M
  }
1760
469k
}
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
12.8k
                       POSITION *pos) {
1780
67.5M
  while (HAS_CHAR(enc, ptr, end)) {
1781
67.5M
    switch (BYTE_TYPE(enc, ptr)) {
1782
0
#  define LEAD_CASE(n)                                                         \
1783
860k
  case BT_LEAD##n:                                                             \
1784
860k
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1785
860k
    pos->columnNumber++;                                                       \
1786
860k
    break;
1787
348k
      LEAD_CASE(2)
1788
389k
      LEAD_CASE(3)
1789
122k
      LEAD_CASE(4)
1790
0
#  undef LEAD_CASE
1791
1.59M
    case BT_LF:
1792
1.59M
      pos->columnNumber = 0;
1793
1.59M
      pos->lineNumber++;
1794
1.59M
      ptr += MINBPC(enc);
1795
1.59M
      break;
1796
2.53M
    case BT_CR:
1797
2.53M
      pos->lineNumber++;
1798
2.53M
      ptr += MINBPC(enc);
1799
2.53M
      if (HAS_CHAR(enc, ptr, end) && BYTE_TYPE(enc, ptr) == BT_LF)
1800
433k
        ptr += MINBPC(enc);
1801
2.53M
      pos->columnNumber = 0;
1802
2.53M
      break;
1803
62.5M
    default:
1804
62.5M
      ptr += MINBPC(enc);
1805
62.5M
      pos->columnNumber++;
1806
62.5M
      break;
1807
67.5M
    }
1808
67.5M
  }
1809
12.8k
}
xmltok.c:normal_updatePosition
Line
Count
Source
1779
12.5k
                       POSITION *pos) {
1780
67.4M
  while (HAS_CHAR(enc, ptr, end)) {
1781
67.4M
    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
348k
      LEAD_CASE(2)
1788
389k
      LEAD_CASE(3)
1789
122k
      LEAD_CASE(4)
1790
0
#  undef LEAD_CASE
1791
1.59M
    case BT_LF:
1792
1.59M
      pos->columnNumber = 0;
1793
1.59M
      pos->lineNumber++;
1794
1.59M
      ptr += MINBPC(enc);
1795
1.59M
      break;
1796
2.53M
    case BT_CR:
1797
2.53M
      pos->lineNumber++;
1798
2.53M
      ptr += MINBPC(enc);
1799
2.53M
      if (HAS_CHAR(enc, ptr, end) && BYTE_TYPE(enc, ptr) == BT_LF)
1800
433k
        ptr += MINBPC(enc);
1801
2.53M
      pos->columnNumber = 0;
1802
2.53M
      break;
1803
62.5M
    default:
1804
62.5M
      ptr += MINBPC(enc);
1805
62.5M
      pos->columnNumber++;
1806
62.5M
      break;
1807
67.4M
    }
1808
67.4M
  }
1809
12.5k
}
xmltok.c:little2_updatePosition
Line
Count
Source
1779
163
                       POSITION *pos) {
1780
56.8k
  while (HAS_CHAR(enc, ptr, end)) {
1781
56.8k
    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
56.8k
    default:
1804
56.8k
      ptr += MINBPC(enc);
1805
56.8k
      pos->columnNumber++;
1806
56.8k
      break;
1807
56.8k
    }
1808
56.8k
  }
1809
163
}
xmltok.c:big2_updatePosition
Line
Count
Source
1779
142
                       POSITION *pos) {
1780
407
  while (HAS_CHAR(enc, ptr, end)) {
1781
407
    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
407
    default:
1804
407
      ptr += MINBPC(enc);
1805
407
      pos->columnNumber++;
1806
407
      break;
1807
407
    }
1808
407
  }
1809
142
}
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 */