Coverage Report

Created: 2026-03-12 07:14

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