Coverage Report

Created: 2026-08-25 06:40

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