Chromium Code Reviews| Index: sdk/lib/convert/base64.dart |
| diff --git a/sdk/lib/convert/base64.dart b/sdk/lib/convert/base64.dart |
| index ee65ae7487ffd82d7ae994c3cffd834440642c00..03cf48744725a87eda4bf6113145a7e012b80d50 100644 |
| --- a/sdk/lib/convert/base64.dart |
| +++ b/sdk/lib/convert/base64.dart |
| @@ -35,7 +35,7 @@ const Base64Codec BASE64 = const Base64Codec(); |
| const Base64Codec BASE64URL = const Base64Codec.urlSafe(); |
| // Constants used in more than one class. |
| -const int _paddingChar = 0x3d; // '='. |
| +const int _paddingChar = 0x3d; // '='. |
| /** |
| * A [base64](https://tools.ietf.org/html/rfc4648) encoder and decoder. |
| @@ -90,7 +90,7 @@ class Base64Codec extends Codec<List<int>, String> { |
| // Normalize char, keep originalChar to see if it matches the source. |
| if (char == percent) { |
| if (i + 2 <= end) { |
| - char = parseHexByte(source, i); // May be negative. |
| + char = parseHexByte(source, i); // May be negative. |
| i += 2; |
| // We know that %25 isn't valid, but our table considers it |
| // a potential padding start, so skip the checks. |
| @@ -134,15 +134,15 @@ class Base64Codec extends Codec<List<int>, String> { |
| // There was padding in the source. Check that it is valid: |
| // * result length a multiple of four |
| // * one or two padding characters at the end. |
| - _checkPadding(source, firstPaddingSourceIndex, end, |
| - firstPadding, paddingCount, buffer.length); |
| + _checkPadding(source, firstPaddingSourceIndex, end, firstPadding, |
| + paddingCount, buffer.length); |
| } else { |
| // Length of last chunk (1-4 chars) in the encoding. |
| int endLength = ((buffer.length - 1) % 4) + 1; |
| if (endLength == 1) { |
| // The data must have length 0, 2 or 3 modulo 4. |
| - throw new FormatException("Invalid base64 encoding length ", |
| - source, end); |
| + throw new FormatException( |
| + "Invalid base64 encoding length ", source, end); |
| } |
| while (endLength < 4) { |
| buffer.write("="); |
| @@ -154,15 +154,15 @@ class Base64Codec extends Codec<List<int>, String> { |
| // Original was already normalized, only check padding. |
| int length = end - start; |
| if (firstPadding >= 0) { |
| - _checkPadding(source, firstPaddingSourceIndex, end, |
| - firstPadding, paddingCount, length); |
| + _checkPadding(source, firstPaddingSourceIndex, end, firstPadding, |
| + paddingCount, length); |
| } else { |
| // No padding given, so add some if needed it. |
| int endLength = length % 4; |
| if (endLength == 1) { |
| - // The data must have length 0, 2 or 3 modulo 4. |
| - throw new FormatException("Invalid base64 encoding length ", |
| - source, end); |
| + // The data must have length 0, 2 or 3 modulo 4. |
| + throw new FormatException( |
| + "Invalid base64 encoding length ", source, end); |
| } |
| if (endLength > 1) { |
| // There is no "insertAt" on String, but this works as well. |
| @@ -173,22 +173,23 @@ class Base64Codec extends Codec<List<int>, String> { |
| } |
| static int _checkPadding(String source, int sourceIndex, int sourceEnd, |
| - int firstPadding, int paddingCount, int length) { |
| + int firstPadding, int paddingCount, int length) { |
| if (length % 4 != 0) { |
| throw new FormatException( |
| "Invalid base64 padding, padded length must be multiple of four, " |
| "is $length", |
| - source, sourceEnd); |
| + source, |
| + sourceEnd); |
| } |
| if (firstPadding + paddingCount != length) { |
| throw new FormatException( |
| - "Invalid base64 padding, '=' not at the end", |
| - source, sourceIndex); |
| + "Invalid base64 padding, '=' not at the end", source, sourceIndex); |
| } |
| if (paddingCount > 2) { |
| throw new FormatException( |
| "Invalid base64 padding, more than two '=' characters", |
| - source, sourceIndex); |
| + source, |
| + sourceIndex); |
| } |
| } |
| } |
| @@ -206,7 +207,6 @@ class Base64Codec extends Codec<List<int>, String> { |
| */ |
| class Base64Encoder extends Converter<List<int>, String> |
| implements ChunkedConverter<List<int>, String, List<int>, String> { |
| - |
| final bool _urlSafe; |
| const Base64Encoder() : _urlSafe = false; |
| @@ -304,20 +304,19 @@ class _Base64Encoder { |
| int partialChunkLength = byteCount - fullChunks * 3; |
| int bufferLength = fullChunks * 4; |
| if (isLast && partialChunkLength > 0) { |
| - bufferLength += 4; // Room for padding. |
| + bufferLength += 4; // Room for padding. |
| } |
| var output = createBuffer(bufferLength); |
| - _state = encodeChunk(_alphabet, bytes, start, end, isLast, |
| - output, 0, _state); |
| + _state = |
| + encodeChunk(_alphabet, bytes, start, end, isLast, output, 0, _state); |
| if (bufferLength > 0) return output; |
| // If the input plus the data in state is still less than three bytes, |
| // there may not be any output. |
| return null; |
| } |
| - static int encodeChunk(String alphabet, |
| - List<int> bytes, int start, int end, bool isLast, |
| - Uint8List output, int outputIndex, int state) { |
| + static int encodeChunk(String alphabet, List<int> bytes, int start, int end, |
| + bool isLast, Uint8List output, int outputIndex, int state) { |
| int bits = _stateBits(state); |
| // Count number of missing bytes in three-byte chunk. |
| int expectedChars = 3 - _stateCount(state); |
| @@ -329,17 +328,13 @@ class _Base64Encoder { |
| for (int i = start; i < end; i++) { |
| int byte = bytes[i]; |
| byteOr |= byte; |
| - bits = ((bits << 8) | byte) & 0xFFFFFF; // Never store more than 24 bits. |
| + bits = ((bits << 8) | byte) & 0xFFFFFF; // Never store more than 24 bits. |
| expectedChars--; |
| if (expectedChars == 0) { |
| - output[outputIndex++] = |
| - alphabet.codeUnitAt((bits >> 18) & _sixBitMask); |
| - output[outputIndex++] = |
| - alphabet.codeUnitAt((bits >> 12) & _sixBitMask); |
| - output[outputIndex++] = |
| - alphabet.codeUnitAt((bits >> 6) & _sixBitMask); |
| - output[outputIndex++] = |
| - alphabet.codeUnitAt(bits & _sixBitMask); |
| + output[outputIndex++] = alphabet.codeUnitAt((bits >> 18) & _sixBitMask); |
| + output[outputIndex++] = alphabet.codeUnitAt((bits >> 12) & _sixBitMask); |
| + output[outputIndex++] = alphabet.codeUnitAt((bits >> 6) & _sixBitMask); |
| + output[outputIndex++] = alphabet.codeUnitAt(bits & _sixBitMask); |
| expectedChars = 3; |
| bits = 0; |
| } |
| @@ -359,8 +354,8 @@ class _Base64Encoder { |
| if (byte < 0 || byte > 255) break; |
| i++; |
| } |
| - throw new ArgumentError.value(bytes, |
| - "Not a byte value at index $i: 0x${bytes[i].toRadixString(16)}"); |
| + throw new ArgumentError.value( |
| + bytes, "Not a byte value at index $i: 0x${bytes[i].toRadixString(16)}"); |
| } |
| /** |
| @@ -369,25 +364,19 @@ class _Base64Encoder { |
| * Only used when the [_state] contains a partial (1 or 2 byte) |
| * input. |
| */ |
| - static void writeFinalChunk(String alphabet, |
| - Uint8List output, int outputIndex, |
| - int count, int bits) { |
| + static void writeFinalChunk( |
| + String alphabet, Uint8List output, int outputIndex, int count, int bits) { |
| assert(count > 0); |
| if (count == 1) { |
| - output[outputIndex++] = |
| - alphabet.codeUnitAt((bits >> 2) & _sixBitMask); |
| - output[outputIndex++] = |
| - alphabet.codeUnitAt((bits << 4) & _sixBitMask); |
| + output[outputIndex++] = alphabet.codeUnitAt((bits >> 2) & _sixBitMask); |
| + output[outputIndex++] = alphabet.codeUnitAt((bits << 4) & _sixBitMask); |
| output[outputIndex++] = _paddingChar; |
| output[outputIndex++] = _paddingChar; |
| } else { |
| assert(count == 2); |
| - output[outputIndex++] = |
| - alphabet.codeUnitAt((bits >> 10) & _sixBitMask); |
| - output[outputIndex++] = |
| - alphabet.codeUnitAt((bits >> 4) & _sixBitMask); |
| - output[outputIndex++] = |
| - alphabet.codeUnitAt((bits << 2) & _sixBitMask); |
| + output[outputIndex++] = alphabet.codeUnitAt((bits >> 10) & _sixBitMask); |
| + output[outputIndex++] = alphabet.codeUnitAt((bits >> 4) & _sixBitMask); |
| + output[outputIndex++] = alphabet.codeUnitAt((bits << 2) & _sixBitMask); |
| output[outputIndex++] = _paddingChar; |
| } |
| } |
| @@ -478,7 +467,6 @@ class _Utf8Base64EncoderSink extends _Base64EncoderSink { |
| */ |
| class Base64Decoder extends Converter<String, List<int>> |
| implements ChunkedConverter<String, List<int>, String, List<int>> { |
| - |
| const Base64Decoder(); |
| List<int> convert(String input, [int start = 0, int end]) { |
| @@ -527,20 +515,20 @@ class _Base64Decoder { |
| * for `=`. |
| */ |
| static final List<int> _inverseAlphabet = new Int8List.fromList([ |
| - __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, |
| - __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, |
| - __, __, __, __, __, _p, __, __, __, __, __, 62, __, 62, __, 63, |
| - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, __, __, __, _p, __, __, |
| - __, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, |
| - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, __, __, __, __, 63, |
| - __, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, |
| - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, __, __, __, __, __, |
| + __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, // |
| + __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, // |
| + __, __, __, __, __, _p, __, __, __, __, __, 62, __, 62, __, 63, // |
| + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, __, __, __, _p, __, __, // |
| + __, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, // |
|
floitsch
2017/03/16 18:05:57
00, 01, 02, ...
This way they should stay aligned.
Jacob
2017/03/16 19:22:17
good idea! done.
|
| + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, __, __, __, __, 63, // |
| + __, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, // |
| + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, __, __, __, __, __, // |
| ]); |
| // Character constants. |
| - static const int _char_percent = 0x25; // '%'. |
| - static const int _char_3 = 0x33; // '3'. |
| - static const int _char_d = 0x64; // 'd'. |
| + static const int _char_percent = 0x25; // '%'. |
| + static const int _char_3 = 0x33; // '3'. |
| + static const int _char_d = 0x64; // 'd'. |
| /** |
| * Maintains the intermediate state of a partly-decoded input. |
| @@ -593,7 +581,7 @@ class _Base64Decoder { |
| static int _encodePaddingState(int expectedPadding) { |
| assert(expectedPadding >= 0); |
| assert(expectedPadding <= 5); |
| - return -expectedPadding - 1; // ~expectedPadding adapted to dart2js. |
| + return -expectedPadding - 1; // ~expectedPadding adapted to dart2js. |
| } |
| /** |
| @@ -601,7 +589,7 @@ class _Base64Decoder { |
| */ |
| static int _statePadding(int state) { |
| assert(state < 0); |
| - return -state - 1; // ~state adapted to dart2js. |
| + return -state - 1; // ~state adapted to dart2js. |
| } |
| static bool _hasSeenPadding(int state) => state < 0; |
| @@ -633,8 +621,8 @@ class _Base64Decoder { |
| throw new FormatException("Missing padding character", input, end); |
| } |
| if (_state > 0) { |
| - throw new FormatException("Invalid length, must be multiple of four", |
| - input, end); |
| + throw new FormatException( |
| + "Invalid length, must be multiple of four", input, end); |
| } |
| _state = _encodePaddingState(0); |
| } |
| @@ -646,9 +634,8 @@ class _Base64Decoder { |
| * Writes the decoding to [output] at [outIndex], and there must |
| * be room in the output. |
| */ |
| - static int decodeChunk(String input, int start, int end, |
| - Uint8List output, int outIndex, |
| - int state) { |
| + static int decodeChunk(String input, int start, int end, Uint8List output, |
| + int outIndex, int state) { |
| assert(!_hasSeenPadding(state)); |
| const int asciiMask = 127; |
| const int asciiMax = 127; |
| @@ -722,8 +709,8 @@ class _Base64Decoder { |
| * |
| * Includes room for the characters in [state], and handles padding correctly. |
| */ |
| - static Uint8List _allocateBuffer(String input, int start, int end, |
| - int state) { |
| + static Uint8List _allocateBuffer( |
| + String input, int start, int end, int state) { |
| assert(state >= 0); |
| int paddingStart = _trimPaddingChars(input, start, end); |
| int length = _stateCount(state) + (paddingStart - start); |
| @@ -849,8 +836,7 @@ class _Base64Decoder { |
| if (start == end) break; |
| } |
| if (start != end) { |
| - throw new FormatException("Invalid padding character", |
| - input, start); |
| + throw new FormatException("Invalid padding character", input, start); |
| } |
| return _encodePaddingState(expectedPadding); |
| } |