mirror of
				https://github.com/ethereum/solidity
				synced 2023-10-03 13:03:40 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			117 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			117 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
function uncompress(source, uncompressedSize) {
 | 
						|
/*
 | 
						|
based off https://github.com/emscripten-core/emscripten/blob/main/third_party/mini-lz4.js
 | 
						|
The license only applies to the body of this function (``uncompress``).
 | 
						|
====
 | 
						|
MiniLZ4: Minimal LZ4 block decoding and encoding.
 | 
						|
 | 
						|
based off of node-lz4, https://github.com/pierrec/node-lz4
 | 
						|
 | 
						|
====
 | 
						|
Copyright (c) 2012 Pierre Curto
 | 
						|
 | 
						|
Permission is hereby granted, free of charge, to any person obtaining a copy
 | 
						|
of this software and associated documentation files (the "Software"), to deal
 | 
						|
in the Software without restriction, including without limitation the rights
 | 
						|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 | 
						|
copies of the Software, and to permit persons to whom the Software is
 | 
						|
furnished to do so, subject to the following conditions:
 | 
						|
 | 
						|
The above copyright notice and this permission notice shall be included in
 | 
						|
all copies or substantial portions of the Software.
 | 
						|
 | 
						|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | 
						|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
						|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 | 
						|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | 
						|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 | 
						|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 | 
						|
THE SOFTWARE.
 | 
						|
====
 | 
						|
 | 
						|
changes have the same license
 | 
						|
*/
 | 
						|
/**
 | 
						|
 * Decode a block. Assumptions: input contains all sequences of a
 | 
						|
 * chunk, output is large enough to receive the decoded data.
 | 
						|
 * If the output buffer is too small, an error will be thrown.
 | 
						|
 * If the returned value is negative, an error occurred at the returned offset.
 | 
						|
 *
 | 
						|
 * @param {ArrayBufferView} input input data
 | 
						|
 * @param {ArrayBufferView} output output data
 | 
						|
 * @param {number=} sIdx
 | 
						|
 * @param {number=} eIdx
 | 
						|
 * @return {number} number of decoded bytes
 | 
						|
 * @private
 | 
						|
 */
 | 
						|
function uncompressBlock (input, output, sIdx, eIdx) {
 | 
						|
	sIdx = sIdx || 0
 | 
						|
	eIdx = eIdx || (input.length - sIdx)
 | 
						|
	// Process each sequence in the incoming data
 | 
						|
	for (var i = sIdx, n = eIdx, j = 0; i < n;) {
 | 
						|
		var token = input[i++]
 | 
						|
 | 
						|
		// Literals
 | 
						|
		var literals_length = (token >> 4)
 | 
						|
		if (literals_length > 0) {
 | 
						|
			// length of literals
 | 
						|
			var l = literals_length + 240
 | 
						|
			while (l === 255) {
 | 
						|
				l = input[i++]
 | 
						|
				literals_length += l
 | 
						|
			}
 | 
						|
 | 
						|
			// Copy the literals
 | 
						|
			var end = i + literals_length
 | 
						|
			while (i < end) output[j++] = input[i++]
 | 
						|
 | 
						|
			// End of buffer?
 | 
						|
			if (i === n) return j
 | 
						|
		}
 | 
						|
 | 
						|
		// Match copy
 | 
						|
		// 2 bytes offset (little endian)
 | 
						|
		var offset = input[i++] | (input[i++] << 8)
 | 
						|
 | 
						|
		// XXX 0 is an invalid offset value
 | 
						|
		if (offset === 0) return j
 | 
						|
		if (offset > j) return -(i-2)
 | 
						|
 | 
						|
		// length of match copy
 | 
						|
		var match_length = (token & 0xf)
 | 
						|
		var l = match_length + 240
 | 
						|
		while (l === 255) {
 | 
						|
			l = input[i++]
 | 
						|
			match_length += l
 | 
						|
		}
 | 
						|
		// Copy the match
 | 
						|
		var pos = j - offset // position of the match copy in the current output
 | 
						|
		var end = j + match_length + 4 // minmatch = 4
 | 
						|
		while (j < end) output[j++] = output[pos++]
 | 
						|
	}
 | 
						|
 | 
						|
	return j
 | 
						|
}
 | 
						|
var result = new ArrayBuffer(uncompressedSize);
 | 
						|
var sourceIndex = 0;
 | 
						|
var destIndex = 0;
 | 
						|
var blockSize;
 | 
						|
while((blockSize = (source[sourceIndex] | (source[sourceIndex + 1] << 8) | (source[sourceIndex + 2] << 16) | (source[sourceIndex + 3] << 24))) > 0)
 | 
						|
{
 | 
						|
	sourceIndex += 4;
 | 
						|
	if (blockSize & 0x80000000)
 | 
						|
	{
 | 
						|
		blockSize &= 0x7FFFFFFFF;
 | 
						|
		for (var i = 0; i < blockSize; i++) {
 | 
						|
			result[destIndex++] = source[sourceIndex++];
 | 
						|
		}
 | 
						|
	}
 | 
						|
	else
 | 
						|
	{
 | 
						|
		destIndex += uncompressBlock(source, new Uint8Array(result, destIndex, uncompressedSize - destIndex), sourceIndex, sourceIndex + blockSize);
 | 
						|
		sourceIndex += blockSize;
 | 
						|
	}
 | 
						|
}
 | 
						|
return new Uint8Array(result, 0, uncompressedSize);
 | 
						|
}
 |