1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/js/src/devtools/jint/sunspider/string-base64.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,109 @@ 1.4 +/* This Source Code Form is subject to the terms of the Mozilla Public 1.5 + * License, v. 2.0. If a copy of the MPL was not distributed with this 1.6 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.7 + 1.8 +// From: http://lxr.mozilla.org/mozilla/source/extensions/xml-rpc/src/nsXmlRpcClient.js#956 1.9 + 1.10 +/* Convert data (an array of integers) to a Base64 string. */ 1.11 +var toBase64Table = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; 1.12 +var base64Pad = '='; 1.13 + 1.14 +function toBase64(data) { 1.15 + var result = ''; 1.16 + var length = data.length; 1.17 + var i; 1.18 + // Convert every three bytes to 4 ascii characters. 1.19 + /* BEGIN LOOP */ 1.20 + for (i = 0; i < (length - 2); i += 3) { 1.21 + result += toBase64Table[data[i] >> 2]; 1.22 + result += toBase64Table[((data[i] & 0x03) << 4) + (data[i+1] >> 4)]; 1.23 + result += toBase64Table[((data[i+1] & 0x0f) << 2) + (data[i+2] >> 6)]; 1.24 + result += toBase64Table[data[i+2] & 0x3f]; 1.25 + } 1.26 + /* END LOOP */ 1.27 + 1.28 + // Convert the remaining 1 or 2 bytes, pad out to 4 characters. 1.29 + if (length%3) { 1.30 + i = length - (length%3); 1.31 + result += toBase64Table[data[i] >> 2]; 1.32 + if ((length%3) == 2) { 1.33 + result += toBase64Table[((data[i] & 0x03) << 4) + (data[i+1] >> 4)]; 1.34 + result += toBase64Table[(data[i+1] & 0x0f) << 2]; 1.35 + result += base64Pad; 1.36 + } else { 1.37 + result += toBase64Table[(data[i] & 0x03) << 4]; 1.38 + result += base64Pad + base64Pad; 1.39 + } 1.40 + } 1.41 + 1.42 + return result; 1.43 +} 1.44 + 1.45 +/* Convert Base64 data to a string */ 1.46 +var toBinaryTable = [ 1.47 + -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, 1.48 + -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, 1.49 + -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,62, -1,-1,-1,63, 1.50 + 52,53,54,55, 56,57,58,59, 60,61,-1,-1, -1, 0,-1,-1, 1.51 + -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10, 11,12,13,14, 1.52 + 15,16,17,18, 19,20,21,22, 23,24,25,-1, -1,-1,-1,-1, 1.53 + -1,26,27,28, 29,30,31,32, 33,34,35,36, 37,38,39,40, 1.54 + 41,42,43,44, 45,46,47,48, 49,50,51,-1, -1,-1,-1,-1 1.55 +]; 1.56 + 1.57 +function base64ToString(data) { 1.58 + var result = ''; 1.59 + var leftbits = 0; // number of bits decoded, but yet to be appended 1.60 + var leftdata = 0; // bits decoded, but yet to be appended 1.61 + 1.62 + // Convert one by one. 1.63 + /* BEGIN LOOP */ 1.64 + for (var i = 0; i < data.length; i++) { 1.65 + var c = toBinaryTable[data.charCodeAt(i) & 0x7f]; 1.66 + var padding = (data[i] == base64Pad); 1.67 + // Skip illegal characters and whitespace 1.68 + if (c == -1) continue; 1.69 + 1.70 + // Collect data into leftdata, update bitcount 1.71 + leftdata = (leftdata << 6) | c; 1.72 + leftbits += 6; 1.73 + 1.74 + // If we have 8 or more bits, append 8 bits to the result 1.75 + if (leftbits >= 8) { 1.76 + leftbits -= 8; 1.77 + // Append if not padding. 1.78 + if (!padding) 1.79 + result += String.fromCharCode((leftdata >> leftbits) & 0xff); 1.80 + leftdata &= (1 << leftbits) - 1; 1.81 + } 1.82 + } 1.83 + /* END LOOP */ 1.84 + 1.85 + // If there are any bits left, the base64 string was corrupted 1.86 + if (leftbits) 1.87 + throw Components.Exception('Corrupted base64 string'); 1.88 + 1.89 + return result; 1.90 +} 1.91 + 1.92 +var str = ""; 1.93 + 1.94 + /* BEGIN LOOP */ 1.95 +for ( var i = 0; i < 8192; i++ ) 1.96 + str += String.fromCharCode( (25 * Math.random()) + 97 ); 1.97 + /* END LOOP */ 1.98 + 1.99 + /* BEGIN LOOP */ 1.100 +for ( var i = 8192; i <= 16384; i *= 2 ) { 1.101 + 1.102 + var base64; 1.103 + 1.104 + base64 = toBase64(str); 1.105 + base64ToString(base64); 1.106 + 1.107 + // Double the string 1.108 + str += str; 1.109 +} 1.110 + /* END LOOP */ 1.111 + 1.112 +toBinaryTable = null;