OLD | NEW |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 part of utf; | 5 part of utf; |
6 | 6 |
7 /** | 7 /** |
8 * Decodes the UTF-32 bytes as an iterable. Thus, the consumer can only convert | 8 * Decodes the UTF-32 bytes as an iterable. Thus, the consumer can only convert |
9 * as much of the input as needed. Determines the byte order from the BOM, | 9 * as much of the input as needed. Determines the byte order from the BOM, |
10 * or uses big-endian as a default. This method always strips a leading BOM. | 10 * or uses big-endian as a default. This method always strips a leading BOM. |
(...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
227 while (moveNext()) { | 227 while (moveNext()) { |
228 codeunits[i++] = current; | 228 codeunits[i++] = current; |
229 } | 229 } |
230 return codeunits; | 230 return codeunits; |
231 } | 231 } |
232 | 232 |
233 int get current => _current; | 233 int get current => _current; |
234 | 234 |
235 bool moveNext() { | 235 bool moveNext() { |
236 _current = null; | 236 _current = null; |
237 if (utf32EncodedBytesIterator.remaining < 4) { | 237 int remaining = utf32EncodedBytesIterator.remaining; |
| 238 if (remaining == 0) { |
| 239 _current = null; |
| 240 return false; |
| 241 } |
| 242 if (remaining < 4) { |
238 utf32EncodedBytesIterator.skip(utf32EncodedBytesIterator.remaining); | 243 utf32EncodedBytesIterator.skip(utf32EncodedBytesIterator.remaining); |
239 if (replacementCodepoint != null) { | 244 if (replacementCodepoint != null) { |
240 _current = replacementCodepoint; | 245 _current = replacementCodepoint; |
241 return true; | 246 return true; |
242 } else { | 247 } else { |
243 throw new ArgumentError( | 248 throw new ArgumentError( |
244 "Invalid UTF32 at ${utf32EncodedBytesIterator.position}"); | 249 "Invalid UTF32 at ${utf32EncodedBytesIterator.position}"); |
245 } | 250 } |
246 } else { | |
247 int codepoint = decode(); | |
248 if (_validCodepoint(codepoint)) { | |
249 _current = codepoint; | |
250 return true; | |
251 } else if (replacementCodepoint != null) { | |
252 _current = replacementCodepoint; | |
253 return true; | |
254 } else { | |
255 throw new ArgumentError( | |
256 "Invalid UTF32 at ${utf32EncodedBytesIterator.position}"); | |
257 } | |
258 } | 251 } |
| 252 int codepoint = decode(); |
| 253 if (_validCodepoint(codepoint)) { |
| 254 _current = codepoint; |
| 255 return true; |
| 256 } else if (replacementCodepoint != null) { |
| 257 _current = replacementCodepoint; |
| 258 return true; |
| 259 } else { |
| 260 throw new ArgumentError( |
| 261 "Invalid UTF32 at ${utf32EncodedBytesIterator.position}"); |
| 262 } |
259 } | 263 } |
260 | 264 |
261 int get position => utf32EncodedBytesIterator.position ~/ 4; | 265 int get position => utf32EncodedBytesIterator.position ~/ 4; |
262 | 266 |
263 void backup([int by = 1]) { | 267 void backup([int by = 1]) { |
264 utf32EncodedBytesIterator.backup(4 * by); | 268 utf32EncodedBytesIterator.backup(4 * by); |
265 } | 269 } |
266 | 270 |
267 int get remaining => (utf32EncodedBytesIterator.remaining + 3) ~/ 4; | 271 int get remaining => (utf32EncodedBytesIterator.remaining + 3) ~/ 4; |
268 | 272 |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
329 value += (utf32EncodedBytesIterator.current << 24); | 333 value += (utf32EncodedBytesIterator.current << 24); |
330 return value; | 334 return value; |
331 } | 335 } |
332 } | 336 } |
333 | 337 |
334 bool _validCodepoint(int codepoint) { | 338 bool _validCodepoint(int codepoint) { |
335 return (codepoint >= 0 && codepoint < UNICODE_UTF16_RESERVED_LO) || | 339 return (codepoint >= 0 && codepoint < UNICODE_UTF16_RESERVED_LO) || |
336 (codepoint > UNICODE_UTF16_RESERVED_HI && | 340 (codepoint > UNICODE_UTF16_RESERVED_HI && |
337 codepoint < UNICODE_VALID_RANGE_MAX); | 341 codepoint < UNICODE_VALID_RANGE_MAX); |
338 } | 342 } |
OLD | NEW |