Coverage Report

Created: 2026-07-30 07:17

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