Coverage Report

Created: 2026-08-17 07:50

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