Coverage Report

Created: 2026-07-15 07:31

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