Coverage Report

Created: 2026-01-25 07:18

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
130
#    define IS_INVALID_CHAR(enc, ptr, n) (0)
46
#  endif
47
48
#  define INVALID_LEAD_CASE(n, ptr, nextTokPtr)                                \
49
1.27k
  case BT_LEAD##n:                                                             \
50
1.27k
    if (end - ptr < n)                                                         \
51
1.09k
      return XML_TOK_PARTIAL_CHAR;                                             \
52
1.24k
    if (IS_INVALID_CHAR(enc, ptr, n)) {                                        \
53
147
      *(nextTokPtr) = (ptr);                                                   \
54
147
      return XML_TOK_INVALID;                                                  \
55
147
    }                                                                          \
56
1.24k
    ptr += n;                                                                  \
57
1.09k
    break;
58
59
#  define INVALID_CASES(ptr, nextTokPtr)                                       \
60
94
    INVALID_LEAD_CASE(2, ptr, nextTokPtr)                                      \
61
733
    INVALID_LEAD_CASE(3, ptr, nextTokPtr)                                      \
62
682
    INVALID_LEAD_CASE(4, ptr, nextTokPtr)                                      \
63
376
  case BT_NONXML:                                                              \
64
163
  case BT_MALFORM:                                                             \
65
257
  case BT_TRAIL:                                                               \
66
257
    *(nextTokPtr) = (ptr);                                                     \
67
257
    return XML_TOK_INVALID;
68
69
#  define CHECK_NAME_CASE(n, enc, ptr, end, nextTokPtr)                        \
70
500
  case BT_LEAD##n:                                                             \
71
500
    if (end - ptr < n)                                                         \
72
106
      return XML_TOK_PARTIAL_CHAR;                                             \
73
500
    if (IS_INVALID_CHAR(enc, ptr, n) || ! IS_NAME_CHAR(enc, ptr, n)) {         \
74
394
      *nextTokPtr = ptr;                                                       \
75
394
      return XML_TOK_INVALID;                                                  \
76
394
    }                                                                          \
77
500
    ptr += n;                                                                  \
78
106
    break;
79
80
#  define CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)                          \
81
623k
  case BT_NONASCII:                                                            \
82
623k
    if (! IS_NAME_CHAR_MINBPC(enc, ptr)) {                                     \
83
121
      *nextTokPtr = ptr;                                                       \
84
121
      return XML_TOK_INVALID;                                                  \
85
121
    }                                                                          \
86
623k
    /* fall through */                                                         \
87
623k
  case BT_NMSTRT:                                                              \
88
596k
  case BT_HEX:                                                                 \
89
620k
  case BT_DIGIT:                                                               \
90
622k
  case BT_NAME:                                                                \
91
623k
  case BT_MINUS:                                                               \
92
623k
    ptr += MINBPC(enc);                                                        \
93
623k
    break;                                                                     \
94
623k
    CHECK_NAME_CASE(2, enc, ptr, end, nextTokPtr)                              \
95
175
    CHECK_NAME_CASE(3, enc, ptr, end, nextTokPtr)                              \
96
153
    CHECK_NAME_CASE(4, enc, ptr, end, nextTokPtr)
97
98
#  define CHECK_NMSTRT_CASE(n, enc, ptr, end, nextTokPtr)                      \
99
234
  case BT_LEAD##n:                                                             \
100
234
    if ((end) - (ptr) < (n))                                                   \
101
60
      return XML_TOK_PARTIAL_CHAR;                                             \
102
232
    if (IS_INVALID_CHAR(enc, ptr, n) || ! IS_NMSTRT_CHAR(enc, ptr, n)) {       \
103
172
      *nextTokPtr = ptr;                                                       \
104
172
      return XML_TOK_INVALID;                                                  \
105
172
    }                                                                          \
106
232
    ptr += n;                                                                  \
107
60
    break;
108
109
#  define CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)                        \
110
89.2k
  case BT_NONASCII:                                                            \
111
89.2k
    if (! IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {                                   \
112
44
      *nextTokPtr = ptr;                                                       \
113
44
      return XML_TOK_INVALID;                                                  \
114
44
    }                                                                          \
115
89.2k
    /* fall through */                                                         \
116
89.2k
  case BT_NMSTRT:                                                              \
117
89.2k
  case BT_HEX:                                                                 \
118
89.2k
    ptr += MINBPC(enc);                                                        \
119
89.2k
    break;                                                                     \
120
89.2k
    CHECK_NMSTRT_CASE(2, enc, ptr, end, nextTokPtr)                            \
121
113
    CHECK_NMSTRT_CASE(3, enc, ptr, end, nextTokPtr)                            \
122
60
    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
2.63M
    ((end) - (ptr) >= ((count) * MINBPC(enc)))
130
131
420k
#  define HAS_CHAR(enc, ptr, end) HAS_CHARS(enc, ptr, end, 1)
132
133
#  define REQUIRE_CHARS(enc, ptr, end, count)                                  \
134
619k
    {                                                                          \
135
619k
      if (! HAS_CHARS(enc, ptr, end, count)) {                                 \
136
28
        return XML_TOK_PARTIAL;                                                \
137
28
      }                                                                        \
138
619k
    }
139
140
619k
#  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
22
                    const char **nextTokPtr) {
147
22
  if (HAS_CHAR(enc, ptr, end)) {
148
22
    if (! CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
149
5
      *nextTokPtr = ptr;
150
5
      return XML_TOK_INVALID;
151
5
    }
152
17
    ptr += MINBPC(enc);
153
294
    while (HAS_CHAR(enc, ptr, end)) {
154
294
      switch (BYTE_TYPE(enc, ptr)) {
155
25
        INVALID_CASES(ptr, nextTokPtr)
156
6
      case BT_MINUS:
157
6
        ptr += MINBPC(enc);
158
6
        REQUIRE_CHAR(enc, ptr, end);
159
6
        if (CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
160
1
          ptr += MINBPC(enc);
161
1
          REQUIRE_CHAR(enc, ptr, end);
162
1
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
163
1
            *nextTokPtr = ptr;
164
1
            return XML_TOK_INVALID;
165
1
          }
166
0
          *nextTokPtr = ptr + MINBPC(enc);
167
0
          return XML_TOK_COMMENT;
168
1
        }
169
5
        break;
170
273
      default:
171
273
        ptr += MINBPC(enc);
172
273
        break;
173
294
      }
174
294
    }
175
17
  }
176
1
  return XML_TOK_PARTIAL;
177
22
}
xmltok.c:normal_scanComment
Line
Count
Source
146
22
                    const char **nextTokPtr) {
147
22
  if (HAS_CHAR(enc, ptr, end)) {
148
22
    if (! CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
149
5
      *nextTokPtr = ptr;
150
5
      return XML_TOK_INVALID;
151
5
    }
152
17
    ptr += MINBPC(enc);
153
294
    while (HAS_CHAR(enc, ptr, end)) {
154
294
      switch (BYTE_TYPE(enc, ptr)) {
155
25
        INVALID_CASES(ptr, nextTokPtr)
156
6
      case BT_MINUS:
157
6
        ptr += MINBPC(enc);
158
6
        REQUIRE_CHAR(enc, ptr, end);
159
6
        if (CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
160
1
          ptr += MINBPC(enc);
161
1
          REQUIRE_CHAR(enc, ptr, end);
162
1
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
163
1
            *nextTokPtr = ptr;
164
1
            return XML_TOK_INVALID;
165
1
          }
166
0
          *nextTokPtr = ptr + MINBPC(enc);
167
0
          return XML_TOK_COMMENT;
168
1
        }
169
5
        break;
170
273
      default:
171
273
        ptr += MINBPC(enc);
172
273
        break;
173
294
      }
174
294
    }
175
17
  }
176
1
  return XML_TOK_PARTIAL;
177
22
}
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
46
                 const char **nextTokPtr) {
184
46
  REQUIRE_CHAR(enc, ptr, end);
185
46
  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
1
  case BT_NMSTRT:
192
41
  case BT_HEX:
193
41
    ptr += MINBPC(enc);
194
41
    break;
195
5
  default:
196
5
    *nextTokPtr = ptr;
197
5
    return XML_TOK_INVALID;
198
46
  }
199
251
  while (HAS_CHAR(enc, ptr, end)) {
200
251
    switch (BYTE_TYPE(enc, ptr)) {
201
2
    case BT_PERCNT:
202
2
      REQUIRE_CHARS(enc, ptr, end, 2);
203
      /* don't allow <!ENTITY% foo "whatever"> */
204
2
      switch (BYTE_TYPE(enc, ptr + MINBPC(enc))) {
205
0
      case BT_S:
206
0
      case BT_CR:
207
1
      case BT_LF:
208
1
      case BT_PERCNT:
209
1
        *nextTokPtr = ptr;
210
1
        return XML_TOK_INVALID;
211
2
      }
212
      /* fall through */
213
28
    case BT_S:
214
28
    case BT_CR:
215
28
    case BT_LF:
216
28
      *nextTokPtr = ptr;
217
28
      return XML_TOK_DECL_OPEN;
218
145
    case BT_NMSTRT:
219
210
    case BT_HEX:
220
210
      ptr += MINBPC(enc);
221
210
      break;
222
12
    default:
223
12
      *nextTokPtr = ptr;
224
12
      return XML_TOK_INVALID;
225
251
    }
226
251
  }
227
0
  return XML_TOK_PARTIAL;
228
41
}
xmltok.c:normal_scanDecl
Line
Count
Source
183
45
                 const char **nextTokPtr) {
184
45
  REQUIRE_CHAR(enc, ptr, end);
185
45
  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
1
  case BT_NMSTRT:
192
41
  case BT_HEX:
193
41
    ptr += MINBPC(enc);
194
41
    break;
195
4
  default:
196
4
    *nextTokPtr = ptr;
197
4
    return XML_TOK_INVALID;
198
45
  }
199
251
  while (HAS_CHAR(enc, ptr, end)) {
200
251
    switch (BYTE_TYPE(enc, ptr)) {
201
2
    case BT_PERCNT:
202
2
      REQUIRE_CHARS(enc, ptr, end, 2);
203
      /* don't allow <!ENTITY% foo "whatever"> */
204
2
      switch (BYTE_TYPE(enc, ptr + MINBPC(enc))) {
205
0
      case BT_S:
206
0
      case BT_CR:
207
1
      case BT_LF:
208
1
      case BT_PERCNT:
209
1
        *nextTokPtr = ptr;
210
1
        return XML_TOK_INVALID;
211
2
      }
212
      /* fall through */
213
28
    case BT_S:
214
28
    case BT_CR:
215
28
    case BT_LF:
216
28
      *nextTokPtr = ptr;
217
28
      return XML_TOK_DECL_OPEN;
218
145
    case BT_NMSTRT:
219
210
    case BT_HEX:
220
210
      ptr += MINBPC(enc);
221
210
      break;
222
12
    default:
223
12
      *nextTokPtr = ptr;
224
12
      return XML_TOK_INVALID;
225
251
    }
226
251
  }
227
0
  return XML_TOK_PARTIAL;
228
41
}
xmltok.c:little2_scanDecl
Line
Count
Source
183
1
                 const char **nextTokPtr) {
184
1
  REQUIRE_CHAR(enc, ptr, end);
185
1
  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
1
  default:
196
1
    *nextTokPtr = ptr;
197
1
    return XML_TOK_INVALID;
198
1
  }
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
}
Unexecuted instantiation: xmltok.c:big2_scanDecl
229
230
static int PTRCALL
231
PREFIX(checkPiTarget)(const ENCODING *enc, const char *ptr, const char *end,
232
1.15k
                      int *tokPtr) {
233
1.15k
  int upper = 0;
234
1.15k
  UNUSED_P(enc);
235
1.15k
  *tokPtr = XML_TOK_PI;
236
1.15k
  if (end - ptr != MINBPC(enc) * 3)
237
1.15k
    return 1;
238
2
  switch (BYTE_TO_ASCII(enc, ptr)) {
239
2
  case ASCII_x:
240
2
    break;
241
0
  case ASCII_X:
242
0
    upper = 1;
243
0
    break;
244
0
  default:
245
0
    return 1;
246
2
  }
247
2
  ptr += MINBPC(enc);
248
2
  switch (BYTE_TO_ASCII(enc, ptr)) {
249
2
  case ASCII_m:
250
2
    break;
251
0
  case ASCII_M:
252
0
    upper = 1;
253
0
    break;
254
0
  default:
255
0
    return 1;
256
2
  }
257
2
  ptr += MINBPC(enc);
258
2
  switch (BYTE_TO_ASCII(enc, ptr)) {
259
2
  case ASCII_l:
260
2
    break;
261
0
  case ASCII_L:
262
0
    upper = 1;
263
0
    break;
264
0
  default:
265
0
    return 1;
266
2
  }
267
2
  if (upper)
268
0
    return 0;
269
2
  *tokPtr = XML_TOK_XML_DECL;
270
2
  return 1;
271
2
}
xmltok.c:normal_checkPiTarget
Line
Count
Source
232
1.15k
                      int *tokPtr) {
233
1.15k
  int upper = 0;
234
1.15k
  UNUSED_P(enc);
235
1.15k
  *tokPtr = XML_TOK_PI;
236
1.15k
  if (end - ptr != MINBPC(enc) * 3)
237
1.15k
    return 1;
238
2
  switch (BYTE_TO_ASCII(enc, ptr)) {
239
2
  case ASCII_x:
240
2
    break;
241
0
  case ASCII_X:
242
0
    upper = 1;
243
0
    break;
244
0
  default:
245
0
    return 1;
246
2
  }
247
2
  ptr += MINBPC(enc);
248
2
  switch (BYTE_TO_ASCII(enc, ptr)) {
249
2
  case ASCII_m:
250
2
    break;
251
0
  case ASCII_M:
252
0
    upper = 1;
253
0
    break;
254
0
  default:
255
0
    return 1;
256
2
  }
257
2
  ptr += MINBPC(enc);
258
2
  switch (BYTE_TO_ASCII(enc, ptr)) {
259
2
  case ASCII_l:
260
2
    break;
261
0
  case ASCII_L:
262
0
    upper = 1;
263
0
    break;
264
0
  default:
265
0
    return 1;
266
2
  }
267
2
  if (upper)
268
0
    return 0;
269
2
  *tokPtr = XML_TOK_XML_DECL;
270
2
  return 1;
271
2
}
Unexecuted instantiation: xmltok.c:little2_checkPiTarget
Unexecuted instantiation: xmltok.c:big2_checkPiTarget
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
1.30k
               const char **nextTokPtr) {
278
1.30k
  int tok;
279
1.30k
  const char *target = ptr;
280
1.30k
  REQUIRE_CHAR(enc, ptr, end);
281
1.30k
  switch (BYTE_TYPE(enc, ptr)) {
282
1.31k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
283
8
  default:
284
8
    *nextTokPtr = ptr;
285
8
    return XML_TOK_INVALID;
286
1.30k
  }
287
13.3k
  while (HAS_CHAR(enc, ptr, end)) {
288
13.3k
    switch (BYTE_TYPE(enc, ptr)) {
289
41.4k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
290
1.12k
    case BT_S:
291
1.13k
    case BT_CR:
292
1.14k
    case BT_LF:
293
1.14k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
294
0
        *nextTokPtr = ptr;
295
0
        return XML_TOK_INVALID;
296
0
      }
297
1.14k
      ptr += MINBPC(enc);
298
53.6k
      while (HAS_CHAR(enc, ptr, end)) {
299
53.6k
        switch (BYTE_TYPE(enc, ptr)) {
300
2.20k
          INVALID_CASES(ptr, nextTokPtr)
301
10.9k
        case BT_QUEST:
302
10.9k
          ptr += MINBPC(enc);
303
10.9k
          REQUIRE_CHAR(enc, ptr, end);
304
10.9k
          if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
305
984
            *nextTokPtr = ptr + MINBPC(enc);
306
984
            return tok;
307
984
          }
308
10.0k
          break;
309
41.4k
        default:
310
41.4k
          ptr += MINBPC(enc);
311
41.4k
          break;
312
53.6k
        }
313
53.6k
      }
314
8
      return XML_TOK_PARTIAL;
315
15
    case BT_QUEST:
316
15
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
317
0
        *nextTokPtr = ptr;
318
0
        return XML_TOK_INVALID;
319
0
      }
320
15
      ptr += MINBPC(enc);
321
15
      REQUIRE_CHAR(enc, ptr, end);
322
15
      if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
323
7
        *nextTokPtr = ptr + MINBPC(enc);
324
7
        return tok;
325
7
      }
326
      /* fall through */
327
75
    default:
328
75
      *nextTokPtr = ptr;
329
75
      return XML_TOK_INVALID;
330
13.3k
    }
331
13.3k
  }
332
1
  return XML_TOK_PARTIAL;
333
1.29k
}
xmltok.c:normal_scanPi
Line
Count
Source
277
1.29k
               const char **nextTokPtr) {
278
1.29k
  int tok;
279
1.29k
  const char *target = ptr;
280
1.29k
  REQUIRE_CHAR(enc, ptr, end);
281
1.29k
  switch (BYTE_TYPE(enc, ptr)) {
282
1.29k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
283
6
  default:
284
6
    *nextTokPtr = ptr;
285
6
    return XML_TOK_INVALID;
286
1.29k
  }
287
13.2k
  while (HAS_CHAR(enc, ptr, end)) {
288
13.2k
    switch (BYTE_TYPE(enc, ptr)) {
289
41.2k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
290
1.12k
    case BT_S:
291
1.13k
    case BT_CR:
292
1.14k
    case BT_LF:
293
1.14k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
294
0
        *nextTokPtr = ptr;
295
0
        return XML_TOK_INVALID;
296
0
      }
297
1.14k
      ptr += MINBPC(enc);
298
53.6k
      while (HAS_CHAR(enc, ptr, end)) {
299
53.6k
        switch (BYTE_TYPE(enc, ptr)) {
300
2.20k
          INVALID_CASES(ptr, nextTokPtr)
301
10.9k
        case BT_QUEST:
302
10.9k
          ptr += MINBPC(enc);
303
10.9k
          REQUIRE_CHAR(enc, ptr, end);
304
10.9k
          if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
305
984
            *nextTokPtr = ptr + MINBPC(enc);
306
984
            return tok;
307
984
          }
308
10.0k
          break;
309
41.4k
        default:
310
41.4k
          ptr += MINBPC(enc);
311
41.4k
          break;
312
53.6k
        }
313
53.6k
      }
314
8
      return XML_TOK_PARTIAL;
315
15
    case BT_QUEST:
316
15
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
317
0
        *nextTokPtr = ptr;
318
0
        return XML_TOK_INVALID;
319
0
      }
320
15
      ptr += MINBPC(enc);
321
15
      REQUIRE_CHAR(enc, ptr, end);
322
15
      if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
323
7
        *nextTokPtr = ptr + MINBPC(enc);
324
7
        return tok;
325
7
      }
326
      /* fall through */
327
75
    default:
328
75
      *nextTokPtr = ptr;
329
75
      return XML_TOK_INVALID;
330
13.2k
    }
331
13.2k
  }
332
1
  return XML_TOK_PARTIAL;
333
1.28k
}
Unexecuted instantiation: xmltok.c:little2_scanPi
xmltok.c:big2_scanPi
Line
Count
Source
277
11
               const char **nextTokPtr) {
278
11
  int tok;
279
11
  const char *target = ptr;
280
11
  REQUIRE_CHAR(enc, ptr, end);
281
11
  switch (BYTE_TYPE(enc, ptr)) {
282
16
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
283
2
  default:
284
2
    *nextTokPtr = ptr;
285
2
    return XML_TOK_INVALID;
286
11
  }
287
36
  while (HAS_CHAR(enc, ptr, end)) {
288
36
    switch (BYTE_TYPE(enc, ptr)) {
289
155
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
290
0
    case BT_S:
291
0
    case BT_CR:
292
0
    case BT_LF:
293
0
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
294
0
        *nextTokPtr = ptr;
295
0
        return XML_TOK_INVALID;
296
0
      }
297
0
      ptr += MINBPC(enc);
298
0
      while (HAS_CHAR(enc, ptr, end)) {
299
0
        switch (BYTE_TYPE(enc, ptr)) {
300
0
          INVALID_CASES(ptr, nextTokPtr)
301
0
        case BT_QUEST:
302
0
          ptr += MINBPC(enc);
303
0
          REQUIRE_CHAR(enc, ptr, end);
304
0
          if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
305
0
            *nextTokPtr = ptr + MINBPC(enc);
306
0
            return tok;
307
0
          }
308
0
          break;
309
0
        default:
310
0
          ptr += MINBPC(enc);
311
0
          break;
312
0
        }
313
0
      }
314
0
      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
0
    default:
328
0
      *nextTokPtr = ptr;
329
0
      return XML_TOK_INVALID;
330
36
    }
331
36
  }
332
0
  return XML_TOK_PARTIAL;
333
7
}
334
335
static int PTRCALL
336
PREFIX(scanCdataSection)(const ENCODING *enc, const char *ptr, const char *end,
337
0
                         const char **nextTokPtr) {
338
0
  static const char CDATA_LSQB[]
339
0
      = {ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, ASCII_LSQB};
340
0
  int i;
341
0
  UNUSED_P(enc);
342
  /* CDATA[ */
343
0
  REQUIRE_CHARS(enc, ptr, end, 6);
344
0
  for (i = 0; i < 6; i++, ptr += MINBPC(enc)) {
345
0
    if (! CHAR_MATCHES(enc, ptr, CDATA_LSQB[i])) {
346
0
      *nextTokPtr = ptr;
347
0
      return XML_TOK_INVALID;
348
0
    }
349
0
  }
350
0
  *nextTokPtr = ptr;
351
0
  return XML_TOK_CDATA_SECT_OPEN;
352
0
}
Unexecuted instantiation: xmltok.c:normal_scanCdataSection
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
8.53k
                   const char **nextTokPtr) {
433
8.53k
  REQUIRE_CHAR(enc, ptr, end);
434
8.53k
  switch (BYTE_TYPE(enc, ptr)) {
435
6.98k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
436
1
  default:
437
1
    *nextTokPtr = ptr;
438
1
    return XML_TOK_INVALID;
439
8.53k
  }
440
72.6k
  while (HAS_CHAR(enc, ptr, end)) {
441
72.6k
    switch (BYTE_TYPE(enc, ptr)) {
442
196k
      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
8.53k
    case BT_COLON:
463
      /* no need to check qname syntax here,
464
         since end-tag must match exactly */
465
8.53k
      ptr += MINBPC(enc);
466
8.53k
      break;
467
0
#  endif
468
8.52k
    case BT_GT:
469
8.52k
      *nextTokPtr = ptr + MINBPC(enc);
470
8.52k
      return XML_TOK_END_TAG;
471
15
    default:
472
15
      *nextTokPtr = ptr;
473
15
      return XML_TOK_INVALID;
474
72.6k
    }
475
72.6k
  }
476
0
  return XML_TOK_PARTIAL;
477
8.53k
}
xmltok.c:normal_scanEndTag
Line
Count
Source
432
8.53k
                   const char **nextTokPtr) {
433
8.53k
  REQUIRE_CHAR(enc, ptr, end);
434
8.53k
  switch (BYTE_TYPE(enc, ptr)) {
435
6.98k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
436
1
  default:
437
1
    *nextTokPtr = ptr;
438
1
    return XML_TOK_INVALID;
439
8.53k
  }
440
72.6k
  while (HAS_CHAR(enc, ptr, end)) {
441
72.6k
    switch (BYTE_TYPE(enc, ptr)) {
442
196k
      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
8.53k
    case BT_COLON:
463
      /* no need to check qname syntax here,
464
         since end-tag must match exactly */
465
8.53k
      ptr += MINBPC(enc);
466
8.53k
      break;
467
0
#  endif
468
8.52k
    case BT_GT:
469
8.52k
      *nextTokPtr = ptr + MINBPC(enc);
470
8.52k
      return XML_TOK_END_TAG;
471
15
    default:
472
15
      *nextTokPtr = ptr;
473
15
      return XML_TOK_INVALID;
474
72.6k
    }
475
72.6k
  }
476
0
  return XML_TOK_PARTIAL;
477
8.53k
}
Unexecuted instantiation: xmltok.c:little2_scanEndTag
Unexecuted instantiation: xmltok.c:big2_scanEndTag
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
2
                    const char **nextTokPtr) {
515
2
  if (HAS_CHAR(enc, ptr, end)) {
516
2
    if (CHAR_MATCHES(enc, ptr, ASCII_x))
517
0
      return PREFIX(scanHexCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
518
2
    switch (BYTE_TYPE(enc, ptr)) {
519
0
    case BT_DIGIT:
520
0
      break;
521
2
    default:
522
2
      *nextTokPtr = ptr;
523
2
      return XML_TOK_INVALID;
524
2
    }
525
0
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
526
0
      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
0
      default:
533
0
        *nextTokPtr = ptr;
534
0
        return XML_TOK_INVALID;
535
0
      }
536
0
    }
537
0
  }
538
0
  return XML_TOK_PARTIAL;
539
2
}
xmltok.c:normal_scanCharRef
Line
Count
Source
514
2
                    const char **nextTokPtr) {
515
2
  if (HAS_CHAR(enc, ptr, end)) {
516
2
    if (CHAR_MATCHES(enc, ptr, ASCII_x))
517
0
      return PREFIX(scanHexCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
518
2
    switch (BYTE_TYPE(enc, ptr)) {
519
0
    case BT_DIGIT:
520
0
      break;
521
2
    default:
522
2
      *nextTokPtr = ptr;
523
2
      return XML_TOK_INVALID;
524
2
    }
525
0
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
526
0
      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
0
      default:
533
0
        *nextTokPtr = ptr;
534
0
        return XML_TOK_INVALID;
535
0
      }
536
0
    }
537
0
  }
538
0
  return XML_TOK_PARTIAL;
539
2
}
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
144
                const char **nextTokPtr) {
546
144
  REQUIRE_CHAR(enc, ptr, end);
547
143
  switch (BYTE_TYPE(enc, ptr)) {
548
81
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
549
2
  case BT_NUM:
550
2
    return PREFIX(scanCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
551
17
  default:
552
17
    *nextTokPtr = ptr;
553
17
    return XML_TOK_INVALID;
554
143
  }
555
2.78k
  while (HAS_CHAR(enc, ptr, end)) {
556
2.78k
    switch (BYTE_TYPE(enc, ptr)) {
557
8.39k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
558
7
    case BT_SEMI:
559
7
      *nextTokPtr = ptr + MINBPC(enc);
560
7
      return XML_TOK_ENTITY_REF;
561
52
    default:
562
52
      *nextTokPtr = ptr;
563
52
      return XML_TOK_INVALID;
564
2.78k
    }
565
2.78k
  }
566
10
  return XML_TOK_PARTIAL;
567
105
}
xmltok.c:normal_scanRef
Line
Count
Source
545
112
                const char **nextTokPtr) {
546
112
  REQUIRE_CHAR(enc, ptr, end);
547
111
  switch (BYTE_TYPE(enc, ptr)) {
548
32
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
549
2
  case BT_NUM:
550
2
    return PREFIX(scanCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
551
11
  default:
552
11
    *nextTokPtr = ptr;
553
11
    return XML_TOK_INVALID;
554
111
  }
555
2.75k
  while (HAS_CHAR(enc, ptr, end)) {
556
2.75k
    switch (BYTE_TYPE(enc, ptr)) {
557
8.30k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
558
5
    case BT_SEMI:
559
5
      *nextTokPtr = ptr + MINBPC(enc);
560
5
      return XML_TOK_ENTITY_REF;
561
47
    default:
562
47
      *nextTokPtr = ptr;
563
47
      return XML_TOK_INVALID;
564
2.75k
    }
565
2.75k
  }
566
0
  return XML_TOK_PARTIAL;
567
87
}
xmltok.c:little2_scanRef
Line
Count
Source
545
30
                const char **nextTokPtr) {
546
30
  REQUIRE_CHAR(enc, ptr, end);
547
30
  switch (BYTE_TYPE(enc, ptr)) {
548
47
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
549
0
  case BT_NUM:
550
0
    return PREFIX(scanCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
551
6
  default:
552
6
    *nextTokPtr = ptr;
553
6
    return XML_TOK_INVALID;
554
30
  }
555
23
  while (HAS_CHAR(enc, ptr, end)) {
556
23
    switch (BYTE_TYPE(enc, ptr)) {
557
66
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
558
2
    case BT_SEMI:
559
2
      *nextTokPtr = ptr + MINBPC(enc);
560
2
      return XML_TOK_ENTITY_REF;
561
3
    default:
562
3
      *nextTokPtr = ptr;
563
3
      return XML_TOK_INVALID;
564
23
    }
565
23
  }
566
10
  return XML_TOK_PARTIAL;
567
16
}
xmltok.c:big2_scanRef
Line
Count
Source
545
2
                const char **nextTokPtr) {
546
2
  REQUIRE_CHAR(enc, ptr, end);
547
2
  switch (BYTE_TYPE(enc, ptr)) {
548
2
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
549
0
  case BT_NUM:
550
0
    return PREFIX(scanCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
551
0
  default:
552
0
    *nextTokPtr = ptr;
553
0
    return XML_TOK_INVALID;
554
2
  }
555
6
  while (HAS_CHAR(enc, ptr, end)) {
556
6
    switch (BYTE_TYPE(enc, ptr)) {
557
20
      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
2
    default:
562
2
      *nextTokPtr = ptr;
563
2
      return XML_TOK_INVALID;
564
6
    }
565
6
  }
566
0
  return XML_TOK_PARTIAL;
567
2
}
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
2.63k
                 const char **nextTokPtr) {
574
2.63k
#  ifdef XML_NS
575
2.63k
  int hadColon = 0;
576
2.63k
#  endif
577
485k
  while (HAS_CHAR(enc, ptr, end)) {
578
485k
    switch (BYTE_TYPE(enc, ptr)) {
579
1.58M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
580
0
#  ifdef XML_NS
581
28.5k
    case BT_COLON:
582
28.5k
      if (hadColon) {
583
8
        *nextTokPtr = ptr;
584
8
        return XML_TOK_INVALID;
585
8
      }
586
28.5k
      hadColon = 1;
587
28.5k
      ptr += MINBPC(enc);
588
28.5k
      REQUIRE_CHAR(enc, ptr, end);
589
28.5k
      switch (BYTE_TYPE(enc, ptr)) {
590
21.1k
        CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
591
11
      default:
592
11
        *nextTokPtr = ptr;
593
11
        return XML_TOK_INVALID;
594
28.5k
      }
595
28.5k
      break;
596
28.5k
#  endif
597
28.5k
    case BT_S:
598
93
    case BT_CR:
599
115
    case BT_LF:
600
16.3k
      for (;;) {
601
16.3k
        int t;
602
603
16.3k
        ptr += MINBPC(enc);
604
16.3k
        REQUIRE_CHAR(enc, ptr, end);
605
16.3k
        t = BYTE_TYPE(enc, ptr);
606
16.3k
        if (t == BT_EQUALS)
607
35
          break;
608
16.2k
        switch (t) {
609
451
        case BT_S:
610
12.9k
        case BT_LF:
611
16.1k
        case BT_CR:
612
16.1k
          break;
613
77
        default:
614
77
          *nextTokPtr = ptr;
615
77
          return XML_TOK_INVALID;
616
16.2k
        }
617
16.2k
      }
618
      /* fall through */
619
28.7k
    case BT_EQUALS: {
620
28.7k
      int open;
621
28.7k
#  ifdef XML_NS
622
28.7k
      hadColon = 0;
623
28.7k
#  endif
624
40.6k
      for (;;) {
625
40.6k
        ptr += MINBPC(enc);
626
40.6k
        REQUIRE_CHAR(enc, ptr, end);
627
40.6k
        open = BYTE_TYPE(enc, ptr);
628
40.6k
        if (open == BT_QUOT || open == BT_APOS)
629
28.7k
          break;
630
11.9k
        switch (open) {
631
299
        case BT_S:
632
9.70k
        case BT_LF:
633
11.8k
        case BT_CR:
634
11.8k
          break;
635
43
        default:
636
43
          *nextTokPtr = ptr;
637
43
          return XML_TOK_INVALID;
638
11.9k
        }
639
11.9k
      }
640
28.7k
      ptr += MINBPC(enc);
641
      /* in attribute value */
642
337k
      for (;;) {
643
337k
        int t;
644
337k
        REQUIRE_CHAR(enc, ptr, end);
645
337k
        t = BYTE_TYPE(enc, ptr);
646
337k
        if (t == open)
647
28.5k
          break;
648
308k
        switch (t) {
649
295
          INVALID_CASES(ptr, nextTokPtr)
650
103
        case BT_AMP: {
651
103
          int tok = PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, &ptr);
652
103
          if (tok <= 0) {
653
98
            if (tok == XML_TOK_INVALID)
654
98
              *nextTokPtr = ptr;
655
98
            return tok;
656
98
          }
657
5
          break;
658
103
        }
659
10
        case BT_LT:
660
10
          *nextTokPtr = ptr;
661
10
          return XML_TOK_INVALID;
662
308k
        default:
663
308k
          ptr += MINBPC(enc);
664
308k
          break;
665
308k
        }
666
308k
      }
667
28.5k
      ptr += MINBPC(enc);
668
28.5k
      REQUIRE_CHAR(enc, ptr, end);
669
28.5k
      switch (BYTE_TYPE(enc, ptr)) {
670
250
      case BT_S:
671
302
      case BT_CR:
672
26.5k
      case BT_LF:
673
26.5k
        break;
674
755
      case BT_SOL:
675
755
        goto sol;
676
1.19k
      case BT_GT:
677
1.19k
        goto gt;
678
13
      default:
679
13
        *nextTokPtr = ptr;
680
13
        return XML_TOK_INVALID;
681
28.5k
      }
682
      /* ptr points to closing quote */
683
112k
      for (;;) {
684
112k
        ptr += MINBPC(enc);
685
112k
        REQUIRE_CHAR(enc, ptr, end);
686
112k
        switch (BYTE_TYPE(enc, ptr)) {
687
6.90k
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
688
85.3k
        case BT_S:
689
86.2k
        case BT_CR:
690
86.2k
        case BT_LF:
691
86.2k
          continue;
692
3
        case BT_GT:
693
1.19k
        gt:
694
1.19k
          *nextTokPtr = ptr + MINBPC(enc);
695
1.19k
          return XML_TOK_START_TAG_WITH_ATTS;
696
3
        case BT_SOL:
697
758
        sol:
698
758
          ptr += MINBPC(enc);
699
758
          REQUIRE_CHAR(enc, ptr, end);
700
758
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
701
3
            *nextTokPtr = ptr;
702
3
            return XML_TOK_INVALID;
703
3
          }
704
755
          *nextTokPtr = ptr + MINBPC(enc);
705
755
          return XML_TOK_EMPTY_ELEMENT_WITH_ATTS;
706
17
        default:
707
17
          *nextTokPtr = ptr;
708
17
          return XML_TOK_INVALID;
709
112k
        }
710
26.5k
        break;
711
112k
      }
712
26.5k
      break;
713
26.5k
    }
714
26.5k
    default:
715
135
      *nextTokPtr = ptr;
716
135
      return XML_TOK_INVALID;
717
485k
    }
718
485k
  }
719
11
  return XML_TOK_PARTIAL;
720
2.63k
}
xmltok.c:normal_scanAtts
Line
Count
Source
573
2.55k
                 const char **nextTokPtr) {
574
2.55k
#  ifdef XML_NS
575
2.55k
  int hadColon = 0;
576
2.55k
#  endif
577
485k
  while (HAS_CHAR(enc, ptr, end)) {
578
485k
    switch (BYTE_TYPE(enc, ptr)) {
579
1.58M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
580
0
#  ifdef XML_NS
581
28.5k
    case BT_COLON:
582
28.5k
      if (hadColon) {
583
8
        *nextTokPtr = ptr;
584
8
        return XML_TOK_INVALID;
585
8
      }
586
28.5k
      hadColon = 1;
587
28.5k
      ptr += MINBPC(enc);
588
28.5k
      REQUIRE_CHAR(enc, ptr, end);
589
28.5k
      switch (BYTE_TYPE(enc, ptr)) {
590
21.1k
        CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
591
7
      default:
592
7
        *nextTokPtr = ptr;
593
7
        return XML_TOK_INVALID;
594
28.5k
      }
595
28.4k
      break;
596
28.4k
#  endif
597
28.4k
    case BT_S:
598
78
    case BT_CR:
599
97
    case BT_LF:
600
16.2k
      for (;;) {
601
16.2k
        int t;
602
603
16.2k
        ptr += MINBPC(enc);
604
16.2k
        REQUIRE_CHAR(enc, ptr, end);
605
16.2k
        t = BYTE_TYPE(enc, ptr);
606
16.2k
        if (t == BT_EQUALS)
607
35
          break;
608
16.2k
        switch (t) {
609
451
        case BT_S:
610
12.9k
        case BT_LF:
611
16.1k
        case BT_CR:
612
16.1k
          break;
613
59
        default:
614
59
          *nextTokPtr = ptr;
615
59
          return XML_TOK_INVALID;
616
16.2k
        }
617
16.2k
      }
618
      /* fall through */
619
28.7k
    case BT_EQUALS: {
620
28.7k
      int open;
621
28.7k
#  ifdef XML_NS
622
28.7k
      hadColon = 0;
623
28.7k
#  endif
624
40.6k
      for (;;) {
625
40.6k
        ptr += MINBPC(enc);
626
40.6k
        REQUIRE_CHAR(enc, ptr, end);
627
40.6k
        open = BYTE_TYPE(enc, ptr);
628
40.6k
        if (open == BT_QUOT || open == BT_APOS)
629
28.7k
          break;
630
11.9k
        switch (open) {
631
299
        case BT_S:
632
9.70k
        case BT_LF:
633
11.8k
        case BT_CR:
634
11.8k
          break;
635
41
        default:
636
41
          *nextTokPtr = ptr;
637
41
          return XML_TOK_INVALID;
638
11.9k
        }
639
11.9k
      }
640
28.7k
      ptr += MINBPC(enc);
641
      /* in attribute value */
642
337k
      for (;;) {
643
337k
        int t;
644
337k
        REQUIRE_CHAR(enc, ptr, end);
645
337k
        t = BYTE_TYPE(enc, ptr);
646
337k
        if (t == open)
647
28.5k
          break;
648
308k
        switch (t) {
649
295
          INVALID_CASES(ptr, nextTokPtr)
650
103
        case BT_AMP: {
651
103
          int tok = PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, &ptr);
652
103
          if (tok <= 0) {
653
98
            if (tok == XML_TOK_INVALID)
654
98
              *nextTokPtr = ptr;
655
98
            return tok;
656
98
          }
657
5
          break;
658
103
        }
659
10
        case BT_LT:
660
10
          *nextTokPtr = ptr;
661
10
          return XML_TOK_INVALID;
662
308k
        default:
663
308k
          ptr += MINBPC(enc);
664
308k
          break;
665
308k
        }
666
308k
      }
667
28.5k
      ptr += MINBPC(enc);
668
28.5k
      REQUIRE_CHAR(enc, ptr, end);
669
28.5k
      switch (BYTE_TYPE(enc, ptr)) {
670
250
      case BT_S:
671
302
      case BT_CR:
672
26.5k
      case BT_LF:
673
26.5k
        break;
674
755
      case BT_SOL:
675
755
        goto sol;
676
1.19k
      case BT_GT:
677
1.19k
        goto gt;
678
13
      default:
679
13
        *nextTokPtr = ptr;
680
13
        return XML_TOK_INVALID;
681
28.5k
      }
682
      /* ptr points to closing quote */
683
112k
      for (;;) {
684
112k
        ptr += MINBPC(enc);
685
112k
        REQUIRE_CHAR(enc, ptr, end);
686
112k
        switch (BYTE_TYPE(enc, ptr)) {
687
6.90k
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
688
85.3k
        case BT_S:
689
86.2k
        case BT_CR:
690
86.2k
        case BT_LF:
691
86.2k
          continue;
692
3
        case BT_GT:
693
1.19k
        gt:
694
1.19k
          *nextTokPtr = ptr + MINBPC(enc);
695
1.19k
          return XML_TOK_START_TAG_WITH_ATTS;
696
3
        case BT_SOL:
697
758
        sol:
698
758
          ptr += MINBPC(enc);
699
758
          REQUIRE_CHAR(enc, ptr, end);
700
758
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
701
3
            *nextTokPtr = ptr;
702
3
            return XML_TOK_INVALID;
703
3
          }
704
755
          *nextTokPtr = ptr + MINBPC(enc);
705
755
          return XML_TOK_EMPTY_ELEMENT_WITH_ATTS;
706
17
        default:
707
17
          *nextTokPtr = ptr;
708
17
          return XML_TOK_INVALID;
709
112k
        }
710
26.5k
        break;
711
112k
      }
712
26.5k
      break;
713
26.5k
    }
714
26.5k
    default:
715
112
      *nextTokPtr = ptr;
716
112
      return XML_TOK_INVALID;
717
485k
    }
718
485k
  }
719
6
  return XML_TOK_PARTIAL;
720
2.55k
}
xmltok.c:little2_scanAtts
Line
Count
Source
573
27
                 const char **nextTokPtr) {
574
27
#  ifdef XML_NS
575
27
  int hadColon = 0;
576
27
#  endif
577
67
  while (HAS_CHAR(enc, ptr, end)) {
578
67
    switch (BYTE_TYPE(enc, ptr)) {
579
207
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
580
0
#  ifdef XML_NS
581
0
    case BT_COLON:
582
0
      if (hadColon) {
583
0
        *nextTokPtr = ptr;
584
0
        return XML_TOK_INVALID;
585
0
      }
586
0
      hadColon = 1;
587
0
      ptr += MINBPC(enc);
588
0
      REQUIRE_CHAR(enc, ptr, end);
589
0
      switch (BYTE_TYPE(enc, ptr)) {
590
0
        CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
591
0
      default:
592
0
        *nextTokPtr = ptr;
593
0
        return XML_TOK_INVALID;
594
0
      }
595
0
      break;
596
0
#  endif
597
6
    case BT_S:
598
10
    case BT_CR:
599
13
    case BT_LF:
600
13
      for (;;) {
601
13
        int t;
602
603
13
        ptr += MINBPC(enc);
604
13
        REQUIRE_CHAR(enc, ptr, end);
605
13
        t = BYTE_TYPE(enc, ptr);
606
13
        if (t == BT_EQUALS)
607
0
          break;
608
13
        switch (t) {
609
0
        case BT_S:
610
0
        case BT_LF:
611
0
        case BT_CR:
612
0
          break;
613
13
        default:
614
13
          *nextTokPtr = ptr;
615
13
          return XML_TOK_INVALID;
616
13
        }
617
13
      }
618
      /* fall through */
619
0
    case BT_EQUALS: {
620
0
      int open;
621
0
#  ifdef XML_NS
622
0
      hadColon = 0;
623
0
#  endif
624
0
      for (;;) {
625
0
        ptr += MINBPC(enc);
626
0
        REQUIRE_CHAR(enc, ptr, end);
627
0
        open = BYTE_TYPE(enc, ptr);
628
0
        if (open == BT_QUOT || open == BT_APOS)
629
0
          break;
630
0
        switch (open) {
631
0
        case BT_S:
632
0
        case BT_LF:
633
0
        case BT_CR:
634
0
          break;
635
0
        default:
636
0
          *nextTokPtr = ptr;
637
0
          return XML_TOK_INVALID;
638
0
        }
639
0
      }
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
8
    default:
715
8
      *nextTokPtr = ptr;
716
8
      return XML_TOK_INVALID;
717
67
    }
718
67
  }
719
1
  return XML_TOK_PARTIAL;
720
27
}
xmltok.c:big2_scanAtts
Line
Count
Source
573
50
                 const char **nextTokPtr) {
574
50
#  ifdef XML_NS
575
50
  int hadColon = 0;
576
50
#  endif
577
370
  while (HAS_CHAR(enc, ptr, end)) {
578
370
    switch (BYTE_TYPE(enc, ptr)) {
579
1.46k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
580
0
#  ifdef XML_NS
581
11
    case BT_COLON:
582
11
      if (hadColon) {
583
0
        *nextTokPtr = ptr;
584
0
        return XML_TOK_INVALID;
585
0
      }
586
11
      hadColon = 1;
587
11
      ptr += MINBPC(enc);
588
11
      REQUIRE_CHAR(enc, ptr, end);
589
9
      switch (BYTE_TYPE(enc, ptr)) {
590
10
        CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
591
4
      default:
592
4
        *nextTokPtr = ptr;
593
4
        return XML_TOK_INVALID;
594
9
      }
595
5
      break;
596
5
#  endif
597
5
    case BT_S:
598
5
    case BT_CR:
599
5
    case BT_LF:
600
5
      for (;;) {
601
5
        int t;
602
603
5
        ptr += MINBPC(enc);
604
5
        REQUIRE_CHAR(enc, ptr, end);
605
5
        t = BYTE_TYPE(enc, ptr);
606
5
        if (t == BT_EQUALS)
607
0
          break;
608
5
        switch (t) {
609
0
        case BT_S:
610
0
        case BT_LF:
611
0
        case BT_CR:
612
0
          break;
613
5
        default:
614
5
          *nextTokPtr = ptr;
615
5
          return XML_TOK_INVALID;
616
5
        }
617
5
      }
618
      /* fall through */
619
2
    case BT_EQUALS: {
620
2
      int open;
621
2
#  ifdef XML_NS
622
2
      hadColon = 0;
623
2
#  endif
624
2
      for (;;) {
625
2
        ptr += MINBPC(enc);
626
2
        REQUIRE_CHAR(enc, ptr, end);
627
2
        open = BYTE_TYPE(enc, ptr);
628
2
        if (open == BT_QUOT || open == BT_APOS)
629
0
          break;
630
2
        switch (open) {
631
0
        case BT_S:
632
0
        case BT_LF:
633
0
        case BT_CR:
634
0
          break;
635
2
        default:
636
2
          *nextTokPtr = ptr;
637
2
          return XML_TOK_INVALID;
638
2
        }
639
2
      }
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
15
    default:
715
15
      *nextTokPtr = ptr;
716
15
      return XML_TOK_INVALID;
717
370
    }
718
370
  }
719
4
  return XML_TOK_PARTIAL;
720
50
}
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
19.6k
               const char **nextTokPtr) {
727
19.6k
#  ifdef XML_NS
728
19.6k
  int hadColon;
729
19.6k
#  endif
730
19.6k
  REQUIRE_CHAR(enc, ptr, end);
731
19.6k
  switch (BYTE_TYPE(enc, ptr)) {
732
9.68k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
733
26
  case BT_EXCL:
734
26
    ptr += MINBPC(enc);
735
26
    REQUIRE_CHAR(enc, ptr, end);
736
26
    switch (BYTE_TYPE(enc, ptr)) {
737
22
    case BT_MINUS:
738
22
      return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
739
0
    case BT_LSQB:
740
0
      return PREFIX(scanCdataSection)(enc, ptr + MINBPC(enc), end, nextTokPtr);
741
26
    }
742
4
    *nextTokPtr = ptr;
743
4
    return XML_TOK_INVALID;
744
10
  case BT_QUEST:
745
10
    return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
746
8.53k
  case BT_SOL:
747
8.53k
    return PREFIX(scanEndTag)(enc, ptr + MINBPC(enc), end, nextTokPtr);
748
7
  default:
749
7
    *nextTokPtr = ptr;
750
7
    return XML_TOK_INVALID;
751
19.6k
  }
752
11.0k
#  ifdef XML_NS
753
11.0k
  hadColon = 0;
754
11.0k
#  endif
755
  /* we have a start-tag */
756
108k
  while (HAS_CHAR(enc, ptr, end)) {
757
108k
    switch (BYTE_TYPE(enc, ptr)) {
758
284k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
759
0
#  ifdef XML_NS
760
10.5k
    case BT_COLON:
761
10.5k
      if (hadColon) {
762
6
        *nextTokPtr = ptr;
763
6
        return XML_TOK_INVALID;
764
6
      }
765
10.5k
      hadColon = 1;
766
10.5k
      ptr += MINBPC(enc);
767
10.5k
      REQUIRE_CHAR(enc, ptr, end);
768
10.5k
      switch (BYTE_TYPE(enc, ptr)) {
769
9.03k
        CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
770
12
      default:
771
12
        *nextTokPtr = ptr;
772
12
        return XML_TOK_INVALID;
773
10.5k
      }
774
10.5k
      break;
775
10.5k
#  endif
776
10.5k
    case BT_S:
777
1.99k
    case BT_CR:
778
2.78k
    case BT_LF: {
779
2.78k
      ptr += MINBPC(enc);
780
9.08k
      while (HAS_CHAR(enc, ptr, end)) {
781
9.08k
        switch (BYTE_TYPE(enc, ptr)) {
782
2.74k
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
783
57
        case BT_GT:
784
57
          goto gt;
785
14
        case BT_SOL:
786
14
          goto sol;
787
4.55k
        case BT_S:
788
5.31k
        case BT_CR:
789
6.29k
        case BT_LF:
790
6.29k
          ptr += MINBPC(enc);
791
6.29k
          continue;
792
32
        default:
793
32
          *nextTokPtr = ptr;
794
32
          return XML_TOK_INVALID;
795
9.08k
        }
796
2.63k
        return PREFIX(scanAtts)(enc, ptr, end, nextTokPtr);
797
9.08k
      }
798
1
      return XML_TOK_PARTIAL;
799
2.78k
    }
800
7.99k
    case BT_GT:
801
8.04k
    gt:
802
8.04k
      *nextTokPtr = ptr + MINBPC(enc);
803
8.04k
      return XML_TOK_START_TAG_NO_ATTS;
804
22
    case BT_SOL:
805
36
    sol:
806
36
      ptr += MINBPC(enc);
807
36
      REQUIRE_CHAR(enc, ptr, end);
808
36
      if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
809
30
        *nextTokPtr = ptr;
810
30
        return XML_TOK_INVALID;
811
30
      }
812
6
      *nextTokPtr = ptr + MINBPC(enc);
813
6
      return XML_TOK_EMPTY_ELEMENT_NO_ATTS;
814
66
    default:
815
66
      *nextTokPtr = ptr;
816
66
      return XML_TOK_INVALID;
817
108k
    }
818
108k
  }
819
20
  return XML_TOK_PARTIAL;
820
11.0k
}
xmltok.c:normal_scanLt
Line
Count
Source
726
19.3k
               const char **nextTokPtr) {
727
19.3k
#  ifdef XML_NS
728
19.3k
  int hadColon;
729
19.3k
#  endif
730
19.3k
  REQUIRE_CHAR(enc, ptr, end);
731
19.3k
  switch (BYTE_TYPE(enc, ptr)) {
732
9.21k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
733
26
  case BT_EXCL:
734
26
    ptr += MINBPC(enc);
735
26
    REQUIRE_CHAR(enc, ptr, end);
736
26
    switch (BYTE_TYPE(enc, ptr)) {
737
22
    case BT_MINUS:
738
22
      return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
739
0
    case BT_LSQB:
740
0
      return PREFIX(scanCdataSection)(enc, ptr + MINBPC(enc), end, nextTokPtr);
741
26
    }
742
4
    *nextTokPtr = ptr;
743
4
    return XML_TOK_INVALID;
744
10
  case BT_QUEST:
745
10
    return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
746
8.53k
  case BT_SOL:
747
8.53k
    return PREFIX(scanEndTag)(enc, ptr + MINBPC(enc), end, nextTokPtr);
748
5
  default:
749
5
    *nextTokPtr = ptr;
750
5
    return XML_TOK_INVALID;
751
19.3k
  }
752
10.7k
#  ifdef XML_NS
753
10.7k
  hadColon = 0;
754
10.7k
#  endif
755
  /* we have a start-tag */
756
106k
  while (HAS_CHAR(enc, ptr, end)) {
757
106k
    switch (BYTE_TYPE(enc, ptr)) {
758
279k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
759
0
#  ifdef XML_NS
760
10.5k
    case BT_COLON:
761
10.5k
      if (hadColon) {
762
6
        *nextTokPtr = ptr;
763
6
        return XML_TOK_INVALID;
764
6
      }
765
10.5k
      hadColon = 1;
766
10.5k
      ptr += MINBPC(enc);
767
10.5k
      REQUIRE_CHAR(enc, ptr, end);
768
10.5k
      switch (BYTE_TYPE(enc, ptr)) {
769
9.02k
        CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
770
9
      default:
771
9
        *nextTokPtr = ptr;
772
9
        return XML_TOK_INVALID;
773
10.5k
      }
774
10.5k
      break;
775
10.5k
#  endif
776
10.5k
    case BT_S:
777
1.90k
    case BT_CR:
778
2.68k
    case BT_LF: {
779
2.68k
      ptr += MINBPC(enc);
780
8.98k
      while (HAS_CHAR(enc, ptr, end)) {
781
8.98k
        switch (BYTE_TYPE(enc, ptr)) {
782
2.61k
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
783
52
        case BT_GT:
784
52
          goto gt;
785
14
        case BT_SOL:
786
14
          goto sol;
787
4.55k
        case BT_S:
788
5.31k
        case BT_CR:
789
6.29k
        case BT_LF:
790
6.29k
          ptr += MINBPC(enc);
791
6.29k
          continue;
792
25
        default:
793
25
          *nextTokPtr = ptr;
794
25
          return XML_TOK_INVALID;
795
8.98k
        }
796
2.55k
        return PREFIX(scanAtts)(enc, ptr, end, nextTokPtr);
797
8.98k
      }
798
0
      return XML_TOK_PARTIAL;
799
2.68k
    }
800
7.91k
    case BT_GT:
801
7.96k
    gt:
802
7.96k
      *nextTokPtr = ptr + MINBPC(enc);
803
7.96k
      return XML_TOK_START_TAG_NO_ATTS;
804
16
    case BT_SOL:
805
30
    sol:
806
30
      ptr += MINBPC(enc);
807
30
      REQUIRE_CHAR(enc, ptr, end);
808
30
      if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
809
27
        *nextTokPtr = ptr;
810
27
        return XML_TOK_INVALID;
811
27
      }
812
3
      *nextTokPtr = ptr + MINBPC(enc);
813
3
      return XML_TOK_EMPTY_ELEMENT_NO_ATTS;
814
48
    default:
815
48
      *nextTokPtr = ptr;
816
48
      return XML_TOK_INVALID;
817
106k
    }
818
106k
  }
819
3
  return XML_TOK_PARTIAL;
820
10.7k
}
xmltok.c:little2_scanLt
Line
Count
Source
726
160
               const char **nextTokPtr) {
727
160
#  ifdef XML_NS
728
160
  int hadColon;
729
160
#  endif
730
160
  REQUIRE_CHAR(enc, ptr, end);
731
160
  switch (BYTE_TYPE(enc, ptr)) {
732
308
    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
0
  case BT_SOL:
747
0
    return PREFIX(scanEndTag)(enc, ptr + MINBPC(enc), end, nextTokPtr);
748
0
  default:
749
0
    *nextTokPtr = ptr;
750
0
    return XML_TOK_INVALID;
751
160
  }
752
143
#  ifdef XML_NS
753
143
  hadColon = 0;
754
143
#  endif
755
  /* we have a start-tag */
756
950
  while (HAS_CHAR(enc, ptr, end)) {
757
950
    switch (BYTE_TYPE(enc, ptr)) {
758
3.76k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
759
0
#  ifdef XML_NS
760
9
    case BT_COLON:
761
9
      if (hadColon) {
762
0
        *nextTokPtr = ptr;
763
0
        return XML_TOK_INVALID;
764
0
      }
765
9
      hadColon = 1;
766
9
      ptr += MINBPC(enc);
767
9
      REQUIRE_CHAR(enc, ptr, end);
768
9
      switch (BYTE_TYPE(enc, ptr)) {
769
9
        CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
770
3
      default:
771
3
        *nextTokPtr = ptr;
772
3
        return XML_TOK_INVALID;
773
9
      }
774
3
      break;
775
3
#  endif
776
5
    case BT_S:
777
26
    case BT_CR:
778
34
    case BT_LF: {
779
34
      ptr += MINBPC(enc);
780
34
      while (HAS_CHAR(enc, ptr, end)) {
781
34
        switch (BYTE_TYPE(enc, ptr)) {
782
55
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
783
1
        case BT_GT:
784
1
          goto gt;
785
0
        case BT_SOL:
786
0
          goto sol;
787
0
        case BT_S:
788
0
        case BT_CR:
789
0
        case BT_LF:
790
0
          ptr += MINBPC(enc);
791
0
          continue;
792
4
        default:
793
4
          *nextTokPtr = ptr;
794
4
          return XML_TOK_INVALID;
795
34
        }
796
27
        return PREFIX(scanAtts)(enc, ptr, end, nextTokPtr);
797
34
      }
798
0
      return XML_TOK_PARTIAL;
799
34
    }
800
57
    case BT_GT:
801
58
    gt:
802
58
      *nextTokPtr = ptr + MINBPC(enc);
803
58
      return XML_TOK_START_TAG_NO_ATTS;
804
6
    case BT_SOL:
805
6
    sol:
806
6
      ptr += MINBPC(enc);
807
6
      REQUIRE_CHAR(enc, ptr, end);
808
6
      if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
809
3
        *nextTokPtr = ptr;
810
3
        return XML_TOK_INVALID;
811
3
      }
812
3
      *nextTokPtr = ptr + MINBPC(enc);
813
3
      return XML_TOK_EMPTY_ELEMENT_NO_ATTS;
814
11
    default:
815
11
      *nextTokPtr = ptr;
816
11
      return XML_TOK_INVALID;
817
950
    }
818
950
  }
819
9
  return XML_TOK_PARTIAL;
820
143
}
xmltok.c:big2_scanLt
Line
Count
Source
726
126
               const char **nextTokPtr) {
727
126
#  ifdef XML_NS
728
126
  int hadColon;
729
126
#  endif
730
126
  REQUIRE_CHAR(enc, ptr, end);
731
126
  switch (BYTE_TYPE(enc, ptr)) {
732
165
    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
0
  case BT_SOL:
747
0
    return PREFIX(scanEndTag)(enc, ptr + MINBPC(enc), end, nextTokPtr);
748
2
  default:
749
2
    *nextTokPtr = ptr;
750
2
    return XML_TOK_INVALID;
751
126
  }
752
111
#  ifdef XML_NS
753
111
  hadColon = 0;
754
111
#  endif
755
  /* we have a start-tag */
756
362
  while (HAS_CHAR(enc, ptr, end)) {
757
362
    switch (BYTE_TYPE(enc, ptr)) {
758
1.22k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
759
0
#  ifdef XML_NS
760
0
    case BT_COLON:
761
0
      if (hadColon) {
762
0
        *nextTokPtr = ptr;
763
0
        return XML_TOK_INVALID;
764
0
      }
765
0
      hadColon = 1;
766
0
      ptr += MINBPC(enc);
767
0
      REQUIRE_CHAR(enc, ptr, end);
768
0
      switch (BYTE_TYPE(enc, ptr)) {
769
0
        CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
770
0
      default:
771
0
        *nextTokPtr = ptr;
772
0
        return XML_TOK_INVALID;
773
0
      }
774
0
      break;
775
0
#  endif
776
63
    case BT_S:
777
63
    case BT_CR:
778
63
    case BT_LF: {
779
63
      ptr += MINBPC(enc);
780
63
      while (HAS_CHAR(enc, ptr, end)) {
781
62
        switch (BYTE_TYPE(enc, ptr)) {
782
71
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
783
4
        case BT_GT:
784
4
          goto gt;
785
0
        case BT_SOL:
786
0
          goto sol;
787
0
        case BT_S:
788
0
        case BT_CR:
789
0
        case BT_LF:
790
0
          ptr += MINBPC(enc);
791
0
          continue;
792
3
        default:
793
3
          *nextTokPtr = ptr;
794
3
          return XML_TOK_INVALID;
795
62
        }
796
50
        return PREFIX(scanAtts)(enc, ptr, end, nextTokPtr);
797
62
      }
798
1
      return XML_TOK_PARTIAL;
799
63
    }
800
18
    case BT_GT:
801
22
    gt:
802
22
      *nextTokPtr = ptr + MINBPC(enc);
803
22
      return XML_TOK_START_TAG_NO_ATTS;
804
0
    case BT_SOL:
805
0
    sol:
806
0
      ptr += MINBPC(enc);
807
0
      REQUIRE_CHAR(enc, ptr, end);
808
0
      if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
809
0
        *nextTokPtr = ptr;
810
0
        return XML_TOK_INVALID;
811
0
      }
812
0
      *nextTokPtr = ptr + MINBPC(enc);
813
0
      return XML_TOK_EMPTY_ELEMENT_NO_ATTS;
814
7
    default:
815
7
      *nextTokPtr = ptr;
816
7
      return XML_TOK_INVALID;
817
362
    }
818
362
  }
819
8
  return XML_TOK_PARTIAL;
820
111
}
821
822
static int PTRCALL
823
PREFIX(contentTok)(const ENCODING *enc, const char *ptr, const char *end,
824
51.6k
                   const char **nextTokPtr) {
825
51.6k
  if (ptr >= end)
826
6
    return XML_TOK_NONE;
827
51.6k
  if (MINBPC(enc) > 1) {
828
443
    size_t n = end - ptr;
829
443
    if (n & (MINBPC(enc) - 1)) {
830
360
      n &= ~(MINBPC(enc) - 1);
831
360
      if (n == 0)
832
18
        return XML_TOK_PARTIAL;
833
342
      end = ptr + n;
834
342
    }
835
443
  }
836
51.6k
  switch (BYTE_TYPE(enc, ptr)) {
837
19.6k
  case BT_LT:
838
19.6k
    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
56
  case BT_CR:
842
56
    ptr += MINBPC(enc);
843
56
    if (! HAS_CHAR(enc, ptr, end))
844
0
      return XML_TOK_TRAILING_CR;
845
56
    if (BYTE_TYPE(enc, ptr) == BT_LF)
846
0
      ptr += MINBPC(enc);
847
56
    *nextTokPtr = ptr;
848
56
    return XML_TOK_DATA_NEWLINE;
849
13.6k
  case BT_LF:
850
13.6k
    *nextTokPtr = ptr + MINBPC(enc);
851
13.6k
    return XML_TOK_DATA_NEWLINE;
852
21
  case BT_RSQB:
853
21
    ptr += MINBPC(enc);
854
21
    if (! HAS_CHAR(enc, ptr, end))
855
4
      return XML_TOK_TRAILING_RSQB;
856
17
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
857
10
      break;
858
7
    ptr += MINBPC(enc);
859
7
    if (! HAS_CHAR(enc, ptr, end))
860
4
      return XML_TOK_TRAILING_RSQB;
861
3
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
862
3
      ptr -= MINBPC(enc);
863
3
      break;
864
3
    }
865
0
    *nextTokPtr = ptr;
866
0
    return XML_TOK_INVALID;
867
80
    INVALID_CASES(ptr, nextTokPtr)
868
18.1k
  default:
869
18.1k
    ptr += MINBPC(enc);
870
18.1k
    break;
871
51.6k
  }
872
96.5k
  while (HAS_CHAR(enc, ptr, end)) {
873
96.5k
    switch (BYTE_TYPE(enc, ptr)) {
874
0
#  define LEAD_CASE(n)                                                         \
875
181
  case BT_LEAD##n:                                                             \
876
181
    if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) {                       \
877
18
      *nextTokPtr = ptr;                                                       \
878
18
      return XML_TOK_DATA_CHARS;                                               \
879
18
    }                                                                          \
880
163
    ptr += n;                                                                  \
881
163
    break;
882
144
      LEAD_CASE(2)
883
10
      LEAD_CASE(3)
884
27
      LEAD_CASE(4)
885
0
#  undef LEAD_CASE
886
147
    case BT_RSQB:
887
147
      if (HAS_CHARS(enc, ptr, end, 2)) {
888
143
        if (! CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_RSQB)) {
889
135
          ptr += MINBPC(enc);
890
135
          break;
891
135
        }
892
8
        if (HAS_CHARS(enc, ptr, end, 3)) {
893
4
          if (! CHAR_MATCHES(enc, ptr + 2 * MINBPC(enc), ASCII_GT)) {
894
3
            ptr += MINBPC(enc);
895
3
            break;
896
3
          }
897
1
          *nextTokPtr = ptr + 2 * MINBPC(enc);
898
1
          return XML_TOK_INVALID;
899
4
        }
900
8
      }
901
      /* fall through */
902
49
    case BT_AMP:
903
18.0k
    case BT_LT:
904
18.0k
    case BT_NONXML:
905
18.0k
    case BT_MALFORM:
906
18.1k
    case BT_TRAIL:
907
18.1k
    case BT_CR:
908
18.1k
    case BT_LF:
909
18.1k
      *nextTokPtr = ptr;
910
18.1k
      return XML_TOK_DATA_CHARS;
911
78.1k
    default:
912
78.1k
      ptr += MINBPC(enc);
913
78.1k
      break;
914
96.5k
    }
915
96.5k
  }
916
24
  *nextTokPtr = ptr;
917
24
  return XML_TOK_DATA_CHARS;
918
18.1k
}
xmltok.c:normal_contentTok
Line
Count
Source
824
51.2k
                   const char **nextTokPtr) {
825
51.2k
  if (ptr >= end)
826
3
    return XML_TOK_NONE;
827
51.2k
  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
51.2k
  switch (BYTE_TYPE(enc, ptr)) {
837
19.3k
  case BT_LT:
838
19.3k
    return PREFIX(scanLt)(enc, ptr + MINBPC(enc), end, nextTokPtr);
839
9
  case BT_AMP:
840
9
    return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
841
53
  case BT_CR:
842
53
    ptr += MINBPC(enc);
843
53
    if (! HAS_CHAR(enc, ptr, end))
844
0
      return XML_TOK_TRAILING_CR;
845
53
    if (BYTE_TYPE(enc, ptr) == BT_LF)
846
0
      ptr += MINBPC(enc);
847
53
    *nextTokPtr = ptr;
848
53
    return XML_TOK_DATA_NEWLINE;
849
13.6k
  case BT_LF:
850
13.6k
    *nextTokPtr = ptr + MINBPC(enc);
851
13.6k
    return XML_TOK_DATA_NEWLINE;
852
21
  case BT_RSQB:
853
21
    ptr += MINBPC(enc);
854
21
    if (! HAS_CHAR(enc, ptr, end))
855
4
      return XML_TOK_TRAILING_RSQB;
856
17
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
857
10
      break;
858
7
    ptr += MINBPC(enc);
859
7
    if (! HAS_CHAR(enc, ptr, end))
860
4
      return XML_TOK_TRAILING_RSQB;
861
3
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
862
3
      ptr -= MINBPC(enc);
863
3
      break;
864
3
    }
865
0
    *nextTokPtr = ptr;
866
0
    return XML_TOK_INVALID;
867
58
    INVALID_CASES(ptr, nextTokPtr)
868
18.0k
  default:
869
18.0k
    ptr += MINBPC(enc);
870
18.0k
    break;
871
51.2k
  }
872
95.9k
  while (HAS_CHAR(enc, ptr, end)) {
873
95.9k
    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
144
      LEAD_CASE(2)
883
10
      LEAD_CASE(3)
884
20
      LEAD_CASE(4)
885
0
#  undef LEAD_CASE
886
145
    case BT_RSQB:
887
145
      if (HAS_CHARS(enc, ptr, end, 2)) {
888
141
        if (! CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_RSQB)) {
889
133
          ptr += MINBPC(enc);
890
133
          break;
891
133
        }
892
8
        if (HAS_CHARS(enc, ptr, end, 3)) {
893
4
          if (! CHAR_MATCHES(enc, ptr + 2 * MINBPC(enc), ASCII_GT)) {
894
3
            ptr += MINBPC(enc);
895
3
            break;
896
3
          }
897
1
          *nextTokPtr = ptr + 2 * MINBPC(enc);
898
1
          return XML_TOK_INVALID;
899
4
        }
900
8
      }
901
      /* fall through */
902
17
    case BT_AMP:
903
18.0k
    case BT_LT:
904
18.0k
    case BT_NONXML:
905
18.0k
    case BT_MALFORM:
906
18.0k
    case BT_TRAIL:
907
18.0k
    case BT_CR:
908
18.0k
    case BT_LF:
909
18.0k
      *nextTokPtr = ptr;
910
18.0k
      return XML_TOK_DATA_CHARS;
911
77.5k
    default:
912
77.5k
      ptr += MINBPC(enc);
913
77.5k
      break;
914
95.9k
    }
915
95.9k
  }
916
3
  *nextTokPtr = ptr;
917
3
  return XML_TOK_DATA_CHARS;
918
18.0k
}
xmltok.c:little2_contentTok
Line
Count
Source
824
280
                   const char **nextTokPtr) {
825
280
  if (ptr >= end)
826
2
    return XML_TOK_NONE;
827
278
  if (MINBPC(enc) > 1) {
828
278
    size_t n = end - ptr;
829
278
    if (n & (MINBPC(enc) - 1)) {
830
228
      n &= ~(MINBPC(enc) - 1);
831
228
      if (n == 0)
832
9
        return XML_TOK_PARTIAL;
833
219
      end = ptr + n;
834
219
    }
835
278
  }
836
269
  switch (BYTE_TYPE(enc, ptr)) {
837
160
  case BT_LT:
838
160
    return PREFIX(scanLt)(enc, ptr + MINBPC(enc), end, nextTokPtr);
839
30
  case BT_AMP:
840
30
    return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
841
2
  case BT_CR:
842
2
    ptr += MINBPC(enc);
843
2
    if (! HAS_CHAR(enc, ptr, end))
844
0
      return XML_TOK_TRAILING_CR;
845
2
    if (BYTE_TYPE(enc, ptr) == BT_LF)
846
0
      ptr += MINBPC(enc);
847
2
    *nextTokPtr = ptr;
848
2
    return XML_TOK_DATA_NEWLINE;
849
0
  case BT_LF:
850
0
    *nextTokPtr = ptr + MINBPC(enc);
851
0
    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
13
    INVALID_CASES(ptr, nextTokPtr)
868
60
  default:
869
60
    ptr += MINBPC(enc);
870
60
    break;
871
269
  }
872
365
  while (HAS_CHAR(enc, ptr, end)) {
873
365
    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
4
      LEAD_CASE(4)
885
0
#  undef LEAD_CASE
886
1
    case BT_RSQB:
887
1
      if (HAS_CHARS(enc, ptr, end, 2)) {
888
1
        if (! CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_RSQB)) {
889
1
          ptr += MINBPC(enc);
890
1
          break;
891
1
        }
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
30
    case BT_AMP:
903
30
    case BT_LT:
904
36
    case BT_NONXML:
905
36
    case BT_MALFORM:
906
46
    case BT_TRAIL:
907
48
    case BT_CR:
908
48
    case BT_LF:
909
48
      *nextTokPtr = ptr;
910
48
      return XML_TOK_DATA_CHARS;
911
312
    default:
912
312
      ptr += MINBPC(enc);
913
312
      break;
914
365
    }
915
365
  }
916
11
  *nextTokPtr = ptr;
917
11
  return XML_TOK_DATA_CHARS;
918
60
}
xmltok.c:big2_contentTok
Line
Count
Source
824
166
                   const char **nextTokPtr) {
825
166
  if (ptr >= end)
826
1
    return XML_TOK_NONE;
827
165
  if (MINBPC(enc) > 1) {
828
165
    size_t n = end - ptr;
829
165
    if (n & (MINBPC(enc) - 1)) {
830
132
      n &= ~(MINBPC(enc) - 1);
831
132
      if (n == 0)
832
9
        return XML_TOK_PARTIAL;
833
123
      end = ptr + n;
834
123
    }
835
165
  }
836
156
  switch (BYTE_TYPE(enc, ptr)) {
837
126
  case BT_LT:
838
126
    return PREFIX(scanLt)(enc, ptr + MINBPC(enc), end, nextTokPtr);
839
2
  case BT_AMP:
840
2
    return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
841
1
  case BT_CR:
842
1
    ptr += MINBPC(enc);
843
1
    if (! HAS_CHAR(enc, ptr, end))
844
0
      return XML_TOK_TRAILING_CR;
845
1
    if (BYTE_TYPE(enc, ptr) == BT_LF)
846
0
      ptr += MINBPC(enc);
847
1
    *nextTokPtr = ptr;
848
1
    return XML_TOK_DATA_NEWLINE;
849
0
  case BT_LF:
850
0
    *nextTokPtr = ptr + MINBPC(enc);
851
0
    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
9
    INVALID_CASES(ptr, nextTokPtr)
868
22
  default:
869
22
    ptr += MINBPC(enc);
870
22
    break;
871
156
  }
872
275
  while (HAS_CHAR(enc, ptr, end)) {
873
275
    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
3
      LEAD_CASE(4)
885
0
#  undef LEAD_CASE
886
1
    case BT_RSQB:
887
1
      if (HAS_CHARS(enc, ptr, end, 2)) {
888
1
        if (! CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_RSQB)) {
889
1
          ptr += MINBPC(enc);
890
1
          break;
891
1
        }
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
2
    case BT_AMP:
903
7
    case BT_LT:
904
10
    case BT_NONXML:
905
10
    case BT_MALFORM:
906
10
    case BT_TRAIL:
907
11
    case BT_CR:
908
11
    case BT_LF:
909
11
      *nextTokPtr = ptr;
910
11
      return XML_TOK_DATA_CHARS;
911
260
    default:
912
260
      ptr += MINBPC(enc);
913
260
      break;
914
275
    }
915
275
  }
916
10
  *nextTokPtr = ptr;
917
10
  return XML_TOK_DATA_CHARS;
918
22
}
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
90
                    const char **nextTokPtr) {
925
90
  REQUIRE_CHAR(enc, ptr, end);
926
89
  switch (BYTE_TYPE(enc, ptr)) {
927
106
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
928
1
  case BT_S:
929
1
  case BT_LF:
930
5
  case BT_CR:
931
8
  case BT_PERCNT:
932
8
    *nextTokPtr = ptr;
933
8
    return XML_TOK_PERCENT;
934
8
  default:
935
8
    *nextTokPtr = ptr;
936
8
    return XML_TOK_INVALID;
937
89
  }
938
564
  while (HAS_CHAR(enc, ptr, end)) {
939
564
    switch (BYTE_TYPE(enc, ptr)) {
940
1.74k
      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
26
    default:
945
26
      *nextTokPtr = ptr;
946
26
      return XML_TOK_INVALID;
947
564
    }
948
564
  }
949
2
  return XML_TOK_PARTIAL;
950
56
}
xmltok.c:normal_scanPercent
Line
Count
Source
924
58
                    const char **nextTokPtr) {
925
58
  REQUIRE_CHAR(enc, ptr, end);
926
58
  switch (BYTE_TYPE(enc, ptr)) {
927
59
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
928
1
  case BT_S:
929
1
  case BT_LF:
930
5
  case BT_CR:
931
8
  case BT_PERCNT:
932
8
    *nextTokPtr = ptr;
933
8
    return XML_TOK_PERCENT;
934
3
  default:
935
3
    *nextTokPtr = ptr;
936
3
    return XML_TOK_INVALID;
937
58
  }
938
456
  while (HAS_CHAR(enc, ptr, end)) {
939
456
    switch (BYTE_TYPE(enc, ptr)) {
940
1.30k
      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
16
    default:
945
16
      *nextTokPtr = ptr;
946
16
      return XML_TOK_INVALID;
947
456
    }
948
456
  }
949
0
  return XML_TOK_PARTIAL;
950
32
}
xmltok.c:little2_scanPercent
Line
Count
Source
924
18
                    const char **nextTokPtr) {
925
18
  REQUIRE_CHAR(enc, ptr, end);
926
17
  switch (BYTE_TYPE(enc, ptr)) {
927
20
    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
5
  default:
935
5
    *nextTokPtr = ptr;
936
5
    return XML_TOK_INVALID;
937
17
  }
938
28
  while (HAS_CHAR(enc, ptr, end)) {
939
28
    switch (BYTE_TYPE(enc, ptr)) {
940
92
      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
4
    default:
945
4
      *nextTokPtr = ptr;
946
4
      return XML_TOK_INVALID;
947
28
    }
948
28
  }
949
0
  return XML_TOK_PARTIAL;
950
11
}
xmltok.c:big2_scanPercent
Line
Count
Source
924
14
                    const char **nextTokPtr) {
925
14
  REQUIRE_CHAR(enc, ptr, end);
926
14
  switch (BYTE_TYPE(enc, ptr)) {
927
27
    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
0
  default:
935
0
    *nextTokPtr = ptr;
936
0
    return XML_TOK_INVALID;
937
14
  }
938
80
  while (HAS_CHAR(enc, ptr, end)) {
939
80
    switch (BYTE_TYPE(enc, ptr)) {
940
349
      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
6
    default:
945
6
      *nextTokPtr = ptr;
946
6
      return XML_TOK_INVALID;
947
80
    }
948
80
  }
949
2
  return XML_TOK_PARTIAL;
950
13
}
951
952
static int PTRCALL
953
PREFIX(scanPoundName)(const ENCODING *enc, const char *ptr, const char *end,
954
118
                      const char **nextTokPtr) {
955
118
  REQUIRE_CHAR(enc, ptr, end);
956
117
  switch (BYTE_TYPE(enc, ptr)) {
957
110
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
958
8
  default:
959
8
    *nextTokPtr = ptr;
960
8
    return XML_TOK_INVALID;
961
117
  }
962
619
  while (HAS_CHAR(enc, ptr, end)) {
963
619
    switch (BYTE_TYPE(enc, ptr)) {
964
1.75k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
965
0
    case BT_CR:
966
6
    case BT_LF:
967
16
    case BT_S:
968
16
    case BT_RPAR:
969
16
    case BT_GT:
970
23
    case BT_PERCNT:
971
23
    case BT_VERBAR:
972
23
      *nextTokPtr = ptr;
973
23
      return XML_TOK_POUND_NAME;
974
31
    default:
975
31
      *nextTokPtr = ptr;
976
31
      return XML_TOK_INVALID;
977
619
    }
978
619
  }
979
3
  return -XML_TOK_POUND_NAME;
980
93
}
xmltok.c:normal_scanPoundName
Line
Count
Source
954
81
                      const char **nextTokPtr) {
955
81
  REQUIRE_CHAR(enc, ptr, end);
956
81
  switch (BYTE_TYPE(enc, ptr)) {
957
61
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
958
6
  default:
959
6
    *nextTokPtr = ptr;
960
6
    return XML_TOK_INVALID;
961
81
  }
962
556
  while (HAS_CHAR(enc, ptr, end)) {
963
556
    switch (BYTE_TYPE(enc, ptr)) {
964
1.53k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
965
0
    case BT_CR:
966
6
    case BT_LF:
967
15
    case BT_S:
968
15
    case BT_RPAR:
969
15
    case BT_GT:
970
21
    case BT_PERCNT:
971
21
    case BT_VERBAR:
972
21
      *nextTokPtr = ptr;
973
21
      return XML_TOK_POUND_NAME;
974
20
    default:
975
20
      *nextTokPtr = ptr;
976
20
      return XML_TOK_INVALID;
977
556
    }
978
556
  }
979
0
  return -XML_TOK_POUND_NAME;
980
71
}
xmltok.c:little2_scanPoundName
Line
Count
Source
954
20
                      const char **nextTokPtr) {
955
20
  REQUIRE_CHAR(enc, ptr, end);
956
20
  switch (BYTE_TYPE(enc, ptr)) {
957
24
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
958
2
  default:
959
2
    *nextTokPtr = ptr;
960
2
    return XML_TOK_INVALID;
961
20
  }
962
28
  while (HAS_CHAR(enc, ptr, end)) {
963
28
    switch (BYTE_TYPE(enc, ptr)) {
964
79
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
965
0
    case BT_CR:
966
0
    case BT_LF:
967
0
    case BT_S:
968
0
    case BT_RPAR:
969
0
    case BT_GT:
970
0
    case BT_PERCNT:
971
0
    case BT_VERBAR:
972
0
      *nextTokPtr = ptr;
973
0
      return XML_TOK_POUND_NAME;
974
7
    default:
975
7
      *nextTokPtr = ptr;
976
7
      return XML_TOK_INVALID;
977
28
    }
978
28
  }
979
0
  return -XML_TOK_POUND_NAME;
980
12
}
xmltok.c:big2_scanPoundName
Line
Count
Source
954
17
                      const char **nextTokPtr) {
955
17
  REQUIRE_CHAR(enc, ptr, end);
956
16
  switch (BYTE_TYPE(enc, ptr)) {
957
25
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
958
0
  default:
959
0
    *nextTokPtr = ptr;
960
0
    return XML_TOK_INVALID;
961
16
  }
962
35
  while (HAS_CHAR(enc, ptr, end)) {
963
35
    switch (BYTE_TYPE(enc, ptr)) {
964
141
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
965
0
    case BT_CR:
966
0
    case BT_LF:
967
1
    case BT_S:
968
1
    case BT_RPAR:
969
1
    case BT_GT:
970
2
    case BT_PERCNT:
971
2
    case BT_VERBAR:
972
2
      *nextTokPtr = ptr;
973
2
      return XML_TOK_POUND_NAME;
974
4
    default:
975
4
      *nextTokPtr = ptr;
976
4
      return XML_TOK_INVALID;
977
35
    }
978
35
  }
979
3
  return -XML_TOK_POUND_NAME;
980
10
}
981
982
static int PTRCALL
983
PREFIX(scanLit)(int open, const ENCODING *enc, const char *ptr, const char *end,
984
115
                const char **nextTokPtr) {
985
2.88k
  while (HAS_CHAR(enc, ptr, end)) {
986
2.88k
    int t = BYTE_TYPE(enc, ptr);
987
2.88k
    switch (t) {
988
185
      INVALID_CASES(ptr, nextTokPtr)
989
13
    case BT_QUOT:
990
20
    case BT_APOS:
991
20
      ptr += MINBPC(enc);
992
20
      if (t != open)
993
6
        break;
994
14
      if (! HAS_CHAR(enc, ptr, end))
995
0
        return -XML_TOK_LITERAL;
996
14
      *nextTokPtr = ptr;
997
14
      switch (BYTE_TYPE(enc, ptr)) {
998
1
      case BT_S:
999
1
      case BT_CR:
1000
1
      case BT_LF:
1001
1
      case BT_GT:
1002
1
      case BT_PERCNT:
1003
1
      case BT_LSQB:
1004
1
        return XML_TOK_LITERAL;
1005
13
      default:
1006
13
        return XML_TOK_INVALID;
1007
14
      }
1008
2.74k
    default:
1009
2.74k
      ptr += MINBPC(enc);
1010
2.74k
      break;
1011
2.88k
    }
1012
2.88k
  }
1013
18
  return XML_TOK_PARTIAL;
1014
115
}
xmltok.c:normal_scanLit
Line
Count
Source
984
66
                const char **nextTokPtr) {
985
2.23k
  while (HAS_CHAR(enc, ptr, end)) {
986
2.23k
    int t = BYTE_TYPE(enc, ptr);
987
2.23k
    switch (t) {
988
120
      INVALID_CASES(ptr, nextTokPtr)
989
7
    case BT_QUOT:
990
14
    case BT_APOS:
991
14
      ptr += MINBPC(enc);
992
14
      if (t != open)
993
6
        break;
994
8
      if (! HAS_CHAR(enc, ptr, end))
995
0
        return -XML_TOK_LITERAL;
996
8
      *nextTokPtr = ptr;
997
8
      switch (BYTE_TYPE(enc, ptr)) {
998
1
      case BT_S:
999
1
      case BT_CR:
1000
1
      case BT_LF:
1001
1
      case BT_GT:
1002
1
      case BT_PERCNT:
1003
1
      case BT_LSQB:
1004
1
        return XML_TOK_LITERAL;
1005
7
      default:
1006
7
        return XML_TOK_INVALID;
1007
8
      }
1008
2.14k
    default:
1009
2.14k
      ptr += MINBPC(enc);
1010
2.14k
      break;
1011
2.23k
    }
1012
2.23k
  }
1013
3
  return XML_TOK_PARTIAL;
1014
66
}
xmltok.c:little2_scanLit
Line
Count
Source
984
25
                const char **nextTokPtr) {
985
302
  while (HAS_CHAR(enc, ptr, end)) {
986
302
    int t = BYTE_TYPE(enc, ptr);
987
302
    switch (t) {
988
47
      INVALID_CASES(ptr, nextTokPtr)
989
4
    case BT_QUOT:
990
4
    case BT_APOS:
991
4
      ptr += MINBPC(enc);
992
4
      if (t != open)
993
0
        break;
994
4
      if (! HAS_CHAR(enc, ptr, end))
995
0
        return -XML_TOK_LITERAL;
996
4
      *nextTokPtr = ptr;
997
4
      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
4
      default:
1006
4
        return XML_TOK_INVALID;
1007
4
      }
1008
270
    default:
1009
270
      ptr += MINBPC(enc);
1010
270
      break;
1011
302
    }
1012
302
  }
1013
5
  return XML_TOK_PARTIAL;
1014
25
}
xmltok.c:big2_scanLit
Line
Count
Source
984
24
                const char **nextTokPtr) {
985
345
  while (HAS_CHAR(enc, ptr, end)) {
986
345
    int t = BYTE_TYPE(enc, ptr);
987
345
    switch (t) {
988
18
      INVALID_CASES(ptr, nextTokPtr)
989
2
    case BT_QUOT:
990
2
    case BT_APOS:
991
2
      ptr += MINBPC(enc);
992
2
      if (t != open)
993
0
        break;
994
2
      if (! HAS_CHAR(enc, ptr, end))
995
0
        return -XML_TOK_LITERAL;
996
2
      *nextTokPtr = ptr;
997
2
      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
2
      default:
1006
2
        return XML_TOK_INVALID;
1007
2
      }
1008
328
    default:
1009
328
      ptr += MINBPC(enc);
1010
328
      break;
1011
345
    }
1012
345
  }
1013
10
  return XML_TOK_PARTIAL;
1014
24
}
1015
1016
static int PTRCALL
1017
PREFIX(prologTok)(const ENCODING *enc, const char *ptr, const char *end,
1018
4.78k
                  const char **nextTokPtr) {
1019
4.78k
  int tok;
1020
4.78k
  if (ptr >= end)
1021
95
    return XML_TOK_NONE;
1022
4.68k
  if (MINBPC(enc) > 1) {
1023
699
    size_t n = end - ptr;
1024
699
    if (n & (MINBPC(enc) - 1)) {
1025
524
      n &= ~(MINBPC(enc) - 1);
1026
524
      if (n == 0)
1027
2
        return XML_TOK_PARTIAL;
1028
522
      end = ptr + n;
1029
522
    }
1030
699
  }
1031
4.68k
  switch (BYTE_TYPE(enc, ptr)) {
1032
57
  case BT_QUOT:
1033
57
    return PREFIX(scanLit)(BT_QUOT, enc, ptr + MINBPC(enc), end, nextTokPtr);
1034
58
  case BT_APOS:
1035
58
    return PREFIX(scanLit)(BT_APOS, enc, ptr + MINBPC(enc), end, nextTokPtr);
1036
2.86k
  case BT_LT: {
1037
2.86k
    ptr += MINBPC(enc);
1038
2.86k
    REQUIRE_CHAR(enc, ptr, end);
1039
2.86k
    switch (BYTE_TYPE(enc, ptr)) {
1040
46
    case BT_EXCL:
1041
46
      return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1042
1.29k
    case BT_QUEST:
1043
1.29k
      return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1044
1.19k
    case BT_NMSTRT:
1045
1.23k
    case BT_HEX:
1046
1.47k
    case BT_NONASCII:
1047
1.47k
    case BT_LEAD2:
1048
1.48k
    case BT_LEAD3:
1049
1.49k
    case BT_LEAD4:
1050
1.49k
      *nextTokPtr = ptr - MINBPC(enc);
1051
1.49k
      return XML_TOK_INSTANCE_START;
1052
2.86k
    }
1053
20
    *nextTokPtr = ptr;
1054
20
    return XML_TOK_INVALID;
1055
2.86k
  }
1056
22
  case BT_CR:
1057
22
    if (ptr + MINBPC(enc) == end) {
1058
2
      *nextTokPtr = end;
1059
      /* indicate that this might be part of a CR/LF pair */
1060
2
      return -XML_TOK_PROLOG_S;
1061
2
    }
1062
    /* fall through */
1063
223
  case BT_S:
1064
588
  case BT_LF:
1065
405k
    for (;;) {
1066
405k
      ptr += MINBPC(enc);
1067
405k
      if (! HAS_CHAR(enc, ptr, end))
1068
48
        break;
1069
405k
      switch (BYTE_TYPE(enc, ptr)) {
1070
400k
      case BT_S:
1071
404k
      case BT_LF:
1072
404k
        break;
1073
52
      case BT_CR:
1074
        /* don't split CR/LF pair */
1075
52
        if (ptr + MINBPC(enc) != end)
1076
51
          break;
1077
        /* fall through */
1078
540
      default:
1079
540
        *nextTokPtr = ptr;
1080
540
        return XML_TOK_PROLOG_S;
1081
405k
      }
1082
405k
    }
1083
48
    *nextTokPtr = ptr;
1084
48
    return XML_TOK_PROLOG_S;
1085
90
  case BT_PERCNT:
1086
90
    return PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1087
16
  case BT_COMMA:
1088
16
    *nextTokPtr = ptr + MINBPC(enc);
1089
16
    return XML_TOK_COMMA;
1090
10
  case BT_LSQB:
1091
10
    *nextTokPtr = ptr + MINBPC(enc);
1092
10
    return XML_TOK_OPEN_BRACKET;
1093
12
  case BT_RSQB:
1094
12
    ptr += MINBPC(enc);
1095
12
    if (! HAS_CHAR(enc, ptr, end))
1096
0
      return -XML_TOK_CLOSE_BRACKET;
1097
12
    if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) {
1098
3
      REQUIRE_CHARS(enc, ptr, end, 2);
1099
3
      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
3
    }
1104
12
    *nextTokPtr = ptr;
1105
12
    return XML_TOK_CLOSE_BRACKET;
1106
1
  case BT_LPAR:
1107
1
    *nextTokPtr = ptr + MINBPC(enc);
1108
1
    return XML_TOK_OPEN_PAREN;
1109
18
  case BT_RPAR:
1110
18
    ptr += MINBPC(enc);
1111
18
    if (! HAS_CHAR(enc, ptr, end))
1112
0
      return -XML_TOK_CLOSE_PAREN;
1113
18
    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
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
18
    }
1133
18
    *nextTokPtr = ptr;
1134
18
    return XML_TOK_INVALID;
1135
7
  case BT_VERBAR:
1136
7
    *nextTokPtr = ptr + MINBPC(enc);
1137
7
    return XML_TOK_OR;
1138
7
  case BT_GT:
1139
7
    *nextTokPtr = ptr + MINBPC(enc);
1140
7
    return XML_TOK_DECL_CLOSE;
1141
118
  case BT_NUM:
1142
118
    return PREFIX(scanPoundName)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1143
0
#  define LEAD_CASE(n)                                                         \
1144
85
  case BT_LEAD##n:                                                             \
1145
85
    if (end - ptr < n)                                                         \
1146
8
      return XML_TOK_PARTIAL_CHAR;                                             \
1147
85
    if (IS_INVALID_CHAR(enc, ptr, n)) {                                        \
1148
50
      *nextTokPtr = ptr;                                                       \
1149
50
      return XML_TOK_INVALID;                                                  \
1150
50
    }                                                                          \
1151
85
    if (IS_NMSTRT_CHAR(enc, ptr, n)) {                                         \
1152
19
      ptr += n;                                                                \
1153
19
      tok = XML_TOK_NAME;                                                      \
1154
19
      break;                                                                   \
1155
19
    }                                                                          \
1156
35
    if (IS_NAME_CHAR(enc, ptr, n)) {                                           \
1157
8
      ptr += n;                                                                \
1158
8
      tok = XML_TOK_NMTOKEN;                                                   \
1159
8
      break;                                                                   \
1160
8
    }                                                                          \
1161
16
    *nextTokPtr = ptr;                                                         \
1162
8
    return XML_TOK_INVALID;
1163
128
    LEAD_CASE(2)
1164
67
    LEAD_CASE(3)
1165
26
    LEAD_CASE(4)
1166
0
#  undef LEAD_CASE
1167
202
  case BT_NMSTRT:
1168
623
  case BT_HEX:
1169
623
    tok = XML_TOK_NAME;
1170
623
    ptr += MINBPC(enc);
1171
623
    break;
1172
22
  case BT_DIGIT:
1173
42
  case BT_NAME:
1174
51
  case BT_MINUS:
1175
51
#  ifdef XML_NS
1176
55
  case BT_COLON:
1177
55
#  endif
1178
55
    tok = XML_TOK_NMTOKEN;
1179
55
    ptr += MINBPC(enc);
1180
55
    break;
1181
33
  case BT_NONASCII:
1182
33
    if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {
1183
17
      ptr += MINBPC(enc);
1184
17
      tok = XML_TOK_NAME;
1185
17
      break;
1186
17
    }
1187
16
    if (IS_NAME_CHAR_MINBPC(enc, ptr)) {
1188
4
      ptr += MINBPC(enc);
1189
4
      tok = XML_TOK_NMTOKEN;
1190
4
      break;
1191
4
    }
1192
    /* fall through */
1193
52
  default:
1194
52
    *nextTokPtr = ptr;
1195
52
    return XML_TOK_INVALID;
1196
4.68k
  }
1197
38.2k
  while (HAS_CHAR(enc, ptr, end)) {
1198
38.2k
    switch (BYTE_TYPE(enc, ptr)) {
1199
114k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1200
13
    case BT_GT:
1201
24
    case BT_RPAR:
1202
41
    case BT_COMMA:
1203
47
    case BT_VERBAR:
1204
61
    case BT_LSQB:
1205
76
    case BT_PERCNT:
1206
94
    case BT_S:
1207
108
    case BT_CR:
1208
119
    case BT_LF:
1209
119
      *nextTokPtr = ptr;
1210
119
      return tok;
1211
0
#  ifdef XML_NS
1212
174
    case BT_COLON:
1213
174
      ptr += MINBPC(enc);
1214
174
      switch (tok) {
1215
82
      case XML_TOK_NAME:
1216
82
        REQUIRE_CHAR(enc, ptr, end);
1217
82
        tok = XML_TOK_PREFIXED_NAME;
1218
82
        switch (BYTE_TYPE(enc, ptr)) {
1219
141
          CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1220
29
        default:
1221
29
          tok = XML_TOK_NMTOKEN;
1222
29
          break;
1223
82
        }
1224
64
        break;
1225
64
      case XML_TOK_PREFIXED_NAME:
1226
11
        tok = XML_TOK_NMTOKEN;
1227
11
        break;
1228
174
      }
1229
156
      break;
1230
156
#  endif
1231
156
    case BT_PLUS:
1232
16
      if (tok == XML_TOK_NMTOKEN) {
1233
6
        *nextTokPtr = ptr;
1234
6
        return XML_TOK_INVALID;
1235
6
      }
1236
10
      *nextTokPtr = ptr + MINBPC(enc);
1237
10
      return XML_TOK_NAME_PLUS;
1238
15
    case BT_AST:
1239
15
      if (tok == XML_TOK_NMTOKEN) {
1240
8
        *nextTokPtr = ptr;
1241
8
        return XML_TOK_INVALID;
1242
8
      }
1243
7
      *nextTokPtr = ptr + MINBPC(enc);
1244
7
      return XML_TOK_NAME_ASTERISK;
1245
19
    case BT_QUEST:
1246
19
      if (tok == XML_TOK_NMTOKEN) {
1247
7
        *nextTokPtr = ptr;
1248
7
        return XML_TOK_INVALID;
1249
7
      }
1250
12
      *nextTokPtr = ptr + MINBPC(enc);
1251
12
      return XML_TOK_NAME_QUESTION;
1252
363
    default:
1253
363
      *nextTokPtr = ptr;
1254
363
      return XML_TOK_INVALID;
1255
38.2k
    }
1256
38.2k
  }
1257
28
  return -tok;
1258
726
}
xmltok.c:normal_prologTok
Line
Count
Source
1018
4.08k
                  const char **nextTokPtr) {
1019
4.08k
  int tok;
1020
4.08k
  if (ptr >= end)
1021
94
    return XML_TOK_NONE;
1022
3.98k
  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
3.98k
  switch (BYTE_TYPE(enc, ptr)) {
1032
8
  case BT_QUOT:
1033
8
    return PREFIX(scanLit)(BT_QUOT, enc, ptr + MINBPC(enc), end, nextTokPtr);
1034
58
  case BT_APOS:
1035
58
    return PREFIX(scanLit)(BT_APOS, enc, ptr + MINBPC(enc), end, nextTokPtr);
1036
2.55k
  case BT_LT: {
1037
2.55k
    ptr += MINBPC(enc);
1038
2.55k
    REQUIRE_CHAR(enc, ptr, end);
1039
2.55k
    switch (BYTE_TYPE(enc, ptr)) {
1040
45
    case BT_EXCL:
1041
45
      return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1042
1.28k
    case BT_QUEST:
1043
1.28k
      return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1044
1.19k
    case BT_NMSTRT:
1045
1.20k
    case BT_HEX:
1046
1.20k
    case BT_NONASCII:
1047
1.20k
    case BT_LEAD2:
1048
1.21k
    case BT_LEAD3:
1049
1.21k
    case BT_LEAD4:
1050
1.21k
      *nextTokPtr = ptr - MINBPC(enc);
1051
1.21k
      return XML_TOK_INSTANCE_START;
1052
2.55k
    }
1053
7
    *nextTokPtr = ptr;
1054
7
    return XML_TOK_INVALID;
1055
2.55k
  }
1056
11
  case BT_CR:
1057
11
    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
208
  case BT_S:
1064
554
  case BT_LF:
1065
405k
    for (;;) {
1066
405k
      ptr += MINBPC(enc);
1067
405k
      if (! HAS_CHAR(enc, ptr, end))
1068
47
        break;
1069
405k
      switch (BYTE_TYPE(enc, ptr)) {
1070
400k
      case BT_S:
1071
404k
      case BT_LF:
1072
404k
        break;
1073
52
      case BT_CR:
1074
        /* don't split CR/LF pair */
1075
52
        if (ptr + MINBPC(enc) != end)
1076
51
          break;
1077
        /* fall through */
1078
507
      default:
1079
507
        *nextTokPtr = ptr;
1080
507
        return XML_TOK_PROLOG_S;
1081
405k
      }
1082
405k
    }
1083
47
    *nextTokPtr = ptr;
1084
47
    return XML_TOK_PROLOG_S;
1085
58
  case BT_PERCNT:
1086
58
    return PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1087
12
  case BT_COMMA:
1088
12
    *nextTokPtr = ptr + MINBPC(enc);
1089
12
    return XML_TOK_COMMA;
1090
7
  case BT_LSQB:
1091
7
    *nextTokPtr = ptr + MINBPC(enc);
1092
7
    return XML_TOK_OPEN_BRACKET;
1093
8
  case BT_RSQB:
1094
8
    ptr += MINBPC(enc);
1095
8
    if (! HAS_CHAR(enc, ptr, end))
1096
0
      return -XML_TOK_CLOSE_BRACKET;
1097
8
    if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) {
1098
3
      REQUIRE_CHARS(enc, ptr, end, 2);
1099
3
      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
3
    }
1104
8
    *nextTokPtr = ptr;
1105
8
    return XML_TOK_CLOSE_BRACKET;
1106
1
  case BT_LPAR:
1107
1
    *nextTokPtr = ptr + MINBPC(enc);
1108
1
    return XML_TOK_OPEN_PAREN;
1109
2
  case BT_RPAR:
1110
2
    ptr += MINBPC(enc);
1111
2
    if (! HAS_CHAR(enc, ptr, end))
1112
0
      return -XML_TOK_CLOSE_PAREN;
1113
2
    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
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
2
    }
1133
2
    *nextTokPtr = ptr;
1134
2
    return XML_TOK_INVALID;
1135
6
  case BT_VERBAR:
1136
6
    *nextTokPtr = ptr + MINBPC(enc);
1137
6
    return XML_TOK_OR;
1138
6
  case BT_GT:
1139
6
    *nextTokPtr = ptr + MINBPC(enc);
1140
6
    return XML_TOK_DECL_CLOSE;
1141
81
  case BT_NUM:
1142
81
    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
128
    LEAD_CASE(2)
1164
67
    LEAD_CASE(3)
1165
18
    LEAD_CASE(4)
1166
0
#  undef LEAD_CASE
1167
97
  case BT_NMSTRT:
1168
496
  case BT_HEX:
1169
496
    tok = XML_TOK_NAME;
1170
496
    ptr += MINBPC(enc);
1171
496
    break;
1172
7
  case BT_DIGIT:
1173
19
  case BT_NAME:
1174
28
  case BT_MINUS:
1175
28
#  ifdef XML_NS
1176
28
  case BT_COLON:
1177
28
#  endif
1178
28
    tok = XML_TOK_NMTOKEN;
1179
28
    ptr += MINBPC(enc);
1180
28
    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
23
  default:
1194
23
    *nextTokPtr = ptr;
1195
23
    return XML_TOK_INVALID;
1196
3.98k
  }
1197
37.5k
  while (HAS_CHAR(enc, ptr, end)) {
1198
37.5k
    switch (BYTE_TYPE(enc, ptr)) {
1199
111k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1200
6
    case BT_GT:
1201
17
    case BT_RPAR:
1202
29
    case BT_COMMA:
1203
35
    case BT_VERBAR:
1204
46
    case BT_LSQB:
1205
60
    case BT_PERCNT:
1206
74
    case BT_S:
1207
85
    case BT_CR:
1208
96
    case BT_LF:
1209
96
      *nextTokPtr = ptr;
1210
96
      return tok;
1211
0
#  ifdef XML_NS
1212
149
    case BT_COLON:
1213
149
      ptr += MINBPC(enc);
1214
149
      switch (tok) {
1215
61
      case XML_TOK_NAME:
1216
61
        REQUIRE_CHAR(enc, ptr, end);
1217
61
        tok = XML_TOK_PREFIXED_NAME;
1218
61
        switch (BYTE_TYPE(enc, ptr)) {
1219
95
          CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1220
23
        default:
1221
23
          tok = XML_TOK_NMTOKEN;
1222
23
          break;
1223
61
        }
1224
49
        break;
1225
49
      case XML_TOK_PREFIXED_NAME:
1226
10
        tok = XML_TOK_NMTOKEN;
1227
10
        break;
1228
149
      }
1229
137
      break;
1230
137
#  endif
1231
137
    case BT_PLUS:
1232
16
      if (tok == XML_TOK_NMTOKEN) {
1233
6
        *nextTokPtr = ptr;
1234
6
        return XML_TOK_INVALID;
1235
6
      }
1236
10
      *nextTokPtr = ptr + MINBPC(enc);
1237
10
      return XML_TOK_NAME_PLUS;
1238
15
    case BT_AST:
1239
15
      if (tok == XML_TOK_NMTOKEN) {
1240
8
        *nextTokPtr = ptr;
1241
8
        return XML_TOK_INVALID;
1242
8
      }
1243
7
      *nextTokPtr = ptr + MINBPC(enc);
1244
7
      return XML_TOK_NAME_ASTERISK;
1245
18
    case BT_QUEST:
1246
18
      if (tok == XML_TOK_NMTOKEN) {
1247
7
        *nextTokPtr = ptr;
1248
7
        return XML_TOK_INVALID;
1249
7
      }
1250
11
      *nextTokPtr = ptr + MINBPC(enc);
1251
11
      return XML_TOK_NAME_QUESTION;
1252
301
    default:
1253
301
      *nextTokPtr = ptr;
1254
301
      return XML_TOK_INVALID;
1255
37.5k
    }
1256
37.5k
  }
1257
10
  return -tok;
1258
551
}
xmltok.c:little2_prologTok
Line
Count
Source
1018
410
                  const char **nextTokPtr) {
1019
410
  int tok;
1020
410
  if (ptr >= end)
1021
0
    return XML_TOK_NONE;
1022
410
  if (MINBPC(enc) > 1) {
1023
410
    size_t n = end - ptr;
1024
410
    if (n & (MINBPC(enc) - 1)) {
1025
313
      n &= ~(MINBPC(enc) - 1);
1026
313
      if (n == 0)
1027
2
        return XML_TOK_PARTIAL;
1028
311
      end = ptr + n;
1029
311
    }
1030
410
  }
1031
408
  switch (BYTE_TYPE(enc, ptr)) {
1032
25
  case BT_QUOT:
1033
25
    return PREFIX(scanLit)(BT_QUOT, enc, ptr + MINBPC(enc), end, nextTokPtr);
1034
0
  case BT_APOS:
1035
0
    return PREFIX(scanLit)(BT_APOS, enc, ptr + MINBPC(enc), end, nextTokPtr);
1036
168
  case BT_LT: {
1037
168
    ptr += MINBPC(enc);
1038
168
    REQUIRE_CHAR(enc, ptr, end);
1039
168
    switch (BYTE_TYPE(enc, ptr)) {
1040
1
    case BT_EXCL:
1041
1
      return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1042
0
    case BT_QUEST:
1043
0
      return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1044
0
    case BT_NMSTRT:
1045
0
    case BT_HEX:
1046
155
    case BT_NONASCII:
1047
155
    case BT_LEAD2:
1048
155
    case BT_LEAD3:
1049
160
    case BT_LEAD4:
1050
160
      *nextTokPtr = ptr - MINBPC(enc);
1051
160
      return XML_TOK_INSTANCE_START;
1052
168
    }
1053
7
    *nextTokPtr = ptr;
1054
7
    return XML_TOK_INVALID;
1055
168
  }
1056
6
  case BT_CR:
1057
6
    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
11
  case BT_S:
1064
24
  case BT_LF:
1065
24
    for (;;) {
1066
24
      ptr += MINBPC(enc);
1067
24
      if (! HAS_CHAR(enc, ptr, end))
1068
1
        break;
1069
23
      switch (BYTE_TYPE(enc, ptr)) {
1070
0
      case BT_S:
1071
0
      case BT_LF:
1072
0
        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
23
      default:
1079
23
        *nextTokPtr = ptr;
1080
23
        return XML_TOK_PROLOG_S;
1081
23
      }
1082
23
    }
1083
1
    *nextTokPtr = ptr;
1084
1
    return XML_TOK_PROLOG_S;
1085
18
  case BT_PERCNT:
1086
18
    return PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1087
4
  case BT_COMMA:
1088
4
    *nextTokPtr = ptr + MINBPC(enc);
1089
4
    return XML_TOK_COMMA;
1090
0
  case BT_LSQB:
1091
0
    *nextTokPtr = ptr + MINBPC(enc);
1092
0
    return XML_TOK_OPEN_BRACKET;
1093
1
  case BT_RSQB:
1094
1
    ptr += MINBPC(enc);
1095
1
    if (! HAS_CHAR(enc, ptr, end))
1096
0
      return -XML_TOK_CLOSE_BRACKET;
1097
1
    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
1
    *nextTokPtr = ptr;
1105
1
    return XML_TOK_CLOSE_BRACKET;
1106
0
  case BT_LPAR:
1107
0
    *nextTokPtr = ptr + MINBPC(enc);
1108
0
    return XML_TOK_OPEN_PAREN;
1109
10
  case BT_RPAR:
1110
10
    ptr += MINBPC(enc);
1111
10
    if (! HAS_CHAR(enc, ptr, end))
1112
0
      return -XML_TOK_CLOSE_PAREN;
1113
10
    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
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
10
    }
1133
10
    *nextTokPtr = ptr;
1134
10
    return XML_TOK_INVALID;
1135
1
  case BT_VERBAR:
1136
1
    *nextTokPtr = ptr + MINBPC(enc);
1137
1
    return XML_TOK_OR;
1138
1
  case BT_GT:
1139
1
    *nextTokPtr = ptr + MINBPC(enc);
1140
1
    return XML_TOK_DECL_CLOSE;
1141
20
  case BT_NUM:
1142
20
    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
8
    LEAD_CASE(4)
1166
0
#  undef LEAD_CASE
1167
60
  case BT_NMSTRT:
1168
79
  case BT_HEX:
1169
79
    tok = XML_TOK_NAME;
1170
79
    ptr += MINBPC(enc);
1171
79
    break;
1172
12
  case BT_DIGIT:
1173
16
  case BT_NAME:
1174
16
  case BT_MINUS:
1175
16
#  ifdef XML_NS
1176
19
  case BT_COLON:
1177
19
#  endif
1178
19
    tok = XML_TOK_NMTOKEN;
1179
19
    ptr += MINBPC(enc);
1180
19
    break;
1181
26
  case BT_NONASCII:
1182
26
    if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {
1183
12
      ptr += MINBPC(enc);
1184
12
      tok = XML_TOK_NAME;
1185
12
      break;
1186
12
    }
1187
14
    if (IS_NAME_CHAR_MINBPC(enc, ptr)) {
1188
4
      ptr += MINBPC(enc);
1189
4
      tok = XML_TOK_NMTOKEN;
1190
4
      break;
1191
4
    }
1192
    /* fall through */
1193
20
  default:
1194
20
    *nextTokPtr = ptr;
1195
20
    return XML_TOK_INVALID;
1196
408
  }
1197
421
  while (HAS_CHAR(enc, ptr, end)) {
1198
421
    switch (BYTE_TYPE(enc, ptr)) {
1199
1.55k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1200
7
    case BT_GT:
1201
7
    case BT_RPAR:
1202
12
    case BT_COMMA:
1203
12
    case BT_VERBAR:
1204
12
    case BT_LSQB:
1205
13
    case BT_PERCNT:
1206
14
    case BT_S:
1207
17
    case BT_CR:
1208
17
    case BT_LF:
1209
17
      *nextTokPtr = ptr;
1210
17
      return tok;
1211
0
#  ifdef XML_NS
1212
12
    case BT_COLON:
1213
12
      ptr += MINBPC(enc);
1214
12
      switch (tok) {
1215
12
      case XML_TOK_NAME:
1216
12
        REQUIRE_CHAR(enc, ptr, end);
1217
12
        tok = XML_TOK_PREFIXED_NAME;
1218
12
        switch (BYTE_TYPE(enc, ptr)) {
1219
35
          CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1220
0
        default:
1221
0
          tok = XML_TOK_NMTOKEN;
1222
0
          break;
1223
12
        }
1224
6
        break;
1225
6
      case XML_TOK_PREFIXED_NAME:
1226
0
        tok = XML_TOK_NMTOKEN;
1227
0
        break;
1228
12
      }
1229
6
      break;
1230
6
#  endif
1231
6
    case BT_PLUS:
1232
0
      if (tok == XML_TOK_NMTOKEN) {
1233
0
        *nextTokPtr = ptr;
1234
0
        return XML_TOK_INVALID;
1235
0
      }
1236
0
      *nextTokPtr = ptr + MINBPC(enc);
1237
0
      return XML_TOK_NAME_PLUS;
1238
0
    case BT_AST:
1239
0
      if (tok == XML_TOK_NMTOKEN) {
1240
0
        *nextTokPtr = ptr;
1241
0
        return XML_TOK_INVALID;
1242
0
      }
1243
0
      *nextTokPtr = ptr + MINBPC(enc);
1244
0
      return XML_TOK_NAME_ASTERISK;
1245
0
    case BT_QUEST:
1246
0
      if (tok == XML_TOK_NMTOKEN) {
1247
0
        *nextTokPtr = ptr;
1248
0
        return XML_TOK_INVALID;
1249
0
      }
1250
0
      *nextTokPtr = ptr + MINBPC(enc);
1251
0
      return XML_TOK_NAME_QUESTION;
1252
38
    default:
1253
38
      *nextTokPtr = ptr;
1254
38
      return XML_TOK_INVALID;
1255
421
    }
1256
421
  }
1257
8
  return -tok;
1258
114
}
xmltok.c:big2_prologTok
Line
Count
Source
1018
290
                  const char **nextTokPtr) {
1019
290
  int tok;
1020
290
  if (ptr >= end)
1021
1
    return XML_TOK_NONE;
1022
289
  if (MINBPC(enc) > 1) {
1023
289
    size_t n = end - ptr;
1024
289
    if (n & (MINBPC(enc) - 1)) {
1025
211
      n &= ~(MINBPC(enc) - 1);
1026
211
      if (n == 0)
1027
0
        return XML_TOK_PARTIAL;
1028
211
      end = ptr + n;
1029
211
    }
1030
289
  }
1031
289
  switch (BYTE_TYPE(enc, ptr)) {
1032
24
  case BT_QUOT:
1033
24
    return PREFIX(scanLit)(BT_QUOT, enc, ptr + MINBPC(enc), end, nextTokPtr);
1034
0
  case BT_APOS:
1035
0
    return PREFIX(scanLit)(BT_APOS, enc, ptr + MINBPC(enc), end, nextTokPtr);
1036
141
  case BT_LT: {
1037
141
    ptr += MINBPC(enc);
1038
141
    REQUIRE_CHAR(enc, ptr, end);
1039
138
    switch (BYTE_TYPE(enc, ptr)) {
1040
0
    case BT_EXCL:
1041
0
      return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1042
11
    case BT_QUEST:
1043
11
      return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1044
1
    case BT_NMSTRT:
1045
36
    case BT_HEX:
1046
114
    case BT_NONASCII:
1047
114
    case BT_LEAD2:
1048
114
    case BT_LEAD3:
1049
121
    case BT_LEAD4:
1050
121
      *nextTokPtr = ptr - MINBPC(enc);
1051
121
      return XML_TOK_INSTANCE_START;
1052
138
    }
1053
6
    *nextTokPtr = ptr;
1054
6
    return XML_TOK_INVALID;
1055
138
  }
1056
5
  case BT_CR:
1057
5
    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
4
  case BT_S:
1064
10
  case BT_LF:
1065
10
    for (;;) {
1066
10
      ptr += MINBPC(enc);
1067
10
      if (! HAS_CHAR(enc, ptr, end))
1068
0
        break;
1069
10
      switch (BYTE_TYPE(enc, ptr)) {
1070
0
      case BT_S:
1071
0
      case BT_LF:
1072
0
        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
10
      default:
1079
10
        *nextTokPtr = ptr;
1080
10
        return XML_TOK_PROLOG_S;
1081
10
      }
1082
10
    }
1083
0
    *nextTokPtr = ptr;
1084
0
    return XML_TOK_PROLOG_S;
1085
14
  case BT_PERCNT:
1086
14
    return PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1087
0
  case BT_COMMA:
1088
0
    *nextTokPtr = ptr + MINBPC(enc);
1089
0
    return XML_TOK_COMMA;
1090
3
  case BT_LSQB:
1091
3
    *nextTokPtr = ptr + MINBPC(enc);
1092
3
    return XML_TOK_OPEN_BRACKET;
1093
3
  case BT_RSQB:
1094
3
    ptr += MINBPC(enc);
1095
3
    if (! HAS_CHAR(enc, ptr, end))
1096
0
      return -XML_TOK_CLOSE_BRACKET;
1097
3
    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
3
    *nextTokPtr = ptr;
1105
3
    return XML_TOK_CLOSE_BRACKET;
1106
0
  case BT_LPAR:
1107
0
    *nextTokPtr = ptr + MINBPC(enc);
1108
0
    return XML_TOK_OPEN_PAREN;
1109
6
  case BT_RPAR:
1110
6
    ptr += MINBPC(enc);
1111
6
    if (! HAS_CHAR(enc, ptr, end))
1112
0
      return -XML_TOK_CLOSE_PAREN;
1113
6
    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
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
6
    }
1133
6
    *nextTokPtr = ptr;
1134
6
    return XML_TOK_INVALID;
1135
0
  case BT_VERBAR:
1136
0
    *nextTokPtr = ptr + MINBPC(enc);
1137
0
    return XML_TOK_OR;
1138
0
  case BT_GT:
1139
0
    *nextTokPtr = ptr + MINBPC(enc);
1140
0
    return XML_TOK_DECL_CLOSE;
1141
17
  case BT_NUM:
1142
17
    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
0
    LEAD_CASE(4)
1166
0
#  undef LEAD_CASE
1167
45
  case BT_NMSTRT:
1168
48
  case BT_HEX:
1169
48
    tok = XML_TOK_NAME;
1170
48
    ptr += MINBPC(enc);
1171
48
    break;
1172
3
  case BT_DIGIT:
1173
7
  case BT_NAME:
1174
7
  case BT_MINUS:
1175
7
#  ifdef XML_NS
1176
8
  case BT_COLON:
1177
8
#  endif
1178
8
    tok = XML_TOK_NMTOKEN;
1179
8
    ptr += MINBPC(enc);
1180
8
    break;
1181
7
  case BT_NONASCII:
1182
7
    if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {
1183
5
      ptr += MINBPC(enc);
1184
5
      tok = XML_TOK_NAME;
1185
5
      break;
1186
5
    }
1187
2
    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
9
  default:
1194
9
    *nextTokPtr = ptr;
1195
9
    return XML_TOK_INVALID;
1196
289
  }
1197
298
  while (HAS_CHAR(enc, ptr, end)) {
1198
298
    switch (BYTE_TYPE(enc, ptr)) {
1199
1.12k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1200
0
    case BT_GT:
1201
0
    case BT_RPAR:
1202
0
    case BT_COMMA:
1203
0
    case BT_VERBAR:
1204
3
    case BT_LSQB:
1205
3
    case BT_PERCNT:
1206
6
    case BT_S:
1207
6
    case BT_CR:
1208
6
    case BT_LF:
1209
6
      *nextTokPtr = ptr;
1210
6
      return tok;
1211
0
#  ifdef XML_NS
1212
13
    case BT_COLON:
1213
13
      ptr += MINBPC(enc);
1214
13
      switch (tok) {
1215
9
      case XML_TOK_NAME:
1216
9
        REQUIRE_CHAR(enc, ptr, end);
1217
9
        tok = XML_TOK_PREFIXED_NAME;
1218
9
        switch (BYTE_TYPE(enc, ptr)) {
1219
11
          CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1220
6
        default:
1221
6
          tok = XML_TOK_NMTOKEN;
1222
6
          break;
1223
9
        }
1224
9
        break;
1225
9
      case XML_TOK_PREFIXED_NAME:
1226
1
        tok = XML_TOK_NMTOKEN;
1227
1
        break;
1228
13
      }
1229
13
      break;
1230
13
#  endif
1231
13
    case BT_PLUS:
1232
0
      if (tok == XML_TOK_NMTOKEN) {
1233
0
        *nextTokPtr = ptr;
1234
0
        return XML_TOK_INVALID;
1235
0
      }
1236
0
      *nextTokPtr = ptr + MINBPC(enc);
1237
0
      return XML_TOK_NAME_PLUS;
1238
0
    case BT_AST:
1239
0
      if (tok == XML_TOK_NMTOKEN) {
1240
0
        *nextTokPtr = ptr;
1241
0
        return XML_TOK_INVALID;
1242
0
      }
1243
0
      *nextTokPtr = ptr + MINBPC(enc);
1244
0
      return XML_TOK_NAME_ASTERISK;
1245
1
    case BT_QUEST:
1246
1
      if (tok == XML_TOK_NMTOKEN) {
1247
0
        *nextTokPtr = ptr;
1248
0
        return XML_TOK_INVALID;
1249
0
      }
1250
1
      *nextTokPtr = ptr + MINBPC(enc);
1251
1
      return XML_TOK_NAME_QUESTION;
1252
24
    default:
1253
24
      *nextTokPtr = ptr;
1254
24
      return XML_TOK_INVALID;
1255
298
    }
1256
298
  }
1257
10
  return -tok;
1258
61
}
1259
1260
static int PTRCALL
1261
PREFIX(attributeValueTok)(const ENCODING *enc, const char *ptr, const char *end,
1262
4.86k
                          const char **nextTokPtr) {
1263
4.86k
  const char *start;
1264
4.86k
  if (ptr >= end)
1265
233
    return XML_TOK_NONE;
1266
4.62k
  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
4.62k
  start = ptr;
1275
16.0k
  while (HAS_CHAR(enc, ptr, end)) {
1276
16.0k
    switch (BYTE_TYPE(enc, ptr)) {
1277
0
#  define LEAD_CASE(n)                                                         \
1278
1
  case BT_LEAD##n:                                                             \
1279
1
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1280
1
    break;
1281
0
      LEAD_CASE(2)
1282
0
      LEAD_CASE(3)
1283
1
      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
0
    case BT_LF:
1295
0
      if (ptr == start) {
1296
0
        *nextTokPtr = ptr + MINBPC(enc);
1297
0
        return XML_TOK_DATA_NEWLINE;
1298
0
      }
1299
0
      *nextTokPtr = ptr;
1300
0
      return XML_TOK_DATA_CHARS;
1301
259
    case BT_CR:
1302
259
      if (ptr == start) {
1303
249
        ptr += MINBPC(enc);
1304
249
        if (! HAS_CHAR(enc, ptr, end))
1305
3
          return XML_TOK_TRAILING_CR;
1306
246
        if (BYTE_TYPE(enc, ptr) == BT_LF)
1307
0
          ptr += MINBPC(enc);
1308
246
        *nextTokPtr = ptr;
1309
246
        return XML_TOK_DATA_NEWLINE;
1310
249
      }
1311
10
      *nextTokPtr = ptr;
1312
10
      return XML_TOK_DATA_CHARS;
1313
4.37k
    case BT_S:
1314
4.37k
      if (ptr == start) {
1315
2.99k
        *nextTokPtr = ptr + MINBPC(enc);
1316
2.99k
        return XML_TOK_ATTRIBUTE_VALUE_S;
1317
2.99k
      }
1318
1.38k
      *nextTokPtr = ptr;
1319
1.38k
      return XML_TOK_DATA_CHARS;
1320
11.4k
    default:
1321
11.4k
      ptr += MINBPC(enc);
1322
11.4k
      break;
1323
16.0k
    }
1324
16.0k
  }
1325
0
  *nextTokPtr = ptr;
1326
0
  return XML_TOK_DATA_CHARS;
1327
4.62k
}
xmltok.c:normal_attributeValueTok
Line
Count
Source
1262
4.86k
                          const char **nextTokPtr) {
1263
4.86k
  const char *start;
1264
4.86k
  if (ptr >= end)
1265
233
    return XML_TOK_NONE;
1266
4.62k
  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
4.62k
  start = ptr;
1275
16.0k
  while (HAS_CHAR(enc, ptr, end)) {
1276
16.0k
    switch (BYTE_TYPE(enc, ptr)) {
1277
0
#  define LEAD_CASE(n)                                                         \
1278
0
  case BT_LEAD##n:                                                             \
1279
0
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1280
0
    break;
1281
0
      LEAD_CASE(2)
1282
0
      LEAD_CASE(3)
1283
1
      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
0
    case BT_LF:
1295
0
      if (ptr == start) {
1296
0
        *nextTokPtr = ptr + MINBPC(enc);
1297
0
        return XML_TOK_DATA_NEWLINE;
1298
0
      }
1299
0
      *nextTokPtr = ptr;
1300
0
      return XML_TOK_DATA_CHARS;
1301
259
    case BT_CR:
1302
259
      if (ptr == start) {
1303
249
        ptr += MINBPC(enc);
1304
249
        if (! HAS_CHAR(enc, ptr, end))
1305
3
          return XML_TOK_TRAILING_CR;
1306
246
        if (BYTE_TYPE(enc, ptr) == BT_LF)
1307
0
          ptr += MINBPC(enc);
1308
246
        *nextTokPtr = ptr;
1309
246
        return XML_TOK_DATA_NEWLINE;
1310
249
      }
1311
10
      *nextTokPtr = ptr;
1312
10
      return XML_TOK_DATA_CHARS;
1313
4.37k
    case BT_S:
1314
4.37k
      if (ptr == start) {
1315
2.99k
        *nextTokPtr = ptr + MINBPC(enc);
1316
2.99k
        return XML_TOK_ATTRIBUTE_VALUE_S;
1317
2.99k
      }
1318
1.38k
      *nextTokPtr = ptr;
1319
1.38k
      return XML_TOK_DATA_CHARS;
1320
11.4k
    default:
1321
11.4k
      ptr += MINBPC(enc);
1322
11.4k
      break;
1323
16.0k
    }
1324
16.0k
  }
1325
0
  *nextTokPtr = ptr;
1326
0
  return XML_TOK_DATA_CHARS;
1327
4.62k
}
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
10.1k
                ATTRIBUTE *atts) {
1511
10.1k
  enum { other, inName, inValue } state = inName;
1512
10.1k
  int nAtts = 0;
1513
10.1k
  int open = 0; /* defined when state == inValue;
1514
                   initialization just to shut up compilers */
1515
1516
1.87M
  for (ptr += MINBPC(enc);; ptr += MINBPC(enc)) {
1517
1.87M
    switch (BYTE_TYPE(enc, ptr)) {
1518
0
#  define START_NAME                                                           \
1519
1.18M
    if (state == other) {                                                      \
1520
50.7k
      if (nAtts < attsMax) {                                                   \
1521
30.2k
        atts[nAtts].name = ptr;                                                \
1522
30.2k
        atts[nAtts].normalized = 1;                                            \
1523
30.2k
      }                                                                        \
1524
50.7k
      state = inName;                                                          \
1525
50.7k
    }
1526
0
#  define LEAD_CASE(n)                                                         \
1527
4
  case BT_LEAD##n: /* NOTE: The encoding has already been validated. */        \
1528
4
    START_NAME ptr += (n - MINBPC(enc));                                       \
1529
4
    break;
1530
3
      LEAD_CASE(2)
1531
0
      LEAD_CASE(3)
1532
1
      LEAD_CASE(4)
1533
0
#  undef LEAD_CASE
1534
527
    case BT_NONASCII:
1535
820k
    case BT_NMSTRT:
1536
1.18M
    case BT_HEX:
1537
1.18M
      START_NAME
1538
1.18M
      break;
1539
0
#  undef START_NAME
1540
101k
    case BT_QUOT:
1541
101k
      if (state != inValue) {
1542
50.7k
        if (nAtts < attsMax)
1543
30.2k
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1544
50.7k
        state = inValue;
1545
50.7k
        open = BT_QUOT;
1546
50.7k
      } else if (open == BT_QUOT) {
1547
50.7k
        state = other;
1548
50.7k
        if (nAtts < attsMax)
1549
30.2k
          atts[nAtts].valueEnd = ptr;
1550
50.7k
        nAtts++;
1551
50.7k
      }
1552
101k
      break;
1553
6
    case BT_APOS:
1554
6
      if (state != inValue) {
1555
3
        if (nAtts < attsMax)
1556
3
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1557
3
        state = inValue;
1558
3
        open = BT_APOS;
1559
3
      } else if (open == BT_APOS) {
1560
3
        state = other;
1561
3
        if (nAtts < attsMax)
1562
3
          atts[nAtts].valueEnd = ptr;
1563
3
        nAtts++;
1564
3
      }
1565
6
      break;
1566
0
    case BT_AMP:
1567
0
      if (nAtts < attsMax)
1568
0
        atts[nAtts].normalized = 0;
1569
0
      break;
1570
170k
    case BT_S:
1571
170k
      if (state == inName)
1572
1.43k
        state = other;
1573
169k
      else if (state == inValue && nAtts < attsMax && atts[nAtts].normalized
1574
8.51k
               && (ptr == atts[nAtts].valuePtr
1575
8.51k
                   || BYTE_TO_ASCII(enc, ptr) != ASCII_SPACE
1576
8.51k
                   || BYTE_TO_ASCII(enc, ptr + MINBPC(enc)) == ASCII_SPACE
1577
8.28k
                   || BYTE_TYPE(enc, ptr + MINBPC(enc)) == open))
1578
230
        atts[nAtts].normalized = 0;
1579
170k
      break;
1580
672
    case BT_CR:
1581
49.8k
    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
49.8k
      if (state == inName)
1585
768
        state = other;
1586
49.0k
      else if (state == inValue && nAtts < attsMax)
1587
249
        atts[nAtts].normalized = 0;
1588
49.8k
      break;
1589
9.43k
    case BT_GT:
1590
40.0k
    case BT_SOL:
1591
40.0k
      if (state != inValue)
1592
10.1k
        return nAtts;
1593
29.8k
      break;
1594
326k
    default:
1595
326k
      break;
1596
1.87M
    }
1597
1.87M
  }
1598
  /* not reached */
1599
10.1k
}
xmltok.c:normal_getAtts
Line
Count
Source
1510
10.1k
                ATTRIBUTE *atts) {
1511
10.1k
  enum { other, inName, inValue } state = inName;
1512
10.1k
  int nAtts = 0;
1513
10.1k
  int open = 0; /* defined when state == inValue;
1514
                   initialization just to shut up compilers */
1515
1516
1.87M
  for (ptr += MINBPC(enc);; ptr += MINBPC(enc)) {
1517
1.87M
    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
3
      LEAD_CASE(2)
1531
0
      LEAD_CASE(3)
1532
1
      LEAD_CASE(4)
1533
0
#  undef LEAD_CASE
1534
0
    case BT_NONASCII:
1535
820k
    case BT_NMSTRT:
1536
1.18M
    case BT_HEX:
1537
1.18M
      START_NAME
1538
1.18M
      break;
1539
0
#  undef START_NAME
1540
101k
    case BT_QUOT:
1541
101k
      if (state != inValue) {
1542
50.7k
        if (nAtts < attsMax)
1543
30.2k
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1544
50.7k
        state = inValue;
1545
50.7k
        open = BT_QUOT;
1546
50.7k
      } else if (open == BT_QUOT) {
1547
50.7k
        state = other;
1548
50.7k
        if (nAtts < attsMax)
1549
30.2k
          atts[nAtts].valueEnd = ptr;
1550
50.7k
        nAtts++;
1551
50.7k
      }
1552
101k
      break;
1553
6
    case BT_APOS:
1554
6
      if (state != inValue) {
1555
3
        if (nAtts < attsMax)
1556
3
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1557
3
        state = inValue;
1558
3
        open = BT_APOS;
1559
3
      } else if (open == BT_APOS) {
1560
3
        state = other;
1561
3
        if (nAtts < attsMax)
1562
3
          atts[nAtts].valueEnd = ptr;
1563
3
        nAtts++;
1564
3
      }
1565
6
      break;
1566
0
    case BT_AMP:
1567
0
      if (nAtts < attsMax)
1568
0
        atts[nAtts].normalized = 0;
1569
0
      break;
1570
170k
    case BT_S:
1571
170k
      if (state == inName)
1572
1.42k
        state = other;
1573
169k
      else if (state == inValue && nAtts < attsMax && atts[nAtts].normalized
1574
8.51k
               && (ptr == atts[nAtts].valuePtr
1575
8.51k
                   || BYTE_TO_ASCII(enc, ptr) != ASCII_SPACE
1576
8.51k
                   || BYTE_TO_ASCII(enc, ptr + MINBPC(enc)) == ASCII_SPACE
1577
8.28k
                   || BYTE_TYPE(enc, ptr + MINBPC(enc)) == open))
1578
230
        atts[nAtts].normalized = 0;
1579
170k
      break;
1580
672
    case BT_CR:
1581
49.8k
    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
49.8k
      if (state == inName)
1585
767
        state = other;
1586
49.0k
      else if (state == inValue && nAtts < attsMax)
1587
249
        atts[nAtts].normalized = 0;
1588
49.8k
      break;
1589
9.35k
    case BT_GT:
1590
39.9k
    case BT_SOL:
1591
39.9k
      if (state != inValue)
1592
10.1k
        return nAtts;
1593
29.8k
      break;
1594
326k
    default:
1595
326k
      break;
1596
1.87M
    }
1597
1.87M
  }
1598
  /* not reached */
1599
10.1k
}
xmltok.c:little2_getAtts
Line
Count
Source
1510
61
                ATTRIBUTE *atts) {
1511
61
  enum { other, inName, inValue } state = inName;
1512
61
  int nAtts = 0;
1513
61
  int open = 0; /* defined when state == inValue;
1514
                   initialization just to shut up compilers */
1515
1516
535
  for (ptr += MINBPC(enc);; ptr += MINBPC(enc)) {
1517
535
    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
415
    case BT_NONASCII:
1535
425
    case BT_NMSTRT:
1536
426
    case BT_HEX:
1537
426
      START_NAME
1538
426
      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
0
    case BT_S:
1571
0
      if (state == inName)
1572
0
        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
0
      break;
1580
0
    case BT_CR:
1581
1
    case BT_LF:
1582
      /* This case ensures that the first attribute name is counted
1583
         Apart from that we could just change state on the quote. */
1584
1
      if (state == inName)
1585
1
        state = other;
1586
0
      else if (state == inValue && nAtts < attsMax)
1587
0
        atts[nAtts].normalized = 0;
1588
1
      break;
1589
58
    case BT_GT:
1590
61
    case BT_SOL:
1591
61
      if (state != inValue)
1592
61
        return nAtts;
1593
0
      break;
1594
47
    default:
1595
47
      break;
1596
535
    }
1597
535
  }
1598
  /* not reached */
1599
61
}
xmltok.c:big2_getAtts
Line
Count
Source
1510
22
                ATTRIBUTE *atts) {
1511
22
  enum { other, inName, inValue } state = inName;
1512
22
  int nAtts = 0;
1513
22
  int open = 0; /* defined when state == inValue;
1514
                   initialization just to shut up compilers */
1515
1516
158
  for (ptr += MINBPC(enc);; ptr += MINBPC(enc)) {
1517
158
    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
112
    case BT_NONASCII:
1535
115
    case BT_NMSTRT:
1536
132
    case BT_HEX:
1537
132
      START_NAME
1538
132
      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
4
    case BT_S:
1571
4
      if (state == inName)
1572
4
        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
4
      break;
1580
0
    case BT_CR:
1581
0
    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
0
      if (state == inName)
1585
0
        state = other;
1586
0
      else if (state == inValue && nAtts < attsMax)
1587
0
        atts[nAtts].normalized = 0;
1588
0
      break;
1589
22
    case BT_GT:
1590
22
    case BT_SOL:
1591
22
      if (state != inValue)
1592
22
        return nAtts;
1593
0
      break;
1594
0
    default:
1595
0
      break;
1596
158
    }
1597
158
  }
1598
  /* not reached */
1599
22
}
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
2
                             const char *end) {
1662
2
  UNUSED_P(enc);
1663
2
  switch ((end - ptr) / MINBPC(enc)) {
1664
1
  case 2:
1665
1
    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
1
    break;
1674
1
  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
1
  case 4:
1685
1
    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
1
    }
1709
2
  }
1710
2
  return 0;
1711
2
}
Unexecuted instantiation: xmltok.c:normal_predefinedEntityName
xmltok.c:little2_predefinedEntityName
Line
Count
Source
1661
2
                             const char *end) {
1662
2
  UNUSED_P(enc);
1663
2
  switch ((end - ptr) / MINBPC(enc)) {
1664
1
  case 2:
1665
1
    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
1
    break;
1674
1
  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
1
  case 4:
1685
1
    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
1
    }
1709
2
  }
1710
2
  return 0;
1711
2
}
Unexecuted instantiation: xmltok.c:big2_predefinedEntityName
1712
1713
static int PTRCALL
1714
PREFIX(nameMatchesAscii)(const ENCODING *enc, const char *ptr1,
1715
32
                         const char *end1, const char *ptr2) {
1716
32
  UNUSED_P(enc);
1717
192
  for (; *ptr2; ptr1 += MINBPC(enc), ptr2++) {
1718
171
    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
3
      return 0; /* LCOV_EXCL_LINE */
1725
3
    }
1726
168
    if (! CHAR_MATCHES(enc, ptr1, *ptr2))
1727
8
      return 0;
1728
168
  }
1729
21
  return ptr1 == end1;
1730
32
}
xmltok.c:normal_nameMatchesAscii
Line
Count
Source
1715
32
                         const char *end1, const char *ptr2) {
1716
32
  UNUSED_P(enc);
1717
192
  for (; *ptr2; ptr1 += MINBPC(enc), ptr2++) {
1718
171
    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
3
      return 0; /* LCOV_EXCL_LINE */
1725
3
    }
1726
168
    if (! CHAR_MATCHES(enc, ptr1, *ptr2))
1727
8
      return 0;
1728
168
  }
1729
21
  return ptr1 == end1;
1730
32
}
Unexecuted instantiation: xmltok.c:little2_nameMatchesAscii
Unexecuted instantiation: xmltok.c:big2_nameMatchesAscii
1731
1732
static int PTRFASTCALL
1733
45.7k
PREFIX(nameLength)(const ENCODING *enc, const char *ptr) {
1734
45.7k
  const char *start = ptr;
1735
711k
  for (;;) {
1736
711k
    switch (BYTE_TYPE(enc, ptr)) {
1737
0
#  define LEAD_CASE(n)                                                         \
1738
3
  case BT_LEAD##n:                                                             \
1739
3
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1740
3
    break;
1741
3
      LEAD_CASE(2)
1742
0
      LEAD_CASE(3)
1743
0
      LEAD_CASE(4)
1744
0
#  undef LEAD_CASE
1745
527
    case BT_NONASCII:
1746
414k
    case BT_NMSTRT:
1747
414k
#  ifdef XML_NS
1748
459k
    case BT_COLON:
1749
459k
#  endif
1750
644k
    case BT_HEX:
1751
664k
    case BT_DIGIT:
1752
665k
    case BT_NAME:
1753
665k
    case BT_MINUS:
1754
665k
      ptr += MINBPC(enc);
1755
665k
      break;
1756
45.7k
    default:
1757
45.7k
      return (int)(ptr - start);
1758
711k
    }
1759
711k
  }
1760
45.7k
}
xmltok.c:normal_nameLength
Line
Count
Source
1733
45.6k
PREFIX(nameLength)(const ENCODING *enc, const char *ptr) {
1734
45.6k
  const char *start = ptr;
1735
710k
  for (;;) {
1736
710k
    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
3
      LEAD_CASE(2)
1742
0
      LEAD_CASE(3)
1743
0
      LEAD_CASE(4)
1744
0
#  undef LEAD_CASE
1745
0
    case BT_NONASCII:
1746
413k
    case BT_NMSTRT:
1747
413k
#  ifdef XML_NS
1748
458k
    case BT_COLON:
1749
458k
#  endif
1750
643k
    case BT_HEX:
1751
663k
    case BT_DIGIT:
1752
664k
    case BT_NAME:
1753
664k
    case BT_MINUS:
1754
664k
      ptr += MINBPC(enc);
1755
664k
      break;
1756
45.6k
    default:
1757
45.6k
      return (int)(ptr - start);
1758
710k
    }
1759
710k
  }
1760
45.6k
}
xmltok.c:little2_nameLength
Line
Count
Source
1733
61
PREFIX(nameLength)(const ENCODING *enc, const char *ptr) {
1734
61
  const char *start = ptr;
1735
534
  for (;;) {
1736
534
    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
415
    case BT_NONASCII:
1746
425
    case BT_NMSTRT:
1747
425
#  ifdef XML_NS
1748
425
    case BT_COLON:
1749
425
#  endif
1750
426
    case BT_HEX:
1751
426
    case BT_DIGIT:
1752
426
    case BT_NAME:
1753
473
    case BT_MINUS:
1754
473
      ptr += MINBPC(enc);
1755
473
      break;
1756
61
    default:
1757
61
      return (int)(ptr - start);
1758
534
    }
1759
534
  }
1760
61
}
xmltok.c:big2_nameLength
Line
Count
Source
1733
22
PREFIX(nameLength)(const ENCODING *enc, const char *ptr) {
1734
22
  const char *start = ptr;
1735
154
  for (;;) {
1736
154
    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
112
    case BT_NONASCII:
1746
115
    case BT_NMSTRT:
1747
115
#  ifdef XML_NS
1748
115
    case BT_COLON:
1749
115
#  endif
1750
132
    case BT_HEX:
1751
132
    case BT_DIGIT:
1752
132
    case BT_NAME:
1753
132
    case BT_MINUS:
1754
132
      ptr += MINBPC(enc);
1755
132
      break;
1756
22
    default:
1757
22
      return (int)(ptr - start);
1758
154
    }
1759
154
  }
1760
22
}
1761
1762
static const char *PTRFASTCALL
1763
92
PREFIX(skipS)(const ENCODING *enc, const char *ptr) {
1764
184
  for (;;) {
1765
184
    switch (BYTE_TYPE(enc, ptr)) {
1766
0
    case BT_LF:
1767
0
    case BT_CR:
1768
92
    case BT_S:
1769
92
      ptr += MINBPC(enc);
1770
92
      break;
1771
92
    default:
1772
92
      return ptr;
1773
184
    }
1774
184
  }
1775
92
}
xmltok.c:normal_skipS
Line
Count
Source
1763
92
PREFIX(skipS)(const ENCODING *enc, const char *ptr) {
1764
184
  for (;;) {
1765
184
    switch (BYTE_TYPE(enc, ptr)) {
1766
0
    case BT_LF:
1767
0
    case BT_CR:
1768
92
    case BT_S:
1769
92
      ptr += MINBPC(enc);
1770
92
      break;
1771
92
    default:
1772
92
      return ptr;
1773
184
    }
1774
184
  }
1775
92
}
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
5.96k
                       POSITION *pos) {
1780
676k
  while (HAS_CHAR(enc, ptr, end)) {
1781
676k
    switch (BYTE_TYPE(enc, ptr)) {
1782
0
#  define LEAD_CASE(n)                                                         \
1783
1.18k
  case BT_LEAD##n:                                                             \
1784
1.18k
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1785
1.18k
    pos->columnNumber++;                                                       \
1786
1.18k
    break;
1787
159
      LEAD_CASE(2)
1788
668
      LEAD_CASE(3)
1789
356
      LEAD_CASE(4)
1790
0
#  undef LEAD_CASE
1791
35.5k
    case BT_LF:
1792
35.5k
      pos->columnNumber = 0;
1793
35.5k
      pos->lineNumber++;
1794
35.5k
      ptr += MINBPC(enc);
1795
35.5k
      break;
1796
9.95k
    case BT_CR:
1797
9.95k
      pos->lineNumber++;
1798
9.95k
      ptr += MINBPC(enc);
1799
9.95k
      if (HAS_CHAR(enc, ptr, end) && BYTE_TYPE(enc, ptr) == BT_LF)
1800
742
        ptr += MINBPC(enc);
1801
9.95k
      pos->columnNumber = 0;
1802
9.95k
      break;
1803
629k
    default:
1804
629k
      ptr += MINBPC(enc);
1805
629k
      pos->columnNumber++;
1806
629k
      break;
1807
676k
    }
1808
676k
  }
1809
5.96k
}
xmltok.c:normal_updatePosition
Line
Count
Source
1779
4.64k
                       POSITION *pos) {
1780
672k
  while (HAS_CHAR(enc, ptr, end)) {
1781
672k
    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
159
      LEAD_CASE(2)
1788
668
      LEAD_CASE(3)
1789
344
      LEAD_CASE(4)
1790
0
#  undef LEAD_CASE
1791
35.5k
    case BT_LF:
1792
35.5k
      pos->columnNumber = 0;
1793
35.5k
      pos->lineNumber++;
1794
35.5k
      ptr += MINBPC(enc);
1795
35.5k
      break;
1796
9.91k
    case BT_CR:
1797
9.91k
      pos->lineNumber++;
1798
9.91k
      ptr += MINBPC(enc);
1799
9.91k
      if (HAS_CHAR(enc, ptr, end) && BYTE_TYPE(enc, ptr) == BT_LF)
1800
742
        ptr += MINBPC(enc);
1801
9.91k
      pos->columnNumber = 0;
1802
9.91k
      break;
1803
626k
    default:
1804
626k
      ptr += MINBPC(enc);
1805
626k
      pos->columnNumber++;
1806
626k
      break;
1807
672k
    }
1808
672k
  }
1809
4.64k
}
xmltok.c:little2_updatePosition
Line
Count
Source
1779
766
                       POSITION *pos) {
1780
2.14k
  while (HAS_CHAR(enc, ptr, end)) {
1781
2.14k
    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
10
      LEAD_CASE(4)
1790
0
#  undef LEAD_CASE
1791
24
    case BT_LF:
1792
24
      pos->columnNumber = 0;
1793
24
      pos->lineNumber++;
1794
24
      ptr += MINBPC(enc);
1795
24
      break;
1796
32
    case BT_CR:
1797
32
      pos->lineNumber++;
1798
32
      ptr += MINBPC(enc);
1799
32
      if (HAS_CHAR(enc, ptr, end) && BYTE_TYPE(enc, ptr) == BT_LF)
1800
0
        ptr += MINBPC(enc);
1801
32
      pos->columnNumber = 0;
1802
32
      break;
1803
2.07k
    default:
1804
2.07k
      ptr += MINBPC(enc);
1805
2.07k
      pos->columnNumber++;
1806
2.07k
      break;
1807
2.14k
    }
1808
2.14k
  }
1809
766
}
xmltok.c:big2_updatePosition
Line
Count
Source
1779
558
                       POSITION *pos) {
1780
1.66k
  while (HAS_CHAR(enc, ptr, end)) {
1781
1.66k
    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
2
      LEAD_CASE(4)
1790
0
#  undef LEAD_CASE
1791
6
    case BT_LF:
1792
6
      pos->columnNumber = 0;
1793
6
      pos->lineNumber++;
1794
6
      ptr += MINBPC(enc);
1795
6
      break;
1796
6
    case BT_CR:
1797
6
      pos->lineNumber++;
1798
6
      ptr += MINBPC(enc);
1799
6
      if (HAS_CHAR(enc, ptr, end) && BYTE_TYPE(enc, ptr) == BT_LF)
1800
0
        ptr += MINBPC(enc);
1801
6
      pos->columnNumber = 0;
1802
6
      break;
1803
1.64k
    default:
1804
1.64k
      ptr += MINBPC(enc);
1805
1.64k
      pos->columnNumber++;
1806
1.64k
      break;
1807
1.66k
    }
1808
1.66k
  }
1809
558
}
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 */