Coverage Report

Created: 2026-05-31 06:50

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