| OLD | NEW |
| 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, 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 dart.convert; | 5 part of dart.convert; |
| 6 | 6 |
| 7 /** | 7 /** |
| 8 * An instance of the default implementation of the [AsciiCodec]. | 8 * An instance of the default implementation of the [AsciiCodec]. |
| 9 * | 9 * |
| 10 * This instance provides a convenient access to the most common ASCII | 10 * This instance provides a convenient access to the most common ASCII |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 75 const _UnicodeSubsetEncoder(this._subsetMask); | 75 const _UnicodeSubsetEncoder(this._subsetMask); |
| 76 | 76 |
| 77 /** | 77 /** |
| 78 * Converts the [String] into a list of its code units. | 78 * Converts the [String] into a list of its code units. |
| 79 * | 79 * |
| 80 * If [start] and [end] are provided, only the substring | 80 * If [start] and [end] are provided, only the substring |
| 81 * `string.substring(start, end)` is used as input to the conversion. | 81 * `string.substring(start, end)` is used as input to the conversion. |
| 82 */ | 82 */ |
| 83 List<int> convert(String string, [int start = 0, int end]) { | 83 List<int> convert(String string, [int start = 0, int end]) { |
| 84 int stringLength = string.length; | 84 int stringLength = string.length; |
| 85 if (start < 0 || start > stringLength) { | 85 RangeError.checkValidRange(start, end, stringLength); |
| 86 throw new RangeError.range(start, 0, stringLength, "start"); | 86 if (end == null) end = stringLength; |
| 87 } | |
| 88 if (end == null) { | |
| 89 end = stringLength; | |
| 90 } else { | |
| 91 if (end < start || end > stringLength) { | |
| 92 throw new RangeError.range(end, start, stringLength, "end"); | |
| 93 } | |
| 94 } | |
| 95 int length = end - start; | 87 int length = end - start; |
| 96 List result = new Uint8List(length); | 88 List result = new Uint8List(length); |
| 97 for (int i = 0; i < length; i++) { | 89 for (int i = 0; i < length; i++) { |
| 98 var codeUnit = string.codeUnitAt(start + i); | 90 var codeUnit = string.codeUnitAt(start + i); |
| 99 if ((codeUnit & ~_subsetMask) != 0) { | 91 if ((codeUnit & ~_subsetMask) != 0) { |
| 100 throw new ArgumentError("String contains invalid characters."); | 92 throw new ArgumentError("String contains invalid characters."); |
| 101 } | 93 } |
| 102 result[i] = codeUnit; | 94 result[i] = codeUnit; |
| 103 } | 95 } |
| 104 return result; | 96 return result; |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 136 final ByteConversionSink _sink; | 128 final ByteConversionSink _sink; |
| 137 final int _subsetMask; | 129 final int _subsetMask; |
| 138 | 130 |
| 139 _UnicodeSubsetEncoderSink(this._subsetMask, this._sink); | 131 _UnicodeSubsetEncoderSink(this._subsetMask, this._sink); |
| 140 | 132 |
| 141 void close() { | 133 void close() { |
| 142 _sink.close(); | 134 _sink.close(); |
| 143 } | 135 } |
| 144 | 136 |
| 145 void addSlice(String source, int start, int end, bool isLast) { | 137 void addSlice(String source, int start, int end, bool isLast) { |
| 146 if (start < 0 || start > source.length) { | 138 RangeError.checkValidRange(start, end, source.length); |
| 147 throw new RangeError.range(start, 0, source.length); | |
| 148 } | |
| 149 if (end < start || end > source.length) { | |
| 150 throw new RangeError.range(end, start, source.length); | |
| 151 } | |
| 152 for (int i = start; i < end; i++) { | 139 for (int i = start; i < end; i++) { |
| 153 int codeUnit = source.codeUnitAt(i); | 140 int codeUnit = source.codeUnitAt(i); |
| 154 if ((codeUnit & ~_subsetMask) != 0) { | 141 if ((codeUnit & ~_subsetMask) != 0) { |
| 155 throw new ArgumentError( | 142 throw new ArgumentError( |
| 156 "Source contains invalid character with code point: $codeUnit."); | 143 "Source contains invalid character with code point: $codeUnit."); |
| 157 } | 144 } |
| 158 } | 145 } |
| 159 _sink.add(source.codeUnits.sublist(start, end)); | 146 _sink.add(source.codeUnits.sublist(start, end)); |
| 160 if (isLast) { | 147 if (isLast) { |
| 161 close(); | 148 close(); |
| (...skipping 27 matching lines...) Expand all Loading... |
| 189 | 176 |
| 190 /** | 177 /** |
| 191 * Converts the [bytes] (a list of unsigned 7- or 8-bit integers) to the | 178 * Converts the [bytes] (a list of unsigned 7- or 8-bit integers) to the |
| 192 * corresponding string. | 179 * corresponding string. |
| 193 * | 180 * |
| 194 * If [start] and [end] are provided, only the sub-list of bytes from | 181 * If [start] and [end] are provided, only the sub-list of bytes from |
| 195 * `start` to `end` (`end` not inclusive) is used as input to the conversion. | 182 * `start` to `end` (`end` not inclusive) is used as input to the conversion. |
| 196 */ | 183 */ |
| 197 String convert(List<int> bytes, [int start = 0, int end]) { | 184 String convert(List<int> bytes, [int start = 0, int end]) { |
| 198 int byteCount = bytes.length; | 185 int byteCount = bytes.length; |
| 199 if (start < 0 || start > byteCount) { | 186 RangeError.checkValidRange(start, end, byteCount); |
| 200 throw new RangeError.range(start, 0, byteCount, "start"); | 187 if (end == null) end = byteCount; |
| 201 } | |
| 202 if (end == null) { | |
| 203 end = byteCount; | |
| 204 } else { | |
| 205 if (end < start || end > byteCount) { | |
| 206 throw new RangeError.range(end, start, byteCount, "end"); | |
| 207 } | |
| 208 } | |
| 209 int length = end - start; | 188 int length = end - start; |
| 210 | 189 |
| 211 for (int i = start; i < end; i++) { | 190 for (int i = start; i < end; i++) { |
| 212 int byte = bytes[i]; | 191 int byte = bytes[i]; |
| 213 if ((byte & ~_subsetMask) != 0) { | 192 if ((byte & ~_subsetMask) != 0) { |
| 214 if (!_allowInvalid) { | 193 if (!_allowInvalid) { |
| 215 throw new FormatException("Invalid value in input: $byte"); | 194 throw new FormatException("Invalid value in input: $byte"); |
| 216 } | 195 } |
| 217 return _convertInvalid(bytes, start, end); | 196 return _convertInvalid(bytes, start, end); |
| 218 } | 197 } |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 277 | 256 |
| 278 void close() { | 257 void close() { |
| 279 _utf8Sink.close(); | 258 _utf8Sink.close(); |
| 280 } | 259 } |
| 281 | 260 |
| 282 void add(List<int> source) { | 261 void add(List<int> source) { |
| 283 addSlice(source, 0, source.length, false); | 262 addSlice(source, 0, source.length, false); |
| 284 } | 263 } |
| 285 | 264 |
| 286 void addSlice(List<int> source, int start, int end, bool isLast) { | 265 void addSlice(List<int> source, int start, int end, bool isLast) { |
| 287 if (start < 0 || start > source.length) { | 266 RangeError.checkValidRange(start, end, source.length); |
| 288 throw new RangeError.range(start, 0, source.length); | |
| 289 } | |
| 290 if (end < start || end > source.length) { | |
| 291 throw new RangeError.range(end, start, source.length); | |
| 292 } | |
| 293 for (int i = start; i < end; i++) { | 267 for (int i = start; i < end; i++) { |
| 294 if ((source[i] & ~_ASCII_MASK) != 0) { | 268 if ((source[i] & ~_ASCII_MASK) != 0) { |
| 295 if (i > start) _utf8Sink.addSlice(source, start, i, false); | 269 if (i > start) _utf8Sink.addSlice(source, start, i, false); |
| 296 // Add UTF-8 encoding of U+FFFD. | 270 // Add UTF-8 encoding of U+FFFD. |
| 297 _utf8Sink.add(const<int>[0xEF, 0xBF, 0xBD]); | 271 _utf8Sink.add(const<int>[0xEF, 0xBF, 0xBD]); |
| 298 start = i + 1; | 272 start = i + 1; |
| 299 } | 273 } |
| 300 } | 274 } |
| 301 if (start < end) { | 275 if (start < end) { |
| 302 _utf8Sink.addSlice(source, start, end, isLast); | 276 _utf8Sink.addSlice(source, start, end, isLast); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 318 for (int i = 0; i < source.length; i++) { | 292 for (int i = 0; i < source.length; i++) { |
| 319 if ((source[i] & ~_ASCII_MASK) != 0) { | 293 if ((source[i] & ~_ASCII_MASK) != 0) { |
| 320 throw new FormatException("Source contains non-ASCII bytes."); | 294 throw new FormatException("Source contains non-ASCII bytes."); |
| 321 } | 295 } |
| 322 } | 296 } |
| 323 _sink.add(new String.fromCharCodes(source)); | 297 _sink.add(new String.fromCharCodes(source)); |
| 324 } | 298 } |
| 325 | 299 |
| 326 void addSlice(List<int> source, int start, int end, bool isLast) { | 300 void addSlice(List<int> source, int start, int end, bool isLast) { |
| 327 final int length = source.length; | 301 final int length = source.length; |
| 328 if (start < 0 || start > length) { | 302 RangeError.checkValidRange(start, end, length); |
| 329 throw new RangeError.range(start, 0, length); | |
| 330 } | |
| 331 if (end < start || end > length) { | |
| 332 throw new RangeError.range(end, start, length); | |
| 333 } | |
| 334 if (start < end) { | 303 if (start < end) { |
| 335 if (start != 0 || end != length) { | 304 if (start != 0 || end != length) { |
| 336 source = source.sublist(start, end); | 305 source = source.sublist(start, end); |
| 337 } | 306 } |
| 338 add(source); | 307 add(source); |
| 339 } | 308 } |
| 340 if (isLast) close(); | 309 if (isLast) close(); |
| 341 } | 310 } |
| 342 } | 311 } |
| OLD | NEW |