Coverage Report

Created: 2026-10-28 07:09

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