Coverage Report

Created: 2026-04-29 07:00

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
3.70k
#    define IS_INVALID_CHAR(enc, ptr, n) (0)
46
#  endif
47
48
#  define INVALID_LEAD_CASE(n, ptr, nextTokPtr)                                \
49
9.23k
  case BT_LEAD##n:                                                             \
50
9.23k
    if (end - ptr < n)                                                         \
51
8.83k
      return XML_TOK_PARTIAL_CHAR;                                             \
52
9.04k
    if (IS_INVALID_CHAR(enc, ptr, n)) {                                        \
53
206
      *(nextTokPtr) = (ptr);                                                   \
54
206
      return XML_TOK_INVALID;                                                  \
55
206
    }                                                                          \
56
9.04k
    ptr += n;                                                                  \
57
8.83k
    break;
58
59
#  define INVALID_CASES(ptr, nextTokPtr)                                       \
60
1.09k
    INVALID_LEAD_CASE(2, ptr, nextTokPtr)                                      \
61
4.56k
    INVALID_LEAD_CASE(3, ptr, nextTokPtr)                                      \
62
4.45k
    INVALID_LEAD_CASE(4, ptr, nextTokPtr)                                      \
63
3.38k
  case BT_NONXML:                                                              \
64
667
  case BT_MALFORM:                                                             \
65
976
  case BT_TRAIL:                                                               \
66
976
    *(nextTokPtr) = (ptr);                                                     \
67
976
    return XML_TOK_INVALID;
68
69
#  define CHECK_NAME_CASE(n, enc, ptr, end, nextTokPtr)                        \
70
2.71k
  case BT_LEAD##n:                                                             \
71
2.71k
    if (end - ptr < n)                                                         \
72
1.76k
      return XML_TOK_PARTIAL_CHAR;                                             \
73
2.48k
    if (IS_INVALID_CHAR(enc, ptr, n) || ! IS_NAME_CHAR(enc, ptr, n)) {         \
74
725
      *nextTokPtr = ptr;                                                       \
75
725
      return XML_TOK_INVALID;                                                  \
76
725
    }                                                                          \
77
2.48k
    ptr += n;                                                                  \
78
1.76k
    break;
79
80
#  define CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)                          \
81
5.19M
  case BT_NONASCII:                                                            \
82
5.19M
    if (! IS_NAME_CHAR_MINBPC(enc, ptr)) {                                     \
83
605
      *nextTokPtr = ptr;                                                       \
84
605
      return XML_TOK_INVALID;                                                  \
85
605
    }                                                                          \
86
5.19M
    /* fall through */                                                         \
87
5.19M
  case BT_NMSTRT:                                                              \
88
5.07M
  case BT_HEX:                                                                 \
89
5.19M
  case BT_DIGIT:                                                               \
90
5.19M
  case BT_NAME:                                                                \
91
5.19M
  case BT_MINUS:                                                               \
92
5.19M
    ptr += MINBPC(enc);                                                        \
93
5.19M
    break;                                                                     \
94
5.19M
    CHECK_NAME_CASE(2, enc, ptr, end, nextTokPtr)                              \
95
1.32k
    CHECK_NAME_CASE(3, enc, ptr, end, nextTokPtr)                              \
96
1.14k
    CHECK_NAME_CASE(4, enc, ptr, end, nextTokPtr)
97
98
#  define CHECK_NMSTRT_CASE(n, enc, ptr, end, nextTokPtr)                      \
99
810
  case BT_LEAD##n:                                                             \
100
810
    if ((end) - (ptr) < (n))                                                   \
101
161
      return XML_TOK_PARTIAL_CHAR;                                             \
102
686
    if (IS_INVALID_CHAR(enc, ptr, n) || ! IS_NMSTRT_CHAR(enc, ptr, n)) {       \
103
525
      *nextTokPtr = ptr;                                                       \
104
525
      return XML_TOK_INVALID;                                                  \
105
525
    }                                                                          \
106
686
    ptr += n;                                                                  \
107
161
    break;
108
109
#  define CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)                        \
110
847k
  case BT_NONASCII:                                                            \
111
847k
    if (! IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {                                   \
112
294
      *nextTokPtr = ptr;                                                       \
113
294
      return XML_TOK_INVALID;                                                  \
114
294
    }                                                                          \
115
847k
    /* fall through */                                                         \
116
847k
  case BT_NMSTRT:                                                              \
117
847k
  case BT_HEX:                                                                 \
118
847k
    ptr += MINBPC(enc);                                                        \
119
847k
    break;                                                                     \
120
847k
    CHECK_NMSTRT_CASE(2, enc, ptr, end, nextTokPtr)                            \
121
134
    CHECK_NMSTRT_CASE(3, enc, ptr, end, nextTokPtr)                            \
122
395
    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
22.4M
    ((end) - (ptr) >= ((count) * MINBPC(enc)))
130
131
4.85M
#  define HAS_CHAR(enc, ptr, end) HAS_CHARS(enc, ptr, end, 1)
132
133
#  define REQUIRE_CHARS(enc, ptr, end, count)                                  \
134
5.78M
    {                                                                          \
135
5.78M
      if (! HAS_CHARS(enc, ptr, end, count)) {                                 \
136
445
        return XML_TOK_PARTIAL;                                                \
137
445
      }                                                                        \
138
5.78M
    }
139
140
5.78M
#  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
398
                    const char **nextTokPtr) {
147
398
  if (HAS_CHAR(enc, ptr, end)) {
148
381
    if (! CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
149
36
      *nextTokPtr = ptr;
150
36
      return XML_TOK_INVALID;
151
36
    }
152
345
    ptr += MINBPC(enc);
153
10.1k
    while (HAS_CHAR(enc, ptr, end)) {
154
10.1k
      switch (BYTE_TYPE(enc, ptr)) {
155
1.03k
        INVALID_CASES(ptr, nextTokPtr)
156
249
      case BT_MINUS:
157
249
        ptr += MINBPC(enc);
158
249
        REQUIRE_CHAR(enc, ptr, end);
159
233
        if (CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
160
44
          ptr += MINBPC(enc);
161
44
          REQUIRE_CHAR(enc, ptr, end);
162
27
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
163
21
            *nextTokPtr = ptr;
164
21
            return XML_TOK_INVALID;
165
21
          }
166
6
          *nextTokPtr = ptr + MINBPC(enc);
167
6
          return XML_TOK_COMMENT;
168
27
        }
169
189
        break;
170
9.31k
      default:
171
9.31k
        ptr += MINBPC(enc);
172
9.31k
        break;
173
10.1k
      }
174
10.1k
    }
175
345
  }
176
129
  return XML_TOK_PARTIAL;
177
398
}
xmltok.c:normal_scanComment
Line
Count
Source
146
97
                    const char **nextTokPtr) {
147
97
  if (HAS_CHAR(enc, ptr, end)) {
148
93
    if (! CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
149
3
      *nextTokPtr = ptr;
150
3
      return XML_TOK_INVALID;
151
3
    }
152
90
    ptr += MINBPC(enc);
153
2.61k
    while (HAS_CHAR(enc, ptr, end)) {
154
2.61k
      switch (BYTE_TYPE(enc, ptr)) {
155
241
        INVALID_CASES(ptr, nextTokPtr)
156
142
      case BT_MINUS:
157
142
        ptr += MINBPC(enc);
158
142
        REQUIRE_CHAR(enc, ptr, end);
159
136
        if (CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
160
16
          ptr += MINBPC(enc);
161
16
          REQUIRE_CHAR(enc, ptr, end);
162
6
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
163
0
            *nextTokPtr = ptr;
164
0
            return XML_TOK_INVALID;
165
0
          }
166
6
          *nextTokPtr = ptr + MINBPC(enc);
167
6
          return XML_TOK_COMMENT;
168
6
        }
169
120
        break;
170
2.33k
      default:
171
2.33k
        ptr += MINBPC(enc);
172
2.33k
        break;
173
2.61k
      }
174
2.61k
    }
175
90
  }
176
25
  return XML_TOK_PARTIAL;
177
97
}
xmltok.c:little2_scanComment
Line
Count
Source
146
121
                    const char **nextTokPtr) {
147
121
  if (HAS_CHAR(enc, ptr, end)) {
148
115
    if (! CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
149
13
      *nextTokPtr = ptr;
150
13
      return XML_TOK_INVALID;
151
13
    }
152
102
    ptr += MINBPC(enc);
153
4.21k
    while (HAS_CHAR(enc, ptr, end)) {
154
4.21k
      switch (BYTE_TYPE(enc, ptr)) {
155
335
        INVALID_CASES(ptr, nextTokPtr)
156
30
      case BT_MINUS:
157
30
        ptr += MINBPC(enc);
158
30
        REQUIRE_CHAR(enc, ptr, end);
159
26
        if (CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
160
7
          ptr += MINBPC(enc);
161
7
          REQUIRE_CHAR(enc, ptr, end);
162
6
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
163
6
            *nextTokPtr = ptr;
164
6
            return XML_TOK_INVALID;
165
6
          }
166
0
          *nextTokPtr = ptr + MINBPC(enc);
167
0
          return XML_TOK_COMMENT;
168
6
        }
169
19
        break;
170
3.99k
      default:
171
3.99k
        ptr += MINBPC(enc);
172
3.99k
        break;
173
4.21k
      }
174
4.21k
    }
175
102
  }
176
31
  return XML_TOK_PARTIAL;
177
121
}
xmltok.c:big2_scanComment
Line
Count
Source
146
180
                    const char **nextTokPtr) {
147
180
  if (HAS_CHAR(enc, ptr, end)) {
148
173
    if (! CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
149
20
      *nextTokPtr = ptr;
150
20
      return XML_TOK_INVALID;
151
20
    }
152
153
    ptr += MINBPC(enc);
153
3.32k
    while (HAS_CHAR(enc, ptr, end)) {
154
3.32k
      switch (BYTE_TYPE(enc, ptr)) {
155
461
        INVALID_CASES(ptr, nextTokPtr)
156
77
      case BT_MINUS:
157
77
        ptr += MINBPC(enc);
158
77
        REQUIRE_CHAR(enc, ptr, end);
159
71
        if (CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
160
21
          ptr += MINBPC(enc);
161
21
          REQUIRE_CHAR(enc, ptr, end);
162
15
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
163
15
            *nextTokPtr = ptr;
164
15
            return XML_TOK_INVALID;
165
15
          }
166
0
          *nextTokPtr = ptr + MINBPC(enc);
167
0
          return XML_TOK_COMMENT;
168
15
        }
169
50
        break;
170
2.99k
      default:
171
2.99k
        ptr += MINBPC(enc);
172
2.99k
        break;
173
3.32k
      }
174
3.32k
    }
175
153
  }
176
73
  return XML_TOK_PARTIAL;
177
180
}
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
647
                 const char **nextTokPtr) {
184
647
  REQUIRE_CHAR(enc, ptr, end);
185
627
  switch (BYTE_TYPE(enc, ptr)) {
186
325
  case BT_MINUS:
187
325
    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
86
  case BT_NMSTRT:
192
226
  case BT_HEX:
193
226
    ptr += MINBPC(enc);
194
226
    break;
195
76
  default:
196
76
    *nextTokPtr = ptr;
197
76
    return XML_TOK_INVALID;
198
627
  }
199
1.12k
  while (HAS_CHAR(enc, ptr, end)) {
200
1.12k
    switch (BYTE_TYPE(enc, ptr)) {
201
30
    case BT_PERCNT:
202
30
      REQUIRE_CHARS(enc, ptr, end, 2);
203
      /* don't allow <!ENTITY% foo "whatever"> */
204
28
      switch (BYTE_TYPE(enc, ptr + MINBPC(enc))) {
205
0
      case BT_S:
206
3
      case BT_CR:
207
3
      case BT_LF:
208
10
      case BT_PERCNT:
209
10
        *nextTokPtr = ptr;
210
10
        return XML_TOK_INVALID;
211
28
      }
212
      /* fall through */
213
57
    case BT_S:
214
81
    case BT_CR:
215
87
    case BT_LF:
216
87
      *nextTokPtr = ptr;
217
87
      return XML_TOK_DECL_OPEN;
218
444
    case BT_NMSTRT:
219
935
    case BT_HEX:
220
935
      ptr += MINBPC(enc);
221
935
      break;
222
89
    default:
223
89
      *nextTokPtr = ptr;
224
89
      return XML_TOK_INVALID;
225
1.12k
    }
226
1.12k
  }
227
38
  return XML_TOK_PARTIAL;
228
226
}
xmltok.c:normal_scanDecl
Line
Count
Source
183
161
                 const char **nextTokPtr) {
184
161
  REQUIRE_CHAR(enc, ptr, end);
185
155
  switch (BYTE_TYPE(enc, ptr)) {
186
25
  case BT_MINUS:
187
25
    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
8
  case BT_NMSTRT:
192
121
  case BT_HEX:
193
121
    ptr += MINBPC(enc);
194
121
    break;
195
9
  default:
196
9
    *nextTokPtr = ptr;
197
9
    return XML_TOK_INVALID;
198
155
  }
199
977
  while (HAS_CHAR(enc, ptr, end)) {
200
977
    switch (BYTE_TYPE(enc, ptr)) {
201
17
    case BT_PERCNT:
202
17
      REQUIRE_CHARS(enc, ptr, end, 2);
203
      /* don't allow <!ENTITY% foo "whatever"> */
204
15
      switch (BYTE_TYPE(enc, ptr + MINBPC(enc))) {
205
0
      case BT_S:
206
3
      case BT_CR:
207
3
      case BT_LF:
208
10
      case BT_PERCNT:
209
10
        *nextTokPtr = ptr;
210
10
        return XML_TOK_INVALID;
211
15
      }
212
      /* fall through */
213
44
    case BT_S:
214
68
    case BT_CR:
215
74
    case BT_LF:
216
74
      *nextTokPtr = ptr;
217
74
      return XML_TOK_DECL_OPEN;
218
422
    case BT_NMSTRT:
219
881
    case BT_HEX:
220
881
      ptr += MINBPC(enc);
221
881
      break;
222
10
    default:
223
10
      *nextTokPtr = ptr;
224
10
      return XML_TOK_INVALID;
225
977
    }
226
977
  }
227
25
  return XML_TOK_PARTIAL;
228
121
}
xmltok.c:little2_scanDecl
Line
Count
Source
183
208
                 const char **nextTokPtr) {
184
208
  REQUIRE_CHAR(enc, ptr, end);
185
202
  switch (BYTE_TYPE(enc, ptr)) {
186
121
  case BT_MINUS:
187
121
    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
20
  case BT_NMSTRT:
192
40
  case BT_HEX:
193
40
    ptr += MINBPC(enc);
194
40
    break;
195
41
  default:
196
41
    *nextTokPtr = ptr;
197
41
    return XML_TOK_INVALID;
198
202
  }
199
46
  while (HAS_CHAR(enc, ptr, end)) {
200
46
    switch (BYTE_TYPE(enc, ptr)) {
201
3
    case BT_PERCNT:
202
3
      REQUIRE_CHARS(enc, ptr, end, 2);
203
      /* don't allow <!ENTITY% foo "whatever"> */
204
3
      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
3
      }
212
      /* fall through */
213
3
    case BT_S:
214
3
    case BT_CR:
215
3
    case BT_LF:
216
3
      *nextTokPtr = ptr;
217
3
      return XML_TOK_DECL_OPEN;
218
8
    case BT_NMSTRT:
219
12
    case BT_HEX:
220
12
      ptr += MINBPC(enc);
221
12
      break;
222
31
    default:
223
31
      *nextTokPtr = ptr;
224
31
      return XML_TOK_INVALID;
225
46
    }
226
46
  }
227
6
  return XML_TOK_PARTIAL;
228
40
}
xmltok.c:big2_scanDecl
Line
Count
Source
183
278
                 const char **nextTokPtr) {
184
278
  REQUIRE_CHAR(enc, ptr, end);
185
270
  switch (BYTE_TYPE(enc, ptr)) {
186
179
  case BT_MINUS:
187
179
    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
58
  case BT_NMSTRT:
192
65
  case BT_HEX:
193
65
    ptr += MINBPC(enc);
194
65
    break;
195
26
  default:
196
26
    *nextTokPtr = ptr;
197
26
    return XML_TOK_INVALID;
198
270
  }
199
100
  while (HAS_CHAR(enc, ptr, end)) {
200
100
    switch (BYTE_TYPE(enc, ptr)) {
201
10
    case BT_PERCNT:
202
10
      REQUIRE_CHARS(enc, ptr, end, 2);
203
      /* don't allow <!ENTITY% foo "whatever"> */
204
10
      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
10
      }
212
      /* fall through */
213
10
    case BT_S:
214
10
    case BT_CR:
215
10
    case BT_LF:
216
10
      *nextTokPtr = ptr;
217
10
      return XML_TOK_DECL_OPEN;
218
14
    case BT_NMSTRT:
219
42
    case BT_HEX:
220
42
      ptr += MINBPC(enc);
221
42
      break;
222
48
    default:
223
48
      *nextTokPtr = ptr;
224
48
      return XML_TOK_INVALID;
225
100
    }
226
100
  }
227
7
  return XML_TOK_PARTIAL;
228
65
}
229
230
static int PTRCALL
231
PREFIX(checkPiTarget)(const ENCODING *enc, const char *ptr, const char *end,
232
3.80k
                      int *tokPtr) {
233
3.80k
  int upper = 0;
234
3.80k
  UNUSED_P(enc);
235
3.80k
  *tokPtr = XML_TOK_PI;
236
3.80k
  if (end - ptr != MINBPC(enc) * 3)
237
3.73k
    return 1;
238
66
  switch (BYTE_TO_ASCII(enc, ptr)) {
239
2
  case ASCII_x:
240
2
    break;
241
3
  case ASCII_X:
242
3
    upper = 1;
243
3
    break;
244
61
  default:
245
61
    return 1;
246
66
  }
247
5
  ptr += MINBPC(enc);
248
5
  switch (BYTE_TO_ASCII(enc, ptr)) {
249
0
  case ASCII_m:
250
0
    break;
251
0
  case ASCII_M:
252
0
    upper = 1;
253
0
    break;
254
5
  default:
255
5
    return 1;
256
5
  }
257
0
  ptr += MINBPC(enc);
258
0
  switch (BYTE_TO_ASCII(enc, ptr)) {
259
0
  case ASCII_l:
260
0
    break;
261
0
  case ASCII_L:
262
0
    upper = 1;
263
0
    break;
264
0
  default:
265
0
    return 1;
266
0
  }
267
0
  if (upper)
268
0
    return 0;
269
0
  *tokPtr = XML_TOK_XML_DECL;
270
0
  return 1;
271
0
}
xmltok.c:normal_checkPiTarget
Line
Count
Source
232
3.48k
                      int *tokPtr) {
233
3.48k
  int upper = 0;
234
3.48k
  UNUSED_P(enc);
235
3.48k
  *tokPtr = XML_TOK_PI;
236
3.48k
  if (end - ptr != MINBPC(enc) * 3)
237
3.47k
    return 1;
238
14
  switch (BYTE_TO_ASCII(enc, ptr)) {
239
2
  case ASCII_x:
240
2
    break;
241
3
  case ASCII_X:
242
3
    upper = 1;
243
3
    break;
244
9
  default:
245
9
    return 1;
246
14
  }
247
5
  ptr += MINBPC(enc);
248
5
  switch (BYTE_TO_ASCII(enc, ptr)) {
249
0
  case ASCII_m:
250
0
    break;
251
0
  case ASCII_M:
252
0
    upper = 1;
253
0
    break;
254
5
  default:
255
5
    return 1;
256
5
  }
257
0
  ptr += MINBPC(enc);
258
0
  switch (BYTE_TO_ASCII(enc, ptr)) {
259
0
  case ASCII_l:
260
0
    break;
261
0
  case ASCII_L:
262
0
    upper = 1;
263
0
    break;
264
0
  default:
265
0
    return 1;
266
0
  }
267
0
  if (upper)
268
0
    return 0;
269
0
  *tokPtr = XML_TOK_XML_DECL;
270
0
  return 1;
271
0
}
xmltok.c:little2_checkPiTarget
Line
Count
Source
232
141
                      int *tokPtr) {
233
141
  int upper = 0;
234
141
  UNUSED_P(enc);
235
141
  *tokPtr = XML_TOK_PI;
236
141
  if (end - ptr != MINBPC(enc) * 3)
237
134
    return 1;
238
7
  switch (BYTE_TO_ASCII(enc, ptr)) {
239
0
  case ASCII_x:
240
0
    break;
241
0
  case ASCII_X:
242
0
    upper = 1;
243
0
    break;
244
7
  default:
245
7
    return 1;
246
7
  }
247
0
  ptr += MINBPC(enc);
248
0
  switch (BYTE_TO_ASCII(enc, ptr)) {
249
0
  case ASCII_m:
250
0
    break;
251
0
  case ASCII_M:
252
0
    upper = 1;
253
0
    break;
254
0
  default:
255
0
    return 1;
256
0
  }
257
0
  ptr += MINBPC(enc);
258
0
  switch (BYTE_TO_ASCII(enc, ptr)) {
259
0
  case ASCII_l:
260
0
    break;
261
0
  case ASCII_L:
262
0
    upper = 1;
263
0
    break;
264
0
  default:
265
0
    return 1;
266
0
  }
267
0
  if (upper)
268
0
    return 0;
269
0
  *tokPtr = XML_TOK_XML_DECL;
270
0
  return 1;
271
0
}
xmltok.c:big2_checkPiTarget
Line
Count
Source
232
171
                      int *tokPtr) {
233
171
  int upper = 0;
234
171
  UNUSED_P(enc);
235
171
  *tokPtr = XML_TOK_PI;
236
171
  if (end - ptr != MINBPC(enc) * 3)
237
126
    return 1;
238
45
  switch (BYTE_TO_ASCII(enc, ptr)) {
239
0
  case ASCII_x:
240
0
    break;
241
0
  case ASCII_X:
242
0
    upper = 1;
243
0
    break;
244
45
  default:
245
45
    return 1;
246
45
  }
247
0
  ptr += MINBPC(enc);
248
0
  switch (BYTE_TO_ASCII(enc, ptr)) {
249
0
  case ASCII_m:
250
0
    break;
251
0
  case ASCII_M:
252
0
    upper = 1;
253
0
    break;
254
0
  default:
255
0
    return 1;
256
0
  }
257
0
  ptr += MINBPC(enc);
258
0
  switch (BYTE_TO_ASCII(enc, ptr)) {
259
0
  case ASCII_l:
260
0
    break;
261
0
  case ASCII_L:
262
0
    upper = 1;
263
0
    break;
264
0
  default:
265
0
    return 1;
266
0
  }
267
0
  if (upper)
268
0
    return 0;
269
0
  *tokPtr = XML_TOK_XML_DECL;
270
0
  return 1;
271
0
}
272
273
/* ptr points to character following "<?" */
274
275
static int PTRCALL
276
PREFIX(scanPi)(const ENCODING *enc, const char *ptr, const char *end,
277
4.32k
               const char **nextTokPtr) {
278
4.32k
  int tok;
279
4.32k
  const char *target = ptr;
280
4.32k
  REQUIRE_CHAR(enc, ptr, end);
281
4.30k
  switch (BYTE_TYPE(enc, ptr)) {
282
4.52k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
283
61
  default:
284
61
    *nextTokPtr = ptr;
285
61
    return XML_TOK_INVALID;
286
4.30k
  }
287
34.5k
  while (HAS_CHAR(enc, ptr, end)) {
288
34.5k
    switch (BYTE_TYPE(enc, ptr)) {
289
110k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
290
3.56k
    case BT_S:
291
3.59k
    case BT_CR:
292
3.74k
    case BT_LF:
293
3.74k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
294
0
        *nextTokPtr = ptr;
295
0
        return XML_TOK_INVALID;
296
0
      }
297
3.74k
      ptr += MINBPC(enc);
298
158k
      while (HAS_CHAR(enc, ptr, end)) {
299
158k
        switch (BYTE_TYPE(enc, ptr)) {
300
8.18k
          INVALID_CASES(ptr, nextTokPtr)
301
16.3k
        case BT_QUEST:
302
16.3k
          ptr += MINBPC(enc);
303
16.3k
          REQUIRE_CHAR(enc, ptr, end);
304
16.3k
          if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
305
3.36k
            *nextTokPtr = ptr + MINBPC(enc);
306
3.36k
            return tok;
307
3.36k
          }
308
12.9k
          break;
309
138k
        default:
310
138k
          ptr += MINBPC(enc);
311
138k
          break;
312
158k
        }
313
158k
      }
314
89
      return XML_TOK_PARTIAL;
315
55
    case BT_QUEST:
316
55
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
317
0
        *nextTokPtr = ptr;
318
0
        return XML_TOK_INVALID;
319
0
      }
320
55
      ptr += MINBPC(enc);
321
55
      REQUIRE_CHAR(enc, ptr, end);
322
50
      if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
323
7
        *nextTokPtr = ptr + MINBPC(enc);
324
7
        return tok;
325
7
      }
326
      /* fall through */
327
167
    default:
328
167
      *nextTokPtr = ptr;
329
167
      return XML_TOK_INVALID;
330
34.5k
    }
331
34.5k
  }
332
52
  return XML_TOK_PARTIAL;
333
4.14k
}
xmltok.c:normal_scanPi
Line
Count
Source
277
3.63k
               const char **nextTokPtr) {
278
3.63k
  int tok;
279
3.63k
  const char *target = ptr;
280
3.63k
  REQUIRE_CHAR(enc, ptr, end);
281
3.62k
  switch (BYTE_TYPE(enc, ptr)) {
282
3.37k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
283
6
  default:
284
6
    *nextTokPtr = ptr;
285
6
    return XML_TOK_INVALID;
286
3.62k
  }
287
32.3k
  while (HAS_CHAR(enc, ptr, end)) {
288
32.3k
    switch (BYTE_TYPE(enc, ptr)) {
289
101k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
290
3.45k
    case BT_S:
291
3.45k
    case BT_CR:
292
3.46k
    case BT_LF:
293
3.46k
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
294
0
        *nextTokPtr = ptr;
295
0
        return XML_TOK_INVALID;
296
0
      }
297
3.46k
      ptr += MINBPC(enc);
298
150k
      while (HAS_CHAR(enc, ptr, end)) {
299
150k
        switch (BYTE_TYPE(enc, ptr)) {
300
6.10k
          INVALID_CASES(ptr, nextTokPtr)
301
16.1k
        case BT_QUEST:
302
16.1k
          ptr += MINBPC(enc);
303
16.1k
          REQUIRE_CHAR(enc, ptr, end);
304
16.1k
          if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
305
3.36k
            *nextTokPtr = ptr + MINBPC(enc);
306
3.36k
            return tok;
307
3.36k
          }
308
12.7k
          break;
309
131k
        default:
310
131k
          ptr += MINBPC(enc);
311
131k
          break;
312
150k
        }
313
150k
      }
314
21
      return XML_TOK_PARTIAL;
315
23
    case BT_QUEST:
316
23
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
317
0
        *nextTokPtr = ptr;
318
0
        return XML_TOK_INVALID;
319
0
      }
320
23
      ptr += MINBPC(enc);
321
23
      REQUIRE_CHAR(enc, ptr, end);
322
19
      if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
323
7
        *nextTokPtr = ptr + MINBPC(enc);
324
7
        return tok;
325
7
      }
326
      /* fall through */
327
44
    default:
328
44
      *nextTokPtr = ptr;
329
44
      return XML_TOK_INVALID;
330
32.3k
    }
331
32.3k
  }
332
27
  return XML_TOK_PARTIAL;
333
3.59k
}
xmltok.c:little2_scanPi
Line
Count
Source
277
310
               const char **nextTokPtr) {
278
310
  int tok;
279
310
  const char *target = ptr;
280
310
  REQUIRE_CHAR(enc, ptr, end);
281
296
  switch (BYTE_TYPE(enc, ptr)) {
282
511
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
283
17
  default:
284
17
    *nextTokPtr = ptr;
285
17
    return XML_TOK_INVALID;
286
296
  }
287
870
  while (HAS_CHAR(enc, ptr, end)) {
288
870
    switch (BYTE_TYPE(enc, ptr)) {
289
3.14k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
290
6
    case BT_S:
291
21
    case BT_CR:
292
139
    case BT_LF:
293
139
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
294
0
        *nextTokPtr = ptr;
295
0
        return XML_TOK_INVALID;
296
0
      }
297
139
      ptr += MINBPC(enc);
298
5.88k
      while (HAS_CHAR(enc, ptr, end)) {
299
5.88k
        switch (BYTE_TYPE(enc, ptr)) {
300
1.40k
          INVALID_CASES(ptr, nextTokPtr)
301
31
        case BT_QUEST:
302
31
          ptr += MINBPC(enc);
303
31
          REQUIRE_CHAR(enc, ptr, end);
304
30
          if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
305
0
            *nextTokPtr = ptr + MINBPC(enc);
306
0
            return tok;
307
0
          }
308
30
          break;
309
5.12k
        default:
310
5.12k
          ptr += MINBPC(enc);
311
5.12k
          break;
312
5.88k
        }
313
5.88k
      }
314
32
      return XML_TOK_PARTIAL;
315
2
    case BT_QUEST:
316
2
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
317
0
        *nextTokPtr = ptr;
318
0
        return XML_TOK_INVALID;
319
0
      }
320
2
      ptr += MINBPC(enc);
321
2
      REQUIRE_CHAR(enc, ptr, end);
322
2
      if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
323
0
        *nextTokPtr = ptr + MINBPC(enc);
324
0
        return tok;
325
0
      }
326
      /* fall through */
327
47
    default:
328
47
      *nextTokPtr = ptr;
329
47
      return XML_TOK_INVALID;
330
870
    }
331
870
  }
332
15
  return XML_TOK_PARTIAL;
333
244
}
xmltok.c:big2_scanPi
Line
Count
Source
277
387
               const char **nextTokPtr) {
278
387
  int tok;
279
387
  const char *target = ptr;
280
387
  REQUIRE_CHAR(enc, ptr, end);
281
385
  switch (BYTE_TYPE(enc, ptr)) {
282
646
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
283
38
  default:
284
38
    *nextTokPtr = ptr;
285
38
    return XML_TOK_INVALID;
286
385
  }
287
1.37k
  while (HAS_CHAR(enc, ptr, end)) {
288
1.37k
    switch (BYTE_TYPE(enc, ptr)) {
289
5.33k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
290
99
    case BT_S:
291
116
    case BT_CR:
292
141
    case BT_LF:
293
141
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
294
0
        *nextTokPtr = ptr;
295
0
        return XML_TOK_INVALID;
296
0
      }
297
141
      ptr += MINBPC(enc);
298
2.31k
      while (HAS_CHAR(enc, ptr, end)) {
299
2.31k
        switch (BYTE_TYPE(enc, ptr)) {
300
682
          INVALID_CASES(ptr, nextTokPtr)
301
120
        case BT_QUEST:
302
120
          ptr += MINBPC(enc);
303
120
          REQUIRE_CHAR(enc, ptr, end);
304
112
          if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
305
0
            *nextTokPtr = ptr + MINBPC(enc);
306
0
            return tok;
307
0
          }
308
112
          break;
309
1.81k
        default:
310
1.81k
          ptr += MINBPC(enc);
311
1.81k
          break;
312
2.31k
        }
313
2.31k
      }
314
36
      return XML_TOK_PARTIAL;
315
30
    case BT_QUEST:
316
30
      if (! PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
317
0
        *nextTokPtr = ptr;
318
0
        return XML_TOK_INVALID;
319
0
      }
320
30
      ptr += MINBPC(enc);
321
30
      REQUIRE_CHAR(enc, ptr, end);
322
29
      if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
323
0
        *nextTokPtr = ptr + MINBPC(enc);
324
0
        return tok;
325
0
      }
326
      /* fall through */
327
76
    default:
328
76
      *nextTokPtr = ptr;
329
76
      return XML_TOK_INVALID;
330
1.37k
    }
331
1.37k
  }
332
10
  return XML_TOK_PARTIAL;
333
305
}
334
335
static int PTRCALL
336
PREFIX(scanCdataSection)(const ENCODING *enc, const char *ptr, const char *end,
337
9
                         const char **nextTokPtr) {
338
9
  static const char CDATA_LSQB[]
339
9
      = {ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, ASCII_LSQB};
340
9
  int i;
341
9
  UNUSED_P(enc);
342
  /* CDATA[ */
343
9
  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
}
xmltok.c:normal_scanCdataSection
Line
Count
Source
337
9
                         const char **nextTokPtr) {
338
9
  static const char CDATA_LSQB[]
339
9
      = {ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, ASCII_LSQB};
340
9
  int i;
341
9
  UNUSED_P(enc);
342
  /* CDATA[ */
343
9
  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: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
100k
                   const char **nextTokPtr) {
433
100k
  REQUIRE_CHAR(enc, ptr, end);
434
100k
  switch (BYTE_TYPE(enc, ptr)) {
435
82.5k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
436
43
  default:
437
43
    *nextTokPtr = ptr;
438
43
    return XML_TOK_INVALID;
439
100k
  }
440
858k
  while (HAS_CHAR(enc, ptr, end)) {
441
858k
    switch (BYTE_TYPE(enc, ptr)) {
442
2.31M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
443
77
    case BT_S:
444
86
    case BT_CR:
445
107
    case BT_LF:
446
11.7k
      for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
447
11.7k
        switch (BYTE_TYPE(enc, ptr)) {
448
11.4k
        case BT_S:
449
11.4k
        case BT_CR:
450
11.6k
        case BT_LF:
451
11.6k
          break;
452
27
        case BT_GT:
453
27
          *nextTokPtr = ptr + MINBPC(enc);
454
27
          return XML_TOK_END_TAG;
455
73
        default:
456
73
          *nextTokPtr = ptr;
457
73
          return XML_TOK_INVALID;
458
11.7k
        }
459
11.7k
      }
460
7
      return XML_TOK_PARTIAL;
461
0
#  ifdef XML_NS
462
99.9k
    case BT_COLON:
463
      /* no need to check qname syntax here,
464
         since end-tag must match exactly */
465
99.9k
      ptr += MINBPC(enc);
466
99.9k
      break;
467
0
#  endif
468
99.9k
    case BT_GT:
469
99.9k
      *nextTokPtr = ptr + MINBPC(enc);
470
99.9k
      return XML_TOK_END_TAG;
471
103
    default:
472
103
      *nextTokPtr = ptr;
473
103
      return XML_TOK_INVALID;
474
858k
    }
475
858k
  }
476
47
  return XML_TOK_PARTIAL;
477
100k
}
xmltok.c:normal_scanEndTag
Line
Count
Source
432
100k
                   const char **nextTokPtr) {
433
100k
  REQUIRE_CHAR(enc, ptr, end);
434
100k
  switch (BYTE_TYPE(enc, ptr)) {
435
82.1k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
436
4
  default:
437
4
    *nextTokPtr = ptr;
438
4
    return XML_TOK_INVALID;
439
100k
  }
440
856k
  while (HAS_CHAR(enc, ptr, end)) {
441
856k
    switch (BYTE_TYPE(enc, ptr)) {
442
2.31M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
443
48
    case BT_S:
444
54
    case BT_CR:
445
72
    case BT_LF:
446
11.6k
      for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
447
11.6k
        switch (BYTE_TYPE(enc, ptr)) {
448
11.4k
        case BT_S:
449
11.4k
        case BT_CR:
450
11.6k
        case BT_LF:
451
11.6k
          break;
452
27
        case BT_GT:
453
27
          *nextTokPtr = ptr + MINBPC(enc);
454
27
          return XML_TOK_END_TAG;
455
39
        default:
456
39
          *nextTokPtr = ptr;
457
39
          return XML_TOK_INVALID;
458
11.6k
        }
459
11.6k
      }
460
6
      return XML_TOK_PARTIAL;
461
0
#  ifdef XML_NS
462
99.9k
    case BT_COLON:
463
      /* no need to check qname syntax here,
464
         since end-tag must match exactly */
465
99.9k
      ptr += MINBPC(enc);
466
99.9k
      break;
467
0
#  endif
468
99.9k
    case BT_GT:
469
99.9k
      *nextTokPtr = ptr + MINBPC(enc);
470
99.9k
      return XML_TOK_END_TAG;
471
37
    default:
472
37
      *nextTokPtr = ptr;
473
37
      return XML_TOK_INVALID;
474
856k
    }
475
856k
  }
476
15
  return XML_TOK_PARTIAL;
477
100k
}
xmltok.c:little2_scanEndTag
Line
Count
Source
432
130
                   const char **nextTokPtr) {
433
130
  REQUIRE_CHAR(enc, ptr, end);
434
127
  switch (BYTE_TYPE(enc, ptr)) {
435
192
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
436
10
  default:
437
10
    *nextTokPtr = ptr;
438
10
    return XML_TOK_INVALID;
439
127
  }
440
912
  while (HAS_CHAR(enc, ptr, end)) {
441
912
    switch (BYTE_TYPE(enc, ptr)) {
442
4.06k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
443
13
    case BT_S:
444
13
    case BT_CR:
445
16
    case BT_LF:
446
16
      for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
447
16
        switch (BYTE_TYPE(enc, ptr)) {
448
0
        case BT_S:
449
0
        case BT_CR:
450
0
        case BT_LF:
451
0
          break;
452
0
        case BT_GT:
453
0
          *nextTokPtr = ptr + MINBPC(enc);
454
0
          return XML_TOK_END_TAG;
455
16
        default:
456
16
          *nextTokPtr = ptr;
457
16
          return XML_TOK_INVALID;
458
16
        }
459
16
      }
460
0
      return XML_TOK_PARTIAL;
461
0
#  ifdef XML_NS
462
0
    case BT_COLON:
463
      /* no need to check qname syntax here,
464
         since end-tag must match exactly */
465
0
      ptr += MINBPC(enc);
466
0
      break;
467
0
#  endif
468
3
    case BT_GT:
469
3
      *nextTokPtr = ptr + MINBPC(enc);
470
3
      return XML_TOK_END_TAG;
471
33
    default:
472
33
      *nextTokPtr = ptr;
473
33
      return XML_TOK_INVALID;
474
912
    }
475
912
  }
476
12
  return XML_TOK_PARTIAL;
477
98
}
xmltok.c:big2_scanEndTag
Line
Count
Source
432
197
                   const char **nextTokPtr) {
433
197
  REQUIRE_CHAR(enc, ptr, end);
434
194
  switch (BYTE_TYPE(enc, ptr)) {
435
260
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
436
29
  default:
437
29
    *nextTokPtr = ptr;
438
29
    return XML_TOK_INVALID;
439
194
  }
440
659
  while (HAS_CHAR(enc, ptr, end)) {
441
659
    switch (BYTE_TYPE(enc, ptr)) {
442
2.73k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
443
16
    case BT_S:
444
19
    case BT_CR:
445
19
    case BT_LF:
446
19
      for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
447
18
        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
18
        default:
456
18
          *nextTokPtr = ptr;
457
18
          return XML_TOK_INVALID;
458
18
        }
459
18
      }
460
1
      return XML_TOK_PARTIAL;
461
0
#  ifdef XML_NS
462
0
    case BT_COLON:
463
      /* no need to check qname syntax here,
464
         since end-tag must match exactly */
465
0
      ptr += MINBPC(enc);
466
0
      break;
467
0
#  endif
468
10
    case BT_GT:
469
10
      *nextTokPtr = ptr + MINBPC(enc);
470
10
      return XML_TOK_END_TAG;
471
33
    default:
472
33
      *nextTokPtr = ptr;
473
33
      return XML_TOK_INVALID;
474
659
    }
475
659
  }
476
20
  return XML_TOK_PARTIAL;
477
129
}
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
4
                       const char **nextTokPtr) {
484
4
  if (HAS_CHAR(enc, ptr, end)) {
485
4
    switch (BYTE_TYPE(enc, ptr)) {
486
0
    case BT_DIGIT:
487
0
    case BT_HEX:
488
0
      break;
489
4
    default:
490
4
      *nextTokPtr = ptr;
491
4
      return XML_TOK_INVALID;
492
4
    }
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
4
}
xmltok.c:normal_scanHexCharRef
Line
Count
Source
483
4
                       const char **nextTokPtr) {
484
4
  if (HAS_CHAR(enc, ptr, end)) {
485
4
    switch (BYTE_TYPE(enc, ptr)) {
486
0
    case BT_DIGIT:
487
0
    case BT_HEX:
488
0
      break;
489
4
    default:
490
4
      *nextTokPtr = ptr;
491
4
      return XML_TOK_INVALID;
492
4
    }
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
4
}
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
43
                    const char **nextTokPtr) {
515
43
  if (HAS_CHAR(enc, ptr, end)) {
516
43
    if (CHAR_MATCHES(enc, ptr, ASCII_x))
517
4
      return PREFIX(scanHexCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
518
39
    switch (BYTE_TYPE(enc, ptr)) {
519
34
    case BT_DIGIT:
520
34
      break;
521
5
    default:
522
5
      *nextTokPtr = ptr;
523
5
      return XML_TOK_INVALID;
524
39
    }
525
91
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
526
91
      switch (BYTE_TYPE(enc, ptr)) {
527
57
      case BT_DIGIT:
528
57
        break;
529
28
      case BT_SEMI:
530
28
        *nextTokPtr = ptr + MINBPC(enc);
531
28
        return XML_TOK_CHAR_REF;
532
6
      default:
533
6
        *nextTokPtr = ptr;
534
6
        return XML_TOK_INVALID;
535
91
      }
536
91
    }
537
34
  }
538
0
  return XML_TOK_PARTIAL;
539
43
}
xmltok.c:normal_scanCharRef
Line
Count
Source
514
43
                    const char **nextTokPtr) {
515
43
  if (HAS_CHAR(enc, ptr, end)) {
516
43
    if (CHAR_MATCHES(enc, ptr, ASCII_x))
517
4
      return PREFIX(scanHexCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
518
39
    switch (BYTE_TYPE(enc, ptr)) {
519
34
    case BT_DIGIT:
520
34
      break;
521
5
    default:
522
5
      *nextTokPtr = ptr;
523
5
      return XML_TOK_INVALID;
524
39
    }
525
91
    for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
526
91
      switch (BYTE_TYPE(enc, ptr)) {
527
57
      case BT_DIGIT:
528
57
        break;
529
28
      case BT_SEMI:
530
28
        *nextTokPtr = ptr + MINBPC(enc);
531
28
        return XML_TOK_CHAR_REF;
532
6
      default:
533
6
        *nextTokPtr = ptr;
534
6
        return XML_TOK_INVALID;
535
91
      }
536
91
    }
537
34
  }
538
0
  return XML_TOK_PARTIAL;
539
43
}
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
626
                const char **nextTokPtr) {
546
626
  REQUIRE_CHAR(enc, ptr, end);
547
603
  switch (BYTE_TYPE(enc, ptr)) {
548
629
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
549
43
  case BT_NUM:
550
43
    return PREFIX(scanCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
551
64
  default:
552
64
    *nextTokPtr = ptr;
553
64
    return XML_TOK_INVALID;
554
603
  }
555
3.62k
  while (HAS_CHAR(enc, ptr, end)) {
556
3.62k
    switch (BYTE_TYPE(enc, ptr)) {
557
12.0k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
558
55
    case BT_SEMI:
559
55
      *nextTokPtr = ptr + MINBPC(enc);
560
55
      return XML_TOK_ENTITY_REF;
561
140
    default:
562
140
      *nextTokPtr = ptr;
563
140
      return XML_TOK_INVALID;
564
3.62k
    }
565
3.62k
  }
566
57
  return XML_TOK_PARTIAL;
567
409
}
xmltok.c:normal_scanRef
Line
Count
Source
545
201
                const char **nextTokPtr) {
546
201
  REQUIRE_CHAR(enc, ptr, end);
547
197
  switch (BYTE_TYPE(enc, ptr)) {
548
94
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
549
43
  case BT_NUM:
550
43
    return PREFIX(scanCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
551
6
  default:
552
6
    *nextTokPtr = ptr;
553
6
    return XML_TOK_INVALID;
554
197
  }
555
2.51k
  while (HAS_CHAR(enc, ptr, end)) {
556
2.51k
    switch (BYTE_TYPE(enc, ptr)) {
557
7.84k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
558
39
    case BT_SEMI:
559
39
      *nextTokPtr = ptr + MINBPC(enc);
560
39
      return XML_TOK_ENTITY_REF;
561
32
    default:
562
32
      *nextTokPtr = ptr;
563
32
      return XML_TOK_INVALID;
564
2.51k
    }
565
2.51k
  }
566
22
  return XML_TOK_PARTIAL;
567
122
}
xmltok.c:little2_scanRef
Line
Count
Source
545
240
                const char **nextTokPtr) {
546
240
  REQUIRE_CHAR(enc, ptr, end);
547
230
  switch (BYTE_TYPE(enc, ptr)) {
548
349
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
549
0
  case BT_NUM:
550
0
    return PREFIX(scanCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
551
42
  default:
552
42
    *nextTokPtr = ptr;
553
42
    return XML_TOK_INVALID;
554
230
  }
555
449
  while (HAS_CHAR(enc, ptr, end)) {
556
449
    switch (BYTE_TYPE(enc, ptr)) {
557
1.49k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
558
16
    case BT_SEMI:
559
16
      *nextTokPtr = ptr + MINBPC(enc);
560
16
      return XML_TOK_ENTITY_REF;
561
65
    default:
562
65
      *nextTokPtr = ptr;
563
65
      return XML_TOK_INVALID;
564
449
    }
565
449
  }
566
18
  return XML_TOK_PARTIAL;
567
154
}
xmltok.c:big2_scanRef
Line
Count
Source
545
185
                const char **nextTokPtr) {
546
185
  REQUIRE_CHAR(enc, ptr, end);
547
176
  switch (BYTE_TYPE(enc, ptr)) {
548
186
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
549
0
  case BT_NUM:
550
0
    return PREFIX(scanCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
551
16
  default:
552
16
    *nextTokPtr = ptr;
553
16
    return XML_TOK_INVALID;
554
176
  }
555
661
  while (HAS_CHAR(enc, ptr, end)) {
556
661
    switch (BYTE_TYPE(enc, ptr)) {
557
2.65k
      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
43
    default:
562
43
      *nextTokPtr = ptr;
563
43
      return XML_TOK_INVALID;
564
661
    }
565
661
  }
566
17
  return XML_TOK_PARTIAL;
567
133
}
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
22.0k
                 const char **nextTokPtr) {
574
22.0k
#  ifdef XML_NS
575
22.0k
  int hadColon = 0;
576
22.0k
#  endif
577
4.27M
  while (HAS_CHAR(enc, ptr, end)) {
578
4.27M
    switch (BYTE_TYPE(enc, ptr)) {
579
13.9M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
580
0
#  ifdef XML_NS
581
253k
    case BT_COLON:
582
253k
      if (hadColon) {
583
18
        *nextTokPtr = ptr;
584
18
        return XML_TOK_INVALID;
585
18
      }
586
253k
      hadColon = 1;
587
253k
      ptr += MINBPC(enc);
588
253k
      REQUIRE_CHAR(enc, ptr, end);
589
253k
      switch (BYTE_TYPE(enc, ptr)) {
590
187k
        CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
591
68
      default:
592
68
        *nextTokPtr = ptr;
593
68
        return XML_TOK_INVALID;
594
253k
      }
595
253k
      break;
596
253k
#  endif
597
253k
    case BT_S:
598
160
    case BT_CR:
599
235
    case BT_LF:
600
47.9k
      for (;;) {
601
47.9k
        int t;
602
603
47.9k
        ptr += MINBPC(enc);
604
47.9k
        REQUIRE_CHAR(enc, ptr, end);
605
47.8k
        t = BYTE_TYPE(enc, ptr);
606
47.8k
        if (t == BT_EQUALS)
607
38
          break;
608
47.8k
        switch (t) {
609
45.0k
        case BT_S:
610
46.9k
        case BT_LF:
611
47.6k
        case BT_CR:
612
47.6k
          break;
613
171
        default:
614
171
          *nextTokPtr = ptr;
615
171
          return XML_TOK_INVALID;
616
47.8k
        }
617
47.8k
      }
618
      /* fall through */
619
255k
    case BT_EQUALS: {
620
255k
      int open;
621
255k
#  ifdef XML_NS
622
255k
      hadColon = 0;
623
255k
#  endif
624
256k
      for (;;) {
625
256k
        ptr += MINBPC(enc);
626
256k
        REQUIRE_CHAR(enc, ptr, end);
627
256k
        open = BYTE_TYPE(enc, ptr);
628
256k
        if (open == BT_QUOT || open == BT_APOS)
629
255k
          break;
630
1.38k
        switch (open) {
631
291
        case BT_S:
632
1.12k
        case BT_LF:
633
1.30k
        case BT_CR:
634
1.30k
          break;
635
73
        default:
636
73
          *nextTokPtr = ptr;
637
73
          return XML_TOK_INVALID;
638
1.38k
        }
639
1.38k
      }
640
255k
      ptr += MINBPC(enc);
641
      /* in attribute value */
642
3.44M
      for (;;) {
643
3.44M
        int t;
644
3.44M
        REQUIRE_CHAR(enc, ptr, end);
645
3.44M
        t = BYTE_TYPE(enc, ptr);
646
3.44M
        if (t == open)
647
254k
          break;
648
3.18M
        switch (t) {
649
7.87k
          INVALID_CASES(ptr, nextTokPtr)
650
139
        case BT_AMP: {
651
139
          int tok = PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, &ptr);
652
139
          if (tok <= 0) {
653
72
            if (tok == XML_TOK_INVALID)
654
59
              *nextTokPtr = ptr;
655
72
            return tok;
656
72
          }
657
67
          break;
658
139
        }
659
67
        case BT_LT:
660
20
          *nextTokPtr = ptr;
661
20
          return XML_TOK_INVALID;
662
3.18M
        default:
663
3.18M
          ptr += MINBPC(enc);
664
3.18M
          break;
665
3.18M
        }
666
3.18M
      }
667
254k
      ptr += MINBPC(enc);
668
254k
      REQUIRE_CHAR(enc, ptr, end);
669
254k
      switch (BYTE_TYPE(enc, ptr)) {
670
2.18k
      case BT_S:
671
3.37k
      case BT_CR:
672
234k
      case BT_LF:
673
234k
        break;
674
8.61k
      case BT_SOL:
675
8.61k
        goto sol;
676
11.9k
      case BT_GT:
677
11.9k
        goto gt;
678
9
      default:
679
9
        *nextTokPtr = ptr;
680
9
        return XML_TOK_INVALID;
681
254k
      }
682
      /* ptr points to closing quote */
683
1.05M
      for (;;) {
684
1.05M
        ptr += MINBPC(enc);
685
1.05M
        REQUIRE_CHAR(enc, ptr, end);
686
1.05M
        switch (BYTE_TYPE(enc, ptr)) {
687
63.4k
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
688
761k
        case BT_S:
689
814k
        case BT_CR:
690
816k
        case BT_LF:
691
816k
          continue;
692
92
        case BT_GT:
693
12.0k
        gt:
694
12.0k
          *nextTokPtr = ptr + MINBPC(enc);
695
12.0k
          return XML_TOK_START_TAG_WITH_ATTS;
696
9
        case BT_SOL:
697
8.62k
        sol:
698
8.62k
          ptr += MINBPC(enc);
699
8.62k
          REQUIRE_CHAR(enc, ptr, end);
700
8.62k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
701
16
            *nextTokPtr = ptr;
702
16
            return XML_TOK_INVALID;
703
16
          }
704
8.60k
          *nextTokPtr = ptr + MINBPC(enc);
705
8.60k
          return XML_TOK_EMPTY_ELEMENT_WITH_ATTS;
706
20
        default:
707
20
          *nextTokPtr = ptr;
708
20
          return XML_TOK_INVALID;
709
1.05M
        }
710
234k
        break;
711
1.05M
      }
712
234k
      break;
713
234k
    }
714
234k
    default:
715
206
      *nextTokPtr = ptr;
716
206
      return XML_TOK_INVALID;
717
4.27M
    }
718
4.27M
  }
719
51
  return XML_TOK_PARTIAL;
720
22.0k
}
xmltok.c:normal_scanAtts
Line
Count
Source
573
21.4k
                 const char **nextTokPtr) {
574
21.4k
#  ifdef XML_NS
575
21.4k
  int hadColon = 0;
576
21.4k
#  endif
577
4.27M
  while (HAS_CHAR(enc, ptr, end)) {
578
4.27M
    switch (BYTE_TYPE(enc, ptr)) {
579
13.9M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
580
0
#  ifdef XML_NS
581
253k
    case BT_COLON:
582
253k
      if (hadColon) {
583
13
        *nextTokPtr = ptr;
584
13
        return XML_TOK_INVALID;
585
13
      }
586
253k
      hadColon = 1;
587
253k
      ptr += MINBPC(enc);
588
253k
      REQUIRE_CHAR(enc, ptr, end);
589
253k
      switch (BYTE_TYPE(enc, ptr)) {
590
187k
        CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
591
11
      default:
592
11
        *nextTokPtr = ptr;
593
11
        return XML_TOK_INVALID;
594
253k
      }
595
253k
      break;
596
253k
#  endif
597
253k
    case BT_S:
598
92
    case BT_CR:
599
99
    case BT_LF:
600
47.7k
      for (;;) {
601
47.7k
        int t;
602
603
47.7k
        ptr += MINBPC(enc);
604
47.7k
        REQUIRE_CHAR(enc, ptr, end);
605
47.7k
        t = BYTE_TYPE(enc, ptr);
606
47.7k
        if (t == BT_EQUALS)
607
23
          break;
608
47.6k
        switch (t) {
609
45.0k
        case BT_S:
610
46.9k
        case BT_LF:
611
47.6k
        case BT_CR:
612
47.6k
          break;
613
64
        default:
614
64
          *nextTokPtr = ptr;
615
64
          return XML_TOK_INVALID;
616
47.6k
        }
617
47.6k
      }
618
      /* fall through */
619
255k
    case BT_EQUALS: {
620
255k
      int open;
621
255k
#  ifdef XML_NS
622
255k
      hadColon = 0;
623
255k
#  endif
624
256k
      for (;;) {
625
256k
        ptr += MINBPC(enc);
626
256k
        REQUIRE_CHAR(enc, ptr, end);
627
256k
        open = BYTE_TYPE(enc, ptr);
628
256k
        if (open == BT_QUOT || open == BT_APOS)
629
255k
          break;
630
1.33k
        switch (open) {
631
291
        case BT_S:
632
1.12k
        case BT_LF:
633
1.30k
        case BT_CR:
634
1.30k
          break;
635
28
        default:
636
28
          *nextTokPtr = ptr;
637
28
          return XML_TOK_INVALID;
638
1.33k
        }
639
1.33k
      }
640
255k
      ptr += MINBPC(enc);
641
      /* in attribute value */
642
3.44M
      for (;;) {
643
3.44M
        int t;
644
3.44M
        REQUIRE_CHAR(enc, ptr, end);
645
3.44M
        t = BYTE_TYPE(enc, ptr);
646
3.44M
        if (t == open)
647
254k
          break;
648
3.18M
        switch (t) {
649
7.87k
          INVALID_CASES(ptr, nextTokPtr)
650
139
        case BT_AMP: {
651
139
          int tok = PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, &ptr);
652
139
          if (tok <= 0) {
653
72
            if (tok == XML_TOK_INVALID)
654
59
              *nextTokPtr = ptr;
655
72
            return tok;
656
72
          }
657
67
          break;
658
139
        }
659
67
        case BT_LT:
660
20
          *nextTokPtr = ptr;
661
20
          return XML_TOK_INVALID;
662
3.18M
        default:
663
3.18M
          ptr += MINBPC(enc);
664
3.18M
          break;
665
3.18M
        }
666
3.18M
      }
667
254k
      ptr += MINBPC(enc);
668
254k
      REQUIRE_CHAR(enc, ptr, end);
669
254k
      switch (BYTE_TYPE(enc, ptr)) {
670
2.18k
      case BT_S:
671
3.37k
      case BT_CR:
672
234k
      case BT_LF:
673
234k
        break;
674
8.61k
      case BT_SOL:
675
8.61k
        goto sol;
676
11.9k
      case BT_GT:
677
11.9k
        goto gt;
678
9
      default:
679
9
        *nextTokPtr = ptr;
680
9
        return XML_TOK_INVALID;
681
254k
      }
682
      /* ptr points to closing quote */
683
1.05M
      for (;;) {
684
1.05M
        ptr += MINBPC(enc);
685
1.05M
        REQUIRE_CHAR(enc, ptr, end);
686
1.05M
        switch (BYTE_TYPE(enc, ptr)) {
687
63.4k
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
688
761k
        case BT_S:
689
814k
        case BT_CR:
690
816k
        case BT_LF:
691
816k
          continue;
692
92
        case BT_GT:
693
12.0k
        gt:
694
12.0k
          *nextTokPtr = ptr + MINBPC(enc);
695
12.0k
          return XML_TOK_START_TAG_WITH_ATTS;
696
9
        case BT_SOL:
697
8.62k
        sol:
698
8.62k
          ptr += MINBPC(enc);
699
8.62k
          REQUIRE_CHAR(enc, ptr, end);
700
8.62k
          if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
701
16
            *nextTokPtr = ptr;
702
16
            return XML_TOK_INVALID;
703
16
          }
704
8.60k
          *nextTokPtr = ptr + MINBPC(enc);
705
8.60k
          return XML_TOK_EMPTY_ELEMENT_WITH_ATTS;
706
20
        default:
707
20
          *nextTokPtr = ptr;
708
20
          return XML_TOK_INVALID;
709
1.05M
        }
710
234k
        break;
711
1.05M
      }
712
234k
      break;
713
234k
    }
714
234k
    default:
715
102
      *nextTokPtr = ptr;
716
102
      return XML_TOK_INVALID;
717
4.27M
    }
718
4.27M
  }
719
19
  return XML_TOK_PARTIAL;
720
21.4k
}
xmltok.c:little2_scanAtts
Line
Count
Source
573
244
                 const char **nextTokPtr) {
574
244
#  ifdef XML_NS
575
244
  int hadColon = 0;
576
244
#  endif
577
1.20k
  while (HAS_CHAR(enc, ptr, end)) {
578
1.20k
    switch (BYTE_TYPE(enc, ptr)) {
579
4.68k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
580
0
#  ifdef XML_NS
581
71
    case BT_COLON:
582
71
      if (hadColon) {
583
5
        *nextTokPtr = ptr;
584
5
        return XML_TOK_INVALID;
585
5
      }
586
66
      hadColon = 1;
587
66
      ptr += MINBPC(enc);
588
66
      REQUIRE_CHAR(enc, ptr, end);
589
56
      switch (BYTE_TYPE(enc, ptr)) {
590
49
        CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
591
20
      default:
592
20
        *nextTokPtr = ptr;
593
20
        return XML_TOK_INVALID;
594
56
      }
595
19
      break;
596
19
#  endif
597
28
    case BT_S:
598
48
    case BT_CR:
599
52
    case BT_LF:
600
68
      for (;;) {
601
68
        int t;
602
603
68
        ptr += MINBPC(enc);
604
68
        REQUIRE_CHAR(enc, ptr, end);
605
58
        t = BYTE_TYPE(enc, ptr);
606
58
        if (t == BT_EQUALS)
607
0
          break;
608
58
        switch (t) {
609
5
        case BT_S:
610
15
        case BT_LF:
611
16
        case BT_CR:
612
16
          break;
613
42
        default:
614
42
          *nextTokPtr = ptr;
615
42
          return XML_TOK_INVALID;
616
58
        }
617
58
      }
618
      /* fall through */
619
15
    case BT_EQUALS: {
620
15
      int open;
621
15
#  ifdef XML_NS
622
15
      hadColon = 0;
623
15
#  endif
624
15
      for (;;) {
625
15
        ptr += MINBPC(enc);
626
15
        REQUIRE_CHAR(enc, ptr, end);
627
14
        open = BYTE_TYPE(enc, ptr);
628
14
        if (open == BT_QUOT || open == BT_APOS)
629
0
          break;
630
14
        switch (open) {
631
0
        case BT_S:
632
0
        case BT_LF:
633
0
        case BT_CR:
634
0
          break;
635
14
        default:
636
14
          *nextTokPtr = ptr;
637
14
          return XML_TOK_INVALID;
638
14
        }
639
14
      }
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
52
    default:
715
52
      *nextTokPtr = ptr;
716
52
      return XML_TOK_INVALID;
717
1.20k
    }
718
1.20k
  }
719
19
  return XML_TOK_PARTIAL;
720
244
}
xmltok.c:big2_scanAtts
Line
Count
Source
573
332
                 const char **nextTokPtr) {
574
332
#  ifdef XML_NS
575
332
  int hadColon = 0;
576
332
#  endif
577
1.10k
  while (HAS_CHAR(enc, ptr, end)) {
578
1.10k
    switch (BYTE_TYPE(enc, ptr)) {
579
3.39k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
580
0
#  ifdef XML_NS
581
87
    case BT_COLON:
582
87
      if (hadColon) {
583
0
        *nextTokPtr = ptr;
584
0
        return XML_TOK_INVALID;
585
0
      }
586
87
      hadColon = 1;
587
87
      ptr += MINBPC(enc);
588
87
      REQUIRE_CHAR(enc, ptr, end);
589
77
      switch (BYTE_TYPE(enc, ptr)) {
590
59
        CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
591
37
      default:
592
37
        *nextTokPtr = ptr;
593
37
        return XML_TOK_INVALID;
594
77
      }
595
23
      break;
596
23
#  endif
597
23
    case BT_S:
598
20
    case BT_CR:
599
84
    case BT_LF:
600
105
      for (;;) {
601
105
        int t;
602
603
105
        ptr += MINBPC(enc);
604
105
        REQUIRE_CHAR(enc, ptr, end);
605
101
        t = BYTE_TYPE(enc, ptr);
606
101
        if (t == BT_EQUALS)
607
15
          break;
608
86
        switch (t) {
609
0
        case BT_S:
610
21
        case BT_LF:
611
21
        case BT_CR:
612
21
          break;
613
65
        default:
614
65
          *nextTokPtr = ptr;
615
65
          return XML_TOK_INVALID;
616
86
        }
617
86
      }
618
      /* fall through */
619
39
    case BT_EQUALS: {
620
39
      int open;
621
39
#  ifdef XML_NS
622
39
      hadColon = 0;
623
39
#  endif
624
39
      for (;;) {
625
39
        ptr += MINBPC(enc);
626
39
        REQUIRE_CHAR(enc, ptr, end);
627
31
        open = BYTE_TYPE(enc, ptr);
628
31
        if (open == BT_QUOT || open == BT_APOS)
629
0
          break;
630
31
        switch (open) {
631
0
        case BT_S:
632
0
        case BT_LF:
633
0
        case BT_CR:
634
0
          break;
635
31
        default:
636
31
          *nextTokPtr = ptr;
637
31
          return XML_TOK_INVALID;
638
31
        }
639
31
      }
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
52
    default:
715
52
      *nextTokPtr = ptr;
716
52
      return XML_TOK_INVALID;
717
1.10k
    }
718
1.10k
  }
719
13
  return XML_TOK_PARTIAL;
720
332
}
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
219k
               const char **nextTokPtr) {
727
219k
#  ifdef XML_NS
728
219k
  int hadColon;
729
219k
#  endif
730
219k
  REQUIRE_CHAR(enc, ptr, end);
731
219k
  switch (BYTE_TYPE(enc, ptr)) {
732
102k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
733
102
  case BT_EXCL:
734
102
    ptr += MINBPC(enc);
735
102
    REQUIRE_CHAR(enc, ptr, end);
736
95
    switch (BYTE_TYPE(enc, ptr)) {
737
73
    case BT_MINUS:
738
73
      return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
739
9
    case BT_LSQB:
740
9
      return PREFIX(scanCdataSection)(enc, ptr + MINBPC(enc), end, nextTokPtr);
741
95
    }
742
13
    *nextTokPtr = ptr;
743
13
    return XML_TOK_INVALID;
744
101
  case BT_QUEST:
745
101
    return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
746
100k
  case BT_SOL:
747
100k
    return PREFIX(scanEndTag)(enc, ptr + MINBPC(enc), end, nextTokPtr);
748
61
  default:
749
61
    *nextTokPtr = ptr;
750
61
    return XML_TOK_INVALID;
751
219k
  }
752
118k
#  ifdef XML_NS
753
118k
  hadColon = 0;
754
118k
#  endif
755
  /* we have a start-tag */
756
953k
  while (HAS_CHAR(enc, ptr, end)) {
757
953k
    switch (BYTE_TYPE(enc, ptr)) {
758
2.50M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
759
0
#  ifdef XML_NS
760
113k
    case BT_COLON:
761
113k
      if (hadColon) {
762
13
        *nextTokPtr = ptr;
763
13
        return XML_TOK_INVALID;
764
13
      }
765
113k
      hadColon = 1;
766
113k
      ptr += MINBPC(enc);
767
113k
      REQUIRE_CHAR(enc, ptr, end);
768
113k
      switch (BYTE_TYPE(enc, ptr)) {
769
95.5k
        CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
770
81
      default:
771
81
        *nextTokPtr = ptr;
772
81
        return XML_TOK_INVALID;
773
113k
      }
774
113k
      break;
775
113k
#  endif
776
113k
    case BT_S:
777
13.8k
    case BT_CR:
778
22.6k
    case BT_LF: {
779
22.6k
      ptr += MINBPC(enc);
780
90.0k
      while (HAS_CHAR(enc, ptr, end)) {
781
90.0k
        switch (BYTE_TYPE(enc, ptr)) {
782
22.3k
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
783
285
        case BT_GT:
784
285
          goto gt;
785
53
        case BT_SOL:
786
53
          goto sol;
787
66.7k
        case BT_S:
788
67.0k
        case BT_CR:
789
67.4k
        case BT_LF:
790
67.4k
          ptr += MINBPC(enc);
791
67.4k
          continue;
792
77
        default:
793
77
          *nextTokPtr = ptr;
794
77
          return XML_TOK_INVALID;
795
90.0k
        }
796
22.0k
        return PREFIX(scanAtts)(enc, ptr, end, nextTokPtr);
797
90.0k
      }
798
51
      return XML_TOK_PARTIAL;
799
22.6k
    }
800
95.1k
    case BT_GT:
801
95.3k
    gt:
802
95.3k
      *nextTokPtr = ptr + MINBPC(enc);
803
95.3k
      return XML_TOK_START_TAG_NO_ATTS;
804
126
    case BT_SOL:
805
179
    sol:
806
179
      ptr += MINBPC(enc);
807
179
      REQUIRE_CHAR(enc, ptr, end);
808
162
      if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
809
39
        *nextTokPtr = ptr;
810
39
        return XML_TOK_INVALID;
811
39
      }
812
123
      *nextTokPtr = ptr + MINBPC(enc);
813
123
      return XML_TOK_EMPTY_ELEMENT_NO_ATTS;
814
187
    default:
815
187
      *nextTokPtr = ptr;
816
187
      return XML_TOK_INVALID;
817
953k
    }
818
953k
  }
819
110
  return XML_TOK_PARTIAL;
820
118k
}
xmltok.c:normal_scanLt
Line
Count
Source
726
216k
               const char **nextTokPtr) {
727
216k
#  ifdef XML_NS
728
216k
  int hadColon;
729
216k
#  endif
730
216k
  REQUIRE_CHAR(enc, ptr, end);
731
216k
  switch (BYTE_TYPE(enc, ptr)) {
732
97.4k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
733
90
  case BT_EXCL:
734
90
    ptr += MINBPC(enc);
735
90
    REQUIRE_CHAR(enc, ptr, end);
736
83
    switch (BYTE_TYPE(enc, ptr)) {
737
72
    case BT_MINUS:
738
72
      return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
739
9
    case BT_LSQB:
740
9
      return PREFIX(scanCdataSection)(enc, ptr + MINBPC(enc), end, nextTokPtr);
741
83
    }
742
2
    *nextTokPtr = ptr;
743
2
    return XML_TOK_INVALID;
744
100
  case BT_QUEST:
745
100
    return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
746
100k
  case BT_SOL:
747
100k
    return PREFIX(scanEndTag)(enc, ptr + MINBPC(enc), end, nextTokPtr);
748
24
  default:
749
24
    *nextTokPtr = ptr;
750
24
    return XML_TOK_INVALID;
751
216k
  }
752
115k
#  ifdef XML_NS
753
115k
  hadColon = 0;
754
115k
#  endif
755
  /* we have a start-tag */
756
937k
  while (HAS_CHAR(enc, ptr, end)) {
757
937k
    switch (BYTE_TYPE(enc, ptr)) {
758
2.44M
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
759
0
#  ifdef XML_NS
760
113k
    case BT_COLON:
761
113k
      if (hadColon) {
762
6
        *nextTokPtr = ptr;
763
6
        return XML_TOK_INVALID;
764
6
      }
765
113k
      hadColon = 1;
766
113k
      ptr += MINBPC(enc);
767
113k
      REQUIRE_CHAR(enc, ptr, end);
768
113k
      switch (BYTE_TYPE(enc, ptr)) {
769
95.3k
        CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
770
9
      default:
771
9
        *nextTokPtr = ptr;
772
9
        return XML_TOK_INVALID;
773
113k
      }
774
113k
      break;
775
113k
#  endif
776
113k
    case BT_S:
777
12.8k
    case BT_CR:
778
21.5k
    case BT_LF: {
779
21.5k
      ptr += MINBPC(enc);
780
88.9k
      while (HAS_CHAR(enc, ptr, end)) {
781
88.9k
        switch (BYTE_TYPE(enc, ptr)) {
782
21.3k
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
783
28
        case BT_GT:
784
28
          goto gt;
785
40
        case BT_SOL:
786
40
          goto sol;
787
66.6k
        case BT_S:
788
67.0k
        case BT_CR:
789
67.3k
        case BT_LF:
790
67.3k
          ptr += MINBPC(enc);
791
67.3k
          continue;
792
14
        default:
793
14
          *nextTokPtr = ptr;
794
14
          return XML_TOK_INVALID;
795
88.9k
        }
796
21.4k
        return PREFIX(scanAtts)(enc, ptr, end, nextTokPtr);
797
88.9k
      }
798
29
      return XML_TOK_PARTIAL;
799
21.5k
    }
800
93.9k
    case BT_GT:
801
93.9k
    gt:
802
93.9k
      *nextTokPtr = ptr + MINBPC(enc);
803
93.9k
      return XML_TOK_START_TAG_NO_ATTS;
804
18
    case BT_SOL:
805
58
    sol:
806
58
      ptr += MINBPC(enc);
807
58
      REQUIRE_CHAR(enc, ptr, end);
808
50
      if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
809
3
        *nextTokPtr = ptr;
810
3
        return XML_TOK_INVALID;
811
3
      }
812
47
      *nextTokPtr = ptr + MINBPC(enc);
813
47
      return XML_TOK_EMPTY_ELEMENT_NO_ATTS;
814
58
    default:
815
58
      *nextTokPtr = ptr;
816
58
      return XML_TOK_INVALID;
817
937k
    }
818
937k
  }
819
52
  return XML_TOK_PARTIAL;
820
115k
}
xmltok.c:little2_scanLt
Line
Count
Source
726
1.52k
               const char **nextTokPtr) {
727
1.52k
#  ifdef XML_NS
728
1.52k
  int hadColon;
729
1.52k
#  endif
730
1.52k
  REQUIRE_CHAR(enc, ptr, end);
731
1.50k
  switch (BYTE_TYPE(enc, ptr)) {
732
2.68k
    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
130
  case BT_SOL:
747
130
    return PREFIX(scanEndTag)(enc, ptr + MINBPC(enc), end, nextTokPtr);
748
11
  default:
749
11
    *nextTokPtr = ptr;
750
11
    return XML_TOK_INVALID;
751
1.50k
  }
752
1.32k
#  ifdef XML_NS
753
1.32k
  hadColon = 0;
754
1.32k
#  endif
755
  /* we have a start-tag */
756
9.67k
  while (HAS_CHAR(enc, ptr, end)) {
757
9.67k
    switch (BYTE_TYPE(enc, ptr)) {
758
39.4k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
759
0
#  ifdef XML_NS
760
104
    case BT_COLON:
761
104
      if (hadColon) {
762
1
        *nextTokPtr = ptr;
763
1
        return XML_TOK_INVALID;
764
1
      }
765
103
      hadColon = 1;
766
103
      ptr += MINBPC(enc);
767
103
      REQUIRE_CHAR(enc, ptr, end);
768
94
      switch (BYTE_TYPE(enc, ptr)) {
769
79
        CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
770
42
      default:
771
42
        *nextTokPtr = ptr;
772
42
        return XML_TOK_INVALID;
773
94
      }
774
18
      break;
775
18
#  endif
776
202
    case BT_S:
777
348
    case BT_CR:
778
375
    case BT_LF: {
779
375
      ptr += MINBPC(enc);
780
393
      while (HAS_CHAR(enc, ptr, end)) {
781
393
        switch (BYTE_TYPE(enc, ptr)) {
782
539
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
783
24
        case BT_GT:
784
24
          goto gt;
785
7
        case BT_SOL:
786
7
          goto sol;
787
7
        case BT_S:
788
19
        case BT_CR:
789
36
        case BT_LF:
790
36
          ptr += MINBPC(enc);
791
36
          continue;
792
24
        default:
793
24
          *nextTokPtr = ptr;
794
24
          return XML_TOK_INVALID;
795
393
        }
796
244
        return PREFIX(scanAtts)(enc, ptr, end, nextTokPtr);
797
393
      }
798
18
      return XML_TOK_PARTIAL;
799
375
    }
800
635
    case BT_GT:
801
659
    gt:
802
659
      *nextTokPtr = ptr + MINBPC(enc);
803
659
      return XML_TOK_START_TAG_NO_ATTS;
804
58
    case BT_SOL:
805
65
    sol:
806
65
      ptr += MINBPC(enc);
807
65
      REQUIRE_CHAR(enc, ptr, end);
808
59
      if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
809
21
        *nextTokPtr = ptr;
810
21
        return XML_TOK_INVALID;
811
21
      }
812
38
      *nextTokPtr = ptr + MINBPC(enc);
813
38
      return XML_TOK_EMPTY_ELEMENT_NO_ATTS;
814
67
    default:
815
67
      *nextTokPtr = ptr;
816
67
      return XML_TOK_INVALID;
817
9.67k
    }
818
9.67k
  }
819
34
  return XML_TOK_PARTIAL;
820
1.32k
}
xmltok.c:big2_scanLt
Line
Count
Source
726
1.81k
               const char **nextTokPtr) {
727
1.81k
#  ifdef XML_NS
728
1.81k
  int hadColon;
729
1.81k
#  endif
730
1.81k
  REQUIRE_CHAR(enc, ptr, end);
731
1.80k
  switch (BYTE_TYPE(enc, ptr)) {
732
1.98k
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
733
12
  case BT_EXCL:
734
12
    ptr += MINBPC(enc);
735
12
    REQUIRE_CHAR(enc, ptr, end);
736
12
    switch (BYTE_TYPE(enc, ptr)) {
737
1
    case BT_MINUS:
738
1
      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
12
    }
742
11
    *nextTokPtr = ptr;
743
11
    return XML_TOK_INVALID;
744
1
  case BT_QUEST:
745
1
    return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
746
197
  case BT_SOL:
747
197
    return PREFIX(scanEndTag)(enc, ptr + MINBPC(enc), end, nextTokPtr);
748
26
  default:
749
26
    *nextTokPtr = ptr;
750
26
    return XML_TOK_INVALID;
751
1.80k
  }
752
1.51k
#  ifdef XML_NS
753
1.51k
  hadColon = 0;
754
1.51k
#  endif
755
  /* we have a start-tag */
756
6.30k
  while (HAS_CHAR(enc, ptr, end)) {
757
6.30k
    switch (BYTE_TYPE(enc, ptr)) {
758
23.2k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
759
0
#  ifdef XML_NS
760
119
    case BT_COLON:
761
119
      if (hadColon) {
762
6
        *nextTokPtr = ptr;
763
6
        return XML_TOK_INVALID;
764
6
      }
765
113
      hadColon = 1;
766
113
      ptr += MINBPC(enc);
767
113
      REQUIRE_CHAR(enc, ptr, end);
768
104
      switch (BYTE_TYPE(enc, ptr)) {
769
117
        CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
770
30
      default:
771
30
        *nextTokPtr = ptr;
772
30
        return XML_TOK_INVALID;
773
104
      }
774
47
      break;
775
47
#  endif
776
621
    case BT_S:
777
637
    case BT_CR:
778
682
    case BT_LF: {
779
682
      ptr += MINBPC(enc);
780
722
      while (HAS_CHAR(enc, ptr, end)) {
781
722
        switch (BYTE_TYPE(enc, ptr)) {
782
471
          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
783
233
        case BT_GT:
784
233
          goto gt;
785
6
        case BT_SOL:
786
6
          goto sol;
787
12
        case BT_S:
788
20
        case BT_CR:
789
44
        case BT_LF:
790
44
          ptr += MINBPC(enc);
791
44
          continue;
792
39
        default:
793
39
          *nextTokPtr = ptr;
794
39
          return XML_TOK_INVALID;
795
722
        }
796
332
        return PREFIX(scanAtts)(enc, ptr, end, nextTokPtr);
797
722
      }
798
4
      return XML_TOK_PARTIAL;
799
682
    }
800
544
    case BT_GT:
801
777
    gt:
802
777
      *nextTokPtr = ptr + MINBPC(enc);
803
777
      return XML_TOK_START_TAG_NO_ATTS;
804
50
    case BT_SOL:
805
56
    sol:
806
56
      ptr += MINBPC(enc);
807
56
      REQUIRE_CHAR(enc, ptr, end);
808
53
      if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
809
15
        *nextTokPtr = ptr;
810
15
        return XML_TOK_INVALID;
811
15
      }
812
38
      *nextTokPtr = ptr + MINBPC(enc);
813
38
      return XML_TOK_EMPTY_ELEMENT_NO_ATTS;
814
62
    default:
815
62
      *nextTokPtr = ptr;
816
62
      return XML_TOK_INVALID;
817
6.30k
    }
818
6.30k
  }
819
24
  return XML_TOK_PARTIAL;
820
1.51k
}
821
822
static int PTRCALL
823
PREFIX(contentTok)(const ENCODING *enc, const char *ptr, const char *end,
824
596k
                   const char **nextTokPtr) {
825
596k
  if (ptr >= end)
826
76
    return XML_TOK_NONE;
827
596k
  if (MINBPC(enc) > 1) {
828
5.82k
    size_t n = end - ptr;
829
5.82k
    if (n & (MINBPC(enc) - 1)) {
830
4.01k
      n &= ~(MINBPC(enc) - 1);
831
4.01k
      if (n == 0)
832
144
        return XML_TOK_PARTIAL;
833
3.87k
      end = ptr + n;
834
3.87k
    }
835
5.82k
  }
836
596k
  switch (BYTE_TYPE(enc, ptr)) {
837
219k
  case BT_LT:
838
219k
    return PREFIX(scanLt)(enc, ptr + MINBPC(enc), end, nextTokPtr);
839
487
  case BT_AMP:
840
487
    return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
841
1.84k
  case BT_CR:
842
1.84k
    ptr += MINBPC(enc);
843
1.84k
    if (! HAS_CHAR(enc, ptr, end))
844
20
      return XML_TOK_TRAILING_CR;
845
1.82k
    if (BYTE_TYPE(enc, ptr) == BT_LF)
846
19
      ptr += MINBPC(enc);
847
1.82k
    *nextTokPtr = ptr;
848
1.82k
    return XML_TOK_DATA_NEWLINE;
849
160k
  case BT_LF:
850
160k
    *nextTokPtr = ptr + MINBPC(enc);
851
160k
    return XML_TOK_DATA_NEWLINE;
852
102
  case BT_RSQB:
853
102
    ptr += MINBPC(enc);
854
102
    if (! HAS_CHAR(enc, ptr, end))
855
21
      return XML_TOK_TRAILING_RSQB;
856
81
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
857
62
      break;
858
19
    ptr += MINBPC(enc);
859
19
    if (! HAS_CHAR(enc, ptr, end))
860
13
      return XML_TOK_TRAILING_RSQB;
861
6
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
862
6
      ptr -= MINBPC(enc);
863
6
      break;
864
6
    }
865
0
    *nextTokPtr = ptr;
866
0
    return XML_TOK_INVALID;
867
854
    INVALID_CASES(ptr, nextTokPtr)
868
213k
  default:
869
213k
    ptr += MINBPC(enc);
870
213k
    break;
871
596k
  }
872
1.21M
  while (HAS_CHAR(enc, ptr, end)) {
873
1.21M
    switch (BYTE_TYPE(enc, ptr)) {
874
0
#  define LEAD_CASE(n)                                                         \
875
2.53k
  case BT_LEAD##n:                                                             \
876
2.53k
    if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) {                       \
877
160
      *nextTokPtr = ptr;                                                       \
878
160
      return XML_TOK_DATA_CHARS;                                               \
879
160
    }                                                                          \
880
2.37k
    ptr += n;                                                                  \
881
2.37k
    break;
882
1.62k
      LEAD_CASE(2)
883
101
      LEAD_CASE(3)
884
808
      LEAD_CASE(4)
885
0
#  undef LEAD_CASE
886
800
    case BT_RSQB:
887
800
      if (HAS_CHARS(enc, ptr, end, 2)) {
888
779
        if (! CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_RSQB)) {
889
529
          ptr += MINBPC(enc);
890
529
          break;
891
529
        }
892
250
        if (HAS_CHARS(enc, ptr, end, 3)) {
893
237
          if (! CHAR_MATCHES(enc, ptr + 2 * MINBPC(enc), ASCII_GT)) {
894
233
            ptr += MINBPC(enc);
895
233
            break;
896
233
          }
897
4
          *nextTokPtr = ptr + 2 * MINBPC(enc);
898
4
          return XML_TOK_INVALID;
899
237
        }
900
250
      }
901
      /* fall through */
902
517
    case BT_AMP:
903
210k
    case BT_LT:
904
211k
    case BT_NONXML:
905
211k
    case BT_MALFORM:
906
211k
    case BT_TRAIL:
907
211k
    case BT_CR:
908
213k
    case BT_LF:
909
213k
      *nextTokPtr = ptr;
910
213k
      return XML_TOK_DATA_CHARS;
911
995k
    default:
912
995k
      ptr += MINBPC(enc);
913
995k
      break;
914
1.21M
    }
915
1.21M
  }
916
205
  *nextTokPtr = ptr;
917
205
  return XML_TOK_DATA_CHARS;
918
213k
}
xmltok.c:normal_contentTok
Line
Count
Source
824
590k
                   const char **nextTokPtr) {
825
590k
  if (ptr >= end)
826
26
    return XML_TOK_NONE;
827
590k
  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
590k
  switch (BYTE_TYPE(enc, ptr)) {
837
216k
  case BT_LT:
838
216k
    return PREFIX(scanLt)(enc, ptr + MINBPC(enc), end, nextTokPtr);
839
62
  case BT_AMP:
840
62
    return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
841
1.79k
  case BT_CR:
842
1.79k
    ptr += MINBPC(enc);
843
1.79k
    if (! HAS_CHAR(enc, ptr, end))
844
13
      return XML_TOK_TRAILING_CR;
845
1.78k
    if (BYTE_TYPE(enc, ptr) == BT_LF)
846
19
      ptr += MINBPC(enc);
847
1.78k
    *nextTokPtr = ptr;
848
1.78k
    return XML_TOK_DATA_NEWLINE;
849
160k
  case BT_LF:
850
160k
    *nextTokPtr = ptr + MINBPC(enc);
851
160k
    return XML_TOK_DATA_NEWLINE;
852
78
  case BT_RSQB:
853
78
    ptr += MINBPC(enc);
854
78
    if (! HAS_CHAR(enc, ptr, end))
855
11
      return XML_TOK_TRAILING_RSQB;
856
67
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
857
56
      break;
858
11
    ptr += MINBPC(enc);
859
11
    if (! HAS_CHAR(enc, ptr, end))
860
5
      return XML_TOK_TRAILING_RSQB;
861
6
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
862
6
      ptr -= MINBPC(enc);
863
6
      break;
864
6
    }
865
0
    *nextTokPtr = ptr;
866
0
    return XML_TOK_INVALID;
867
354
    INVALID_CASES(ptr, nextTokPtr)
868
211k
  default:
869
211k
    ptr += MINBPC(enc);
870
211k
    break;
871
590k
  }
872
1.19M
  while (HAS_CHAR(enc, ptr, end)) {
873
1.19M
    switch (BYTE_TYPE(enc, ptr)) {
874
0
#  define LEAD_CASE(n)                                                         \
875
0
  case BT_LEAD##n:                                                             \
876
0
    if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) {                       \
877
0
      *nextTokPtr = ptr;                                                       \
878
0
      return XML_TOK_DATA_CHARS;                                               \
879
0
    }                                                                          \
880
0
    ptr += n;                                                                  \
881
0
    break;
882
1.62k
      LEAD_CASE(2)
883
101
      LEAD_CASE(3)
884
48
      LEAD_CASE(4)
885
0
#  undef LEAD_CASE
886
698
    case BT_RSQB:
887
698
      if (HAS_CHARS(enc, ptr, end, 2)) {
888
687
        if (! CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_RSQB)) {
889
465
          ptr += MINBPC(enc);
890
465
          break;
891
465
        }
892
222
        if (HAS_CHARS(enc, ptr, end, 3)) {
893
217
          if (! CHAR_MATCHES(enc, ptr + 2 * MINBPC(enc), ASCII_GT)) {
894
213
            ptr += MINBPC(enc);
895
213
            break;
896
213
          }
897
4
          *nextTokPtr = ptr + 2 * MINBPC(enc);
898
4
          return XML_TOK_INVALID;
899
217
        }
900
222
      }
901
      /* fall through */
902
74
    case BT_AMP:
903
209k
    case BT_LT:
904
209k
    case BT_NONXML:
905
209k
    case BT_MALFORM:
906
209k
    case BT_TRAIL:
907
210k
    case BT_CR:
908
211k
    case BT_LF:
909
211k
      *nextTokPtr = ptr;
910
211k
      return XML_TOK_DATA_CHARS;
911
981k
    default:
912
981k
      ptr += MINBPC(enc);
913
981k
      break;
914
1.19M
    }
915
1.19M
  }
916
26
  *nextTokPtr = ptr;
917
26
  return XML_TOK_DATA_CHARS;
918
211k
}
xmltok.c:little2_contentTok
Line
Count
Source
824
2.70k
                   const char **nextTokPtr) {
825
2.70k
  if (ptr >= end)
826
17
    return XML_TOK_NONE;
827
2.69k
  if (MINBPC(enc) > 1) {
828
2.69k
    size_t n = end - ptr;
829
2.69k
    if (n & (MINBPC(enc) - 1)) {
830
1.70k
      n &= ~(MINBPC(enc) - 1);
831
1.70k
      if (n == 0)
832
81
        return XML_TOK_PARTIAL;
833
1.62k
      end = ptr + n;
834
1.62k
    }
835
2.69k
  }
836
2.60k
  switch (BYTE_TYPE(enc, ptr)) {
837
1.52k
  case BT_LT:
838
1.52k
    return PREFIX(scanLt)(enc, ptr + MINBPC(enc), end, nextTokPtr);
839
240
  case BT_AMP:
840
240
    return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
841
27
  case BT_CR:
842
27
    ptr += MINBPC(enc);
843
27
    if (! HAS_CHAR(enc, ptr, end))
844
4
      return XML_TOK_TRAILING_CR;
845
23
    if (BYTE_TYPE(enc, ptr) == BT_LF)
846
0
      ptr += MINBPC(enc);
847
23
    *nextTokPtr = ptr;
848
23
    return XML_TOK_DATA_NEWLINE;
849
24
  case BT_LF:
850
24
    *nextTokPtr = ptr + MINBPC(enc);
851
24
    return XML_TOK_DATA_NEWLINE;
852
10
  case BT_RSQB:
853
10
    ptr += MINBPC(enc);
854
10
    if (! HAS_CHAR(enc, ptr, end))
855
4
      return XML_TOK_TRAILING_RSQB;
856
6
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
857
6
      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
169
    INVALID_CASES(ptr, nextTokPtr)
868
660
  default:
869
660
    ptr += MINBPC(enc);
870
660
    break;
871
2.60k
  }
872
8.09k
  while (HAS_CHAR(enc, ptr, end)) {
873
8.09k
    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
339
      LEAD_CASE(4)
885
0
#  undef LEAD_CASE
886
19
    case BT_RSQB:
887
19
      if (HAS_CHARS(enc, ptr, end, 2)) {
888
15
        if (! CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_RSQB)) {
889
15
          ptr += MINBPC(enc);
890
15
          break;
891
15
        }
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
244
    case BT_AMP:
903
448
    case BT_LT:
904
495
    case BT_NONXML:
905
495
    case BT_MALFORM:
906
525
    case BT_TRAIL:
907
550
    case BT_CR:
908
568
    case BT_LF:
909
568
      *nextTokPtr = ptr;
910
568
      return XML_TOK_DATA_CHARS;
911
7.17k
    default:
912
7.17k
      ptr += MINBPC(enc);
913
7.17k
      break;
914
8.09k
    }
915
8.09k
  }
916
94
  *nextTokPtr = ptr;
917
94
  return XML_TOK_DATA_CHARS;
918
687
}
xmltok.c:big2_contentTok
Line
Count
Source
824
3.16k
                   const char **nextTokPtr) {
825
3.16k
  if (ptr >= end)
826
33
    return XML_TOK_NONE;
827
3.13k
  if (MINBPC(enc) > 1) {
828
3.13k
    size_t n = end - ptr;
829
3.13k
    if (n & (MINBPC(enc) - 1)) {
830
2.31k
      n &= ~(MINBPC(enc) - 1);
831
2.31k
      if (n == 0)
832
63
        return XML_TOK_PARTIAL;
833
2.25k
      end = ptr + n;
834
2.25k
    }
835
3.13k
  }
836
3.07k
  switch (BYTE_TYPE(enc, ptr)) {
837
1.81k
  case BT_LT:
838
1.81k
    return PREFIX(scanLt)(enc, ptr + MINBPC(enc), end, nextTokPtr);
839
185
  case BT_AMP:
840
185
    return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
841
23
  case BT_CR:
842
23
    ptr += MINBPC(enc);
843
23
    if (! HAS_CHAR(enc, ptr, end))
844
3
      return XML_TOK_TRAILING_CR;
845
20
    if (BYTE_TYPE(enc, ptr) == BT_LF)
846
0
      ptr += MINBPC(enc);
847
20
    *nextTokPtr = ptr;
848
20
    return XML_TOK_DATA_NEWLINE;
849
32
  case BT_LF:
850
32
    *nextTokPtr = ptr + MINBPC(enc);
851
32
    return XML_TOK_DATA_NEWLINE;
852
14
  case BT_RSQB:
853
14
    ptr += MINBPC(enc);
854
14
    if (! HAS_CHAR(enc, ptr, end))
855
6
      return XML_TOK_TRAILING_RSQB;
856
8
    if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB))
857
0
      break;
858
8
    ptr += MINBPC(enc);
859
8
    if (! HAS_CHAR(enc, ptr, end))
860
8
      return XML_TOK_TRAILING_RSQB;
861
0
    if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) {
862
0
      ptr -= MINBPC(enc);
863
0
      break;
864
0
    }
865
0
    *nextTokPtr = ptr;
866
0
    return XML_TOK_INVALID;
867
331
    INVALID_CASES(ptr, nextTokPtr)
868
781
  default:
869
781
    ptr += MINBPC(enc);
870
781
    break;
871
3.07k
  }
872
8.72k
  while (HAS_CHAR(enc, ptr, end)) {
873
8.72k
    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
421
      LEAD_CASE(4)
885
0
#  undef LEAD_CASE
886
83
    case BT_RSQB:
887
83
      if (HAS_CHARS(enc, ptr, end, 2)) {
888
77
        if (! CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_RSQB)) {
889
49
          ptr += MINBPC(enc);
890
49
          break;
891
49
        }
892
28
        if (HAS_CHARS(enc, ptr, end, 3)) {
893
20
          if (! CHAR_MATCHES(enc, ptr + 2 * MINBPC(enc), ASCII_GT)) {
894
20
            ptr += MINBPC(enc);
895
20
            break;
896
20
          }
897
0
          *nextTokPtr = ptr + 2 * MINBPC(enc);
898
0
          return XML_TOK_INVALID;
899
20
        }
900
28
      }
901
      /* fall through */
902
199
    case BT_AMP:
903
487
    case BT_LT:
904
599
    case BT_NONXML:
905
599
    case BT_MALFORM:
906
637
    case BT_TRAIL:
907
660
    case BT_CR:
908
692
    case BT_LF:
909
692
      *nextTokPtr = ptr;
910
692
      return XML_TOK_DATA_CHARS;
911
7.54k
    default:
912
7.54k
      ptr += MINBPC(enc);
913
7.54k
      break;
914
8.72k
    }
915
8.72k
  }
916
85
  *nextTokPtr = ptr;
917
85
  return XML_TOK_DATA_CHARS;
918
810
}
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
544
                    const char **nextTokPtr) {
925
544
  REQUIRE_CHAR(enc, ptr, end);
926
529
  switch (BYTE_TYPE(enc, ptr)) {
927
555
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
928
22
  case BT_S:
929
29
  case BT_LF:
930
42
  case BT_CR:
931
75
  case BT_PERCNT:
932
75
    *nextTokPtr = ptr;
933
75
    return XML_TOK_PERCENT;
934
63
  default:
935
63
    *nextTokPtr = ptr;
936
63
    return XML_TOK_INVALID;
937
529
  }
938
6.64k
  while (HAS_CHAR(enc, ptr, end)) {
939
6.64k
    switch (BYTE_TYPE(enc, ptr)) {
940
23.8k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
941
11
    case BT_SEMI:
942
11
      *nextTokPtr = ptr + MINBPC(enc);
943
11
      return XML_TOK_PARAM_ENTITY_REF;
944
107
    default:
945
107
      *nextTokPtr = ptr;
946
107
      return XML_TOK_INVALID;
947
6.64k
    }
948
6.64k
  }
949
45
  return XML_TOK_PARTIAL;
950
311
}
xmltok.c:normal_scanPercent
Line
Count
Source
924
173
                    const char **nextTokPtr) {
925
173
  REQUIRE_CHAR(enc, ptr, end);
926
169
  switch (BYTE_TYPE(enc, ptr)) {
927
119
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
928
6
  case BT_S:
929
13
  case BT_LF:
930
22
  case BT_CR:
931
44
  case BT_PERCNT:
932
44
    *nextTokPtr = ptr;
933
44
    return XML_TOK_PERCENT;
934
0
  default:
935
0
    *nextTokPtr = ptr;
936
0
    return XML_TOK_INVALID;
937
169
  }
938
5.65k
  while (HAS_CHAR(enc, ptr, end)) {
939
5.65k
    switch (BYTE_TYPE(enc, ptr)) {
940
19.9k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
941
4
    case BT_SEMI:
942
4
      *nextTokPtr = ptr + MINBPC(enc);
943
4
      return XML_TOK_PARAM_ENTITY_REF;
944
25
    default:
945
25
      *nextTokPtr = ptr;
946
25
      return XML_TOK_INVALID;
947
5.65k
    }
948
5.65k
  }
949
19
  return XML_TOK_PARTIAL;
950
94
}
xmltok.c:little2_scanPercent
Line
Count
Source
924
190
                    const char **nextTokPtr) {
925
190
  REQUIRE_CHAR(enc, ptr, end);
926
185
  switch (BYTE_TYPE(enc, ptr)) {
927
241
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
928
10
  case BT_S:
929
10
  case BT_LF:
930
13
  case BT_CR:
931
18
  case BT_PERCNT:
932
18
    *nextTokPtr = ptr;
933
18
    return XML_TOK_PERCENT;
934
28
  default:
935
28
    *nextTokPtr = ptr;
936
28
    return XML_TOK_INVALID;
937
185
  }
938
468
  while (HAS_CHAR(enc, ptr, end)) {
939
468
    switch (BYTE_TYPE(enc, ptr)) {
940
1.77k
      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
55
    default:
945
55
      *nextTokPtr = ptr;
946
55
      return XML_TOK_INVALID;
947
468
    }
948
468
  }
949
19
  return XML_TOK_PARTIAL;
950
116
}
xmltok.c:big2_scanPercent
Line
Count
Source
924
181
                    const char **nextTokPtr) {
925
181
  REQUIRE_CHAR(enc, ptr, end);
926
175
  switch (BYTE_TYPE(enc, ptr)) {
927
195
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
928
6
  case BT_S:
929
6
  case BT_LF:
930
7
  case BT_CR:
931
13
  case BT_PERCNT:
932
13
    *nextTokPtr = ptr;
933
13
    return XML_TOK_PERCENT;
934
35
  default:
935
35
    *nextTokPtr = ptr;
936
35
    return XML_TOK_INVALID;
937
175
  }
938
521
  while (HAS_CHAR(enc, ptr, end)) {
939
521
    switch (BYTE_TYPE(enc, ptr)) {
940
2.08k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
941
7
    case BT_SEMI:
942
7
      *nextTokPtr = ptr + MINBPC(enc);
943
7
      return XML_TOK_PARAM_ENTITY_REF;
944
27
    default:
945
27
      *nextTokPtr = ptr;
946
27
      return XML_TOK_INVALID;
947
521
    }
948
521
  }
949
7
  return XML_TOK_PARTIAL;
950
101
}
951
952
static int PTRCALL
953
PREFIX(scanPoundName)(const ENCODING *enc, const char *ptr, const char *end,
954
453
                      const char **nextTokPtr) {
955
453
  REQUIRE_CHAR(enc, ptr, end);
956
439
  switch (BYTE_TYPE(enc, ptr)) {
957
605
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
958
38
  default:
959
38
    *nextTokPtr = ptr;
960
38
    return XML_TOK_INVALID;
961
439
  }
962
4.58k
  while (HAS_CHAR(enc, ptr, end)) {
963
4.58k
    switch (BYTE_TYPE(enc, ptr)) {
964
14.5k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
965
12
    case BT_CR:
966
27
    case BT_LF:
967
53
    case BT_S:
968
65
    case BT_RPAR:
969
79
    case BT_GT:
970
90
    case BT_PERCNT:
971
95
    case BT_VERBAR:
972
95
      *nextTokPtr = ptr;
973
95
      return XML_TOK_POUND_NAME;
974
96
    default:
975
96
      *nextTokPtr = ptr;
976
96
      return XML_TOK_INVALID;
977
4.58k
    }
978
4.58k
  }
979
35
  return -XML_TOK_POUND_NAME;
980
319
}
xmltok.c:normal_scanPoundName
Line
Count
Source
954
104
                      const char **nextTokPtr) {
955
104
  REQUIRE_CHAR(enc, ptr, end);
956
101
  switch (BYTE_TYPE(enc, ptr)) {
957
95
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
958
4
  default:
959
4
    *nextTokPtr = ptr;
960
4
    return XML_TOK_INVALID;
961
101
  }
962
3.47k
  while (HAS_CHAR(enc, ptr, end)) {
963
3.47k
    switch (BYTE_TYPE(enc, ptr)) {
964
10.4k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
965
3
    case BT_CR:
966
3
    case BT_LF:
967
11
    case BT_S:
968
13
    case BT_RPAR:
969
13
    case BT_GT:
970
13
    case BT_PERCNT:
971
16
    case BT_VERBAR:
972
16
      *nextTokPtr = ptr;
973
16
      return XML_TOK_POUND_NAME;
974
30
    default:
975
30
      *nextTokPtr = ptr;
976
30
      return XML_TOK_INVALID;
977
3.47k
    }
978
3.47k
  }
979
7
  return -XML_TOK_POUND_NAME;
980
71
}
xmltok.c:little2_scanPoundName
Line
Count
Source
954
188
                      const char **nextTokPtr) {
955
188
  REQUIRE_CHAR(enc, ptr, end);
956
183
  switch (BYTE_TYPE(enc, ptr)) {
957
252
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
958
27
  default:
959
27
    *nextTokPtr = ptr;
960
27
    return XML_TOK_INVALID;
961
183
  }
962
630
  while (HAS_CHAR(enc, ptr, end)) {
963
630
    switch (BYTE_TYPE(enc, ptr)) {
964
2.32k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
965
3
    case BT_CR:
966
11
    case BT_LF:
967
20
    case BT_S:
968
30
    case BT_RPAR:
969
34
    case BT_GT:
970
40
    case BT_PERCNT:
971
42
    case BT_VERBAR:
972
42
      *nextTokPtr = ptr;
973
42
      return XML_TOK_POUND_NAME;
974
29
    default:
975
29
      *nextTokPtr = ptr;
976
29
      return XML_TOK_INVALID;
977
630
    }
978
630
  }
979
22
  return -XML_TOK_POUND_NAME;
980
131
}
xmltok.c:big2_scanPoundName
Line
Count
Source
954
161
                      const char **nextTokPtr) {
955
161
  REQUIRE_CHAR(enc, ptr, end);
956
155
  switch (BYTE_TYPE(enc, ptr)) {
957
258
    CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
958
7
  default:
959
7
    *nextTokPtr = ptr;
960
7
    return XML_TOK_INVALID;
961
155
  }
962
476
  while (HAS_CHAR(enc, ptr, end)) {
963
476
    switch (BYTE_TYPE(enc, ptr)) {
964
1.79k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
965
6
    case BT_CR:
966
13
    case BT_LF:
967
22
    case BT_S:
968
22
    case BT_RPAR:
969
32
    case BT_GT:
970
37
    case BT_PERCNT:
971
37
    case BT_VERBAR:
972
37
      *nextTokPtr = ptr;
973
37
      return XML_TOK_POUND_NAME;
974
37
    default:
975
37
      *nextTokPtr = ptr;
976
37
      return XML_TOK_INVALID;
977
476
    }
978
476
  }
979
6
  return -XML_TOK_POUND_NAME;
980
117
}
981
982
static int PTRCALL
983
PREFIX(scanLit)(int open, const ENCODING *enc, const char *ptr, const char *end,
984
426
                const char **nextTokPtr) {
985
57.4k
  while (HAS_CHAR(enc, ptr, end)) {
986
57.4k
    int t = BYTE_TYPE(enc, ptr);
987
57.4k
    switch (t) {
988
1.55k
      INVALID_CASES(ptr, nextTokPtr)
989
322
    case BT_QUOT:
990
375
    case BT_APOS:
991
375
      ptr += MINBPC(enc);
992
375
      if (t != open)
993
259
        break;
994
116
      if (! HAS_CHAR(enc, ptr, end))
995
17
        return -XML_TOK_LITERAL;
996
99
      *nextTokPtr = ptr;
997
99
      switch (BYTE_TYPE(enc, ptr)) {
998
16
      case BT_S:
999
16
      case BT_CR:
1000
35
      case BT_LF:
1001
35
      case BT_GT:
1002
37
      case BT_PERCNT:
1003
37
      case BT_LSQB:
1004
37
        return XML_TOK_LITERAL;
1005
62
      default:
1006
62
        return XML_TOK_INVALID;
1007
99
      }
1008
56.1k
    default:
1009
56.1k
      ptr += MINBPC(enc);
1010
56.1k
      break;
1011
57.4k
    }
1012
57.4k
  }
1013
75
  return XML_TOK_PARTIAL;
1014
426
}
xmltok.c:normal_scanLit
Line
Count
Source
984
151
                const char **nextTokPtr) {
985
51.2k
  while (HAS_CHAR(enc, ptr, end)) {
986
51.2k
    int t = BYTE_TYPE(enc, ptr);
987
51.2k
    switch (t) {
988
691
      INVALID_CASES(ptr, nextTokPtr)
989
269
    case BT_QUOT:
990
296
    case BT_APOS:
991
296
      ptr += MINBPC(enc);
992
296
      if (t != open)
993
246
        break;
994
50
      if (! HAS_CHAR(enc, ptr, end))
995
6
        return -XML_TOK_LITERAL;
996
44
      *nextTokPtr = ptr;
997
44
      switch (BYTE_TYPE(enc, ptr)) {
998
16
      case BT_S:
999
16
      case BT_CR:
1000
35
      case BT_LF:
1001
35
      case BT_GT:
1002
37
      case BT_PERCNT:
1003
37
      case BT_LSQB:
1004
37
        return XML_TOK_LITERAL;
1005
7
      default:
1006
7
        return XML_TOK_INVALID;
1007
44
      }
1008
50.6k
    default:
1009
50.6k
      ptr += MINBPC(enc);
1010
50.6k
      break;
1011
51.2k
    }
1012
51.2k
  }
1013
23
  return XML_TOK_PARTIAL;
1014
151
}
xmltok.c:little2_scanLit
Line
Count
Source
984
131
                const char **nextTokPtr) {
985
4.58k
  while (HAS_CHAR(enc, ptr, end)) {
986
4.58k
    int t = BYTE_TYPE(enc, ptr);
987
4.58k
    switch (t) {
988
570
      INVALID_CASES(ptr, nextTokPtr)
989
24
    case BT_QUOT:
990
37
    case BT_APOS:
991
37
      ptr += MINBPC(enc);
992
37
      if (t != open)
993
10
        break;
994
27
      if (! HAS_CHAR(enc, ptr, end))
995
1
        return -XML_TOK_LITERAL;
996
26
      *nextTokPtr = ptr;
997
26
      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
26
      default:
1006
26
        return XML_TOK_INVALID;
1007
26
      }
1008
4.21k
    default:
1009
4.21k
      ptr += MINBPC(enc);
1010
4.21k
      break;
1011
4.58k
    }
1012
4.58k
  }
1013
28
  return XML_TOK_PARTIAL;
1014
131
}
xmltok.c:big2_scanLit
Line
Count
Source
984
144
                const char **nextTokPtr) {
985
1.56k
  while (HAS_CHAR(enc, ptr, end)) {
986
1.56k
    int t = BYTE_TYPE(enc, ptr);
987
1.56k
    switch (t) {
988
292
      INVALID_CASES(ptr, nextTokPtr)
989
29
    case BT_QUOT:
990
42
    case BT_APOS:
991
42
      ptr += MINBPC(enc);
992
42
      if (t != open)
993
3
        break;
994
39
      if (! HAS_CHAR(enc, ptr, end))
995
10
        return -XML_TOK_LITERAL;
996
29
      *nextTokPtr = ptr;
997
29
      switch (BYTE_TYPE(enc, ptr)) {
998
0
      case BT_S:
999
0
      case BT_CR:
1000
0
      case BT_LF:
1001
0
      case BT_GT:
1002
0
      case BT_PERCNT:
1003
0
      case BT_LSQB:
1004
0
        return XML_TOK_LITERAL;
1005
29
      default:
1006
29
        return XML_TOK_INVALID;
1007
29
      }
1008
1.34k
    default:
1009
1.34k
      ptr += MINBPC(enc);
1010
1.34k
      break;
1011
1.56k
    }
1012
1.56k
  }
1013
24
  return XML_TOK_PARTIAL;
1014
144
}
1015
1016
static int PTRCALL
1017
PREFIX(prologTok)(const ENCODING *enc, const char *ptr, const char *end,
1018
20.9k
                  const char **nextTokPtr) {
1019
20.9k
  int tok;
1020
20.9k
  if (ptr >= end)
1021
1.24k
    return XML_TOK_NONE;
1022
19.7k
  if (MINBPC(enc) > 1) {
1023
6.70k
    size_t n = end - ptr;
1024
6.70k
    if (n & (MINBPC(enc) - 1)) {
1025
4.50k
      n &= ~(MINBPC(enc) - 1);
1026
4.50k
      if (n == 0)
1027
35
        return XML_TOK_PARTIAL;
1028
4.47k
      end = ptr + n;
1029
4.47k
    }
1030
6.70k
  }
1031
19.7k
  switch (BYTE_TYPE(enc, ptr)) {
1032
284
  case BT_QUOT:
1033
284
    return PREFIX(scanLit)(BT_QUOT, enc, ptr + MINBPC(enc), end, nextTokPtr);
1034
142
  case BT_APOS:
1035
142
    return PREFIX(scanLit)(BT_APOS, enc, ptr + MINBPC(enc), end, nextTokPtr);
1036
11.5k
  case BT_LT: {
1037
11.5k
    ptr += MINBPC(enc);
1038
11.5k
    REQUIRE_CHAR(enc, ptr, end);
1039
11.4k
    switch (BYTE_TYPE(enc, ptr)) {
1040
647
    case BT_EXCL:
1041
647
      return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1042
4.22k
    case BT_QUEST:
1043
4.22k
      return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1044
3.63k
    case BT_NMSTRT:
1045
4.19k
    case BT_HEX:
1046
6.38k
    case BT_NONASCII:
1047
6.40k
    case BT_LEAD2:
1048
6.41k
    case BT_LEAD3:
1049
6.48k
    case BT_LEAD4:
1050
6.48k
      *nextTokPtr = ptr - MINBPC(enc);
1051
6.48k
      return XML_TOK_INSTANCE_START;
1052
11.4k
    }
1053
109
    *nextTokPtr = ptr;
1054
109
    return XML_TOK_INVALID;
1055
11.4k
  }
1056
118
  case BT_CR:
1057
118
    if (ptr + MINBPC(enc) == end) {
1058
9
      *nextTokPtr = end;
1059
      /* indicate that this might be part of a CR/LF pair */
1060
9
      return -XML_TOK_PROLOG_S;
1061
9
    }
1062
    /* fall through */
1063
1.23k
  case BT_S:
1064
4.67k
  case BT_LF:
1065
4.76M
    for (;;) {
1066
4.76M
      ptr += MINBPC(enc);
1067
4.76M
      if (! HAS_CHAR(enc, ptr, end))
1068
1.06k
        break;
1069
4.76M
      switch (BYTE_TYPE(enc, ptr)) {
1070
4.70M
      case BT_S:
1071
4.75M
      case BT_LF:
1072
4.75M
        break;
1073
763
      case BT_CR:
1074
        /* don't split CR/LF pair */
1075
763
        if (ptr + MINBPC(enc) != end)
1076
754
          break;
1077
        /* fall through */
1078
3.60k
      default:
1079
3.60k
        *nextTokPtr = ptr;
1080
3.60k
        return XML_TOK_PROLOG_S;
1081
4.76M
      }
1082
4.76M
    }
1083
1.06k
    *nextTokPtr = ptr;
1084
1.06k
    return XML_TOK_PROLOG_S;
1085
544
  case BT_PERCNT:
1086
544
    return PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1087
29
  case BT_COMMA:
1088
29
    *nextTokPtr = ptr + MINBPC(enc);
1089
29
    return XML_TOK_COMMA;
1090
69
  case BT_LSQB:
1091
69
    *nextTokPtr = ptr + MINBPC(enc);
1092
69
    return XML_TOK_OPEN_BRACKET;
1093
61
  case BT_RSQB:
1094
61
    ptr += MINBPC(enc);
1095
61
    if (! HAS_CHAR(enc, ptr, end))
1096
25
      return -XML_TOK_CLOSE_BRACKET;
1097
36
    if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) {
1098
6
      REQUIRE_CHARS(enc, ptr, end, 2);
1099
6
      if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_GT)) {
1100
2
        *nextTokPtr = ptr + 2 * MINBPC(enc);
1101
2
        return XML_TOK_COND_SECT_CLOSE;
1102
2
      }
1103
6
    }
1104
34
    *nextTokPtr = ptr;
1105
34
    return XML_TOK_CLOSE_BRACKET;
1106
30
  case BT_LPAR:
1107
30
    *nextTokPtr = ptr + MINBPC(enc);
1108
30
    return XML_TOK_OPEN_PAREN;
1109
124
  case BT_RPAR:
1110
124
    ptr += MINBPC(enc);
1111
124
    if (! HAS_CHAR(enc, ptr, end))
1112
16
      return -XML_TOK_CLOSE_PAREN;
1113
108
    switch (BYTE_TYPE(enc, ptr)) {
1114
0
    case BT_AST:
1115
0
      *nextTokPtr = ptr + MINBPC(enc);
1116
0
      return XML_TOK_CLOSE_PAREN_ASTERISK;
1117
6
    case BT_QUEST:
1118
6
      *nextTokPtr = ptr + MINBPC(enc);
1119
6
      return XML_TOK_CLOSE_PAREN_QUESTION;
1120
4
    case BT_PLUS:
1121
4
      *nextTokPtr = ptr + MINBPC(enc);
1122
4
      return XML_TOK_CLOSE_PAREN_PLUS;
1123
10
    case BT_CR:
1124
14
    case BT_LF:
1125
22
    case BT_S:
1126
43
    case BT_GT:
1127
43
    case BT_COMMA:
1128
43
    case BT_VERBAR:
1129
52
    case BT_RPAR:
1130
52
      *nextTokPtr = ptr;
1131
52
      return XML_TOK_CLOSE_PAREN;
1132
108
    }
1133
46
    *nextTokPtr = ptr;
1134
46
    return XML_TOK_INVALID;
1135
30
  case BT_VERBAR:
1136
30
    *nextTokPtr = ptr + MINBPC(enc);
1137
30
    return XML_TOK_OR;
1138
47
  case BT_GT:
1139
47
    *nextTokPtr = ptr + MINBPC(enc);
1140
47
    return XML_TOK_DECL_CLOSE;
1141
453
  case BT_NUM:
1142
453
    return PREFIX(scanPoundName)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1143
0
#  define LEAD_CASE(n)                                                         \
1144
203
  case BT_LEAD##n:                                                             \
1145
203
    if (end - ptr < n)                                                         \
1146
106
      return XML_TOK_PARTIAL_CHAR;                                             \
1147
166
    if (IS_INVALID_CHAR(enc, ptr, n)) {                                        \
1148
43
      *nextTokPtr = ptr;                                                       \
1149
43
      return XML_TOK_INVALID;                                                  \
1150
43
    }                                                                          \
1151
166
    if (IS_NMSTRT_CHAR(enc, ptr, n)) {                                         \
1152
17
      ptr += n;                                                                \
1153
17
      tok = XML_TOK_NAME;                                                      \
1154
17
      break;                                                                   \
1155
17
    }                                                                          \
1156
123
    if (IS_NAME_CHAR(enc, ptr, n)) {                                           \
1157
0
      ptr += n;                                                                \
1158
0
      tok = XML_TOK_NMTOKEN;                                                   \
1159
0
      break;                                                                   \
1160
0
    }                                                                          \
1161
106
    *nextTokPtr = ptr;                                                         \
1162
106
    return XML_TOK_INVALID;
1163
121
    LEAD_CASE(2)
1164
118
    LEAD_CASE(3)
1165
359
    LEAD_CASE(4)
1166
0
#  undef LEAD_CASE
1167
677
  case BT_NMSTRT:
1168
938
  case BT_HEX:
1169
938
    tok = XML_TOK_NAME;
1170
938
    ptr += MINBPC(enc);
1171
938
    break;
1172
125
  case BT_DIGIT:
1173
165
  case BT_NAME:
1174
214
  case BT_MINUS:
1175
214
#  ifdef XML_NS
1176
256
  case BT_COLON:
1177
256
#  endif
1178
256
    tok = XML_TOK_NMTOKEN;
1179
256
    ptr += MINBPC(enc);
1180
256
    break;
1181
111
  case BT_NONASCII:
1182
111
    if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {
1183
60
      ptr += MINBPC(enc);
1184
60
      tok = XML_TOK_NAME;
1185
60
      break;
1186
60
    }
1187
51
    if (IS_NAME_CHAR_MINBPC(enc, ptr)) {
1188
26
      ptr += MINBPC(enc);
1189
26
      tok = XML_TOK_NMTOKEN;
1190
26
      break;
1191
26
    }
1192
    /* fall through */
1193
246
  default:
1194
246
    *nextTokPtr = ptr;
1195
246
    return XML_TOK_INVALID;
1196
19.7k
  }
1197
9.19k
  while (HAS_CHAR(enc, ptr, end)) {
1198
9.19k
    switch (BYTE_TYPE(enc, ptr)) {
1199
29.0k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1200
15
    case BT_GT:
1201
32
    case BT_RPAR:
1202
49
    case BT_COMMA:
1203
68
    case BT_VERBAR:
1204
95
    case BT_LSQB:
1205
124
    case BT_PERCNT:
1206
199
    case BT_S:
1207
233
    case BT_CR:
1208
278
    case BT_LF:
1209
278
      *nextTokPtr = ptr;
1210
278
      return tok;
1211
0
#  ifdef XML_NS
1212
495
    case BT_COLON:
1213
495
      ptr += MINBPC(enc);
1214
495
      switch (tok) {
1215
311
      case XML_TOK_NAME:
1216
311
        REQUIRE_CHAR(enc, ptr, end);
1217
291
        tok = XML_TOK_PREFIXED_NAME;
1218
291
        switch (BYTE_TYPE(enc, ptr)) {
1219
470
          CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1220
90
        default:
1221
90
          tok = XML_TOK_NMTOKEN;
1222
90
          break;
1223
291
        }
1224
195
        break;
1225
195
      case XML_TOK_PREFIXED_NAME:
1226
9
        tok = XML_TOK_NMTOKEN;
1227
9
        break;
1228
495
      }
1229
379
      break;
1230
379
#  endif
1231
379
    case BT_PLUS:
1232
42
      if (tok == XML_TOK_NMTOKEN) {
1233
18
        *nextTokPtr = ptr;
1234
18
        return XML_TOK_INVALID;
1235
18
      }
1236
24
      *nextTokPtr = ptr + MINBPC(enc);
1237
24
      return XML_TOK_NAME_PLUS;
1238
55
    case BT_AST:
1239
55
      if (tok == XML_TOK_NMTOKEN) {
1240
14
        *nextTokPtr = ptr;
1241
14
        return XML_TOK_INVALID;
1242
14
      }
1243
41
      *nextTokPtr = ptr + MINBPC(enc);
1244
41
      return XML_TOK_NAME_ASTERISK;
1245
41
    case BT_QUEST:
1246
41
      if (tok == XML_TOK_NMTOKEN) {
1247
20
        *nextTokPtr = ptr;
1248
20
        return XML_TOK_INVALID;
1249
20
      }
1250
21
      *nextTokPtr = ptr + MINBPC(enc);
1251
21
      return XML_TOK_NAME_QUESTION;
1252
360
    default:
1253
360
      *nextTokPtr = ptr;
1254
360
      return XML_TOK_INVALID;
1255
9.19k
    }
1256
9.19k
  }
1257
106
  return -tok;
1258
1.29k
}
xmltok.c:normal_prologTok
Line
Count
Source
1018
14.2k
                  const char **nextTokPtr) {
1019
14.2k
  int tok;
1020
14.2k
  if (ptr >= end)
1021
1.21k
    return XML_TOK_NONE;
1022
13.0k
  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
13.0k
  switch (BYTE_TYPE(enc, ptr)) {
1032
58
  case BT_QUOT:
1033
58
    return PREFIX(scanLit)(BT_QUOT, enc, ptr + MINBPC(enc), end, nextTokPtr);
1034
93
  case BT_APOS:
1035
93
    return PREFIX(scanLit)(BT_APOS, enc, ptr + MINBPC(enc), end, nextTokPtr);
1036
7.35k
  case BT_LT: {
1037
7.35k
    ptr += MINBPC(enc);
1038
7.35k
    REQUIRE_CHAR(enc, ptr, end);
1039
7.35k
    switch (BYTE_TYPE(enc, ptr)) {
1040
161
    case BT_EXCL:
1041
161
      return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1042
3.53k
    case BT_QUEST:
1043
3.53k
      return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1044
3.53k
    case BT_NMSTRT:
1045
3.59k
    case BT_HEX:
1046
3.59k
    case BT_NONASCII:
1047
3.61k
    case BT_LEAD2:
1048
3.62k
    case BT_LEAD3:
1049
3.63k
    case BT_LEAD4:
1050
3.63k
      *nextTokPtr = ptr - MINBPC(enc);
1051
3.63k
      return XML_TOK_INSTANCE_START;
1052
7.35k
    }
1053
21
    *nextTokPtr = ptr;
1054
21
    return XML_TOK_INVALID;
1055
7.35k
  }
1056
64
  case BT_CR:
1057
64
    if (ptr + MINBPC(enc) == end) {
1058
5
      *nextTokPtr = end;
1059
      /* indicate that this might be part of a CR/LF pair */
1060
5
      return -XML_TOK_PROLOG_S;
1061
5
    }
1062
    /* fall through */
1063
1.12k
  case BT_S:
1064
4.44k
  case BT_LF:
1065
4.76M
    for (;;) {
1066
4.76M
      ptr += MINBPC(enc);
1067
4.76M
      if (! HAS_CHAR(enc, ptr, end))
1068
1.04k
        break;
1069
4.76M
      switch (BYTE_TYPE(enc, ptr)) {
1070
4.70M
      case BT_S:
1071
4.75M
      case BT_LF:
1072
4.75M
        break;
1073
746
      case BT_CR:
1074
        /* don't split CR/LF pair */
1075
746
        if (ptr + MINBPC(enc) != end)
1076
741
          break;
1077
        /* fall through */
1078
3.39k
      default:
1079
3.39k
        *nextTokPtr = ptr;
1080
3.39k
        return XML_TOK_PROLOG_S;
1081
4.76M
      }
1082
4.76M
    }
1083
1.04k
    *nextTokPtr = ptr;
1084
1.04k
    return XML_TOK_PROLOG_S;
1085
173
  case BT_PERCNT:
1086
173
    return PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1087
13
  case BT_COMMA:
1088
13
    *nextTokPtr = ptr + MINBPC(enc);
1089
13
    return XML_TOK_COMMA;
1090
35
  case BT_LSQB:
1091
35
    *nextTokPtr = ptr + MINBPC(enc);
1092
35
    return XML_TOK_OPEN_BRACKET;
1093
21
  case BT_RSQB:
1094
21
    ptr += MINBPC(enc);
1095
21
    if (! HAS_CHAR(enc, ptr, end))
1096
6
      return -XML_TOK_CLOSE_BRACKET;
1097
15
    if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) {
1098
6
      REQUIRE_CHARS(enc, ptr, end, 2);
1099
6
      if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_GT)) {
1100
2
        *nextTokPtr = ptr + 2 * MINBPC(enc);
1101
2
        return XML_TOK_COND_SECT_CLOSE;
1102
2
      }
1103
6
    }
1104
13
    *nextTokPtr = ptr;
1105
13
    return XML_TOK_CLOSE_BRACKET;
1106
8
  case BT_LPAR:
1107
8
    *nextTokPtr = ptr + MINBPC(enc);
1108
8
    return XML_TOK_OPEN_PAREN;
1109
59
  case BT_RPAR:
1110
59
    ptr += MINBPC(enc);
1111
59
    if (! HAS_CHAR(enc, ptr, end))
1112
10
      return -XML_TOK_CLOSE_PAREN;
1113
49
    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
2
    case BT_QUEST:
1118
2
      *nextTokPtr = ptr + MINBPC(enc);
1119
2
      return XML_TOK_CLOSE_PAREN_QUESTION;
1120
4
    case BT_PLUS:
1121
4
      *nextTokPtr = ptr + MINBPC(enc);
1122
4
      return XML_TOK_CLOSE_PAREN_PLUS;
1123
10
    case BT_CR:
1124
13
    case BT_LF:
1125
21
    case BT_S:
1126
32
    case BT_GT:
1127
32
    case BT_COMMA:
1128
32
    case BT_VERBAR:
1129
41
    case BT_RPAR:
1130
41
      *nextTokPtr = ptr;
1131
41
      return XML_TOK_CLOSE_PAREN;
1132
49
    }
1133
2
    *nextTokPtr = ptr;
1134
2
    return XML_TOK_INVALID;
1135
16
  case BT_VERBAR:
1136
16
    *nextTokPtr = ptr + MINBPC(enc);
1137
16
    return XML_TOK_OR;
1138
23
  case BT_GT:
1139
23
    *nextTokPtr = ptr + MINBPC(enc);
1140
23
    return XML_TOK_DECL_CLOSE;
1141
104
  case BT_NUM:
1142
104
    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
121
    LEAD_CASE(2)
1164
118
    LEAD_CASE(3)
1165
52
    LEAD_CASE(4)
1166
0
#  undef LEAD_CASE
1167
224
  case BT_NMSTRT:
1168
391
  case BT_HEX:
1169
391
    tok = XML_TOK_NAME;
1170
391
    ptr += MINBPC(enc);
1171
391
    break;
1172
36
  case BT_DIGIT:
1173
53
  case BT_NAME:
1174
76
  case BT_MINUS:
1175
76
#  ifdef XML_NS
1176
79
  case BT_COLON:
1177
79
#  endif
1178
79
    tok = XML_TOK_NMTOKEN;
1179
79
    ptr += MINBPC(enc);
1180
79
    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
67
  default:
1194
67
    *nextTokPtr = ptr;
1195
67
    return XML_TOK_INVALID;
1196
13.0k
  }
1197
5.56k
  while (HAS_CHAR(enc, ptr, end)) {
1198
5.56k
    switch (BYTE_TYPE(enc, ptr)) {
1199
16.2k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1200
0
    case BT_GT:
1201
6
    case BT_RPAR:
1202
10
    case BT_COMMA:
1203
14
    case BT_VERBAR:
1204
31
    case BT_LSQB:
1205
44
    case BT_PERCNT:
1206
92
    case BT_S:
1207
107
    case BT_CR:
1208
134
    case BT_LF:
1209
134
      *nextTokPtr = ptr;
1210
134
      return tok;
1211
0
#  ifdef XML_NS
1212
278
    case BT_COLON:
1213
278
      ptr += MINBPC(enc);
1214
278
      switch (tok) {
1215
122
      case XML_TOK_NAME:
1216
122
        REQUIRE_CHAR(enc, ptr, end);
1217
118
        tok = XML_TOK_PREFIXED_NAME;
1218
118
        switch (BYTE_TYPE(enc, ptr)) {
1219
209
          CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1220
23
        default:
1221
23
          tok = XML_TOK_NMTOKEN;
1222
23
          break;
1223
118
        }
1224
75
        break;
1225
75
      case XML_TOK_PREFIXED_NAME:
1226
0
        tok = XML_TOK_NMTOKEN;
1227
0
        break;
1228
278
      }
1229
231
      break;
1230
231
#  endif
1231
231
    case BT_PLUS:
1232
8
      if (tok == XML_TOK_NMTOKEN) {
1233
4
        *nextTokPtr = ptr;
1234
4
        return XML_TOK_INVALID;
1235
4
      }
1236
4
      *nextTokPtr = ptr + MINBPC(enc);
1237
4
      return XML_TOK_NAME_PLUS;
1238
16
    case BT_AST:
1239
16
      if (tok == XML_TOK_NMTOKEN) {
1240
3
        *nextTokPtr = ptr;
1241
3
        return XML_TOK_INVALID;
1242
3
      }
1243
13
      *nextTokPtr = ptr + MINBPC(enc);
1244
13
      return XML_TOK_NAME_ASTERISK;
1245
8
    case BT_QUEST:
1246
8
      if (tok == XML_TOK_NMTOKEN) {
1247
4
        *nextTokPtr = ptr;
1248
4
        return XML_TOK_INVALID;
1249
4
      }
1250
4
      *nextTokPtr = ptr + MINBPC(enc);
1251
4
      return XML_TOK_NAME_QUESTION;
1252
158
    default:
1253
158
      *nextTokPtr = ptr;
1254
158
      return XML_TOK_INVALID;
1255
5.56k
    }
1256
5.56k
  }
1257
25
  return -tok;
1258
487
}
xmltok.c:little2_prologTok
Line
Count
Source
1018
3.22k
                  const char **nextTokPtr) {
1019
3.22k
  int tok;
1020
3.22k
  if (ptr >= end)
1021
6
    return XML_TOK_NONE;
1022
3.21k
  if (MINBPC(enc) > 1) {
1023
3.21k
    size_t n = end - ptr;
1024
3.21k
    if (n & (MINBPC(enc) - 1)) {
1025
2.09k
      n &= ~(MINBPC(enc) - 1);
1026
2.09k
      if (n == 0)
1027
14
        return XML_TOK_PARTIAL;
1028
2.07k
      end = ptr + n;
1029
2.07k
    }
1030
3.21k
  }
1031
3.20k
  switch (BYTE_TYPE(enc, ptr)) {
1032
113
  case BT_QUOT:
1033
113
    return PREFIX(scanLit)(BT_QUOT, enc, ptr + MINBPC(enc), end, nextTokPtr);
1034
18
  case BT_APOS:
1035
18
    return PREFIX(scanLit)(BT_APOS, enc, ptr + MINBPC(enc), end, nextTokPtr);
1036
1.89k
  case BT_LT: {
1037
1.89k
    ptr += MINBPC(enc);
1038
1.89k
    REQUIRE_CHAR(enc, ptr, end);
1039
1.87k
    switch (BYTE_TYPE(enc, ptr)) {
1040
208
    case BT_EXCL:
1041
208
      return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1042
310
    case BT_QUEST:
1043
310
      return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1044
5
    case BT_NMSTRT:
1045
13
    case BT_HEX:
1046
1.28k
    case BT_NONASCII:
1047
1.28k
    case BT_LEAD2:
1048
1.28k
    case BT_LEAD3:
1049
1.31k
    case BT_LEAD4:
1050
1.31k
      *nextTokPtr = ptr - MINBPC(enc);
1051
1.31k
      return XML_TOK_INSTANCE_START;
1052
1.87k
    }
1053
42
    *nextTokPtr = ptr;
1054
42
    return XML_TOK_INVALID;
1055
1.87k
  }
1056
15
  case BT_CR:
1057
15
    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
53
  case BT_S:
1064
106
  case BT_LF:
1065
136
    for (;;) {
1066
136
      ptr += MINBPC(enc);
1067
136
      if (! HAS_CHAR(enc, ptr, end))
1068
14
        break;
1069
122
      switch (BYTE_TYPE(enc, ptr)) {
1070
3
      case BT_S:
1071
27
      case BT_LF:
1072
27
        break;
1073
3
      case BT_CR:
1074
        /* don't split CR/LF pair */
1075
3
        if (ptr + MINBPC(enc) != end)
1076
3
          break;
1077
        /* fall through */
1078
92
      default:
1079
92
        *nextTokPtr = ptr;
1080
92
        return XML_TOK_PROLOG_S;
1081
122
      }
1082
122
    }
1083
14
    *nextTokPtr = ptr;
1084
14
    return XML_TOK_PROLOG_S;
1085
190
  case BT_PERCNT:
1086
190
    return PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1087
10
  case BT_COMMA:
1088
10
    *nextTokPtr = ptr + MINBPC(enc);
1089
10
    return XML_TOK_COMMA;
1090
15
  case BT_LSQB:
1091
15
    *nextTokPtr = ptr + MINBPC(enc);
1092
15
    return XML_TOK_OPEN_BRACKET;
1093
22
  case BT_RSQB:
1094
22
    ptr += MINBPC(enc);
1095
22
    if (! HAS_CHAR(enc, ptr, end))
1096
9
      return -XML_TOK_CLOSE_BRACKET;
1097
13
    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
13
    *nextTokPtr = ptr;
1105
13
    return XML_TOK_CLOSE_BRACKET;
1106
15
  case BT_LPAR:
1107
15
    *nextTokPtr = ptr + MINBPC(enc);
1108
15
    return XML_TOK_OPEN_PAREN;
1109
46
  case BT_RPAR:
1110
46
    ptr += MINBPC(enc);
1111
46
    if (! HAS_CHAR(enc, ptr, end))
1112
6
      return -XML_TOK_CLOSE_PAREN;
1113
40
    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
1
    case BT_LF:
1125
1
    case BT_S:
1126
11
    case BT_GT:
1127
11
    case BT_COMMA:
1128
11
    case BT_VERBAR:
1129
11
    case BT_RPAR:
1130
11
      *nextTokPtr = ptr;
1131
11
      return XML_TOK_CLOSE_PAREN;
1132
40
    }
1133
29
    *nextTokPtr = ptr;
1134
29
    return XML_TOK_INVALID;
1135
5
  case BT_VERBAR:
1136
5
    *nextTokPtr = ptr + MINBPC(enc);
1137
5
    return XML_TOK_OR;
1138
18
  case BT_GT:
1139
18
    *nextTokPtr = ptr + MINBPC(enc);
1140
18
    return XML_TOK_DECL_CLOSE;
1141
188
  case BT_NUM:
1142
188
    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
212
    LEAD_CASE(4)
1166
0
#  undef LEAD_CASE
1167
206
  case BT_NMSTRT:
1168
249
  case BT_HEX:
1169
249
    tok = XML_TOK_NAME;
1170
249
    ptr += MINBPC(enc);
1171
249
    break;
1172
36
  case BT_DIGIT:
1173
46
  case BT_NAME:
1174
55
  case BT_MINUS:
1175
55
#  ifdef XML_NS
1176
90
  case BT_COLON:
1177
90
#  endif
1178
90
    tok = XML_TOK_NMTOKEN;
1179
90
    ptr += MINBPC(enc);
1180
90
    break;
1181
59
  case BT_NONASCII:
1182
59
    if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {
1183
34
      ptr += MINBPC(enc);
1184
34
      tok = XML_TOK_NAME;
1185
34
      break;
1186
34
    }
1187
25
    if (IS_NAME_CHAR_MINBPC(enc, ptr)) {
1188
14
      ptr += MINBPC(enc);
1189
14
      tok = XML_TOK_NMTOKEN;
1190
14
      break;
1191
14
    }
1192
    /* fall through */
1193
111
  default:
1194
111
    *nextTokPtr = ptr;
1195
111
    return XML_TOK_INVALID;
1196
3.20k
  }
1197
1.93k
  while (HAS_CHAR(enc, ptr, end)) {
1198
1.93k
    switch (BYTE_TYPE(enc, ptr)) {
1199
7.11k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1200
6
    case BT_GT:
1201
11
    case BT_RPAR:
1202
17
    case BT_COMMA:
1203
26
    case BT_VERBAR:
1204
32
    case BT_LSQB:
1205
38
    case BT_PERCNT:
1206
47
    case BT_S:
1207
60
    case BT_CR:
1208
68
    case BT_LF:
1209
68
      *nextTokPtr = ptr;
1210
68
      return tok;
1211
0
#  ifdef XML_NS
1212
118
    case BT_COLON:
1213
118
      ptr += MINBPC(enc);
1214
118
      switch (tok) {
1215
103
      case XML_TOK_NAME:
1216
103
        REQUIRE_CHAR(enc, ptr, end);
1217
97
        tok = XML_TOK_PREFIXED_NAME;
1218
97
        switch (BYTE_TYPE(enc, ptr)) {
1219
137
          CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1220
40
        default:
1221
40
          tok = XML_TOK_NMTOKEN;
1222
40
          break;
1223
97
        }
1224
57
        break;
1225
57
      case XML_TOK_PREFIXED_NAME:
1226
5
        tok = XML_TOK_NMTOKEN;
1227
5
        break;
1228
118
      }
1229
72
      break;
1230
72
#  endif
1231
72
    case BT_PLUS:
1232
14
      if (tok == XML_TOK_NMTOKEN) {
1233
4
        *nextTokPtr = ptr;
1234
4
        return XML_TOK_INVALID;
1235
4
      }
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
5
        *nextTokPtr = ptr;
1241
5
        return XML_TOK_INVALID;
1242
5
      }
1243
10
      *nextTokPtr = ptr + MINBPC(enc);
1244
10
      return XML_TOK_NAME_ASTERISK;
1245
16
    case BT_QUEST:
1246
16
      if (tok == XML_TOK_NMTOKEN) {
1247
8
        *nextTokPtr = ptr;
1248
8
        return XML_TOK_INVALID;
1249
8
      }
1250
8
      *nextTokPtr = ptr + MINBPC(enc);
1251
8
      return XML_TOK_NAME_QUESTION;
1252
97
    default:
1253
97
      *nextTokPtr = ptr;
1254
97
      return XML_TOK_INVALID;
1255
1.93k
    }
1256
1.93k
  }
1257
37
  return -tok;
1258
387
}
xmltok.c:big2_prologTok
Line
Count
Source
1018
3.50k
                  const char **nextTokPtr) {
1019
3.50k
  int tok;
1020
3.50k
  if (ptr >= end)
1021
20
    return XML_TOK_NONE;
1022
3.48k
  if (MINBPC(enc) > 1) {
1023
3.48k
    size_t n = end - ptr;
1024
3.48k
    if (n & (MINBPC(enc) - 1)) {
1025
2.41k
      n &= ~(MINBPC(enc) - 1);
1026
2.41k
      if (n == 0)
1027
21
        return XML_TOK_PARTIAL;
1028
2.39k
      end = ptr + n;
1029
2.39k
    }
1030
3.48k
  }
1031
3.46k
  switch (BYTE_TYPE(enc, ptr)) {
1032
113
  case BT_QUOT:
1033
113
    return PREFIX(scanLit)(BT_QUOT, enc, ptr + MINBPC(enc), end, nextTokPtr);
1034
31
  case BT_APOS:
1035
31
    return PREFIX(scanLit)(BT_APOS, enc, ptr + MINBPC(enc), end, nextTokPtr);
1036
2.24k
  case BT_LT: {
1037
2.24k
    ptr += MINBPC(enc);
1038
2.24k
    REQUIRE_CHAR(enc, ptr, end);
1039
2.23k
    switch (BYTE_TYPE(enc, ptr)) {
1040
278
    case BT_EXCL:
1041
278
      return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1042
386
    case BT_QUEST:
1043
386
      return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1044
95
    case BT_NMSTRT:
1045
589
    case BT_HEX:
1046
1.50k
    case BT_NONASCII:
1047
1.50k
    case BT_LEAD2:
1048
1.50k
    case BT_LEAD3:
1049
1.52k
    case BT_LEAD4:
1050
1.52k
      *nextTokPtr = ptr - MINBPC(enc);
1051
1.52k
      return XML_TOK_INSTANCE_START;
1052
2.23k
    }
1053
46
    *nextTokPtr = ptr;
1054
46
    return XML_TOK_INVALID;
1055
2.23k
  }
1056
39
  case BT_CR:
1057
39
    if (ptr + MINBPC(enc) == end) {
1058
4
      *nextTokPtr = end;
1059
      /* indicate that this might be part of a CR/LF pair */
1060
4
      return -XML_TOK_PROLOG_S;
1061
4
    }
1062
    /* fall through */
1063
57
  case BT_S:
1064
121
  case BT_LF:
1065
146
    for (;;) {
1066
146
      ptr += MINBPC(enc);
1067
146
      if (! HAS_CHAR(enc, ptr, end))
1068
7
        break;
1069
139
      switch (BYTE_TYPE(enc, ptr)) {
1070
5
      case BT_S:
1071
15
      case BT_LF:
1072
15
        break;
1073
14
      case BT_CR:
1074
        /* don't split CR/LF pair */
1075
14
        if (ptr + MINBPC(enc) != end)
1076
10
          break;
1077
        /* fall through */
1078
114
      default:
1079
114
        *nextTokPtr = ptr;
1080
114
        return XML_TOK_PROLOG_S;
1081
139
      }
1082
139
    }
1083
7
    *nextTokPtr = ptr;
1084
7
    return XML_TOK_PROLOG_S;
1085
181
  case BT_PERCNT:
1086
181
    return PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr);
1087
6
  case BT_COMMA:
1088
6
    *nextTokPtr = ptr + MINBPC(enc);
1089
6
    return XML_TOK_COMMA;
1090
19
  case BT_LSQB:
1091
19
    *nextTokPtr = ptr + MINBPC(enc);
1092
19
    return XML_TOK_OPEN_BRACKET;
1093
18
  case BT_RSQB:
1094
18
    ptr += MINBPC(enc);
1095
18
    if (! HAS_CHAR(enc, ptr, end))
1096
10
      return -XML_TOK_CLOSE_BRACKET;
1097
8
    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
8
    *nextTokPtr = ptr;
1105
8
    return XML_TOK_CLOSE_BRACKET;
1106
7
  case BT_LPAR:
1107
7
    *nextTokPtr = ptr + MINBPC(enc);
1108
7
    return XML_TOK_OPEN_PAREN;
1109
19
  case BT_RPAR:
1110
19
    ptr += MINBPC(enc);
1111
19
    if (! HAS_CHAR(enc, ptr, end))
1112
0
      return -XML_TOK_CLOSE_PAREN;
1113
19
    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
4
    case BT_QUEST:
1118
4
      *nextTokPtr = ptr + MINBPC(enc);
1119
4
      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
19
    }
1133
15
    *nextTokPtr = ptr;
1134
15
    return XML_TOK_INVALID;
1135
9
  case BT_VERBAR:
1136
9
    *nextTokPtr = ptr + MINBPC(enc);
1137
9
    return XML_TOK_OR;
1138
6
  case BT_GT:
1139
6
    *nextTokPtr = ptr + MINBPC(enc);
1140
6
    return XML_TOK_DECL_CLOSE;
1141
161
  case BT_NUM:
1142
161
    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
95
    LEAD_CASE(4)
1166
0
#  undef LEAD_CASE
1167
247
  case BT_NMSTRT:
1168
298
  case BT_HEX:
1169
298
    tok = XML_TOK_NAME;
1170
298
    ptr += MINBPC(enc);
1171
298
    break;
1172
53
  case BT_DIGIT:
1173
66
  case BT_NAME:
1174
83
  case BT_MINUS:
1175
83
#  ifdef XML_NS
1176
87
  case BT_COLON:
1177
87
#  endif
1178
87
    tok = XML_TOK_NMTOKEN;
1179
87
    ptr += MINBPC(enc);
1180
87
    break;
1181
52
  case BT_NONASCII:
1182
52
    if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {
1183
26
      ptr += MINBPC(enc);
1184
26
      tok = XML_TOK_NAME;
1185
26
      break;
1186
26
    }
1187
26
    if (IS_NAME_CHAR_MINBPC(enc, ptr)) {
1188
12
      ptr += MINBPC(enc);
1189
12
      tok = XML_TOK_NMTOKEN;
1190
12
      break;
1191
12
    }
1192
    /* fall through */
1193
68
  default:
1194
68
    *nextTokPtr = ptr;
1195
68
    return XML_TOK_INVALID;
1196
3.46k
  }
1197
1.70k
  while (HAS_CHAR(enc, ptr, end)) {
1198
1.70k
    switch (BYTE_TYPE(enc, ptr)) {
1199
5.66k
      CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1200
9
    case BT_GT:
1201
15
    case BT_RPAR:
1202
22
    case BT_COMMA:
1203
28
    case BT_VERBAR:
1204
32
    case BT_LSQB:
1205
42
    case BT_PERCNT:
1206
60
    case BT_S:
1207
66
    case BT_CR:
1208
76
    case BT_LF:
1209
76
      *nextTokPtr = ptr;
1210
76
      return tok;
1211
0
#  ifdef XML_NS
1212
99
    case BT_COLON:
1213
99
      ptr += MINBPC(enc);
1214
99
      switch (tok) {
1215
86
      case XML_TOK_NAME:
1216
86
        REQUIRE_CHAR(enc, ptr, end);
1217
76
        tok = XML_TOK_PREFIXED_NAME;
1218
76
        switch (BYTE_TYPE(enc, ptr)) {
1219
124
          CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
1220
27
        default:
1221
27
          tok = XML_TOK_NMTOKEN;
1222
27
          break;
1223
76
        }
1224
63
        break;
1225
63
      case XML_TOK_PREFIXED_NAME:
1226
4
        tok = XML_TOK_NMTOKEN;
1227
4
        break;
1228
99
      }
1229
76
      break;
1230
76
#  endif
1231
76
    case BT_PLUS:
1232
20
      if (tok == XML_TOK_NMTOKEN) {
1233
10
        *nextTokPtr = ptr;
1234
10
        return XML_TOK_INVALID;
1235
10
      }
1236
10
      *nextTokPtr = ptr + MINBPC(enc);
1237
10
      return XML_TOK_NAME_PLUS;
1238
24
    case BT_AST:
1239
24
      if (tok == XML_TOK_NMTOKEN) {
1240
6
        *nextTokPtr = ptr;
1241
6
        return XML_TOK_INVALID;
1242
6
      }
1243
18
      *nextTokPtr = ptr + MINBPC(enc);
1244
18
      return XML_TOK_NAME_ASTERISK;
1245
17
    case BT_QUEST:
1246
17
      if (tok == XML_TOK_NMTOKEN) {
1247
8
        *nextTokPtr = ptr;
1248
8
        return XML_TOK_INVALID;
1249
8
      }
1250
9
      *nextTokPtr = ptr + MINBPC(enc);
1251
9
      return XML_TOK_NAME_QUESTION;
1252
105
    default:
1253
105
      *nextTokPtr = ptr;
1254
105
      return XML_TOK_INVALID;
1255
1.70k
    }
1256
1.70k
  }
1257
44
  return -tok;
1258
423
}
1259
1260
static int PTRCALL
1261
PREFIX(attributeValueTok)(const ENCODING *enc, const char *ptr, const char *end,
1262
62.8k
                          const char **nextTokPtr) {
1263
62.8k
  const char *start;
1264
62.8k
  if (ptr >= end)
1265
2.46k
    return XML_TOK_NONE;
1266
60.4k
  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
60.4k
  start = ptr;
1275
175k
  while (HAS_CHAR(enc, ptr, end)) {
1276
175k
    switch (BYTE_TYPE(enc, ptr)) {
1277
0
#  define LEAD_CASE(n)                                                         \
1278
232
  case BT_LEAD##n:                                                             \
1279
232
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1280
232
    break;
1281
26
      LEAD_CASE(2)
1282
143
      LEAD_CASE(3)
1283
63
      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
1.85k
    case BT_LF:
1295
1.85k
      if (ptr == start) {
1296
1.76k
        *nextTokPtr = ptr + MINBPC(enc);
1297
1.76k
        return XML_TOK_DATA_NEWLINE;
1298
1.76k
      }
1299
84
      *nextTokPtr = ptr;
1300
84
      return XML_TOK_DATA_CHARS;
1301
6.83k
    case BT_CR:
1302
6.83k
      if (ptr == start) {
1303
6.29k
        ptr += MINBPC(enc);
1304
6.29k
        if (! HAS_CHAR(enc, ptr, end))
1305
122
          return XML_TOK_TRAILING_CR;
1306
6.17k
        if (BYTE_TYPE(enc, ptr) == BT_LF)
1307
111
          ptr += MINBPC(enc);
1308
6.17k
        *nextTokPtr = ptr;
1309
6.17k
        return XML_TOK_DATA_NEWLINE;
1310
6.29k
      }
1311
538
      *nextTokPtr = ptr;
1312
538
      return XML_TOK_DATA_CHARS;
1313
51.5k
    case BT_S:
1314
51.5k
      if (ptr == start) {
1315
38.7k
        *nextTokPtr = ptr + MINBPC(enc);
1316
38.7k
        return XML_TOK_ATTRIBUTE_VALUE_S;
1317
38.7k
      }
1318
12.8k
      *nextTokPtr = ptr;
1319
12.8k
      return XML_TOK_DATA_CHARS;
1320
115k
    default:
1321
115k
      ptr += MINBPC(enc);
1322
115k
      break;
1323
175k
    }
1324
175k
  }
1325
201
  *nextTokPtr = ptr;
1326
201
  return XML_TOK_DATA_CHARS;
1327
60.4k
}
xmltok.c:normal_attributeValueTok
Line
Count
Source
1262
62.8k
                          const char **nextTokPtr) {
1263
62.8k
  const char *start;
1264
62.8k
  if (ptr >= end)
1265
2.46k
    return XML_TOK_NONE;
1266
60.4k
  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
60.4k
  start = ptr;
1275
175k
  while (HAS_CHAR(enc, ptr, end)) {
1276
175k
    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
26
      LEAD_CASE(2)
1282
143
      LEAD_CASE(3)
1283
63
      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
1.85k
    case BT_LF:
1295
1.85k
      if (ptr == start) {
1296
1.76k
        *nextTokPtr = ptr + MINBPC(enc);
1297
1.76k
        return XML_TOK_DATA_NEWLINE;
1298
1.76k
      }
1299
84
      *nextTokPtr = ptr;
1300
84
      return XML_TOK_DATA_CHARS;
1301
6.83k
    case BT_CR:
1302
6.83k
      if (ptr == start) {
1303
6.29k
        ptr += MINBPC(enc);
1304
6.29k
        if (! HAS_CHAR(enc, ptr, end))
1305
122
          return XML_TOK_TRAILING_CR;
1306
6.17k
        if (BYTE_TYPE(enc, ptr) == BT_LF)
1307
111
          ptr += MINBPC(enc);
1308
6.17k
        *nextTokPtr = ptr;
1309
6.17k
        return XML_TOK_DATA_NEWLINE;
1310
6.29k
      }
1311
538
      *nextTokPtr = ptr;
1312
538
      return XML_TOK_DATA_CHARS;
1313
51.5k
    case BT_S:
1314
51.5k
      if (ptr == start) {
1315
38.7k
        *nextTokPtr = ptr + MINBPC(enc);
1316
38.7k
        return XML_TOK_ATTRIBUTE_VALUE_S;
1317
38.7k
      }
1318
12.8k
      *nextTokPtr = ptr;
1319
12.8k
      return XML_TOK_DATA_CHARS;
1320
115k
    default:
1321
115k
      ptr += MINBPC(enc);
1322
115k
      break;
1323
175k
    }
1324
175k
  }
1325
201
  *nextTokPtr = ptr;
1326
201
  return XML_TOK_DATA_CHARS;
1327
60.4k
}
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
117k
                ATTRIBUTE *atts) {
1511
117k
  enum { other, inName, inValue } state = inName;
1512
117k
  int nAtts = 0;
1513
117k
  int open = 0; /* defined when state == inValue;
1514
                   initialization just to shut up compilers */
1515
1516
17.6M
  for (ptr += MINBPC(enc);; ptr += MINBPC(enc)) {
1517
17.6M
    switch (BYTE_TYPE(enc, ptr)) {
1518
0
#  define START_NAME                                                           \
1519
11.0M
    if (state == other) {                                                      \
1520
451k
      if (nAtts < attsMax) {                                                   \
1521
273k
        atts[nAtts].name = ptr;                                                \
1522
273k
        atts[nAtts].normalized = 1;                                            \
1523
273k
      }                                                                        \
1524
451k
      state = inName;                                                          \
1525
451k
    }
1526
0
#  define LEAD_CASE(n)                                                         \
1527
4.85k
  case BT_LEAD##n: /* NOTE: The encoding has already been validated. */        \
1528
4.85k
    START_NAME ptr += (n - MINBPC(enc));                                       \
1529
4.85k
    break;
1530
279
      LEAD_CASE(2)
1531
2.93k
      LEAD_CASE(3)
1532
1.64k
      LEAD_CASE(4)
1533
0
#  undef LEAD_CASE
1534
9.28k
    case BT_NONASCII:
1535
7.66M
    case BT_NMSTRT:
1536
11.0M
    case BT_HEX:
1537
11.0M
      START_NAME
1538
11.0M
      break;
1539
0
#  undef START_NAME
1540
902k
    case BT_QUOT:
1541
902k
      if (state != inValue) {
1542
450k
        if (nAtts < attsMax)
1543
272k
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1544
450k
        state = inValue;
1545
450k
        open = BT_QUOT;
1546
452k
      } else if (open == BT_QUOT) {
1547
450k
        state = other;
1548
450k
        if (nAtts < attsMax)
1549
272k
          atts[nAtts].valueEnd = ptr;
1550
450k
        nAtts++;
1551
450k
      }
1552
902k
      break;
1553
3.82k
    case BT_APOS:
1554
3.82k
      if (state != inValue) {
1555
1.61k
        if (nAtts < attsMax)
1556
1.00k
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1557
1.61k
        state = inValue;
1558
1.61k
        open = BT_APOS;
1559
2.21k
      } else if (open == BT_APOS) {
1560
1.61k
        state = other;
1561
1.61k
        if (nAtts < attsMax)
1562
1.00k
          atts[nAtts].valueEnd = ptr;
1563
1.61k
        nAtts++;
1564
1.61k
      }
1565
3.82k
      break;
1566
0
    case BT_AMP:
1567
0
      if (nAtts < attsMax)
1568
0
        atts[nAtts].normalized = 0;
1569
0
      break;
1570
1.55M
    case BT_S:
1571
1.55M
      if (state == inName)
1572
14.1k
        state = other;
1573
1.53M
      else if (state == inValue && nAtts < attsMax && atts[nAtts].normalized
1574
83.8k
               && (ptr == atts[nAtts].valuePtr
1575
83.7k
                   || BYTE_TO_ASCII(enc, ptr) != ASCII_SPACE
1576
83.7k
                   || BYTE_TO_ASCII(enc, ptr + MINBPC(enc)) == ASCII_SPACE
1577
81.6k
                   || BYTE_TYPE(enc, ptr + MINBPC(enc)) == open))
1578
2.19k
        atts[nAtts].normalized = 0;
1579
1.55M
      break;
1580
328k
    case BT_CR:
1581
768k
    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
768k
      if (state == inName)
1585
8.64k
        state = other;
1586
760k
      else if (state == inValue && nAtts < attsMax)
1587
136k
        atts[nAtts].normalized = 0;
1588
768k
      break;
1589
109k
    case BT_GT:
1590
403k
    case BT_SOL:
1591
403k
      if (state != inValue)
1592
117k
        return nAtts;
1593
285k
      break;
1594
2.95M
    default:
1595
2.95M
      break;
1596
17.6M
    }
1597
17.6M
  }
1598
  /* not reached */
1599
117k
}
xmltok.c:normal_getAtts
Line
Count
Source
1510
116k
                ATTRIBUTE *atts) {
1511
116k
  enum { other, inName, inValue } state = inName;
1512
116k
  int nAtts = 0;
1513
116k
  int open = 0; /* defined when state == inValue;
1514
                   initialization just to shut up compilers */
1515
1516
17.6M
  for (ptr += MINBPC(enc);; ptr += MINBPC(enc)) {
1517
17.6M
    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
279
      LEAD_CASE(2)
1531
2.93k
      LEAD_CASE(3)
1532
1.64k
      LEAD_CASE(4)
1533
0
#  undef LEAD_CASE
1534
0
    case BT_NONASCII:
1535
7.65M
    case BT_NMSTRT:
1536
11.0M
    case BT_HEX:
1537
11.0M
      START_NAME
1538
11.0M
      break;
1539
0
#  undef START_NAME
1540
902k
    case BT_QUOT:
1541
902k
      if (state != inValue) {
1542
450k
        if (nAtts < attsMax)
1543
272k
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1544
450k
        state = inValue;
1545
450k
        open = BT_QUOT;
1546
452k
      } else if (open == BT_QUOT) {
1547
450k
        state = other;
1548
450k
        if (nAtts < attsMax)
1549
272k
          atts[nAtts].valueEnd = ptr;
1550
450k
        nAtts++;
1551
450k
      }
1552
902k
      break;
1553
3.82k
    case BT_APOS:
1554
3.82k
      if (state != inValue) {
1555
1.61k
        if (nAtts < attsMax)
1556
1.00k
          atts[nAtts].valuePtr = ptr + MINBPC(enc);
1557
1.61k
        state = inValue;
1558
1.61k
        open = BT_APOS;
1559
2.21k
      } else if (open == BT_APOS) {
1560
1.61k
        state = other;
1561
1.61k
        if (nAtts < attsMax)
1562
1.00k
          atts[nAtts].valueEnd = ptr;
1563
1.61k
        nAtts++;
1564
1.61k
      }
1565
3.82k
      break;
1566
0
    case BT_AMP:
1567
0
      if (nAtts < attsMax)
1568
0
        atts[nAtts].normalized = 0;
1569
0
      break;
1570
1.55M
    case BT_S:
1571
1.55M
      if (state == inName)
1572
13.8k
        state = other;
1573
1.53M
      else if (state == inValue && nAtts < attsMax && atts[nAtts].normalized
1574
83.8k
               && (ptr == atts[nAtts].valuePtr
1575
83.7k
                   || BYTE_TO_ASCII(enc, ptr) != ASCII_SPACE
1576
83.7k
                   || BYTE_TO_ASCII(enc, ptr + MINBPC(enc)) == ASCII_SPACE
1577
81.6k
                   || BYTE_TYPE(enc, ptr + MINBPC(enc)) == open))
1578
2.19k
        atts[nAtts].normalized = 0;
1579
1.55M
      break;
1580
328k
    case BT_CR:
1581
768k
    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
768k
      if (state == inName)
1585
8.60k
        state = other;
1586
760k
      else if (state == inValue && nAtts < attsMax)
1587
136k
        atts[nAtts].normalized = 0;
1588
768k
      break;
1589
107k
    case BT_GT:
1590
401k
    case BT_SOL:
1591
401k
      if (state != inValue)
1592
116k
        return nAtts;
1593
285k
      break;
1594
2.95M
    default:
1595
2.95M
      break;
1596
17.6M
    }
1597
17.6M
  }
1598
  /* not reached */
1599
116k
}
xmltok.c:little2_getAtts
Line
Count
Source
1510
697
                ATTRIBUTE *atts) {
1511
697
  enum { other, inName, inValue } state = inName;
1512
697
  int nAtts = 0;
1513
697
  int open = 0; /* defined when state == inValue;
1514
                   initialization just to shut up compilers */
1515
1516
6.68k
  for (ptr += MINBPC(enc);; ptr += MINBPC(enc)) {
1517
6.68k
    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
5.48k
    case BT_NONASCII:
1535
5.62k
    case BT_NMSTRT:
1536
5.64k
    case BT_HEX:
1537
5.64k
      START_NAME
1538
5.64k
      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
5
    case BT_S:
1571
5
      if (state == inName)
1572
5
        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
5
      break;
1580
9
    case BT_CR:
1581
19
    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
19
      if (state == inName)
1585
19
        state = other;
1586
0
      else if (state == inValue && nAtts < attsMax)
1587
0
        atts[nAtts].normalized = 0;
1588
19
      break;
1589
659
    case BT_GT:
1590
697
    case BT_SOL:
1591
697
      if (state != inValue)
1592
697
        return nAtts;
1593
0
      break;
1594
317
    default:
1595
317
      break;
1596
6.68k
    }
1597
6.68k
  }
1598
  /* not reached */
1599
697
}
xmltok.c:big2_getAtts
Line
Count
Source
1510
815
                ATTRIBUTE *atts) {
1511
815
  enum { other, inName, inValue } state = inName;
1512
815
  int nAtts = 0;
1513
815
  int open = 0; /* defined when state == inValue;
1514
                   initialization just to shut up compilers */
1515
1516
5.41k
  for (ptr += MINBPC(enc);; ptr += MINBPC(enc)) {
1517
5.41k
    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
3.79k
    case BT_NONASCII:
1535
3.87k
    case BT_NMSTRT:
1536
4.35k
    case BT_HEX:
1537
4.35k
      START_NAME
1538
4.35k
      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
215
    case BT_S:
1571
215
      if (state == inName)
1572
212
        state = other;
1573
3
      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
215
      break;
1580
7
    case BT_CR:
1581
21
    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
21
      if (state == inName)
1585
21
        state = other;
1586
0
      else if (state == inValue && nAtts < attsMax)
1587
0
        atts[nAtts].normalized = 0;
1588
21
      break;
1589
777
    case BT_GT:
1590
815
    case BT_SOL:
1591
815
      if (state != inValue)
1592
815
        return nAtts;
1593
0
      break;
1594
10
    default:
1595
10
      break;
1596
5.41k
    }
1597
5.41k
  }
1598
  /* not reached */
1599
815
}
1600
1601
static int PTRFASTCALL
1602
0
PREFIX(charRefNumber)(const ENCODING *enc, const char *ptr) {
1603
0
  int result = 0;
1604
  /* skip &# */
1605
0
  UNUSED_P(enc);
1606
0
  ptr += 2 * MINBPC(enc);
1607
0
  if (CHAR_MATCHES(enc, ptr, ASCII_x)) {
1608
0
    for (ptr += MINBPC(enc); ! CHAR_MATCHES(enc, ptr, ASCII_SEMI);
1609
0
         ptr += MINBPC(enc)) {
1610
0
      int c = BYTE_TO_ASCII(enc, ptr);
1611
0
      switch (c) {
1612
0
      case ASCII_0:
1613
0
      case ASCII_1:
1614
0
      case ASCII_2:
1615
0
      case ASCII_3:
1616
0
      case ASCII_4:
1617
0
      case ASCII_5:
1618
0
      case ASCII_6:
1619
0
      case ASCII_7:
1620
0
      case ASCII_8:
1621
0
      case ASCII_9:
1622
0
        result <<= 4;
1623
0
        result |= (c - ASCII_0);
1624
0
        break;
1625
0
      case ASCII_A:
1626
0
      case ASCII_B:
1627
0
      case ASCII_C:
1628
0
      case ASCII_D:
1629
0
      case ASCII_E:
1630
0
      case ASCII_F:
1631
0
        result <<= 4;
1632
0
        result += 10 + (c - ASCII_A);
1633
0
        break;
1634
0
      case ASCII_a:
1635
0
      case ASCII_b:
1636
0
      case ASCII_c:
1637
0
      case ASCII_d:
1638
0
      case ASCII_e:
1639
0
      case ASCII_f:
1640
0
        result <<= 4;
1641
0
        result += 10 + (c - ASCII_a);
1642
0
        break;
1643
0
      }
1644
0
      if (result >= 0x110000)
1645
0
        return -1;
1646
0
    }
1647
0
  } else {
1648
0
    for (; ! CHAR_MATCHES(enc, ptr, ASCII_SEMI); ptr += MINBPC(enc)) {
1649
0
      int c = BYTE_TO_ASCII(enc, ptr);
1650
0
      result *= 10;
1651
0
      result += (c - ASCII_0);
1652
0
      if (result >= 0x110000)
1653
0
        return -1;
1654
0
    }
1655
0
  }
1656
0
  return checkCharRefNumber(result);
1657
0
}
Unexecuted instantiation: xmltok.c:normal_charRefNumber
Unexecuted instantiation: xmltok.c:little2_charRefNumber
Unexecuted instantiation: xmltok.c:big2_charRefNumber
1658
1659
static int PTRCALL
1660
PREFIX(predefinedEntityName)(const ENCODING *enc, const char *ptr,
1661
16
                             const char *end) {
1662
16
  UNUSED_P(enc);
1663
16
  switch ((end - ptr) / MINBPC(enc)) {
1664
6
  case 2:
1665
6
    if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_t)) {
1666
0
      switch (BYTE_TO_ASCII(enc, ptr)) {
1667
0
      case ASCII_l:
1668
0
        return ASCII_LT;
1669
0
      case ASCII_g:
1670
0
        return ASCII_GT;
1671
0
      }
1672
0
    }
1673
6
    break;
1674
6
  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
10
  case 4:
1685
10
    switch (BYTE_TO_ASCII(enc, ptr)) {
1686
0
    case ASCII_q:
1687
0
      ptr += MINBPC(enc);
1688
0
      if (CHAR_MATCHES(enc, ptr, ASCII_u)) {
1689
0
        ptr += MINBPC(enc);
1690
0
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1691
0
          ptr += MINBPC(enc);
1692
0
          if (CHAR_MATCHES(enc, ptr, ASCII_t))
1693
0
            return ASCII_QUOT;
1694
0
        }
1695
0
      }
1696
0
      break;
1697
0
    case ASCII_a:
1698
0
      ptr += MINBPC(enc);
1699
0
      if (CHAR_MATCHES(enc, ptr, ASCII_p)) {
1700
0
        ptr += MINBPC(enc);
1701
0
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1702
0
          ptr += MINBPC(enc);
1703
0
          if (CHAR_MATCHES(enc, ptr, ASCII_s))
1704
0
            return ASCII_APOS;
1705
0
        }
1706
0
      }
1707
0
      break;
1708
10
    }
1709
16
  }
1710
16
  return 0;
1711
16
}
Unexecuted instantiation: xmltok.c:normal_predefinedEntityName
xmltok.c:little2_predefinedEntityName
Line
Count
Source
1661
16
                             const char *end) {
1662
16
  UNUSED_P(enc);
1663
16
  switch ((end - ptr) / MINBPC(enc)) {
1664
6
  case 2:
1665
6
    if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_t)) {
1666
0
      switch (BYTE_TO_ASCII(enc, ptr)) {
1667
0
      case ASCII_l:
1668
0
        return ASCII_LT;
1669
0
      case ASCII_g:
1670
0
        return ASCII_GT;
1671
0
      }
1672
0
    }
1673
6
    break;
1674
6
  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
10
  case 4:
1685
10
    switch (BYTE_TO_ASCII(enc, ptr)) {
1686
0
    case ASCII_q:
1687
0
      ptr += MINBPC(enc);
1688
0
      if (CHAR_MATCHES(enc, ptr, ASCII_u)) {
1689
0
        ptr += MINBPC(enc);
1690
0
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1691
0
          ptr += MINBPC(enc);
1692
0
          if (CHAR_MATCHES(enc, ptr, ASCII_t))
1693
0
            return ASCII_QUOT;
1694
0
        }
1695
0
      }
1696
0
      break;
1697
0
    case ASCII_a:
1698
0
      ptr += MINBPC(enc);
1699
0
      if (CHAR_MATCHES(enc, ptr, ASCII_p)) {
1700
0
        ptr += MINBPC(enc);
1701
0
        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
1702
0
          ptr += MINBPC(enc);
1703
0
          if (CHAR_MATCHES(enc, ptr, ASCII_s))
1704
0
            return ASCII_APOS;
1705
0
        }
1706
0
      }
1707
0
      break;
1708
10
    }
1709
16
  }
1710
16
  return 0;
1711
16
}
Unexecuted instantiation: xmltok.c:big2_predefinedEntityName
1712
1713
static int PTRCALL
1714
PREFIX(nameMatchesAscii)(const ENCODING *enc, const char *ptr1,
1715
91
                         const char *end1, const char *ptr2) {
1716
91
  UNUSED_P(enc);
1717
535
  for (; *ptr2; ptr1 += MINBPC(enc), ptr2++) {
1718
476
    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
8
      return 0; /* LCOV_EXCL_LINE */
1725
8
    }
1726
468
    if (! CHAR_MATCHES(enc, ptr1, *ptr2))
1727
24
      return 0;
1728
468
  }
1729
59
  return ptr1 == end1;
1730
91
}
xmltok.c:normal_nameMatchesAscii
Line
Count
Source
1715
78
                         const char *end1, const char *ptr2) {
1716
78
  UNUSED_P(enc);
1717
522
  for (; *ptr2; ptr1 += MINBPC(enc), ptr2++) {
1718
463
    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
8
      return 0; /* LCOV_EXCL_LINE */
1725
8
    }
1726
455
    if (! CHAR_MATCHES(enc, ptr1, *ptr2))
1727
11
      return 0;
1728
455
  }
1729
59
  return ptr1 == end1;
1730
78
}
xmltok.c:little2_nameMatchesAscii
Line
Count
Source
1715
3
                         const char *end1, const char *ptr2) {
1716
3
  UNUSED_P(enc);
1717
3
  for (; *ptr2; ptr1 += MINBPC(enc), ptr2++) {
1718
3
    if (end1 - ptr1 < MINBPC(enc)) {
1719
      /* This line cannot be executed.  The incoming data has already
1720
       * been tokenized once, so incomplete characters like this have
1721
       * already been eliminated from the input.  Retaining the
1722
       * paranoia check is still valuable, however.
1723
       */
1724
0
      return 0; /* LCOV_EXCL_LINE */
1725
0
    }
1726
3
    if (! CHAR_MATCHES(enc, ptr1, *ptr2))
1727
3
      return 0;
1728
3
  }
1729
0
  return ptr1 == end1;
1730
3
}
xmltok.c:big2_nameMatchesAscii
Line
Count
Source
1715
10
                         const char *end1, const char *ptr2) {
1716
10
  UNUSED_P(enc);
1717
10
  for (; *ptr2; ptr1 += MINBPC(enc), ptr2++) {
1718
10
    if (end1 - ptr1 < MINBPC(enc)) {
1719
      /* This line cannot be executed.  The incoming data has already
1720
       * been tokenized once, so incomplete characters like this have
1721
       * already been eliminated from the input.  Retaining the
1722
       * paranoia check is still valuable, however.
1723
       */
1724
0
      return 0; /* LCOV_EXCL_LINE */
1725
0
    }
1726
10
    if (! CHAR_MATCHES(enc, ptr1, *ptr2))
1727
10
      return 0;
1728
10
  }
1729
0
  return ptr1 == end1;
1730
10
}
1731
1732
static int PTRFASTCALL
1733
460k
PREFIX(nameLength)(const ENCODING *enc, const char *ptr) {
1734
460k
  const char *start = ptr;
1735
6.70M
  for (;;) {
1736
6.70M
    switch (BYTE_TYPE(enc, ptr)) {
1737
0
#  define LEAD_CASE(n)                                                         \
1738
144
  case BT_LEAD##n:                                                             \
1739
144
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1740
144
    break;
1741
81
      LEAD_CASE(2)
1742
63
      LEAD_CASE(3)
1743
0
      LEAD_CASE(4)
1744
0
#  undef LEAD_CASE
1745
9.33k
    case BT_NONASCII:
1746
3.88M
    case BT_NMSTRT:
1747
3.88M
#  ifdef XML_NS
1748
4.34M
    case BT_COLON:
1749
4.34M
#  endif
1750
6.12M
    case BT_HEX:
1751
6.23M
    case BT_DIGIT:
1752
6.23M
    case BT_NAME:
1753
6.23M
    case BT_MINUS:
1754
6.23M
      ptr += MINBPC(enc);
1755
6.23M
      break;
1756
460k
    default:
1757
460k
      return (int)(ptr - start);
1758
6.70M
    }
1759
6.70M
  }
1760
460k
}
xmltok.c:normal_nameLength
Line
Count
Source
1733
459k
PREFIX(nameLength)(const ENCODING *enc, const char *ptr) {
1734
459k
  const char *start = ptr;
1735
6.68M
  for (;;) {
1736
6.68M
    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
81
      LEAD_CASE(2)
1742
63
      LEAD_CASE(3)
1743
0
      LEAD_CASE(4)
1744
0
#  undef LEAD_CASE
1745
0
    case BT_NONASCII:
1746
3.87M
    case BT_NMSTRT:
1747
3.87M
#  ifdef XML_NS
1748
4.33M
    case BT_COLON:
1749
4.33M
#  endif
1750
6.11M
    case BT_HEX:
1751
6.22M
    case BT_DIGIT:
1752
6.22M
    case BT_NAME:
1753
6.22M
    case BT_MINUS:
1754
6.22M
      ptr += MINBPC(enc);
1755
6.22M
      break;
1756
459k
    default:
1757
459k
      return (int)(ptr - start);
1758
6.68M
    }
1759
6.68M
  }
1760
459k
}
xmltok.c:little2_nameLength
Line
Count
Source
1733
700
PREFIX(nameLength)(const ENCODING *enc, const char *ptr) {
1734
700
  const char *start = ptr;
1735
6.67k
  for (;;) {
1736
6.67k
    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
5.49k
    case BT_NONASCII:
1746
5.63k
    case BT_NMSTRT:
1747
5.63k
#  ifdef XML_NS
1748
5.63k
    case BT_COLON:
1749
5.63k
#  endif
1750
5.66k
    case BT_HEX:
1751
5.66k
    case BT_DIGIT:
1752
5.66k
    case BT_NAME:
1753
5.97k
    case BT_MINUS:
1754
5.97k
      ptr += MINBPC(enc);
1755
5.97k
      break;
1756
700
    default:
1757
700
      return (int)(ptr - start);
1758
6.67k
    }
1759
6.67k
  }
1760
700
}
xmltok.c:big2_nameLength
Line
Count
Source
1733
825
PREFIX(nameLength)(const ENCODING *enc, const char *ptr) {
1734
825
  const char *start = ptr;
1735
5.22k
  for (;;) {
1736
5.22k
    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
3.83k
    case BT_NONASCII:
1746
3.91k
    case BT_NMSTRT:
1747
3.91k
#  ifdef XML_NS
1748
3.91k
    case BT_COLON:
1749
3.91k
#  endif
1750
4.39k
    case BT_HEX:
1751
4.39k
    case BT_DIGIT:
1752
4.40k
    case BT_NAME:
1753
4.40k
    case BT_MINUS:
1754
4.40k
      ptr += MINBPC(enc);
1755
4.40k
      break;
1756
825
    default:
1757
825
      return (int)(ptr - start);
1758
5.22k
    }
1759
5.22k
  }
1760
825
}
1761
1762
static const char *PTRFASTCALL
1763
721
PREFIX(skipS)(const ENCODING *enc, const char *ptr) {
1764
1.44k
  for (;;) {
1765
1.44k
    switch (BYTE_TYPE(enc, ptr)) {
1766
0
    case BT_LF:
1767
0
    case BT_CR:
1768
721
    case BT_S:
1769
721
      ptr += MINBPC(enc);
1770
721
      break;
1771
721
    default:
1772
721
      return ptr;
1773
1.44k
    }
1774
1.44k
  }
1775
721
}
xmltok.c:normal_skipS
Line
Count
Source
1763
721
PREFIX(skipS)(const ENCODING *enc, const char *ptr) {
1764
1.44k
  for (;;) {
1765
1.44k
    switch (BYTE_TYPE(enc, ptr)) {
1766
0
    case BT_LF:
1767
0
    case BT_CR:
1768
721
    case BT_S:
1769
721
      ptr += MINBPC(enc);
1770
721
      break;
1771
721
    default:
1772
721
      return ptr;
1773
1.44k
    }
1774
1.44k
  }
1775
721
}
Unexecuted instantiation: xmltok.c:little2_skipS
Unexecuted instantiation: xmltok.c:big2_skipS
1776
1777
static void PTRCALL
1778
PREFIX(updatePosition)(const ENCODING *enc, const char *ptr, const char *end,
1779
20.8k
                       POSITION *pos) {
1780
3.89M
  while (HAS_CHAR(enc, ptr, end)) {
1781
3.89M
    switch (BYTE_TYPE(enc, ptr)) {
1782
0
#  define LEAD_CASE(n)                                                         \
1783
7.14k
  case BT_LEAD##n:                                                             \
1784
7.14k
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1785
7.14k
    pos->columnNumber++;                                                       \
1786
7.14k
    break;
1787
1.70k
      LEAD_CASE(2)
1788
2.99k
      LEAD_CASE(3)
1789
2.44k
      LEAD_CASE(4)
1790
0
#  undef LEAD_CASE
1791
109k
    case BT_LF:
1792
109k
      pos->columnNumber = 0;
1793
109k
      pos->lineNumber++;
1794
109k
      ptr += MINBPC(enc);
1795
109k
      break;
1796
19.2k
    case BT_CR:
1797
19.2k
      pos->lineNumber++;
1798
19.2k
      ptr += MINBPC(enc);
1799
19.2k
      if (HAS_CHAR(enc, ptr, end) && BYTE_TYPE(enc, ptr) == BT_LF)
1800
474
        ptr += MINBPC(enc);
1801
19.2k
      pos->columnNumber = 0;
1802
19.2k
      break;
1803
3.76M
    default:
1804
3.76M
      ptr += MINBPC(enc);
1805
3.76M
      pos->columnNumber++;
1806
3.76M
      break;
1807
3.89M
    }
1808
3.89M
  }
1809
20.8k
}
xmltok.c:normal_updatePosition
Line
Count
Source
1779
8.02k
                       POSITION *pos) {
1780
3.83M
  while (HAS_CHAR(enc, ptr, end)) {
1781
3.83M
    switch (BYTE_TYPE(enc, ptr)) {
1782
0
#  define LEAD_CASE(n)                                                         \
1783
0
  case BT_LEAD##n:                                                             \
1784
0
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1785
0
    pos->columnNumber++;                                                       \
1786
0
    break;
1787
1.70k
      LEAD_CASE(2)
1788
2.99k
      LEAD_CASE(3)
1789
829
      LEAD_CASE(4)
1790
0
#  undef LEAD_CASE
1791
108k
    case BT_LF:
1792
108k
      pos->columnNumber = 0;
1793
108k
      pos->lineNumber++;
1794
108k
      ptr += MINBPC(enc);
1795
108k
      break;
1796
18.9k
    case BT_CR:
1797
18.9k
      pos->lineNumber++;
1798
18.9k
      ptr += MINBPC(enc);
1799
18.9k
      if (HAS_CHAR(enc, ptr, end) && BYTE_TYPE(enc, ptr) == BT_LF)
1800
464
        ptr += MINBPC(enc);
1801
18.9k
      pos->columnNumber = 0;
1802
18.9k
      break;
1803
3.70M
    default:
1804
3.70M
      ptr += MINBPC(enc);
1805
3.70M
      pos->columnNumber++;
1806
3.70M
      break;
1807
3.83M
    }
1808
3.83M
  }
1809
8.02k
}
xmltok.c:little2_updatePosition
Line
Count
Source
1779
6.15k
                       POSITION *pos) {
1780
34.3k
  while (HAS_CHAR(enc, ptr, end)) {
1781
34.3k
    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
964
      LEAD_CASE(4)
1790
0
#  undef LEAD_CASE
1791
254
    case BT_LF:
1792
254
      pos->columnNumber = 0;
1793
254
      pos->lineNumber++;
1794
254
      ptr += MINBPC(enc);
1795
254
      break;
1796
177
    case BT_CR:
1797
177
      pos->lineNumber++;
1798
177
      ptr += MINBPC(enc);
1799
177
      if (HAS_CHAR(enc, ptr, end) && BYTE_TYPE(enc, ptr) == BT_LF)
1800
4
        ptr += MINBPC(enc);
1801
177
      pos->columnNumber = 0;
1802
177
      break;
1803
32.9k
    default:
1804
32.9k
      ptr += MINBPC(enc);
1805
32.9k
      pos->columnNumber++;
1806
32.9k
      break;
1807
34.3k
    }
1808
34.3k
  }
1809
6.15k
}
xmltok.c:big2_updatePosition
Line
Count
Source
1779
6.63k
                       POSITION *pos) {
1780
28.1k
  while (HAS_CHAR(enc, ptr, end)) {
1781
28.1k
    switch (BYTE_TYPE(enc, ptr)) {
1782
0
#  define LEAD_CASE(n)                                                         \
1783
0
  case BT_LEAD##n:                                                             \
1784
0
    ptr += n; /* NOTE: The encoding has already been validated. */             \
1785
0
    pos->columnNumber++;                                                       \
1786
0
    break;
1787
0
      LEAD_CASE(2)
1788
0
      LEAD_CASE(3)
1789
656
      LEAD_CASE(4)
1790
0
#  undef LEAD_CASE
1791
260
    case BT_LF:
1792
260
      pos->columnNumber = 0;
1793
260
      pos->lineNumber++;
1794
260
      ptr += MINBPC(enc);
1795
260
      break;
1796
119
    case BT_CR:
1797
119
      pos->lineNumber++;
1798
119
      ptr += MINBPC(enc);
1799
119
      if (HAS_CHAR(enc, ptr, end) && BYTE_TYPE(enc, ptr) == BT_LF)
1800
6
        ptr += MINBPC(enc);
1801
119
      pos->columnNumber = 0;
1802
119
      break;
1803
27.1k
    default:
1804
27.1k
      ptr += MINBPC(enc);
1805
27.1k
      pos->columnNumber++;
1806
27.1k
      break;
1807
28.1k
    }
1808
28.1k
  }
1809
6.63k
}
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 */