Coverage Report

Created: 2026-08-11 07:29

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
119k
#    define IS_INVALID_CHAR(enc, ptr, n) (0)
49
#  endif
50
51
#  define INVALID_LEAD_CASE(n, ptr, nextTokPtr)                                \
52
83.7k
  case BT_LEAD##n:                                                             \
53
83.7k
    if (end - ptr < n)                                                         \
54
80.2k
      return XML_TOK_PARTIAL_CHAR;                                             \
55
82.4k
    if (IS_INVALID_CHAR(enc, ptr, n)) {                                        \
56
2.11k
      *(nextTokPtr) = (ptr);                                                   \
57
2.11k
      return XML_TOK_INVALID;                                                  \
58
2.11k
    }                                                                          \
59
82.4k
    ptr += n;                                                                  \
60
80.2k
    break;
61
62
#  define INVALID_CASES(ptr, nextTokPtr)                                       \
63
3.59k
    INVALID_LEAD_CASE(2, ptr, nextTokPtr)                                      \
64
5.18k
    INVALID_LEAD_CASE(3, ptr, nextTokPtr)                                      \
65
74.9k
    INVALID_LEAD_CASE(4, ptr, nextTokPtr)                                      \
66
73.5k
  case BT_NONXML:                                                              \
67
3.43k
  case BT_MALFORM:                                                             \
68
5.88k
  case BT_TRAIL:                                                               \
69
5.88k
    *(nextTokPtr) = (ptr);                                                     \
70
5.88k
    return XML_TOK_INVALID;
71
72
#  define CHECK_NAME_CASE(n, enc, ptr, end, nextTokPtr)                        \
73
13.2k
  case BT_LEAD##n:                                                             \
74
13.2k
    if (end - ptr < n)                                                         \
75
5.29k
      return XML_TOK_PARTIAL_CHAR;                                             \
76
11.3k
    if (IS_INVALID_CHAR(enc, ptr, n) || ! IS_NAME_CHAR(enc, ptr, n)) {         \
77
6.08k
      *nextTokPtr = ptr;                                                       \
78
6.08k
      return XML_TOK_INVALID;                                                  \
79
6.08k
    }                                                                          \
80
11.3k
    ptr += n;                                                                  \
81
5.29k
    break;
82
83
#  define CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)                          \
84
2.16M
  case BT_NONASCII:                                                            \
85
2.16M
    if (! IS_NAME_CHAR_MINBPC(enc, ptr)) {                                     \
86
2.49k
      *nextTokPtr = ptr;                                                       \
87
2.49k
      return XML_TOK_INVALID;                                                  \
88
2.49k
    }                                                                          \
89
2.16M
    EXPAT_FALLTHROUGH;                                                         \
90
1.70M
  case BT_NMSTRT:                                                              \
91
2.05M
  case BT_HEX:                                                                 \
92
2.10M
  case BT_DIGIT:                                                               \
93
2.11M
  case BT_NAME:                                                                \
94
2.16M
  case BT_MINUS:                                                               \
95
2.16M
    ptr += MINBPC(enc);                                                        \
96
2.16M
    break;                                                                     \
97
2.16M
    CHECK_NAME_CASE(2, enc, ptr, end, nextTokPtr)                              \
98
5.45k
    CHECK_NAME_CASE(3, enc, ptr, end, nextTokPtr)                              \
99
4.51k
    CHECK_NAME_CASE(4, enc, ptr, end, nextTokPtr)
100
101
#  define CHECK_NMSTRT_CASE(n, enc, ptr, end, nextTokPtr)                      \
102
9.33k
  case BT_LEAD##n:                                                             \
103
9.33k
    if ((end) - (ptr) < (n))                                                   \
104
1.96k
      return XML_TOK_PARTIAL_CHAR;                                             \
105
7.37k
    if (IS_INVALID_CHAR(enc, ptr, n) || ! IS_NMSTRT_CHAR(enc, ptr, n)) {       \
106
5.68k
      *nextTokPtr = ptr;                                                       \
107
5.68k
      return XML_TOK_INVALID;                                                  \
108
5.68k
    }                                                                          \
109
7.37k
    ptr += n;                                                                  \
110
1.68k
    break;
111
112
#  define CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)                        \
113
270k
  case BT_NONASCII:                                                            \
114
270k
    if (! IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {                                   \
115
1.30k
      *nextTokPtr = ptr;                                                       \
116
1.30k
      return XML_TOK_INVALID;                                                  \
117
1.30k
    }                                                                          \
118
270k
    EXPAT_FALLTHROUGH;                                                         \
119
216k
  case BT_NMSTRT:                                                              \
120
270k
  case BT_HEX:                                                                 \
121
270k
    ptr += MINBPC(enc);                                                        \
122
270k
    break;                                                                     \
123
270k
    CHECK_NMSTRT_CASE(2, enc, ptr, end, nextTokPtr)                            \
124
2.16k
    CHECK_NMSTRT_CASE(3, enc, ptr, end, nextTokPtr)                            \
125
4.38k
    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
14.4M
    ((end) - (ptr) >= ((count) * MINBPC(enc)))
133
134
2.35M
#  define HAS_CHAR(enc, ptr, end) HAS_CHARS(enc, ptr, end, 1)
135
136
#  define REQUIRE_CHARS(enc, ptr, end, count)                                  \
137
2.73M
    {                                                                          \
138
2.73M
      if (! HAS_CHARS(enc, ptr, end, count)) {                                 \
139
3.81k
        return XML_TOK_PARTIAL;                                                \
140
3.81k
      }                                                                        \
141
2.73M
    }
142
143
2.73M
#  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
2.96k
                    const char **nextTokPtr) {
150
2.96k
  if (HAS_CHAR(enc, ptr, end)) {
151
2.81k
    if (! CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
152
267
      *nextTokPtr = ptr;
153
267
      return XML_TOK_INVALID;
154
267
    }
155
2.55k
    ptr += MINBPC(enc);
156
55.4k
    while (HAS_CHAR(enc, ptr, end)) {
157
55.4k
      switch (BYTE_TYPE(enc, ptr)) {
158
10.9k
        INVALID_CASES(ptr, nextTokPtr)
159
1.86k
      case BT_MINUS:
160
1.86k
        ptr += MINBPC(enc);
161
1.86k
        REQUIRE_CHAR(enc, ptr, end);
162
1.71k
        if (CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
163
918
          ptr += MINBPC(enc);
164
918
          REQUIRE_CHAR(enc, ptr, end);
165
792
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
166
244
            *nextTokPtr = ptr;
167
244
            return XML_TOK_INVALID;
168
244
          }
169
548
          *nextTokPtr = ptr + MINBPC(enc);
170
548
          return XML_TOK_COMMENT;
171
792
        }
172
796
        break;
173
47.6k
      default:
174
47.6k
        ptr += MINBPC(enc);
175
47.6k
        break;
176
55.4k
      }
177
55.4k
    }
178
2.55k
  }
179
463
  return XML_TOK_PARTIAL;
180
2.96k
}
xmltok.c:normal_scanComment
Line
Count
Source
149
1.46k
                    const char **nextTokPtr) {
150
1.46k
  if (HAS_CHAR(enc, ptr, end)) {
151
1.39k
    if (! CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
152
75
      *nextTokPtr = ptr;
153
75
      return XML_TOK_INVALID;
154
75
    }
155
1.32k
    ptr += MINBPC(enc);
156
26.7k
    while (HAS_CHAR(enc, ptr, end)) {
157
26.7k
      switch (BYTE_TYPE(enc, ptr)) {
158
1.39k
        INVALID_CASES(ptr, nextTokPtr)
159
1.21k
      case BT_MINUS:
160
1.21k
        ptr += MINBPC(enc);
161
1.21k
        REQUIRE_CHAR(enc, ptr, end);
162
1.15k
        if (CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
163
606
          ptr += MINBPC(enc);
164
606
          REQUIRE_CHAR(enc, ptr, end);
165
570
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
166
69
            *nextTokPtr = ptr;
167
69
            return XML_TOK_INVALID;
168
69
          }
169
501
          *nextTokPtr = ptr + MINBPC(enc);
170
501
          return XML_TOK_COMMENT;
171
570
        }
172
544
        break;
173
24.6k
      default:
174
24.6k
        ptr += MINBPC(enc);
175
24.6k
        break;
176
26.7k
      }
177
26.7k
    }
178
1.32k
  }
179
190
  return XML_TOK_PARTIAL;
180
1.46k
}
xmltok.c:little2_scanComment
Line
Count
Source
149
1.25k
                    const char **nextTokPtr) {
150
1.25k
  if (HAS_CHAR(enc, ptr, end)) {
151
1.18k
    if (! CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
152
168
      *nextTokPtr = ptr;
153
168
      return XML_TOK_INVALID;
154
168
    }
155
1.01k
    ptr += MINBPC(enc);
156
18.5k
    while (HAS_CHAR(enc, ptr, end)) {
157
18.5k
      switch (BYTE_TYPE(enc, ptr)) {
158
5.27k
        INVALID_CASES(ptr, nextTokPtr)
159
559
      case BT_MINUS:
160
559
        ptr += MINBPC(enc);
161
559
        REQUIRE_CHAR(enc, ptr, end);
162
481
        if (CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
163
272
          ptr += MINBPC(enc);
164
272
          REQUIRE_CHAR(enc, ptr, end);
165
192
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
166
155
            *nextTokPtr = ptr;
167
155
            return XML_TOK_INVALID;
168
155
          }
169
37
          *nextTokPtr = ptr + MINBPC(enc);
170
37
          return XML_TOK_COMMENT;
171
192
        }
172
209
        break;
173
15.1k
      default:
174
15.1k
        ptr += MINBPC(enc);
175
15.1k
        break;
176
18.5k
      }
177
18.5k
    }
178
1.01k
  }
179
234
  return XML_TOK_PARTIAL;
180
1.25k
}
xmltok.c:big2_scanComment
Line
Count
Source
149
250
                    const char **nextTokPtr) {
150
250
  if (HAS_CHAR(enc, ptr, end)) {
151
236
    if (! CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
152
24
      *nextTokPtr = ptr;
153
24
      return XML_TOK_INVALID;
154
24
    }
155
212
    ptr += MINBPC(enc);
156
10.1k
    while (HAS_CHAR(enc, ptr, end)) {
157
10.1k
      switch (BYTE_TYPE(enc, ptr)) {
158
4.25k
        INVALID_CASES(ptr, nextTokPtr)
159
93
      case BT_MINUS:
160
93
        ptr += MINBPC(enc);
161
93
        REQUIRE_CHAR(enc, ptr, end);
162
83
        if (CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
163
40
          ptr += MINBPC(enc);
164
40
          REQUIRE_CHAR(enc, ptr, end);
165
30
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
166
20
            *nextTokPtr = ptr;
167
20
            return XML_TOK_INVALID;
168
20
          }
169
10
          *nextTokPtr = ptr + MINBPC(enc);
170
10
          return XML_TOK_COMMENT;
171
30
        }
172
43
        break;
173
7.89k
      default:
174
7.89k
        ptr += MINBPC(enc);
175
7.89k
        break;
176
10.1k
      }
177
10.1k
    }
178
212
  }
179
39
  return XML_TOK_PARTIAL;
180
250
}
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
9.62k
                 const char **nextTokPtr) {
187
9.62k
  REQUIRE_CHAR(enc, ptr, end);
188
9.47k
  switch (BYTE_TYPE(enc, ptr)) {
189
2.79k
  case BT_MINUS:
190
2.79k
    return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
191
155
  case BT_LSQB:
192
155
    *nextTokPtr = ptr + MINBPC(enc);
193
155
    return XML_TOK_COND_SECT_OPEN;
194
2.13k
  case BT_NMSTRT:
195
5.59k
  case BT_HEX:
196
5.59k
    ptr += MINBPC(enc);
197
5.59k
    break;
198
933
  default:
199
933
    *nextTokPtr = ptr;
200
933
    return XML_TOK_INVALID;
201
9.47k
  }
202
24.7k
  while (HAS_CHAR(enc, ptr, end)) {
203
24.7k
    switch (BYTE_TYPE(enc, ptr)) {
204
1.55k
    case BT_PERCNT:
205
1.55k
      REQUIRE_CHARS(enc, ptr, end, 2);
206
      /* don't allow <!ENTITY% foo "whatever"> */
207
1.44k
      switch (BYTE_TYPE(enc, ptr + MINBPC(enc))) {
208
110
      case BT_S:
209
224
      case BT_CR:
210
386
      case BT_LF:
211
464
      case BT_PERCNT:
212
464
        *nextTokPtr = ptr;
213
464
        return XML_TOK_INVALID;
214
1.44k
      }
215
977
      EXPAT_FALLTHROUGH;
216
3.11k
    case BT_S:
217
3.26k
    case BT_CR:
218
3.81k
    case BT_LF:
219
3.81k
      *nextTokPtr = ptr;
220
3.81k
      return XML_TOK_DECL_OPEN;
221
12.9k
    case BT_NMSTRT:
222
19.4k
    case BT_HEX:
223
19.4k
      ptr += MINBPC(enc);
224
19.4k
      break;
225
893
    default:
226
893
      *nextTokPtr = ptr;
227
893
      return XML_TOK_INVALID;
228
24.7k
    }
229
24.7k
  }
230
309
  return XML_TOK_PARTIAL;
231
5.59k
}
xmltok.c:normal_scanDecl
Line
Count
Source
186
4.84k
                 const char **nextTokPtr) {
187
4.84k
  REQUIRE_CHAR(enc, ptr, end);
188
4.77k
  switch (BYTE_TYPE(enc, ptr)) {
189
1.38k
  case BT_MINUS:
190
1.38k
    return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
191
76
  case BT_LSQB:
192
76
    *nextTokPtr = ptr + MINBPC(enc);
193
76
    return XML_TOK_COND_SECT_OPEN;
194
140
  case BT_NMSTRT:
195
3.24k
  case BT_HEX:
196
3.24k
    ptr += MINBPC(enc);
197
3.24k
    break;
198
66
  default:
199
66
    *nextTokPtr = ptr;
200
66
    return XML_TOK_INVALID;
201
4.77k
  }
202
21.7k
  while (HAS_CHAR(enc, ptr, end)) {
203
21.7k
    switch (BYTE_TYPE(enc, ptr)) {
204
395
    case BT_PERCNT:
205
395
      REQUIRE_CHARS(enc, ptr, end, 2);
206
      /* don't allow <!ENTITY% foo "whatever"> */
207
353
      switch (BYTE_TYPE(enc, ptr + MINBPC(enc))) {
208
66
      case BT_S:
209
100
      case BT_CR:
210
174
      case BT_LF:
211
208
      case BT_PERCNT:
212
208
        *nextTokPtr = ptr;
213
208
        return XML_TOK_INVALID;
214
353
      }
215
145
      EXPAT_FALLTHROUGH;
216
2.20k
    case BT_S:
217
2.27k
    case BT_CR:
218
2.74k
    case BT_LF:
219
2.74k
      *nextTokPtr = ptr;
220
2.74k
      return XML_TOK_DECL_OPEN;
221
12.5k
    case BT_NMSTRT:
222
18.6k
    case BT_HEX:
223
18.6k
      ptr += MINBPC(enc);
224
18.6k
      break;
225
99
    default:
226
99
      *nextTokPtr = ptr;
227
99
      return XML_TOK_INVALID;
228
21.7k
    }
229
21.7k
  }
230
153
  return XML_TOK_PARTIAL;
231
3.24k
}
xmltok.c:little2_scanDecl
Line
Count
Source
186
4.06k
                 const char **nextTokPtr) {
187
4.06k
  REQUIRE_CHAR(enc, ptr, end);
188
4.00k
  switch (BYTE_TYPE(enc, ptr)) {
189
1.17k
  case BT_MINUS:
190
1.17k
    return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
191
69
  case BT_LSQB:
192
69
    *nextTokPtr = ptr + MINBPC(enc);
193
69
    return XML_TOK_COND_SECT_OPEN;
194
1.69k
  case BT_NMSTRT:
195
2.00k
  case BT_HEX:
196
2.00k
    ptr += MINBPC(enc);
197
2.00k
    break;
198
753
  default:
199
753
    *nextTokPtr = ptr;
200
753
    return XML_TOK_INVALID;
201
4.00k
  }
202
2.52k
  while (HAS_CHAR(enc, ptr, end)) {
203
2.52k
    switch (BYTE_TYPE(enc, ptr)) {
204
996
    case BT_PERCNT:
205
996
      REQUIRE_CHARS(enc, ptr, end, 2);
206
      /* don't allow <!ENTITY% foo "whatever"> */
207
930
      switch (BYTE_TYPE(enc, ptr + MINBPC(enc))) {
208
34
      case BT_S:
209
104
      case BT_CR:
210
178
      case BT_LF:
211
212
      case BT_PERCNT:
212
212
        *nextTokPtr = ptr;
213
212
        return XML_TOK_INVALID;
214
930
      }
215
718
      EXPAT_FALLTHROUGH;
216
784
    case BT_S:
217
850
    case BT_CR:
218
916
    case BT_LF:
219
916
      *nextTokPtr = ptr;
220
916
      return XML_TOK_DECL_OPEN;
221
352
    case BT_NMSTRT:
222
651
    case BT_HEX:
223
651
      ptr += MINBPC(enc);
224
651
      break;
225
679
    default:
226
679
      *nextTokPtr = ptr;
227
679
      return XML_TOK_INVALID;
228
2.52k
    }
229
2.52k
  }
230
136
  return XML_TOK_PARTIAL;
231
2.00k
}
xmltok.c:big2_scanDecl
Line
Count
Source
186
709
                 const char **nextTokPtr) {
187
709
  REQUIRE_CHAR(enc, ptr, end);
188
699
  switch (BYTE_TYPE(enc, ptr)) {
189
239
  case BT_MINUS:
190
239
    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
302
  case BT_NMSTRT:
195
336
  case BT_HEX:
196
336
    ptr += MINBPC(enc);
197
336
    break;
198
114
  default:
199
114
    *nextTokPtr = ptr;
200
114
    return XML_TOK_INVALID;
201
699
  }
202
483
  while (HAS_CHAR(enc, ptr, end)) {
203
483
    switch (BYTE_TYPE(enc, ptr)) {
204
168
    case BT_PERCNT:
205
168
      REQUIRE_CHARS(enc, ptr, end, 2);
206
      /* don't allow <!ENTITY% foo "whatever"> */
207
158
      switch (BYTE_TYPE(enc, ptr + MINBPC(enc))) {
208
10
      case BT_S:
209
20
      case BT_CR:
210
34
      case BT_LF:
211
44
      case BT_PERCNT:
212
44
        *nextTokPtr = ptr;
213
44
        return XML_TOK_INVALID;
214
158
      }
215
114
      EXPAT_FALLTHROUGH;
216
127
    case BT_S:
217
137
    case BT_CR:
218
147
    case BT_LF:
219
147
      *nextTokPtr = ptr;
220
147
      return XML_TOK_DECL_OPEN;
221
110
    case BT_NMSTRT:
222
167
    case BT_HEX:
223
167
      ptr += MINBPC(enc);
224
167
      break;
225
115
    default:
226
115
      *nextTokPtr = ptr;
227
115
      return XML_TOK_INVALID;
228
483
    }
229
483
  }
230
20
  return XML_TOK_PARTIAL;
231
336
}
232
233
static int PTRCALL
234
PREFIX(checkPiTarget)(const ENCODING *enc, const char *ptr, const char *end,
235
8.42k
                      int *tokPtr) {
236
8.42k
  int upper = 0;
237
8.42k
  UNUSED_P(enc);
238
8.42k
  *tokPtr = XML_TOK_PI;
239
8.42k
  if (end - ptr != MINBPC(enc) * 3)
240
5.31k
    return 1;
241
3.10k
  switch (BYTE_TO_ASCII(enc, ptr)) {
242
2.20k
  case ASCII_x:
243
2.20k
    break;
244
492
  case ASCII_X:
245
492
    upper = 1;
246
492
    break;
247
412
  default:
248
412
    return 1;
249
3.10k
  }
250
2.69k
  ptr += MINBPC(enc);
251
2.69k
  switch (BYTE_TO_ASCII(enc, ptr)) {
252
1.84k
  case ASCII_m:
253
1.84k
    break;
254
219
  case ASCII_M:
255
219
    upper = 1;
256
219
    break;
257
634
  default:
258
634
    return 1;
259
2.69k
  }
260
2.06k
  ptr += MINBPC(enc);
261
2.06k
  switch (BYTE_TO_ASCII(enc, ptr)) {
262
1.63k
  case ASCII_l:
263
1.63k
    break;
264
82
  case ASCII_L:
265
82
    upper = 1;
266
82
    break;
267
350
  default:
268
350
    return 1;
269
2.06k
  }
270
1.71k
  if (upper)
271
158
    return 0;
272
1.55k
  *tokPtr = XML_TOK_XML_DECL;
273
1.55k
  return 1;
274
1.71k
}
xmltok.c:normal_checkPiTarget
Line
Count
Source
235
6.68k
                      int *tokPtr) {
236
6.68k
  int upper = 0;
237
6.68k
  UNUSED_P(enc);
238
6.68k
  *tokPtr = XML_TOK_PI;
239
6.68k
  if (end - ptr != MINBPC(enc) * 3)
240
4.27k
    return 1;
241
2.41k
  switch (BYTE_TO_ASCII(enc, ptr)) {
242
2.10k
  case ASCII_x:
243
2.10k
    break;
244
94
  case ASCII_X:
245
94
    upper = 1;
246
94
    break;
247
210
  default:
248
210
    return 1;
249
2.41k
  }
250
2.20k
  ptr += MINBPC(enc);
251
2.20k
  switch (BYTE_TO_ASCII(enc, ptr)) {
252
1.82k
  case ASCII_m:
253
1.82k
    break;
254
182
  case ASCII_M:
255
182
    upper = 1;
256
182
    break;
257
197
  default:
258
197
    return 1;
259
2.20k
  }
260
2.00k
  ptr += MINBPC(enc);
261
2.00k
  switch (BYTE_TO_ASCII(enc, ptr)) {
262
1.62k
  case ASCII_l:
263
1.62k
    break;
264
79
  case ASCII_L:
265
79
    upper = 1;
266
79
    break;
267
305
  default:
268
305
    return 1;
269
2.00k
  }
270
1.70k
  if (upper)
271
146
    return 0;
272
1.55k
  *tokPtr = XML_TOK_XML_DECL;
273
1.55k
  return 1;
274
1.70k
}
xmltok.c:little2_checkPiTarget
Line
Count
Source
235
1.41k
                      int *tokPtr) {
236
1.41k
  int upper = 0;
237
1.41k
  UNUSED_P(enc);
238
1.41k
  *tokPtr = XML_TOK_PI;
239
1.41k
  if (end - ptr != MINBPC(enc) * 3)
240
858
    return 1;
241
552
  switch (BYTE_TO_ASCII(enc, ptr)) {
242
76
  case ASCII_x:
243
76
    break;
244
320
  case ASCII_X:
245
320
    upper = 1;
246
320
    break;
247
156
  default:
248
156
    return 1;
249
552
  }
250
396
  ptr += MINBPC(enc);
251
396
  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
396
  default:
258
396
    return 1;
259
396
  }
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
330
                      int *tokPtr) {
236
330
  int upper = 0;
237
330
  UNUSED_P(enc);
238
330
  *tokPtr = XML_TOK_PI;
239
330
  if (end - ptr != MINBPC(enc) * 3)
240
186
    return 1;
241
144
  switch (BYTE_TO_ASCII(enc, ptr)) {
242
20
  case ASCII_x:
243
20
    break;
244
78
  case ASCII_X:
245
78
    upper = 1;
246
78
    break;
247
46
  default:
248
46
    return 1;
249
144
  }
250
98
  ptr += MINBPC(enc);
251
98
  switch (BYTE_TO_ASCII(enc, ptr)) {
252
20
  case ASCII_m:
253
20
    break;
254
37
  case ASCII_M:
255
37
    upper = 1;
256
37
    break;
257
41
  default:
258
41
    return 1;
259
98
  }
260
57
  ptr += MINBPC(enc);
261
57
  switch (BYTE_TO_ASCII(enc, ptr)) {
262
9
  case ASCII_l:
263
9
    break;
264
3
  case ASCII_L:
265
3
    upper = 1;
266
3
    break;
267
45
  default:
268
45
    return 1;
269
57
  }
270
12
  if (upper)
271
12
    return 0;
272
0
  *tokPtr = XML_TOK_XML_DECL;
273
0
  return 1;
274
12
}
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
11.7k
               const char **nextTokPtr) {
281
11.7k
  int tok;
282
11.7k
  const char *target = ptr;
283
11.7k
  REQUIRE_CHAR(enc, ptr, end);
284
11.5k
  switch (BYTE_TYPE(enc, ptr)) {
285
15.2k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
286
452
  default:
287
452
    *nextTokPtr = ptr;
288
452
    return XML_TOK_INVALID;
289
11.5k
  }
290
64.5k
  while (HAS_CHAR(enc, ptr, end)) {
291
64.5k
    switch (BYTE_TYPE(enc, ptr)) {
292
229k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
293
6.18k
    case BT_S:
294
6.87k
    case BT_CR:
295
7.53k
    case BT_LF:
296
7.53k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
297
100
        *nextTokPtr = ptr;
298
100
        return XML_TOK_INVALID;
299
100
      }
300
7.43k
      ptr += MINBPC(enc);
301
388k
      while (HAS_CHAR(enc, ptr, end)) {
302
388k
        switch (BYTE_TYPE(enc, ptr)) {
303
25.2k
          INVALID_CASES(ptr, nextTokPtr)
304
6.71k
        case BT_QUEST:
305
6.71k
          ptr += MINBPC(enc);
306
6.71k
          REQUIRE_CHAR(enc, ptr, end);
307
6.54k
          if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
308
4.84k
            *nextTokPtr = ptr + MINBPC(enc);
309
4.84k
            return tok;
310
4.84k
          }
311
1.70k
          break;
312
368k
        default:
313
368k
          ptr += MINBPC(enc);
314
368k
          break;
315
388k
        }
316
388k
      }
317
588
      return XML_TOK_PARTIAL;
318
884
    case BT_QUEST:
319
884
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
320
58
        *nextTokPtr = ptr;
321
58
        return XML_TOK_INVALID;
322
58
      }
323
826
      ptr += MINBPC(enc);
324
826
      REQUIRE_CHAR(enc, ptr, end);
325
748
      if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
326
179
        *nextTokPtr = ptr + MINBPC(enc);
327
179
        return tok;
328
179
      }
329
569
      EXPAT_FALLTHROUGH;
330
1.24k
    default:
331
1.24k
      *nextTokPtr = ptr;
332
1.24k
      return XML_TOK_INVALID;
333
64.5k
    }
334
64.5k
  }
335
305
  return XML_TOK_PARTIAL;
336
10.2k
}
xmltok.c:normal_scanPi
Line
Count
Source
280
8.01k
               const char **nextTokPtr) {
281
8.01k
  int tok;
282
8.01k
  const char *target = ptr;
283
8.01k
  REQUIRE_CHAR(enc, ptr, end);
284
7.94k
  switch (BYTE_TYPE(enc, ptr)) {
285
8.16k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
286
74
  default:
287
74
    *nextTokPtr = ptr;
288
74
    return XML_TOK_INVALID;
289
7.94k
  }
290
43.8k
  while (HAS_CHAR(enc, ptr, end)) {
291
43.8k
    switch (BYTE_TYPE(enc, ptr)) {
292
125k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
293
5.90k
    case BT_S:
294
6.10k
    case BT_CR:
295
6.25k
    case BT_LF:
296
6.25k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
297
97
        *nextTokPtr = ptr;
298
97
        return XML_TOK_INVALID;
299
97
      }
300
6.16k
      ptr += MINBPC(enc);
301
308k
      while (HAS_CHAR(enc, ptr, end)) {
302
308k
        switch (BYTE_TYPE(enc, ptr)) {
303
10.9k
          INVALID_CASES(ptr, nextTokPtr)
304
5.98k
        case BT_QUEST:
305
5.98k
          ptr += MINBPC(enc);
306
5.98k
          REQUIRE_CHAR(enc, ptr, end);
307
5.91k
          if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
308
4.82k
            *nextTokPtr = ptr + MINBPC(enc);
309
4.82k
            return tok;
310
4.82k
          }
311
1.09k
          break;
312
296k
        default:
313
296k
          ptr += MINBPC(enc);
314
296k
          break;
315
308k
        }
316
308k
      }
317
176
      return XML_TOK_PARTIAL;
318
424
    case BT_QUEST:
319
424
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
320
49
        *nextTokPtr = ptr;
321
49
        return XML_TOK_INVALID;
322
49
      }
323
375
      ptr += MINBPC(enc);
324
375
      REQUIRE_CHAR(enc, ptr, end);
325
337
      if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
326
98
        *nextTokPtr = ptr + MINBPC(enc);
327
98
        return tok;
328
98
      }
329
239
      EXPAT_FALLTHROUGH;
330
429
    default:
331
429
      *nextTokPtr = ptr;
332
429
      return XML_TOK_INVALID;
333
43.8k
    }
334
43.8k
  }
335
149
  return XML_TOK_PARTIAL;
336
7.48k
}
xmltok.c:little2_scanPi
Line
Count
Source
280
3.07k
               const char **nextTokPtr) {
281
3.07k
  int tok;
282
3.07k
  const char *target = ptr;
283
3.07k
  REQUIRE_CHAR(enc, ptr, end);
284
3.01k
  switch (BYTE_TYPE(enc, ptr)) {
285
5.99k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
286
326
  default:
287
326
    *nextTokPtr = ptr;
288
326
    return XML_TOK_INVALID;
289
3.01k
  }
290
10.0k
  while (HAS_CHAR(enc, ptr, end)) {
291
10.0k
    switch (BYTE_TYPE(enc, ptr)) {
292
44.1k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
293
174
    case BT_S:
294
557
    case BT_CR:
295
1.04k
    case BT_LF:
296
1.04k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
297
0
        *nextTokPtr = ptr;
298
0
        return XML_TOK_INVALID;
299
0
      }
300
1.04k
      ptr += MINBPC(enc);
301
38.9k
      while (HAS_CHAR(enc, ptr, end)) {
302
38.9k
        switch (BYTE_TYPE(enc, ptr)) {
303
9.95k
          INVALID_CASES(ptr, nextTokPtr)
304
616
        case BT_QUEST:
305
616
          ptr += MINBPC(enc);
306
616
          REQUIRE_CHAR(enc, ptr, end);
307
534
          if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
308
18
            *nextTokPtr = ptr + MINBPC(enc);
309
18
            return tok;
310
18
          }
311
516
          break;
312
32.9k
        default:
313
32.9k
          ptr += MINBPC(enc);
314
32.9k
          break;
315
38.9k
        }
316
38.9k
      }
317
378
      return XML_TOK_PARTIAL;
318
364
    case BT_QUEST:
319
364
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
320
0
        *nextTokPtr = ptr;
321
0
        return XML_TOK_INVALID;
322
0
      }
323
364
      ptr += MINBPC(enc);
324
364
      REQUIRE_CHAR(enc, ptr, end);
325
330
      if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
326
71
        *nextTokPtr = ptr + MINBPC(enc);
327
71
        return tok;
328
71
      }
329
259
      EXPAT_FALLTHROUGH;
330
665
    default:
331
665
      *nextTokPtr = ptr;
332
665
      return XML_TOK_INVALID;
333
10.0k
    }
334
10.0k
  }
335
136
  return XML_TOK_PARTIAL;
336
2.28k
}
xmltok.c:big2_scanPi
Line
Count
Source
280
619
               const char **nextTokPtr) {
281
619
  int tok;
282
619
  const char *target = ptr;
283
619
  REQUIRE_CHAR(enc, ptr, end);
284
609
  switch (BYTE_TYPE(enc, ptr)) {
285
1.04k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
286
52
  default:
287
52
    *nextTokPtr = ptr;
288
52
    return XML_TOK_INVALID;
289
609
  }
290
10.6k
  while (HAS_CHAR(enc, ptr, end)) {
291
10.6k
    switch (BYTE_TYPE(enc, ptr)) {
292
60.1k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
293
103
    case BT_S:
294
209
    case BT_CR:
295
234
    case BT_LF:
296
234
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
297
3
        *nextTokPtr = ptr;
298
3
        return XML_TOK_INVALID;
299
3
      }
300
231
      ptr += MINBPC(enc);
301
41.3k
      while (HAS_CHAR(enc, ptr, end)) {
302
41.3k
        switch (BYTE_TYPE(enc, ptr)) {
303
4.32k
          INVALID_CASES(ptr, nextTokPtr)
304
121
        case BT_QUEST:
305
121
          ptr += MINBPC(enc);
306
121
          REQUIRE_CHAR(enc, ptr, end);
307
104
          if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
308
10
            *nextTokPtr = ptr + MINBPC(enc);
309
10
            return tok;
310
10
          }
311
94
          break;
312
39.0k
        default:
313
39.0k
          ptr += MINBPC(enc);
314
39.0k
          break;
315
41.3k
        }
316
41.3k
      }
317
34
      return XML_TOK_PARTIAL;
318
96
    case BT_QUEST:
319
96
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
320
9
        *nextTokPtr = ptr;
321
9
        return XML_TOK_INVALID;
322
9
      }
323
87
      ptr += MINBPC(enc);
324
87
      REQUIRE_CHAR(enc, ptr, end);
325
81
      if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
326
10
        *nextTokPtr = ptr + MINBPC(enc);
327
10
        return tok;
328
10
      }
329
71
      EXPAT_FALLTHROUGH;
330
149
    default:
331
149
      *nextTokPtr = ptr;
332
149
      return XML_TOK_INVALID;
333
10.6k
    }
334
10.6k
  }
335
20
  return XML_TOK_PARTIAL;
336
497
}
337
338
static int PTRCALL
339
PREFIX(scanCdataSection)(const ENCODING *enc, const char *ptr, const char *end,
340
295
                         const char **nextTokPtr) {
341
295
  static const char CDATA_LSQB[]
342
295
      = {ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, ASCII_LSQB};
343
295
  int i;
344
295
  UNUSED_P(enc);
345
  /* CDATA[ */
346
295
  REQUIRE_CHARS(enc, ptr, end, 6);
347
472
  for (i = 0; i < 6; i++, ptr += MINBPC(enc)) {
348
472
    if (! CHAR_MATCHES(enc, ptr, CDATA_LSQB[i])) {
349
257
      *nextTokPtr = ptr;
350
257
      return XML_TOK_INVALID;
351
257
    }
352
472
  }
353
0
  *nextTokPtr = ptr;
354
0
  return XML_TOK_CDATA_SECT_OPEN;
355
257
}
xmltok.c:normal_scanCdataSection
Line
Count
Source
340
90
                         const char **nextTokPtr) {
341
90
  static const char CDATA_LSQB[]
342
90
      = {ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, ASCII_LSQB};
343
90
  int i;
344
90
  UNUSED_P(enc);
345
  /* CDATA[ */
346
90
  REQUIRE_CHARS(enc, ptr, end, 6);
347
154
  for (i = 0; i < 6; i++, ptr += MINBPC(enc)) {
348
154
    if (! CHAR_MATCHES(enc, ptr, CDATA_LSQB[i])) {
349
70
      *nextTokPtr = ptr;
350
70
      return XML_TOK_INVALID;
351
70
    }
352
154
  }
353
0
  *nextTokPtr = ptr;
354
0
  return XML_TOK_CDATA_SECT_OPEN;
355
70
}
xmltok.c:little2_scanCdataSection
Line
Count
Source
340
173
                         const char **nextTokPtr) {
341
173
  static const char CDATA_LSQB[]
342
173
      = {ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, ASCII_LSQB};
343
173
  int i;
344
173
  UNUSED_P(enc);
345
  /* CDATA[ */
346
173
  REQUIRE_CHARS(enc, ptr, end, 6);
347
274
  for (i = 0; i < 6; i++, ptr += MINBPC(enc)) {
348
274
    if (! CHAR_MATCHES(enc, ptr, CDATA_LSQB[i])) {
349
155
      *nextTokPtr = ptr;
350
155
      return XML_TOK_INVALID;
351
155
    }
352
274
  }
353
0
  *nextTokPtr = ptr;
354
0
  return XML_TOK_CDATA_SECT_OPEN;
355
155
}
xmltok.c:big2_scanCdataSection
Line
Count
Source
340
32
                         const char **nextTokPtr) {
341
32
  static const char CDATA_LSQB[]
342
32
      = {ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, ASCII_LSQB};
343
32
  int i;
344
32
  UNUSED_P(enc);
345
  /* CDATA[ */
346
32
  REQUIRE_CHARS(enc, ptr, end, 6);
347
44
  for (i = 0; i < 6; i++, ptr += MINBPC(enc)) {
348
44
    if (! CHAR_MATCHES(enc, ptr, CDATA_LSQB[i])) {
349
32
      *nextTokPtr = ptr;
350
32
      return XML_TOK_INVALID;
351
32
    }
352
44
  }
353
0
  *nextTokPtr = ptr;
354
0
  return XML_TOK_CDATA_SECT_OPEN;
355
32
}
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
25.5k
                   const char **nextTokPtr) {
436
25.5k
  REQUIRE_CHAR(enc, ptr, end);
437
25.4k
  switch (BYTE_TYPE(enc, ptr)) {
438
23.7k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
439
532
  default:
440
532
    *nextTokPtr = ptr;
441
532
    return XML_TOK_INVALID;
442
25.4k
  }
443
257k
  while (HAS_CHAR(enc, ptr, end)) {
444
257k
    switch (BYTE_TYPE(enc, ptr)) {
445
775k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
446
869
    case BT_S:
447
1.03k
    case BT_CR:
448
1.26k
    case BT_LF:
449
11.1k
      for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
450
11.1k
        switch (BYTE_TYPE(enc, ptr)) {
451
6.56k
        case BT_S:
452
9.45k
        case BT_CR:
453
10.1k
        case BT_LF:
454
10.1k
          break;
455
131
        case BT_GT:
456
131
          *nextTokPtr = ptr + MINBPC(enc);
457
131
          return XML_TOK_END_TAG;
458
886
        default:
459
886
          *nextTokPtr = ptr;
460
886
          return XML_TOK_INVALID;
461
11.1k
        }
462
11.1k
      }
463
247
      return XML_TOK_PARTIAL;
464
0
#  ifdef XML_NS
465
21.0k
    case BT_COLON:
466
      /* no need to check qname syntax here,
467
         since end-tag must match exactly */
468
21.0k
      ptr += MINBPC(enc);
469
21.0k
      break;
470
0
#  endif
471
20.9k
    case BT_GT:
472
20.9k
      *nextTokPtr = ptr + MINBPC(enc);
473
20.9k
      return XML_TOK_END_TAG;
474
496
    default:
475
496
      *nextTokPtr = ptr;
476
496
      return XML_TOK_INVALID;
477
257k
    }
478
257k
  }
479
290
  return XML_TOK_PARTIAL;
480
24.0k
}
xmltok.c:normal_scanEndTag
Line
Count
Source
435
22.7k
                   const char **nextTokPtr) {
436
22.7k
  REQUIRE_CHAR(enc, ptr, end);
437
22.6k
  switch (BYTE_TYPE(enc, ptr)) {
438
17.9k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
439
80
  default:
440
80
    *nextTokPtr = ptr;
441
80
    return XML_TOK_INVALID;
442
22.6k
  }
443
241k
  while (HAS_CHAR(enc, ptr, end)) {
444
241k
    switch (BYTE_TYPE(enc, ptr)) {
445
692k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
446
196
    case BT_S:
447
303
    case BT_CR:
448
357
    case BT_LF:
449
9.83k
      for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
450
9.83k
        switch (BYTE_TYPE(enc, ptr)) {
451
6.37k
        case BT_S:
452
9.11k
        case BT_CR:
453
9.62k
        case BT_LF:
454
9.62k
          break;
455
87
        case BT_GT:
456
87
          *nextTokPtr = ptr + MINBPC(enc);
457
87
          return XML_TOK_END_TAG;
458
128
        default:
459
128
          *nextTokPtr = ptr;
460
128
          return XML_TOK_INVALID;
461
9.83k
        }
462
9.83k
      }
463
142
      return XML_TOK_PARTIAL;
464
0
#  ifdef XML_NS
465
20.6k
    case BT_COLON:
466
      /* no need to check qname syntax here,
467
         since end-tag must match exactly */
468
20.6k
      ptr += MINBPC(enc);
469
20.6k
      break;
470
0
#  endif
471
20.8k
    case BT_GT:
472
20.8k
      *nextTokPtr = ptr + MINBPC(enc);
473
20.8k
      return XML_TOK_END_TAG;
474
100
    default:
475
100
      *nextTokPtr = ptr;
476
100
      return XML_TOK_INVALID;
477
241k
    }
478
241k
  }
479
116
  return XML_TOK_PARTIAL;
480
21.9k
}
xmltok.c:little2_scanEndTag
Line
Count
Source
435
2.37k
                   const char **nextTokPtr) {
436
2.37k
  REQUIRE_CHAR(enc, ptr, end);
437
2.34k
  switch (BYTE_TYPE(enc, ptr)) {
438
5.05k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
439
402
  default:
440
402
    *nextTokPtr = ptr;
441
402
    return XML_TOK_INVALID;
442
2.34k
  }
443
4.70k
  while (HAS_CHAR(enc, ptr, end)) {
444
4.70k
    switch (BYTE_TYPE(enc, ptr)) {
445
15.7k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
446
540
    case BT_S:
447
586
    case BT_CR:
448
743
    case BT_LF:
449
1.06k
      for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
450
1.06k
        switch (BYTE_TYPE(enc, ptr)) {
451
168
        case BT_S:
452
269
        case BT_CR:
453
401
        case BT_LF:
454
401
          break;
455
38
        case BT_GT:
456
38
          *nextTokPtr = ptr + MINBPC(enc);
457
38
          return XML_TOK_END_TAG;
458
625
        default:
459
625
          *nextTokPtr = ptr;
460
625
          return XML_TOK_INVALID;
461
1.06k
        }
462
1.06k
      }
463
80
      return XML_TOK_PARTIAL;
464
0
#  ifdef XML_NS
465
389
    case BT_COLON:
466
      /* no need to check qname syntax here,
467
         since end-tag must match exactly */
468
389
      ptr += MINBPC(enc);
469
389
      break;
470
0
#  endif
471
47
    case BT_GT:
472
47
      *nextTokPtr = ptr + MINBPC(enc);
473
47
      return XML_TOK_END_TAG;
474
335
    default:
475
335
      *nextTokPtr = ptr;
476
335
      return XML_TOK_INVALID;
477
4.70k
    }
478
4.70k
  }
479
154
  return XML_TOK_PARTIAL;
480
1.65k
}
xmltok.c:big2_scanEndTag
Line
Count
Source
435
480
                   const char **nextTokPtr) {
436
480
  REQUIRE_CHAR(enc, ptr, end);
437
470
  switch (BYTE_TYPE(enc, ptr)) {
438
829
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
439
50
  default:
440
50
    *nextTokPtr = ptr;
441
50
    return XML_TOK_INVALID;
442
470
  }
443
11.8k
  while (HAS_CHAR(enc, ptr, end)) {
444
11.8k
    switch (BYTE_TYPE(enc, ptr)) {
445
67.0k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
446
133
    case BT_S:
447
143
    case BT_CR:
448
164
    case BT_LF:
449
267
      for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
450
267
        switch (BYTE_TYPE(enc, ptr)) {
451
30
        case BT_S:
452
65
        case BT_CR:
453
128
        case BT_LF:
454
128
          break;
455
6
        case BT_GT:
456
6
          *nextTokPtr = ptr + MINBPC(enc);
457
6
          return XML_TOK_END_TAG;
458
133
        default:
459
133
          *nextTokPtr = ptr;
460
133
          return XML_TOK_INVALID;
461
267
        }
462
267
      }
463
25
      return XML_TOK_PARTIAL;
464
0
#  ifdef XML_NS
465
18
    case BT_COLON:
466
      /* no need to check qname syntax here,
467
         since end-tag must match exactly */
468
18
      ptr += MINBPC(enc);
469
18
      break;
470
0
#  endif
471
26
    case BT_GT:
472
26
      *nextTokPtr = ptr + MINBPC(enc);
473
26
      return XML_TOK_END_TAG;
474
61
    default:
475
61
      *nextTokPtr = ptr;
476
61
      return XML_TOK_INVALID;
477
11.8k
    }
478
11.8k
  }
479
20
  return XML_TOK_PARTIAL;
480
363
}
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
2.41k
                       const char **nextTokPtr) {
487
2.41k
  if (HAS_CHAR(enc, ptr, end)) {
488
2.35k
    switch (BYTE_TYPE(enc, ptr)) {
489
631
    case BT_DIGIT:
490
2.18k
    case BT_HEX:
491
2.18k
      break;
492
168
    default:
493
168
      *nextTokPtr = ptr;
494
168
      return XML_TOK_INVALID;
495
2.35k
    }
496
7.87k
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
497
7.87k
      switch (BYTE_TYPE(enc, ptr)) {
498
3.21k
      case BT_DIGIT:
499
5.79k
      case BT_HEX:
500
5.79k
        break;
501
1.61k
      case BT_SEMI:
502
1.61k
        *nextTokPtr = ptr + MINBPC(enc);
503
1.61k
        return XML_TOK_CHAR_REF;
504
466
      default:
505
466
        *nextTokPtr = ptr;
506
466
        return XML_TOK_INVALID;
507
7.87k
      }
508
7.87k
    }
509
2.18k
  }
510
171
  return XML_TOK_PARTIAL;
511
2.41k
}
xmltok.c:normal_scanHexCharRef
Line
Count
Source
486
994
                       const char **nextTokPtr) {
487
994
  if (HAS_CHAR(enc, ptr, end)) {
488
956
    switch (BYTE_TYPE(enc, ptr)) {
489
55
    case BT_DIGIT:
490
876
    case BT_HEX:
491
876
      break;
492
80
    default:
493
80
      *nextTokPtr = ptr;
494
80
      return XML_TOK_INVALID;
495
956
    }
496
6.41k
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
497
6.41k
      switch (BYTE_TYPE(enc, ptr)) {
498
3.07k
      case BT_DIGIT:
499
5.60k
      case BT_HEX:
500
5.60k
        break;
501
726
      case BT_SEMI:
502
726
        *nextTokPtr = ptr + MINBPC(enc);
503
726
        return XML_TOK_CHAR_REF;
504
84
      default:
505
84
        *nextTokPtr = ptr;
506
84
        return XML_TOK_INVALID;
507
6.41k
      }
508
6.41k
    }
509
876
  }
510
104
  return XML_TOK_PARTIAL;
511
994
}
xmltok.c:little2_scanHexCharRef
Line
Count
Source
486
986
                       const char **nextTokPtr) {
487
986
  if (HAS_CHAR(enc, ptr, end)) {
488
968
    switch (BYTE_TYPE(enc, ptr)) {
489
425
    case BT_DIGIT:
490
900
    case BT_HEX:
491
900
      break;
492
68
    default:
493
68
      *nextTokPtr = ptr;
494
68
      return XML_TOK_INVALID;
495
968
    }
496
979
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
497
979
      switch (BYTE_TYPE(enc, ptr)) {
498
71
      case BT_DIGIT:
499
111
      case BT_HEX:
500
111
        break;
501
606
      case BT_SEMI:
502
606
        *nextTokPtr = ptr + MINBPC(enc);
503
606
        return XML_TOK_CHAR_REF;
504
262
      default:
505
262
        *nextTokPtr = ptr;
506
262
        return XML_TOK_INVALID;
507
979
      }
508
979
    }
509
900
  }
510
50
  return XML_TOK_PARTIAL;
511
986
}
xmltok.c:big2_scanHexCharRef
Line
Count
Source
486
436
                       const char **nextTokPtr) {
487
436
  if (HAS_CHAR(enc, ptr, end)) {
488
426
    switch (BYTE_TYPE(enc, ptr)) {
489
151
    case BT_DIGIT:
490
406
    case BT_HEX:
491
406
      break;
492
20
    default:
493
20
      *nextTokPtr = ptr;
494
20
      return XML_TOK_INVALID;
495
426
    }
496
476
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
497
476
      switch (BYTE_TYPE(enc, ptr)) {
498
67
      case BT_DIGIT:
499
77
      case BT_HEX:
500
77
        break;
501
279
      case BT_SEMI:
502
279
        *nextTokPtr = ptr + MINBPC(enc);
503
279
        return XML_TOK_CHAR_REF;
504
120
      default:
505
120
        *nextTokPtr = ptr;
506
120
        return XML_TOK_INVALID;
507
476
      }
508
476
    }
509
406
  }
510
17
  return XML_TOK_PARTIAL;
511
436
}
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
3.62k
                    const char **nextTokPtr) {
518
3.62k
  if (HAS_CHAR(enc, ptr, end)) {
519
3.51k
    if (CHAR_MATCHES(enc, ptr, ASCII_x))
520
2.41k
      return PREFIX(scanHexCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
521
1.09k
    switch (BYTE_TYPE(enc, ptr)) {
522
958
    case BT_DIGIT:
523
958
      break;
524
139
    default:
525
139
      *nextTokPtr = ptr;
526
139
      return XML_TOK_INVALID;
527
1.09k
    }
528
1.65k
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
529
1.65k
      switch (BYTE_TYPE(enc, ptr)) {
530
756
      case BT_DIGIT:
531
756
        break;
532
306
      case BT_SEMI:
533
306
        *nextTokPtr = ptr + MINBPC(enc);
534
306
        return XML_TOK_CHAR_REF;
535
590
      default:
536
590
        *nextTokPtr = ptr;
537
590
        return XML_TOK_INVALID;
538
1.65k
      }
539
1.65k
    }
540
958
  }
541
172
  return XML_TOK_PARTIAL;
542
3.62k
}
xmltok.c:normal_scanCharRef
Line
Count
Source
517
1.24k
                    const char **nextTokPtr) {
518
1.24k
  if (HAS_CHAR(enc, ptr, end)) {
519
1.20k
    if (CHAR_MATCHES(enc, ptr, ASCII_x))
520
994
      return PREFIX(scanHexCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
521
215
    switch (BYTE_TYPE(enc, ptr)) {
522
144
    case BT_DIGIT:
523
144
      break;
524
71
    default:
525
71
      *nextTokPtr = ptr;
526
71
      return XML_TOK_INVALID;
527
215
    }
528
762
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
529
762
      switch (BYTE_TYPE(enc, ptr)) {
530
636
      case BT_DIGIT:
531
636
        break;
532
84
      case BT_SEMI:
533
84
        *nextTokPtr = ptr + MINBPC(enc);
534
84
        return XML_TOK_CHAR_REF;
535
42
      default:
536
42
        *nextTokPtr = ptr;
537
42
        return XML_TOK_INVALID;
538
762
      }
539
762
    }
540
144
  }
541
52
  return XML_TOK_PARTIAL;
542
1.24k
}
xmltok.c:little2_scanCharRef
Line
Count
Source
517
1.75k
                    const char **nextTokPtr) {
518
1.75k
  if (HAS_CHAR(enc, ptr, end)) {
519
1.68k
    if (CHAR_MATCHES(enc, ptr, ASCII_x))
520
986
      return PREFIX(scanHexCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
521
700
    switch (BYTE_TYPE(enc, ptr)) {
522
650
    case BT_DIGIT:
523
650
      break;
524
50
    default:
525
50
      *nextTokPtr = ptr;
526
50
      return XML_TOK_INVALID;
527
700
    }
528
666
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
529
666
      switch (BYTE_TYPE(enc, ptr)) {
530
50
      case BT_DIGIT:
531
50
        break;
532
196
      case BT_SEMI:
533
196
        *nextTokPtr = ptr + MINBPC(enc);
534
196
        return XML_TOK_CHAR_REF;
535
420
      default:
536
420
        *nextTokPtr = ptr;
537
420
        return XML_TOK_INVALID;
538
666
      }
539
666
    }
540
650
  }
541
100
  return XML_TOK_PARTIAL;
542
1.75k
}
xmltok.c:big2_scanCharRef
Line
Count
Source
517
628
                    const char **nextTokPtr) {
518
628
  if (HAS_CHAR(enc, ptr, end)) {
519
618
    if (CHAR_MATCHES(enc, ptr, ASCII_x))
520
436
      return PREFIX(scanHexCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
521
182
    switch (BYTE_TYPE(enc, ptr)) {
522
164
    case BT_DIGIT:
523
164
      break;
524
18
    default:
525
18
      *nextTokPtr = ptr;
526
18
      return XML_TOK_INVALID;
527
182
    }
528
224
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
529
224
      switch (BYTE_TYPE(enc, ptr)) {
530
70
      case BT_DIGIT:
531
70
        break;
532
26
      case BT_SEMI:
533
26
        *nextTokPtr = ptr + MINBPC(enc);
534
26
        return XML_TOK_CHAR_REF;
535
128
      default:
536
128
        *nextTokPtr = ptr;
537
128
        return XML_TOK_INVALID;
538
224
      }
539
224
    }
540
164
  }
541
20
  return XML_TOK_PARTIAL;
542
628
}
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
8.25k
                const char **nextTokPtr) {
549
8.25k
  REQUIRE_CHAR(enc, ptr, end);
550
8.09k
  switch (BYTE_TYPE(enc, ptr)) {
551
6.81k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
552
3.62k
  case BT_NUM:
553
3.62k
    return PREFIX(scanCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
554
329
  default:
555
329
    *nextTokPtr = ptr;
556
329
    return XML_TOK_INVALID;
557
8.09k
  }
558
22.8k
  while (HAS_CHAR(enc, ptr, end)) {
559
22.8k
    switch (BYTE_TYPE(enc, ptr)) {
560
86.9k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
561
1.69k
    case BT_SEMI:
562
1.69k
      *nextTokPtr = ptr + MINBPC(enc);
563
1.69k
      return XML_TOK_ENTITY_REF;
564
587
    default:
565
587
      *nextTokPtr = ptr;
566
587
      return XML_TOK_INVALID;
567
22.8k
    }
568
22.8k
  }
569
289
  return XML_TOK_PARTIAL;
570
3.47k
}
xmltok.c:normal_scanRef
Line
Count
Source
548
3.55k
                const char **nextTokPtr) {
549
3.55k
  REQUIRE_CHAR(enc, ptr, end);
550
3.47k
  switch (BYTE_TYPE(enc, ptr)) {
551
2.21k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
552
1.24k
  case BT_NUM:
553
1.24k
    return PREFIX(scanCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
554
66
  default:
555
66
    *nextTokPtr = ptr;
556
66
    return XML_TOK_INVALID;
557
3.47k
  }
558
11.3k
  while (HAS_CHAR(enc, ptr, end)) {
559
11.3k
    switch (BYTE_TYPE(enc, ptr)) {
560
31.8k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
561
1.11k
    case BT_SEMI:
562
1.11k
      *nextTokPtr = ptr + MINBPC(enc);
563
1.11k
      return XML_TOK_ENTITY_REF;
564
161
    default:
565
161
      *nextTokPtr = ptr;
566
161
      return XML_TOK_INVALID;
567
11.3k
    }
568
11.3k
  }
569
108
  return XML_TOK_PARTIAL;
570
1.81k
}
xmltok.c:little2_scanRef
Line
Count
Source
548
3.66k
                const char **nextTokPtr) {
549
3.66k
  REQUIRE_CHAR(enc, ptr, end);
550
3.59k
  switch (BYTE_TYPE(enc, ptr)) {
551
3.86k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
552
1.75k
  case BT_NUM:
553
1.75k
    return PREFIX(scanCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
554
208
  default:
555
208
    *nextTokPtr = ptr;
556
208
    return XML_TOK_INVALID;
557
3.59k
  }
558
7.93k
  while (HAS_CHAR(enc, ptr, end)) {
559
7.93k
    switch (BYTE_TYPE(enc, ptr)) {
560
35.9k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
561
493
    case BT_SEMI:
562
493
      *nextTokPtr = ptr + MINBPC(enc);
563
493
      return XML_TOK_ENTITY_REF;
564
352
    default:
565
352
      *nextTokPtr = ptr;
566
352
      return XML_TOK_INVALID;
567
7.93k
    }
568
7.93k
  }
569
152
  return XML_TOK_PARTIAL;
570
1.38k
}
xmltok.c:big2_scanRef
Line
Count
Source
548
1.03k
                const char **nextTokPtr) {
549
1.03k
  REQUIRE_CHAR(enc, ptr, end);
550
1.02k
  switch (BYTE_TYPE(enc, ptr)) {
551
735
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
552
628
  case BT_NUM:
553
628
    return PREFIX(scanCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
554
55
  default:
555
55
    *nextTokPtr = ptr;
556
55
    return XML_TOK_INVALID;
557
1.02k
  }
558
3.54k
  while (HAS_CHAR(enc, ptr, end)) {
559
3.54k
    switch (BYTE_TYPE(enc, ptr)) {
560
19.1k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
561
87
    case BT_SEMI:
562
87
      *nextTokPtr = ptr + MINBPC(enc);
563
87
      return XML_TOK_ENTITY_REF;
564
74
    default:
565
74
      *nextTokPtr = ptr;
566
74
      return XML_TOK_INVALID;
567
3.54k
    }
568
3.54k
  }
569
29
  return XML_TOK_PARTIAL;
570
276
}
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
28.6k
                 const char **nextTokPtr) {
577
28.6k
#  ifdef XML_NS
578
28.6k
  int hadColon = 0;
579
28.6k
#  endif
580
1.07M
  while (HAS_CHAR(enc, ptr, end)) {
581
1.07M
    switch (BYTE_TYPE(enc, ptr)) {
582
4.23M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
583
0
#  ifdef XML_NS
584
57.2k
    case BT_COLON:
585
57.2k
      if (hadColon) {
586
135
        *nextTokPtr = ptr;
587
135
        return XML_TOK_INVALID;
588
135
      }
589
57.1k
      hadColon = 1;
590
57.1k
      ptr += MINBPC(enc);
591
57.1k
      REQUIRE_CHAR(enc, ptr, end);
592
56.9k
      switch (BYTE_TYPE(enc, ptr)) {
593
42.1k
        CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
594
437
      default:
595
437
        *nextTokPtr = ptr;
596
437
        return XML_TOK_INVALID;
597
56.9k
      }
598
55.6k
      break;
599
55.6k
#  endif
600
55.6k
    case BT_S:
601
1.56k
    case BT_CR:
602
8.07k
    case BT_LF:
603
21.2k
      for (;;) {
604
21.2k
        int t;
605
606
21.2k
        ptr += MINBPC(enc);
607
21.2k
        REQUIRE_CHAR(enc, ptr, end);
608
20.9k
        t = BYTE_TYPE(enc, ptr);
609
20.9k
        if (t == BT_EQUALS)
610
6.54k
          break;
611
14.4k
        switch (t) {
612
6.16k
        case BT_S:
613
9.47k
        case BT_LF:
614
13.1k
        case BT_CR:
615
13.1k
          break;
616
1.26k
        default:
617
1.26k
          *nextTokPtr = ptr;
618
1.26k
          return XML_TOK_INVALID;
619
14.4k
        }
620
14.4k
      }
621
6.54k
      EXPAT_FALLTHROUGH;
622
64.3k
    case BT_EQUALS: {
623
64.3k
      int open;
624
64.3k
#  ifdef XML_NS
625
64.3k
      hadColon = 0;
626
64.3k
#  endif
627
69.0k
      for (;;) {
628
69.0k
        ptr += MINBPC(enc);
629
69.0k
        REQUIRE_CHAR(enc, ptr, end);
630
68.7k
        open = BYTE_TYPE(enc, ptr);
631
68.7k
        if (open == BT_QUOT || open == BT_APOS)
632
62.8k
          break;
633
5.88k
        switch (open) {
634
2.07k
        case BT_S:
635
3.40k
        case BT_LF:
636
4.74k
        case BT_CR:
637
4.74k
          break;
638
1.14k
        default:
639
1.14k
          *nextTokPtr = ptr;
640
1.14k
          return XML_TOK_INVALID;
641
5.88k
        }
642
5.88k
      }
643
62.8k
      ptr += MINBPC(enc);
644
      /* in attribute value */
645
2.17M
      for (;;) {
646
2.17M
        int t;
647
2.17M
        REQUIRE_CHAR(enc, ptr, end);
648
2.17M
        t = BYTE_TYPE(enc, ptr);
649
2.17M
        if (t == open)
650
60.0k
          break;
651
2.11M
        switch (t) {
652
97.0k
          INVALID_CASES(ptr, nextTokPtr)
653
1.45k
        case BT_AMP: {
654
1.45k
          int tok = PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, &ptr);
655
1.45k
          if (tok <= 0) {
656
893
            if (tok == XML_TOK_INVALID)
657
697
              *nextTokPtr = ptr;
658
893
            return tok;
659
893
          }
660
560
          break;
661
1.45k
        }
662
560
        case BT_LT:
663
157
          *nextTokPtr = ptr;
664
157
          return XML_TOK_INVALID;
665
2.06M
        default:
666
2.06M
          ptr += MINBPC(enc);
667
2.06M
          break;
668
2.11M
        }
669
2.11M
      }
670
60.0k
      ptr += MINBPC(enc);
671
60.0k
      REQUIRE_CHAR(enc, ptr, end);
672
59.8k
      switch (BYTE_TYPE(enc, ptr)) {
673
42.1k
      case BT_S:
674
42.3k
      case BT_CR:
675
43.8k
      case BT_LF:
676
43.8k
        break;
677
1.81k
      case BT_SOL:
678
1.81k
        goto sol;
679
13.4k
      case BT_GT:
680
13.4k
        goto gt;
681
729
      default:
682
729
        *nextTokPtr = ptr;
683
729
        return XML_TOK_INVALID;
684
59.8k
      }
685
      /* ptr points to closing quote */
686
63.1k
      for (;;) {
687
63.1k
        ptr += MINBPC(enc);
688
63.1k
        REQUIRE_CHAR(enc, ptr, end);
689
62.8k
        switch (BYTE_TYPE(enc, ptr)) {
690
33.6k
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
691
13.4k
        case BT_S:
692
18.0k
        case BT_CR:
693
19.2k
        case BT_LF:
694
19.2k
          continue;
695
217
        case BT_GT:
696
13.6k
        gt:
697
13.6k
          *nextTokPtr = ptr + MINBPC(enc);
698
13.6k
          return XML_TOK_START_TAG_WITH_ATTS;
699
156
        case BT_SOL:
700
1.97k
        sol:
701
1.97k
          ptr += MINBPC(enc);
702
1.97k
          REQUIRE_CHAR(enc, ptr, end);
703
1.85k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
704
282
            *nextTokPtr = ptr;
705
282
            return XML_TOK_INVALID;
706
282
          }
707
1.57k
          *nextTokPtr = ptr + MINBPC(enc);
708
1.57k
          return XML_TOK_EMPTY_ELEMENT_WITH_ATTS;
709
575
        default:
710
575
          *nextTokPtr = ptr;
711
575
          return XML_TOK_INVALID;
712
62.8k
        }
713
41.7k
        break;
714
62.8k
      }
715
41.7k
      break;
716
43.8k
    }
717
41.7k
    default:
718
986
      *nextTokPtr = ptr;
719
986
      return XML_TOK_INVALID;
720
1.07M
    }
721
1.07M
  }
722
616
  return XML_TOK_PARTIAL;
723
28.6k
}
xmltok.c:normal_scanAtts
Line
Count
Source
576
18.8k
                 const char **nextTokPtr) {
577
18.8k
#  ifdef XML_NS
578
18.8k
  int hadColon = 0;
579
18.8k
#  endif
580
749k
  while (HAS_CHAR(enc, ptr, end)) {
581
749k
    switch (BYTE_TYPE(enc, ptr)) {
582
2.37M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
583
0
#  ifdef XML_NS
584
56.2k
    case BT_COLON:
585
56.2k
      if (hadColon) {
586
87
        *nextTokPtr = ptr;
587
87
        return XML_TOK_INVALID;
588
87
      }
589
56.1k
      hadColon = 1;
590
56.1k
      ptr += MINBPC(enc);
591
56.1k
      REQUIRE_CHAR(enc, ptr, end);
592
56.0k
      switch (BYTE_TYPE(enc, ptr)) {
593
41.3k
        CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
594
79
      default:
595
79
        *nextTokPtr = ptr;
596
79
        return XML_TOK_INVALID;
597
56.0k
      }
598
55.3k
      break;
599
55.3k
#  endif
600
55.3k
    case BT_S:
601
1.13k
    case BT_CR:
602
1.25k
    case BT_LF:
603
11.4k
      for (;;) {
604
11.4k
        int t;
605
606
11.4k
        ptr += MINBPC(enc);
607
11.4k
        REQUIRE_CHAR(enc, ptr, end);
608
11.3k
        t = BYTE_TYPE(enc, ptr);
609
11.3k
        if (t == BT_EQUALS)
610
928
          break;
611
10.4k
        switch (t) {
612
5.31k
        case BT_S:
613
7.20k
        case BT_LF:
614
10.1k
        case BT_CR:
615
10.1k
          break;
616
227
        default:
617
227
          *nextTokPtr = ptr;
618
227
          return XML_TOK_INVALID;
619
10.4k
        }
620
10.4k
      }
621
928
      EXPAT_FALLTHROUGH;
622
57.3k
    case BT_EQUALS: {
623
57.3k
      int open;
624
57.3k
#  ifdef XML_NS
625
57.3k
      hadColon = 0;
626
57.3k
#  endif
627
59.8k
      for (;;) {
628
59.8k
        ptr += MINBPC(enc);
629
59.8k
        REQUIRE_CHAR(enc, ptr, end);
630
59.7k
        open = BYTE_TYPE(enc, ptr);
631
59.7k
        if (open == BT_QUOT || open == BT_APOS)
632
56.9k
          break;
633
2.73k
        switch (open) {
634
1.47k
        case BT_S:
635
1.96k
        case BT_LF:
636
2.55k
        case BT_CR:
637
2.55k
          break;
638
177
        default:
639
177
          *nextTokPtr = ptr;
640
177
          return XML_TOK_INVALID;
641
2.73k
        }
642
2.73k
      }
643
56.9k
      ptr += MINBPC(enc);
644
      /* in attribute value */
645
1.67M
      for (;;) {
646
1.67M
        int t;
647
1.67M
        REQUIRE_CHAR(enc, ptr, end);
648
1.67M
        t = BYTE_TYPE(enc, ptr);
649
1.67M
        if (t == open)
650
55.5k
          break;
651
1.61M
        switch (t) {
652
4.81k
          INVALID_CASES(ptr, nextTokPtr)
653
748
        case BT_AMP: {
654
748
          int tok = PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, &ptr);
655
748
          if (tok <= 0) {
656
361
            if (tok == XML_TOK_INVALID)
657
244
              *nextTokPtr = ptr;
658
361
            return tok;
659
361
          }
660
387
          break;
661
748
        }
662
387
        case BT_LT:
663
73
          *nextTokPtr = ptr;
664
73
          return XML_TOK_INVALID;
665
1.61M
        default:
666
1.61M
          ptr += MINBPC(enc);
667
1.61M
          break;
668
1.61M
        }
669
1.61M
      }
670
55.5k
      ptr += MINBPC(enc);
671
55.5k
      REQUIRE_CHAR(enc, ptr, end);
672
55.4k
      switch (BYTE_TYPE(enc, ptr)) {
673
40.2k
      case BT_S:
674
40.3k
      case BT_CR:
675
41.7k
      case BT_LF:
676
41.7k
        break;
677
1.44k
      case BT_SOL:
678
1.44k
        goto sol;
679
12.2k
      case BT_GT:
680
12.2k
        goto gt;
681
79
      default:
682
79
        *nextTokPtr = ptr;
683
79
        return XML_TOK_INVALID;
684
55.4k
      }
685
      /* ptr points to closing quote */
686
58.3k
      for (;;) {
687
58.3k
        ptr += MINBPC(enc);
688
58.3k
        REQUIRE_CHAR(enc, ptr, end);
689
58.1k
        switch (BYTE_TYPE(enc, ptr)) {
690
30.8k
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
691
13.0k
        case BT_S:
692
16.3k
        case BT_CR:
693
16.6k
        case BT_LF:
694
16.6k
          continue;
695
146
        case BT_GT:
696
12.3k
        gt:
697
12.3k
          *nextTokPtr = ptr + MINBPC(enc);
698
12.3k
          return XML_TOK_START_TAG_WITH_ATTS;
699
76
        case BT_SOL:
700
1.52k
        sol:
701
1.52k
          ptr += MINBPC(enc);
702
1.52k
          REQUIRE_CHAR(enc, ptr, end);
703
1.48k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
704
100
            *nextTokPtr = ptr;
705
100
            return XML_TOK_INVALID;
706
100
          }
707
1.38k
          *nextTokPtr = ptr + MINBPC(enc);
708
1.38k
          return XML_TOK_EMPTY_ELEMENT_WITH_ATTS;
709
117
        default:
710
117
          *nextTokPtr = ptr;
711
117
          return XML_TOK_INVALID;
712
58.1k
        }
713
40.8k
        break;
714
58.1k
      }
715
40.8k
      break;
716
41.7k
    }
717
40.8k
    default:
718
418
      *nextTokPtr = ptr;
719
418
      return XML_TOK_INVALID;
720
749k
    }
721
749k
  }
722
159
  return XML_TOK_PARTIAL;
723
18.8k
}
xmltok.c:little2_scanAtts
Line
Count
Source
576
8.12k
                 const char **nextTokPtr) {
577
8.12k
#  ifdef XML_NS
578
8.12k
  int hadColon = 0;
579
8.12k
#  endif
580
130k
  while (HAS_CHAR(enc, ptr, end)) {
581
130k
    switch (BYTE_TYPE(enc, ptr)) {
582
729k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
583
0
#  ifdef XML_NS
584
866
    case BT_COLON:
585
866
      if (hadColon) {
586
38
        *nextTokPtr = ptr;
587
38
        return XML_TOK_INVALID;
588
38
      }
589
828
      hadColon = 1;
590
828
      ptr += MINBPC(enc);
591
828
      REQUIRE_CHAR(enc, ptr, end);
592
762
      switch (BYTE_TYPE(enc, ptr)) {
593
658
        CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
594
308
      default:
595
308
        *nextTokPtr = ptr;
596
308
        return XML_TOK_INVALID;
597
762
      }
598
215
      break;
599
215
#  endif
600
215
    case BT_S:
601
259
    case BT_CR:
602
6.59k
    case BT_LF:
603
8.57k
      for (;;) {
604
8.57k
        int t;
605
606
8.57k
        ptr += MINBPC(enc);
607
8.57k
        REQUIRE_CHAR(enc, ptr, end);
608
8.41k
        t = BYTE_TYPE(enc, ptr);
609
8.41k
        if (t == BT_EQUALS)
610
5.56k
          break;
611
2.85k
        switch (t) {
612
614
        case BT_S:
613
1.55k
        case BT_LF:
614
1.98k
        case BT_CR:
615
1.98k
          break;
616
868
        default:
617
868
          *nextTokPtr = ptr;
618
868
          return XML_TOK_INVALID;
619
2.85k
        }
620
2.85k
      }
621
5.56k
      EXPAT_FALLTHROUGH;
622
5.88k
    case BT_EQUALS: {
623
5.88k
      int open;
624
5.88k
#  ifdef XML_NS
625
5.88k
      hadColon = 0;
626
5.88k
#  endif
627
7.67k
      for (;;) {
628
7.67k
        ptr += MINBPC(enc);
629
7.67k
        REQUIRE_CHAR(enc, ptr, end);
630
7.53k
        open = BYTE_TYPE(enc, ptr);
631
7.53k
        if (open == BT_QUOT || open == BT_APOS)
632
4.92k
          break;
633
2.60k
        switch (open) {
634
496
        case BT_S:
635
1.15k
        case BT_LF:
636
1.79k
        case BT_CR:
637
1.79k
          break;
638
814
        default:
639
814
          *nextTokPtr = ptr;
640
814
          return XML_TOK_INVALID;
641
2.60k
        }
642
2.60k
      }
643
4.92k
      ptr += MINBPC(enc);
644
      /* in attribute value */
645
126k
      for (;;) {
646
126k
        int t;
647
126k
        REQUIRE_CHAR(enc, ptr, end);
648
126k
        t = BYTE_TYPE(enc, ptr);
649
126k
        if (t == open)
650
3.64k
          break;
651
122k
        switch (t) {
652
39.0k
          INVALID_CASES(ptr, nextTokPtr)
653
650
        case BT_AMP: {
654
650
          int tok = PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, &ptr);
655
650
          if (tok <= 0) {
656
494
            if (tok == XML_TOK_INVALID)
657
421
              *nextTokPtr = ptr;
658
494
            return tok;
659
494
          }
660
156
          break;
661
650
        }
662
156
        case BT_LT:
663
74
          *nextTokPtr = ptr;
664
74
          return XML_TOK_INVALID;
665
102k
        default:
666
102k
          ptr += MINBPC(enc);
667
102k
          break;
668
122k
        }
669
122k
      }
670
3.64k
      ptr += MINBPC(enc);
671
3.64k
      REQUIRE_CHAR(enc, ptr, end);
672
3.58k
      switch (BYTE_TYPE(enc, ptr)) {
673
1.69k
      case BT_S:
674
1.81k
      case BT_CR:
675
1.93k
      case BT_LF:
676
1.93k
        break;
677
340
      case BT_SOL:
678
340
        goto sol;
679
776
      case BT_GT:
680
776
        goto gt;
681
531
      default:
682
531
        *nextTokPtr = ptr;
683
531
        return XML_TOK_INVALID;
684
3.58k
      }
685
      /* ptr points to closing quote */
686
4.44k
      for (;;) {
687
4.44k
        ptr += MINBPC(enc);
688
4.44k
        REQUIRE_CHAR(enc, ptr, end);
689
4.29k
        switch (BYTE_TYPE(enc, ptr)) {
690
2.66k
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
691
317
        case BT_S:
692
1.59k
        case BT_CR:
693
2.50k
        case BT_LF:
694
2.50k
          continue;
695
50
        case BT_GT:
696
826
        gt:
697
826
          *nextTokPtr = ptr + MINBPC(enc);
698
826
          return XML_TOK_START_TAG_WITH_ATTS;
699
70
        case BT_SOL:
700
410
        sol:
701
410
          ptr += MINBPC(enc);
702
410
          REQUIRE_CHAR(enc, ptr, end);
703
336
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
704
159
            *nextTokPtr = ptr;
705
159
            return XML_TOK_INVALID;
706
159
          }
707
177
          *nextTokPtr = ptr + MINBPC(enc);
708
177
          return XML_TOK_EMPTY_ELEMENT_WITH_ATTS;
709
400
        default:
710
400
          *nextTokPtr = ptr;
711
400
          return XML_TOK_INVALID;
712
4.29k
        }
713
863
        break;
714
4.29k
      }
715
863
      break;
716
1.93k
    }
717
863
    default:
718
473
      *nextTokPtr = ptr;
719
473
      return XML_TOK_INVALID;
720
130k
    }
721
130k
  }
722
436
  return XML_TOK_PARTIAL;
723
8.12k
}
xmltok.c:big2_scanAtts
Line
Count
Source
576
1.63k
                 const char **nextTokPtr) {
577
1.63k
#  ifdef XML_NS
578
1.63k
  int hadColon = 0;
579
1.63k
#  endif
580
191k
  while (HAS_CHAR(enc, ptr, end)) {
581
191k
    switch (BYTE_TYPE(enc, ptr)) {
582
1.12M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
583
0
#  ifdef XML_NS
584
169
    case BT_COLON:
585
169
      if (hadColon) {
586
10
        *nextTokPtr = ptr;
587
10
        return XML_TOK_INVALID;
588
10
      }
589
159
      hadColon = 1;
590
159
      ptr += MINBPC(enc);
591
159
      REQUIRE_CHAR(enc, ptr, end);
592
149
      switch (BYTE_TYPE(enc, ptr)) {
593
159
        CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
594
50
      default:
595
50
        *nextTokPtr = ptr;
596
50
        return XML_TOK_INVALID;
597
149
      }
598
47
      break;
599
47
#  endif
600
125
    case BT_S:
601
167
    case BT_CR:
602
221
    case BT_LF:
603
1.20k
      for (;;) {
604
1.20k
        int t;
605
606
1.20k
        ptr += MINBPC(enc);
607
1.20k
        REQUIRE_CHAR(enc, ptr, end);
608
1.19k
        t = BYTE_TYPE(enc, ptr);
609
1.19k
        if (t == BT_EQUALS)
610
46
          break;
611
1.14k
        switch (t) {
612
242
        case BT_S:
613
709
        case BT_LF:
614
980
        case BT_CR:
615
980
          break;
616
165
        default:
617
165
          *nextTokPtr = ptr;
618
165
          return XML_TOK_INVALID;
619
1.14k
        }
620
1.14k
      }
621
46
      EXPAT_FALLTHROUGH;
622
1.15k
    case BT_EQUALS: {
623
1.15k
      int open;
624
1.15k
#  ifdef XML_NS
625
1.15k
      hadColon = 0;
626
1.15k
#  endif
627
1.54k
      for (;;) {
628
1.54k
        ptr += MINBPC(enc);
629
1.54k
        REQUIRE_CHAR(enc, ptr, end);
630
1.52k
        open = BYTE_TYPE(enc, ptr);
631
1.52k
        if (open == BT_QUOT || open == BT_APOS)
632
979
          break;
633
550
        switch (open) {
634
106
        case BT_S:
635
286
        case BT_LF:
636
399
        case BT_CR:
637
399
          break;
638
151
        default:
639
151
          *nextTokPtr = ptr;
640
151
          return XML_TOK_INVALID;
641
550
        }
642
550
      }
643
979
      ptr += MINBPC(enc);
644
      /* in attribute value */
645
376k
      for (;;) {
646
376k
        int t;
647
376k
        REQUIRE_CHAR(enc, ptr, end);
648
376k
        t = BYTE_TYPE(enc, ptr);
649
376k
        if (t == open)
650
830
          break;
651
375k
        switch (t) {
652
53.1k
          INVALID_CASES(ptr, nextTokPtr)
653
55
        case BT_AMP: {
654
55
          int tok = PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, &ptr);
655
55
          if (tok <= 0) {
656
38
            if (tok == XML_TOK_INVALID)
657
32
              *nextTokPtr = ptr;
658
38
            return tok;
659
38
          }
660
17
          break;
661
55
        }
662
17
        case BT_LT:
663
10
          *nextTokPtr = ptr;
664
10
          return XML_TOK_INVALID;
665
348k
        default:
666
348k
          ptr += MINBPC(enc);
667
348k
          break;
668
375k
        }
669
375k
      }
670
830
      ptr += MINBPC(enc);
671
830
      REQUIRE_CHAR(enc, ptr, end);
672
820
      switch (BYTE_TYPE(enc, ptr)) {
673
128
      case BT_S:
674
210
      case BT_CR:
675
220
      case BT_LF:
676
220
        break;
677
31
      case BT_SOL:
678
31
        goto sol;
679
450
      case BT_GT:
680
450
        goto gt;
681
119
      default:
682
119
        *nextTokPtr = ptr;
683
119
        return XML_TOK_INVALID;
684
820
      }
685
      /* ptr points to closing quote */
686
328
      for (;;) {
687
328
        ptr += MINBPC(enc);
688
328
        REQUIRE_CHAR(enc, ptr, end);
689
312
        switch (BYTE_TYPE(enc, ptr)) {
690
169
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
691
44
        case BT_S:
692
82
        case BT_CR:
693
108
        case BT_LF:
694
108
          continue;
695
21
        case BT_GT:
696
471
        gt:
697
471
          *nextTokPtr = ptr + MINBPC(enc);
698
471
          return XML_TOK_START_TAG_WITH_ATTS;
699
10
        case BT_SOL:
700
41
        sol:
701
41
          ptr += MINBPC(enc);
702
41
          REQUIRE_CHAR(enc, ptr, end);
703
41
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
704
23
            *nextTokPtr = ptr;
705
23
            return XML_TOK_INVALID;
706
23
          }
707
18
          *nextTokPtr = ptr + MINBPC(enc);
708
18
          return XML_TOK_EMPTY_ELEMENT_WITH_ATTS;
709
58
        default:
710
58
          *nextTokPtr = ptr;
711
58
          return XML_TOK_INVALID;
712
312
        }
713
49
        break;
714
312
      }
715
49
      break;
716
220
    }
717
95
    default:
718
95
      *nextTokPtr = ptr;
719
95
      return XML_TOK_INVALID;
720
191k
    }
721
191k
  }
722
21
  return XML_TOK_PARTIAL;
723
1.63k
}
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
102k
               const char **nextTokPtr) {
730
102k
#  ifdef XML_NS
731
102k
  int hadColon;
732
102k
#  endif
733
102k
  REQUIRE_CHAR(enc, ptr, end);
734
102k
  switch (BYTE_TYPE(enc, ptr)) {
735
81.7k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
736
1.27k
  case BT_EXCL:
737
1.27k
    ptr += MINBPC(enc);
738
1.27k
    REQUIRE_CHAR(enc, ptr, end);
739
1.21k
    switch (BYTE_TYPE(enc, ptr)) {
740
170
    case BT_MINUS:
741
170
      return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
742
295
    case BT_LSQB:
743
295
      return PREFIX(scanCdataSection)(enc, ptr + MINBPC(enc), end, nextTokPtr);
744
1.21k
    }
745
752
    *nextTokPtr = ptr;
746
752
    return XML_TOK_INVALID;
747
1.09k
  case BT_QUEST:
748
1.09k
    return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
749
25.5k
  case BT_SOL:
750
25.5k
    return PREFIX(scanEndTag)(enc, ptr + MINBPC(enc), end, nextTokPtr);
751
449
  default:
752
449
    *nextTokPtr = ptr;
753
449
    return XML_TOK_INVALID;
754
102k
  }
755
72.5k
#  ifdef XML_NS
756
72.5k
  hadColon = 0;
757
72.5k
#  endif
758
  /* we have a start-tag */
759
796k
  while (HAS_CHAR(enc, ptr, end)) {
760
796k
    switch (BYTE_TYPE(enc, ptr)) {
761
3.38M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
762
0
#  ifdef XML_NS
763
32.5k
    case BT_COLON:
764
32.5k
      if (hadColon) {
765
132
        *nextTokPtr = ptr;
766
132
        return XML_TOK_INVALID;
767
132
      }
768
32.4k
      hadColon = 1;
769
32.4k
      ptr += MINBPC(enc);
770
32.4k
      REQUIRE_CHAR(enc, ptr, end);
771
32.3k
      switch (BYTE_TYPE(enc, ptr)) {
772
22.1k
        CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
773
457
      default:
774
457
        *nextTokPtr = ptr;
775
457
        return XML_TOK_INVALID;
776
32.3k
      }
777
30.9k
      break;
778
30.9k
#  endif
779
30.9k
    case BT_S:
780
31.6k
    case BT_CR:
781
32.1k
    case BT_LF: {
782
32.1k
      ptr += MINBPC(enc);
783
79.4k
      while (HAS_CHAR(enc, ptr, end)) {
784
79.4k
        switch (BYTE_TYPE(enc, ptr)) {
785
46.4k
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
786
764
        case BT_GT:
787
764
          goto gt;
788
783
        case BT_SOL:
789
783
          goto sol;
790
36.3k
        case BT_S:
791
44.3k
        case BT_CR:
792
47.5k
        case BT_LF:
793
47.5k
          ptr += MINBPC(enc);
794
47.5k
          continue;
795
629
        default:
796
629
          *nextTokPtr = ptr;
797
629
          return XML_TOK_INVALID;
798
79.4k
        }
799
28.6k
        return PREFIX(scanAtts)(enc, ptr, end, nextTokPtr);
800
79.4k
      }
801
312
      return XML_TOK_PARTIAL;
802
32.1k
    }
803
33.8k
    case BT_GT:
804
34.6k
    gt:
805
34.6k
      *nextTokPtr = ptr + MINBPC(enc);
806
34.6k
      return XML_TOK_START_TAG_NO_ATTS;
807
2.15k
    case BT_SOL:
808
2.94k
    sol:
809
2.94k
      ptr += MINBPC(enc);
810
2.94k
      REQUIRE_CHAR(enc, ptr, end);
811
2.77k
      if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
812
359
        *nextTokPtr = ptr;
813
359
        return XML_TOK_INVALID;
814
359
      }
815
2.41k
      *nextTokPtr = ptr + MINBPC(enc);
816
2.41k
      return XML_TOK_EMPTY_ELEMENT_NO_ATTS;
817
875
    default:
818
875
      *nextTokPtr = ptr;
819
875
      return XML_TOK_INVALID;
820
796k
    }
821
796k
  }
822
412
  return XML_TOK_PARTIAL;
823
72.5k
}
xmltok.c:normal_scanLt
Line
Count
Source
729
67.9k
               const char **nextTokPtr) {
730
67.9k
#  ifdef XML_NS
731
67.9k
  int hadColon;
732
67.9k
#  endif
733
67.9k
  REQUIRE_CHAR(enc, ptr, end);
734
67.8k
  switch (BYTE_TYPE(enc, ptr)) {
735
39.0k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
736
237
  case BT_EXCL:
737
237
    ptr += MINBPC(enc);
738
237
    REQUIRE_CHAR(enc, ptr, end);
739
219
    switch (BYTE_TYPE(enc, ptr)) {
740
79
    case BT_MINUS:
741
79
      return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
742
90
    case BT_LSQB:
743
90
      return PREFIX(scanCdataSection)(enc, ptr + MINBPC(enc), end, nextTokPtr);
744
219
    }
745
50
    *nextTokPtr = ptr;
746
50
    return XML_TOK_INVALID;
747
163
  case BT_QUEST:
748
163
    return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
749
22.7k
  case BT_SOL:
750
22.7k
    return PREFIX(scanEndTag)(enc, ptr + MINBPC(enc), end, nextTokPtr);
751
79
  default:
752
79
    *nextTokPtr = ptr;
753
79
    return XML_TOK_INVALID;
754
67.8k
  }
755
44.0k
#  ifdef XML_NS
756
44.0k
  hadColon = 0;
757
44.0k
#  endif
758
  /* we have a start-tag */
759
377k
  while (HAS_CHAR(enc, ptr, end)) {
760
377k
    switch (BYTE_TYPE(enc, ptr)) {
761
1.08M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
762
0
#  ifdef XML_NS
763
31.4k
    case BT_COLON:
764
31.4k
      if (hadColon) {
765
88
        *nextTokPtr = ptr;
766
88
        return XML_TOK_INVALID;
767
88
      }
768
31.3k
      hadColon = 1;
769
31.3k
      ptr += MINBPC(enc);
770
31.3k
      REQUIRE_CHAR(enc, ptr, end);
771
31.3k
      switch (BYTE_TYPE(enc, ptr)) {
772
21.2k
        CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
773
87
      default:
774
87
        *nextTokPtr = ptr;
775
87
        return XML_TOK_INVALID;
776
31.3k
      }
777
30.7k
      break;
778
30.7k
#  endif
779
30.7k
    case BT_S:
780
20.6k
    case BT_CR:
781
20.8k
    case BT_LF: {
782
20.8k
      ptr += MINBPC(enc);
783
58.6k
      while (HAS_CHAR(enc, ptr, end)) {
784
58.6k
        switch (BYTE_TYPE(enc, ptr)) {
785
19.0k
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
786
429
        case BT_GT:
787
429
          goto gt;
788
697
        case BT_SOL:
789
697
          goto sol;
790
35.4k
        case BT_S:
791
36.2k
        case BT_CR:
792
37.8k
        case BT_LF:
793
37.8k
          ptr += MINBPC(enc);
794
37.8k
          continue;
795
128
        default:
796
128
          *nextTokPtr = ptr;
797
128
          return XML_TOK_INVALID;
798
58.6k
        }
799
18.8k
        return PREFIX(scanAtts)(enc, ptr, end, nextTokPtr);
800
58.6k
      }
801
145
      return XML_TOK_PARTIAL;
802
20.8k
    }
803
20.6k
    case BT_GT:
804
21.0k
    gt:
805
21.0k
      *nextTokPtr = ptr + MINBPC(enc);
806
21.0k
      return XML_TOK_START_TAG_NO_ATTS;
807
556
    case BT_SOL:
808
1.25k
    sol:
809
1.25k
      ptr += MINBPC(enc);
810
1.25k
      REQUIRE_CHAR(enc, ptr, end);
811
1.17k
      if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
812
121
        *nextTokPtr = ptr;
813
121
        return XML_TOK_INVALID;
814
121
      }
815
1.05k
      *nextTokPtr = ptr + MINBPC(enc);
816
1.05k
      return XML_TOK_EMPTY_ELEMENT_NO_ATTS;
817
355
    default:
818
355
      *nextTokPtr = ptr;
819
355
      return XML_TOK_INVALID;
820
377k
    }
821
377k
  }
822
195
  return XML_TOK_PARTIAL;
823
44.0k
}
xmltok.c:little2_scanLt
Line
Count
Source
729
27.2k
               const char **nextTokPtr) {
730
27.2k
#  ifdef XML_NS
731
27.2k
  int hadColon;
732
27.2k
#  endif
733
27.2k
  REQUIRE_CHAR(enc, ptr, end);
734
27.2k
  switch (BYTE_TYPE(enc, ptr)) {
735
37.9k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
736
869
  case BT_EXCL:
737
869
    ptr += MINBPC(enc);
738
869
    REQUIRE_CHAR(enc, ptr, end);
739
835
    switch (BYTE_TYPE(enc, ptr)) {
740
80
    case BT_MINUS:
741
80
      return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
742
173
    case BT_LSQB:
743
173
      return PREFIX(scanCdataSection)(enc, ptr + MINBPC(enc), end, nextTokPtr);
744
835
    }
745
582
    *nextTokPtr = ptr;
746
582
    return XML_TOK_INVALID;
747
755
  case BT_QUEST:
748
755
    return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
749
2.37k
  case BT_SOL:
750
2.37k
    return PREFIX(scanEndTag)(enc, ptr + MINBPC(enc), end, nextTokPtr);
751
319
  default:
752
319
    *nextTokPtr = ptr;
753
319
    return XML_TOK_INVALID;
754
27.2k
  }
755
22.3k
#  ifdef XML_NS
756
22.3k
  hadColon = 0;
757
22.3k
#  endif
758
  /* we have a start-tag */
759
68.1k
  while (HAS_CHAR(enc, ptr, end)) {
760
68.1k
    switch (BYTE_TYPE(enc, ptr)) {
761
265k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
762
0
#  ifdef XML_NS
763
944
    case BT_COLON:
764
944
      if (hadColon) {
765
34
        *nextTokPtr = ptr;
766
34
        return XML_TOK_INVALID;
767
34
      }
768
910
      hadColon = 1;
769
910
      ptr += MINBPC(enc);
770
910
      REQUIRE_CHAR(enc, ptr, end);
771
844
      switch (BYTE_TYPE(enc, ptr)) {
772
781
        CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
773
319
      default:
774
319
        *nextTokPtr = ptr;
775
319
        return XML_TOK_INVALID;
776
844
      }
777
195
      break;
778
195
#  endif
779
8.81k
    case BT_S:
780
9.20k
    case BT_CR:
781
9.41k
    case BT_LF: {
782
9.41k
      ptr += MINBPC(enc);
783
17.1k
      while (HAS_CHAR(enc, ptr, end)) {
784
17.1k
        switch (BYTE_TYPE(enc, ptr)) {
785
22.5k
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
786
228
        case BT_GT:
787
228
          goto gt;
788
76
        case BT_SOL:
789
76
          goto sol;
790
421
        case BT_S:
791
7.23k
        case BT_CR:
792
7.85k
        case BT_LF:
793
7.85k
          ptr += MINBPC(enc);
794
7.85k
          continue;
795
431
        default:
796
431
          *nextTokPtr = ptr;
797
431
          return XML_TOK_INVALID;
798
17.1k
        }
799
8.12k
        return PREFIX(scanAtts)(enc, ptr, end, nextTokPtr);
800
17.1k
      }
801
147
      return XML_TOK_PARTIAL;
802
9.41k
    }
803
9.49k
    case BT_GT:
804
9.72k
    gt:
805
9.72k
      *nextTokPtr = ptr + MINBPC(enc);
806
9.72k
      return XML_TOK_START_TAG_NO_ATTS;
807
1.56k
    case BT_SOL:
808
1.64k
    sol:
809
1.64k
      ptr += MINBPC(enc);
810
1.64k
      REQUIRE_CHAR(enc, ptr, end);
811
1.56k
      if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
812
212
        *nextTokPtr = ptr;
813
212
        return XML_TOK_INVALID;
814
212
      }
815
1.35k
      *nextTokPtr = ptr + MINBPC(enc);
816
1.35k
      return XML_TOK_EMPTY_ELEMENT_NO_ATTS;
817
442
    default:
818
442
      *nextTokPtr = ptr;
819
442
      return XML_TOK_INVALID;
820
68.1k
    }
821
68.1k
  }
822
176
  return XML_TOK_PARTIAL;
823
22.3k
}
xmltok.c:big2_scanLt
Line
Count
Source
729
7.02k
               const char **nextTokPtr) {
730
7.02k
#  ifdef XML_NS
731
7.02k
  int hadColon;
732
7.02k
#  endif
733
7.02k
  REQUIRE_CHAR(enc, ptr, end);
734
7.01k
  switch (BYTE_TYPE(enc, ptr)) {
735
4.74k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
736
173
  case BT_EXCL:
737
173
    ptr += MINBPC(enc);
738
173
    REQUIRE_CHAR(enc, ptr, end);
739
163
    switch (BYTE_TYPE(enc, ptr)) {
740
11
    case BT_MINUS:
741
11
      return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
742
32
    case BT_LSQB:
743
32
      return PREFIX(scanCdataSection)(enc, ptr + MINBPC(enc), end, nextTokPtr);
744
163
    }
745
120
    *nextTokPtr = ptr;
746
120
    return XML_TOK_INVALID;
747
173
  case BT_QUEST:
748
173
    return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
749
480
  case BT_SOL:
750
480
    return PREFIX(scanEndTag)(enc, ptr + MINBPC(enc), end, nextTokPtr);
751
51
  default:
752
51
    *nextTokPtr = ptr;
753
51
    return XML_TOK_INVALID;
754
7.01k
  }
755
6.05k
#  ifdef XML_NS
756
6.05k
  hadColon = 0;
757
6.05k
#  endif
758
  /* we have a start-tag */
759
351k
  while (HAS_CHAR(enc, ptr, end)) {
760
351k
    switch (BYTE_TYPE(enc, ptr)) {
761
2.03M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
762
0
#  ifdef XML_NS
763
178
    case BT_COLON:
764
178
      if (hadColon) {
765
10
        *nextTokPtr = ptr;
766
10
        return XML_TOK_INVALID;
767
10
      }
768
168
      hadColon = 1;
769
168
      ptr += MINBPC(enc);
770
168
      REQUIRE_CHAR(enc, ptr, end);
771
158
      switch (BYTE_TYPE(enc, ptr)) {
772
172
        CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
773
51
      default:
774
51
        *nextTokPtr = ptr;
775
51
        return XML_TOK_INVALID;
776
158
      }
777
48
      break;
778
48
#  endif
779
1.76k
    case BT_S:
780
1.80k
    case BT_CR:
781
1.92k
    case BT_LF: {
782
1.92k
      ptr += MINBPC(enc);
783
3.70k
      while (HAS_CHAR(enc, ptr, end)) {
784
3.70k
        switch (BYTE_TYPE(enc, ptr)) {
785
4.85k
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
786
107
        case BT_GT:
787
107
          goto gt;
788
10
        case BT_SOL:
789
10
          goto sol;
790
469
        case BT_S:
791
897
        case BT_CR:
792
1.80k
        case BT_LF:
793
1.80k
          ptr += MINBPC(enc);
794
1.80k
          continue;
795
70
        default:
796
70
          *nextTokPtr = ptr;
797
70
          return XML_TOK_INVALID;
798
3.70k
        }
799
1.63k
        return PREFIX(scanAtts)(enc, ptr, end, nextTokPtr);
800
3.70k
      }
801
20
      return XML_TOK_PARTIAL;
802
1.92k
    }
803
3.73k
    case BT_GT:
804
3.84k
    gt:
805
3.84k
      *nextTokPtr = ptr + MINBPC(enc);
806
3.84k
      return XML_TOK_START_TAG_NO_ATTS;
807
36
    case BT_SOL:
808
46
    sol:
809
46
      ptr += MINBPC(enc);
810
46
      REQUIRE_CHAR(enc, ptr, end);
811
36
      if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
812
26
        *nextTokPtr = ptr;
813
26
        return XML_TOK_INVALID;
814
26
      }
815
10
      *nextTokPtr = ptr + MINBPC(enc);
816
10
      return XML_TOK_EMPTY_ELEMENT_NO_ATTS;
817
78
    default:
818
78
      *nextTokPtr = ptr;
819
78
      return XML_TOK_INVALID;
820
351k
    }
821
351k
  }
822
41
  return XML_TOK_PARTIAL;
823
6.05k
}
824
825
static int PTRCALL
826
PREFIX(contentTok)(const ENCODING *enc, const char *ptr, const char *end,
827
212k
                   const char **nextTokPtr) {
828
212k
  if (ptr >= end)
829
617
    return XML_TOK_NONE;
830
211k
  if (MINBPC(enc) > 1) {
831
71.7k
    size_t n = end - ptr;
832
71.7k
    if (n & (MINBPC(enc) - 1)) {
833
30.6k
      n &= ~(MINBPC(enc) - 1);
834
30.6k
      if (n == 0)
835
369
        return XML_TOK_PARTIAL;
836
30.3k
      end = ptr + n;
837
30.3k
    }
838
71.7k
  }
839
211k
  switch (BYTE_TYPE(enc, ptr)) {
840
102k
  case BT_LT:
841
102k
    return PREFIX(scanLt)(enc, ptr + MINBPC(enc), end, nextTokPtr);
842
6.32k
  case BT_AMP:
843
6.32k
    return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
844
7.66k
  case BT_CR:
845
7.66k
    ptr += MINBPC(enc);
846
7.66k
    if (! HAS_CHAR(enc, ptr, end))
847
163
      return XML_TOK_TRAILING_CR;
848
7.50k
    if (BYTE_TYPE(enc, ptr) == BT_LF)
849
1.67k
      ptr += MINBPC(enc);
850
7.50k
    *nextTokPtr = ptr;
851
7.50k
    return XML_TOK_DATA_NEWLINE;
852
18.7k
  case BT_LF:
853
18.7k
    *nextTokPtr = ptr + MINBPC(enc);
854
18.7k
    return XML_TOK_DATA_NEWLINE;
855
967
  case BT_RSQB:
856
967
    ptr += MINBPC(enc);
857
967
    if (! HAS_CHAR(enc, ptr, end))
858
123
      return XML_TOK_TRAILING_RSQB;
859
844
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
860
219
      break;
861
625
    ptr += MINBPC(enc);
862
625
    if (! HAS_CHAR(enc, ptr, end))
863
160
      return XML_TOK_TRAILING_RSQB;
864
465
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
865
419
      ptr -= MINBPC(enc);
866
419
      break;
867
419
    }
868
46
    *nextTokPtr = ptr;
869
46
    return XML_TOK_INVALID;
870
18.6k
    INVALID_CASES(ptr, nextTokPtr)
871
64.8k
  default:
872
64.8k
    ptr += MINBPC(enc);
873
64.8k
    break;
874
211k
  }
875
1.16M
  while (HAS_CHAR(enc, ptr, end)) {
876
1.16M
    switch (BYTE_TYPE(enc, ptr)) {
877
0
#  define LEAD_CASE(n)                                                         \
878
42.8k
  case BT_LEAD##n:                                                             \
879
42.8k
    if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) {                       \
880
941
      *nextTokPtr = ptr;                                                       \
881
941
      return XML_TOK_DATA_CHARS;                                               \
882
941
    }                                                                          \
883
41.8k
    ptr += n;                                                                  \
884
41.8k
    break;
885
642
      LEAD_CASE(2)
886
5.09k
      LEAD_CASE(3)
887
37.0k
      LEAD_CASE(4)
888
0
#  undef LEAD_CASE
889
6.08k
    case BT_RSQB:
890
6.08k
      if (HAS_CHARS(enc, ptr, end, 2)) {
891
5.96k
        if (! CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_RSQB)) {
892
1.19k
          ptr += MINBPC(enc);
893
1.19k
          break;
894
1.19k
        }
895
4.76k
        if (HAS_CHARS(enc, ptr, end, 3)) {
896
4.62k
          if (! CHAR_MATCHES(enc, ptr + 2 * MINBPC(enc), ASCII_GT)) {
897
4.52k
            ptr += MINBPC(enc);
898
4.52k
            break;
899
4.52k
          }
900
94
          *nextTokPtr = ptr + 2 * MINBPC(enc);
901
94
          return XML_TOK_INVALID;
902
4.62k
        }
903
4.76k
      }
904
267
      EXPAT_FALLTHROUGH;
905
6.57k
    case BT_AMP:
906
60.6k
    case BT_LT:
907
61.6k
    case BT_NONXML:
908
61.7k
    case BT_MALFORM:
909
62.3k
    case BT_TRAIL:
910
65.6k
    case BT_CR:
911
70.4k
    case BT_LF:
912
70.4k
      *nextTokPtr = ptr;
913
70.4k
      return XML_TOK_DATA_CHARS;
914
1.04M
    default:
915
1.04M
      ptr += MINBPC(enc);
916
1.04M
      break;
917
1.16M
    }
918
1.16M
  }
919
968
  *nextTokPtr = ptr;
920
968
  return XML_TOK_DATA_CHARS;
921
72.4k
}
xmltok.c:normal_contentTok
Line
Count
Source
827
139k
                   const char **nextTokPtr) {
828
139k
  if (ptr >= end)
829
255
    return XML_TOK_NONE;
830
139k
  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
139k
  switch (BYTE_TYPE(enc, ptr)) {
840
67.9k
  case BT_LT:
841
67.9k
    return PREFIX(scanLt)(enc, ptr + MINBPC(enc), end, nextTokPtr);
842
2.44k
  case BT_AMP:
843
2.44k
    return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
844
2.61k
  case BT_CR:
845
2.61k
    ptr += MINBPC(enc);
846
2.61k
    if (! HAS_CHAR(enc, ptr, end))
847
64
      return XML_TOK_TRAILING_CR;
848
2.55k
    if (BYTE_TYPE(enc, ptr) == BT_LF)
849
48
      ptr += MINBPC(enc);
850
2.55k
    *nextTokPtr = ptr;
851
2.55k
    return XML_TOK_DATA_NEWLINE;
852
13.7k
  case BT_LF:
853
13.7k
    *nextTokPtr = ptr + MINBPC(enc);
854
13.7k
    return XML_TOK_DATA_NEWLINE;
855
358
  case BT_RSQB:
856
358
    ptr += MINBPC(enc);
857
358
    if (! HAS_CHAR(enc, ptr, end))
858
35
      return XML_TOK_TRAILING_RSQB;
859
323
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
860
82
      break;
861
241
    ptr += MINBPC(enc);
862
241
    if (! HAS_CHAR(enc, ptr, end))
863
96
      return XML_TOK_TRAILING_RSQB;
864
145
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
865
127
      ptr -= MINBPC(enc);
866
127
      break;
867
127
    }
868
18
    *nextTokPtr = ptr;
869
18
    return XML_TOK_INVALID;
870
2.81k
    INVALID_CASES(ptr, nextTokPtr)
871
50.8k
  default:
872
50.8k
    ptr += MINBPC(enc);
873
50.8k
    break;
874
139k
  }
875
384k
  while (HAS_CHAR(enc, ptr, end)) {
876
384k
    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
642
      LEAD_CASE(2)
886
5.09k
      LEAD_CASE(3)
887
477
      LEAD_CASE(4)
888
0
#  undef LEAD_CASE
889
4.69k
    case BT_RSQB:
890
4.69k
      if (HAS_CHARS(enc, ptr, end, 2)) {
891
4.66k
        if (! CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_RSQB)) {
892
418
          ptr += MINBPC(enc);
893
418
          break;
894
418
        }
895
4.24k
        if (HAS_CHARS(enc, ptr, end, 3)) {
896
4.15k
          if (! CHAR_MATCHES(enc, ptr + 2 * MINBPC(enc), ASCII_GT)) {
897
4.10k
            ptr += MINBPC(enc);
898
4.10k
            break;
899
4.10k
          }
900
50
          *nextTokPtr = ptr + 2 * MINBPC(enc);
901
50
          return XML_TOK_INVALID;
902
4.15k
        }
903
4.24k
      }
904
131
      EXPAT_FALLTHROUGH;
905
2.56k
    case BT_AMP:
906
48.1k
    case BT_LT:
907
48.3k
    case BT_NONXML:
908
48.4k
    case BT_MALFORM:
909
48.6k
    case BT_TRAIL:
910
49.1k
    case BT_CR:
911
50.1k
    case BT_LF:
912
50.1k
      *nextTokPtr = ptr;
913
50.1k
      return XML_TOK_DATA_CHARS;
914
323k
    default:
915
323k
      ptr += MINBPC(enc);
916
323k
      break;
917
384k
    }
918
384k
  }
919
249
  *nextTokPtr = ptr;
920
249
  return XML_TOK_DATA_CHARS;
921
51.2k
}
xmltok.c:little2_contentTok
Line
Count
Source
827
54.1k
                   const char **nextTokPtr) {
828
54.1k
  if (ptr >= end)
829
253
    return XML_TOK_NONE;
830
53.8k
  if (MINBPC(enc) > 1) {
831
53.8k
    size_t n = end - ptr;
832
53.8k
    if (n & (MINBPC(enc) - 1)) {
833
28.6k
      n &= ~(MINBPC(enc) - 1);
834
28.6k
      if (n == 0)
835
355
        return XML_TOK_PARTIAL;
836
28.2k
      end = ptr + n;
837
28.2k
    }
838
53.8k
  }
839
53.5k
  switch (BYTE_TYPE(enc, ptr)) {
840
27.2k
  case BT_LT:
841
27.2k
    return PREFIX(scanLt)(enc, ptr + MINBPC(enc), end, nextTokPtr);
842
2.90k
  case BT_AMP:
843
2.90k
    return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
844
2.95k
  case BT_CR:
845
2.95k
    ptr += MINBPC(enc);
846
2.95k
    if (! HAS_CHAR(enc, ptr, end))
847
81
      return XML_TOK_TRAILING_CR;
848
2.87k
    if (BYTE_TYPE(enc, ptr) == BT_LF)
849
712
      ptr += MINBPC(enc);
850
2.87k
    *nextTokPtr = ptr;
851
2.87k
    return XML_TOK_DATA_NEWLINE;
852
4.03k
  case BT_LF:
853
4.03k
    *nextTokPtr = ptr + MINBPC(enc);
854
4.03k
    return XML_TOK_DATA_NEWLINE;
855
463
  case BT_RSQB:
856
463
    ptr += MINBPC(enc);
857
463
    if (! HAS_CHAR(enc, ptr, end))
858
78
      return XML_TOK_TRAILING_RSQB;
859
385
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
860
99
      break;
861
286
    ptr += MINBPC(enc);
862
286
    if (! HAS_CHAR(enc, ptr, end))
863
54
      return XML_TOK_TRAILING_RSQB;
864
232
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
865
214
      ptr -= MINBPC(enc);
866
214
      break;
867
214
    }
868
18
    *nextTokPtr = ptr;
869
18
    return XML_TOK_INVALID;
870
10.5k
    INVALID_CASES(ptr, nextTokPtr)
871
10.1k
  default:
872
10.1k
    ptr += MINBPC(enc);
873
10.1k
    break;
874
53.5k
  }
875
270k
  while (HAS_CHAR(enc, ptr, end)) {
876
270k
    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
23.6k
      LEAD_CASE(4)
888
0
#  undef LEAD_CASE
889
641
    case BT_RSQB:
890
641
      if (HAS_CHARS(enc, ptr, end, 2)) {
891
563
        if (! CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_RSQB)) {
892
360
          ptr += MINBPC(enc);
893
360
          break;
894
360
        }
895
203
        if (HAS_CHARS(enc, ptr, end, 3)) {
896
165
          if (! CHAR_MATCHES(enc, ptr + 2 * MINBPC(enc), ASCII_GT)) {
897
131
            ptr += MINBPC(enc);
898
131
            break;
899
131
          }
900
34
          *nextTokPtr = ptr + 2 * MINBPC(enc);
901
34
          return XML_TOK_INVALID;
902
165
        }
903
203
      }
904
116
      EXPAT_FALLTHROUGH;
905
3.01k
    case BT_AMP:
906
8.81k
    case BT_LT:
907
9.29k
    case BT_NONXML:
908
9.29k
    case BT_MALFORM:
909
9.61k
    case BT_TRAIL:
910
10.8k
    case BT_CR:
911
14.3k
    case BT_LF:
912
14.3k
      *nextTokPtr = ptr;
913
14.3k
      return XML_TOK_DATA_CHARS;
914
231k
    default:
915
231k
      ptr += MINBPC(enc);
916
231k
      break;
917
270k
    }
918
270k
  }
919
596
  *nextTokPtr = ptr;
920
596
  return XML_TOK_DATA_CHARS;
921
15.1k
}
xmltok.c:big2_contentTok
Line
Count
Source
827
17.9k
                   const char **nextTokPtr) {
828
17.9k
  if (ptr >= end)
829
109
    return XML_TOK_NONE;
830
17.8k
  if (MINBPC(enc) > 1) {
831
17.8k
    size_t n = end - ptr;
832
17.8k
    if (n & (MINBPC(enc) - 1)) {
833
2.06k
      n &= ~(MINBPC(enc) - 1);
834
2.06k
      if (n == 0)
835
14
        return XML_TOK_PARTIAL;
836
2.05k
      end = ptr + n;
837
2.05k
    }
838
17.8k
  }
839
17.8k
  switch (BYTE_TYPE(enc, ptr)) {
840
7.02k
  case BT_LT:
841
7.02k
    return PREFIX(scanLt)(enc, ptr + MINBPC(enc), end, nextTokPtr);
842
974
  case BT_AMP:
843
974
    return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
844
2.09k
  case BT_CR:
845
2.09k
    ptr += MINBPC(enc);
846
2.09k
    if (! HAS_CHAR(enc, ptr, end))
847
18
      return XML_TOK_TRAILING_CR;
848
2.08k
    if (BYTE_TYPE(enc, ptr) == BT_LF)
849
915
      ptr += MINBPC(enc);
850
2.08k
    *nextTokPtr = ptr;
851
2.08k
    return XML_TOK_DATA_NEWLINE;
852
978
  case BT_LF:
853
978
    *nextTokPtr = ptr + MINBPC(enc);
854
978
    return XML_TOK_DATA_NEWLINE;
855
146
  case BT_RSQB:
856
146
    ptr += MINBPC(enc);
857
146
    if (! HAS_CHAR(enc, ptr, end))
858
10
      return XML_TOK_TRAILING_RSQB;
859
136
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
860
38
      break;
861
98
    ptr += MINBPC(enc);
862
98
    if (! HAS_CHAR(enc, ptr, end))
863
10
      return XML_TOK_TRAILING_RSQB;
864
88
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
865
78
      ptr -= MINBPC(enc);
866
78
      break;
867
78
    }
868
10
    *nextTokPtr = ptr;
869
10
    return XML_TOK_INVALID;
870
5.26k
    INVALID_CASES(ptr, nextTokPtr)
871
3.81k
  default:
872
3.81k
    ptr += MINBPC(enc);
873
3.81k
    break;
874
17.8k
  }
875
509k
  while (HAS_CHAR(enc, ptr, end)) {
876
509k
    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
12.9k
      LEAD_CASE(4)
888
0
#  undef LEAD_CASE
889
746
    case BT_RSQB:
890
746
      if (HAS_CHARS(enc, ptr, end, 2)) {
891
736
        if (! CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_RSQB)) {
892
420
          ptr += MINBPC(enc);
893
420
          break;
894
420
        }
895
316
        if (HAS_CHARS(enc, ptr, end, 3)) {
896
306
          if (! CHAR_MATCHES(enc, ptr + 2 * MINBPC(enc), ASCII_GT)) {
897
296
            ptr += MINBPC(enc);
898
296
            break;
899
296
          }
900
10
          *nextTokPtr = ptr + 2 * MINBPC(enc);
901
10
          return XML_TOK_INVALID;
902
306
        }
903
316
      }
904
20
      EXPAT_FALLTHROUGH;
905
994
    case BT_AMP:
906
3.65k
    case BT_LT:
907
3.97k
    case BT_NONXML:
908
3.97k
    case BT_MALFORM:
909
4.11k
    case BT_TRAIL:
910
5.70k
    case BT_CR:
911
5.98k
    case BT_LF:
912
5.98k
      *nextTokPtr = ptr;
913
5.98k
      return XML_TOK_DATA_CHARS;
914
489k
    default:
915
489k
      ptr += MINBPC(enc);
916
489k
      break;
917
509k
    }
918
509k
  }
919
123
  *nextTokPtr = ptr;
920
123
  return XML_TOK_DATA_CHARS;
921
6.13k
}
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
4.08k
                    const char **nextTokPtr) {
928
4.08k
  REQUIRE_CHAR(enc, ptr, end);
929
3.97k
  switch (BYTE_TYPE(enc, ptr)) {
930
4.75k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
931
141
  case BT_S:
932
247
  case BT_LF:
933
333
  case BT_CR:
934
439
  case BT_PERCNT:
935
439
    *nextTokPtr = ptr;
936
439
    return XML_TOK_PERCENT;
937
522
  default:
938
522
    *nextTokPtr = ptr;
939
522
    return XML_TOK_INVALID;
940
3.97k
  }
941
26.1k
  while (HAS_CHAR(enc, ptr, end)) {
942
26.1k
    switch (BYTE_TYPE(enc, ptr)) {
943
118k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
944
225
    case BT_SEMI:
945
225
      *nextTokPtr = ptr + MINBPC(enc);
946
225
      return XML_TOK_PARAM_ENTITY_REF;
947
618
    default:
948
618
      *nextTokPtr = ptr;
949
618
      return XML_TOK_INVALID;
950
26.1k
    }
951
26.1k
  }
952
234
  return XML_TOK_PARTIAL;
953
2.22k
}
xmltok.c:normal_scanPercent
Line
Count
Source
927
1.45k
                    const char **nextTokPtr) {
928
1.45k
  REQUIRE_CHAR(enc, ptr, end);
929
1.41k
  switch (BYTE_TYPE(enc, ptr)) {
930
1.18k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
931
71
  case BT_S:
932
105
  case BT_LF:
933
139
  case BT_CR:
934
209
  case BT_PERCNT:
935
209
    *nextTokPtr = ptr;
936
209
    return XML_TOK_PERCENT;
937
100
  default:
938
100
    *nextTokPtr = ptr;
939
100
    return XML_TOK_INVALID;
940
1.41k
  }
941
8.39k
  while (HAS_CHAR(enc, ptr, end)) {
942
8.39k
    switch (BYTE_TYPE(enc, ptr)) {
943
21.7k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
944
165
    case BT_SEMI:
945
165
      *nextTokPtr = ptr + MINBPC(enc);
946
165
      return XML_TOK_PARAM_ENTITY_REF;
947
126
    default:
948
126
      *nextTokPtr = ptr;
949
126
      return XML_TOK_INVALID;
950
8.39k
    }
951
8.39k
  }
952
80
  return XML_TOK_PARTIAL;
953
774
}
xmltok.c:little2_scanPercent
Line
Count
Source
927
1.28k
                    const char **nextTokPtr) {
928
1.28k
  REQUIRE_CHAR(enc, ptr, end);
929
1.24k
  switch (BYTE_TYPE(enc, ptr)) {
930
2.24k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
931
36
  case BT_S:
932
70
  case BT_LF:
933
88
  case BT_CR:
934
106
  case BT_PERCNT:
935
106
    *nextTokPtr = ptr;
936
106
    return XML_TOK_PERCENT;
937
202
  default:
938
202
    *nextTokPtr = ptr;
939
202
    return XML_TOK_INVALID;
940
1.24k
  }
941
7.80k
  while (HAS_CHAR(enc, ptr, end)) {
942
7.80k
    switch (BYTE_TYPE(enc, ptr)) {
943
42.3k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
944
22
    case BT_SEMI:
945
22
      *nextTokPtr = ptr + MINBPC(enc);
946
22
      return XML_TOK_PARAM_ENTITY_REF;
947
248
    default:
948
248
      *nextTokPtr = ptr;
949
248
      return XML_TOK_INVALID;
950
7.80k
    }
951
7.80k
  }
952
72
  return XML_TOK_PARTIAL;
953
726
}
xmltok.c:big2_scanPercent
Line
Count
Source
927
1.34k
                    const char **nextTokPtr) {
928
1.34k
  REQUIRE_CHAR(enc, ptr, end);
929
1.30k
  switch (BYTE_TYPE(enc, ptr)) {
930
1.32k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
931
34
  case BT_S:
932
72
  case BT_LF:
933
106
  case BT_CR:
934
124
  case BT_PERCNT:
935
124
    *nextTokPtr = ptr;
936
124
    return XML_TOK_PERCENT;
937
220
  default:
938
220
    *nextTokPtr = ptr;
939
220
    return XML_TOK_INVALID;
940
1.30k
  }
941
9.93k
  while (HAS_CHAR(enc, ptr, end)) {
942
9.93k
    switch (BYTE_TYPE(enc, ptr)) {
943
54.6k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
944
38
    case BT_SEMI:
945
38
      *nextTokPtr = ptr + MINBPC(enc);
946
38
      return XML_TOK_PARAM_ENTITY_REF;
947
244
    default:
948
244
      *nextTokPtr = ptr;
949
244
      return XML_TOK_INVALID;
950
9.93k
    }
951
9.93k
  }
952
82
  return XML_TOK_PARTIAL;
953
727
}
954
955
static int PTRCALL
956
PREFIX(scanPoundName)(const ENCODING *enc, const char *ptr, const char *end,
957
4.04k
                      const char **nextTokPtr) {
958
4.04k
  REQUIRE_CHAR(enc, ptr, end);
959
3.97k
  switch (BYTE_TYPE(enc, ptr)) {
960
5.26k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
961
585
  default:
962
585
    *nextTokPtr = ptr;
963
585
    return XML_TOK_INVALID;
964
3.97k
  }
965
102k
  while (HAS_CHAR(enc, ptr, end)) {
966
102k
    switch (BYTE_TYPE(enc, ptr)) {
967
298k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
968
102
    case BT_CR:
969
314
    case BT_LF:
970
453
    case BT_S:
971
573
    case BT_RPAR:
972
705
    case BT_GT:
973
811
    case BT_PERCNT:
974
881
    case BT_VERBAR:
975
881
      *nextTokPtr = ptr;
976
881
      return XML_TOK_POUND_NAME;
977
555
    default:
978
555
      *nextTokPtr = ptr;
979
555
      return XML_TOK_INVALID;
980
102k
    }
981
102k
  }
982
200
  return -XML_TOK_POUND_NAME;
983
2.59k
}
xmltok.c:normal_scanPoundName
Line
Count
Source
957
1.24k
                      const char **nextTokPtr) {
958
1.24k
  REQUIRE_CHAR(enc, ptr, end);
959
1.20k
  switch (BYTE_TYPE(enc, ptr)) {
960
1.00k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
961
74
  default:
962
74
    *nextTokPtr = ptr;
963
74
    return XML_TOK_INVALID;
964
1.20k
  }
965
59.4k
  while (HAS_CHAR(enc, ptr, end)) {
966
59.4k
    switch (BYTE_TYPE(enc, ptr)) {
967
52.0k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
968
34
    case BT_CR:
969
106
    case BT_LF:
970
145
    case BT_S:
971
179
    case BT_RPAR:
972
217
    case BT_GT:
973
251
    case BT_PERCNT:
974
289
    case BT_VERBAR:
975
289
      *nextTokPtr = ptr;
976
289
      return XML_TOK_POUND_NAME;
977
120
    default:
978
120
      *nextTokPtr = ptr;
979
120
      return XML_TOK_INVALID;
980
59.4k
    }
981
59.4k
  }
982
64
  return -XML_TOK_POUND_NAME;
983
791
}
xmltok.c:little2_scanPoundName
Line
Count
Source
957
1.30k
                      const char **nextTokPtr) {
958
1.30k
  REQUIRE_CHAR(enc, ptr, end);
959
1.28k
  switch (BYTE_TYPE(enc, ptr)) {
960
2.44k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
961
235
  default:
962
235
    *nextTokPtr = ptr;
963
235
    return XML_TOK_INVALID;
964
1.28k
  }
965
16.7k
  while (HAS_CHAR(enc, ptr, end)) {
966
16.7k
    switch (BYTE_TYPE(enc, ptr)) {
967
94.7k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
968
34
    case BT_CR:
969
68
    case BT_LF:
970
102
    case BT_S:
971
142
    case BT_RPAR:
972
186
    case BT_GT:
973
224
    case BT_PERCNT:
974
234
    case BT_VERBAR:
975
234
      *nextTokPtr = ptr;
976
234
      return XML_TOK_POUND_NAME;
977
202
    default:
978
202
      *nextTokPtr = ptr;
979
202
      return XML_TOK_INVALID;
980
16.7k
    }
981
16.7k
  }
982
88
  return -XML_TOK_POUND_NAME;
983
873
}
xmltok.c:big2_scanPoundName
Line
Count
Source
957
1.50k
                      const char **nextTokPtr) {
958
1.50k
  REQUIRE_CHAR(enc, ptr, end);
959
1.48k
  switch (BYTE_TYPE(enc, ptr)) {
960
1.80k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
961
276
  default:
962
276
    *nextTokPtr = ptr;
963
276
    return XML_TOK_INVALID;
964
1.48k
  }
965
26.5k
  while (HAS_CHAR(enc, ptr, end)) {
966
26.5k
    switch (BYTE_TYPE(enc, ptr)) {
967
151k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
968
34
    case BT_CR:
969
140
    case BT_LF:
970
206
    case BT_S:
971
252
    case BT_RPAR:
972
302
    case BT_GT:
973
336
    case BT_PERCNT:
974
358
    case BT_VERBAR:
975
358
      *nextTokPtr = ptr;
976
358
      return XML_TOK_POUND_NAME;
977
233
    default:
978
233
      *nextTokPtr = ptr;
979
233
      return XML_TOK_INVALID;
980
26.5k
    }
981
26.5k
  }
982
48
  return -XML_TOK_POUND_NAME;
983
935
}
984
985
static int PTRCALL
986
PREFIX(scanLit)(int open, const ENCODING *enc, const char *ptr, const char *end,
987
3.37k
                const char **nextTokPtr) {
988
152k
  while (HAS_CHAR(enc, ptr, end)) {
989
152k
    int t = BYTE_TYPE(enc, ptr);
990
152k
    switch (t) {
991
20.8k
      INVALID_CASES(ptr, nextTokPtr)
992
2.03k
    case BT_QUOT:
993
3.07k
    case BT_APOS:
994
3.07k
      ptr += MINBPC(enc);
995
3.07k
      if (t != open)
996
1.52k
        break;
997
1.55k
      if (! HAS_CHAR(enc, ptr, end))
998
94
        return -XML_TOK_LITERAL;
999
1.45k
      *nextTokPtr = ptr;
1000
1.45k
      switch (BYTE_TYPE(enc, ptr)) {
1001
252
      case BT_S:
1002
333
      case BT_CR:
1003
447
      case BT_LF:
1004
589
      case BT_GT:
1005
695
      case BT_PERCNT:
1006
752
      case BT_LSQB:
1007
752
        return XML_TOK_LITERAL;
1008
704
      default:
1009
704
        return XML_TOK_INVALID;
1010
1.45k
      }
1011
138k
    default:
1012
138k
      ptr += MINBPC(enc);
1013
138k
      break;
1014
152k
    }
1015
152k
  }
1016
201
  return XML_TOK_PARTIAL;
1017
3.37k
}
xmltok.c:normal_scanLit
Line
Count
Source
987
1.32k
                const char **nextTokPtr) {
988
56.7k
  while (HAS_CHAR(enc, ptr, end)) {
989
56.7k
    int t = BYTE_TYPE(enc, ptr);
990
56.7k
    switch (t) {
991
2.73k
      INVALID_CASES(ptr, nextTokPtr)
992
970
    case BT_QUOT:
993
1.30k
    case BT_APOS:
994
1.30k
      ptr += MINBPC(enc);
995
1.30k
      if (t != open)
996
801
        break;
997
504
      if (! HAS_CHAR(enc, ptr, end))
998
42
        return -XML_TOK_LITERAL;
999
462
      *nextTokPtr = ptr;
1000
462
      switch (BYTE_TYPE(enc, ptr)) {
1001
116
      case BT_S:
1002
126
      case BT_CR:
1003
204
      case BT_LF:
1004
270
      case BT_GT:
1005
348
      case BT_PERCNT:
1006
385
      case BT_LSQB:
1007
385
        return XML_TOK_LITERAL;
1008
77
      default:
1009
77
        return XML_TOK_INVALID;
1010
462
      }
1011
53.9k
    default:
1012
53.9k
      ptr += MINBPC(enc);
1013
53.9k
      break;
1014
56.7k
    }
1015
56.7k
  }
1016
80
  return XML_TOK_PARTIAL;
1017
1.32k
}
xmltok.c:little2_scanLit
Line
Count
Source
987
914
                const char **nextTokPtr) {
988
37.3k
  while (HAS_CHAR(enc, ptr, end)) {
989
37.3k
    int t = BYTE_TYPE(enc, ptr);
990
37.3k
    switch (t) {
991
8.58k
      INVALID_CASES(ptr, nextTokPtr)
992
518
    case BT_QUOT:
993
819
    case BT_APOS:
994
819
      ptr += MINBPC(enc);
995
819
      if (t != open)
996
337
        break;
997
482
      if (! HAS_CHAR(enc, ptr, end))
998
18
        return -XML_TOK_LITERAL;
999
464
      *nextTokPtr = ptr;
1000
464
      switch (BYTE_TYPE(enc, ptr)) {
1001
66
      case BT_S:
1002
100
      case BT_CR:
1003
118
      case BT_LF:
1004
160
      case BT_GT:
1005
170
      case BT_PERCNT:
1006
180
      case BT_LSQB:
1007
180
        return XML_TOK_LITERAL;
1008
284
      default:
1009
284
        return XML_TOK_INVALID;
1010
464
      }
1011
32.0k
    default:
1012
32.0k
      ptr += MINBPC(enc);
1013
32.0k
      break;
1014
37.3k
    }
1015
37.3k
  }
1016
81
  return XML_TOK_PARTIAL;
1017
914
}
xmltok.c:big2_scanLit
Line
Count
Source
987
1.13k
                const char **nextTokPtr) {
988
58.7k
  while (HAS_CHAR(enc, ptr, end)) {
989
58.7k
    int t = BYTE_TYPE(enc, ptr);
990
58.7k
    switch (t) {
991
9.49k
      INVALID_CASES(ptr, nextTokPtr)
992
543
    case BT_QUOT:
993
952
    case BT_APOS:
994
952
      ptr += MINBPC(enc);
995
952
      if (t != open)
996
388
        break;
997
564
      if (! HAS_CHAR(enc, ptr, end))
998
34
        return -XML_TOK_LITERAL;
999
530
      *nextTokPtr = ptr;
1000
530
      switch (BYTE_TYPE(enc, ptr)) {
1001
70
      case BT_S:
1002
107
      case BT_CR:
1003
125
      case BT_LF:
1004
159
      case BT_GT:
1005
177
      case BT_PERCNT:
1006
187
      case BT_LSQB:
1007
187
        return XML_TOK_LITERAL;
1008
343
      default:
1009
343
        return XML_TOK_INVALID;
1010
530
      }
1011
52.8k
    default:
1012
52.8k
      ptr += MINBPC(enc);
1013
52.8k
      break;
1014
58.7k
    }
1015
58.7k
  }
1016
40
  return XML_TOK_PARTIAL;
1017
1.13k
}
1018
1019
static int PTRCALL
1020
PREFIX(prologTok)(const ENCODING *enc, const char *ptr, const char *end,
1021
117k
                  const char **nextTokPtr) {
1022
117k
  int tok;
1023
117k
  if (ptr >= end)
1024
2.63k
    return XML_TOK_NONE;
1025
115k
  if (MINBPC(enc) > 1) {
1026
55.8k
    size_t n = end - ptr;
1027
55.8k
    if (n & (MINBPC(enc) - 1)) {
1028
21.4k
      n &= ~(MINBPC(enc) - 1);
1029
21.4k
      if (n == 0)
1030
177
        return XML_TOK_PARTIAL;
1031
21.2k
      end = ptr + n;
1032
21.2k
    }
1033
55.8k
  }
1034
115k
  switch (BYTE_TYPE(enc, ptr)) {
1035
2.29k
  case BT_QUOT:
1036
2.29k
    return PREFIX(scanLit)(BT_QUOT, enc, ptr + MINBPC(enc), end, nextTokPtr);
1037
1.07k
  case BT_APOS:
1038
1.07k
    return PREFIX(scanLit)(BT_APOS, enc, ptr + MINBPC(enc), end, nextTokPtr);
1039
66.3k
  case BT_LT: {
1040
66.3k
    ptr += MINBPC(enc);
1041
66.3k
    REQUIRE_CHAR(enc, ptr, end);
1042
66.1k
    switch (BYTE_TYPE(enc, ptr)) {
1043
9.62k
    case BT_EXCL:
1044
9.62k
      return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1045
10.6k
    case BT_QUEST:
1046
10.6k
      return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1047
33.9k
    case BT_NMSTRT:
1048
36.6k
    case BT_HEX:
1049
44.1k
    case BT_NONASCII:
1050
44.5k
    case BT_LEAD2:
1051
44.6k
    case BT_LEAD3:
1052
45.1k
    case BT_LEAD4:
1053
45.1k
      *nextTokPtr = ptr - MINBPC(enc);
1054
45.1k
      return XML_TOK_INSTANCE_START;
1055
66.1k
    }
1056
719
    *nextTokPtr = ptr;
1057
719
    return XML_TOK_INVALID;
1058
66.1k
  }
1059
2.83k
  case BT_CR:
1060
2.83k
    if (ptr + MINBPC(enc) == end) {
1061
468
      *nextTokPtr = end;
1062
      /* indicate that this might be part of a CR/LF pair */
1063
468
      return -XML_TOK_PROLOG_S;
1064
468
    }
1065
2.36k
    EXPAT_FALLTHROUGH;
1066
15.4k
  case BT_S:
1067
17.5k
  case BT_LF:
1068
1.86M
    for (;;) {
1069
1.86M
      ptr += MINBPC(enc);
1070
1.86M
      if (! HAS_CHAR(enc, ptr, end))
1071
2.32k
        break;
1072
1.86M
      switch (BYTE_TYPE(enc, ptr)) {
1073
1.82M
      case BT_S:
1074
1.84M
      case BT_LF:
1075
1.84M
        break;
1076
8.94k
      case BT_CR:
1077
        /* don't split CR/LF pair */
1078
8.94k
        if (ptr + MINBPC(enc) != end)
1079
8.80k
          break;
1080
133
        EXPAT_FALLTHROUGH;
1081
15.2k
      default:
1082
15.2k
        *nextTokPtr = ptr;
1083
15.2k
        return XML_TOK_PROLOG_S;
1084
1.86M
      }
1085
1.86M
    }
1086
2.32k
    *nextTokPtr = ptr;
1087
2.32k
    return XML_TOK_PROLOG_S;
1088
4.08k
  case BT_PERCNT:
1089
4.08k
    return PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1090
202
  case BT_COMMA:
1091
202
    *nextTokPtr = ptr + MINBPC(enc);
1092
202
    return XML_TOK_COMMA;
1093
867
  case BT_LSQB:
1094
867
    *nextTokPtr = ptr + MINBPC(enc);
1095
867
    return XML_TOK_OPEN_BRACKET;
1096
752
  case BT_RSQB:
1097
752
    ptr += MINBPC(enc);
1098
752
    if (! HAS_CHAR(enc, ptr, end))
1099
77
      return -XML_TOK_CLOSE_BRACKET;
1100
675
    if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) {
1101
342
      REQUIRE_CHARS(enc, ptr, end, 2);
1102
288
      if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_GT)) {
1103
56
        *nextTokPtr = ptr + 2 * MINBPC(enc);
1104
56
        return XML_TOK_COND_SECT_CLOSE;
1105
56
      }
1106
288
    }
1107
565
    *nextTokPtr = ptr;
1108
565
    return XML_TOK_CLOSE_BRACKET;
1109
245
  case BT_LPAR:
1110
245
    *nextTokPtr = ptr + MINBPC(enc);
1111
245
    return XML_TOK_OPEN_PAREN;
1112
1.60k
  case BT_RPAR:
1113
1.60k
    ptr += MINBPC(enc);
1114
1.60k
    if (! HAS_CHAR(enc, ptr, end))
1115
66
      return -XML_TOK_CLOSE_PAREN;
1116
1.53k
    switch (BYTE_TYPE(enc, ptr)) {
1117
113
    case BT_AST:
1118
113
      *nextTokPtr = ptr + MINBPC(enc);
1119
113
      return XML_TOK_CLOSE_PAREN_ASTERISK;
1120
70
    case BT_QUEST:
1121
70
      *nextTokPtr = ptr + MINBPC(enc);
1122
70
      return XML_TOK_CLOSE_PAREN_QUESTION;
1123
86
    case BT_PLUS:
1124
86
      *nextTokPtr = ptr + MINBPC(enc);
1125
86
      return XML_TOK_CLOSE_PAREN_PLUS;
1126
71
    case BT_CR:
1127
161
    case BT_LF:
1128
350
    case BT_S:
1129
420
    case BT_GT:
1130
478
    case BT_COMMA:
1131
508
    case BT_VERBAR:
1132
591
    case BT_RPAR:
1133
591
      *nextTokPtr = ptr;
1134
591
      return XML_TOK_CLOSE_PAREN;
1135
1.53k
    }
1136
679
    *nextTokPtr = ptr;
1137
679
    return XML_TOK_INVALID;
1138
181
  case BT_VERBAR:
1139
181
    *nextTokPtr = ptr + MINBPC(enc);
1140
181
    return XML_TOK_OR;
1141
834
  case BT_GT:
1142
834
    *nextTokPtr = ptr + MINBPC(enc);
1143
834
    return XML_TOK_DECL_CLOSE;
1144
4.04k
  case BT_NUM:
1145
4.04k
    return PREFIX(scanPoundName)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1146
0
#  define LEAD_CASE(n)                                                         \
1147
1.46k
  case BT_LEAD##n:                                                             \
1148
1.46k
    if (end - ptr < n)                                                         \
1149
621
      return XML_TOK_PARTIAL_CHAR;                                             \
1150
1.23k
    if (IS_INVALID_CHAR(enc, ptr, n)) {                                        \
1151
407
      *nextTokPtr = ptr;                                                       \
1152
407
      return XML_TOK_INVALID;                                                  \
1153
407
    }                                                                          \
1154
1.23k
    if (IS_NMSTRT_CHAR(enc, ptr, n)) {                                         \
1155
105
      ptr += n;                                                                \
1156
105
      tok = XML_TOK_NAME;                                                      \
1157
105
      break;                                                                   \
1158
105
    }                                                                          \
1159
823
    if (IS_NAME_CHAR(enc, ptr, n)) {                                           \
1160
97
      ptr += n;                                                                \
1161
97
      tok = XML_TOK_NMTOKEN;                                                   \
1162
97
      break;                                                                   \
1163
97
    }                                                                          \
1164
718
    *nextTokPtr = ptr;                                                         \
1165
621
    return XML_TOK_INVALID;
1166
1.24k
    LEAD_CASE(2)
1167
613
    LEAD_CASE(3)
1168
2.38k
    LEAD_CASE(4)
1169
0
#  undef LEAD_CASE
1170
3.97k
  case BT_NMSTRT:
1171
6.55k
  case BT_HEX:
1172
6.55k
    tok = XML_TOK_NAME;
1173
6.55k
    ptr += MINBPC(enc);
1174
6.55k
    break;
1175
1.56k
  case BT_DIGIT:
1176
1.85k
  case BT_NAME:
1177
2.25k
  case BT_MINUS:
1178
2.25k
#  ifdef XML_NS
1179
2.65k
  case BT_COLON:
1180
2.65k
#  endif
1181
2.65k
    tok = XML_TOK_NMTOKEN;
1182
2.65k
    ptr += MINBPC(enc);
1183
2.65k
    break;
1184
2.09k
  case BT_NONASCII:
1185
2.09k
    if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {
1186
1.49k
      ptr += MINBPC(enc);
1187
1.49k
      tok = XML_TOK_NAME;
1188
1.49k
      break;
1189
1.49k
    }
1190
601
    if (IS_NAME_CHAR_MINBPC(enc, ptr)) {
1191
194
      ptr += MINBPC(enc);
1192
194
      tok = XML_TOK_NMTOKEN;
1193
194
      break;
1194
194
    }
1195
407
    EXPAT_FALLTHROUGH;
1196
2.23k
  default:
1197
2.23k
    *nextTokPtr = ptr;
1198
2.23k
    return XML_TOK_INVALID;
1199
115k
  }
1200
132k
  while (HAS_CHAR(enc, ptr, end)) {
1201
132k
    switch (BYTE_TYPE(enc, ptr)) {
1202
521k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1203
500
    case BT_GT:
1204
755
    case BT_RPAR:
1205
931
    case BT_COMMA:
1206
1.08k
    case BT_VERBAR:
1207
1.93k
    case BT_LSQB:
1208
2.17k
    case BT_PERCNT:
1209
3.19k
    case BT_S:
1210
3.45k
    case BT_CR:
1211
3.95k
    case BT_LF:
1212
3.95k
      *nextTokPtr = ptr;
1213
3.95k
      return tok;
1214
0
#  ifdef XML_NS
1215
7.27k
    case BT_COLON:
1216
7.27k
      ptr += MINBPC(enc);
1217
7.27k
      switch (tok) {
1218
2.00k
      case XML_TOK_NAME:
1219
2.00k
        REQUIRE_CHAR(enc, ptr, end);
1220
1.94k
        tok = XML_TOK_PREFIXED_NAME;
1221
1.94k
        switch (BYTE_TYPE(enc, ptr)) {
1222
3.74k
          CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1223
342
        default:
1224
342
          tok = XML_TOK_NMTOKEN;
1225
342
          break;
1226
1.94k
        }
1227
1.26k
        break;
1228
1.26k
      case XML_TOK_PREFIXED_NAME:
1229
158
        tok = XML_TOK_NMTOKEN;
1230
158
        break;
1231
7.27k
      }
1232
6.52k
      break;
1233
6.52k
#  endif
1234
6.52k
    case BT_PLUS:
1235
284
      if (tok == XML_TOK_NMTOKEN) {
1236
112
        *nextTokPtr = ptr;
1237
112
        return XML_TOK_INVALID;
1238
112
      }
1239
172
      *nextTokPtr = ptr + MINBPC(enc);
1240
172
      return XML_TOK_NAME_PLUS;
1241
341
    case BT_AST:
1242
341
      if (tok == XML_TOK_NMTOKEN) {
1243
111
        *nextTokPtr = ptr;
1244
111
        return XML_TOK_INVALID;
1245
111
      }
1246
230
      *nextTokPtr = ptr + MINBPC(enc);
1247
230
      return XML_TOK_NAME_ASTERISK;
1248
275
    case BT_QUEST:
1249
275
      if (tok == XML_TOK_NMTOKEN) {
1250
134
        *nextTokPtr = ptr;
1251
134
        return XML_TOK_INVALID;
1252
134
      }
1253
141
      *nextTokPtr = ptr + MINBPC(enc);
1254
141
      return XML_TOK_NAME_QUESTION;
1255
2.76k
    default:
1256
2.76k
      *nextTokPtr = ptr;
1257
2.76k
      return XML_TOK_INVALID;
1258
132k
    }
1259
132k
  }
1260
554
  return -tok;
1261
11.0k
}
xmltok.c:normal_prologTok
Line
Count
Source
1021
62.0k
                  const char **nextTokPtr) {
1022
62.0k
  int tok;
1023
62.0k
  if (ptr >= end)
1024
2.56k
    return XML_TOK_NONE;
1025
59.4k
  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
59.4k
  switch (BYTE_TYPE(enc, ptr)) {
1035
1.00k
  case BT_QUOT:
1036
1.00k
    return PREFIX(scanLit)(BT_QUOT, enc, ptr + MINBPC(enc), end, nextTokPtr);
1037
324
  case BT_APOS:
1038
324
    return PREFIX(scanLit)(BT_APOS, enc, ptr + MINBPC(enc), end, nextTokPtr);
1039
32.4k
  case BT_LT: {
1040
32.4k
    ptr += MINBPC(enc);
1041
32.4k
    REQUIRE_CHAR(enc, ptr, end);
1042
32.3k
    switch (BYTE_TYPE(enc, ptr)) {
1043
4.84k
    case BT_EXCL:
1044
4.84k
      return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1045
7.84k
    case BT_QUEST:
1046
7.84k
      return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1047
18.0k
    case BT_NMSTRT:
1048
18.6k
    case BT_HEX:
1049
18.6k
    case BT_NONASCII:
1050
19.0k
    case BT_LEAD2:
1051
19.2k
    case BT_LEAD3:
1052
19.3k
    case BT_LEAD4:
1053
19.3k
      *nextTokPtr = ptr - MINBPC(enc);
1054
19.3k
      return XML_TOK_INSTANCE_START;
1055
32.3k
    }
1056
303
    *nextTokPtr = ptr;
1057
303
    return XML_TOK_INVALID;
1058
32.3k
  }
1059
414
  case BT_CR:
1060
414
    if (ptr + MINBPC(enc) == end) {
1061
72
      *nextTokPtr = end;
1062
      /* indicate that this might be part of a CR/LF pair */
1063
72
      return -XML_TOK_PROLOG_S;
1064
72
    }
1065
342
    EXPAT_FALLTHROUGH;
1066
11.9k
  case BT_S:
1067
13.1k
  case BT_LF:
1068
1.85M
    for (;;) {
1069
1.85M
      ptr += MINBPC(enc);
1070
1.85M
      if (! HAS_CHAR(enc, ptr, end))
1071
2.19k
        break;
1072
1.85M
      switch (BYTE_TYPE(enc, ptr)) {
1073
1.82M
      case BT_S:
1074
1.83M
      case BT_LF:
1075
1.83M
        break;
1076
6.81k
      case BT_CR:
1077
        /* don't split CR/LF pair */
1078
6.81k
        if (ptr + MINBPC(enc) != end)
1079
6.74k
          break;
1080
72
        EXPAT_FALLTHROUGH;
1081
10.9k
      default:
1082
10.9k
        *nextTokPtr = ptr;
1083
10.9k
        return XML_TOK_PROLOG_S;
1084
1.85M
      }
1085
1.85M
    }
1086
2.19k
    *nextTokPtr = ptr;
1087
2.19k
    return XML_TOK_PROLOG_S;
1088
1.45k
  case BT_PERCNT:
1089
1.45k
    return PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1090
70
  case BT_COMMA:
1091
70
    *nextTokPtr = ptr + MINBPC(enc);
1092
70
    return XML_TOK_COMMA;
1093
759
  case BT_LSQB:
1094
759
    *nextTokPtr = ptr + MINBPC(enc);
1095
759
    return XML_TOK_OPEN_BRACKET;
1096
321
  case BT_RSQB:
1097
321
    ptr += MINBPC(enc);
1098
321
    if (! HAS_CHAR(enc, ptr, end))
1099
38
      return -XML_TOK_CLOSE_BRACKET;
1100
283
    if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) {
1101
150
      REQUIRE_CHARS(enc, ptr, end, 2);
1102
132
      if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_GT)) {
1103
36
        *nextTokPtr = ptr + 2 * MINBPC(enc);
1104
36
        return XML_TOK_COND_SECT_CLOSE;
1105
36
      }
1106
132
    }
1107
229
    *nextTokPtr = ptr;
1108
229
    return XML_TOK_CLOSE_BRACKET;
1109
73
  case BT_LPAR:
1110
73
    *nextTokPtr = ptr + MINBPC(enc);
1111
73
    return XML_TOK_OPEN_PAREN;
1112
482
  case BT_RPAR:
1113
482
    ptr += MINBPC(enc);
1114
482
    if (! HAS_CHAR(enc, ptr, end))
1115
38
      return -XML_TOK_CLOSE_PAREN;
1116
444
    switch (BYTE_TYPE(enc, ptr)) {
1117
36
    case BT_AST:
1118
36
      *nextTokPtr = ptr + MINBPC(enc);
1119
36
      return XML_TOK_CLOSE_PAREN_ASTERISK;
1120
34
    case BT_QUEST:
1121
34
      *nextTokPtr = ptr + MINBPC(enc);
1122
34
      return XML_TOK_CLOSE_PAREN_QUESTION;
1123
34
    case BT_PLUS:
1124
34
      *nextTokPtr = ptr + MINBPC(enc);
1125
34
      return XML_TOK_CLOSE_PAREN_PLUS;
1126
34
    case BT_CR:
1127
68
    case BT_LF:
1128
145
    case BT_S:
1129
179
    case BT_GT:
1130
201
    case BT_COMMA:
1131
211
    case BT_VERBAR:
1132
250
    case BT_RPAR:
1133
250
      *nextTokPtr = ptr;
1134
250
      return XML_TOK_CLOSE_PAREN;
1135
444
    }
1136
90
    *nextTokPtr = ptr;
1137
90
    return XML_TOK_INVALID;
1138
66
  case BT_VERBAR:
1139
66
    *nextTokPtr = ptr + MINBPC(enc);
1140
66
    return XML_TOK_OR;
1141
642
  case BT_GT:
1142
642
    *nextTokPtr = ptr + MINBPC(enc);
1143
642
    return XML_TOK_DECL_CLOSE;
1144
1.24k
  case BT_NUM:
1145
1.24k
    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.24k
    LEAD_CASE(2)
1167
613
    LEAD_CASE(3)
1168
346
    LEAD_CASE(4)
1169
0
#  undef LEAD_CASE
1170
2.30k
  case BT_NMSTRT:
1171
4.30k
  case BT_HEX:
1172
4.30k
    tok = XML_TOK_NAME;
1173
4.30k
    ptr += MINBPC(enc);
1174
4.30k
    break;
1175
1.24k
  case BT_DIGIT:
1176
1.32k
  case BT_NAME:
1177
1.46k
  case BT_MINUS:
1178
1.46k
#  ifdef XML_NS
1179
1.70k
  case BT_COLON:
1180
1.70k
#  endif
1181
1.70k
    tok = XML_TOK_NMTOKEN;
1182
1.70k
    ptr += MINBPC(enc);
1183
1.70k
    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
494
  default:
1197
494
    *nextTokPtr = ptr;
1198
494
    return XML_TOK_INVALID;
1199
59.4k
  }
1200
80.2k
  while (HAS_CHAR(enc, ptr, end)) {
1201
80.2k
    switch (BYTE_TYPE(enc, ptr)) {
1202
241k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1203
419
    case BT_GT:
1204
569
    case BT_RPAR:
1205
641
    case BT_COMMA:
1206
722
    case BT_VERBAR:
1207
1.48k
    case BT_LSQB:
1208
1.61k
    case BT_PERCNT:
1209
2.47k
    case BT_S:
1210
2.58k
    case BT_CR:
1211
2.81k
    case BT_LF:
1212
2.81k
      *nextTokPtr = ptr;
1213
2.81k
      return tok;
1214
0
#  ifdef XML_NS
1215
6.39k
    case BT_COLON:
1216
6.39k
      ptr += MINBPC(enc);
1217
6.39k
      switch (tok) {
1218
1.24k
      case XML_TOK_NAME:
1219
1.24k
        REQUIRE_CHAR(enc, ptr, end);
1220
1.20k
        tok = XML_TOK_PREFIXED_NAME;
1221
1.20k
        switch (BYTE_TYPE(enc, ptr)) {
1222
2.47k
          CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1223
127
        default:
1224
127
          tok = XML_TOK_NMTOKEN;
1225
127
          break;
1226
1.20k
        }
1227
778
        break;
1228
778
      case XML_TOK_PREFIXED_NAME:
1229
124
        tok = XML_TOK_NMTOKEN;
1230
124
        break;
1231
6.39k
      }
1232
5.92k
      break;
1233
5.92k
#  endif
1234
5.92k
    case BT_PLUS:
1235
156
      if (tok == XML_TOK_NMTOKEN) {
1236
68
        *nextTokPtr = ptr;
1237
68
        return XML_TOK_INVALID;
1238
68
      }
1239
88
      *nextTokPtr = ptr + MINBPC(enc);
1240
88
      return XML_TOK_NAME_PLUS;
1241
197
    case BT_AST:
1242
197
      if (tok == XML_TOK_NMTOKEN) {
1243
75
        *nextTokPtr = ptr;
1244
75
        return XML_TOK_INVALID;
1245
75
      }
1246
122
      *nextTokPtr = ptr + MINBPC(enc);
1247
122
      return XML_TOK_NAME_ASTERISK;
1248
167
    case BT_QUEST:
1249
167
      if (tok == XML_TOK_NMTOKEN) {
1250
98
        *nextTokPtr = ptr;
1251
98
        return XML_TOK_INVALID;
1252
98
      }
1253
69
      *nextTokPtr = ptr + MINBPC(enc);
1254
69
      return XML_TOK_NAME_QUESTION;
1255
1.41k
    default:
1256
1.41k
      *nextTokPtr = ptr;
1257
1.41k
      return XML_TOK_INVALID;
1258
80.2k
    }
1259
80.2k
  }
1260
203
  return -tok;
1261
6.21k
}
xmltok.c:little2_prologTok
Line
Count
Source
1021
39.2k
                  const char **nextTokPtr) {
1022
39.2k
  int tok;
1023
39.2k
  if (ptr >= end)
1024
10
    return XML_TOK_NONE;
1025
39.2k
  if (MINBPC(enc) > 1) {
1026
39.2k
    size_t n = end - ptr;
1027
39.2k
    if (n & (MINBPC(enc) - 1)) {
1028
18.7k
      n &= ~(MINBPC(enc) - 1);
1029
18.7k
      if (n == 0)
1030
136
        return XML_TOK_PARTIAL;
1031
18.6k
      end = ptr + n;
1032
18.6k
    }
1033
39.2k
  }
1034
39.1k
  switch (BYTE_TYPE(enc, ptr)) {
1035
631
  case BT_QUOT:
1036
631
    return PREFIX(scanLit)(BT_QUOT, enc, ptr + MINBPC(enc), end, nextTokPtr);
1037
283
  case BT_APOS:
1038
283
    return PREFIX(scanLit)(BT_APOS, enc, ptr + MINBPC(enc), end, nextTokPtr);
1039
28.3k
  case BT_LT: {
1040
28.3k
    ptr += MINBPC(enc);
1041
28.3k
    REQUIRE_CHAR(enc, ptr, end);
1042
28.2k
    switch (BYTE_TYPE(enc, ptr)) {
1043
4.06k
    case BT_EXCL:
1044
4.06k
      return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1045
2.32k
    case BT_QUEST:
1046
2.32k
      return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1047
13.3k
    case BT_NMSTRT:
1048
13.7k
    case BT_HEX:
1049
21.1k
    case BT_NONASCII:
1050
21.1k
    case BT_LEAD2:
1051
21.1k
    case BT_LEAD3:
1052
21.4k
    case BT_LEAD4:
1053
21.4k
      *nextTokPtr = ptr - MINBPC(enc);
1054
21.4k
      return XML_TOK_INSTANCE_START;
1055
28.2k
    }
1056
363
    *nextTokPtr = ptr;
1057
363
    return XML_TOK_INVALID;
1058
28.2k
  }
1059
1.69k
  case BT_CR:
1060
1.69k
    if (ptr + MINBPC(enc) == end) {
1061
371
      *nextTokPtr = end;
1062
      /* indicate that this might be part of a CR/LF pair */
1063
371
      return -XML_TOK_PROLOG_S;
1064
371
    }
1065
1.32k
    EXPAT_FALLTHROUGH;
1066
1.77k
  case BT_S:
1067
2.19k
  case BT_LF:
1068
6.66k
    for (;;) {
1069
6.66k
      ptr += MINBPC(enc);
1070
6.66k
      if (! HAS_CHAR(enc, ptr, end))
1071
60
        break;
1072
6.60k
      switch (BYTE_TYPE(enc, ptr)) {
1073
1.43k
      case BT_S:
1074
3.12k
      case BT_LF:
1075
3.12k
        break;
1076
1.38k
      case BT_CR:
1077
        /* don't split CR/LF pair */
1078
1.38k
        if (ptr + MINBPC(enc) != end)
1079
1.34k
          break;
1080
39
        EXPAT_FALLTHROUGH;
1081
2.13k
      default:
1082
2.13k
        *nextTokPtr = ptr;
1083
2.13k
        return XML_TOK_PROLOG_S;
1084
6.60k
      }
1085
6.60k
    }
1086
60
    *nextTokPtr = ptr;
1087
60
    return XML_TOK_PROLOG_S;
1088
1.28k
  case BT_PERCNT:
1089
1.28k
    return PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1090
66
  case BT_COMMA:
1091
66
    *nextTokPtr = ptr + MINBPC(enc);
1092
66
    return XML_TOK_COMMA;
1093
42
  case BT_LSQB:
1094
42
    *nextTokPtr = ptr + MINBPC(enc);
1095
42
    return XML_TOK_OPEN_BRACKET;
1096
214
  case BT_RSQB:
1097
214
    ptr += MINBPC(enc);
1098
214
    if (! HAS_CHAR(enc, ptr, end))
1099
18
      return -XML_TOK_CLOSE_BRACKET;
1100
196
    if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) {
1101
96
      REQUIRE_CHARS(enc, ptr, end, 2);
1102
78
      if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_GT)) {
1103
10
        *nextTokPtr = ptr + 2 * MINBPC(enc);
1104
10
        return XML_TOK_COND_SECT_CLOSE;
1105
10
      }
1106
78
    }
1107
168
    *nextTokPtr = ptr;
1108
168
    return XML_TOK_CLOSE_BRACKET;
1109
74
  case BT_LPAR:
1110
74
    *nextTokPtr = ptr + MINBPC(enc);
1111
74
    return XML_TOK_OPEN_PAREN;
1112
500
  case BT_RPAR:
1113
500
    ptr += MINBPC(enc);
1114
500
    if (! HAS_CHAR(enc, ptr, end))
1115
10
      return -XML_TOK_CLOSE_PAREN;
1116
490
    switch (BYTE_TYPE(enc, ptr)) {
1117
38
    case BT_AST:
1118
38
      *nextTokPtr = ptr + MINBPC(enc);
1119
38
      return XML_TOK_CLOSE_PAREN_ASTERISK;
1120
18
    case BT_QUEST:
1121
18
      *nextTokPtr = ptr + MINBPC(enc);
1122
18
      return XML_TOK_CLOSE_PAREN_QUESTION;
1123
18
    case BT_PLUS:
1124
18
      *nextTokPtr = ptr + MINBPC(enc);
1125
18
      return XML_TOK_CLOSE_PAREN_PLUS;
1126
18
    case BT_CR:
1127
56
    case BT_LF:
1128
94
    case BT_S:
1129
112
    case BT_GT:
1130
130
    case BT_COMMA:
1131
140
    case BT_VERBAR:
1132
150
    case BT_RPAR:
1133
150
      *nextTokPtr = ptr;
1134
150
      return XML_TOK_CLOSE_PAREN;
1135
490
    }
1136
266
    *nextTokPtr = ptr;
1137
266
    return XML_TOK_INVALID;
1138
66
  case BT_VERBAR:
1139
66
    *nextTokPtr = ptr + MINBPC(enc);
1140
66
    return XML_TOK_OR;
1141
117
  case BT_GT:
1142
117
    *nextTokPtr = ptr + MINBPC(enc);
1143
117
    return XML_TOK_DECL_CLOSE;
1144
1.30k
  case BT_NUM:
1145
1.30k
    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
1.17k
    LEAD_CASE(4)
1169
0
#  undef LEAD_CASE
1170
574
  case BT_NMSTRT:
1171
705
  case BT_HEX:
1172
705
    tok = XML_TOK_NAME;
1173
705
    ptr += MINBPC(enc);
1174
705
    break;
1175
198
  case BT_DIGIT:
1176
318
  case BT_NAME:
1177
438
  case BT_MINUS:
1178
438
#  ifdef XML_NS
1179
489
  case BT_COLON:
1180
489
#  endif
1181
489
    tok = XML_TOK_NMTOKEN;
1182
489
    ptr += MINBPC(enc);
1183
489
    break;
1184
1.56k
  case BT_NONASCII:
1185
1.56k
    if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {
1186
1.18k
      ptr += MINBPC(enc);
1187
1.18k
      tok = XML_TOK_NAME;
1188
1.18k
      break;
1189
1.18k
    }
1190
385
    if (IS_NAME_CHAR_MINBPC(enc, ptr)) {
1191
110
      ptr += MINBPC(enc);
1192
110
      tok = XML_TOK_NMTOKEN;
1193
110
      break;
1194
110
    }
1195
275
    EXPAT_FALLTHROUGH;
1196
798
  default:
1197
798
    *nextTokPtr = ptr;
1198
798
    return XML_TOK_INVALID;
1199
39.1k
  }
1200
19.0k
  while (HAS_CHAR(enc, ptr, end)) {
1201
19.0k
    switch (BYTE_TYPE(enc, ptr)) {
1202
97.1k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1203
42
    case BT_GT:
1204
76
    case BT_RPAR:
1205
114
    case BT_COMMA:
1206
152
    case BT_VERBAR:
1207
199
    case BT_LSQB:
1208
233
    case BT_PERCNT:
1209
310
    case BT_S:
1210
392
    case BT_CR:
1211
496
    case BT_LF:
1212
496
      *nextTokPtr = ptr;
1213
496
      return tok;
1214
0
#  ifdef XML_NS
1215
449
    case BT_COLON:
1216
449
      ptr += MINBPC(enc);
1217
449
      switch (tok) {
1218
389
      case XML_TOK_NAME:
1219
389
        REQUIRE_CHAR(enc, ptr, end);
1220
379
        tok = XML_TOK_PREFIXED_NAME;
1221
379
        switch (BYTE_TYPE(enc, ptr)) {
1222
624
          CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1223
106
        default:
1224
106
          tok = XML_TOK_NMTOKEN;
1225
106
          break;
1226
379
        }
1227
255
        break;
1228
255
      case XML_TOK_PREFIXED_NAME:
1229
24
        tok = XML_TOK_NMTOKEN;
1230
24
        break;
1231
449
      }
1232
315
      break;
1233
315
#  endif
1234
315
    case BT_PLUS:
1235
56
      if (tok == XML_TOK_NMTOKEN) {
1236
10
        *nextTokPtr = ptr;
1237
10
        return XML_TOK_INVALID;
1238
10
      }
1239
46
      *nextTokPtr = ptr + MINBPC(enc);
1240
46
      return XML_TOK_NAME_PLUS;
1241
92
    case BT_AST:
1242
92
      if (tok == XML_TOK_NMTOKEN) {
1243
18
        *nextTokPtr = ptr;
1244
18
        return XML_TOK_INVALID;
1245
18
      }
1246
74
      *nextTokPtr = ptr + MINBPC(enc);
1247
74
      return XML_TOK_NAME_ASTERISK;
1248
56
    case BT_QUEST:
1249
56
      if (tok == XML_TOK_NMTOKEN) {
1250
18
        *nextTokPtr = ptr;
1251
18
        return XML_TOK_INVALID;
1252
18
      }
1253
38
      *nextTokPtr = ptr + MINBPC(enc);
1254
38
      return XML_TOK_NAME_QUESTION;
1255
603
    default:
1256
603
      *nextTokPtr = ptr;
1257
603
      return XML_TOK_INVALID;
1258
19.0k
    }
1259
19.0k
  }
1260
245
  return -tok;
1261
2.48k
}
xmltok.c:big2_prologTok
Line
Count
Source
1021
16.7k
                  const char **nextTokPtr) {
1022
16.7k
  int tok;
1023
16.7k
  if (ptr >= end)
1024
60
    return XML_TOK_NONE;
1025
16.6k
  if (MINBPC(enc) > 1) {
1026
16.6k
    size_t n = end - ptr;
1027
16.6k
    if (n & (MINBPC(enc) - 1)) {
1028
2.68k
      n &= ~(MINBPC(enc) - 1);
1029
2.68k
      if (n == 0)
1030
41
        return XML_TOK_PARTIAL;
1031
2.64k
      end = ptr + n;
1032
2.64k
    }
1033
16.6k
  }
1034
16.6k
  switch (BYTE_TYPE(enc, ptr)) {
1035
662
  case BT_QUOT:
1036
662
    return PREFIX(scanLit)(BT_QUOT, enc, ptr + MINBPC(enc), end, nextTokPtr);
1037
469
  case BT_APOS:
1038
469
    return PREFIX(scanLit)(BT_APOS, enc, ptr + MINBPC(enc), end, nextTokPtr);
1039
5.58k
  case BT_LT: {
1040
5.58k
    ptr += MINBPC(enc);
1041
5.58k
    REQUIRE_CHAR(enc, ptr, end);
1042
5.57k
    switch (BYTE_TYPE(enc, ptr)) {
1043
709
    case BT_EXCL:
1044
709
      return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1045
446
    case BT_QUEST:
1046
446
      return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1047
2.63k
    case BT_NMSTRT:
1048
4.23k
    case BT_HEX:
1049
4.32k
    case BT_NONASCII:
1050
4.32k
    case BT_LEAD2:
1051
4.32k
    case BT_LEAD3:
1052
4.36k
    case BT_LEAD4:
1053
4.36k
      *nextTokPtr = ptr - MINBPC(enc);
1054
4.36k
      return XML_TOK_INSTANCE_START;
1055
5.57k
    }
1056
53
    *nextTokPtr = ptr;
1057
53
    return XML_TOK_INVALID;
1058
5.57k
  }
1059
718
  case BT_CR:
1060
718
    if (ptr + MINBPC(enc) == end) {
1061
25
      *nextTokPtr = end;
1062
      /* indicate that this might be part of a CR/LF pair */
1063
25
      return -XML_TOK_PROLOG_S;
1064
25
    }
1065
693
    EXPAT_FALLTHROUGH;
1066
1.76k
  case BT_S:
1067
2.25k
  case BT_LF:
1068
4.77k
    for (;;) {
1069
4.77k
      ptr += MINBPC(enc);
1070
4.77k
      if (! HAS_CHAR(enc, ptr, end))
1071
76
        break;
1072
4.69k
      switch (BYTE_TYPE(enc, ptr)) {
1073
692
      case BT_S:
1074
1.80k
      case BT_LF:
1075
1.80k
        break;
1076
738
      case BT_CR:
1077
        /* don't split CR/LF pair */
1078
738
        if (ptr + MINBPC(enc) != end)
1079
716
          break;
1080
22
        EXPAT_FALLTHROUGH;
1081
2.17k
      default:
1082
2.17k
        *nextTokPtr = ptr;
1083
2.17k
        return XML_TOK_PROLOG_S;
1084
4.69k
      }
1085
4.69k
    }
1086
76
    *nextTokPtr = ptr;
1087
76
    return XML_TOK_PROLOG_S;
1088
1.34k
  case BT_PERCNT:
1089
1.34k
    return PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1090
66
  case BT_COMMA:
1091
66
    *nextTokPtr = ptr + MINBPC(enc);
1092
66
    return XML_TOK_COMMA;
1093
66
  case BT_LSQB:
1094
66
    *nextTokPtr = ptr + MINBPC(enc);
1095
66
    return XML_TOK_OPEN_BRACKET;
1096
217
  case BT_RSQB:
1097
217
    ptr += MINBPC(enc);
1098
217
    if (! HAS_CHAR(enc, ptr, end))
1099
21
      return -XML_TOK_CLOSE_BRACKET;
1100
196
    if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) {
1101
96
      REQUIRE_CHARS(enc, ptr, end, 2);
1102
78
      if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_GT)) {
1103
10
        *nextTokPtr = ptr + 2 * MINBPC(enc);
1104
10
        return XML_TOK_COND_SECT_CLOSE;
1105
10
      }
1106
78
    }
1107
168
    *nextTokPtr = ptr;
1108
168
    return XML_TOK_CLOSE_BRACKET;
1109
98
  case BT_LPAR:
1110
98
    *nextTokPtr = ptr + MINBPC(enc);
1111
98
    return XML_TOK_OPEN_PAREN;
1112
623
  case BT_RPAR:
1113
623
    ptr += MINBPC(enc);
1114
623
    if (! HAS_CHAR(enc, ptr, end))
1115
18
      return -XML_TOK_CLOSE_PAREN;
1116
605
    switch (BYTE_TYPE(enc, ptr)) {
1117
39
    case BT_AST:
1118
39
      *nextTokPtr = ptr + MINBPC(enc);
1119
39
      return XML_TOK_CLOSE_PAREN_ASTERISK;
1120
18
    case BT_QUEST:
1121
18
      *nextTokPtr = ptr + MINBPC(enc);
1122
18
      return XML_TOK_CLOSE_PAREN_QUESTION;
1123
34
    case BT_PLUS:
1124
34
      *nextTokPtr = ptr + MINBPC(enc);
1125
34
      return XML_TOK_CLOSE_PAREN_PLUS;
1126
19
    case BT_CR:
1127
37
    case BT_LF:
1128
111
    case BT_S:
1129
129
    case BT_GT:
1130
147
    case BT_COMMA:
1131
157
    case BT_VERBAR:
1132
191
    case BT_RPAR:
1133
191
      *nextTokPtr = ptr;
1134
191
      return XML_TOK_CLOSE_PAREN;
1135
605
    }
1136
323
    *nextTokPtr = ptr;
1137
323
    return XML_TOK_INVALID;
1138
49
  case BT_VERBAR:
1139
49
    *nextTokPtr = ptr + MINBPC(enc);
1140
49
    return XML_TOK_OR;
1141
75
  case BT_GT:
1142
75
    *nextTokPtr = ptr + MINBPC(enc);
1143
75
    return XML_TOK_DECL_CLOSE;
1144
1.50k
  case BT_NUM:
1145
1.50k
    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
866
    LEAD_CASE(4)
1169
0
#  undef LEAD_CASE
1170
1.09k
  case BT_NMSTRT:
1171
1.54k
  case BT_HEX:
1172
1.54k
    tok = XML_TOK_NAME;
1173
1.54k
    ptr += MINBPC(enc);
1174
1.54k
    break;
1175
123
  case BT_DIGIT:
1176
205
  case BT_NAME:
1177
350
  case BT_MINUS:
1178
350
#  ifdef XML_NS
1179
460
  case BT_COLON:
1180
460
#  endif
1181
460
    tok = XML_TOK_NMTOKEN;
1182
460
    ptr += MINBPC(enc);
1183
460
    break;
1184
526
  case BT_NONASCII:
1185
526
    if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {
1186
310
      ptr += MINBPC(enc);
1187
310
      tok = XML_TOK_NAME;
1188
310
      break;
1189
310
    }
1190
216
    if (IS_NAME_CHAR_MINBPC(enc, ptr)) {
1191
84
      ptr += MINBPC(enc);
1192
84
      tok = XML_TOK_NMTOKEN;
1193
84
      break;
1194
84
    }
1195
132
    EXPAT_FALLTHROUGH;
1196
940
  default:
1197
940
    *nextTokPtr = ptr;
1198
940
    return XML_TOK_INVALID;
1199
16.6k
  }
1200
33.5k
  while (HAS_CHAR(enc, ptr, end)) {
1201
33.5k
    switch (BYTE_TYPE(enc, ptr)) {
1202
183k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1203
39
    case BT_GT:
1204
110
    case BT_RPAR:
1205
176
    case BT_COMMA:
1206
210
    case BT_VERBAR:
1207
251
    case BT_LSQB:
1208
325
    case BT_PERCNT:
1209
410
    case BT_S:
1210
480
    case BT_CR:
1211
646
    case BT_LF:
1212
646
      *nextTokPtr = ptr;
1213
646
      return tok;
1214
0
#  ifdef XML_NS
1215
430
    case BT_COLON:
1216
430
      ptr += MINBPC(enc);
1217
430
      switch (tok) {
1218
378
      case XML_TOK_NAME:
1219
378
        REQUIRE_CHAR(enc, ptr, end);
1220
360
        tok = XML_TOK_PREFIXED_NAME;
1221
360
        switch (BYTE_TYPE(enc, ptr)) {
1222
655
          CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1223
109
        default:
1224
109
          tok = XML_TOK_NMTOKEN;
1225
109
          break;
1226
360
        }
1227
227
        break;
1228
227
      case XML_TOK_PREFIXED_NAME:
1229
10
        tok = XML_TOK_NMTOKEN;
1230
10
        break;
1231
430
      }
1232
279
      break;
1233
279
#  endif
1234
279
    case BT_PLUS:
1235
72
      if (tok == XML_TOK_NMTOKEN) {
1236
34
        *nextTokPtr = ptr;
1237
34
        return XML_TOK_INVALID;
1238
34
      }
1239
38
      *nextTokPtr = ptr + MINBPC(enc);
1240
38
      return XML_TOK_NAME_PLUS;
1241
52
    case BT_AST:
1242
52
      if (tok == XML_TOK_NMTOKEN) {
1243
18
        *nextTokPtr = ptr;
1244
18
        return XML_TOK_INVALID;
1245
18
      }
1246
34
      *nextTokPtr = ptr + MINBPC(enc);
1247
34
      return XML_TOK_NAME_ASTERISK;
1248
52
    case BT_QUEST:
1249
52
      if (tok == XML_TOK_NMTOKEN) {
1250
18
        *nextTokPtr = ptr;
1251
18
        return XML_TOK_INVALID;
1252
18
      }
1253
34
      *nextTokPtr = ptr + MINBPC(enc);
1254
34
      return XML_TOK_NAME_QUESTION;
1255
752
    default:
1256
752
      *nextTokPtr = ptr;
1257
752
      return XML_TOK_INVALID;
1258
33.5k
    }
1259
33.5k
  }
1260
106
  return -tok;
1261
2.39k
}
1262
1263
static int PTRCALL
1264
PREFIX(attributeValueTok)(const ENCODING *enc, const char *ptr, const char *end,
1265
425k
                          const char **nextTokPtr) {
1266
425k
  const char *start;
1267
425k
  if (ptr >= end)
1268
5.54k
    return XML_TOK_NONE;
1269
419k
  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
419k
  start = ptr;
1278
789k
  while (HAS_CHAR(enc, ptr, end)) {
1279
789k
    switch (BYTE_TYPE(enc, ptr)) {
1280
0
#  define LEAD_CASE(n)                                                         \
1281
23.0k
  case BT_LEAD##n:                                                             \
1282
23.0k
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1283
23.0k
    break;
1284
410
      LEAD_CASE(2)
1285
131
      LEAD_CASE(3)
1286
22.4k
      LEAD_CASE(4)
1287
0
#  undef LEAD_CASE
1288
710
    case BT_AMP:
1289
710
      if (ptr == start)
1290
484
        return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1291
226
      *nextTokPtr = ptr;
1292
226
      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
11.8k
    case BT_LF:
1298
11.8k
      if (ptr == start) {
1299
8.80k
        *nextTokPtr = ptr + MINBPC(enc);
1300
8.80k
        return XML_TOK_DATA_NEWLINE;
1301
8.80k
      }
1302
3.02k
      *nextTokPtr = ptr;
1303
3.02k
      return XML_TOK_DATA_CHARS;
1304
7.84k
    case BT_CR:
1305
7.84k
      if (ptr == start) {
1306
4.86k
        ptr += MINBPC(enc);
1307
4.86k
        if (! HAS_CHAR(enc, ptr, end))
1308
387
          return XML_TOK_TRAILING_CR;
1309
4.47k
        if (BYTE_TYPE(enc, ptr) == BT_LF)
1310
1.41k
          ptr += MINBPC(enc);
1311
4.47k
        *nextTokPtr = ptr;
1312
4.47k
        return XML_TOK_DATA_NEWLINE;
1313
4.86k
      }
1314
2.98k
      *nextTokPtr = ptr;
1315
2.98k
      return XML_TOK_DATA_CHARS;
1316
394k
    case BT_S:
1317
394k
      if (ptr == start) {
1318
385k
        *nextTokPtr = ptr + MINBPC(enc);
1319
385k
        return XML_TOK_ATTRIBUTE_VALUE_S;
1320
385k
      }
1321
8.91k
      *nextTokPtr = ptr;
1322
8.91k
      return XML_TOK_DATA_CHARS;
1323
350k
    default:
1324
350k
      ptr += MINBPC(enc);
1325
350k
      break;
1326
789k
    }
1327
789k
  }
1328
4.76k
  *nextTokPtr = ptr;
1329
4.76k
  return XML_TOK_DATA_CHARS;
1330
419k
}
xmltok.c:normal_attributeValueTok
Line
Count
Source
1265
408k
                          const char **nextTokPtr) {
1266
408k
  const char *start;
1267
408k
  if (ptr >= end)
1268
4.38k
    return XML_TOK_NONE;
1269
404k
  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
404k
  start = ptr;
1278
572k
  while (HAS_CHAR(enc, ptr, end)) {
1279
572k
    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
410
      LEAD_CASE(2)
1285
131
      LEAD_CASE(3)
1286
305
      LEAD_CASE(4)
1287
0
#  undef LEAD_CASE
1288
473
    case BT_AMP:
1289
473
      if (ptr == start)
1290
363
        return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1291
110
      *nextTokPtr = ptr;
1292
110
      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
5.45k
    case BT_LF:
1298
5.45k
      if (ptr == start) {
1299
5.08k
        *nextTokPtr = ptr + MINBPC(enc);
1300
5.08k
        return XML_TOK_DATA_NEWLINE;
1301
5.08k
      }
1302
366
      *nextTokPtr = ptr;
1303
366
      return XML_TOK_DATA_CHARS;
1304
3.92k
    case BT_CR:
1305
3.92k
      if (ptr == start) {
1306
2.11k
        ptr += MINBPC(enc);
1307
2.11k
        if (! HAS_CHAR(enc, ptr, end))
1308
347
          return XML_TOK_TRAILING_CR;
1309
1.77k
        if (BYTE_TYPE(enc, ptr) == BT_LF)
1310
34
          ptr += MINBPC(enc);
1311
1.77k
        *nextTokPtr = ptr;
1312
1.77k
        return XML_TOK_DATA_NEWLINE;
1313
2.11k
      }
1314
1.80k
      *nextTokPtr = ptr;
1315
1.80k
      return XML_TOK_DATA_CHARS;
1316
390k
    case BT_S:
1317
390k
      if (ptr == start) {
1318
383k
        *nextTokPtr = ptr + MINBPC(enc);
1319
383k
        return XML_TOK_ATTRIBUTE_VALUE_S;
1320
383k
      }
1321
7.34k
      *nextTokPtr = ptr;
1322
7.34k
      return XML_TOK_DATA_CHARS;
1323
171k
    default:
1324
171k
      ptr += MINBPC(enc);
1325
171k
      break;
1326
572k
    }
1327
572k
  }
1328
3.77k
  *nextTokPtr = ptr;
1329
3.77k
  return XML_TOK_DATA_CHARS;
1330
404k
}
xmltok.c:little2_attributeValueTok
Line
Count
Source
1265
11.7k
                          const char **nextTokPtr) {
1266
11.7k
  const char *start;
1267
11.7k
  if (ptr >= end)
1268
792
    return XML_TOK_NONE;
1269
10.9k
  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
10.9k
  start = ptr;
1278
54.0k
  while (HAS_CHAR(enc, ptr, end)) {
1279
54.0k
    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
0
      LEAD_CASE(2)
1285
0
      LEAD_CASE(3)
1286
6.87k
      LEAD_CASE(4)
1287
0
#  undef LEAD_CASE
1288
221
    case BT_AMP:
1289
221
      if (ptr == start)
1290
113
        return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1291
108
      *nextTokPtr = ptr;
1292
108
      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
5.87k
    case BT_LF:
1298
5.87k
      if (ptr == start) {
1299
3.30k
        *nextTokPtr = ptr + MINBPC(enc);
1300
3.30k
        return XML_TOK_DATA_NEWLINE;
1301
3.30k
      }
1302
2.56k
      *nextTokPtr = ptr;
1303
2.56k
      return XML_TOK_DATA_CHARS;
1304
2.19k
    case BT_CR:
1305
2.19k
      if (ptr == start) {
1306
1.71k
        ptr += MINBPC(enc);
1307
1.71k
        if (! HAS_CHAR(enc, ptr, end))
1308
30
          return XML_TOK_TRAILING_CR;
1309
1.68k
        if (BYTE_TYPE(enc, ptr) == BT_LF)
1310
835
          ptr += MINBPC(enc);
1311
1.68k
        *nextTokPtr = ptr;
1312
1.68k
        return XML_TOK_DATA_NEWLINE;
1313
1.71k
      }
1314
485
      *nextTokPtr = ptr;
1315
485
      return XML_TOK_DATA_CHARS;
1316
1.94k
    case BT_S:
1317
1.94k
      if (ptr == start) {
1318
1.44k
        *nextTokPtr = ptr + MINBPC(enc);
1319
1.44k
        return XML_TOK_ATTRIBUTE_VALUE_S;
1320
1.44k
      }
1321
508
      *nextTokPtr = ptr;
1322
508
      return XML_TOK_DATA_CHARS;
1323
36.9k
    default:
1324
36.9k
      ptr += MINBPC(enc);
1325
36.9k
      break;
1326
54.0k
    }
1327
54.0k
  }
1328
672
  *nextTokPtr = ptr;
1329
672
  return XML_TOK_DATA_CHARS;
1330
10.9k
}
xmltok.c:big2_attributeValueTok
Line
Count
Source
1265
5.41k
                          const char **nextTokPtr) {
1266
5.41k
  const char *start;
1267
5.41k
  if (ptr >= end)
1268
363
    return XML_TOK_NONE;
1269
5.04k
  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
5.04k
  start = ptr;
1278
162k
  while (HAS_CHAR(enc, ptr, end)) {
1279
162k
    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
0
      LEAD_CASE(2)
1285
0
      LEAD_CASE(3)
1286
15.3k
      LEAD_CASE(4)
1287
0
#  undef LEAD_CASE
1288
16
    case BT_AMP:
1289
16
      if (ptr == start)
1290
8
        return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1291
8
      *nextTokPtr = ptr;
1292
8
      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
514
    case BT_LF:
1298
514
      if (ptr == start) {
1299
414
        *nextTokPtr = ptr + MINBPC(enc);
1300
414
        return XML_TOK_DATA_NEWLINE;
1301
414
      }
1302
100
      *nextTokPtr = ptr;
1303
100
      return XML_TOK_DATA_CHARS;
1304
1.72k
    case BT_CR:
1305
1.72k
      if (ptr == start) {
1306
1.03k
        ptr += MINBPC(enc);
1307
1.03k
        if (! HAS_CHAR(enc, ptr, end))
1308
10
          return XML_TOK_TRAILING_CR;
1309
1.02k
        if (BYTE_TYPE(enc, ptr) == BT_LF)
1310
546
          ptr += MINBPC(enc);
1311
1.02k
        *nextTokPtr = ptr;
1312
1.02k
        return XML_TOK_DATA_NEWLINE;
1313
1.03k
      }
1314
694
      *nextTokPtr = ptr;
1315
694
      return XML_TOK_DATA_CHARS;
1316
2.46k
    case BT_S:
1317
2.46k
      if (ptr == start) {
1318
1.40k
        *nextTokPtr = ptr + MINBPC(enc);
1319
1.40k
        return XML_TOK_ATTRIBUTE_VALUE_S;
1320
1.40k
      }
1321
1.06k
      *nextTokPtr = ptr;
1322
1.06k
      return XML_TOK_DATA_CHARS;
1323
142k
    default:
1324
142k
      ptr += MINBPC(enc);
1325
142k
      break;
1326
162k
    }
1327
162k
  }
1328
324
  *nextTokPtr = ptr;
1329
324
  return XML_TOK_DATA_CHARS;
1330
5.04k
}
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
53.5k
                ATTRIBUTE *atts) {
1514
53.5k
  enum { other, inName, inValue } state = inName;
1515
53.5k
  int nAtts = 0;
1516
53.5k
  int open = 0; /* defined when state == inValue;
1517
                   initialization just to shut up compilers */
1518
1519
4.84M
  for (ptr += MINBPC(enc);; ptr += MINBPC(enc)) {
1520
4.84M
    switch (BYTE_TYPE(enc, ptr)) {
1521
0
#  define START_NAME                                                           \
1522
2.98M
    if (state == other) {                                                      \
1523
81.5k
      if (nAtts < attsMax) {                                                   \
1524
74.2k
        atts[nAtts].name = ptr;                                                \
1525
74.2k
        atts[nAtts].normalized = 1;                                            \
1526
74.2k
      }                                                                        \
1527
81.5k
      state = inName;                                                          \
1528
81.5k
    }
1529
0
#  define LEAD_CASE(n)                                                         \
1530
27.4k
  case BT_LEAD##n: /* NOTE: The encoding has already been validated. */        \
1531
27.4k
    START_NAME ptr += (n - MINBPC(enc));                                       \
1532
27.4k
    break;
1533
1.77k
      LEAD_CASE(2)
1534
860
      LEAD_CASE(3)
1535
24.8k
      LEAD_CASE(4)
1536
0
#  undef LEAD_CASE
1537
493k
    case BT_NONASCII:
1538
2.11M
    case BT_NMSTRT:
1539
2.95M
    case BT_HEX:
1540
2.95M
      START_NAME
1541
2.95M
      break;
1542
0
#  undef START_NAME
1543
154k
    case BT_QUOT:
1544
154k
      if (state != inValue) {
1545
76.9k
        if (nAtts < attsMax)
1546
69.7k
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1547
76.9k
        state = inValue;
1548
76.9k
        open = BT_QUOT;
1549
77.1k
      } else if (open == BT_QUOT) {
1550
76.9k
        state = other;
1551
76.9k
        if (nAtts < attsMax)
1552
69.7k
          atts[nAtts].valueEnd = ptr;
1553
76.9k
        nAtts++;
1554
76.9k
      }
1555
154k
      break;
1556
11.0k
    case BT_APOS:
1557
11.0k
      if (state != inValue) {
1558
4.54k
        if (nAtts < attsMax)
1559
4.54k
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1560
4.54k
        state = inValue;
1561
4.54k
        open = BT_APOS;
1562
6.49k
      } else if (open == BT_APOS) {
1563
4.54k
        state = other;
1564
4.54k
        if (nAtts < attsMax)
1565
4.54k
          atts[nAtts].valueEnd = ptr;
1566
4.54k
        nAtts++;
1567
4.54k
      }
1568
11.0k
      break;
1569
518
    case BT_AMP:
1570
518
      if (nAtts < attsMax)
1571
512
        atts[nAtts].normalized = 0;
1572
518
      break;
1573
706k
    case BT_S:
1574
706k
      if (state == inName)
1575
17.9k
        state = other;
1576
688k
      else if (state == inValue && nAtts < attsMax && atts[nAtts].normalized
1577
18.8k
               && (ptr == atts[nAtts].valuePtr
1578
18.5k
                   || BYTE_TO_ASCII(enc, ptr) != ASCII_SPACE
1579
18.2k
                   || BYTE_TO_ASCII(enc, ptr + MINBPC(enc)) == ASCII_SPACE
1580
15.3k
                   || BYTE_TYPE(enc, ptr + MINBPC(enc)) == open))
1581
3.73k
        atts[nAtts].normalized = 0;
1582
706k
      break;
1583
12.9k
    case BT_CR:
1584
31.2k
    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
31.2k
      if (state == inName)
1588
1.44k
        state = other;
1589
29.7k
      else if (state == inValue && nAtts < attsMax)
1590
18.4k
        atts[nAtts].normalized = 0;
1591
31.2k
      break;
1592
49.9k
    case BT_GT:
1593
182k
    case BT_SOL:
1594
182k
      if (state != inValue)
1595
53.5k
        return nAtts;
1596
129k
      break;
1597
777k
    default:
1598
777k
      break;
1599
4.84M
    }
1600
4.84M
  }
1601
  /* not reached */
1602
53.5k
}
xmltok.c:normal_getAtts
Line
Count
Source
1513
37.1k
                ATTRIBUTE *atts) {
1514
37.1k
  enum { other, inName, inValue } state = inName;
1515
37.1k
  int nAtts = 0;
1516
37.1k
  int open = 0; /* defined when state == inValue;
1517
                   initialization just to shut up compilers */
1518
1519
4.25M
  for (ptr += MINBPC(enc);; ptr += MINBPC(enc)) {
1520
4.25M
    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
1.77k
      LEAD_CASE(2)
1534
860
      LEAD_CASE(3)
1535
316
      LEAD_CASE(4)
1536
0
#  undef LEAD_CASE
1537
0
    case BT_NONASCII:
1538
1.60M
    case BT_NMSTRT:
1539
2.43M
    case BT_HEX:
1540
2.43M
      START_NAME
1541
2.43M
      break;
1542
0
#  undef START_NAME
1543
150k
    case BT_QUOT:
1544
150k
      if (state != inValue) {
1545
75.4k
        if (nAtts < attsMax)
1546
68.1k
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1547
75.4k
        state = inValue;
1548
75.4k
        open = BT_QUOT;
1549
75.4k
      } else if (open == BT_QUOT) {
1550
75.4k
        state = other;
1551
75.4k
        if (nAtts < attsMax)
1552
68.1k
          atts[nAtts].valueEnd = ptr;
1553
75.4k
        nAtts++;
1554
75.4k
      }
1555
150k
      break;
1556
9.35k
    case BT_APOS:
1557
9.35k
      if (state != inValue) {
1558
4.40k
        if (nAtts < attsMax)
1559
4.40k
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1560
4.40k
        state = inValue;
1561
4.40k
        open = BT_APOS;
1562
4.95k
      } else if (open == BT_APOS) {
1563
4.40k
        state = other;
1564
4.40k
        if (nAtts < attsMax)
1565
4.40k
          atts[nAtts].valueEnd = ptr;
1566
4.40k
        nAtts++;
1567
4.40k
      }
1568
9.35k
      break;
1569
389
    case BT_AMP:
1570
389
      if (nAtts < attsMax)
1571
383
        atts[nAtts].normalized = 0;
1572
389
      break;
1573
701k
    case BT_S:
1574
701k
      if (state == inName)
1575
16.2k
        state = other;
1576
684k
      else if (state == inValue && nAtts < attsMax && atts[nAtts].normalized
1577
17.4k
               && (ptr == atts[nAtts].valuePtr
1578
17.2k
                   || BYTE_TO_ASCII(enc, ptr) != ASCII_SPACE
1579
17.2k
                   || BYTE_TO_ASCII(enc, ptr + MINBPC(enc)) == ASCII_SPACE
1580
14.4k
                   || BYTE_TYPE(enc, ptr + MINBPC(enc)) == open))
1581
3.28k
        atts[nAtts].normalized = 0;
1582
701k
      break;
1583
8.88k
    case BT_CR:
1584
20.1k
    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
20.1k
      if (state == inName)
1588
164
        state = other;
1589
20.0k
      else if (state == inValue && nAtts < attsMax)
1590
10.4k
        atts[nAtts].normalized = 0;
1591
20.1k
      break;
1592
34.8k
    case BT_GT:
1593
165k
    case BT_SOL:
1594
165k
      if (state != inValue)
1595
37.1k
        return nAtts;
1596
128k
      break;
1597
769k
    default:
1598
769k
      break;
1599
4.25M
    }
1600
4.25M
  }
1601
  /* not reached */
1602
37.1k
}
xmltok.c:little2_getAtts
Line
Count
Source
1513
12.0k
                ATTRIBUTE *atts) {
1514
12.0k
  enum { other, inName, inValue } state = inName;
1515
12.0k
  int nAtts = 0;
1516
12.0k
  int open = 0; /* defined when state == inValue;
1517
                   initialization just to shut up compilers */
1518
1519
136k
  for (ptr += MINBPC(enc);; ptr += MINBPC(enc)) {
1520
136k
    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
7.59k
      LEAD_CASE(4)
1536
0
#  undef LEAD_CASE
1537
90.6k
    case BT_NONASCII:
1538
96.8k
    case BT_NMSTRT:
1539
97.0k
    case BT_HEX:
1540
97.0k
      START_NAME
1541
97.0k
      break;
1542
0
#  undef START_NAME
1543
2.28k
    case BT_QUOT:
1544
2.28k
      if (state != inValue) {
1545
1.08k
        if (nAtts < attsMax)
1546
1.08k
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1547
1.08k
        state = inValue;
1548
1.08k
        open = BT_QUOT;
1549
1.20k
      } else if (open == BT_QUOT) {
1550
1.08k
        state = other;
1551
1.08k
        if (nAtts < attsMax)
1552
1.08k
          atts[nAtts].valueEnd = ptr;
1553
1.08k
        nAtts++;
1554
1.08k
      }
1555
2.28k
      break;
1556
1.44k
    case BT_APOS:
1557
1.44k
      if (state != inValue) {
1558
135
        if (nAtts < attsMax)
1559
135
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1560
135
        state = inValue;
1561
135
        open = BT_APOS;
1562
1.31k
      } else if (open == BT_APOS) {
1563
135
        state = other;
1564
135
        if (nAtts < attsMax)
1565
135
          atts[nAtts].valueEnd = ptr;
1566
135
        nAtts++;
1567
135
      }
1568
1.44k
      break;
1569
119
    case BT_AMP:
1570
119
      if (nAtts < attsMax)
1571
119
        atts[nAtts].normalized = 0;
1572
119
      break;
1573
3.13k
    case BT_S:
1574
3.13k
      if (state == inName)
1575
1.21k
        state = other;
1576
1.91k
      else if (state == inValue && nAtts < attsMax && atts[nAtts].normalized
1577
472
               && (ptr == atts[nAtts].valuePtr
1578
402
                   || BYTE_TO_ASCII(enc, ptr) != ASCII_SPACE
1579
362
                   || BYTE_TO_ASCII(enc, ptr + MINBPC(enc)) == ASCII_SPACE
1580
341
                   || BYTE_TYPE(enc, ptr + MINBPC(enc)) == open))
1581
165
        atts[nAtts].normalized = 0;
1582
3.13k
      break;
1583
2.83k
    case BT_CR:
1584
8.43k
    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
8.43k
      if (state == inName)
1588
1.20k
        state = other;
1589
7.22k
      else if (state == inValue && nAtts < attsMax)
1590
6.00k
        atts[nAtts].normalized = 0;
1591
8.43k
      break;
1592
10.7k
    case BT_GT:
1593
12.4k
    case BT_SOL:
1594
12.4k
      if (state != inValue)
1595
12.0k
        return nAtts;
1596
334
      break;
1597
4.22k
    default:
1598
4.22k
      break;
1599
136k
    }
1600
136k
  }
1601
  /* not reached */
1602
12.0k
}
xmltok.c:big2_getAtts
Line
Count
Source
1513
4.33k
                ATTRIBUTE *atts) {
1514
4.33k
  enum { other, inName, inValue } state = inName;
1515
4.33k
  int nAtts = 0;
1516
4.33k
  int open = 0; /* defined when state == inValue;
1517
                   initialization just to shut up compilers */
1518
1519
453k
  for (ptr += MINBPC(enc);; ptr += MINBPC(enc)) {
1520
453k
    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
16.9k
      LEAD_CASE(4)
1536
0
#  undef LEAD_CASE
1537
402k
    case BT_NONASCII:
1538
420k
    case BT_NMSTRT:
1539
422k
    case BT_HEX:
1540
422k
      START_NAME
1541
422k
      break;
1542
0
#  undef START_NAME
1543
978
    case BT_QUOT:
1544
978
      if (state != inValue) {
1545
489
        if (nAtts < attsMax)
1546
489
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1547
489
        state = inValue;
1548
489
        open = BT_QUOT;
1549
489
      } else if (open == BT_QUOT) {
1550
489
        state = other;
1551
489
        if (nAtts < attsMax)
1552
489
          atts[nAtts].valueEnd = ptr;
1553
489
        nAtts++;
1554
489
      }
1555
978
      break;
1556
230
    case BT_APOS:
1557
230
      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
230
      } 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
230
      break;
1569
10
    case BT_AMP:
1570
10
      if (nAtts < attsMax)
1571
10
        atts[nAtts].normalized = 0;
1572
10
      break;
1573
2.27k
    case BT_S:
1574
2.27k
      if (state == inName)
1575
539
        state = other;
1576
1.73k
      else if (state == inValue && nAtts < attsMax && atts[nAtts].normalized
1577
885
               && (ptr == atts[nAtts].valuePtr
1578
851
                   || BYTE_TO_ASCII(enc, ptr) != ASCII_SPACE
1579
641
                   || BYTE_TO_ASCII(enc, ptr + MINBPC(enc)) == ASCII_SPACE
1580
628
                   || BYTE_TYPE(enc, ptr + MINBPC(enc)) == open))
1581
276
        atts[nAtts].normalized = 0;
1582
2.27k
      break;
1583
1.22k
    case BT_CR:
1584
2.62k
    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
2.62k
      if (state == inName)
1588
72
        state = other;
1589
2.55k
      else if (state == inValue && nAtts < attsMax)
1590
1.99k
        atts[nAtts].normalized = 0;
1591
2.62k
      break;
1592
4.41k
    case BT_GT:
1593
4.50k
    case BT_SOL:
1594
4.50k
      if (state != inValue)
1595
4.33k
        return nAtts;
1596
169
      break;
1597
3.72k
    default:
1598
3.72k
      break;
1599
453k
    }
1600
453k
  }
1601
  /* not reached */
1602
4.33k
}
1603
1604
static int PTRFASTCALL
1605
1.79k
PREFIX(charRefNumber)(const ENCODING *enc, const char *ptr) {
1606
1.79k
  int result = 0;
1607
  /* skip &# */
1608
1.79k
  UNUSED_P(enc);
1609
1.79k
  ptr += 2 * MINBPC(enc);
1610
1.79k
  if (CHAR_MATCHES(enc, ptr, ASCII_x)) {
1611
5.44k
    for (ptr += MINBPC(enc); ! CHAR_MATCHES(enc, ptr, ASCII_SEMI);
1612
4.14k
         ptr += MINBPC(enc)) {
1613
4.14k
      int c = BYTE_TO_ASCII(enc, ptr);
1614
4.14k
      switch (c) {
1615
242
      case ASCII_0:
1616
356
      case ASCII_1:
1617
405
      case ASCII_2:
1618
584
      case ASCII_3:
1619
741
      case ASCII_4:
1620
955
      case ASCII_5:
1621
1.08k
      case ASCII_6:
1622
1.19k
      case ASCII_7:
1623
1.30k
      case ASCII_8:
1624
1.50k
      case ASCII_9:
1625
1.50k
        result <<= 4;
1626
1.50k
        result |= (c - ASCII_0);
1627
1.50k
        break;
1628
1.57k
      case ASCII_A:
1629
1.73k
      case ASCII_B:
1630
1.79k
      case ASCII_C:
1631
1.91k
      case ASCII_D:
1632
1.99k
      case ASCII_E:
1633
2.07k
      case ASCII_F:
1634
2.07k
        result <<= 4;
1635
2.07k
        result += 10 + (c - ASCII_A);
1636
2.07k
        break;
1637
105
      case ASCII_a:
1638
145
      case ASCII_b:
1639
257
      case ASCII_c:
1640
349
      case ASCII_d:
1641
505
      case ASCII_e:
1642
569
      case ASCII_f:
1643
569
        result <<= 4;
1644
569
        result += 10 + (c - ASCII_a);
1645
569
        break;
1646
4.14k
      }
1647
4.14k
      if (result >= 0x110000)
1648
305
        return -1;
1649
4.14k
    }
1650
1.60k
  } else {
1651
594
    for (; ! CHAR_MATCHES(enc, ptr, ASCII_SEMI); ptr += MINBPC(enc)) {
1652
426
      int c = BYTE_TO_ASCII(enc, ptr);
1653
426
      result *= 10;
1654
426
      result += (c - ASCII_0);
1655
426
      if (result >= 0x110000)
1656
24
        return -1;
1657
426
    }
1658
192
  }
1659
1.46k
  return checkCharRefNumber(result);
1660
1.79k
}
xmltok.c:normal_charRefNumber
Line
Count
Source
1605
804
PREFIX(charRefNumber)(const ENCODING *enc, const char *ptr) {
1606
804
  int result = 0;
1607
  /* skip &# */
1608
804
  UNUSED_P(enc);
1609
804
  ptr += 2 * MINBPC(enc);
1610
804
  if (CHAR_MATCHES(enc, ptr, ASCII_x)) {
1611
3.65k
    for (ptr += MINBPC(enc); ! CHAR_MATCHES(enc, ptr, ASCII_SEMI);
1612
3.23k
         ptr += MINBPC(enc)) {
1613
3.23k
      int c = BYTE_TO_ASCII(enc, ptr);
1614
3.23k
      switch (c) {
1615
194
      case ASCII_0:
1616
268
      case ASCII_1:
1617
289
      case ASCII_2:
1618
439
      case ASCII_3:
1619
548
      case ASCII_4:
1620
714
      case ASCII_5:
1621
780
      case ASCII_6:
1622
858
      case ASCII_7:
1623
887
      case ASCII_8:
1624
1.05k
      case ASCII_9:
1625
1.05k
        result <<= 4;
1626
1.05k
        result |= (c - ASCII_0);
1627
1.05k
        break;
1628
1.54k
      case ASCII_A:
1629
1.66k
      case ASCII_B:
1630
1.70k
      case ASCII_C:
1631
1.78k
      case ASCII_D:
1632
1.82k
      case ASCII_E:
1633
1.87k
      case ASCII_F:
1634
1.87k
        result <<= 4;
1635
1.87k
        result += 10 + (c - ASCII_A);
1636
1.87k
        break;
1637
53
      case ASCII_a:
1638
65
      case ASCII_b:
1639
144
      case ASCII_c:
1640
184
      case ASCII_d:
1641
293
      case ASCII_e:
1642
313
      case ASCII_f:
1643
313
        result <<= 4;
1644
313
        result += 10 + (c - ASCII_a);
1645
313
        break;
1646
3.23k
      }
1647
3.23k
      if (result >= 0x110000)
1648
305
        return -1;
1649
3.23k
    }
1650
726
  } else {
1651
334
    for (; ! CHAR_MATCHES(enc, ptr, ASCII_SEMI); ptr += MINBPC(enc)) {
1652
280
      int c = BYTE_TO_ASCII(enc, ptr);
1653
280
      result *= 10;
1654
280
      result += (c - ASCII_0);
1655
280
      if (result >= 0x110000)
1656
24
        return -1;
1657
280
    }
1658
78
  }
1659
475
  return checkCharRefNumber(result);
1660
804
}
xmltok.c:little2_charRefNumber
Line
Count
Source
1605
694
PREFIX(charRefNumber)(const ENCODING *enc, const char *ptr) {
1606
694
  int result = 0;
1607
  /* skip &# */
1608
694
  UNUSED_P(enc);
1609
694
  ptr += 2 * MINBPC(enc);
1610
694
  if (CHAR_MATCHES(enc, ptr, ASCII_x)) {
1611
1.21k
    for (ptr += MINBPC(enc); ! CHAR_MATCHES(enc, ptr, ASCII_SEMI);
1612
606
         ptr += MINBPC(enc)) {
1613
606
      int c = BYTE_TO_ASCII(enc, ptr);
1614
606
      switch (c) {
1615
38
      case ASCII_0:
1616
68
      case ASCII_1:
1617
86
      case ASCII_2:
1618
105
      case ASCII_3:
1619
143
      case ASCII_4:
1620
181
      case ASCII_5:
1621
219
      case ASCII_6:
1622
237
      case ASCII_7:
1623
255
      case ASCII_8:
1624
273
      case ASCII_9:
1625
273
        result <<= 4;
1626
273
        result |= (c - ASCII_0);
1627
273
        break;
1628
15
      case ASCII_A:
1629
49
      case ASCII_B:
1630
59
      case ASCII_C:
1631
93
      case ASCII_D:
1632
111
      case ASCII_E:
1633
145
      case ASCII_F:
1634
145
        result <<= 4;
1635
145
        result += 10 + (c - ASCII_A);
1636
145
        break;
1637
42
      case ASCII_a:
1638
60
      case ASCII_b:
1639
83
      case ASCII_c:
1640
117
      case ASCII_d:
1641
154
      case ASCII_e:
1642
188
      case ASCII_f:
1643
188
        result <<= 4;
1644
188
        result += 10 + (c - ASCII_a);
1645
188
        break;
1646
606
      }
1647
606
      if (result >= 0x110000)
1648
0
        return -1;
1649
606
    }
1650
606
  } else {
1651
176
    for (; ! CHAR_MATCHES(enc, ptr, ASCII_SEMI); ptr += MINBPC(enc)) {
1652
88
      int c = BYTE_TO_ASCII(enc, ptr);
1653
88
      result *= 10;
1654
88
      result += (c - ASCII_0);
1655
88
      if (result >= 0x110000)
1656
0
        return -1;
1657
88
    }
1658
88
  }
1659
694
  return checkCharRefNumber(result);
1660
694
}
xmltok.c:big2_charRefNumber
Line
Count
Source
1605
295
PREFIX(charRefNumber)(const ENCODING *enc, const char *ptr) {
1606
295
  int result = 0;
1607
  /* skip &# */
1608
295
  UNUSED_P(enc);
1609
295
  ptr += 2 * MINBPC(enc);
1610
295
  if (CHAR_MATCHES(enc, ptr, ASCII_x)) {
1611
571
    for (ptr += MINBPC(enc); ! CHAR_MATCHES(enc, ptr, ASCII_SEMI);
1612
302
         ptr += MINBPC(enc)) {
1613
302
      int c = BYTE_TO_ASCII(enc, ptr);
1614
302
      switch (c) {
1615
10
      case ASCII_0:
1616
20
      case ASCII_1:
1617
30
      case ASCII_2:
1618
40
      case ASCII_3:
1619
50
      case ASCII_4:
1620
60
      case ASCII_5:
1621
88
      case ASCII_6:
1622
98
      case ASCII_7:
1623
164
      case ASCII_8:
1624
174
      case ASCII_9:
1625
174
        result <<= 4;
1626
174
        result |= (c - ASCII_0);
1627
174
        break;
1628
10
      case ASCII_A:
1629
20
      case ASCII_B:
1630
30
      case ASCII_C:
1631
40
      case ASCII_D:
1632
50
      case ASCII_E:
1633
60
      case ASCII_F:
1634
60
        result <<= 4;
1635
60
        result += 10 + (c - ASCII_A);
1636
60
        break;
1637
10
      case ASCII_a:
1638
20
      case ASCII_b:
1639
30
      case ASCII_c:
1640
48
      case ASCII_d:
1641
58
      case ASCII_e:
1642
68
      case ASCII_f:
1643
68
        result <<= 4;
1644
68
        result += 10 + (c - ASCII_a);
1645
68
        break;
1646
302
      }
1647
302
      if (result >= 0x110000)
1648
0
        return -1;
1649
302
    }
1650
269
  } else {
1651
84
    for (; ! CHAR_MATCHES(enc, ptr, ASCII_SEMI); ptr += MINBPC(enc)) {
1652
58
      int c = BYTE_TO_ASCII(enc, ptr);
1653
58
      result *= 10;
1654
58
      result += (c - ASCII_0);
1655
58
      if (result >= 0x110000)
1656
0
        return -1;
1657
58
    }
1658
26
  }
1659
295
  return checkCharRefNumber(result);
1660
295
}
1661
1662
static int PTRCALL
1663
PREFIX(predefinedEntityName)(const ENCODING *enc, const char *ptr,
1664
1.26k
                             const char *end) {
1665
1.26k
  UNUSED_P(enc);
1666
1.26k
  switch ((end - ptr) / MINBPC(enc)) {
1667
414
  case 2:
1668
414
    if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_t)) {
1669
268
      switch (BYTE_TO_ASCII(enc, ptr)) {
1670
233
      case ASCII_l:
1671
233
        return ASCII_LT;
1672
35
      case ASCII_g:
1673
35
        return ASCII_GT;
1674
268
      }
1675
268
    }
1676
146
    break;
1677
342
  case 3:
1678
342
    if (CHAR_MATCHES(enc, ptr, ASCII_a)) {
1679
184
      ptr += MINBPC(enc);
1680
184
      if (CHAR_MATCHES(enc, ptr, ASCII_m)) {
1681
60
        ptr += MINBPC(enc);
1682
60
        if (CHAR_MATCHES(enc, ptr, ASCII_p))
1683
25
          return ASCII_AMP;
1684
60
      }
1685
184
    }
1686
317
    break;
1687
343
  case 4:
1688
343
    switch (BYTE_TO_ASCII(enc, ptr)) {
1689
126
    case ASCII_q:
1690
126
      ptr += MINBPC(enc);
1691
126
      if (CHAR_MATCHES(enc, ptr, ASCII_u)) {
1692
20
        ptr += MINBPC(enc);
1693
20
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1694
20
          ptr += MINBPC(enc);
1695
20
          if (CHAR_MATCHES(enc, ptr, ASCII_t))
1696
20
            return ASCII_QUOT;
1697
20
        }
1698
20
      }
1699
106
      break;
1700
106
    case ASCII_a:
1701
90
      ptr += MINBPC(enc);
1702
90
      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
90
      break;
1711
343
    }
1712
1.26k
  }
1713
948
  return 0;
1714
1.26k
}
xmltok.c:normal_predefinedEntityName
Line
Count
Source
1664
736
                             const char *end) {
1665
736
  UNUSED_P(enc);
1666
736
  switch ((end - ptr) / MINBPC(enc)) {
1667
302
  case 2:
1668
302
    if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_t)) {
1669
268
      switch (BYTE_TO_ASCII(enc, ptr)) {
1670
233
      case ASCII_l:
1671
233
        return ASCII_LT;
1672
35
      case ASCII_g:
1673
35
        return ASCII_GT;
1674
268
      }
1675
268
    }
1676
34
    break;
1677
198
  case 3:
1678
198
    if (CHAR_MATCHES(enc, ptr, ASCII_a)) {
1679
132
      ptr += MINBPC(enc);
1680
132
      if (CHAR_MATCHES(enc, ptr, ASCII_m)) {
1681
60
        ptr += MINBPC(enc);
1682
60
        if (CHAR_MATCHES(enc, ptr, ASCII_p))
1683
25
          return ASCII_AMP;
1684
60
      }
1685
132
    }
1686
173
    break;
1687
173
  case 4:
1688
122
    switch (BYTE_TO_ASCII(enc, ptr)) {
1689
54
    case ASCII_q:
1690
54
      ptr += MINBPC(enc);
1691
54
      if (CHAR_MATCHES(enc, ptr, ASCII_u)) {
1692
20
        ptr += MINBPC(enc);
1693
20
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1694
20
          ptr += MINBPC(enc);
1695
20
          if (CHAR_MATCHES(enc, ptr, ASCII_t))
1696
20
            return ASCII_QUOT;
1697
20
        }
1698
20
      }
1699
34
      break;
1700
34
    case ASCII_a:
1701
34
      ptr += MINBPC(enc);
1702
34
      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
34
      break;
1711
122
    }
1712
736
  }
1713
423
  return 0;
1714
736
}
xmltok.c:little2_predefinedEntityName
Line
Count
Source
1664
445
                             const char *end) {
1665
445
  UNUSED_P(enc);
1666
445
  switch ((end - ptr) / MINBPC(enc)) {
1667
92
  case 2:
1668
92
    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
92
    break;
1677
114
  case 3:
1678
114
    if (CHAR_MATCHES(enc, ptr, ASCII_a)) {
1679
42
      ptr += MINBPC(enc);
1680
42
      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
42
    }
1686
114
    break;
1687
201
  case 4:
1688
201
    switch (BYTE_TO_ASCII(enc, ptr)) {
1689
72
    case ASCII_q:
1690
72
      ptr += MINBPC(enc);
1691
72
      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
72
      break;
1700
72
    case ASCII_a:
1701
56
      ptr += MINBPC(enc);
1702
56
      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
56
      break;
1711
201
    }
1712
445
  }
1713
445
  return 0;
1714
445
}
xmltok.c:big2_predefinedEntityName
Line
Count
Source
1664
80
                             const char *end) {
1665
80
  UNUSED_P(enc);
1666
80
  switch ((end - ptr) / MINBPC(enc)) {
1667
20
  case 2:
1668
20
    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
20
    break;
1677
30
  case 3:
1678
30
    if (CHAR_MATCHES(enc, ptr, ASCII_a)) {
1679
10
      ptr += MINBPC(enc);
1680
10
      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
10
    }
1686
30
    break;
1687
30
  case 4:
1688
20
    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
20
    }
1712
80
  }
1713
80
  return 0;
1714
80
}
1715
1716
static int PTRCALL
1717
PREFIX(nameMatchesAscii)(const ENCODING *enc, const char *ptr1,
1718
4.18k
                         const char *end1, const char *ptr2) {
1719
4.18k
  UNUSED_P(enc);
1720
22.0k
  for (; *ptr2; ptr1 += MINBPC(enc), ptr2++) {
1721
19.6k
    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
246
      return 0; /* LCOV_EXCL_LINE */
1728
246
    }
1729
19.3k
    if (! CHAR_MATCHES(enc, ptr1, *ptr2))
1730
1.46k
      return 0;
1731
19.3k
  }
1732
2.47k
  return ptr1 == end1;
1733
4.18k
}
xmltok.c:normal_nameMatchesAscii
Line
Count
Source
1718
3.12k
                         const char *end1, const char *ptr2) {
1719
3.12k
  UNUSED_P(enc);
1720
20.8k
  for (; *ptr2; ptr1 += MINBPC(enc), ptr2++) {
1721
18.4k
    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
112
      return 0; /* LCOV_EXCL_LINE */
1728
112
    }
1729
18.2k
    if (! CHAR_MATCHES(enc, ptr1, *ptr2))
1730
532
      return 0;
1731
18.2k
  }
1732
2.47k
  return ptr1 == end1;
1733
3.12k
}
xmltok.c:little2_nameMatchesAscii
Line
Count
Source
1718
916
                         const char *end1, const char *ptr2) {
1719
916
  UNUSED_P(enc);
1720
1.03k
  for (; *ptr2; ptr1 += MINBPC(enc), ptr2++) {
1721
1.03k
    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
120
      return 0; /* LCOV_EXCL_LINE */
1728
120
    }
1729
916
    if (! CHAR_MATCHES(enc, ptr1, *ptr2))
1730
796
      return 0;
1731
916
  }
1732
0
  return ptr1 == end1;
1733
916
}
xmltok.c:big2_nameMatchesAscii
Line
Count
Source
1718
147
                         const char *end1, const char *ptr2) {
1719
147
  UNUSED_P(enc);
1720
161
  for (; *ptr2; ptr1 += MINBPC(enc), ptr2++) {
1721
161
    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
14
      return 0; /* LCOV_EXCL_LINE */
1728
14
    }
1729
147
    if (! CHAR_MATCHES(enc, ptr1, *ptr2))
1730
133
      return 0;
1731
147
  }
1732
0
  return ptr1 == end1;
1733
147
}
1734
1735
static int PTRFASTCALL
1736
128k
PREFIX(nameLength)(const ENCODING *enc, const char *ptr) {
1737
128k
  const char *start = ptr;
1738
1.72M
  for (;;) {
1739
1.72M
    switch (BYTE_TYPE(enc, ptr)) {
1740
0
#  define LEAD_CASE(n)                                                         \
1741
1.35k
  case BT_LEAD##n:                                                             \
1742
1.35k
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1743
1.35k
    break;
1744
785
      LEAD_CASE(2)
1745
574
      LEAD_CASE(3)
1746
0
      LEAD_CASE(4)
1747
0
#  undef LEAD_CASE
1748
280k
    case BT_NONASCII:
1749
1.15M
    case BT_NMSTRT:
1750
1.15M
#  ifdef XML_NS
1751
1.25M
    case BT_COLON:
1752
1.25M
#  endif
1753
1.58M
    case BT_HEX:
1754
1.59M
    case BT_DIGIT:
1755
1.59M
    case BT_NAME:
1756
1.59M
    case BT_MINUS:
1757
1.59M
      ptr += MINBPC(enc);
1758
1.59M
      break;
1759
128k
    default:
1760
128k
      return (int)(ptr - start);
1761
1.72M
    }
1762
1.72M
  }
1763
128k
}
xmltok.c:normal_nameLength
Line
Count
Source
1736
110k
PREFIX(nameLength)(const ENCODING *enc, const char *ptr) {
1737
110k
  const char *start = ptr;
1738
1.40M
  for (;;) {
1739
1.40M
    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
785
      LEAD_CASE(2)
1745
574
      LEAD_CASE(3)
1746
0
      LEAD_CASE(4)
1747
0
#  undef LEAD_CASE
1748
0
    case BT_NONASCII:
1749
855k
    case BT_NMSTRT:
1750
855k
#  ifdef XML_NS
1751
953k
    case BT_COLON:
1752
953k
#  endif
1753
1.28M
    case BT_HEX:
1754
1.28M
    case BT_DIGIT:
1755
1.28M
    case BT_NAME:
1756
1.28M
    case BT_MINUS:
1757
1.28M
      ptr += MINBPC(enc);
1758
1.28M
      break;
1759
110k
    default:
1760
110k
      return (int)(ptr - start);
1761
1.40M
    }
1762
1.40M
  }
1763
110k
}
xmltok.c:little2_nameLength
Line
Count
Source
1736
13.3k
PREFIX(nameLength)(const ENCODING *enc, const char *ptr) {
1737
13.3k
  const char *start = ptr;
1738
75.5k
  for (;;) {
1739
75.5k
    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
54.2k
    case BT_NONASCII:
1749
60.1k
    case BT_NMSTRT:
1750
60.1k
#  ifdef XML_NS
1751
60.2k
    case BT_COLON:
1752
60.2k
#  endif
1753
60.3k
    case BT_HEX:
1754
61.9k
    case BT_DIGIT:
1755
62.1k
    case BT_NAME:
1756
62.1k
    case BT_MINUS:
1757
62.1k
      ptr += MINBPC(enc);
1758
62.1k
      break;
1759
13.3k
    default:
1760
13.3k
      return (int)(ptr - start);
1761
75.5k
    }
1762
75.5k
  }
1763
13.3k
}
xmltok.c:big2_nameLength
Line
Count
Source
1736
4.86k
PREFIX(nameLength)(const ENCODING *enc, const char *ptr) {
1737
4.86k
  const char *start = ptr;
1738
252k
  for (;;) {
1739
252k
    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
226k
    case BT_NONASCII:
1749
243k
    case BT_NMSTRT:
1750
243k
#  ifdef XML_NS
1751
243k
    case BT_COLON:
1752
243k
#  endif
1753
245k
    case BT_HEX:
1754
247k
    case BT_DIGIT:
1755
247k
    case BT_NAME:
1756
248k
    case BT_MINUS:
1757
248k
      ptr += MINBPC(enc);
1758
248k
      break;
1759
4.86k
    default:
1760
4.86k
      return (int)(ptr - start);
1761
252k
    }
1762
252k
  }
1763
4.86k
}
1764
1765
static const char *PTRFASTCALL
1766
905
PREFIX(skipS)(const ENCODING *enc, const char *ptr) {
1767
5.77k
  for (;;) {
1768
5.77k
    switch (BYTE_TYPE(enc, ptr)) {
1769
1.45k
    case BT_LF:
1770
1.53k
    case BT_CR:
1771
4.86k
    case BT_S:
1772
4.86k
      ptr += MINBPC(enc);
1773
4.86k
      break;
1774
905
    default:
1775
905
      return ptr;
1776
5.77k
    }
1777
5.77k
  }
1778
905
}
xmltok.c:normal_skipS
Line
Count
Source
1766
905
PREFIX(skipS)(const ENCODING *enc, const char *ptr) {
1767
5.77k
  for (;;) {
1768
5.77k
    switch (BYTE_TYPE(enc, ptr)) {
1769
1.45k
    case BT_LF:
1770
1.53k
    case BT_CR:
1771
4.86k
    case BT_S:
1772
4.86k
      ptr += MINBPC(enc);
1773
4.86k
      break;
1774
905
    default:
1775
905
      return ptr;
1776
5.77k
    }
1777
5.77k
  }
1778
905
}
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
167k
                       POSITION *pos) {
1783
4.01M
  while (HAS_CHAR(enc, ptr, end)) {
1784
4.01M
    switch (BYTE_TYPE(enc, ptr)) {
1785
0
#  define LEAD_CASE(n)                                                         \
1786
109k
  case BT_LEAD##n:                                                             \
1787
109k
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1788
109k
    pos->columnNumber++;                                                       \
1789
109k
    break;
1790
3.92k
      LEAD_CASE(2)
1791
10.5k
      LEAD_CASE(3)
1792
94.9k
      LEAD_CASE(4)
1793
0
#  undef LEAD_CASE
1794
38.3k
    case BT_LF:
1795
38.3k
      pos->columnNumber = 0;
1796
38.3k
      pos->lineNumber++;
1797
38.3k
      ptr += MINBPC(enc);
1798
38.3k
      break;
1799
42.6k
    case BT_CR:
1800
42.6k
      pos->lineNumber++;
1801
42.6k
      ptr += MINBPC(enc);
1802
42.6k
      if (HAS_CHAR(enc, ptr, end) && BYTE_TYPE(enc, ptr) == BT_LF)
1803
8.97k
        ptr += MINBPC(enc);
1804
42.6k
      pos->columnNumber = 0;
1805
42.6k
      break;
1806
3.82M
    default:
1807
3.82M
      ptr += MINBPC(enc);
1808
3.82M
      pos->columnNumber++;
1809
3.82M
      break;
1810
4.01M
    }
1811
4.01M
  }
1812
167k
}
xmltok.c:normal_updatePosition
Line
Count
Source
1782
68.9k
                       POSITION *pos) {
1783
1.78M
  while (HAS_CHAR(enc, ptr, end)) {
1784
1.78M
    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.92k
      LEAD_CASE(2)
1791
10.5k
      LEAD_CASE(3)
1792
1.01k
      LEAD_CASE(4)
1793
0
#  undef LEAD_CASE
1794
15.4k
    case BT_LF:
1795
15.4k
      pos->columnNumber = 0;
1796
15.4k
      pos->lineNumber++;
1797
15.4k
      ptr += MINBPC(enc);
1798
15.4k
      break;
1799
18.8k
    case BT_CR:
1800
18.8k
      pos->lineNumber++;
1801
18.8k
      ptr += MINBPC(enc);
1802
18.8k
      if (HAS_CHAR(enc, ptr, end) && BYTE_TYPE(enc, ptr) == BT_LF)
1803
312
        ptr += MINBPC(enc);
1804
18.8k
      pos->columnNumber = 0;
1805
18.8k
      break;
1806
1.73M
    default:
1807
1.73M
      ptr += MINBPC(enc);
1808
1.73M
      pos->columnNumber++;
1809
1.73M
      break;
1810
1.78M
    }
1811
1.78M
  }
1812
68.9k
}
xmltok.c:little2_updatePosition
Line
Count
Source
1782
70.0k
                       POSITION *pos) {
1783
732k
  while (HAS_CHAR(enc, ptr, end)) {
1784
732k
    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
49.3k
      LEAD_CASE(4)
1793
0
#  undef LEAD_CASE
1794
19.2k
    case BT_LF:
1795
19.2k
      pos->columnNumber = 0;
1796
19.2k
      pos->lineNumber++;
1797
19.2k
      ptr += MINBPC(enc);
1798
19.2k
      break;
1799
17.1k
    case BT_CR:
1800
17.1k
      pos->lineNumber++;
1801
17.1k
      ptr += MINBPC(enc);
1802
17.1k
      if (HAS_CHAR(enc, ptr, end) && BYTE_TYPE(enc, ptr) == BT_LF)
1803
5.47k
        ptr += MINBPC(enc);
1804
17.1k
      pos->columnNumber = 0;
1805
17.1k
      break;
1806
646k
    default:
1807
646k
      ptr += MINBPC(enc);
1808
646k
      pos->columnNumber++;
1809
646k
      break;
1810
732k
    }
1811
732k
  }
1812
70.0k
}
xmltok.c:big2_updatePosition
Line
Count
Source
1782
28.7k
                       POSITION *pos) {
1783
1.49M
  while (HAS_CHAR(enc, ptr, end)) {
1784
1.49M
    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
44.6k
      LEAD_CASE(4)
1793
0
#  undef LEAD_CASE
1794
3.78k
    case BT_LF:
1795
3.78k
      pos->columnNumber = 0;
1796
3.78k
      pos->lineNumber++;
1797
3.78k
      ptr += MINBPC(enc);
1798
3.78k
      break;
1799
6.68k
    case BT_CR:
1800
6.68k
      pos->lineNumber++;
1801
6.68k
      ptr += MINBPC(enc);
1802
6.68k
      if (HAS_CHAR(enc, ptr, end) && BYTE_TYPE(enc, ptr) == BT_LF)
1803
3.18k
        ptr += MINBPC(enc);
1804
6.68k
      pos->columnNumber = 0;
1805
6.68k
      break;
1806
1.44M
    default:
1807
1.44M
      ptr += MINBPC(enc);
1808
1.44M
      pos->columnNumber++;
1809
1.44M
      break;
1810
1.49M
    }
1811
1.49M
  }
1812
28.7k
}
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 */