Coverage Report

Created: 2026-10-14 06:52

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